private boolean parseGexGroup(SSHPacket buffer) throws Buffer.BufferException, GeneralSecurityException, TransportException { BigInteger p = buffer.readMPInt(); BigInteger g = buffer.readMPInt(); int bitLength = p.bitLength(); if (bitLength < minBits || bitLength > maxBits) { throw new GeneralSecurityException("Server generated gex p is out of range (" + bitLength + " bits)"); } log.debug("Received server p bitlength {}", bitLength); dh.init(new DHParameterSpec(p, g), trans.getConfig().getRandomFactory()); log.debug("Sending {}", Message.KEX_DH_GEX_INIT); trans.write(new SSHPacket(Message.KEX_DH_GEX_INIT).putBytes(dh.getE())); return false; } }
@Override public void init(AlgorithmParameterSpec params, Factory<Random> randomFactory) throws GeneralSecurityException { if (!(params instanceof DHParameterSpec)) { throw new SSHRuntimeException("Wrong algorithm parameters for Diffie Hellman"); } this.p = ((DHParameterSpec) params).getP(); this.g = ((DHParameterSpec) params).getG(); generator.initialize(params); final KeyPair kp = generator.generateKeyPair(); agreement.init(kp.getPrivate()); setE(((javax.crypto.interfaces.DHPublicKey) kp.getPublic()).getY().toByteArray()); }
BigInteger elgp = key.getParams().getP(); BigInteger pm1 = elgp.subtract(BigInteger.ONE); BigInteger elgg = key.getParams().getG(); BigInteger x = ((ElGamalPrivateKey) key).getX(); if (!(x instanceof NativeBigInteger)) boolean ok; do { k = new BigInteger(2048, RandomSource.getInstance()); ok = k.compareTo(pm1) == -1; ok = ok && k.compareTo(BigInteger.ONE) == 1; ok = ok && k.gcd(pm1).equals(BigInteger.ONE);
/** * @param sigBytes ASN.1 R,S */ @Override protected boolean engineVerify(byte[] sigBytes) throws SignatureException { BigInteger elgp = key.getParams().getP(); BigInteger pm1 = elgp.subtract(BigInteger.ONE); BigInteger elgg = key.getParams().getG(); BigInteger y = ((ElGamalPublicKey) key).getY(); if (!(y instanceof NativeBigInteger)) y = new NativeBigInteger(y); byte[] data = digest.digest(); try { BigInteger[] rs = SigUtil.aSN1ToBigInteger(sigBytes, 256); BigInteger r = rs[0]; BigInteger s = rs[1]; if (r.signum() != 1 || s.signum() != 1 || r.compareTo(elgp) != -1 || s.compareTo(pm1) != -1) return false; NativeBigInteger h = new NativeBigInteger(1, data); BigInteger modvalr = r.modPow(s, elgp); BigInteger modvaly = y.modPow(r, elgp); BigInteger modmulval = modvalr.multiply(modvaly).mod(elgp); BigInteger v = elgg.modPow(h, elgp); boolean ok = v.compareTo(modmulval) == 0; return ok; } catch (RuntimeException e) { throw new SignatureException("verify", e); } }
protected DHPublicKey stringToPublicKey(String publicKeyBase64) { try { byte[] yBinary = Base64.decodeBase64(publicKeyBase64.getBytes()); BigInteger y = new BigInteger(yBinary); DHPublicKeySpec dhPublicKeySpec = new DHPublicKeySpec( y, _dhParameterSpec.getP(), _dhParameterSpec.getG()); KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM); return (DHPublicKey) keyFactory.generatePublic(dhPublicKeySpec); } catch (GeneralSecurityException e) { _log.error("Cannot create PublicKey object from: " + publicKeyBase64, e); return null; } }
@Override public byte[] getE() throws Exception { if (e == null) { DHParameterSpec dhSkipParamSpec = new DHParameterSpec(p, g); myKpairGen.initialize(dhSkipParamSpec); KeyPair myKpair = myKpairGen.generateKeyPair(); myKeyAgree.init(myKpair.getPrivate()); e = ((javax.crypto.interfaces.DHPublicKey) (myKpair.getPublic())).getY(); e_array = e.toByteArray(); } return e_array; }
public boolean equals( Object o) { if (!(o instanceof DHPublicKey)) { return false; } DHPublicKey other = (DHPublicKey)o; return this.getY().equals(other.getY()) && this.getParams().getG().equals(other.getParams().getG()) && this.getParams().getP().equals(other.getParams().getP()) && this.getParams().getL() == other.getParams().getL(); }
protected byte[] getDigestedZZ(String otherPublicKeyBase64) { DHPublicKey dhPublicKey = stringToPublicKey(otherPublicKeyBase64); DHPrivateKey dhPrivateKey = getPrivateKey(); BigInteger xa = dhPrivateKey.getX(); BigInteger yb = dhPublicKey.getY(); BigInteger p = _dhParameterSpec.getP(); BigInteger zz = yb.modPow(xa, p); return _hDigest.digest(zz.toByteArray()); }
static public AsymmetricKeyParameter generatePublicKeyParameter( PublicKey key) throws InvalidKeyException { if (key instanceof DHPublicKey) { DHPublicKey k = (DHPublicKey)key; return new DHPublicKeyParameters(k.getY(), new DHParameters(k.getParams().getP(), k.getParams().getG(), null, k.getParams().getL())); } throw new InvalidKeyException("can't identify DH public key."); }
public boolean equals( Object o) { if (!(o instanceof DHPrivateKey)) { return false; } DHPrivateKey other = (DHPrivateKey)o; return this.getX().equals(other.getX()) && this.getParams().getG().equals(other.getParams().getG()) && this.getParams().getP().equals(other.getParams().getP()) && this.getParams().getL() == other.getParams().getL(); }
protected KeySpec engineGetKeySpec( Key key, Class spec) throws InvalidKeySpecException { if (spec.isAssignableFrom(DHPrivateKeySpec.class) && key instanceof DHPrivateKey) { DHPrivateKey k = (DHPrivateKey)key; return new DHPrivateKeySpec(k.getX(), k.getParams().getP(), k.getParams().getG()); } else if (spec.isAssignableFrom(DHPublicKeySpec.class) && key instanceof DHPublicKey) { DHPublicKey k = (DHPublicKey)key; return new DHPublicKeySpec(k.getY(), k.getParams().getP(), k.getParams().getG()); } return super.engineGetKeySpec(key, spec); }
JCEDHPublicKey( DHPublicKeySpec spec) { this.y = spec.getY(); this.dhSpec = new DHParameterSpec(spec.getP(), spec.getG()); }
GMSEncrypt(Services services, String dhSKAlgo) throws Exception { this.services = services; this.dhSKAlgo = dhSKAlgo; // Initialize the keys when either the host is a peer that has // non-blank setting for DH symmetric algo, or this is a server // that has authenticator defined. if ((this.dhSKAlgo != null && this.dhSKAlgo.length() > 0)) { KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DH"); DHParameterSpec dhSpec = new DHParameterSpec(dhP, dhG, dhL); keyGen.initialize(dhSpec); KeyPair keypair = keyGen.generateKeyPair(); // Get the generated public and private keys dhPrivateKey = keypair.getPrivate(); dhPublicKey = keypair.getPublic(); } else { dhPrivateKey = null; dhPublicKey = null; } }
private OutgoingMessage computeSharedSecret(IncomingMessage in) throws KeyAgreementException { BigInteger m1 = in.readMPI(); if (m1 == null) { throw new KeyAgreementException("missing message (2)"); } BigInteger p = ownerKey.getParams().getP(); ZZ = m1.modPow(x, p); // ZZ = (yb ^ xa) mod p complete = true; return null; } }
public void init(BigInteger p, BigInteger g) throws GeneralSecurityException { this.p = p; this.g = g; generator.initialize(new DHParameterSpec(p, g)); final KeyPair kp = generator.generateKeyPair(); agreement.init(kp.getPrivate()); e = ((javax.crypto.interfaces.DHPublicKey) kp.getPublic()).getY(); }
@Override public byte[] getE() throws Exception { if (e == null) { DHParameterSpec dhSkipParamSpec = new DHParameterSpec(p, g); myKpairGen.initialize(dhSkipParamSpec); KeyPair myKpair = myKpairGen.generateKeyPair(); myKeyAgree.init(myKpair.getPrivate()); e = ((javax.crypto.interfaces.DHPublicKey) (myKpair.getPublic())).getY(); e_array = e.toByteArray(); } return e_array; }