/** * As of 0.9.25, supports X509EncodedKeySpec */ protected PublicKey engineGeneratePublic(KeySpec keySpec) throws InvalidKeySpecException { if (keySpec instanceof EdDSAPublicKeySpec) { return new EdDSAPublicKey((EdDSAPublicKeySpec) keySpec); } if (keySpec instanceof X509EncodedKeySpec) { return new EdDSAPublicKey((X509EncodedKeySpec) keySpec); } throw new InvalidKeySpecException("key spec not recognised: " + keySpec.getClass()); }
@Override protected void writePubKeyContentsIntoBuffer(PublicKey pk, Buffer<?> buf) { EdDSAPublicKey key = (EdDSAPublicKey) pk; buf.putBytes(key.getAbyte()); }
@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); }
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 static StorageItem buildMutable(Object data, EdDSAPrivateKey key, byte[] salt, long sequenceNumber) throws InvalidKeyException, SignatureException { ByteBuffer raw = new BEncoder().encode(data, 1000); Signature sig = new EdDSAEngine(); sig.initSign(key); Map<String, Object> p = new TreeMap<>(); if(salt != null) p.put("salt", salt); p.put("seq", sequenceNumber); p.put("v", new BEncoder.RawData(raw)); ByteBuffer buf = new BEncoder().encode(p, 1500); // trim d ... e buf.position(buf.position() + 1); buf.limit(buf.limit() - 1); sig.update(buf.duplicate()); byte[] signature = sig.sign(); byte[] pubkey = new EdDSAPublicKey(new EdDSAPublicKeySpec(key.getA(), StorageItem.spec)).getA().toByteArray(); return new StorageItem(buf2ary(raw), pubkey, signature, salt, sequenceNumber); }
digest.update(((EdDSAPublicKey) key).getAbyte()); ((EdDSAPublicKey) key).getNegativeA(), h, Sbyte);
public GroupElement getGroupElement() { return publicKey.getA(); }
/** * @since 0.9.25 */ public EdDSAPublicKey(X509EncodedKeySpec spec) throws InvalidKeySpecException { this(new EdDSAPublicKeySpec(decode(spec.getEncoded()), EdDSANamedCurveTable.ED_25519_CURVE_SPEC)); }
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); }
digest.update(((EdDSAPublicKey) key).getAbyte()); ((EdDSAPublicKey) key).getNegativeA(), h, Sbyte);
public static <B extends Buffer> B putRawEDDSAPublicKey(B buffer, PublicKey key) { ValidateUtils.checkTrue(SecurityUtils.isEDDSACurveSupported(), SecurityUtils.EDDSA + " not supported"); EdDSAPublicKey edKey = ValidateUtils.checkInstanceOf(key, EdDSAPublicKey.class, "Not an EDDSA public key: %s", key); byte[] seed = Ed25519PublicKeyDecoder.getSeedValue(edKey); ValidateUtils.checkNotNull(seed, "No seed extracted from key: %s", edKey.getA()); buffer.putString(KeyPairProvider.SSH_ED25519); buffer.putBytes(seed); return buffer; }
public EdDSAPublicKey(X509EncodedKeySpec spec) throws InvalidKeySpecException { this(new EdDSAPublicKeySpec(decode(spec.getEncoded()), EdDSANamedCurveTable.ED_25519_CURVE_SPEC)); }
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)); }
/** * @since 0.9.15 */ public static SigningPublicKey fromJavaKey(EdDSAPublicKey pk, SigType type) throws GeneralSecurityException { return new SigningPublicKey(type, pk.getAbyte()); }
public void init(byte[] blob, int start, int len) throws SshException { ByteArrayReader bar = new ByteArrayReader(blob, start, len); try { String name = bar.readString(); if(!name.equals(ALGORITHM_NAME)) { throw new SshException("The encoded key is not ed25519", SshException.INTERNAL_ERROR); } byte[] pub = bar.readBinaryString(); EdDSAPublicKeySpec spec = new EdDSAPublicKeySpec(pub, EdDSANamedCurveTable.getByName("Ed25519")); publicKey = new EdDSAPublicKey(spec); if(Utils.equal(publicKey.getAbyte(), pub)==0) { throw new IOException("Not sure how to encode yet"); } } catch (IOException ioe) { throw new SshException("Failed to read encoded key data", SshException.INTERNAL_ERROR); } finally { bar.close(); } }
public static boolean compareEDDSAPPublicKeys(PublicKey k1, PublicKey k2) { if (!SecurityUtils.isEDDSACurveSupported()) { return false; } if ((k1 instanceof EdDSAPublicKey) && (k2 instanceof EdDSAPublicKey)) { if (Objects.equals(k1, k2)) { return true; } else if (k1 == null || k2 == null) { return false; // both null is covered by Objects#equals } EdDSAPublicKey ed1 = (EdDSAPublicKey) k1; EdDSAPublicKey ed2 = (EdDSAPublicKey) k2; return Arrays.equals(ed1.getAbyte(), ed2.getAbyte()) && compareEDDSAKeyParams(ed1.getParams(), ed2.getParams()); } return false; }
public static <B extends Buffer> B putRawEDDSAPublicKey(B buffer, PublicKey key) { ValidateUtils.checkTrue(SecurityUtils.isEDDSACurveSupported(), SecurityUtils.EDDSA + " not supported"); EdDSAPublicKey edKey = ValidateUtils.checkInstanceOf(key, EdDSAPublicKey.class, "Not an EDDSA public key: %s", key); byte[] seed = Ed25519PublicKeyDecoder.getSeedValue(edKey); ValidateUtils.checkNotNull(seed, "No seed extracted from key: %s", edKey.getA()); buffer.putString(KeyPairProvider.SSH_ED25519); buffer.putBytes(seed); return buffer; }