diff --git a/java/com/google/security/wycheproof/testcases/EcdsaTest.java b/java/com/google/security/wycheproof/testcases/EcdsaTest.java index 01ce13a..3a0655a 100644 --- a/java/com/google/security/wycheproof/testcases/EcdsaTest.java +++ b/java/com/google/security/wycheproof/testcases/EcdsaTest.java @@ -231,7 +231,7 @@ public class EcdsaTest { if (k.testBit(0)) { countLsb++; } - if (k.compareTo(qHalf) == 1) { + if (k.compareTo(qHalf) > 0) { countMsb++; } } @@ -267,6 +267,12 @@ public class EcdsaTest { if (bias3 > threshold) { 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( diff --git a/java/com/google/security/wycheproof/testcases/JsonSignatureTest.java b/java/com/google/security/wycheproof/testcases/JsonSignatureTest.java index deefd1f..76c2d44 100644 --- a/java/com/google/security/wycheproof/testcases/JsonSignatureTest.java +++ b/java/com/google/security/wycheproof/testcases/JsonSignatureTest.java @@ -52,7 +52,7 @@ public class JsonSignatureTest { public enum Format { RAW, ASN, P1363 }; /** 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(); } @@ -62,62 +62,90 @@ public class JsonSignatureTest { } /** - * Returns an instance of java.security.Signature for an algorithm name, a digest name and - * a signature format. The algorithm names used in JCA are a bit inconsequential. E.g. a dash - * is necessary for message digests (e.g. "SHA-256") but are not used in the corresponding - * names for digital signatures (e.g. "SHA256WITHECDSA"). Providers sometimes use distinct - * algorithm names for the same cryptographic primitive. + * Convert hash names, so that they can be used in an algorithm name for a signature. The + * algorithm names used in JCA are a bit inconsequential. E.g. a dash is necessary for message + * digests (e.g. "SHA-256") but are not used in the corresponding names for digital signatures + * (e.g. "SHA256WITHECDSA"). Providers sometimes use distinct algorithm names for the same + * 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". * *

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 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 * @throws NoSuchAlgorithmException if the algorithm is not known */ protected static Signature getSignatureInstance( - String md, String signatureAlgorithm, Format signatureFormat) + JsonObject group, String signatureAlgorithm, Format signatureFormat) throws NoSuchAlgorithmException { - // Convert hash names, so that they can be used in an algorithm name for a signature. - // I.e. in a number of cases a hyphen needs to be removed to get correct names. - // No conversion is necessary for SHA-3 hashes. E.g, "SHA3-256WithECDSA" is the ECDSA - // 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"; + String md = ""; + if (group.has("sha")) { + md = convertMdName(getString(group, "sha")); } - switch (signatureFormat) { - case RAW: - case ASN: + if (signatureAlgorithm.equals("ECDSA") || signatureAlgorithm.equals("DSA")) { + if (signatureFormat == Format.ASN) { return Signature.getInstance(md + "WITH" + signatureAlgorithm); - case P1363: - if (signatureAlgorithm.equals("ECDSA") || signatureAlgorithm.equals("DSA")) { - // 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 - // been added in jdk11, while providers such as BouncyCastle added the format earlier - // than that. Hence the code below just tries known algorithm names. - try { - String jdkName = md + "WITH" + signatureAlgorithm + "inP1363Format"; - return Signature.getInstance(jdkName); - } catch (NoSuchAlgorithmException ex) { - // jdkName is not known. - } - try { - String bcName = md + "WITHPLAIN-" + signatureAlgorithm; - return Signature.getInstance(bcName); - } catch (NoSuchAlgorithmException ex) { - // bcName is not known. - } + } else if (signatureFormat == Format.P1363) { + // 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 + // been added in jdk11, while providers such as BouncyCastle added the format earlier + // than that. Hence the code below just tries known algorithm names. + try { + String jdkName = md + "WITH" + signatureAlgorithm + "inP1363Format"; + return Signature.getInstance(jdkName); + } catch (NoSuchAlgorithmException ex) { + // jdkName 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( "Algorithm " @@ -153,16 +181,31 @@ public class JsonSignatureTest { } else if (signatureAlgorithm.equals("RSA")) { // Only RSA-PKCS1 is implemented in this unit test. // 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) { case RAW: return "rsassa_pkcs1_verify_schema.json"; default: break; } + } else if (signatureAlgorithm.equals("ED25519") || signatureAlgorithm.equals("ED448")) { + switch (signatureFormat) { + case RAW: + return "eddsa_verify_schema.json"; + default: + break; + } } } else { // signature generation if (signatureAlgorithm.equals("RSA")) { 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 @@ -178,14 +221,17 @@ public class JsonSignatureTest { */ // This is a false positive, since errorprone cannot track values passed into a method. @SuppressWarnings("InsecureCryptoUsage") - protected static PublicKey getPublicKey(JsonObject object, String algorithm) throws Exception { + protected static PublicKey getPublicKey(JsonObject group, String algorithm) throws Exception { KeyFactory kf; if (algorithm.equals("ECDSA")) { kf = KeyFactory.getInstance("EC"); + } else if (algorithm.equals("ED25519") || algorithm.equals("ED448")) { + // http://openjdk.java.net/jeps/339 + kf = KeyFactory.getInstance("EdDSA"); } else { kf = KeyFactory.getInstance(algorithm); } - byte[] encoded = TestUtil.hexToBytes(getString(object, "keyDer")); + byte[] encoded = TestUtil.hexToBytes(getString(group, "keyDer")); X509EncodedKeySpec x509keySpec = new X509EncodedKeySpec(encoded); 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. @SuppressWarnings("InsecureCryptoUsage") protected static PrivateKey getPrivateKey(JsonObject object, String algorithm) throws Exception { - KeyFactory kf = KeyFactory.getInstance(algorithm); - byte[] encoded = TestUtil.hexToBytes(getString(object, "privateKeyPkcs8")); - PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encoded); - return kf.generatePrivate(keySpec); + if (algorithm.equals("RSA")) { + KeyFactory kf = KeyFactory.getInstance(algorithm); + byte[] encoded = TestUtil.hexToBytes(getString(object, "privateKeyPkcs8")); + 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 errors = 0; int skippedKeys = 0; + int supportedKeys = 0; Set skippedGroups = new HashSet(); for (JsonElement g : test.getAsJsonArray("testGroups")) { JsonObject group = g.getAsJsonObject(); @@ -268,6 +319,9 @@ public class JsonSignatureTest { try { key = getPublicKey(group, signatureAlgorithm); } catch (GeneralSecurityException ex) { + if (!allowSkippingKeys) { + throw ex; + } if (group.has("key")) { JsonObject keyStruct = group.getAsJsonObject("key"); if (keyStruct.has("curve")) { @@ -277,14 +331,17 @@ public class JsonSignatureTest { skippedKeys++; continue; } - String md = getString(group, "sha"); Signature verifier; try { - verifier = getSignatureInstance(md, signatureAlgorithm, signatureFormat); + verifier = getSignatureInstance(group, signatureAlgorithm, signatureFormat); } catch (NoSuchAlgorithmException ex) { + if (!allowSkippingKeys) { + throw ex; + } skippedKeys++; continue; } + supportedKeys++; for (JsonElement t : group.getAsJsonArray("tests")) { cntTests++; JsonObject testcase = t.getAsJsonObject(); @@ -359,8 +416,14 @@ public class JsonSignatureTest { } } } - if (skippedKeys > 0 || !skippedGroups.isEmpty()) { - System.out.println("File:" + filename + " number of skipped keys:" + skippedKeys); + if (skippedKeys > 0) { + System.out.println( + "File:" + + filename + + " number of skipped keys:" + + skippedKeys + + " number of supported keys:" + + supportedKeys); for (String s : skippedGroups) { System.out.println("Skipped groups where " + s); } @@ -368,8 +431,6 @@ public class JsonSignatureTest { assertEquals(0, errors); if (skippedKeys == 0) { assertEquals(numTests, cntTests); - } else { - assertTrue(allowSkippingKeys); } } @@ -414,10 +475,9 @@ public class JsonSignatureTest { skippedKeys++; continue; } - String md = getString(group, "sha"); Signature signer; try { - signer = getSignatureInstance(md, signatureAlgorithm, signatureFormat); + signer = getSignatureInstance(group, signatureAlgorithm, signatureFormat); } catch (NoSuchAlgorithmException ex) { skippedKeys++; continue; @@ -687,6 +747,23 @@ public class JsonSignatureTest { 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. @NoPresubmitTest( providers = {ProviderType.OPENJDK}, diff --git a/testvectors/ed448_test.json b/testvectors/ed448_test.json index 265fb29..9dbf43a 100644 --- a/testvectors/ed448_test.json +++ b/testvectors/ed448_test.json @@ -1,6 +1,6 @@ { "algorithm" : "EDDSA", - "generatorVersion" : "0.7", + "generatorVersion" : "0.8r9", "numberOfTests" : 86, "header" : [ "Test vectors of type EddsaVerify are intended for testing", @@ -26,8 +26,8 @@ "sk" : "88301e076518d3537f9302ee0f5223e4b63e1f016007d3c2ebdfec5f70997e8119c6bad0ae7b803f48791ca8ec549aa2a1b862f7a51590b9d5", "type" : "EDDSAKeyPair" }, - "keyDer" : "3043300506032b6570033a00419610a534af127f583b04818cdb7f0ff300b025f2e01682bcae33fd691cee039511df0cddc690ee978426e8b38e50ce5af7dcfba50f704c00", - "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VwAzoAQZYQpTSvEn9YOwSBjNt/D/MAsCXy4BaCvK4z/Wkc7gOVEd8M3caQ7peEJuizjlDOWvfc+6UPcEwA\n-----END PUBLIC KEY-----\n", + "keyDer" : "3043300506032b6571033a00419610a534af127f583b04818cdb7f0ff300b025f2e01682bcae33fd691cee039511df0cddc690ee978426e8b38e50ce5af7dcfba50f704c00", + "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VxAzoAQZYQpTSvEn9YOwSBjNt/D/MAsCXy4BaCvK4z/Wkc7gOVEd8M3caQ7peEJuizjlDOWvfc+6UPcEwA\n-----END PUBLIC KEY-----\n", "type" : "EddsaVerify", "tests" : [ { @@ -679,8 +679,8 @@ "sk" : "6c82a562cb808d10d632be89c8513ebf6c929f34ddfa8c9f63c9960ef6e348a3528c8a3fcc2f044e39a3fc5b94492f8f032e7549a20098f95b", "type" : "EDDSAKeyPair" }, - "keyDer" : "3043300506032b6570033a005fd7449b59b461fd2ce787ec616ad46a1da1342485a70e1f8a0ea75d80e96778edf124769b46c7061bd6783df1e50f6cd1fa1abeafe8256180", - "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VwAzoAX9dEm1m0Yf0s54fsYWrUah2hNCSFpw4fig6nXYDpZ3jt8SR2m0bHBhvWeD3x5Q9s0foavq/oJWGA\n-----END PUBLIC KEY-----\n", + "keyDer" : "3043300506032b6571033a005fd7449b59b461fd2ce787ec616ad46a1da1342485a70e1f8a0ea75d80e96778edf124769b46c7061bd6783df1e50f6cd1fa1abeafe8256180", + "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VxAzoAX9dEm1m0Yf0s54fsYWrUah2hNCSFpw4fig6nXYDpZ3jt8SR2m0bHBhvWeD3x5Q9s0foavq/oJWGA\n-----END PUBLIC KEY-----\n", "type" : "EddsaVerify", "tests" : [ { @@ -708,8 +708,8 @@ "sk" : "c4eab05d357007c632f3dbb48489924d552b08fe0c353a0d4a1f00acda2c463afbea67c5e8d2877c5e3bc397a659949ef8021e954e0a12274e", "type" : "EDDSAKeyPair" }, - "keyDer" : "3043300506032b6570033a0043ba28f430cdff456ae531545f7ecd0ac834a55d9358c0372bfa0c6c6798c0866aea01eb00742802b8438ea4cb82169c235160627b4c3a9480", - "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VwAzoAQ7oo9DDN/0Vq5TFUX37NCsg0pV2TWMA3K/oMbGeYwIZq6gHrAHQoArhDjqTLghacI1FgYntMOpSA\n-----END PUBLIC KEY-----\n", + "keyDer" : "3043300506032b6571033a0043ba28f430cdff456ae531545f7ecd0ac834a55d9358c0372bfa0c6c6798c0866aea01eb00742802b8438ea4cb82169c235160627b4c3a9480", + "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VxAzoAQ7oo9DDN/0Vq5TFUX37NCsg0pV2TWMA3K/oMbGeYwIZq6gHrAHQoArhDjqTLghacI1FgYntMOpSA\n-----END PUBLIC KEY-----\n", "type" : "EddsaVerify", "tests" : [ { @@ -745,8 +745,8 @@ "sk" : "cd23d24f714274e744343237b93290f511f6425f98e64459ff203e8985083ffdf60500553abc0e05cd02184bdb89c4ccd67e187951267eb328", "type" : "EDDSAKeyPair" }, - "keyDer" : "3043300506032b6570033a00dcea9e78f35a1bf3499a831b10b86c90aac01cd84b67a0109b55a36e9328b1e365fce161d71ce7131a543ea4cb5f7e9f1d8b00696447001400", - "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VwAzoA3OqeePNaG/NJmoMbELhskKrAHNhLZ6AQm1WjbpMoseNl/OFh1xznExpUPqTLX36fHYsAaWRHABQA\n-----END PUBLIC KEY-----\n", + "keyDer" : "3043300506032b6571033a00dcea9e78f35a1bf3499a831b10b86c90aac01cd84b67a0109b55a36e9328b1e365fce161d71ce7131a543ea4cb5f7e9f1d8b00696447001400", + "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VxAzoA3OqeePNaG/NJmoMbELhskKrAHNhLZ6AQm1WjbpMoseNl/OFh1xznExpUPqTLX36fHYsAaWRHABQA\n-----END PUBLIC KEY-----\n", "type" : "EddsaVerify", "tests" : [ { @@ -774,8 +774,8 @@ "sk" : "258cdd4ada32ed9c9ff54e63756ae582fb8fab2ac721f2c8e676a72768513d939f63dddb55609133f29adf86ec9929dccb52c1c5fd2ff7e21b", "type" : "EDDSAKeyPair" }, - "keyDer" : "3043300506032b6570033a003ba16da0c6f2cc1f30187740756f5e798d6bc5fc015d7c63cc9510ee3fd44adc24d8e968b6e46e6f94d19b945361726bd75e149ef09817f580", - "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VwAzoAO6FtoMbyzB8wGHdAdW9eeY1rxfwBXXxjzJUQ7j/UStwk2OlotuRub5TRm5RTYXJr114UnvCYF/WA\n-----END PUBLIC KEY-----\n", + "keyDer" : "3043300506032b6571033a003ba16da0c6f2cc1f30187740756f5e798d6bc5fc015d7c63cc9510ee3fd44adc24d8e968b6e46e6f94d19b945361726bd75e149ef09817f580", + "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VxAzoAO6FtoMbyzB8wGHdAdW9eeY1rxfwBXXxjzJUQ7j/UStwk2OlotuRub5TRm5RTYXJr114UnvCYF/WA\n-----END PUBLIC KEY-----\n", "type" : "EddsaVerify", "tests" : [ { @@ -803,8 +803,8 @@ "sk" : "7ef4e84544236752fbb56b8f31a23a10e42814f5f55ca037cdcc11c64c9a3b2949c1bb60700314611732a6c2fea98eebc0266a11a93970100e", "type" : "EDDSAKeyPair" }, - "keyDer" : "3043300506032b6570033a00b3da079b0aa493a5772029f0467baebee5a8112d9d3a22532361da294f7bb3815c5dc59e176b4d9f381ca0938e13c6c07b174be65dfa578e80", - "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VwAzoAs9oHmwqkk6V3ICnwRnuuvuWoES2dOiJTI2HaKU97s4FcXcWeF2tNnzgcoJOOE8bAexdL5l36V46A\n-----END PUBLIC KEY-----\n", + "keyDer" : "3043300506032b6571033a00b3da079b0aa493a5772029f0467baebee5a8112d9d3a22532361da294f7bb3815c5dc59e176b4d9f381ca0938e13c6c07b174be65dfa578e80", + "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VxAzoAs9oHmwqkk6V3ICnwRnuuvuWoES2dOiJTI2HaKU97s4FcXcWeF2tNnzgcoJOOE8bAexdL5l36V46A\n-----END PUBLIC KEY-----\n", "type" : "EddsaVerify", "tests" : [ { @@ -832,8 +832,8 @@ "sk" : "d65df341ad13e008567688baedda8e9dcdc17dc024974ea5b4227b6530e339bff21f99e68ca6968f3cca6dfe0fb9f4fab4fa135d5542ea3f01", "type" : "EDDSAKeyPair" }, - "keyDer" : "3043300506032b6570033a00df9705f58edbab802c7f8363cfe5560ab1c6132c20a9f1dd163483a26f8ac53a39d6808bf4a1dfbd261b099bb03b3fb50906cb28bd8a081f00", - "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VwAzoA35cF9Y7bq4Asf4Njz+VWCrHGEywgqfHdFjSDom+KxTo51oCL9KHfvSYbCZuwOz+1CQbLKL2KCB8A\n-----END PUBLIC KEY-----\n", + "keyDer" : "3043300506032b6571033a00df9705f58edbab802c7f8363cfe5560ab1c6132c20a9f1dd163483a26f8ac53a39d6808bf4a1dfbd261b099bb03b3fb50906cb28bd8a081f00", + "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VxAzoA35cF9Y7bq4Asf4Njz+VWCrHGEywgqfHdFjSDom+KxTo51oCL9KHfvSYbCZuwOz+1CQbLKL2KCB8A\n-----END PUBLIC KEY-----\n", "type" : "EddsaVerify", "tests" : [ { @@ -861,8 +861,8 @@ "sk" : "2ec5fe3c17045abdb136a5e6a913e32ab75ae68b53d2fc149b77e504132d37569b7e766ba74a19bd6162343a21c8590aa9cebca9014c636df5", "type" : "EDDSAKeyPair" }, - "keyDer" : "3043300506032b6570033a0079756f014dcfe2079f5dd9e718be4171e2ef2486a08f25186f6bff43a9936b9bfe12402b08ae65798a3d81e22e9ec80e7690862ef3d4ed3a00", - "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VwAzoAeXVvAU3P4gefXdnnGL5BceLvJIagjyUYb2v/Q6mTa5v+EkArCK5leYo9geIunsgOdpCGLvPU7ToA\n-----END PUBLIC KEY-----\n", + "keyDer" : "3043300506032b6571033a0079756f014dcfe2079f5dd9e718be4171e2ef2486a08f25186f6bff43a9936b9bfe12402b08ae65798a3d81e22e9ec80e7690862ef3d4ed3a00", + "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VxAzoAeXVvAU3P4gefXdnnGL5BceLvJIagjyUYb2v/Q6mTa5v+EkArCK5leYo9geIunsgOdpCGLvPU7ToA\n-----END PUBLIC KEY-----\n", "type" : "EddsaVerify", "tests" : [ { @@ -890,8 +890,8 @@ "sk" : "872d093780f5d3730df7c212664b37b8a0f24f56810daa8382cd4fa3f77634ec44dc54f1c2ed9bea86fafb7632d8be199ea165f5ad55dd9ce8", "type" : "EDDSAKeyPair" }, - "keyDer" : "3043300506032b6570033a00a81b2e8a70a5ac94ffdbcc9badfc3feb0801f258578bb114ad44ece1ec0e799da08effb81c5d685c0c56f64eecaef8cdf11cc38737838cf400", - "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VwAzoAqBsuinClrJT/28ybrfw/6wgB8lhXi7EUrUTs4ewOeZ2gjv+4HF1oXAxW9k7srvjN8RzDhzeDjPQA\n-----END PUBLIC KEY-----\n", + "keyDer" : "3043300506032b6571033a00a81b2e8a70a5ac94ffdbcc9badfc3feb0801f258578bb114ad44ece1ec0e799da08effb81c5d685c0c56f64eecaef8cdf11cc38737838cf400", + "keyPem" : "-----BEGIN PUBLIC KEY-----\nMEMwBQYDK2VxAzoAqBsuinClrJT/28ybrfw/6wgB8lhXi7EUrUTs4ewOeZ2gjv+4HF1oXAxW9k7srvjN8RzDhzeDjPQA\n-----END PUBLIC KEY-----\n", "type" : "EddsaVerify", "tests" : [ {