what-the-bank/sources/org/bouncycastle/pqc/crypto/rainbow/RainbowSigner.java

145 lines
5.9 KiB
Java
Raw Permalink Normal View History

2024-07-27 18:17:47 +07:00
package org.bouncycastle.pqc.crypto.rainbow;
import java.security.SecureRandom;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.params.ParametersWithRandom;
import org.bouncycastle.pqc.crypto.MessageSigner;
import org.bouncycastle.pqc.crypto.rainbow.util.ComputeInField;
import org.bouncycastle.pqc.crypto.rainbow.util.GF2Field;
/* loaded from: classes6.dex */
public class RainbowSigner implements MessageSigner {
private ComputeInField cf = new ComputeInField();
RainbowKeyParameters key;
private SecureRandom random;
int signableDocumentLength;
private short[] x;
@Override // org.bouncycastle.pqc.crypto.MessageSigner
public boolean verifySignature(byte[] bArr, byte[] bArr2) {
short[] sArr = new short[bArr2.length];
for (int i = 0; i < bArr2.length; i++) {
sArr[i] = (short) (bArr2[i] & 255);
}
short[] makeMessageRepresentative = makeMessageRepresentative(bArr);
short[] verifySignatureIntern = verifySignatureIntern(sArr);
if (makeMessageRepresentative.length != verifySignatureIntern.length) {
return false;
}
boolean z = true;
for (int i2 = 0; i2 < makeMessageRepresentative.length; i2++) {
z = z && makeMessageRepresentative[i2] == verifySignatureIntern[i2];
}
return z;
}
@Override // org.bouncycastle.pqc.crypto.MessageSigner
public void init(boolean z, CipherParameters cipherParameters) {
RainbowKeyParameters rainbowKeyParameters;
if (!z) {
rainbowKeyParameters = (RainbowPublicKeyParameters) cipherParameters;
} else {
if (cipherParameters instanceof ParametersWithRandom) {
ParametersWithRandom parametersWithRandom = (ParametersWithRandom) cipherParameters;
this.random = parametersWithRandom.getRandom();
this.key = (RainbowPrivateKeyParameters) parametersWithRandom.getParameters();
this.signableDocumentLength = this.key.getDocLength();
}
this.random = new SecureRandom();
rainbowKeyParameters = (RainbowPrivateKeyParameters) cipherParameters;
}
this.key = rainbowKeyParameters;
this.signableDocumentLength = this.key.getDocLength();
}
@Override // org.bouncycastle.pqc.crypto.MessageSigner
public byte[] generateSignature(byte[] bArr) {
short[] initSign;
int i;
int i2;
int i3;
Layer[] layers = ((RainbowPrivateKeyParameters) this.key).getLayers();
int length = layers.length;
this.x = new short[((RainbowPrivateKeyParameters) this.key).getInvA2().length];
int viNext = layers[length - 1].getViNext();
byte[] bArr2 = new byte[viNext];
while (true) {
try {
initSign = initSign(layers, makeMessageRepresentative(bArr));
i3 = 0;
break;
} catch (Exception unused) {
}
}
for (i2 = 0; i2 < length; i2++) {
short[] sArr = new short[layers[i2].getOi()];
short[] sArr2 = new short[layers[i2].getOi()];
for (int i4 = 0; i4 < layers[i2].getOi(); i4++) {
sArr[i4] = initSign[i3];
i3++;
}
short[] solveEquation = this.cf.solveEquation(layers[i2].plugInVinegars(this.x), sArr);
if (solveEquation == null) {
throw new Exception("LES is not solveable!");
}
for (int i5 = 0; i5 < solveEquation.length; i5++) {
this.x[layers[i2].getVi() + i5] = solveEquation[i5];
}
}
short[] multiplyMatrix = this.cf.multiplyMatrix(((RainbowPrivateKeyParameters) this.key).getInvA2(), this.cf.addVect(((RainbowPrivateKeyParameters) this.key).getB2(), this.x));
for (i = 0; i < viNext; i++) {
bArr2[i] = (byte) multiplyMatrix[i];
}
return bArr2;
}
private short[] verifySignatureIntern(short[] sArr) {
short[][] coeffQuadratic = ((RainbowPublicKeyParameters) this.key).getCoeffQuadratic();
short[][] coeffSingular = ((RainbowPublicKeyParameters) this.key).getCoeffSingular();
short[] coeffScalar = ((RainbowPublicKeyParameters) this.key).getCoeffScalar();
short[] sArr2 = new short[coeffQuadratic.length];
int length = coeffSingular[0].length;
for (int i = 0; i < coeffQuadratic.length; i++) {
int i2 = 0;
for (int i3 = 0; i3 < length; i3++) {
for (int i4 = i3; i4 < length; i4++) {
sArr2[i] = GF2Field.addElem(sArr2[i], GF2Field.multElem(coeffQuadratic[i][i2], GF2Field.multElem(sArr[i3], sArr[i4])));
i2++;
}
sArr2[i] = GF2Field.addElem(sArr2[i], GF2Field.multElem(coeffSingular[i][i3], sArr[i3]));
}
sArr2[i] = GF2Field.addElem(sArr2[i], coeffScalar[i]);
}
return sArr2;
}
private short[] makeMessageRepresentative(byte[] bArr) {
int i = this.signableDocumentLength;
short[] sArr = new short[i];
int i2 = 0;
int i3 = 0;
while (i2 < bArr.length) {
short s = bArr[i3];
sArr[i2] = s;
sArr[i2] = (short) (s & 255);
i3++;
i2++;
if (i2 >= i) {
break;
}
}
return sArr;
}
private short[] initSign(Layer[] layerArr, short[] sArr) {
short[] sArr2 = new short[sArr.length];
short[] multiplyMatrix = this.cf.multiplyMatrix(((RainbowPrivateKeyParameters) this.key).getInvA1(), this.cf.addVect(((RainbowPrivateKeyParameters) this.key).getB1(), sArr));
for (int i = 0; i < layerArr[0].getVi(); i++) {
this.x[i] = (short) this.random.nextInt();
short[] sArr3 = this.x;
sArr3[i] = (short) (sArr3[i] & 255);
}
return multiplyMatrix;
}
}