what-the-bank/sources/org/bouncycastle/crypto/signers/ISO9796d2PSSSigner.java

447 lines
16 KiB
Java
Raw Normal View History

2024-07-27 18:17:47 +07:00
package org.bouncycastle.crypto.signers;
import com.google.common.base.Ascii;
import com.google.common.primitives.UnsignedBytes;
import java.security.SecureRandom;
import org.bouncycastle.crypto.AsymmetricBlockCipher;
import org.bouncycastle.crypto.CryptoException;
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.InvalidCipherTextException;
import org.bouncycastle.crypto.SignerWithRecovery;
import org.bouncycastle.util.Arrays;
/* loaded from: classes6.dex */
public class ISO9796d2PSSSigner implements SignerWithRecovery {
public static final int TRAILER_IMPLICIT = 188;
public static final int TRAILER_RIPEMD128 = 13004;
public static final int TRAILER_RIPEMD160 = 12748;
public static final int TRAILER_SHA1 = 13260;
public static final int TRAILER_SHA256 = 13516;
public static final int TRAILER_SHA384 = 14028;
public static final int TRAILER_SHA512 = 13772;
public static final int TRAILER_WHIRLPOOL = 14284;
private byte[] block;
private AsymmetricBlockCipher cipher;
private Digest digest;
private boolean fullMessage;
private int hLen;
private int keyBits;
private byte[] mBuf;
private int messageLength;
private byte[] preBlock;
private int preMStart;
private byte[] preSig;
private int preTLength;
private SecureRandom random;
private byte[] recoveredMessage;
private int saltLength;
private byte[] standardSalt;
private int trailer;
@Override // org.bouncycastle.crypto.Signer
public boolean verifySignature(byte[] bArr) {
int i = this.hLen;
byte[] bArr2 = new byte[i];
this.digest.doFinal(bArr2, 0);
byte[] bArr3 = this.preSig;
if (bArr3 == null) {
try {
updateWithRecoveredMessage(bArr);
} catch (Exception unused) {
return false;
}
} else if (!Arrays.areEqual(bArr3, bArr)) {
throw new IllegalStateException("updateWithRecoveredMessage called on different signature");
}
byte[] bArr4 = this.preBlock;
int i2 = this.preMStart;
int i3 = this.preTLength;
this.preSig = null;
this.preBlock = null;
byte[] bArr5 = new byte[8];
LtoOSP(this.recoveredMessage.length << 3, bArr5);
this.digest.update(bArr5, 0, 8);
byte[] bArr6 = this.recoveredMessage;
if (bArr6.length != 0) {
this.digest.update(bArr6, 0, bArr6.length);
}
this.digest.update(bArr2, 0, i);
byte[] bArr7 = this.standardSalt;
if (bArr7 != null) {
this.digest.update(bArr7, 0, bArr7.length);
} else {
this.digest.update(bArr4, i2 + this.recoveredMessage.length, this.saltLength);
}
int digestSize = this.digest.getDigestSize();
byte[] bArr8 = new byte[digestSize];
this.digest.doFinal(bArr8, 0);
int length = bArr4.length;
boolean z = true;
for (int i4 = 0; i4 != digestSize; i4++) {
if (bArr8[i4] != bArr4[((length - i3) - digestSize) + i4]) {
z = false;
}
}
clearBlock(bArr4);
clearBlock(bArr8);
if (!z) {
this.fullMessage = false;
clearBlock(this.recoveredMessage);
return false;
}
if (this.messageLength != 0) {
if (!isSameAs(this.mBuf, this.recoveredMessage)) {
clearBlock(this.mBuf);
return false;
}
this.messageLength = 0;
}
clearBlock(this.mBuf);
return true;
}
@Override // org.bouncycastle.crypto.SignerWithRecovery
public void updateWithRecoveredMessage(byte[] bArr) throws InvalidCipherTextException {
int i;
byte[] processBlock = this.cipher.processBlock(bArr, 0, bArr.length);
int length = processBlock.length;
int i2 = (this.keyBits + 7) / 8;
if (length < i2) {
byte[] bArr2 = new byte[i2];
System.arraycopy(processBlock, 0, bArr2, i2 - processBlock.length, processBlock.length);
clearBlock(processBlock);
processBlock = bArr2;
}
if (((processBlock[processBlock.length - 1] & UnsignedBytes.MAX_VALUE) ^ 188) == 0) {
i = 1;
} else {
i = 2;
int i3 = ((processBlock[processBlock.length - 2] & UnsignedBytes.MAX_VALUE) << 8) | (processBlock[processBlock.length - 1] & UnsignedBytes.MAX_VALUE);
Integer trailer = ISOTrailers.getTrailer(this.digest);
if (trailer == null) {
throw new IllegalArgumentException("unrecognised hash in signature");
}
if (i3 != trailer.intValue()) {
throw new IllegalStateException("signer initialised with wrong digest for trailer ".concat(String.valueOf(i3)));
}
}
this.digest.doFinal(new byte[this.hLen], 0);
int length2 = processBlock.length;
int i4 = this.hLen;
byte[] maskGeneratorFunction1 = maskGeneratorFunction1(processBlock, (length2 - i4) - i, i4, (processBlock.length - i4) - i);
for (int i5 = 0; i5 != maskGeneratorFunction1.length; i5++) {
processBlock[i5] = (byte) (processBlock[i5] ^ maskGeneratorFunction1[i5]);
}
processBlock[0] = (byte) (processBlock[0] & Ascii.DEL);
int i6 = 0;
while (i6 != processBlock.length && processBlock[i6] != 1) {
i6++;
}
int i7 = i6 + 1;
if (i7 >= processBlock.length) {
clearBlock(processBlock);
}
this.fullMessage = i7 > 1;
int length3 = (maskGeneratorFunction1.length - i7) - this.saltLength;
byte[] bArr3 = new byte[length3];
this.recoveredMessage = bArr3;
System.arraycopy(processBlock, i7, bArr3, 0, length3);
byte[] bArr4 = this.recoveredMessage;
System.arraycopy(bArr4, 0, this.mBuf, 0, bArr4.length);
this.preSig = bArr;
this.preBlock = processBlock;
this.preMStart = i7;
this.preTLength = i;
}
@Override // org.bouncycastle.crypto.Signer
public void update(byte[] bArr, int i, int i2) {
if (this.preSig == null) {
while (i2 > 0 && this.messageLength < this.mBuf.length) {
update(bArr[i]);
i++;
i2--;
}
}
if (i2 > 0) {
this.digest.update(bArr, i, i2);
}
}
@Override // org.bouncycastle.crypto.Signer
public void update(byte b) {
if (this.preSig == null) {
int i = this.messageLength;
byte[] bArr = this.mBuf;
if (i < bArr.length) {
this.messageLength = i + 1;
bArr[i] = b;
return;
}
}
this.digest.update(b);
}
@Override // org.bouncycastle.crypto.Signer
public void reset() {
this.digest.reset();
this.messageLength = 0;
byte[] bArr = this.mBuf;
if (bArr != null) {
clearBlock(bArr);
}
byte[] bArr2 = this.recoveredMessage;
if (bArr2 != null) {
clearBlock(bArr2);
this.recoveredMessage = null;
}
this.fullMessage = false;
if (this.preSig != null) {
this.preSig = null;
clearBlock(this.preBlock);
this.preBlock = null;
}
}
/* JADX WARN: Removed duplicated region for block: B:13:0x006f */
/* JADX WARN: Removed duplicated region for block: B:9:0x0060 */
@Override // org.bouncycastle.crypto.Signer
/*
Code decompiled incorrectly, please refer to instructions dump.
To view partially-correct add '--show-bad-code' argument
*/
public void init(boolean r4, org.bouncycastle.crypto.CipherParameters r5) {
/*
r3 = this;
int r0 = r3.saltLength
boolean r1 = r5 instanceof org.bouncycastle.crypto.params.ParametersWithRandom
if (r1 == 0) goto L15
org.bouncycastle.crypto.params.ParametersWithRandom r5 = (org.bouncycastle.crypto.params.ParametersWithRandom) r5
org.bouncycastle.crypto.CipherParameters r1 = r5.getParameters()
org.bouncycastle.crypto.params.RSAKeyParameters r1 = (org.bouncycastle.crypto.params.RSAKeyParameters) r1
if (r4 == 0) goto L43
java.security.SecureRandom r5 = r5.getRandom()
goto L41
L15:
boolean r1 = r5 instanceof org.bouncycastle.crypto.params.ParametersWithSalt
if (r1 == 0) goto L37
org.bouncycastle.crypto.params.ParametersWithSalt r5 = (org.bouncycastle.crypto.params.ParametersWithSalt) r5
org.bouncycastle.crypto.CipherParameters r0 = r5.getParameters()
r1 = r0
org.bouncycastle.crypto.params.RSAKeyParameters r1 = (org.bouncycastle.crypto.params.RSAKeyParameters) r1
byte[] r5 = r5.getSalt()
r3.standardSalt = r5
int r0 = r5.length
int r5 = r5.length
int r2 = r3.saltLength
if (r5 != r2) goto L2f
goto L43
L2f:
java.lang.IllegalArgumentException r4 = new java.lang.IllegalArgumentException
java.lang.String r5 = "Fixed salt is of wrong length"
r4.<init>(r5)
throw r4
L37:
r1 = r5
org.bouncycastle.crypto.params.RSAKeyParameters r1 = (org.bouncycastle.crypto.params.RSAKeyParameters) r1
if (r4 == 0) goto L43
java.security.SecureRandom r5 = new java.security.SecureRandom
r5.<init>()
L41:
r3.random = r5
L43:
org.bouncycastle.crypto.AsymmetricBlockCipher r5 = r3.cipher
r5.init(r4, r1)
java.math.BigInteger r4 = r1.getModulus()
int r4 = r4.bitLength()
r3.keyBits = r4
int r4 = r4 + 7
int r4 = r4 / 8
byte[] r5 = new byte[r4]
r3.block = r5
int r5 = r3.trailer
r1 = 188(0xbc, float:2.63E-43)
if (r5 != r1) goto L6f
org.bouncycastle.crypto.Digest r5 = r3.digest
int r5 = r5.getDigestSize()
int r4 = r4 - r5
int r4 = r4 - r0
int r4 = r4 + (-2)
byte[] r4 = new byte[r4]
r3.mBuf = r4
goto L7d
L6f:
org.bouncycastle.crypto.Digest r5 = r3.digest
int r5 = r5.getDigestSize()
int r4 = r4 - r5
int r4 = r4 - r0
int r4 = r4 + (-3)
byte[] r4 = new byte[r4]
r3.mBuf = r4
L7d:
r3.reset()
return
*/
throw new UnsupportedOperationException("Method not decompiled: org.bouncycastle.crypto.signers.ISO9796d2PSSSigner.init(boolean, org.bouncycastle.crypto.CipherParameters):void");
}
@Override // org.bouncycastle.crypto.SignerWithRecovery
public boolean hasFullMessage() {
return this.fullMessage;
}
@Override // org.bouncycastle.crypto.SignerWithRecovery
public byte[] getRecoveredMessage() {
return this.recoveredMessage;
}
@Override // org.bouncycastle.crypto.Signer
public byte[] generateSignature() throws CryptoException {
int digestSize = this.digest.getDigestSize();
byte[] bArr = new byte[digestSize];
this.digest.doFinal(bArr, 0);
byte[] bArr2 = new byte[8];
LtoOSP(this.messageLength << 3, bArr2);
this.digest.update(bArr2, 0, 8);
this.digest.update(this.mBuf, 0, this.messageLength);
this.digest.update(bArr, 0, digestSize);
byte[] bArr3 = this.standardSalt;
if (bArr3 == null) {
bArr3 = new byte[this.saltLength];
this.random.nextBytes(bArr3);
}
this.digest.update(bArr3, 0, bArr3.length);
int digestSize2 = this.digest.getDigestSize();
byte[] bArr4 = new byte[digestSize2];
this.digest.doFinal(bArr4, 0);
int i = this.trailer == 188 ? 1 : 2;
byte[] bArr5 = this.block;
int length = bArr5.length;
int i2 = this.messageLength;
int length2 = (((length - i2) - bArr3.length) - this.hLen) - i;
bArr5[length2 - 1] = 1;
System.arraycopy(this.mBuf, 0, bArr5, length2, i2);
System.arraycopy(bArr3, 0, this.block, length2 + this.messageLength, bArr3.length);
byte[] maskGeneratorFunction1 = maskGeneratorFunction1(bArr4, 0, digestSize2, (this.block.length - this.hLen) - i);
for (int i3 = 0; i3 != maskGeneratorFunction1.length; i3++) {
byte[] bArr6 = this.block;
bArr6[i3] = (byte) (bArr6[i3] ^ maskGeneratorFunction1[i3]);
}
byte[] bArr7 = this.block;
int length3 = bArr7.length;
int i4 = this.hLen;
System.arraycopy(bArr4, 0, bArr7, (length3 - i4) - i, i4);
int i5 = this.trailer;
if (i5 == 188) {
byte[] bArr8 = this.block;
bArr8[bArr8.length - 1] = PSSSigner.TRAILER_IMPLICIT;
} else {
byte[] bArr9 = this.block;
bArr9[bArr9.length - 2] = (byte) (i5 >>> 8);
bArr9[bArr9.length - 1] = (byte) i5;
}
byte[] bArr10 = this.block;
bArr10[0] = (byte) (bArr10[0] & Ascii.DEL);
byte[] processBlock = this.cipher.processBlock(bArr10, 0, bArr10.length);
int i6 = this.messageLength;
byte[] bArr11 = new byte[i6];
this.recoveredMessage = bArr11;
byte[] bArr12 = this.mBuf;
this.fullMessage = i6 <= bArr12.length;
System.arraycopy(bArr12, 0, bArr11, 0, i6);
clearBlock(this.mBuf);
clearBlock(this.block);
this.messageLength = 0;
return processBlock;
}
private byte[] maskGeneratorFunction1(byte[] bArr, int i, int i2, int i3) {
int i4;
byte[] bArr2 = new byte[i3];
byte[] bArr3 = new byte[this.hLen];
byte[] bArr4 = new byte[4];
this.digest.reset();
int i5 = 0;
while (true) {
i4 = this.hLen;
if (i5 >= i3 / i4) {
break;
}
ItoOSP(i5, bArr4);
this.digest.update(bArr, i, i2);
this.digest.update(bArr4, 0, 4);
this.digest.doFinal(bArr3, 0);
int i6 = this.hLen;
System.arraycopy(bArr3, 0, bArr2, i5 * i6, i6);
i5++;
}
if (i4 * i5 < i3) {
ItoOSP(i5, bArr4);
this.digest.update(bArr, i, i2);
this.digest.update(bArr4, 0, 4);
this.digest.doFinal(bArr3, 0);
int i7 = i5 * this.hLen;
System.arraycopy(bArr3, 0, bArr2, i7, i3 - i7);
}
return bArr2;
}
private boolean isSameAs(byte[] bArr, byte[] bArr2) {
boolean z = this.messageLength == bArr2.length;
for (int i = 0; i != bArr2.length; i++) {
if (bArr[i] != bArr2[i]) {
z = false;
}
}
return z;
}
private void clearBlock(byte[] bArr) {
for (int i = 0; i != bArr.length; i++) {
bArr[i] = 0;
}
}
private void LtoOSP(long j, byte[] bArr) {
bArr[0] = (byte) (j >>> 56);
bArr[1] = (byte) (j >>> 48);
bArr[2] = (byte) (j >>> 40);
bArr[3] = (byte) (j >>> 32);
bArr[4] = (byte) (j >>> 24);
bArr[5] = (byte) (j >>> 16);
bArr[6] = (byte) (j >>> 8);
bArr[7] = (byte) j;
}
private void ItoOSP(int i, byte[] bArr) {
bArr[0] = (byte) (i >>> 24);
bArr[1] = (byte) (i >>> 16);
bArr[2] = (byte) (i >>> 8);
bArr[3] = (byte) i;
}
public ISO9796d2PSSSigner(AsymmetricBlockCipher asymmetricBlockCipher, Digest digest, int i, boolean z) {
int intValue;
this.cipher = asymmetricBlockCipher;
this.digest = digest;
this.hLen = digest.getDigestSize();
this.saltLength = i;
if (z) {
intValue = 188;
} else {
Integer trailer = ISOTrailers.getTrailer(digest);
if (trailer == null) {
StringBuilder sb = new StringBuilder("no valid trailer for digest: ");
sb.append(digest.getAlgorithmName());
throw new IllegalArgumentException(sb.toString());
}
intValue = trailer.intValue();
}
this.trailer = intValue;
}
public ISO9796d2PSSSigner(AsymmetricBlockCipher asymmetricBlockCipher, Digest digest, int i) {
this(asymmetricBlockCipher, digest, i, false);
}
}