250 lines
11 KiB
Java
250 lines
11 KiB
Java
package org.bouncycastle.jcajce.provider.symmetric;
|
|
|
|
import java.io.IOException;
|
|
import java.security.spec.AlgorithmParameterSpec;
|
|
import java.security.spec.InvalidKeySpecException;
|
|
import java.security.spec.InvalidParameterSpecException;
|
|
import java.security.spec.KeySpec;
|
|
import javax.crypto.SecretKey;
|
|
import javax.crypto.spec.PBEKeySpec;
|
|
import javax.crypto.spec.PBEParameterSpec;
|
|
import org.bouncycastle.asn1.ASN1Encoding;
|
|
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
|
|
import org.bouncycastle.asn1.ASN1Primitive;
|
|
import org.bouncycastle.asn1.cryptopro.CryptoProObjectIdentifiers;
|
|
import org.bouncycastle.asn1.pkcs.PBKDF2Params;
|
|
import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
|
|
import org.bouncycastle.jcajce.provider.config.ConfigurableProvider;
|
|
import org.bouncycastle.jcajce.provider.symmetric.util.BCPBEKey;
|
|
import org.bouncycastle.jcajce.provider.symmetric.util.BaseAlgorithmParameters;
|
|
import org.bouncycastle.jcajce.provider.symmetric.util.BaseSecretKeyFactory;
|
|
import org.bouncycastle.jcajce.provider.symmetric.util.PBE;
|
|
import org.bouncycastle.jcajce.provider.util.AlgorithmProvider;
|
|
import org.bouncycastle.jcajce.spec.PBKDF2KeySpec;
|
|
|
|
/* loaded from: classes6.dex */
|
|
public class PBEPBKDF2 {
|
|
|
|
/* loaded from: classes6.dex */
|
|
public static class AlgParams extends BaseAlgorithmParameters {
|
|
PBKDF2Params params;
|
|
|
|
@Override // org.bouncycastle.jcajce.provider.symmetric.util.BaseAlgorithmParameters
|
|
public AlgorithmParameterSpec localEngineGetParameterSpec(Class cls) throws InvalidParameterSpecException {
|
|
if (cls == PBEParameterSpec.class) {
|
|
return new PBEParameterSpec(this.params.getSalt(), this.params.getIterationCount().intValue());
|
|
}
|
|
throw new InvalidParameterSpecException("unknown parameter spec passed to PBKDF2 PBE parameters object.");
|
|
}
|
|
|
|
@Override // java.security.AlgorithmParametersSpi
|
|
protected String engineToString() {
|
|
return "PBKDF2 Parameters";
|
|
}
|
|
|
|
@Override // java.security.AlgorithmParametersSpi
|
|
protected void engineInit(byte[] bArr, String str) throws IOException {
|
|
if (!isASN1FormatString(str)) {
|
|
throw new IOException("Unknown parameters format in PBKDF2 parameters object");
|
|
}
|
|
engineInit(bArr);
|
|
}
|
|
|
|
@Override // java.security.AlgorithmParametersSpi
|
|
protected void engineInit(byte[] bArr) throws IOException {
|
|
this.params = PBKDF2Params.getInstance(ASN1Primitive.fromByteArray(bArr));
|
|
}
|
|
|
|
@Override // java.security.AlgorithmParametersSpi
|
|
protected void engineInit(AlgorithmParameterSpec algorithmParameterSpec) throws InvalidParameterSpecException {
|
|
if (!(algorithmParameterSpec instanceof PBEParameterSpec)) {
|
|
throw new InvalidParameterSpecException("PBEParameterSpec required to initialise a PBKDF2 PBE parameters algorithm parameters object");
|
|
}
|
|
PBEParameterSpec pBEParameterSpec = (PBEParameterSpec) algorithmParameterSpec;
|
|
this.params = new PBKDF2Params(pBEParameterSpec.getSalt(), pBEParameterSpec.getIterationCount());
|
|
}
|
|
|
|
@Override // java.security.AlgorithmParametersSpi
|
|
protected byte[] engineGetEncoded(String str) {
|
|
if (isASN1FormatString(str)) {
|
|
return engineGetEncoded();
|
|
}
|
|
return null;
|
|
}
|
|
|
|
@Override // java.security.AlgorithmParametersSpi
|
|
protected byte[] engineGetEncoded() {
|
|
try {
|
|
return this.params.getEncoded(ASN1Encoding.DER);
|
|
} catch (IOException e) {
|
|
StringBuilder sb = new StringBuilder("Oooops! ");
|
|
sb.append(e.toString());
|
|
throw new RuntimeException(sb.toString());
|
|
}
|
|
}
|
|
}
|
|
|
|
/* loaded from: classes6.dex */
|
|
public static class BasePBKDF2 extends BaseSecretKeyFactory {
|
|
private int defaultDigest;
|
|
private int scheme;
|
|
|
|
@Override // org.bouncycastle.jcajce.provider.symmetric.util.BaseSecretKeyFactory, javax.crypto.SecretKeyFactorySpi
|
|
public SecretKey engineGenerateSecret(KeySpec keySpec) throws InvalidKeySpecException {
|
|
if (!(keySpec instanceof PBEKeySpec)) {
|
|
throw new InvalidKeySpecException("Invalid KeySpec");
|
|
}
|
|
PBEKeySpec pBEKeySpec = (PBEKeySpec) keySpec;
|
|
if (pBEKeySpec.getSalt() == null) {
|
|
throw new InvalidKeySpecException("missing required salt");
|
|
}
|
|
if (pBEKeySpec.getIterationCount() <= 0) {
|
|
StringBuilder sb = new StringBuilder("positive iteration count required: ");
|
|
sb.append(pBEKeySpec.getIterationCount());
|
|
throw new InvalidKeySpecException(sb.toString());
|
|
}
|
|
if (pBEKeySpec.getKeyLength() <= 0) {
|
|
StringBuilder sb2 = new StringBuilder("positive key length required: ");
|
|
sb2.append(pBEKeySpec.getKeyLength());
|
|
throw new InvalidKeySpecException(sb2.toString());
|
|
}
|
|
if (pBEKeySpec.getPassword().length == 0) {
|
|
throw new IllegalArgumentException("password empty");
|
|
}
|
|
if (pBEKeySpec instanceof PBKDF2KeySpec) {
|
|
int digestCode = getDigestCode(((PBKDF2KeySpec) pBEKeySpec).getPrf().getAlgorithm());
|
|
int keyLength = pBEKeySpec.getKeyLength();
|
|
return new BCPBEKey(this.algName, this.algOid, this.scheme, digestCode, keyLength, -1, pBEKeySpec, PBE.Util.makePBEMacParameters(pBEKeySpec, this.scheme, digestCode, keyLength));
|
|
}
|
|
int i = this.defaultDigest;
|
|
int keyLength2 = pBEKeySpec.getKeyLength();
|
|
return new BCPBEKey(this.algName, this.algOid, this.scheme, i, keyLength2, -1, pBEKeySpec, PBE.Util.makePBEMacParameters(pBEKeySpec, this.scheme, i, keyLength2));
|
|
}
|
|
|
|
private int getDigestCode(ASN1ObjectIdentifier aSN1ObjectIdentifier) throws InvalidKeySpecException {
|
|
if (aSN1ObjectIdentifier.equals(CryptoProObjectIdentifiers.gostR3411Hmac)) {
|
|
return 6;
|
|
}
|
|
if (aSN1ObjectIdentifier.equals(PKCSObjectIdentifiers.id_hmacWithSHA1)) {
|
|
return 1;
|
|
}
|
|
if (aSN1ObjectIdentifier.equals(PKCSObjectIdentifiers.id_hmacWithSHA256)) {
|
|
return 4;
|
|
}
|
|
if (aSN1ObjectIdentifier.equals(PKCSObjectIdentifiers.id_hmacWithSHA224)) {
|
|
return 7;
|
|
}
|
|
if (aSN1ObjectIdentifier.equals(PKCSObjectIdentifiers.id_hmacWithSHA384)) {
|
|
return 8;
|
|
}
|
|
if (aSN1ObjectIdentifier.equals(PKCSObjectIdentifiers.id_hmacWithSHA512)) {
|
|
return 9;
|
|
}
|
|
throw new InvalidKeySpecException("Invalid KeySpec: unknown PRF algorithm ".concat(String.valueOf(aSN1ObjectIdentifier)));
|
|
}
|
|
|
|
public BasePBKDF2(String str, int i, int i2) {
|
|
super(str, PKCSObjectIdentifiers.id_PBKDF2);
|
|
this.scheme = i;
|
|
this.defaultDigest = i2;
|
|
}
|
|
|
|
public BasePBKDF2(String str, int i) {
|
|
this(str, i, 1);
|
|
}
|
|
}
|
|
|
|
/* loaded from: classes6.dex */
|
|
public static class Mappings extends AlgorithmProvider {
|
|
private static final String PREFIX = PBEPBKDF2.class.getName();
|
|
|
|
@Override // org.bouncycastle.jcajce.provider.util.AlgorithmProvider
|
|
public void configure(ConfigurableProvider configurableProvider) {
|
|
StringBuilder sb = new StringBuilder();
|
|
String str = PREFIX;
|
|
sb.append(str);
|
|
sb.append("$AlgParams");
|
|
configurableProvider.addAlgorithm("AlgorithmParameters.PBKDF2", sb.toString());
|
|
StringBuilder sb2 = new StringBuilder("Alg.Alias.AlgorithmParameters.");
|
|
sb2.append(PKCSObjectIdentifiers.id_PBKDF2);
|
|
configurableProvider.addAlgorithm(sb2.toString(), "PBKDF2");
|
|
StringBuilder sb3 = new StringBuilder();
|
|
sb3.append(str);
|
|
sb3.append("$PBKDF2withUTF8");
|
|
configurableProvider.addAlgorithm("SecretKeyFactory.PBKDF2", sb3.toString());
|
|
configurableProvider.addAlgorithm("Alg.Alias.SecretKeyFactory.PBKDF2WITHHMACSHA1", "PBKDF2");
|
|
configurableProvider.addAlgorithm("Alg.Alias.SecretKeyFactory.PBKDF2WITHHMACSHA1ANDUTF8", "PBKDF2");
|
|
StringBuilder sb4 = new StringBuilder("Alg.Alias.SecretKeyFactory.");
|
|
sb4.append(PKCSObjectIdentifiers.id_PBKDF2);
|
|
configurableProvider.addAlgorithm(sb4.toString(), "PBKDF2");
|
|
StringBuilder sb5 = new StringBuilder();
|
|
sb5.append(str);
|
|
sb5.append("$PBKDF2with8BIT");
|
|
configurableProvider.addAlgorithm("SecretKeyFactory.PBKDF2WITHASCII", sb5.toString());
|
|
configurableProvider.addAlgorithm("Alg.Alias.SecretKeyFactory.PBKDF2WITH8BIT", "PBKDF2WITHASCII");
|
|
configurableProvider.addAlgorithm("Alg.Alias.SecretKeyFactory.PBKDF2WITHHMACSHA1AND8BIT", "PBKDF2WITHASCII");
|
|
StringBuilder sb6 = new StringBuilder();
|
|
sb6.append(str);
|
|
sb6.append("$PBKDF2withSHA224");
|
|
configurableProvider.addAlgorithm("SecretKeyFactory.PBKDF2WITHHMACSHA224", sb6.toString());
|
|
StringBuilder sb7 = new StringBuilder();
|
|
sb7.append(str);
|
|
sb7.append("$PBKDF2withSHA256");
|
|
configurableProvider.addAlgorithm("SecretKeyFactory.PBKDF2WITHHMACSHA256", sb7.toString());
|
|
StringBuilder sb8 = new StringBuilder();
|
|
sb8.append(str);
|
|
sb8.append("$PBKDF2withSHA384");
|
|
configurableProvider.addAlgorithm("SecretKeyFactory.PBKDF2WITHHMACSHA384", sb8.toString());
|
|
StringBuilder sb9 = new StringBuilder();
|
|
sb9.append(str);
|
|
sb9.append("$PBKDF2withSHA512");
|
|
configurableProvider.addAlgorithm("SecretKeyFactory.PBKDF2WITHHMACSHA512", sb9.toString());
|
|
}
|
|
}
|
|
|
|
/* loaded from: classes6.dex */
|
|
public static class PBKDF2with8BIT extends BasePBKDF2 {
|
|
public PBKDF2with8BIT() {
|
|
super("PBKDF2", 1);
|
|
}
|
|
}
|
|
|
|
/* loaded from: classes6.dex */
|
|
public static class PBKDF2withSHA224 extends BasePBKDF2 {
|
|
public PBKDF2withSHA224() {
|
|
super("PBKDF2", 5, 7);
|
|
}
|
|
}
|
|
|
|
/* loaded from: classes6.dex */
|
|
public static class PBKDF2withSHA256 extends BasePBKDF2 {
|
|
public PBKDF2withSHA256() {
|
|
super("PBKDF2", 5, 4);
|
|
}
|
|
}
|
|
|
|
/* loaded from: classes6.dex */
|
|
public static class PBKDF2withSHA384 extends BasePBKDF2 {
|
|
public PBKDF2withSHA384() {
|
|
super("PBKDF2", 5, 8);
|
|
}
|
|
}
|
|
|
|
/* loaded from: classes6.dex */
|
|
public static class PBKDF2withSHA512 extends BasePBKDF2 {
|
|
public PBKDF2withSHA512() {
|
|
super("PBKDF2", 5, 9);
|
|
}
|
|
}
|
|
|
|
/* loaded from: classes6.dex */
|
|
public static class PBKDF2withUTF8 extends BasePBKDF2 {
|
|
public PBKDF2withUTF8() {
|
|
super("PBKDF2", 5);
|
|
}
|
|
}
|
|
|
|
private PBEPBKDF2() {
|
|
}
|
|
}
|