@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); } }
public Ed25519PublicKey(EdDSAPublicKeySpec spec) { super(spec); EdDSANamedCurveSpec ed25519 = EdDSANamedCurveTable.getByName("Ed25519"); if (!spec.getParams().getCurve().equals(ed25519.getCurve())) { throw new SSHRuntimeException("Cannot create Ed25519 Public Key from wrong spec"); } }
kp = new KeyPair(publicKey, new EdDSAPrivateKey(new EdDSAPrivateKeySpec(privKey, EdDSANamedCurveTable.getByName("Ed25519")))); break; case RSA:
/** * Create an EdDSANamedCurveSpec from the provided curve name. The current * implementation fetches the pre-created curve spec from a table. * @param curveName the EdDSA named curve. * @return the specification for the named curve. * @throws InvalidAlgorithmParameterException if the named curve is unknown. */ protected EdDSANamedCurveSpec createNamedCurveSpec(String curveName) throws InvalidAlgorithmParameterException { EdDSANamedCurveSpec spec = EdDSANamedCurveTable.getByName(curveName); if (spec == null) { throw new InvalidAlgorithmParameterException("unknown curve name: " + curveName); } return spec; } }
@Test public void testSignResetsForReuse() throws Exception { EdDSAParameterSpec spec = EdDSANamedCurveTable.getByName(EdDSANamedCurveTable.ED_25519); Signature sgr = new EdDSAEngine(MessageDigest.getInstance(spec.getHashAlgorithm())); EdDSAPrivateKeySpec privKey = new EdDSAPrivateKeySpec(TEST_SEED, spec); PrivateKey sKey = new EdDSAPrivateKey(privKey); sgr.initSign(sKey); // First usage sgr.update(new byte[] {0}); sgr.sign(); // Second usage sgr.update(TEST_MSG); assertThat("Second sign failed", sgr.sign(), is(equalTo(TEST_MSG_SIG))); }
@Test public void testSign() 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) { EdDSAPrivateKeySpec privKey = new EdDSAPrivateKeySpec(testCase.seed, spec); PrivateKey sKey = new EdDSAPrivateKey(privKey); sgr.initSign(sKey); sgr.update(testCase.message); assertThat("Test case " + testCase.caseNum + " failed", sgr.sign(), is(equalTo(testCase.sig))); } }
@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)); }
@Test public void testSignOneShotMode() throws Exception { EdDSAParameterSpec spec = EdDSANamedCurveTable.getByName(EdDSANamedCurveTable.ED_25519); Signature sgr = new EdDSAEngine(MessageDigest.getInstance(spec.getHashAlgorithm())); EdDSAPrivateKeySpec privKey = new EdDSAPrivateKeySpec(TEST_SEED, spec); PrivateKey sKey = new EdDSAPrivateKey(privKey); sgr.initSign(sKey); sgr.setParameter(EdDSAEngine.ONE_SHOT_MODE); sgr.update(TEST_MSG); assertThat("One-shot mode sign failed", sgr.sign(), is(equalTo(TEST_MSG_SIG))); }
@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)); }
public static GroupElement[][] getPrecomputation(String fileName) { EdDSANamedCurveSpec ed25519 = EdDSANamedCurveTable.getByName(EdDSANamedCurveTable.ED_25519); Curve curve = ed25519.getCurve(); Field field = curve.getField();
public static GroupElement[] getDoublePrecomputation(String fileName) { EdDSANamedCurveSpec ed25519 = EdDSANamedCurveTable.getByName(EdDSANamedCurveTable.ED_25519); Curve curve = ed25519.getCurve(); Field field = curve.getField();
/** * 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 testSignOneShotModeMultipleUpdates() throws Exception { EdDSAParameterSpec spec = EdDSANamedCurveTable.getByName(EdDSANamedCurveTable.ED_25519); Signature sgr = new EdDSAEngine(MessageDigest.getInstance(spec.getHashAlgorithm())); EdDSAPrivateKeySpec privKey = new EdDSAPrivateKeySpec(TEST_SEED, spec); PrivateKey sKey = new EdDSAPrivateKey(privKey); sgr.initSign(sKey); sgr.setParameter(EdDSAEngine.ONE_SHOT_MODE); sgr.update(TEST_MSG); exception.expect(SignatureException.class); exception.expectMessage("update() already called"); sgr.update(TEST_MSG); }
@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); }
@Test public void testSignOneShot() throws Exception { EdDSAParameterSpec spec = EdDSANamedCurveTable.getByName(EdDSANamedCurveTable.ED_25519); EdDSAPrivateKeySpec privKey = new EdDSAPrivateKeySpec(TEST_SEED, spec); EdDSAEngine sgr = new EdDSAEngine(MessageDigest.getInstance(spec.getHashAlgorithm())); PrivateKey sKey = new EdDSAPrivateKey(privKey); sgr.initSign(sKey); assertThat("signOneShot() failed", sgr.signOneShot(TEST_MSG), is(equalTo(TEST_MSG_SIG))); }
@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 SshEd25519PrivateKey(byte[] sk, byte[] pk) { this.sk = Arrays.copyOfRange(sk, 0, 32); EdDSAPrivateKeySpec spec = new EdDSAPrivateKeySpec(this.sk, EdDSANamedCurveTable.getByName("Ed25519")); key = new EdDSAPrivateKey(spec); }
public static PrivateKey generateEDDSAPrivateKey(byte[] seed) throws GeneralSecurityException { if (!SecurityUtils.isEDDSACurveSupported()) { throw new NoSuchAlgorithmException(SecurityUtils.EDDSA + " not supported"); } EdDSAParameterSpec params = EdDSANamedCurveTable.getByName(CURVE_ED25519_SHA512); EdDSAPrivateKeySpec keySpec = new EdDSAPrivateKeySpec(seed, params); KeyFactory factory = SecurityUtils.getKeyFactory(SecurityUtils.EDDSA); return factory.generatePrivate(keySpec); }
protected byte[] signWithoutClamp(byte[] message, byte[] privateKey, byte[] publicKey) { try { EdDSAPrivateKeySpec edDSAPrivateKeySpec = new EdDSAPrivateKeySpec(privateKey, EdDSANamedCurveTable.getByName("ed25519-sha-512")); mEdDSAEngine.initSign(new EdDSAPrivateKey(edDSAPrivateKeySpec)); mEdDSAEngine.update(message); return mEdDSAEngine.sign(); } catch (InvalidKeyException e) { throw new IllegalArgumentException(e); } catch (SignatureException e) { throw new IllegalArgumentException(e); } }