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)) {
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(
@@ -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,14 +62,37 @@ 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".
*
* <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 signatureAlgorithm the name of the signature algorithm (e.g. "ECDSA")
* @param signatureFormat the format of the signatures.
@@ -77,29 +100,16 @@ public class JsonSignatureTest {
* @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:
return Signature.getInstance(md + "WITH" + signatureAlgorithm);
case P1363:
if (signatureAlgorithm.equals("ECDSA") || signatureAlgorithm.equals("DSA")) {
if (signatureFormat == Format.ASN) {
return Signature.getInstance(md + "WITH" + signatureAlgorithm);
} 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
@@ -117,7 +127,25 @@ public class JsonSignatureTest {
// bcName is not known.
}
}
break;
} 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 "
@@ -158,11 +186,26 @@ public class JsonSignatureTest {
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 {
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<String> skippedGroups = new HashSet<String>();
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},
+19 -19
View File
@@ -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" : [
{