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

296 lines
11 KiB
Java
Raw Permalink Normal View History

2024-07-27 18:17:47 +07:00
package org.bouncycastle.pqc.crypto.rainbow.util;
import java.lang.reflect.Array;
/* loaded from: classes6.dex */
public class ComputeInField {
private short[][] A;
short[] x;
public short[] solveEquation(short[][] sArr, short[] sArr2) {
try {
if (sArr.length != sArr2.length) {
throw new RuntimeException("The equation system is not solvable");
}
this.A = (short[][]) Array.newInstance((Class<?>) Short.TYPE, sArr.length, sArr.length + 1);
this.x = new short[sArr.length];
for (int i = 0; i < sArr.length; i++) {
for (int i2 = 0; i2 < sArr[0].length; i2++) {
this.A[i][i2] = sArr[i][i2];
}
}
for (int i3 = 0; i3 < sArr2.length; i3++) {
short[] sArr3 = this.A[i3];
sArr3[sArr2.length] = GF2Field.addElem(sArr2[i3], sArr3[sArr2.length]);
}
computeZerosUnder(false);
substitute();
return this.x;
} catch (RuntimeException unused) {
return null;
}
}
public short[][] multiplyMatrix(short[][] sArr, short[][] sArr2) throws RuntimeException {
if (sArr[0].length != sArr2.length) {
throw new RuntimeException("Multiplication is not possible!");
}
this.A = (short[][]) Array.newInstance((Class<?>) Short.TYPE, sArr.length, sArr2[0].length);
for (int i = 0; i < sArr.length; i++) {
for (int i2 = 0; i2 < sArr2.length; i2++) {
for (int i3 = 0; i3 < sArr2[0].length; i3++) {
short multElem = GF2Field.multElem(sArr[i][i2], sArr2[i2][i3]);
short[] sArr3 = this.A[i];
sArr3[i3] = GF2Field.addElem(sArr3[i3], multElem);
}
}
}
return this.A;
}
public short[] multiplyMatrix(short[][] sArr, short[] sArr2) throws RuntimeException {
if (sArr[0].length != sArr2.length) {
throw new RuntimeException("Multiplication is not possible!");
}
short[] sArr3 = new short[sArr.length];
for (int i = 0; i < sArr.length; i++) {
for (int i2 = 0; i2 < sArr2.length; i2++) {
sArr3[i] = GF2Field.addElem(sArr3[i], GF2Field.multElem(sArr[i][i2], sArr2[i2]));
}
}
return sArr3;
}
public short[][] multVects(short[] sArr, short[] sArr2) {
if (sArr.length != sArr2.length) {
throw new RuntimeException("Multiplication is not possible!");
}
short[][] sArr3 = (short[][]) Array.newInstance((Class<?>) Short.TYPE, sArr.length, sArr2.length);
for (int i = 0; i < sArr.length; i++) {
for (int i2 = 0; i2 < sArr2.length; i2++) {
sArr3[i][i2] = GF2Field.multElem(sArr[i], sArr2[i2]);
}
}
return sArr3;
}
public short[] multVect(short s, short[] sArr) {
int length = sArr.length;
short[] sArr2 = new short[length];
for (int i = 0; i < length; i++) {
sArr2[i] = GF2Field.multElem(s, sArr[i]);
}
return sArr2;
}
public short[][] multMatrix(short s, short[][] sArr) {
short[][] sArr2 = (short[][]) Array.newInstance((Class<?>) Short.TYPE, sArr.length, sArr[0].length);
for (int i = 0; i < sArr.length; i++) {
for (int i2 = 0; i2 < sArr[0].length; i2++) {
sArr2[i][i2] = GF2Field.multElem(s, sArr[i][i2]);
}
}
return sArr2;
}
public short[][] inverse(short[][] sArr) {
try {
this.A = (short[][]) Array.newInstance((Class<?>) Short.TYPE, sArr.length, sArr.length << 1);
int i = 0;
if (sArr.length != sArr[0].length) {
throw new RuntimeException("The matrix is not invertible. Please choose another one!");
}
for (int i2 = 0; i2 < sArr.length; i2++) {
for (int i3 = 0; i3 < sArr.length; i3++) {
this.A[i2][i3] = sArr[i2][i3];
}
for (int length = sArr.length; length < (sArr.length << 1); length++) {
this.A[i2][length] = 0;
}
short[][] sArr2 = this.A;
sArr2[i2][sArr2.length + i2] = 1;
}
computeZerosUnder(true);
int i4 = 0;
while (true) {
short[][] sArr3 = this.A;
if (i4 >= sArr3.length) {
break;
}
short invElem = GF2Field.invElem(sArr3[i4][i4]);
int i5 = i4;
while (true) {
short[][] sArr4 = this.A;
if (i5 < (sArr4.length << 1)) {
short[] sArr5 = sArr4[i4];
sArr5[i5] = GF2Field.multElem(sArr5[i5], invElem);
i5++;
}
}
i4++;
}
computeZerosAbove();
short[][] sArr6 = this.A;
short[][] sArr7 = (short[][]) Array.newInstance((Class<?>) Short.TYPE, sArr6.length, sArr6.length);
while (true) {
short[][] sArr8 = this.A;
if (i >= sArr8.length) {
return sArr7;
}
int length2 = sArr8.length;
while (true) {
short[][] sArr9 = this.A;
if (length2 < (sArr9.length << 1)) {
sArr7[i][length2 - sArr9.length] = sArr9[i][length2];
length2++;
}
}
i++;
}
} catch (RuntimeException unused) {
return null;
}
}
public short[] addVect(short[] sArr, short[] sArr2) {
if (sArr.length != sArr2.length) {
throw new RuntimeException("Multiplication is not possible!");
}
int length = sArr.length;
short[] sArr3 = new short[length];
for (int i = 0; i < length; i++) {
sArr3[i] = GF2Field.addElem(sArr[i], sArr2[i]);
}
return sArr3;
}
public short[][] addSquareMatrix(short[][] sArr, short[][] sArr2) {
if (sArr.length != sArr2.length || sArr[0].length != sArr2[0].length) {
throw new RuntimeException("Addition is not possible!");
}
short[][] sArr3 = (short[][]) Array.newInstance((Class<?>) Short.TYPE, sArr.length, sArr.length);
for (int i = 0; i < sArr.length; i++) {
for (int i2 = 0; i2 < sArr2.length; i2++) {
sArr3[i][i2] = GF2Field.addElem(sArr[i][i2], sArr2[i][i2]);
}
}
return sArr3;
}
private void substitute() throws RuntimeException {
short invElem = GF2Field.invElem(this.A[r0.length - 1][r0.length - 1]);
if (invElem == 0) {
throw new RuntimeException("The equation system is not solvable");
}
short[] sArr = this.x;
short[][] sArr2 = this.A;
sArr[sArr2.length - 1] = GF2Field.multElem(sArr2[sArr2.length - 1][sArr2.length], invElem);
for (int length = this.A.length - 2; length >= 0; length--) {
short[][] sArr3 = this.A;
short s = sArr3[length][sArr3.length];
for (int length2 = sArr3.length - 1; length2 > length; length2--) {
s = GF2Field.addElem(s, GF2Field.multElem(this.A[length][length2], this.x[length2]));
}
short invElem2 = GF2Field.invElem(this.A[length][length]);
if (invElem2 == 0) {
throw new RuntimeException("Not solvable equation system");
}
this.x[length] = GF2Field.multElem(s, invElem2);
}
}
/* JADX WARN: Code restructure failed: missing block: B:21:0x0056, code lost:
r0 = r1;
*/
/*
Code decompiled incorrectly, please refer to instructions dump.
To view partially-correct add '--show-bad-code' argument
*/
private void computeZerosUnder(boolean r10) throws java.lang.RuntimeException {
/*
r9 = this;
if (r10 == 0) goto L8
short[][] r10 = r9.A
int r10 = r10.length
int r10 = r10 << 1
goto Ld
L8:
short[][] r10 = r9.A
int r10 = r10.length
int r10 = r10 + 1
Ld:
r0 = 0
Le:
short[][] r1 = r9.A
int r1 = r1.length
int r1 = r1 + (-1)
if (r0 >= r1) goto L58
int r1 = r0 + 1
r2 = r1
L18:
short[][] r3 = r9.A
int r4 = r3.length
if (r2 >= r4) goto L56
r4 = r3[r2]
short r4 = r4[r0]
r3 = r3[r0]
short r3 = r3[r0]
short r3 = org.bouncycastle.pqc.crypto.rainbow.util.GF2Field.invElem(r3)
if (r3 == 0) goto L4e
r5 = r0
L2c:
if (r5 >= r10) goto L4b
short[][] r6 = r9.A
r6 = r6[r0]
short r6 = r6[r5]
short r6 = org.bouncycastle.pqc.crypto.rainbow.util.GF2Field.multElem(r6, r3)
short r6 = org.bouncycastle.pqc.crypto.rainbow.util.GF2Field.multElem(r4, r6)
short[][] r7 = r9.A
r7 = r7[r2]
short r8 = r7[r5]
short r6 = org.bouncycastle.pqc.crypto.rainbow.util.GF2Field.addElem(r8, r6)
r7[r5] = r6
int r5 = r5 + 1
goto L2c
L4b:
int r2 = r2 + 1
goto L18
L4e:
java.lang.RuntimeException r10 = new java.lang.RuntimeException
java.lang.String r0 = "Matrix not invertible! We have to choose another one!"
r10.<init>(r0)
throw r10
L56:
r0 = r1
goto Le
L58:
return
*/
throw new UnsupportedOperationException("Method not decompiled: org.bouncycastle.pqc.crypto.rainbow.util.ComputeInField.computeZerosUnder(boolean):void");
}
private void computeZerosAbove() throws RuntimeException {
for (int length = this.A.length - 1; length > 0; length--) {
for (int i = length - 1; i >= 0; i--) {
short[][] sArr = this.A;
short s = sArr[i][length];
short invElem = GF2Field.invElem(sArr[length][length]);
if (invElem == 0) {
throw new RuntimeException("The matrix is not invertible");
}
int i2 = length;
while (true) {
short[][] sArr2 = this.A;
if (i2 < (sArr2.length << 1)) {
short multElem = GF2Field.multElem(s, GF2Field.multElem(sArr2[length][i2], invElem));
short[] sArr3 = this.A[i];
sArr3[i2] = GF2Field.addElem(sArr3[i2], multElem);
i2++;
}
}
}
}
}
}