100 lines
3.8 KiB
Java
100 lines
3.8 KiB
Java
package org.bouncycastle.crypto.agreement.kdf;
|
|
|
|
import java.io.IOException;
|
|
import org.bouncycastle.asn1.ASN1EncodableVector;
|
|
import org.bouncycastle.asn1.ASN1Encoding;
|
|
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
|
|
import org.bouncycastle.asn1.DEROctetString;
|
|
import org.bouncycastle.asn1.DERSequence;
|
|
import org.bouncycastle.asn1.DERTaggedObject;
|
|
import org.bouncycastle.crypto.DataLengthException;
|
|
import org.bouncycastle.crypto.DerivationFunction;
|
|
import org.bouncycastle.crypto.DerivationParameters;
|
|
import org.bouncycastle.crypto.Digest;
|
|
import org.bouncycastle.util.Pack;
|
|
|
|
/* loaded from: classes6.dex */
|
|
public class DHKEKGenerator implements DerivationFunction {
|
|
private ASN1ObjectIdentifier algorithm;
|
|
private final Digest digest;
|
|
private int keySize;
|
|
private byte[] partyAInfo;
|
|
private byte[] z;
|
|
|
|
@Override // org.bouncycastle.crypto.DerivationFunction
|
|
public void init(DerivationParameters derivationParameters) {
|
|
DHKDFParameters dHKDFParameters = (DHKDFParameters) derivationParameters;
|
|
this.algorithm = dHKDFParameters.getAlgorithm();
|
|
this.keySize = dHKDFParameters.getKeySize();
|
|
this.z = dHKDFParameters.getZ();
|
|
this.partyAInfo = dHKDFParameters.getExtraInfo();
|
|
}
|
|
|
|
public Digest getDigest() {
|
|
return this.digest;
|
|
}
|
|
|
|
@Override // org.bouncycastle.crypto.DerivationFunction
|
|
public int generateBytes(byte[] bArr, int i, int i2) throws DataLengthException, IllegalArgumentException {
|
|
boolean z;
|
|
int i3 = i2;
|
|
int i4 = i;
|
|
if (bArr.length - i3 < i4) {
|
|
throw new DataLengthException("output buffer too small");
|
|
}
|
|
long j = i3;
|
|
int digestSize = this.digest.getDigestSize();
|
|
if (j > 8589934591L) {
|
|
throw new IllegalArgumentException("Output length too large");
|
|
}
|
|
long j2 = digestSize;
|
|
int i5 = (int) (((j + j2) - 1) / j2);
|
|
byte[] bArr2 = new byte[this.digest.getDigestSize()];
|
|
int i6 = 0;
|
|
int i7 = 0;
|
|
int i8 = 1;
|
|
while (i7 < i5) {
|
|
Digest digest = this.digest;
|
|
byte[] bArr3 = this.z;
|
|
digest.update(bArr3, i6, bArr3.length);
|
|
ASN1EncodableVector aSN1EncodableVector = new ASN1EncodableVector();
|
|
ASN1EncodableVector aSN1EncodableVector2 = new ASN1EncodableVector();
|
|
aSN1EncodableVector2.add(this.algorithm);
|
|
aSN1EncodableVector2.add(new DEROctetString(Pack.intToBigEndian(i8)));
|
|
aSN1EncodableVector.add(new DERSequence(aSN1EncodableVector2));
|
|
if (this.partyAInfo != null) {
|
|
z = true;
|
|
aSN1EncodableVector.add(new DERTaggedObject(true, i6, new DEROctetString(this.partyAInfo)));
|
|
} else {
|
|
z = true;
|
|
}
|
|
aSN1EncodableVector.add(new DERTaggedObject(z, 2, new DEROctetString(Pack.intToBigEndian(this.keySize))));
|
|
try {
|
|
byte[] encoded = new DERSequence(aSN1EncodableVector).getEncoded(ASN1Encoding.DER);
|
|
this.digest.update(encoded, 0, encoded.length);
|
|
this.digest.doFinal(bArr2, 0);
|
|
if (i3 > digestSize) {
|
|
System.arraycopy(bArr2, 0, bArr, i4, digestSize);
|
|
i4 += digestSize;
|
|
i3 -= digestSize;
|
|
} else {
|
|
System.arraycopy(bArr2, 0, bArr, i4, i3);
|
|
}
|
|
i8++;
|
|
i7++;
|
|
i6 = 0;
|
|
} catch (IOException e) {
|
|
StringBuilder sb = new StringBuilder("unable to encode parameter info: ");
|
|
sb.append(e.getMessage());
|
|
throw new IllegalArgumentException(sb.toString());
|
|
}
|
|
}
|
|
this.digest.reset();
|
|
return (int) j;
|
|
}
|
|
|
|
public DHKEKGenerator(Digest digest) {
|
|
this.digest = digest;
|
|
}
|
|
}
|