305 lines
12 KiB
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);
|
|
}
|
|
}
|