X25519 { public static byte[] publicFromPrivate(byte[] privateKey) throws InvalidKeyException { if (privateKey.length != Field25519.FIELD_LEN) { throw new InvalidKeyException("Private key must have 32 bytes."); } byte[] base = new byte[Field25519.FIELD_LEN]; base[0] = 9; return computeSharedSecret(privateKey, base); }  @SuppressWarnings("NarrowingCompoundAssignment") static byte[] generatePrivateKey(); @SuppressWarnings("NarrowingCompoundAssignment") static byte[] computeSharedSecret(byte[] privateKey, byte[] peersPublicValue); static byte[] publicFromPrivate(byte[] privateKey);  }
@Test public void testPublicFromPrivateWithRfcTestVectors() throws Exception { byte[] out = X25519.publicFromPrivate( TestUtil.hexDecode("77076d0a7318a57d3c16c17251b26645df4c2f87ebc0992ab177fba51db92c2a")); assertEquals( "8520f0098930a754748b7ddcb43ef75a0dbf3a0d26381af4eba4a98eaa9b4e6a", TestUtil.hexEncode(out)); out = X25519.publicFromPrivate( TestUtil.hexDecode("5dab087e624a8a4b79e17f8b83800ee66f3bb1292618b6fd1c2f8b27ff88e0eb")); assertEquals( "de9edb7d7b7dc1b4d35b61c2ece435373f8343c85b78674dadfc7e146f882b4f", TestUtil.hexEncode(out)); }