what-the-bank/sources/org/bouncycastle/crypto/digests/MD2Digest.java

191 lines
7.2 KiB
Java
Raw Normal View History

2024-07-27 18:17:47 +07:00
package org.bouncycastle.crypto.digests;
import com.google.common.base.Ascii;
import com.google.common.primitives.SignedBytes;
import com.google.common.primitives.UnsignedBytes;
import net.sf.scuba.smartcards.ISO7816;
import net.sf.scuba.smartcards.ISOFileInfo;
import org.bouncycastle.crypto.ExtendedDigest;
import org.bouncycastle.crypto.signers.PSSSigner;
import org.bouncycastle.util.Memoable;
import org.jmrtd.lds.CVCAFile;
/* loaded from: classes6.dex */
public class MD2Digest implements ExtendedDigest, Memoable {
private static final int DIGEST_LENGTH = 16;
private static final byte[] S = {41, 46, 67, -55, -94, ISO7816.INS_LOAD_KEY_FILE, 124, 1, 61, 54, 84, ISOFileInfo.A1, -20, -16, 6, 19, ISOFileInfo.FCP_BYTE, -89, 5, -13, ISO7816.INS_GET_RESPONSE, -57, 115, ISOFileInfo.SECURITY_ATTR_COMPACT, -104, -109, 43, -39, PSSSigner.TRAILER_IMPLICIT, 76, -126, ISO7816.INS_GET_DATA, 30, -101, 87, 60, -3, -44, ISO7816.INS_CREATE_FILE, Ascii.SYN, 103, CVCAFile.CAR_TAG, ISOFileInfo.FCI_BYTE, Ascii.CAN, ISOFileInfo.LCS_BYTE, Ascii.ETB, -27, Ascii.DC2, -66, 78, -60, ISO7816.INS_UPDATE_BINARY, ISO7816.INS_PUT_DATA, -98, -34, 73, ISOFileInfo.A0, -5, -11, ISOFileInfo.CHANNEL_SECURITY, -69, 47, -18, 122, -87, 104, 121, -111, Ascii.NAK, -78, 7, 63, -108, ISO7816.INS_ENVELOPE, 16, -119, 11, ISO7816.INS_MSE, 95, 33, Byte.MIN_VALUE, Ascii.DEL, 93, -102, 90, -112, ISO7816.INS_INCREASE, 39, 53, 62, -52, -25, -65, -9, -105, 3, -1, Ascii.EM, ISO7816.INS_DECREASE, ISO7816.INS_READ_RECORD2, 72, ISOFileInfo.A5, -75, -47, -41, 94, -110, ISO7816.INS_PSO, -84, 86, -86, -58, 79, -72, 56, ISO7816.INS_WRITE_RECORD, -106, -92, 125, ISO7816.INS_READ_RECORD_STAMPED, 118, -4, 107, ISO7816.INS_APPEND_RECORD, -100, 116, 4, -15, 69, -99, ISO7816.INS_MANAGE_CHANNEL, 89, ISOFileInfo.FMD_BYTE, 113, ISOFileInfo.FCI_EXT, 32, -122, 91, -49, 101, -26, 45, -88, 2, Ascii.ESC, 96, 37, -83, -82, ISO7816.INS_READ_BINARY, -71, -10, 28, 70, 97, 105, ISO7816.INS_DECREASE_STAMPED, SignedBytes.MAX_POWER_OF_TWO, 126, 15, 85, 71, -93, 35, -35, 81, -81, 58, -61, 92, -7, -50, -70, -59, -22, 38, ISO7816.INS_UNBLOCK_CHV, 83, 13, 110, ISOFileInfo.PROP_INFO, 40, -124, 9, -45, -33, -51, -12, 65, ISOFileInfo.DATA_BYTES2, 77, 82, 106, ISO7816.INS_UPDATE_RECORD, 55, -56, 108, -63, ISOFileInfo.AB, -6, ISO7816.INS_CHANGE_CHV, -31, 123, 8, 12, -67, ISO7816.INS_READ_BINARY2, 74, 120, -120, -107, ISOFileInfo.SECURITY_ATTR_EXP, -29, 99, -24, 109, -23, -53, -43, -2, 59, 0, 29, 57, -14, -17, -73, 14, 102, 88, ISO7816.INS_WRITE_BINARY, ISO7816.INS_DELETE_FILE, -90, 119, 114, -8, -21, 117, 75, 10, 49, ISO7816.INS_REHABILITATE_CHV, 80, ISO7816.INS_READ_BINARY_STAMPED, -113, -19, Ascii.US, Ascii.SUB, -37, -103, ISOFileInfo.ENV_TEMP_EF, 51, -97, 17, ISOFileInfo.FILE_IDENTIFIER, Ascii.DC4};
private byte[] C;
private int COff;
private byte[] M;
private byte[] X;
private int mOff;
private int xOff;
@Override // org.bouncycastle.crypto.ExtendedDigest
public int getByteLength() {
return 16;
}
@Override // org.bouncycastle.crypto.Digest
public int getDigestSize() {
return 16;
}
@Override // org.bouncycastle.crypto.Digest
public void update(byte[] bArr, int i, int i2) {
while (this.mOff != 0 && i2 > 0) {
update(bArr[i]);
i++;
i2--;
}
while (i2 > 16) {
System.arraycopy(bArr, i, this.M, 0, 16);
processCheckSum(this.M);
processBlock(this.M);
i2 -= 16;
i += 16;
}
while (i2 > 0) {
update(bArr[i]);
i++;
i2--;
}
}
@Override // org.bouncycastle.crypto.Digest
public void update(byte b) {
byte[] bArr = this.M;
int i = this.mOff;
int i2 = i + 1;
this.mOff = i2;
bArr[i] = b;
if (i2 == 16) {
processCheckSum(bArr);
processBlock(this.M);
this.mOff = 0;
}
}
@Override // org.bouncycastle.util.Memoable
public void reset(Memoable memoable) {
copyIn((MD2Digest) memoable);
}
@Override // org.bouncycastle.crypto.Digest
public void reset() {
this.xOff = 0;
int i = 0;
while (true) {
byte[] bArr = this.X;
if (i == bArr.length) {
break;
}
bArr[i] = 0;
i++;
}
this.mOff = 0;
int i2 = 0;
while (true) {
byte[] bArr2 = this.M;
if (i2 == bArr2.length) {
break;
}
bArr2[i2] = 0;
i2++;
}
this.COff = 0;
int i3 = 0;
while (true) {
byte[] bArr3 = this.C;
if (i3 == bArr3.length) {
return;
}
bArr3[i3] = 0;
i3++;
}
}
protected void processCheckSum(byte[] bArr) {
byte b = this.C[15];
for (int i = 0; i < 16; i++) {
byte[] bArr2 = this.C;
b = (byte) (S[(b ^ bArr[i]) & 255] ^ bArr2[i]);
bArr2[i] = b;
}
}
protected void processBlock(byte[] bArr) {
for (int i = 0; i < 16; i++) {
byte[] bArr2 = this.X;
bArr2[i + 16] = bArr[i];
bArr2[i + 32] = (byte) (bArr[i] ^ bArr2[i]);
}
int i2 = 0;
for (int i3 = 0; i3 < 18; i3++) {
for (int i4 = 0; i4 < 48; i4++) {
byte[] bArr3 = this.X;
byte b = (byte) (S[i2] ^ bArr3[i4]);
bArr3[i4] = b;
i2 = b & UnsignedBytes.MAX_VALUE;
}
i2 = (i2 + i3) % 256;
}
}
@Override // org.bouncycastle.crypto.Digest
public String getAlgorithmName() {
return "MD2";
}
@Override // org.bouncycastle.crypto.Digest
public int doFinal(byte[] bArr, int i) {
int length = this.M.length;
int i2 = this.mOff;
byte b = (byte) (length - i2);
while (true) {
byte[] bArr2 = this.M;
if (i2 >= bArr2.length) {
processCheckSum(bArr2);
processBlock(this.M);
processBlock(this.C);
System.arraycopy(this.X, this.xOff, bArr, i, 16);
reset();
return 16;
}
bArr2[i2] = b;
i2++;
}
}
@Override // org.bouncycastle.util.Memoable
public Memoable copy() {
return new MD2Digest(this);
}
private void copyIn(MD2Digest mD2Digest) {
byte[] bArr = mD2Digest.X;
System.arraycopy(bArr, 0, this.X, 0, bArr.length);
this.xOff = mD2Digest.xOff;
byte[] bArr2 = mD2Digest.M;
System.arraycopy(bArr2, 0, this.M, 0, bArr2.length);
this.mOff = mD2Digest.mOff;
byte[] bArr3 = mD2Digest.C;
System.arraycopy(bArr3, 0, this.C, 0, bArr3.length);
this.COff = mD2Digest.COff;
}
public MD2Digest(MD2Digest mD2Digest) {
this.X = new byte[48];
this.M = new byte[16];
this.C = new byte[16];
copyIn(mD2Digest);
}
public MD2Digest() {
this.X = new byte[48];
this.M = new byte[16];
this.C = new byte[16];
reset();
}
}