| /* GENERATED SOURCE. DO NOT MODIFY. */ |
| package com.android.org.bouncycastle.crypto.agreement; |
| |
| import java.math.BigInteger; |
| |
| import com.android.org.bouncycastle.crypto.BasicAgreement; |
| import com.android.org.bouncycastle.crypto.CipherParameters; |
| import com.android.org.bouncycastle.crypto.params.AsymmetricKeyParameter; |
| import com.android.org.bouncycastle.crypto.params.DHParameters; |
| import com.android.org.bouncycastle.crypto.params.DHPrivateKeyParameters; |
| import com.android.org.bouncycastle.crypto.params.DHPublicKeyParameters; |
| import com.android.org.bouncycastle.crypto.params.ParametersWithRandom; |
| |
| /** |
| * a Diffie-Hellman key agreement class. |
| * <p> |
| * note: This is only the basic algorithm, it doesn't take advantage of |
| * long term public keys if they are available. See the DHAgreement class |
| * for a "better" implementation. |
| * @hide This class is not part of the Android public SDK API |
| */ |
| public class DHBasicAgreement |
| implements BasicAgreement |
| { |
| private static final BigInteger ONE = BigInteger.valueOf(1); |
| |
| private DHPrivateKeyParameters key; |
| private DHParameters dhParams; |
| |
| public void init( |
| CipherParameters param) |
| { |
| AsymmetricKeyParameter kParam; |
| |
| if (param instanceof ParametersWithRandom) |
| { |
| ParametersWithRandom rParam = (ParametersWithRandom)param; |
| kParam = (AsymmetricKeyParameter)rParam.getParameters(); |
| } |
| else |
| { |
| kParam = (AsymmetricKeyParameter)param; |
| } |
| |
| if (!(kParam instanceof DHPrivateKeyParameters)) |
| { |
| throw new IllegalArgumentException("DHEngine expects DHPrivateKeyParameters"); |
| } |
| |
| this.key = (DHPrivateKeyParameters)kParam; |
| this.dhParams = key.getParameters(); |
| } |
| |
| public int getFieldSize() |
| { |
| return (key.getParameters().getP().bitLength() + 7) / 8; |
| } |
| |
| /** |
| * given a short term public key from a given party calculate the next |
| * message in the agreement sequence. |
| */ |
| public BigInteger calculateAgreement( |
| CipherParameters pubKey) |
| { |
| DHPublicKeyParameters pub = (DHPublicKeyParameters)pubKey; |
| |
| if (!pub.getParameters().equals(dhParams)) |
| { |
| throw new IllegalArgumentException("Diffie-Hellman public key has wrong parameters."); |
| } |
| |
| BigInteger p = dhParams.getP(); |
| |
| BigInteger peerY = pub.getY(); |
| if (peerY == null || peerY.compareTo(ONE) <= 0 || peerY.compareTo(p.subtract(ONE)) >= 0) |
| { |
| throw new IllegalArgumentException("Diffie-Hellman public key is weak"); |
| } |
| |
| BigInteger result = peerY.modPow(key.getX(), p); |
| if (result.equals(ONE)) |
| { |
| throw new IllegalStateException("Shared key can't be 1"); |
| } |
| |
| return result; |
| } |
| } |