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:
@@ -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,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".
|
||||
*
|
||||
* <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.
|
||||
* @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<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
@@ -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" : [
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user