@Override public PublicKey readPubKeyFromBuffer(Buffer<?> buf) throws GeneralSecurityException { try { final int keyLen = buf.readUInt32AsInt(); final byte[] p = new byte[keyLen]; buf.readRawBytes(p); if (log.isDebugEnabled()) { log.debug(String.format("Key algo: %s, Key curve: 25519, Key Len: %s\np: %s", sType, keyLen, Arrays.toString(p)) ); } EdDSANamedCurveSpec ed25519 = EdDSANamedCurveTable.getByName("Ed25519"); EdDSAPublicKeySpec publicSpec = new EdDSAPublicKeySpec(p, ed25519); return new Ed25519PublicKey(publicSpec); } catch (Buffer.BufferException be) { throw new SSHRuntimeException(be); } }
/** * @since 0.9.25 */ public EdDSAPublicKey(X509EncodedKeySpec spec) throws InvalidKeySpecException { this(new EdDSAPublicKeySpec(decode(spec.getEncoded()), EdDSANamedCurveTable.ED_25519_CURVE_SPEC)); }
/** * @since 0.9.15 */ private static EdDSAPublicKey cvtToJavaEdDSAKey(SigningPublicKey pk) throws GeneralSecurityException { try { return new EdDSAPublicKey(new EdDSAPublicKeySpec( pk.getData(), (EdDSAParameterSpec) pk.getType().getParams())); } catch (IllegalArgumentException iae) { throw new InvalidKeyException(iae); } }
@Test public void testVerifyResetsForReuse() throws Exception { EdDSAParameterSpec spec = EdDSANamedCurveTable.getByName(EdDSANamedCurveTable.ED_25519); Signature sgr = new EdDSAEngine(MessageDigest.getInstance(spec.getHashAlgorithm())); EdDSAPublicKeySpec pubKey = new EdDSAPublicKeySpec(TEST_PK, spec); PublicKey vKey = new EdDSAPublicKey(pubKey); sgr.initVerify(vKey); // First usage sgr.update(new byte[] {0}); sgr.verify(TEST_MSG_SIG); // Second usage sgr.update(TEST_MSG); assertThat("Second verify failed", sgr.verify(TEST_MSG_SIG), is(true)); }
public KeyPair generateKeyPair() { if (!initialized) initialize(DEFAULT_KEYSIZE, RandomSource.getInstance()); byte[] seed = new byte[edParams.getCurve().getField().getb()/8]; random.nextBytes(seed); EdDSAPrivateKeySpec privKey = new EdDSAPrivateKeySpec(seed, edParams); EdDSAPublicKeySpec pubKey = new EdDSAPublicKeySpec(privKey.getA(), edParams); return new KeyPair(new EdDSAPublicKey(pubKey), new EdDSAPrivateKey(privKey)); }
@Test public void testVerify() throws Exception { EdDSAParameterSpec spec = EdDSANamedCurveTable.getByName(EdDSANamedCurveTable.ED_25519); //Signature sgr = Signature.getInstance("EdDSA", "I2P"); Signature sgr = new EdDSAEngine(MessageDigest.getInstance(spec.getHashAlgorithm())); for (Ed25519TestVectors.TestTuple testCase : Ed25519TestVectors.testCases) { EdDSAPublicKeySpec pubKey = new EdDSAPublicKeySpec(testCase.pk, spec); PublicKey vKey = new EdDSAPublicKey(pubKey); sgr.initVerify(vKey); sgr.update(testCase.message); assertThat("Test case " + testCase.caseNum + " failed", sgr.verify(testCase.sig), is(true)); } }
@Test public void testVerifyOneShotMode() throws Exception { EdDSAParameterSpec spec = EdDSANamedCurveTable.getByName(EdDSANamedCurveTable.ED_25519); Signature sgr = new EdDSAEngine(MessageDigest.getInstance(spec.getHashAlgorithm())); EdDSAPublicKeySpec pubKey = new EdDSAPublicKeySpec(TEST_PK, spec); PublicKey vKey = new EdDSAPublicKey(pubKey); sgr.initVerify(vKey); sgr.setParameter(EdDSAEngine.ONE_SHOT_MODE); sgr.update(TEST_MSG); assertThat("One-shot mode verify failed", sgr.verify(TEST_MSG_SIG), is(true)); }
@SuppressWarnings("unchecked") protected <T extends KeySpec> T engineGetKeySpec(Key key, Class<T> keySpec) throws InvalidKeySpecException { if (keySpec.isAssignableFrom(EdDSAPublicKeySpec.class) && key instanceof EdDSAPublicKey) { EdDSAPublicKey k = (EdDSAPublicKey) key; if (k.getParams() != null) { return (T) new EdDSAPublicKeySpec(k.getA(), k.getParams()); } } else if (keySpec.isAssignableFrom(EdDSAPrivateKeySpec.class) && key instanceof EdDSAPrivateKey) { EdDSAPrivateKey k = (EdDSAPrivateKey) key; if (k.getParams() != null) { return (T) new EdDSAPrivateKeySpec(k.getSeed(), k.getH(), k.geta(), k.getA(), k.getParams()); } } throw new InvalidKeySpecException("not implemented yet " + key + " " + keySpec); }
/** * Checks that a wrong-length signature throws an IAE. */ @Test public void testVerifyWrongSigLength() throws Exception { EdDSAParameterSpec spec = EdDSANamedCurveTable.getByName(EdDSANamedCurveTable.ED_25519); //Signature sgr = Signature.getInstance("EdDSA", "I2P"); Signature sgr = new EdDSAEngine(MessageDigest.getInstance(spec.getHashAlgorithm())); EdDSAPublicKeySpec pubKey = new EdDSAPublicKeySpec(TEST_PK, spec); PublicKey vKey = new EdDSAPublicKey(pubKey); sgr.initVerify(vKey); sgr.update(TEST_MSG); exception.expect(SignatureException.class); exception.expectMessage("signature length is wrong"); sgr.verify(new byte[] {0}); }
@Test public void testVerifyOneShotModeMultipleUpdates() throws Exception { EdDSAParameterSpec spec = EdDSANamedCurveTable.getByName(EdDSANamedCurveTable.ED_25519); EdDSAPublicKeySpec pubKey = new EdDSAPublicKeySpec(TEST_PK, spec); Signature sgr = new EdDSAEngine(MessageDigest.getInstance(spec.getHashAlgorithm())); PublicKey vKey = new EdDSAPublicKey(pubKey); sgr.initVerify(vKey); sgr.setParameter(EdDSAEngine.ONE_SHOT_MODE); sgr.update(TEST_MSG); exception.expect(SignatureException.class); exception.expectMessage("update() already called"); sgr.update(TEST_MSG); }
EdDSAPublicKey epub = new EdDSAPublicKey(new EdDSAPublicKeySpec(epriv.getA(), epriv.getParams())); return SigUtil.fromJavaKey(epub, type);
@Test public void testVerifyOneShot() throws Exception { EdDSAParameterSpec spec = EdDSANamedCurveTable.getByName(EdDSANamedCurveTable.ED_25519); EdDSAPublicKeySpec pubKey = new EdDSAPublicKeySpec(TEST_PK, spec); EdDSAEngine sgr = new EdDSAEngine(MessageDigest.getInstance(spec.getHashAlgorithm())); PublicKey vKey = new EdDSAPublicKey(pubKey); sgr.initVerify(vKey); assertThat("verifyOneShot() failed", sgr.verifyOneShot(TEST_MSG, TEST_MSG_SIG), is(true)); } }
public static PublicKey generateEDDSAPublicKey(byte[] seed) throws GeneralSecurityException { if (!SecurityUtils.isEDDSACurveSupported()) { throw new NoSuchAlgorithmException(SecurityUtils.EDDSA + " not supported"); } EdDSAParameterSpec params = EdDSANamedCurveTable.getByName(CURVE_ED25519_SHA512); EdDSAPublicKeySpec keySpec = new EdDSAPublicKeySpec(seed, params); KeyFactory factory = SecurityUtils.getKeyFactory(SecurityUtils.EDDSA); return factory.generatePublic(keySpec); }
@Override public EdDSAPublicKey clonePublicKey(EdDSAPublicKey key) throws GeneralSecurityException { if (key == null) { return null; } else { return generatePublicKey(new EdDSAPublicKeySpec(key.getA(), key.getParams())); } }
@Override public EdDSAPublicKey clonePublicKey(EdDSAPublicKey key) throws GeneralSecurityException { if (key == null) { return null; } else { return generatePublicKey(new EdDSAPublicKeySpec(key.getA(), key.getParams())); } }
public static EdDSAPublicKey recoverEDDSAPublicKey(PrivateKey key) throws GeneralSecurityException { ValidateUtils.checkTrue(SecurityUtils.isEDDSACurveSupported(), SecurityUtils.EDDSA + " not supported"); if (!(key instanceof EdDSAPrivateKey)) { throw new InvalidKeyException("Private key is not " + SecurityUtils.EDDSA); } EdDSAPrivateKey prvKey = (EdDSAPrivateKey) key; EdDSAPublicKeySpec keySpec = new EdDSAPublicKeySpec(prvKey.getAbyte(), prvKey.getParams()); KeyFactory factory = SecurityUtils.getKeyFactory(SecurityUtils.EDDSA); return EdDSAPublicKey.class.cast(factory.generatePublic(keySpec)); }
public boolean isValidSignature(byte[] message, byte[] signature, byte[] publicKey) { try { EdDSANamedCurveSpec spec = EdDSANamedCurveTable.getByName("ed25519-sha-512"); EdDSAPublicKeySpec edDSAPublicKeySpec = new EdDSAPublicKeySpec(publicKey, spec); EdDSAPublicKey edDSAPublicKey = new EdDSAPublicKey(edDSAPublicKeySpec); mEdDSAEngine.initVerify(edDSAPublicKey); mEdDSAEngine.update(message); return mEdDSAEngine.verify(signature); } catch (Exception e) { throw new IllegalArgumentException(e); } }
private static NKey createPair(Type type, byte[] seed) throws IOException, NoSuchProviderException, NoSuchAlgorithmException { EdDSAPrivateKeySpec privKeySpec = new EdDSAPrivateKeySpec(seed, NKey.ed25519); EdDSAPrivateKey privKey = new EdDSAPrivateKey(privKeySpec); EdDSAPublicKeySpec pubKeySpec = new EdDSAPublicKeySpec(privKey.getA(), NKey.ed25519); EdDSAPublicKey pubKey = new EdDSAPublicKey(pubKeySpec); byte[] pubBytes = pubKey.getAbyte(); byte[] bytes = new byte[pubBytes.length + seed.length]; System.arraycopy(seed, 0, bytes, 0, seed.length); System.arraycopy(pubBytes, 0, bytes, seed.length, pubBytes.length); char[] encoded = encodeSeed(type, bytes); return new NKey(type, null, encoded); }
public KeyPair generateKeyPair() { if (!initialized) initialize(DEFAULT_KEYSIZE, new SecureRandom()); byte[] seed = new byte[edParams.getCurve().getField().getb()/8]; random.nextBytes(seed); EdDSAPrivateKeySpec privKey = new EdDSAPrivateKeySpec(seed, edParams); EdDSAPublicKeySpec pubKey = new EdDSAPublicKeySpec(privKey.getA(), edParams); return new KeyPair(new EdDSAPublicKey(pubKey), new EdDSAPrivateKey(privKey)); }
public EdsaSigner(byte[] privateKeyBytes) { EdDSAParameterSpec spec = EdDSANamedCurveTable.getByName("ed25519-sha-512"); EdDSAPrivateKeySpec privateKeySpec = new EdDSAPrivateKeySpec(privateKeyBytes, spec); EdDSAPublicKeySpec pubKeySpec = new EdDSAPublicKeySpec(privateKeySpec.getA(), spec); publicKey = new EdDSAPublicKey(pubKeySpec); privateKey = new EdDSAPrivateKey(privateKeySpec); }