/** * @since 0.9.15 */ public static SigningPrivateKey fromJavaKey(EdDSAPrivateKey pk, SigType type) throws GeneralSecurityException { return new SigningPrivateKey(type, pk.getSeed()); }
/** * @since 0.9.25 */ @Override public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof EdDSAPrivateKey)) return false; EdDSAPrivateKey pk = (EdDSAPrivateKey) o; return Arrays.equals(seed, pk.getSeed()) && edDsaSpec.equals(pk.getParams()); } }
@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); }
public byte[] getSeed() { return key.getSeed(); }
@Override public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof EdDSAPrivateKey)) return false; EdDSAPrivateKey pk = (EdDSAPrivateKey) o; return Arrays.equals(seed, pk.getSeed()) && edDsaSpec.equals(pk.getParams()); } }
@Override public String encodePrivateKey(OutputStream s, EdDSAPrivateKey key) throws IOException { Objects.requireNonNull(key, "No private key provided"); // ed25519 bernstein naming: pk .. public key, sk .. secret key // we are expected to write the following arrays (type:size): // [pk:32], [sk:32,pk:32] byte[] sk = key.getSeed(); byte[] pk = key.getAbyte(); Objects.requireNonNull(sk, "No seed"); byte[] keypair = new byte[KEYPAIR_SIZE]; System.arraycopy(sk, 0, keypair, 0, SK_SIZE); System.arraycopy(pk, 0, keypair, SK_SIZE, PK_SIZE); KeyEntryResolver.writeRLEBytes(s, pk); KeyEntryResolver.writeRLEBytes(s, keypair); return KeyPairProvider.SSH_ED25519; }
public static boolean compareEDDSAPrivateKeys(PrivateKey k1, PrivateKey k2) { if (!SecurityUtils.isEDDSACurveSupported()) { return false; } if ((k1 instanceof EdDSAPrivateKey) && (k2 instanceof EdDSAPrivateKey)) { if (Objects.equals(k1, k2)) { return true; } else if (k1 == null || k2 == null) { return false; // both null is covered by Objects#equals } EdDSAPrivateKey ed1 = (EdDSAPrivateKey) k1; EdDSAPrivateKey ed2 = (EdDSAPrivateKey) k2; return Arrays.equals(ed1.getSeed(), ed2.getSeed()) && compareEDDSAKeyParams(ed1.getParams(), ed2.getParams()); } return false; }
@Override public String encodePrivateKey(OutputStream s, EdDSAPrivateKey key) throws IOException { Objects.requireNonNull(key, "No private key provided"); // ed25519 bernstein naming: pk .. public key, sk .. secret key // we are expected to write the following arrays (type:size): // [pk:32], [sk:32,pk:32] byte[] sk = key.getSeed(); byte[] pk = key.getAbyte(); Objects.requireNonNull(sk, "No seed"); byte[] keypair = new byte[KEYPAIR_SIZE]; System.arraycopy(sk, 0, keypair, 0, SK_SIZE); System.arraycopy(pk, 0, keypair, SK_SIZE, PK_SIZE); KeyEntryResolver.writeRLEBytes(s, pk); KeyEntryResolver.writeRLEBytes(s, keypair); return KeyPairProvider.SSH_ED25519; }
public static boolean compareEDDSAPrivateKeys(PrivateKey k1, PrivateKey k2) { if (!SecurityUtils.isEDDSACurveSupported()) { return false; } if ((k1 instanceof EdDSAPrivateKey) && (k2 instanceof EdDSAPrivateKey)) { if (Objects.equals(k1, k2)) { return true; } else if (k1 == null || k2 == null) { return false; // both null is covered by Objects#equals } EdDSAPrivateKey ed1 = (EdDSAPrivateKey) k1; EdDSAPrivateKey ed2 = (EdDSAPrivateKey) k2; return Arrays.equals(ed1.getSeed(), ed2.getSeed()) && compareEDDSAKeyParams(ed1.getParams(), ed2.getParams()); } return false; }
@Override public EdDSAPrivateKey clonePrivateKey(EdDSAPrivateKey key) throws GeneralSecurityException { if (key == null) { return null; } else { return generatePrivateKey(new EdDSAPrivateKeySpec(key.getSeed(), key.getParams())); } }
@Override public EdDSAPrivateKey clonePrivateKey(EdDSAPrivateKey key) throws GeneralSecurityException { if (key == null) { return null; } else { return generatePrivateKey(new EdDSAPrivateKeySpec(key.getSeed(), key.getParams())); } }
@Override public EdDSAPrivateKey clonePrivateKey(EdDSAPrivateKey key) throws GeneralSecurityException { if (key == null) { return null; } else { return generatePrivateKey(new EdDSAPrivateKeySpec(key.getSeed(), key.getParams())); } }
@Override public EdDSAPrivateKey clonePrivateKey(EdDSAPrivateKey key) throws GeneralSecurityException { if (key == null) { return null; } else { return generatePrivateKey(new EdDSAPrivateKeySpec(key.getSeed(), key.getParams())); } }
@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); }
/** * Signs a message. * * @param message * message * @return */ public Signature sign(byte[] message) { try { byte[] sig; if (Native.isEnabled()) { sig = Native.sign(message, Bytes.merge(sk.getSeed(), sk.getAbyte())); } else { EdDSAEngine engine = new EdDSAEngine(); engine.initSign(sk); sig = engine.signOneShot(message); } return new Signature(sig, pk.getAbyte()); } catch (InvalidKeyException | SignatureException e) { throw new CryptoException(e); } }