Test key import in EVPTest a bit more extensively Between the "raw" import and what'll soon be a few parsing entrypoints, we'll have a few different ways to make keys. Rather than importing one key and then checking properties, this function is now meant to describe properties of a key and then: - For each set of properties that is enough to construct a key, construct that key. - For each key that was constructed, check all properties apply to that key. Rather than having ExpectNo* attributes, let's just say that if you omit the raw public/private key, the expectation is that you don't have one. I've also dropped "Expect" on the positive cases because it is now both a property to check and a way to construct the key. We've since added a few properties of keys that aren't curently well-tested, so go test those. This revealed that actually the DSA test vectors were misnamed. The test public key didn't correspond to the test public key and they were of different sizes. I tried to test the EC point format getting but ran into https://crbug.com/441087671, so I'm going to just ignore this for now. Change-Id: I5a0432061e33fcc92f790023ad40019e8eaf27c1 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/81647 Auto-Submit: David Benjamin <davidben@google.com> Reviewed-by: Adam Langley <agl@google.com> Commit-Queue: David Benjamin <davidben@google.com>
diff --git a/crypto/evp/evp_test.cc b/crypto/evp/evp_test.cc index 4702e31..1088869 100644 --- a/crypto/evp/evp_test.cc +++ b/crypto/evp/evp_test.cc
@@ -20,7 +20,9 @@ #include <string.h> #include <map> +#include <optional> #include <string> +#include <string_view> #include <utility> #include <vector> @@ -32,7 +34,9 @@ #include <openssl/digest.h> #include <openssl/dh.h> #include <openssl/dsa.h> +#include <openssl/ec.h> #include <openssl/err.h> +#include <openssl/obj.h> #include <openssl/rsa.h> #include "../test/file_test.h" @@ -40,12 +44,13 @@ #include "../test/wycheproof_util.h" -// evp_test dispatches between multiple test types. PrivateKey tests take a key -// name parameter and single block, decode it as a PEM private key, and save it -// under that key name. Decrypt, Sign, and Verify tests take a previously -// imported key name as parameter and test their respective operations. +// evp_test dispatches between multiple test types. PublicKey and PrivateKey +// tests take a key name parameter and key information. If the test is +// successful, the key is saved under that key name. Decrypt, Sign, and Verify +// tests take a previously imported key name as parameter and test their +// respective operations. -static const EVP_MD *GetDigest(FileTest *t, const std::string &name) { +static const EVP_MD *GetDigest(std::string_view name) { if (name == "MD5") { return EVP_md5(); } else if (name == "SHA1") { @@ -63,7 +68,7 @@ return nullptr; } -static int GetKeyType(FileTest *t, const std::string &name) { +static int GetKeyType(std::string_view name) { if (name == "RSA") { return EVP_PKEY_RSA; } @@ -83,127 +88,175 @@ return EVP_PKEY_NONE; } -static bool GetRSAPadding(FileTest *t, int *out, const std::string &name) { +static std::optional<int> GetRSAPadding(std::string_view name) { if (name == "PKCS1") { - *out = RSA_PKCS1_PADDING; - return true; + return RSA_PKCS1_PADDING; } if (name == "PSS") { - *out = RSA_PKCS1_PSS_PADDING; - return true; + return RSA_PKCS1_PSS_PADDING; } if (name == "OAEP") { - *out = RSA_PKCS1_OAEP_PADDING; - return true; + return RSA_PKCS1_OAEP_PADDING; } if (name == "None") { - *out = RSA_NO_PADDING; - return true; + return RSA_NO_PADDING; } ADD_FAILURE() << "Unknown RSA padding mode: " << name; - return false; + return std::nullopt; } using KeyMap = std::map<std::string, bssl::UniquePtr<EVP_PKEY>>; -static bool ImportKey(FileTest *t, KeyMap *key_map, - EVP_PKEY *(*parse_func)(CBS *cbs), - int (*marshal_func)(CBB *cbb, const EVP_PKEY *key)) { +enum class KeyRole { kPublic, kPrivate }; + +static bool ImportKey(FileTest *t, KeyMap *key_map, KeyRole key_role) { + auto format_name = key_role == KeyRole::kPublic ? "spki" : "pkcs8"; + auto parse_func = key_role == KeyRole::kPublic ? &EVP_parse_public_key + : &EVP_parse_private_key; + auto marshal_func = key_role == KeyRole::kPublic ? &EVP_marshal_public_key + : &EVP_marshal_private_key; + + // This test will first import the key from all available methods, then check + // that all properties on all keys match. + std::vector<std::pair<std::string, bssl::UniquePtr<EVP_PKEY>>> keys; + + // Parse from SPKI or PKCS#8. std::vector<uint8_t> input; if (!t->GetBytes(&input, "Input")) { return false; } - CBS cbs; CBS_init(&cbs, input.data(), input.size()); - bssl::UniquePtr<EVP_PKEY> pkey(parse_func(&cbs)); - if (!pkey) { + bssl::UniquePtr<EVP_PKEY> new_key(parse_func(&cbs)); + if (new_key == nullptr || CBS_len(&cbs) != 0) { return false; } + keys.emplace_back(format_name, std::move(new_key)); - std::string key_type; - if (!t->GetAttribute(&key_type, "Type")) { + std::string key_type_str; + if (!t->GetAttribute(&key_type_str, "Type")) { return false; } - EXPECT_EQ(GetKeyType(t, key_type), EVP_PKEY_id(pkey.get())); + int key_type = GetKeyType(key_type_str); - // The key must re-encode correctly. - bssl::ScopedCBB cbb; - uint8_t *der; - size_t der_len; - if (!CBB_init(cbb.get(), 0) || - !marshal_func(cbb.get(), pkey.get()) || - !CBB_finish(cbb.get(), &der, &der_len)) { - return false; - } - bssl::UniquePtr<uint8_t> free_der(der); - - std::vector<uint8_t> output = input; - if (t->HasAttribute("Output") && - !t->GetBytes(&output, "Output")) { - return false; - } - EXPECT_EQ(Bytes(output), Bytes(der, der_len)) - << "Re-encoding the key did not match."; - - if (t->HasAttribute("ExpectNoRawPrivate")) { - size_t len; - EXPECT_FALSE(EVP_PKEY_get_raw_private_key(pkey.get(), nullptr, &len)); - } else if (t->HasAttribute("ExpectRawPrivate")) { - std::vector<uint8_t> expected; - if (!t->GetBytes(&expected, "ExpectRawPrivate")) { - return false; - } - + // Import as a raw key. + if (key_role == KeyRole::kPublic && t->HasAttribute("RawPublic")) { std::vector<uint8_t> raw; - size_t len; - if (!EVP_PKEY_get_raw_private_key(pkey.get(), nullptr, &len)) { + if (!t->GetBytes(&raw, "RawPublic")) { return false; } - raw.resize(len); - if (!EVP_PKEY_get_raw_private_key(pkey.get(), raw.data(), &len)) { + new_key.reset( + EVP_PKEY_new_raw_public_key(key_type, nullptr, raw.data(), raw.size())); + if (new_key == nullptr) { return false; } - raw.resize(len); - EXPECT_EQ(Bytes(raw), Bytes(expected)); - - // Short buffers should be rejected. - raw.resize(len - 1); - len = raw.size(); - EXPECT_FALSE(EVP_PKEY_get_raw_private_key(pkey.get(), raw.data(), &len)); + keys.emplace_back("raw public", std::move(new_key)); + } + if (key_role == KeyRole::kPrivate && t->HasAttribute("RawPrivate")) { + std::vector<uint8_t> raw; + if (!t->GetBytes(&raw, "RawPrivate")) { + return false; + } + new_key.reset(EVP_PKEY_new_raw_private_key(key_type, nullptr, raw.data(), + raw.size())); + if (new_key == nullptr) { + return false; + } + keys.emplace_back("raw private", std::move(new_key)); } - if (t->HasAttribute("ExpectNoRawPublic")) { - size_t len; - EXPECT_FALSE(EVP_PKEY_get_raw_public_key(pkey.get(), nullptr, &len)); - } else if (t->HasAttribute("ExpectRawPublic")) { - std::vector<uint8_t> expected; - if (!t->GetBytes(&expected, "ExpectRawPublic")) { - return false; + // Check properties of the keys. + for (const auto &[name, pkey] : keys) { + SCOPED_TRACE(name); + + EXPECT_EQ(key_type, EVP_PKEY_id(pkey.get())); + + if (t->HasAttribute("Bits")) { + EXPECT_EQ(EVP_PKEY_bits(pkey.get()), + atoi(t->GetAttributeOrDie("Bits").c_str())); } - std::vector<uint8_t> raw; - size_t len; - if (!EVP_PKEY_get_raw_public_key(pkey.get(), nullptr, &len)) { - return false; + if (t->HasAttribute("ECCurve")) { + EXPECT_EQ(OBJ_nid2sn(EVP_PKEY_get_ec_curve_nid(pkey.get())), + t->GetAttributeOrDie("ECCurve")); + } else { + EXPECT_EQ(EVP_PKEY_get_ec_curve_nid(pkey.get()), NID_undef); } - raw.resize(len); - if (!EVP_PKEY_get_raw_public_key(pkey.get(), raw.data(), &len)) { - return false; - } - raw.resize(len); - EXPECT_EQ(Bytes(raw), Bytes(expected)); - // Short buffers should be rejected. - raw.resize(len - 1); - len = raw.size(); - EXPECT_FALSE(EVP_PKEY_get_raw_public_key(pkey.get(), raw.data(), &len)); + // All keys must compare equal. + EXPECT_EQ(EVP_PKEY_cmp(pkey.get(), keys.front().second.get()), 1); + + // The key must re-encode correctly. + bssl::ScopedCBB cbb; + if (!CBB_init(cbb.get(), 0) || !marshal_func(cbb.get(), pkey.get())) { + return false; + } + std::vector<uint8_t> output = input; + if (t->HasAttribute("Output") && !t->GetBytes(&output, "Output")) { + return false; + } + EXPECT_EQ(Bytes(output), Bytes(CBB_data(cbb.get()), CBB_len(cbb.get()))) + << "Re-encoding the key did not match."; + + if (t->HasAttribute("RawPrivate")) { + std::vector<uint8_t> expected; + if (!t->GetBytes(&expected, "RawPrivate")) { + return false; + } + + std::vector<uint8_t> raw; + size_t len; + if (!EVP_PKEY_get_raw_private_key(pkey.get(), nullptr, &len)) { + return false; + } + raw.resize(len); + if (!EVP_PKEY_get_raw_private_key(pkey.get(), raw.data(), &len)) { + return false; + } + raw.resize(len); + EXPECT_EQ(Bytes(raw), Bytes(expected)); + + // Short buffers should be rejected. + raw.resize(len - 1); + len = raw.size(); + EXPECT_FALSE(EVP_PKEY_get_raw_private_key(pkey.get(), raw.data(), &len)); + } else { + size_t len; + EXPECT_FALSE(EVP_PKEY_get_raw_private_key(pkey.get(), nullptr, &len)); + } + + if (t->HasAttribute("RawPublic")) { + std::vector<uint8_t> expected; + if (!t->GetBytes(&expected, "RawPublic")) { + return false; + } + + std::vector<uint8_t> raw; + size_t len; + if (!EVP_PKEY_get_raw_public_key(pkey.get(), nullptr, &len)) { + return false; + } + raw.resize(len); + if (!EVP_PKEY_get_raw_public_key(pkey.get(), raw.data(), &len)) { + return false; + } + raw.resize(len); + EXPECT_EQ(Bytes(raw), Bytes(expected)); + + // Short buffers should be rejected. + raw.resize(len - 1); + len = raw.size(); + EXPECT_FALSE(EVP_PKEY_get_raw_public_key(pkey.get(), raw.data(), &len)); + } else { + size_t len; + EXPECT_FALSE(EVP_PKEY_get_raw_public_key(pkey.get(), nullptr, &len)); + } } // Save the key for future tests. const std::string &key_name = t->GetParameter(); EXPECT_EQ(0u, key_map->count(key_name)) << "Duplicate key: " << key_name; - (*key_map)[key_name] = std::move(pkey); + (*key_map)[key_name] = std::move(keys.front().second); return true; } @@ -266,9 +319,8 @@ static bool SetupContext(FileTest *t, const KeyMap *key_map, EVP_PKEY_CTX *ctx) { if (t->HasAttribute("RSAPadding")) { - int padding; - if (!GetRSAPadding(t, &padding, t->GetAttributeOrDie("RSAPadding")) || - !EVP_PKEY_CTX_set_rsa_padding(ctx, padding)) { + auto padding = GetRSAPadding(t->GetAttributeOrDie("RSAPadding")); + if (!padding || !EVP_PKEY_CTX_set_rsa_padding(ctx, *padding)) { return false; } } @@ -278,13 +330,13 @@ return false; } if (t->HasAttribute("MGF1Digest")) { - const EVP_MD *digest = GetDigest(t, t->GetAttributeOrDie("MGF1Digest")); + const EVP_MD *digest = GetDigest(t->GetAttributeOrDie("MGF1Digest")); if (digest == nullptr || !EVP_PKEY_CTX_set_rsa_mgf1_md(ctx, digest)) { return false; } } if (t->HasAttribute("OAEPDigest")) { - const EVP_MD *digest = GetDigest(t, t->GetAttributeOrDie("OAEPDigest")); + const EVP_MD *digest = GetDigest(t->GetAttributeOrDie("OAEPDigest")); if (digest == nullptr || !EVP_PKEY_CTX_set_rsa_oaep_md(ctx, digest)) { return false; } @@ -445,7 +497,7 @@ const EVP_MD *digest = nullptr; if (t->HasAttribute("Digest")) { - digest = GetDigest(t, t->GetAttributeOrDie("Digest")); + digest = GetDigest(t->GetAttributeOrDie("Digest")); if (digest == nullptr) { return false; } @@ -574,12 +626,11 @@ static bool TestEVP(FileTest *t, KeyMap *key_map) { if (t->GetType() == "PrivateKey") { - return ImportKey(t, key_map, EVP_parse_private_key, - EVP_marshal_private_key); + return ImportKey(t, key_map, KeyRole::kPrivate); } if (t->GetType() == "PublicKey") { - return ImportKey(t, key_map, EVP_parse_public_key, EVP_marshal_public_key); + return ImportKey(t, key_map, KeyRole::kPublic); } if (t->GetType() == "DHKey") {
diff --git a/crypto/evp/test/ec_tests.txt b/crypto/evp/test/ec_tests.txt index 5d4fb8d..b15fda5 100644 --- a/crypto/evp/test/ec_tests.txt +++ b/crypto/evp/test/ec_tests.txt
@@ -3,25 +3,25 @@ # EC P-256 key PrivateKey = P-256 Type = EC +Bits = 256 +ECCurve = prime256v1 Input = 308187020100301306072a8648ce3d020106082a8648ce3d030107046d306b02010104208a872fb62893c4d1ffc5b9f0f91758069f8352e08fa05a49f8db926cb5728725a144034200042c150f429ce70f216c252cf5e062ce1f639cd5d165c7f89424072c27197d78b33b920e95cdb664e990dcf0cfea0d94e2a8e6af9d0e58056e653104925b9fe6c9 -ExpectNoRawPrivate -ExpectNoRawPublic # The same key as above with the optional public key omitted. PrivateKey = P-256-MissingPublic Type = EC +Bits = 256 +ECCurve = prime256v1 Input = 3041020100301306072a8648ce3d020106082a8648ce3d0301070427302502010104208a872fb62893c4d1ffc5b9f0f91758069f8352e08fa05a49f8db926cb5728725 -ExpectNoRawPrivate -ExpectNoRawPublic # The same key as above with redundant parameters. PrivateKey = P-256-ExtraParameters Type = EC +Bits = 256 +ECCurve = prime256v1 Input = 308193020100301306072a8648ce3d020106082a8648ce3d0301070479307702010104208a872fb62893c4d1ffc5b9f0f91758069f8352e08fa05a49f8db926cb5728725a00a06082a8648ce3d030107a144034200042c150f429ce70f216c252cf5e062ce1f639cd5d165c7f89424072c27197d78b33b920e95cdb664e990dcf0cfea0d94e2a8e6af9d0e58056e653104925b9fe6c9 # The key re-encodes with the parameters removed. Output = 308187020100301306072a8648ce3d020106082a8648ce3d030107046d306b02010104208a872fb62893c4d1ffc5b9f0f91758069f8352e08fa05a49f8db926cb5728725a144034200042c150f429ce70f216c252cf5e062ce1f639cd5d165c7f89424072c27197d78b33b920e95cdb664e990dcf0cfea0d94e2a8e6af9d0e58056e653104925b9fe6c9 -ExpectNoRawPrivate -ExpectNoRawPublic # The same key, but with the redundant parameters in the ECPrivateKey mismatched. PrivateKey = P-256-BadInnerParameters @@ -31,18 +31,18 @@ # The same key, but with the curve spelled explicitly. PrivateKey = P-256-ExplicitParameters Type = EC +Bits = 256 +ECCurve = prime256v1 Input = 308201610201003081ec06072a8648ce3d02013081e0020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551020101046d306b02010104208a872fb62893c4d1ffc5b9f0f91758069f8352e08fa05a49f8db926cb5728725a144034200042c150f429ce70f216c252cf5e062ce1f639cd5d165c7f89424072c27197d78b33b920e95cdb664e990dcf0cfea0d94e2a8e6af9d0e58056e653104925b9fe6c9 Output = 308187020100301306072a8648ce3d020106082a8648ce3d030107046d306b02010104208a872fb62893c4d1ffc5b9f0f91758069f8352e08fa05a49f8db926cb5728725a144034200042c150f429ce70f216c252cf5e062ce1f639cd5d165c7f89424072c27197d78b33b920e95cdb664e990dcf0cfea0d94e2a8e6af9d0e58056e653104925b9fe6c9 -ExpectNoRawPrivate -ExpectNoRawPublic # The same as above, but with the optional cofactor omitted. PrivateKey = P-256-ExplicitParameters-NoCofactor Type = EC +Bits = 256 +ECCurve = prime256v1 Input = 3082015e0201003081e906072a8648ce3d02013081dd020101302c06072a8648ce3d0101022100ffffffff00000001000000000000000000000000ffffffffffffffffffffffff30440420ffffffff00000001000000000000000000000000fffffffffffffffffffffffc04205ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b0441046b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c2964fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5022100ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551046d306b02010104208a872fb62893c4d1ffc5b9f0f91758069f8352e08fa05a49f8db926cb5728725a144034200042c150f429ce70f216c252cf5e062ce1f639cd5d165c7f89424072c27197d78b33b920e95cdb664e990dcf0cfea0d94e2a8e6af9d0e58056e653104925b9fe6c9 Output = 308187020100301306072a8648ce3d020106082a8648ce3d030107046d306b02010104208a872fb62893c4d1ffc5b9f0f91758069f8352e08fa05a49f8db926cb5728725a144034200042c150f429ce70f216c252cf5e062ce1f639cd5d165c7f89424072c27197d78b33b920e95cdb664e990dcf0cfea0d94e2a8e6af9d0e58056e653104925b9fe6c9 -ExpectNoRawPrivate -ExpectNoRawPublic # The same as above, but the cofactor is zero instead of one. PrivateKey = P-256-ExplicitParameters-CofactorZero @@ -67,9 +67,9 @@ # The public half of the same key encoded as a PublicKey. PublicKey = P-256-SPKI Type = EC +Bits = 256 +ECCurve = prime256v1 Input = 3059301306072a8648ce3d020106082a8648ce3d030107034200042c150f429ce70f216c252cf5e062ce1f639cd5d165c7f89424072c27197d78b33b920e95cdb664e990dcf0cfea0d94e2a8e6af9d0e58056e653104925b9fe6c9 -ExpectNoRawPrivate -ExpectNoRawPublic # The same as above, but with the curve explicitly spelled out. PublicKey = P-256-SPKI @@ -84,16 +84,22 @@ PrivateKey = P-224-ExplicitParameters Input = 308201540201003081eb06072a8648ce3d02013081df020101302806072a8648ce3d0101021d00ffffffffffffffffffffffffffffffff0000000000000000000000013053041cfffffffffffffffffffffffffffffffefffffffffffffffffffffffe041cb4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4031500bd71344799d5c7fcdc45b59fa3b9ab8f6a948bc5043904b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34021d00ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d0201010461305f020101041caa17cf0a0c8064bf6b509c212e48293d61e0d97acc85f8dea5c99166a13c033a00041a95d8c8d08635ad7fa0facd3a9fe56f8f42451b58ea8a29f7d28b0fb214690b1149a69f016f644cdb3320b78a381027835d6091903f0513 Type = EC +Bits = 224 +ECCurve = secp224r1 Output = 3078020100301006072a8648ce3d020106052b810400210461305f020101041caa17cf0a0c8064bf6b509c212e48293d61e0d97acc85f8dea5c99166a13c033a00041a95d8c8d08635ad7fa0facd3a9fe56f8f42451b58ea8a29f7d28b0fb214690b1149a69f016f644cdb3320b78a381027835d6091903f0513 PrivateKey = P-384-ExplicitParameters Input = 3082020c0201003082016406072a8648ce3d020130820157020101303c06072a8648ce3d0101023100fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff307b0430fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000fffffffc0430b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef031500a335926aa319a27a1d00896a6773a4827acdac73046104aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab73617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f023100ffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc5297302010104819e30819b0201010430a29991b86091401328e62ec8caadd0482f887ff0936910e42a56c19f48cbe87331037a4e2b36f1091dd4a26ee2d2b01fa16403620004826b3df548ad2e0b96436cb13508e88745a33b4b06cf485ad8350824b4dfe01ee66a5e1d1aaebfebcaa6337a1f33c338afc0d59b7ce7e389f73f66c9c4a44bbfcf570aec5cc52e7b6608c9061ab4d72de933448c39dd9238177917d398c22c5e Type = EC +Bits = 384 +ECCurve = secp384r1 Output = 3081b6020100301006072a8648ce3d020106052b8104002204819e30819b0201010430a29991b86091401328e62ec8caadd0482f887ff0936910e42a56c19f48cbe87331037a4e2b36f1091dd4a26ee2d2b01fa16403620004826b3df548ad2e0b96436cb13508e88745a33b4b06cf485ad8350824b4dfe01ee66a5e1d1aaebfebcaa6337a1f33c338afc0d59b7ce7e389f73f66c9c4a44bbfcf570aec5cc52e7b6608c9061ab4d72de933448c39dd9238177917d398c22c5e PrivateKey = P-521-ExplicitParameters Input = 308202b0020100308201d006072a8648ce3d0201308201c3020101304d06072a8648ce3d0101024201ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff30819f044201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc04420051953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f00031500d09e8800291cb85396cc6717393284aaa0da64ba0481850400c6858e06b70404e9cd9e3ecb662395b4429c648139053fb521f828af606b4d3dbaa14b5e77efe75928fe1dc127a2ffa8de3348b3c1856a429bf97e7e31c2e5bd66011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650024201fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa51868783bf2f966b7fcc0148f709a5d03bb5c9b8899c47aebb6fb71e913864090201010481d63081d30201010442002eeee9c16b9b4d2dee606f443cf3b41d2899a4734ff7555b54c735afb34a6912f81c68a89ea9b427c69a1026d98ef1d7f9c683aec5c5103d9a4c21e403c638412fa18189038186000400f58adcbe5c07f6b500fadd3209487e38f9567f97c2204435a4eb140739905c201407e2530a6667216aad01fb849bcbefa3862b2f187f13c9a87923d378a0a184df017b4bb93f4766531785878458da6aaa525724e10dfb1f35cfbe55c56fc705714295ea74b6c3e714152ad78e929f5415683aed9bc7c68f0329934177829d715f03f2 Type = EC +Bits = 521 +ECCurve = secp521r1 Output = 3081ee020100301006072a8648ce3d020106052b810400230481d63081d30201010442002eeee9c16b9b4d2dee606f443cf3b41d2899a4734ff7555b54c735afb34a6912f81c68a89ea9b427c69a1026d98ef1d7f9c683aec5c5103d9a4c21e403c638412fa18189038186000400f58adcbe5c07f6b500fadd3209487e38f9567f97c2204435a4eb140739905c201407e2530a6667216aad01fb849bcbefa3862b2f187f13c9a87923d378a0a184df017b4bb93f4766531785878458da6aaa525724e10dfb1f35cfbe55c56fc705714295ea74b6c3e714152ad78e929f5415683aed9bc7c68f0329934177829d715f03f2 @@ -162,10 +168,14 @@ PrivateKey = ECDH-P256-Private Type = EC +Bits = 256 +ECCurve = prime256v1 Input = 3041020100301306072a8648ce3d020106082a8648ce3d0301070427302502010104207d7dc5f71eb29ddaf80d6214632eeae03d9058af1fb6d22ed80badb62bc1a534 PublicKey = ECDH-P256-Peer Type = EC +Bits = 256 +ECCurve = prime256v1 Input = 3059301306072a8648ce3d020106082a8648ce3d03010703420004700c48f77f56584c5cc632ca65640db91b6bacce3a4df6b42ce7cc838833d287db71e509e3fd9b060ddb20ba5c51dcc5948d46fbf640dfe0441782cab85fa4ac Derive = ECDH-P256-Private
diff --git a/crypto/evp/test/ed25519_tests.txt b/crypto/evp/test/ed25519_tests.txt index 28e6369..5b0b216 100644 --- a/crypto/evp/test/ed25519_tests.txt +++ b/crypto/evp/test/ed25519_tests.txt
@@ -4,63 +4,58 @@ PrivateKey = Ed25519 Type = Ed25519 Input = 302e020100300506032b6570042204209d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60 -ExpectRawPrivate = 9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60 -ExpectRawPublic = d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a +RawPrivate = 9d61b19deffd5a60ba844af492ec2cc44449c5697b326919703bac031cae7f60 +RawPublic = d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a PrivateKey = Ed25519-2 Type = Ed25519 Input = 302e020100300506032b6570042204204ccd089b28ff96da9db6c346ec114e0f5b8a319f35aba624da8cf6ed4fb8a6fb -ExpectRawPrivate = 4ccd089b28ff96da9db6c346ec114e0f5b8a319f35aba624da8cf6ed4fb8a6fb -ExpectRawPublic = 3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c +RawPrivate = 4ccd089b28ff96da9db6c346ec114e0f5b8a319f35aba624da8cf6ed4fb8a6fb +RawPublic = 3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c PrivateKey = Ed25519-3 Type = Ed25519 Input = 302e020100300506032b657004220420c5aa8df43f9f837bedb7442f31dcb7b166d38535076f094b85ce3a2e0b4458f7 -ExpectRawPrivate = c5aa8df43f9f837bedb7442f31dcb7b166d38535076f094b85ce3a2e0b4458f7 -ExpectRawPublic = fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025 +RawPrivate = c5aa8df43f9f837bedb7442f31dcb7b166d38535076f094b85ce3a2e0b4458f7 +RawPublic = fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025 PrivateKey = Ed25519-4 Type = Ed25519 Input = 302e020100300506032b657004220420f5e5767cf153319517630f226876b86c8160cc583bc013744c6bf255f5cc0ee5 -ExpectRawPrivate = f5e5767cf153319517630f226876b86c8160cc583bc013744c6bf255f5cc0ee5 -ExpectRawPublic = 278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e +RawPrivate = f5e5767cf153319517630f226876b86c8160cc583bc013744c6bf255f5cc0ee5 +RawPublic = 278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e PrivateKey = Ed25519-5 Type = Ed25519 Input = 302e020100300506032b657004220420833fe62409237b9d62ec77587520911e9a759cec1d19755b7da901b96dca3d42 -ExpectRawPrivate = 833fe62409237b9d62ec77587520911e9a759cec1d19755b7da901b96dca3d42 -ExpectRawPublic = ec172b93ad5e563bf4932c70e1245034c35467ef2efd4d64ebf819683467e2bf +RawPrivate = 833fe62409237b9d62ec77587520911e9a759cec1d19755b7da901b96dca3d42 +RawPublic = ec172b93ad5e563bf4932c70e1245034c35467ef2efd4d64ebf819683467e2bf # Public keys from RFC 8032. PublicKey = Ed25519-SPKI Type = Ed25519 Input = 302a300506032b6570032100d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a -ExpectNoRawPrivate -ExpectRawPublic = d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a +RawPublic = d75a980182b10ab7d54bfed3c964073a0ee172f3daa62325af021a68f707511a PublicKey = Ed25519-SPKI-2 Type = Ed25519 Input = 302a300506032b65700321003d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c -ExpectNoRawPrivate -ExpectRawPublic = 3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c +RawPublic = 3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c PublicKey = Ed25519-SPKI-3 Type = Ed25519 Input = 302a300506032b6570032100fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025 -ExpectNoRawPrivate -ExpectRawPublic = fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025 +RawPublic = fc51cd8e6218a1a38da47ed00230f0580816ed13ba3303ac5deb911548908025 PublicKey = Ed25519-SPKI-4 Type = Ed25519 Input = 302a300506032b6570032100278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e -ExpectNoRawPrivate -ExpectRawPublic = 278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e +RawPublic = 278117fc144c72340f67d0f2316e8386ceffbf2b2428c9c51fef7c597f1d426e PublicKey = Ed25519-SPKI-5 Type = Ed25519 Input = 302a300506032b6570032100ec172b93ad5e563bf4932c70e1245034c35467ef2efd4d64ebf819683467e2bf -ExpectNoRawPrivate -ExpectRawPublic = ec172b93ad5e563bf4932c70e1245034c35467ef2efd4d64ebf819683467e2bf +RawPublic = ec172b93ad5e563bf4932c70e1245034c35467ef2efd4d64ebf819683467e2bf # The first key, private and public, with invalid NULL parameters. PrivateKey = Ed25519-NULL @@ -75,11 +70,14 @@ PublicKey = Ed25519-SPKI-Spec Type = Ed25519 Input = 302a300506032b657003210019bf44096984cdfe8541bac167dc3b96c85086aa30b6b6cb0c5c38ad703166e1 +RawPublic = 19bf44096984cdfe8541bac167dc3b96c85086aa30b6b6cb0c5c38ad703166e1 # Sample private key from RFC 8410. PrivateKey = Ed25519-Spec Type = Ed25519 Input = 302e020100300506032b657004220420d4ee72dbf913584ad5b6d8f1f769f8ad3afe7c28cbf1d4fbe097a88f44755842 +RawPublic = 19bf44096984cdfe8541bac167dc3b96c85086aa30b6b6cb0c5c38ad703166e1 +RawPrivate = d4ee72dbf913584ad5b6d8f1f769f8ad3afe7c28cbf1d4fbe097a88f44755842 # Signing and verifying tests
diff --git a/crypto/evp/test/evp_tests.txt b/crypto/evp/test/evp_tests.txt index fc2c748..820f1d8 100644 --- a/crypto/evp/test/evp_tests.txt +++ b/crypto/evp/test/evp_tests.txt
@@ -19,23 +19,21 @@ # We support parsing DSA keys, but no operations on them. # A DSA private key. -PrivateKey = DSA-1024 +PrivateKey = DSA-2048 Type = DSA +Bits = 2048 Input = 308202650201003082023906072a8648ce3804013082022c02820101009e12fab3de12213501dd82aa10ca2d101d2d4ebfef4d2a3f8daa0fe0cedad8d6af85616aa2f3252c0a2b5a6db09e6f14900e0ddb8311876dd8f9669525f99ed65949e184d5064793271169a228680b95ec12f59a8e20b21f2b58eb2a2012d35bde2ee351822fe8f32d0a330565dcce5c672b7259c14b2433d0b5b2ca2b2db0ab626e8f13f47fe0345d904e7294bb038e9ce21a9e580b83356278706cfe768436c69de149ccff98b4aab8cb4f6385c9f102ce59346eaeef27e0ad222d53d6e89cc8cde5776dd00057b03f2d88ab3cedbafd7b585f0b7f7835e17a3728bbf25ea62572f245dc111f3ce39cb6ffacc31b0a2790e7bde90224ea9b09315362af3d2b022100f381dcf53ebf724f8b2e5ca82c010fb4b5eda9358d0fd88ed278589488b54fc3028201000c402a725dcc3a62e02bf4cf43cd17f4a493591220223669cf4193edab423ad08dfb552e308a6a57a5ffbc7cd0fb2087f81f8df0cb08ab2133287d2b6968714a94f633c940845a48a3e16708dde761cc6a8eab2d84db21b6ea5b07681493cc9c31fbc368b243f6ddf8c932a8b4038f44e7b15ca876344a147859f2b43b39458668ad5e0a1a9a669546dd2812e3b3617a0aef99d58e3bb4cc87fd94225e01d2dcc469a77268146c51918f18e8b4d70aa1f0c7623bcc52cf3731d38641b2d2830b7eecb2f09552ff137d046e494e7f33c3590002b16d1b97d936fda28f90c3ed3ca35338168ac16f77c3c57adc2e8f7c6c2256e41a5f65450590dbb5bcf06d66610423022100b0c768702743bc51242993a971a52889795444f7c6452203d0ce84fe6117d46e -ExpectNoRawPrivate -ExpectNoRawPublic # An invalid zero DSA private key. -PrivateKey = DSA-1024-Zero +PrivateKey = DSA-2048-Zero Input = 308202450201003082023906072a8648ce3804013082022c02820101009e12fab3de12213501dd82aa10ca2d101d2d4ebfef4d2a3f8daa0fe0cedad8d6af85616aa2f3252c0a2b5a6db09e6f14900e0ddb8311876dd8f9669525f99ed65949e184d5064793271169a228680b95ec12f59a8e20b21f2b58eb2a2012d35bde2ee351822fe8f32d0a330565dcce5c672b7259c14b2433d0b5b2ca2b2db0ab626e8f13f47fe0345d904e7294bb038e9ce21a9e580b83356278706cfe768436c69de149ccff98b4aab8cb4f6385c9f102ce59346eaeef27e0ad222d53d6e89cc8cde5776dd00057b03f2d88ab3cedbafd7b585f0b7f7835e17a3728bbf25ea62572f245dc111f3ce39cb6ffacc31b0a2790e7bde90224ea9b09315362af3d2b022100f381dcf53ebf724f8b2e5ca82c010fb4b5eda9358d0fd88ed278589488b54fc3028201000c402a725dcc3a62e02bf4cf43cd17f4a493591220223669cf4193edab423ad08dfb552e308a6a57a5ffbc7cd0fb2087f81f8df0cb08ab2133287d2b6968714a94f633c940845a48a3e16708dde761cc6a8eab2d84db21b6ea5b07681493cc9c31fbc368b243f6ddf8c932a8b4038f44e7b15ca876344a147859f2b43b39458668ad5e0a1a9a669546dd2812e3b3617a0aef99d58e3bb4cc87fd94225e01d2dcc469a77268146c51918f18e8b4d70aa1f0c7623bcc52cf3731d38641b2d2830b7eecb2f09552ff137d046e494e7f33c3590002b16d1b97d936fda28f90c3ed3ca35338168ac16f77c3c57adc2e8f7c6c2256e41a5f65450590dbb5bcf06d66610403020100 Error = INVALID_PARAMETERS # A DSA public key. PublicKey = DSA-1024-SPKI Type = DSA +Bits = 1024 Input = 308201b73082012c06072a8648ce3804013082011f02818100b3429b8b128c9079f9b72e86857e98d265e5d91661ed8b5f4cc56e5eed1e571da30186983a9dd76297eab73ee13a1db841f8800d04a7cab478af6cde2ea4a2868531af169a24858c6268efa39ceb7ed0d4227eb5bbb01124a2a5a26038c7bcfb8cc827f68f5202345166e4718596799b65c9def82828ce44e62e38e41a0d24b1021500c5a56c81ddd87f47e676546c56d05706421624cf0281810094de40d27314fe929e47ff9b1ac65cfc73ef38c4d381c890be6217b15039ae18190e6b421af8c0bda35a5cfd050f58ae2644adce83e68c8e5ba11729df56bbb21e227a60b816cc033fa799a38fe1ba5b4aa1801b6f841ce3df99feb3b4fb96950c960af13fa2ce920aabc12dd24ad2044a35063ea0e25f67f560f4cfbdc5598303818400028180258c30ebbb7f34fdc873ce679f6cea373c7886d75d4421b90920db034daedd292c64d8edd8cdbdd7f3ad23d74cfa2135247d0cef6ecf2e14f99e19d22a8c1266bd8fb8719c0e5667c716c45c7adbdabe548085bdad2dfee636f8d52fd6adb2193df6c4f0520fbd171b91882e0e4f321f8250ffecf4dbea00e114427d3ef96c1a -ExpectNoRawPrivate -ExpectNoRawPublic # The same key as above, but without the parameters. Although allowed by # RFC 3279, we do not support this.
diff --git a/crypto/evp/test/rsa_tests.txt b/crypto/evp/test/rsa_tests.txt index f25a352..d12ce21 100644 --- a/crypto/evp/test/rsa_tests.txt +++ b/crypto/evp/test/rsa_tests.txt
@@ -3,16 +3,14 @@ # RSA 2048 bit key. PrivateKey = RSA-2048 Type = RSA +Bits = 2048 Input = 308204bc020100300d06092a864886f70d0101010500048204a6308204a20201000282010100cd0081ea7b2ae1ea06d59f7c73d9ffb94a09615c2e4ba7c636cef08dd3533ec3185525b015c769b99a77d6725bf9c3532a9b6e5f6627d5fb85160768d3dda9cbd35974511717dc3d309d2fc47ee41f97e32adb7f9dd864a1c4767a666ecd71bc1aacf5e7517f4b38594fea9b05e42d5ada9912008013e45316a4d9bb8ed086b88d28758bacaf922d46a868b485d239c9baeb0e2b64592710f42b2d1ea0a4b4802c0becab328f8a68b0073bdb546feea9809d2849912b390c1532bc7e29c7658f8175fae46f34332ff87bcab3e40649b98577869da0ea718353f0722754886913648760d122be676e0fc483dd20ffc31bda96a31966c9aa2e75ad03de47e1c44f02030100010282010060297ac7991b167a06d6b24758b8cbe208beb9b2d9ec9738bd80f90a2e35005dd7ce292d9e29ba885bd316fef1f20913bc0ac90d6b0808b2414d82104441d8624a33ce0233c8f780a48b375aff02d76712228a702484db3f9ebecccfbbee1709dba182800d949e9e4216e0bff3558388f8bd90da373a1d82743ec3fbdd1427fd16825a657a316912e8695365117ca2f845c909405fcac55f895fc15d20386c26ee78c9e99075029a178a6c1e4cf0c200e8a9cfb27e9d156f86e6c2adc22b1a84a1cd5ca5b2790875d79407c84b352395cb81cc3fed5bb043b69ede0c07204550025cee8c5f440170b6120bb48e0f747bcd8f522110850df043c428dfd187053102818100f6f961b47cbc035d3aedebc7de850a956b65ecdb9cf60764063f15aa48553c58d972fe6675056e35ddfdc37bf3b9f2f622ee271337256849c9bef2176fe8f7c3f8bb91ba374dd53baf3dec814d2bdec10c1fdc88cdd16876f26b1edfa3f094197edf4d42ff1fb2971103b898ca859c427287086a842ab410bb69cf2d35af6be302818100d47e724a7ff41048b270c2524a4101878b73159bb73d3dbc187b220e635b3534f96e243a184d93f860b6bfbb6b71c1ed9a1e1f458583023c301e96a692c1a08b53d0ec9ca910100d80451e3b7dc6a01bac4aecef8df798846bc235a08cbba2cf4c06804cc11219e95608c714e3f1430d491fadbba32a5751a04f97745834c9a502818021f2452bb9b95dfd028c914bf799f1ca77e89a95d50d3c16d384f8455f8bd7af9eb3dfa3d591d9842def235f7630a8e48c088ff6642e101794535a933e1e976fa8509fc728b2da0c4a1a08d7fcf37abaae1ff3001aca1dc1bbb05d9dffbaa1a09f7fb1eef38237d9ebccc722b9338436dde7119112798c26809c1a8dec4320610281801f7510aa62c2d8de4a3c53282781f41e02d0e8b402ae78432e449c48110161a11403f02d01880a8dcc938152d79721a4711a607ac4471ebf964810f95be47a45e60499e29f4c9773c83773404f606637728c2d0351bb03c326c8bb73a721e7fa5440ea2172bba1465fcc30dcb0d9f89930e815aa1f7f9729a857e00e0338dd590281804d1f0d756fe77e01099a652f50a88b7b685dc5bf00981d5d2376fd0c6fe29cd5b638734479305a73ad3c1599d39eae3bae035fbd6fed07c28de705933879a06e48e6a603686ed8e2560a5f6af1f2c24faf4aa960e382186f15eedce9a2491ae730680dd4cf778b70faa86826ab3223477cc91377b19a6d5a2eaea219760beed5 -ExpectNoRawPrivate -ExpectNoRawPublic # The public half of the same key encoded as a SubjectPublicKeyInfo. PublicKey = RSA-2048-SPKI Type = RSA +Bits = 2048 Input = 30820122300d06092a864886f70d01010105000382010f003082010a0282010100cd0081ea7b2ae1ea06d59f7c73d9ffb94a09615c2e4ba7c636cef08dd3533ec3185525b015c769b99a77d6725bf9c3532a9b6e5f6627d5fb85160768d3dda9cbd35974511717dc3d309d2fc47ee41f97e32adb7f9dd864a1c4767a666ecd71bc1aacf5e7517f4b38594fea9b05e42d5ada9912008013e45316a4d9bb8ed086b88d28758bacaf922d46a868b485d239c9baeb0e2b64592710f42b2d1ea0a4b4802c0becab328f8a68b0073bdb546feea9809d2849912b390c1532bc7e29c7658f8175fae46f34332ff87bcab3e40649b98577869da0ea718353f0722754886913648760d122be676e0fc483dd20ffc31bda96a31966c9aa2e75ad03de47e1c44f0203010001 -ExpectNoRawPrivate -ExpectNoRawPublic # The same key but with a negative RSA modulus. PublicKey = RSA-2048-SPKI-Negative @@ -37,16 +35,14 @@ # RSA 512 bit key. PrivateKey = RSA-512 Type = RSA +Bits = 512 Input = 30820154020100300d06092a864886f70d01010105000482013e3082013a020100024100dd20403d976a38c9d79152d87b5c8e9f05033eadd7b7de709bf5b0c4a5182a97d18483526b02362b992e154a9f37faa396ca2685cdab8fec09877ebe705f4dd70203010001024055bebcca655d7e39de8a6eaa9d636db682161907064039544755c53eeb99ec618c03a210dbc61471eaba10c5c365c9726d6b7a96f54d455f7d168d49367270e1022100f21a05d9fd6817301ce49ce10448f9bdd44f5ef5b7557cd7d83155db46382ae7022100e9d1f7157783db2feab1936954ddc4e83aa365695868144cda1be6813b61d791022100d6001eb0040920860ce41fafdf23ca6dfbdf74e6e9f98cf3164cf5c16f9e727d02206f6f73f4b52b10517be6f9bc5f87fa0a3bb817e2e711636b651f9af1c85d4f21022063eff2e57f5b4ca20342cfe793e25526624e3692f192461f9e1ce7f13f2d72c8 -ExpectNoRawPrivate -ExpectNoRawPublic # RSA 515 bit key. PrivateKey = RSA-515 Type = RSA +Bits = 515 Input = 30820157020100300d06092a864886f70d0101010500048201413082013d0201000241054fa166e205e658bbe8a2dc35311c0c2b75b7e4569fd9642c8bae809279271fc824f26baa1166ea46298ca63379ea76adbada2b61e5066820a35beaec1aca227f020301000102410266c972be0d30e53ac2acb1aa13b4bd0401cccf212452a66b4615f7e943831f67b4ca48560582d0ca886044aaaaf87945252a848c1947944186e6eb83969bf91102210309e631761842cc8a2ccfd372c20a9cba21de1a199c30ab440bc6b51079f4e825022101bf715c1db432627ca7c29a293b9210f2eff1e92d12f306ebaa5334f8ee03dcd30221018ac58a765f2b8f37d434081fe5ff92b81735ead2f263f4968ccf63d61fbe3d0d0221015b247a1159a2d5a25d0db049593c6405f77f3a278c521d066e290c2a2d8fb59d0221026224aa31fd95c14d24fd03b8a195bba4cc88df7c37f5370a5ab19f882f1404d6 -ExpectNoRawPrivate -ExpectNoRawPublic # RSASSA-PKCS1-v1_5 tests
diff --git a/crypto/evp/test/x25519_tests.txt b/crypto/evp/test/x25519_tests.txt index d6ea40a..9e9690a 100644 --- a/crypto/evp/test/x25519_tests.txt +++ b/crypto/evp/test/x25519_tests.txt
@@ -3,16 +3,17 @@ PrivateKey = X25519-Private Type = X25519 Input = 302e020100300506032b656e04220420a546e36bf0527c9d3b16154b82465edd62144c0ac1fc5a18506a2244ba449ac4 -ExpectRawPrivate = a546e36bf0527c9d3b16154b82465edd62144c0ac1fc5a18506a2244ba449ac4 +RawPublic = 1c9fd88f45606d932a80c71824ae151d15d73e77de38e8e000852e614fae7019 +RawPrivate = a546e36bf0527c9d3b16154b82465edd62144c0ac1fc5a18506a2244ba449ac4 PublicKey = X25519-Peer Type = X25519 Input = 302a300506032b656e032100e6db6867583030db3594c1a424b15f7c726624ec26b3353b10a903a6d0ab1c4c -ExpectRawPublic = e6db6867583030db3594c1a424b15f7c726624ec26b3353b10a903a6d0ab1c4c +RawPublic = e6db6867583030db3594c1a424b15f7c726624ec26b3353b10a903a6d0ab1c4c PublicKey = X25519-SmallOrderPeer Type = X25519 -ExpectRawPublic = e0eb7a7c3b41b8ae1656e3faf19fc46ada098deb9c32b1fd866205165f49b800 +RawPublic = e0eb7a7c3b41b8ae1656e3faf19fc46ada098deb9c32b1fd866205165f49b800 Input = 302a300506032b656e032100e0eb7a7c3b41b8ae1656e3faf19fc46ada098deb9c32b1fd866205165f49b800 Derive = X25519-Private