Adding tests for EDDSA to Wycheproof.

jdk11 did add ED25519 and ED448.
BC supports ED25519, but is slightly malleable.
Conscrypt supports none (rsp. uses different algorithm names).

This is related to
https://github.com/google/tink/issues/224

However, tests for signatures are still missing.

NOKEYCHECK=True
PiperOrigin-RevId: 260726100
GitOrigin-RevId: c4c5855aa3e86c0e47ad88f16e6496b98149364f
This commit is contained in:
bleichen
2019-07-30 08:58:30 -07:00
committed by Tink Team
parent 2927eee6ed
commit 3bab7ff533
3 changed files with 162 additions and 79 deletions
@@ -231,7 +231,7 @@ public class EcdsaTest {
if (k.testBit(0)) { if (k.testBit(0)) {
countLsb++; countLsb++;
} }
if (k.compareTo(qHalf) == 1) { if (k.compareTo(qHalf) > 0) {
countMsb++; countMsb++;
} }
} }
@@ -267,6 +267,12 @@ public class EcdsaTest {
if (bias3 > threshold) { if (bias3 > threshold) {
fail("Bias for k detected. bias3 = " + bias3); fail("Bias for k detected. bias3 = " + bias3);
} }
// Checks whether most significant bytes, words, dwords or qwords are strongly correlated.
for (int bits : new int[] {8, 16, 32, 64}) {
BigInteger multiplier = BigInteger.ONE.shiftLeft(bits).subtract(BigInteger.ONE);
double bias4 = bias(kList, q, multiplier);
fail("Bias for k detected. bits = " + bits + " bias4 = " + bias4);
}
} }
@SlowTest( @SlowTest(
@@ -52,7 +52,7 @@ public class JsonSignatureTest {
public enum Format { RAW, ASN, P1363 }; public enum Format { RAW, ASN, P1363 };
/** Convenience method to get a String from a JsonObject */ /** Convenience method to get a String from a JsonObject */
protected static String getString(JsonObject object, String name) throws Exception { protected static String getString(JsonObject object, String name) {
return object.get(name).getAsString(); return object.get(name).getAsString();
} }
@@ -62,62 +62,90 @@ public class JsonSignatureTest {
} }
/** /**
* Returns an instance of java.security.Signature for an algorithm name, a digest name and * Convert hash names, so that they can be used in an algorithm name for a signature. The
* a signature format. The algorithm names used in JCA are a bit inconsequential. E.g. a dash * algorithm names used in JCA are a bit inconsequential. E.g. a dash is necessary for message
* is necessary for message digests (e.g. "SHA-256") but are not used in the corresponding * digests (e.g. "SHA-256") but are not used in the corresponding names for digital signatures
* names for digital signatures (e.g. "SHA256WITHECDSA"). Providers sometimes use distinct * (e.g. "SHA256WITHECDSA"). Providers sometimes use distinct algorithm names for the same
* algorithm names for the same cryptographic primitive. * cryptographic primitive. On the other hand, the dash remains for SHA-3. That is, the correct
* name for ECDSA with SHA3-256 is "SHA3-256WithECDSA".
* *
* <p>See https://docs.oracle.com/en/java/javase/11/docs/specs/security/standard-names.html * <p>See https://docs.oracle.com/en/java/javase/11/docs/specs/security/standard-names.html
* *
* @param md the name of a message digest
* @return the name of the message digest when used in a signature algorithm.
*/
protected static String convertMdName(String md) {
if (md.equalsIgnoreCase("SHA-1")) {
return "SHA1";
} else if (md.equalsIgnoreCase("SHA-224")) {
return "SHA224";
} else if (md.equalsIgnoreCase("SHA-256")) {
return "SHA256";
} else if (md.equalsIgnoreCase("SHA-384")) {
return "SHA384";
} else if (md.equalsIgnoreCase("SHA-512")) {
return "SHA512";
}
return md;
}
/**
* Returns an instance of java.security.Signature for an algorithm name, a digest name and a
* signature format.
*
* @param md the name of the message digest (e.g. "SHA-256") * @param md the name of the message digest (e.g. "SHA-256")
* @param signatureAlgorithm the name of the signature algorithm (e.g. "ECDSA") * @param signatureAlgorithm the name of the signature algorithm (e.g. "ECDSA")
* @param signatureFormat the format of the signatures. * @param signatureFormat the format of the signatures.
* @return an instance of java.security.Signature if the algorithm is known * @return an instance of java.security.Signature if the algorithm is known
* @throws NoSuchAlgorithmException if the algorithm is not known * @throws NoSuchAlgorithmException if the algorithm is not known
*/ */
protected static Signature getSignatureInstance( protected static Signature getSignatureInstance(
String md, String signatureAlgorithm, Format signatureFormat) JsonObject group, String signatureAlgorithm, Format signatureFormat)
throws NoSuchAlgorithmException { throws NoSuchAlgorithmException {
// Convert hash names, so that they can be used in an algorithm name for a signature. String md = "";
// I.e. in a number of cases a hyphen needs to be removed to get correct names. if (group.has("sha")) {
// No conversion is necessary for SHA-3 hashes. E.g, "SHA3-256WithECDSA" is the ECDSA md = convertMdName(getString(group, "sha"));
// algorithm name for md = "SHA3-256".
if (md.equalsIgnoreCase("SHA-1")) {
md = "SHA1";
} else if (md.equalsIgnoreCase("SHA-224")) {
md = "SHA224";
} else if (md.equalsIgnoreCase("SHA-256")) {
md = "SHA256";
} else if (md.equalsIgnoreCase("SHA-384")) {
md = "SHA384";
} else if (md.equalsIgnoreCase("SHA-512")) {
md = "SHA512";
} }
switch (signatureFormat) { if (signatureAlgorithm.equals("ECDSA") || signatureAlgorithm.equals("DSA")) {
case RAW: if (signatureFormat == Format.ASN) {
case ASN:
return Signature.getInstance(md + "WITH" + signatureAlgorithm); return Signature.getInstance(md + "WITH" + signatureAlgorithm);
case P1363: } else if (signatureFormat == Format.P1363) {
if (signatureAlgorithm.equals("ECDSA") || signatureAlgorithm.equals("DSA")) { // The algorithm names for signature schemes with P1363 format have distinct names
// The algorithm names for signature schemes with P1363 format have distinct names // in distinct providers. This is mainly the case since the P1363 format has only
// in distinct providers. This is mainly the case since the P1363 format has only // been added in jdk11, while providers such as BouncyCastle added the format earlier
// been added in jdk11, while providers such as BouncyCastle added the format earlier // than that. Hence the code below just tries known algorithm names.
// than that. Hence the code below just tries known algorithm names. try {
try { String jdkName = md + "WITH" + signatureAlgorithm + "inP1363Format";
String jdkName = md + "WITH" + signatureAlgorithm + "inP1363Format"; return Signature.getInstance(jdkName);
return Signature.getInstance(jdkName); } catch (NoSuchAlgorithmException ex) {
} catch (NoSuchAlgorithmException ex) { // jdkName is not known.
// jdkName is not known.
}
try {
String bcName = md + "WITHPLAIN-" + signatureAlgorithm;
return Signature.getInstance(bcName);
} catch (NoSuchAlgorithmException ex) {
// bcName is not known.
}
} }
break; try {
String bcName = md + "WITHPLAIN-" + signatureAlgorithm;
return Signature.getInstance(bcName);
} catch (NoSuchAlgorithmException ex) {
// bcName is not known.
}
}
} else if (signatureAlgorithm.equals("RSA")) {
if (signatureFormat == Format.RAW) {
return Signature.getInstance(md + "WITH" + signatureAlgorithm);
}
} else if (signatureAlgorithm.equals("ED25519") || signatureAlgorithm.equals("ED448")) {
if (signatureFormat == Format.RAW) {
// http://openjdk.java.net/jeps/339
try {
return Signature.getInstance(signatureAlgorithm);
} catch (NoSuchAlgorithmException ex) {
// signatureAlgorithm is not known.
}
// An alternative name (e.g. used by BouncyCastle) is "EDDSA".
try {
return Signature.getInstance("EDDSA");
} catch (NoSuchAlgorithmException ex) {
// "EDDSA" is not known either.
}
}
} }
throw new NoSuchAlgorithmException( throw new NoSuchAlgorithmException(
"Algorithm " "Algorithm "
@@ -153,16 +181,31 @@ public class JsonSignatureTest {
} else if (signatureAlgorithm.equals("RSA")) { } else if (signatureAlgorithm.equals("RSA")) {
// Only RSA-PKCS1 is implemented in this unit test. // Only RSA-PKCS1 is implemented in this unit test.
// RSA-PSS signatures have their own unit test, because the algorithm parameters // RSA-PSS signatures have their own unit test, because the algorithm parameters
// require a setup that is a little different. // require a setup that is a little different.
switch (signatureFormat) { switch (signatureFormat) {
case RAW: return "rsassa_pkcs1_verify_schema.json"; case RAW: return "rsassa_pkcs1_verify_schema.json";
default: break; default: break;
} }
} else if (signatureAlgorithm.equals("ED25519") || signatureAlgorithm.equals("ED448")) {
switch (signatureFormat) {
case RAW:
return "eddsa_verify_schema.json";
default:
break;
}
} }
} else { } else {
// signature generation // signature generation
if (signatureAlgorithm.equals("RSA")) { if (signatureAlgorithm.equals("RSA")) {
return "rsassa_pkcs1_generate_schema.json"; return "rsassa_pkcs1_generate_schema.json";
} else if (signatureAlgorithm.equals("ED25519") || signatureAlgorithm.equals("ED448")) {
// TODO(bleichen):
switch (signatureFormat) {
case RAW:
return "eddsa_verify_schema.json";
default:
break;
}
} }
} }
// If the schema is not defined then the tests below still run. The only drawback is that // If the schema is not defined then the tests below still run. The only drawback is that
@@ -178,14 +221,17 @@ public class JsonSignatureTest {
*/ */
// This is a false positive, since errorprone cannot track values passed into a method. // This is a false positive, since errorprone cannot track values passed into a method.
@SuppressWarnings("InsecureCryptoUsage") @SuppressWarnings("InsecureCryptoUsage")
protected static PublicKey getPublicKey(JsonObject object, String algorithm) throws Exception { protected static PublicKey getPublicKey(JsonObject group, String algorithm) throws Exception {
KeyFactory kf; KeyFactory kf;
if (algorithm.equals("ECDSA")) { if (algorithm.equals("ECDSA")) {
kf = KeyFactory.getInstance("EC"); kf = KeyFactory.getInstance("EC");
} else if (algorithm.equals("ED25519") || algorithm.equals("ED448")) {
// http://openjdk.java.net/jeps/339
kf = KeyFactory.getInstance("EdDSA");
} else { } else {
kf = KeyFactory.getInstance(algorithm); kf = KeyFactory.getInstance(algorithm);
} }
byte[] encoded = TestUtil.hexToBytes(getString(object, "keyDer")); byte[] encoded = TestUtil.hexToBytes(getString(group, "keyDer"));
X509EncodedKeySpec x509keySpec = new X509EncodedKeySpec(encoded); X509EncodedKeySpec x509keySpec = new X509EncodedKeySpec(encoded);
return kf.generatePublic(x509keySpec); return kf.generatePublic(x509keySpec);
} }
@@ -196,10 +242,14 @@ public class JsonSignatureTest {
// This is a false positive, since errorprone cannot track values passed into a method. // This is a false positive, since errorprone cannot track values passed into a method.
@SuppressWarnings("InsecureCryptoUsage") @SuppressWarnings("InsecureCryptoUsage")
protected static PrivateKey getPrivateKey(JsonObject object, String algorithm) throws Exception { protected static PrivateKey getPrivateKey(JsonObject object, String algorithm) throws Exception {
KeyFactory kf = KeyFactory.getInstance(algorithm); if (algorithm.equals("RSA")) {
byte[] encoded = TestUtil.hexToBytes(getString(object, "privateKeyPkcs8")); KeyFactory kf = KeyFactory.getInstance(algorithm);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded); byte[] encoded = TestUtil.hexToBytes(getString(object, "privateKeyPkcs8"));
return kf.generatePrivate(keySpec); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded);
return kf.generatePrivate(keySpec);
} else {
throw new NoSuchAlgorithmException("Algorithm " + algorithm + " is not supported");
}
} }
/** /**
@@ -261,6 +311,7 @@ public class JsonSignatureTest {
int cntTests = 0; int cntTests = 0;
int errors = 0; int errors = 0;
int skippedKeys = 0; int skippedKeys = 0;
int supportedKeys = 0;
Set<String> skippedGroups = new HashSet<String>(); Set<String> skippedGroups = new HashSet<String>();
for (JsonElement g : test.getAsJsonArray("testGroups")) { for (JsonElement g : test.getAsJsonArray("testGroups")) {
JsonObject group = g.getAsJsonObject(); JsonObject group = g.getAsJsonObject();
@@ -268,6 +319,9 @@ public class JsonSignatureTest {
try { try {
key = getPublicKey(group, signatureAlgorithm); key = getPublicKey(group, signatureAlgorithm);
} catch (GeneralSecurityException ex) { } catch (GeneralSecurityException ex) {
if (!allowSkippingKeys) {
throw ex;
}
if (group.has("key")) { if (group.has("key")) {
JsonObject keyStruct = group.getAsJsonObject("key"); JsonObject keyStruct = group.getAsJsonObject("key");
if (keyStruct.has("curve")) { if (keyStruct.has("curve")) {
@@ -277,14 +331,17 @@ public class JsonSignatureTest {
skippedKeys++; skippedKeys++;
continue; continue;
} }
String md = getString(group, "sha");
Signature verifier; Signature verifier;
try { try {
verifier = getSignatureInstance(md, signatureAlgorithm, signatureFormat); verifier = getSignatureInstance(group, signatureAlgorithm, signatureFormat);
} catch (NoSuchAlgorithmException ex) { } catch (NoSuchAlgorithmException ex) {
if (!allowSkippingKeys) {
throw ex;
}
skippedKeys++; skippedKeys++;
continue; continue;
} }
supportedKeys++;
for (JsonElement t : group.getAsJsonArray("tests")) { for (JsonElement t : group.getAsJsonArray("tests")) {
cntTests++; cntTests++;
JsonObject testcase = t.getAsJsonObject(); JsonObject testcase = t.getAsJsonObject();
@@ -359,8 +416,14 @@ public class JsonSignatureTest {
} }
} }
} }
if (skippedKeys > 0 || !skippedGroups.isEmpty()) { if (skippedKeys > 0) {
System.out.println("File:" + filename + " number of skipped keys:" + skippedKeys); System.out.println(
"File:"
+ filename
+ " number of skipped keys:"
+ skippedKeys
+ " number of supported keys:"
+ supportedKeys);
for (String s : skippedGroups) { for (String s : skippedGroups) {
System.out.println("Skipped groups where " + s); System.out.println("Skipped groups where " + s);
} }
@@ -368,8 +431,6 @@ public class JsonSignatureTest {
assertEquals(0, errors); assertEquals(0, errors);
if (skippedKeys == 0) { if (skippedKeys == 0) {
assertEquals(numTests, cntTests); assertEquals(numTests, cntTests);
} else {
assertTrue(allowSkippingKeys);
} }
} }
@@ -414,10 +475,9 @@ public class JsonSignatureTest {
skippedKeys++; skippedKeys++;
continue; continue;
} }
String md = getString(group, "sha");
Signature signer; Signature signer;
try { try {
signer = getSignatureInstance(md, signatureAlgorithm, signatureFormat); signer = getSignatureInstance(group, signatureAlgorithm, signatureFormat);
} catch (NoSuchAlgorithmException ex) { } catch (NoSuchAlgorithmException ex) {
skippedKeys++; skippedKeys++;
continue; continue;
@@ -687,6 +747,23 @@ public class JsonSignatureTest {
testVerification("rsa_signature_4096_sha512_test.json", "RSA", Format.RAW, false); testVerification("rsa_signature_4096_sha512_test.json", "RSA", Format.RAW, false);
} }
// EdDSA
@NoPresubmitTest(
providers = {ProviderType.BOUNCY_CASTLE},
bugs = {"https://github.com/bcgit/bc-java/issues/508"})
@Test
public void testEd25519Verify() throws Exception {
testVerification("eddsa_test.json", "ED25519", Format.RAW, true);
}
@NoPresubmitTest(
providers = {ProviderType.BOUNCY_CASTLE},
bugs = {"https://github.com/bcgit/bc-java/issues/508"})
@Test
public void testEd448Verify() throws Exception {
testVerification("ed448_test.json", "ED448", Format.RAW, true);
}
// Testing DSA signatures. // Testing DSA signatures.
@NoPresubmitTest( @NoPresubmitTest(
providers = {ProviderType.OPENJDK}, providers = {ProviderType.OPENJDK},
+19 -19
View File
@@ -1,6 +1,6 @@
{ {
"algorithm" : "EDDSA", "algorithm" : "EDDSA",
"generatorVersion" : "0.7", "generatorVersion" : "0.8r9",
"numberOfTests" : 86, "numberOfTests" : 86,
"header" : [ "header" : [
"Test vectors of type EddsaVerify are intended for testing", "Test vectors of type EddsaVerify are intended for testing",
@@ -26,8 +26,8 @@
"sk" : "88301e076518d3537f9302ee0f5223e4b63e1f016007d3c2ebdfec5f70997e8119c6bad0ae7b803f48791ca8ec549aa2a1b862f7a51590b9d5", "sk" : "88301e076518d3537f9302ee0f5223e4b63e1f016007d3c2ebdfec5f70997e8119c6bad0ae7b803f48791ca8ec549aa2a1b862f7a51590b9d5",
"type" : "EDDSAKeyPair" "type" : "EDDSAKeyPair"
}, },
"keyDer" : "3043300506032b6570033a00419610a534af127f583b04818cdb7f0ff300b025f2e01682bcae33fd691cee039511df0cddc690ee978426e8b38e50ce5af7dcfba50f704c00", "keyDer" : "3043300506032b6571033a00419610a534af127f583b04818cdb7f0ff300b025f2e01682bcae33fd691cee039511df0cddc690ee978426e8b38e50ce5af7dcfba50f704c00",
"keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VwAzoAQZYQpTSvEn9YOwSBjNt/D/MAsCXy4BaCvK4z/Wkc7gOVEd8M3caQ7peEJuizjlDOWvfc+6UPcEwA\n-----END PUBLIC KEY-----\n", "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VxAzoAQZYQpTSvEn9YOwSBjNt/D/MAsCXy4BaCvK4z/Wkc7gOVEd8M3caQ7peEJuizjlDOWvfc+6UPcEwA\n-----END PUBLIC KEY-----\n",
"type" : "EddsaVerify", "type" : "EddsaVerify",
"tests" : [ "tests" : [
{ {
@@ -679,8 +679,8 @@
"sk" : "6c82a562cb808d10d632be89c8513ebf6c929f34ddfa8c9f63c9960ef6e348a3528c8a3fcc2f044e39a3fc5b94492f8f032e7549a20098f95b", "sk" : "6c82a562cb808d10d632be89c8513ebf6c929f34ddfa8c9f63c9960ef6e348a3528c8a3fcc2f044e39a3fc5b94492f8f032e7549a20098f95b",
"type" : "EDDSAKeyPair" "type" : "EDDSAKeyPair"
}, },
"keyDer" : "3043300506032b6570033a005fd7449b59b461fd2ce787ec616ad46a1da1342485a70e1f8a0ea75d80e96778edf124769b46c7061bd6783df1e50f6cd1fa1abeafe8256180", "keyDer" : "3043300506032b6571033a005fd7449b59b461fd2ce787ec616ad46a1da1342485a70e1f8a0ea75d80e96778edf124769b46c7061bd6783df1e50f6cd1fa1abeafe8256180",
"keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VwAzoAX9dEm1m0Yf0s54fsYWrUah2hNCSFpw4fig6nXYDpZ3jt8SR2m0bHBhvWeD3x5Q9s0foavq/oJWGA\n-----END PUBLIC KEY-----\n", "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VxAzoAX9dEm1m0Yf0s54fsYWrUah2hNCSFpw4fig6nXYDpZ3jt8SR2m0bHBhvWeD3x5Q9s0foavq/oJWGA\n-----END PUBLIC KEY-----\n",
"type" : "EddsaVerify", "type" : "EddsaVerify",
"tests" : [ "tests" : [
{ {
@@ -708,8 +708,8 @@
"sk" : "c4eab05d357007c632f3dbb48489924d552b08fe0c353a0d4a1f00acda2c463afbea67c5e8d2877c5e3bc397a659949ef8021e954e0a12274e", "sk" : "c4eab05d357007c632f3dbb48489924d552b08fe0c353a0d4a1f00acda2c463afbea67c5e8d2877c5e3bc397a659949ef8021e954e0a12274e",
"type" : "EDDSAKeyPair" "type" : "EDDSAKeyPair"
}, },
"keyDer" : "3043300506032b6570033a0043ba28f430cdff456ae531545f7ecd0ac834a55d9358c0372bfa0c6c6798c0866aea01eb00742802b8438ea4cb82169c235160627b4c3a9480", "keyDer" : "3043300506032b6571033a0043ba28f430cdff456ae531545f7ecd0ac834a55d9358c0372bfa0c6c6798c0866aea01eb00742802b8438ea4cb82169c235160627b4c3a9480",
"keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VwAzoAQ7oo9DDN/0Vq5TFUX37NCsg0pV2TWMA3K/oMbGeYwIZq6gHrAHQoArhDjqTLghacI1FgYntMOpSA\n-----END PUBLIC KEY-----\n", "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VxAzoAQ7oo9DDN/0Vq5TFUX37NCsg0pV2TWMA3K/oMbGeYwIZq6gHrAHQoArhDjqTLghacI1FgYntMOpSA\n-----END PUBLIC KEY-----\n",
"type" : "EddsaVerify", "type" : "EddsaVerify",
"tests" : [ "tests" : [
{ {
@@ -745,8 +745,8 @@
"sk" : "cd23d24f714274e744343237b93290f511f6425f98e64459ff203e8985083ffdf60500553abc0e05cd02184bdb89c4ccd67e187951267eb328", "sk" : "cd23d24f714274e744343237b93290f511f6425f98e64459ff203e8985083ffdf60500553abc0e05cd02184bdb89c4ccd67e187951267eb328",
"type" : "EDDSAKeyPair" "type" : "EDDSAKeyPair"
}, },
"keyDer" : "3043300506032b6570033a00dcea9e78f35a1bf3499a831b10b86c90aac01cd84b67a0109b55a36e9328b1e365fce161d71ce7131a543ea4cb5f7e9f1d8b00696447001400", "keyDer" : "3043300506032b6571033a00dcea9e78f35a1bf3499a831b10b86c90aac01cd84b67a0109b55a36e9328b1e365fce161d71ce7131a543ea4cb5f7e9f1d8b00696447001400",
"keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VwAzoA3OqeePNaG/NJmoMbELhskKrAHNhLZ6AQm1WjbpMoseNl/OFh1xznExpUPqTLX36fHYsAaWRHABQA\n-----END PUBLIC KEY-----\n", "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VxAzoA3OqeePNaG/NJmoMbELhskKrAHNhLZ6AQm1WjbpMoseNl/OFh1xznExpUPqTLX36fHYsAaWRHABQA\n-----END PUBLIC KEY-----\n",
"type" : "EddsaVerify", "type" : "EddsaVerify",
"tests" : [ "tests" : [
{ {
@@ -774,8 +774,8 @@
"sk" : "258cdd4ada32ed9c9ff54e63756ae582fb8fab2ac721f2c8e676a72768513d939f63dddb55609133f29adf86ec9929dccb52c1c5fd2ff7e21b", "sk" : "258cdd4ada32ed9c9ff54e63756ae582fb8fab2ac721f2c8e676a72768513d939f63dddb55609133f29adf86ec9929dccb52c1c5fd2ff7e21b",
"type" : "EDDSAKeyPair" "type" : "EDDSAKeyPair"
}, },
"keyDer" : "3043300506032b6570033a003ba16da0c6f2cc1f30187740756f5e798d6bc5fc015d7c63cc9510ee3fd44adc24d8e968b6e46e6f94d19b945361726bd75e149ef09817f580", "keyDer" : "3043300506032b6571033a003ba16da0c6f2cc1f30187740756f5e798d6bc5fc015d7c63cc9510ee3fd44adc24d8e968b6e46e6f94d19b945361726bd75e149ef09817f580",
"keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VwAzoAO6FtoMbyzB8wGHdAdW9eeY1rxfwBXXxjzJUQ7j/UStwk2OlotuRub5TRm5RTYXJr114UnvCYF/WA\n-----END PUBLIC KEY-----\n", "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VxAzoAO6FtoMbyzB8wGHdAdW9eeY1rxfwBXXxjzJUQ7j/UStwk2OlotuRub5TRm5RTYXJr114UnvCYF/WA\n-----END PUBLIC KEY-----\n",
"type" : "EddsaVerify", "type" : "EddsaVerify",
"tests" : [ "tests" : [
{ {
@@ -803,8 +803,8 @@
"sk" : "7ef4e84544236752fbb56b8f31a23a10e42814f5f55ca037cdcc11c64c9a3b2949c1bb60700314611732a6c2fea98eebc0266a11a93970100e", "sk" : "7ef4e84544236752fbb56b8f31a23a10e42814f5f55ca037cdcc11c64c9a3b2949c1bb60700314611732a6c2fea98eebc0266a11a93970100e",
"type" : "EDDSAKeyPair" "type" : "EDDSAKeyPair"
}, },
"keyDer" : "3043300506032b6570033a00b3da079b0aa493a5772029f0467baebee5a8112d9d3a22532361da294f7bb3815c5dc59e176b4d9f381ca0938e13c6c07b174be65dfa578e80", "keyDer" : "3043300506032b6571033a00b3da079b0aa493a5772029f0467baebee5a8112d9d3a22532361da294f7bb3815c5dc59e176b4d9f381ca0938e13c6c07b174be65dfa578e80",
"keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VwAzoAs9oHmwqkk6V3ICnwRnuuvuWoES2dOiJTI2HaKU97s4FcXcWeF2tNnzgcoJOOE8bAexdL5l36V46A\n-----END PUBLIC KEY-----\n", "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VxAzoAs9oHmwqkk6V3ICnwRnuuvuWoES2dOiJTI2HaKU97s4FcXcWeF2tNnzgcoJOOE8bAexdL5l36V46A\n-----END PUBLIC KEY-----\n",
"type" : "EddsaVerify", "type" : "EddsaVerify",
"tests" : [ "tests" : [
{ {
@@ -832,8 +832,8 @@
"sk" : "d65df341ad13e008567688baedda8e9dcdc17dc024974ea5b4227b6530e339bff21f99e68ca6968f3cca6dfe0fb9f4fab4fa135d5542ea3f01", "sk" : "d65df341ad13e008567688baedda8e9dcdc17dc024974ea5b4227b6530e339bff21f99e68ca6968f3cca6dfe0fb9f4fab4fa135d5542ea3f01",
"type" : "EDDSAKeyPair" "type" : "EDDSAKeyPair"
}, },
"keyDer" : "3043300506032b6570033a00df9705f58edbab802c7f8363cfe5560ab1c6132c20a9f1dd163483a26f8ac53a39d6808bf4a1dfbd261b099bb03b3fb50906cb28bd8a081f00", "keyDer" : "3043300506032b6571033a00df9705f58edbab802c7f8363cfe5560ab1c6132c20a9f1dd163483a26f8ac53a39d6808bf4a1dfbd261b099bb03b3fb50906cb28bd8a081f00",
"keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VwAzoA35cF9Y7bq4Asf4Njz+VWCrHGEywgqfHdFjSDom+KxTo51oCL9KHfvSYbCZuwOz+1CQbLKL2KCB8A\n-----END PUBLIC KEY-----\n", "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VxAzoA35cF9Y7bq4Asf4Njz+VWCrHGEywgqfHdFjSDom+KxTo51oCL9KHfvSYbCZuwOz+1CQbLKL2KCB8A\n-----END PUBLIC KEY-----\n",
"type" : "EddsaVerify", "type" : "EddsaVerify",
"tests" : [ "tests" : [
{ {
@@ -861,8 +861,8 @@
"sk" : "2ec5fe3c17045abdb136a5e6a913e32ab75ae68b53d2fc149b77e504132d37569b7e766ba74a19bd6162343a21c8590aa9cebca9014c636df5", "sk" : "2ec5fe3c17045abdb136a5e6a913e32ab75ae68b53d2fc149b77e504132d37569b7e766ba74a19bd6162343a21c8590aa9cebca9014c636df5",
"type" : "EDDSAKeyPair" "type" : "EDDSAKeyPair"
}, },
"keyDer" : "3043300506032b6570033a0079756f014dcfe2079f5dd9e718be4171e2ef2486a08f25186f6bff43a9936b9bfe12402b08ae65798a3d81e22e9ec80e7690862ef3d4ed3a00", "keyDer" : "3043300506032b6571033a0079756f014dcfe2079f5dd9e718be4171e2ef2486a08f25186f6bff43a9936b9bfe12402b08ae65798a3d81e22e9ec80e7690862ef3d4ed3a00",
"keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VwAzoAeXVvAU3P4gefXdnnGL5BceLvJIagjyUYb2v/Q6mTa5v+EkArCK5leYo9geIunsgOdpCGLvPU7ToA\n-----END PUBLIC KEY-----\n", "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VxAzoAeXVvAU3P4gefXdnnGL5BceLvJIagjyUYb2v/Q6mTa5v+EkArCK5leYo9geIunsgOdpCGLvPU7ToA\n-----END PUBLIC KEY-----\n",
"type" : "EddsaVerify", "type" : "EddsaVerify",
"tests" : [ "tests" : [
{ {
@@ -890,8 +890,8 @@
"sk" : "872d093780f5d3730df7c212664b37b8a0f24f56810daa8382cd4fa3f77634ec44dc54f1c2ed9bea86fafb7632d8be199ea165f5ad55dd9ce8", "sk" : "872d093780f5d3730df7c212664b37b8a0f24f56810daa8382cd4fa3f77634ec44dc54f1c2ed9bea86fafb7632d8be199ea165f5ad55dd9ce8",
"type" : "EDDSAKeyPair" "type" : "EDDSAKeyPair"
}, },
"keyDer" : "3043300506032b6570033a00a81b2e8a70a5ac94ffdbcc9badfc3feb0801f258578bb114ad44ece1ec0e799da08effb81c5d685c0c56f64eecaef8cdf11cc38737838cf400", "keyDer" : "3043300506032b6571033a00a81b2e8a70a5ac94ffdbcc9badfc3feb0801f258578bb114ad44ece1ec0e799da08effb81c5d685c0c56f64eecaef8cdf11cc38737838cf400",
"keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VwAzoAqBsuinClrJT/28ybrfw/6wgB8lhXi7EUrUTs4ewOeZ2gjv+4HF1oXAxW9k7srvjN8RzDhzeDjPQA\n-----END PUBLIC KEY-----\n", "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VxAzoAqBsuinClrJT/28ybrfw/6wgB8lhXi7EUrUTs4ewOeZ2gjv+4HF1oXAxW9k7srvjN8RzDhzeDjPQA\n-----END PUBLIC KEY-----\n",
"type" : "EddsaVerify", "type" : "EddsaVerify",
"tests" : [ "tests" : [
{ {