diff options
author | Peter Dettman <peter.dettman@bouncycastle.org> | 2013-06-19 10:56:26 +0400 |
---|---|---|
committer | Peter Dettman <peter.dettman@bouncycastle.org> | 2013-06-19 10:56:26 +0400 |
commit | a1255722486d074260f8eaefbd0ea383f64c31f8 (patch) | |
tree | c7aba18ee7ea21a4be2e058bdc134e75a94ef972 /core/src/main/java/org/bouncycastle/crypto/tls/TlsDHUtils.java | |
parent | a30169f9ef80a631056934c29d6d21473cbde018 (diff) |
Add ServerDHParams and refactor DHE key exchange code
Diffstat (limited to 'core/src/main/java/org/bouncycastle/crypto/tls/TlsDHUtils.java')
-rw-r--r-- | core/src/main/java/org/bouncycastle/crypto/tls/TlsDHUtils.java | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/core/src/main/java/org/bouncycastle/crypto/tls/TlsDHUtils.java b/core/src/main/java/org/bouncycastle/crypto/tls/TlsDHUtils.java index 4a215ec1..e1cd60d6 100644 --- a/core/src/main/java/org/bouncycastle/crypto/tls/TlsDHUtils.java +++ b/core/src/main/java/org/bouncycastle/crypto/tls/TlsDHUtils.java @@ -20,6 +20,11 @@ public class TlsDHUtils static final BigInteger ONE = BigInteger.valueOf(1); static final BigInteger TWO = BigInteger.valueOf(2); + public static boolean areCompatibleParameters(DHParameters a, DHParameters b) + { + return a.getP().equals(b.getP()) && a.getG().equals(b.getG()); + } + public static byte[] calculateDHBasicAgreement(DHPublicKeyParameters publicKey, DHPrivateKeyParameters privateKey) { DHBasicAgreement basicAgreement = new DHBasicAgreement(); @@ -40,17 +45,26 @@ public class TlsDHUtils return dhGen.generateKeyPair(); } - public static DHPrivateKeyParameters generateEphemeralClientKeyExchange(SecureRandom random, DHParameters dhParams, + public static DHPrivateKeyParameters generateEphemeralClientKeyExchange(SecureRandom random, DHParameters dhParameters, + OutputStream output) throws IOException + { + AsymmetricCipherKeyPair dhAgreeClientKeyPair = generateDHKeyPair(random, dhParameters); + + DHPublicKeyParameters dhPublicKey = (DHPublicKeyParameters) dhAgreeClientKeyPair.getPublic(); + writeDHParameter(dhPublicKey.getY(), output); + + return (DHPrivateKeyParameters) dhAgreeClientKeyPair.getPrivate(); + } + + public static DHPrivateKeyParameters generateEphemeralServerKeyExchange(SecureRandom random, DHParameters dhParameters, OutputStream output) throws IOException { - AsymmetricCipherKeyPair dhAgreeClientKeyPair = generateDHKeyPair(random, dhParams); - DHPrivateKeyParameters dhAgreeClientPrivateKey = (DHPrivateKeyParameters) dhAgreeClientKeyPair.getPrivate(); + AsymmetricCipherKeyPair kp = TlsDHUtils.generateDHKeyPair(random, dhParameters); - BigInteger Yc = ((DHPublicKeyParameters) dhAgreeClientKeyPair.getPublic()).getY(); - byte[] keData = BigIntegers.asUnsignedByteArray(Yc); - TlsUtils.writeOpaque16(keData, output); + ServerDHParams serverDHParams = new ServerDHParams((DHPublicKeyParameters)kp.getPublic()); + serverDHParams.encode(output); - return dhAgreeClientPrivateKey; + return (DHPrivateKeyParameters)kp.getPrivate(); } public static DHPublicKeyParameters validateDHPublicKey(DHPublicKeyParameters key) throws IOException |