package org.bouncycastle.tls.crypto.impl.bc; import java.io.IOException; import org.bouncycastle.crypto.AsymmetricCipherKeyPair; import org.bouncycastle.crypto.params.ECPrivateKeyParameters; import org.bouncycastle.crypto.params.ECPublicKeyParameters; import org.bouncycastle.tls.crypto.TlsAgreement; import org.bouncycastle.tls.crypto.TlsSecret; /** * Support class for ephemeral Elliptic Curve Diffie-Hellman using the BC light-weight library. */ public class BcTlsECDH implements TlsAgreement { protected BcTlsECDomain domain; protected AsymmetricCipherKeyPair localKeyPair; protected ECPublicKeyParameters peerPublicKey; public BcTlsECDH(BcTlsECDomain domain) { this.domain = domain; } public byte[] generateEphemeral() throws IOException { this.localKeyPair = domain.generateKeyPair(); return domain.encodePublicKey((ECPublicKeyParameters)localKeyPair.getPublic()); } public void receivePeerValue(byte[] peerValue) throws IOException { this.peerPublicKey = domain.decodePublicKey(peerValue); } public TlsSecret calculateSecret() throws IOException { byte[] data = domain.calculateECDHAgreement(peerPublicKey, (ECPrivateKeyParameters)localKeyPair.getPrivate()); return domain.getCrypto().adoptLocalSecret(data); } }