what-the-bank/sources/org/bouncycastle/jcajce/provider/asymmetric/rsa/DigestSignatureSpi.java

305 lines
12 KiB
Java

package org.bouncycastle.jcajce.provider.asymmetric.rsa;
import java.io.IOException;
import java.security.AlgorithmParameters;
import java.security.InvalidKeyException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SignatureException;
import java.security.SignatureSpi;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.AlgorithmParameterSpec;
import org.bouncycastle.asn1.ASN1Encoding;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.asn1.DERNull;
import org.bouncycastle.asn1.nist.NISTObjectIdentifiers;
import org.bouncycastle.asn1.oiw.OIWObjectIdentifiers;
import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
import org.bouncycastle.asn1.teletrust.TeleTrusTObjectIdentifiers;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import org.bouncycastle.asn1.x509.DigestInfo;
import org.bouncycastle.crypto.AsymmetricBlockCipher;
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.digests.MD2Digest;
import org.bouncycastle.crypto.digests.MD4Digest;
import org.bouncycastle.crypto.digests.MD5Digest;
import org.bouncycastle.crypto.digests.NullDigest;
import org.bouncycastle.crypto.digests.RIPEMD128Digest;
import org.bouncycastle.crypto.digests.RIPEMD160Digest;
import org.bouncycastle.crypto.digests.RIPEMD256Digest;
import org.bouncycastle.crypto.digests.SHA1Digest;
import org.bouncycastle.crypto.digests.SHA224Digest;
import org.bouncycastle.crypto.digests.SHA256Digest;
import org.bouncycastle.crypto.digests.SHA384Digest;
import org.bouncycastle.crypto.digests.SHA3Digest;
import org.bouncycastle.crypto.digests.SHA512Digest;
import org.bouncycastle.crypto.digests.SHA512tDigest;
import org.bouncycastle.crypto.encodings.PKCS1Encoding;
import org.bouncycastle.crypto.engines.RSABlindedEngine;
import org.bouncycastle.crypto.params.RSAKeyParameters;
import org.bouncycastle.util.Arrays;
import org.jmrtd.PassportService;
/* loaded from: classes6.dex */
public class DigestSignatureSpi extends SignatureSpi {
private AlgorithmIdentifier algId;
private AsymmetricBlockCipher cipher;
private Digest digest;
@Override // java.security.SignatureSpi
protected Object engineGetParameter(String str) {
return null;
}
@Override // java.security.SignatureSpi
protected AlgorithmParameters engineGetParameters() {
return null;
}
@Override // java.security.SignatureSpi
protected boolean engineVerify(byte[] bArr) throws SignatureException {
byte[] processBlock;
byte[] derEncode;
int digestSize = this.digest.getDigestSize();
byte[] bArr2 = new byte[digestSize];
this.digest.doFinal(bArr2, 0);
try {
processBlock = this.cipher.processBlock(bArr, 0, bArr.length);
derEncode = derEncode(bArr2);
} catch (Exception unused) {
}
if (processBlock.length == derEncode.length) {
return Arrays.constantTimeAreEqual(processBlock, derEncode);
}
if (processBlock.length != derEncode.length - 2) {
Arrays.constantTimeAreEqual(derEncode, derEncode);
return false;
}
int length = (processBlock.length - digestSize) - 2;
int length2 = derEncode.length;
derEncode[1] = (byte) (derEncode[1] - 2);
derEncode[3] = (byte) (derEncode[3] - 2);
int i = 0;
for (int i2 = 0; i2 < digestSize; i2++) {
i |= processBlock[length + i2] ^ derEncode[((length2 - digestSize) - 2) + i2];
}
for (int i3 = 0; i3 < length; i3++) {
i |= processBlock[i3] ^ derEncode[i3];
}
return i == 0;
}
@Override // java.security.SignatureSpi
protected void engineUpdate(byte[] bArr, int i, int i2) throws SignatureException {
this.digest.update(bArr, i, i2);
}
@Override // java.security.SignatureSpi
protected void engineUpdate(byte b) throws SignatureException {
this.digest.update(b);
}
@Override // java.security.SignatureSpi
protected byte[] engineSign() throws SignatureException {
byte[] bArr = new byte[this.digest.getDigestSize()];
this.digest.doFinal(bArr, 0);
try {
byte[] derEncode = derEncode(bArr);
return this.cipher.processBlock(derEncode, 0, derEncode.length);
} catch (ArrayIndexOutOfBoundsException unused) {
throw new SignatureException("key too small for signature type");
} catch (Exception e) {
throw new SignatureException(e.toString());
}
}
@Override // java.security.SignatureSpi
protected void engineSetParameter(AlgorithmParameterSpec algorithmParameterSpec) {
throw new UnsupportedOperationException("engineSetParameter unsupported");
}
@Override // java.security.SignatureSpi
protected void engineSetParameter(String str, Object obj) {
throw new UnsupportedOperationException("engineSetParameter unsupported");
}
@Override // java.security.SignatureSpi
protected void engineInitVerify(PublicKey publicKey) throws InvalidKeyException {
if (publicKey instanceof RSAPublicKey) {
RSAKeyParameters generatePublicKeyParameter = RSAUtil.generatePublicKeyParameter((RSAPublicKey) publicKey);
this.digest.reset();
this.cipher.init(false, generatePublicKeyParameter);
} else {
StringBuilder sb = new StringBuilder("Supplied key (");
sb.append(getType(publicKey));
sb.append(") is not a RSAPublicKey instance");
throw new InvalidKeyException(sb.toString());
}
}
@Override // java.security.SignatureSpi
protected void engineInitSign(PrivateKey privateKey) throws InvalidKeyException {
if (privateKey instanceof RSAPrivateKey) {
RSAKeyParameters generatePrivateKeyParameter = RSAUtil.generatePrivateKeyParameter((RSAPrivateKey) privateKey);
this.digest.reset();
this.cipher.init(true, generatePrivateKeyParameter);
} else {
StringBuilder sb = new StringBuilder("Supplied key (");
sb.append(getType(privateKey));
sb.append(") is not a RSAPrivateKey instance");
throw new InvalidKeyException(sb.toString());
}
}
private String getType(Object obj) {
if (obj == null) {
return null;
}
return obj.getClass().getName();
}
private byte[] derEncode(byte[] bArr) throws IOException {
AlgorithmIdentifier algorithmIdentifier = this.algId;
return algorithmIdentifier == null ? bArr : new DigestInfo(algorithmIdentifier, bArr).getEncoded(ASN1Encoding.DER);
}
/* loaded from: classes6.dex */
public static class MD2 extends DigestSignatureSpi {
public MD2() {
super(PKCSObjectIdentifiers.md2, new MD2Digest(), new PKCS1Encoding(new RSABlindedEngine()));
}
}
/* loaded from: classes6.dex */
public static class MD4 extends DigestSignatureSpi {
public MD4() {
super(PKCSObjectIdentifiers.md4, new MD4Digest(), new PKCS1Encoding(new RSABlindedEngine()));
}
}
/* loaded from: classes6.dex */
public static class MD5 extends DigestSignatureSpi {
public MD5() {
super(PKCSObjectIdentifiers.md5, new MD5Digest(), new PKCS1Encoding(new RSABlindedEngine()));
}
}
/* loaded from: classes6.dex */
public static class RIPEMD128 extends DigestSignatureSpi {
public RIPEMD128() {
super(TeleTrusTObjectIdentifiers.ripemd128, new RIPEMD128Digest(), new PKCS1Encoding(new RSABlindedEngine()));
}
}
/* loaded from: classes6.dex */
public static class RIPEMD160 extends DigestSignatureSpi {
public RIPEMD160() {
super(TeleTrusTObjectIdentifiers.ripemd160, new RIPEMD160Digest(), new PKCS1Encoding(new RSABlindedEngine()));
}
}
/* loaded from: classes6.dex */
public static class RIPEMD256 extends DigestSignatureSpi {
public RIPEMD256() {
super(TeleTrusTObjectIdentifiers.ripemd256, new RIPEMD256Digest(), new PKCS1Encoding(new RSABlindedEngine()));
}
}
/* loaded from: classes6.dex */
public static class SHA1 extends DigestSignatureSpi {
public SHA1() {
super(OIWObjectIdentifiers.idSHA1, new SHA1Digest(), new PKCS1Encoding(new RSABlindedEngine()));
}
}
/* loaded from: classes6.dex */
public static class SHA224 extends DigestSignatureSpi {
public SHA224() {
super(NISTObjectIdentifiers.id_sha224, new SHA224Digest(), new PKCS1Encoding(new RSABlindedEngine()));
}
}
/* loaded from: classes6.dex */
public static class SHA256 extends DigestSignatureSpi {
public SHA256() {
super(NISTObjectIdentifiers.id_sha256, new SHA256Digest(), new PKCS1Encoding(new RSABlindedEngine()));
}
}
/* loaded from: classes6.dex */
public static class SHA384 extends DigestSignatureSpi {
public SHA384() {
super(NISTObjectIdentifiers.id_sha384, new SHA384Digest(), new PKCS1Encoding(new RSABlindedEngine()));
}
}
/* loaded from: classes6.dex */
public static class SHA3_224 extends DigestSignatureSpi {
public SHA3_224() {
super(NISTObjectIdentifiers.id_sha3_224, new SHA3Digest(PassportService.DEFAULT_MAX_BLOCKSIZE), new PKCS1Encoding(new RSABlindedEngine()));
}
}
/* loaded from: classes6.dex */
public static class SHA3_256 extends DigestSignatureSpi {
public SHA3_256() {
super(NISTObjectIdentifiers.id_sha3_256, new SHA3Digest(256), new PKCS1Encoding(new RSABlindedEngine()));
}
}
/* loaded from: classes6.dex */
public static class SHA3_384 extends DigestSignatureSpi {
public SHA3_384() {
super(NISTObjectIdentifiers.id_sha3_384, new SHA3Digest(384), new PKCS1Encoding(new RSABlindedEngine()));
}
}
/* loaded from: classes6.dex */
public static class SHA3_512 extends DigestSignatureSpi {
public SHA3_512() {
super(NISTObjectIdentifiers.id_sha3_512, new SHA3Digest(512), new PKCS1Encoding(new RSABlindedEngine()));
}
}
/* loaded from: classes6.dex */
public static class SHA512 extends DigestSignatureSpi {
public SHA512() {
super(NISTObjectIdentifiers.id_sha512, new SHA512Digest(), new PKCS1Encoding(new RSABlindedEngine()));
}
}
/* loaded from: classes6.dex */
public static class SHA512_224 extends DigestSignatureSpi {
public SHA512_224() {
super(NISTObjectIdentifiers.id_sha512_224, new SHA512tDigest(PassportService.DEFAULT_MAX_BLOCKSIZE), new PKCS1Encoding(new RSABlindedEngine()));
}
}
/* loaded from: classes6.dex */
public static class SHA512_256 extends DigestSignatureSpi {
public SHA512_256() {
super(NISTObjectIdentifiers.id_sha512_256, new SHA512tDigest(256), new PKCS1Encoding(new RSABlindedEngine()));
}
}
/* loaded from: classes6.dex */
public static class noneRSA extends DigestSignatureSpi {
public noneRSA() {
super(new NullDigest(), new PKCS1Encoding(new RSABlindedEngine()));
}
}
protected DigestSignatureSpi(Digest digest, AsymmetricBlockCipher asymmetricBlockCipher) {
this.digest = digest;
this.cipher = asymmetricBlockCipher;
this.algId = null;
}
protected DigestSignatureSpi(ASN1ObjectIdentifier aSN1ObjectIdentifier, Digest digest, AsymmetricBlockCipher asymmetricBlockCipher) {
this.digest = digest;
this.cipher = asymmetricBlockCipher;
this.algId = new AlgorithmIdentifier(aSN1ObjectIdentifier, DERNull.INSTANCE);
}
}