what-the-bank/sources/org/bouncycastle/jcajce/provider/asymmetric/dh/KeyAgreementSpi.java

155 lines
6.5 KiB
Java

package org.bouncycastle.jcajce.provider.asymmetric.dh;
import java.math.BigInteger;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.AlgorithmParameterSpec;
import javax.crypto.SecretKey;
import javax.crypto.ShortBufferException;
import javax.crypto.interfaces.DHPrivateKey;
import javax.crypto.interfaces.DHPublicKey;
import javax.crypto.spec.DHParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.bouncycastle.crypto.DerivationFunction;
import org.bouncycastle.crypto.agreement.kdf.DHKEKGenerator;
import org.bouncycastle.crypto.digests.SHA1Digest;
import org.bouncycastle.jcajce.provider.asymmetric.util.BaseAgreementSpi;
import org.bouncycastle.jcajce.spec.UserKeyingMaterialSpec;
/* loaded from: classes6.dex */
public class KeyAgreementSpi extends BaseAgreementSpi {
private BigInteger g;
private BigInteger p;
private BigInteger result;
private BigInteger x;
@Override // javax.crypto.KeyAgreementSpi
protected void engineInit(Key key, AlgorithmParameterSpec algorithmParameterSpec, SecureRandom secureRandom) throws InvalidKeyException, InvalidAlgorithmParameterException {
DHParameterSpec params;
if (!(key instanceof DHPrivateKey)) {
throw new InvalidKeyException("DHKeyAgreement requires DHPrivateKey for initialisation");
}
DHPrivateKey dHPrivateKey = (DHPrivateKey) key;
if (algorithmParameterSpec == null) {
this.p = dHPrivateKey.getParams().getP();
params = dHPrivateKey.getParams();
} else {
if (!(algorithmParameterSpec instanceof DHParameterSpec)) {
if (!(algorithmParameterSpec instanceof UserKeyingMaterialSpec)) {
throw new InvalidAlgorithmParameterException("DHKeyAgreement only accepts DHParameterSpec");
}
this.p = dHPrivateKey.getParams().getP();
this.g = dHPrivateKey.getParams().getG();
this.ukmParameters = ((UserKeyingMaterialSpec) algorithmParameterSpec).getUserKeyingMaterial();
BigInteger x = dHPrivateKey.getX();
this.result = x;
this.x = x;
}
params = (DHParameterSpec) algorithmParameterSpec;
this.p = params.getP();
}
this.g = params.getG();
BigInteger x2 = dHPrivateKey.getX();
this.result = x2;
this.x = x2;
}
@Override // javax.crypto.KeyAgreementSpi
protected void engineInit(Key key, SecureRandom secureRandom) throws InvalidKeyException {
if (!(key instanceof DHPrivateKey)) {
throw new InvalidKeyException("DHKeyAgreement requires DHPrivateKey");
}
DHPrivateKey dHPrivateKey = (DHPrivateKey) key;
this.p = dHPrivateKey.getParams().getP();
this.g = dHPrivateKey.getParams().getG();
BigInteger x = dHPrivateKey.getX();
this.result = x;
this.x = x;
}
@Override // org.bouncycastle.jcajce.provider.asymmetric.util.BaseAgreementSpi, javax.crypto.KeyAgreementSpi
public byte[] engineGenerateSecret() throws IllegalStateException {
if (this.x != null) {
return super.engineGenerateSecret();
}
throw new IllegalStateException("Diffie-Hellman not initialised.");
}
@Override // org.bouncycastle.jcajce.provider.asymmetric.util.BaseAgreementSpi, javax.crypto.KeyAgreementSpi
public SecretKey engineGenerateSecret(String str) throws NoSuchAlgorithmException {
if (this.x != null) {
return str.equals("TlsPremasterSecret") ? new SecretKeySpec(trimZeroes(bigIntToBytes(this.result)), str) : super.engineGenerateSecret(str);
}
throw new IllegalStateException("Diffie-Hellman not initialised.");
}
@Override // org.bouncycastle.jcajce.provider.asymmetric.util.BaseAgreementSpi, javax.crypto.KeyAgreementSpi
public int engineGenerateSecret(byte[] bArr, int i) throws IllegalStateException, ShortBufferException {
if (this.x != null) {
return super.engineGenerateSecret(bArr, i);
}
throw new IllegalStateException("Diffie-Hellman not initialised.");
}
@Override // javax.crypto.KeyAgreementSpi
protected Key engineDoPhase(Key key, boolean z) throws InvalidKeyException, IllegalStateException {
if (this.x == null) {
throw new IllegalStateException("Diffie-Hellman not initialised.");
}
if (!(key instanceof DHPublicKey)) {
throw new InvalidKeyException("DHKeyAgreement doPhase requires DHPublicKey");
}
DHPublicKey dHPublicKey = (DHPublicKey) key;
if (!dHPublicKey.getParams().getG().equals(this.g) || !dHPublicKey.getParams().getP().equals(this.p)) {
throw new InvalidKeyException("DHPublicKey not for this KeyAgreement!");
}
if (z) {
this.result = dHPublicKey.getY().modPow(this.x, this.p);
return null;
}
BigInteger modPow = dHPublicKey.getY().modPow(this.x, this.p);
this.result = modPow;
return new BCDHPublicKey(modPow, dHPublicKey.getParams());
}
@Override // org.bouncycastle.jcajce.provider.asymmetric.util.BaseAgreementSpi
public byte[] calcSecret() {
return bigIntToBytes(this.result);
}
protected byte[] bigIntToBytes(BigInteger bigInteger) {
int bitLength = (this.p.bitLength() + 7) / 8;
byte[] byteArray = bigInteger.toByteArray();
if (byteArray.length == bitLength) {
return byteArray;
}
if (byteArray[0] != 0 || byteArray.length != bitLength + 1) {
byte[] bArr = new byte[bitLength];
System.arraycopy(byteArray, 0, bArr, bitLength - byteArray.length, byteArray.length);
return bArr;
}
int length = byteArray.length - 1;
byte[] bArr2 = new byte[length];
System.arraycopy(byteArray, 1, bArr2, 0, length);
return bArr2;
}
/* loaded from: classes6.dex */
public static class DHwithRFC2631KDF extends KeyAgreementSpi {
public DHwithRFC2631KDF() {
super("DHwithRFC2631KDF", new DHKEKGenerator(new SHA1Digest()));
}
}
public KeyAgreementSpi(String str, DerivationFunction derivationFunction) {
super(str, derivationFunction);
}
public KeyAgreementSpi() {
super("Diffie-Hellman", null);
}
}