251 lines
9.1 KiB
Java
251 lines
9.1 KiB
Java
|
package org.bouncycastle.pqc.math.linearalgebra;
|
||
|
|
||
|
import com.google.common.primitives.UnsignedBytes;
|
||
|
import java.lang.reflect.Array;
|
||
|
|
||
|
/* loaded from: classes6.dex */
|
||
|
public class GF2mMatrix extends Matrix {
|
||
|
protected GF2mField field;
|
||
|
protected int[][] matrix;
|
||
|
|
||
|
@Override // org.bouncycastle.pqc.math.linearalgebra.Matrix
|
||
|
public String toString() {
|
||
|
StringBuilder sb = new StringBuilder();
|
||
|
sb.append(this.numRows);
|
||
|
sb.append(" x ");
|
||
|
sb.append(this.numColumns);
|
||
|
sb.append(" Matrix over ");
|
||
|
sb.append(this.field.toString());
|
||
|
sb.append(": \n");
|
||
|
String obj = sb.toString();
|
||
|
for (int i = 0; i < this.numRows; i++) {
|
||
|
for (int i2 = 0; i2 < this.numColumns; i2++) {
|
||
|
StringBuilder sb2 = new StringBuilder();
|
||
|
sb2.append(obj);
|
||
|
sb2.append(this.field.elementToStr(this.matrix[i][i2]));
|
||
|
sb2.append(" : ");
|
||
|
obj = sb2.toString();
|
||
|
}
|
||
|
StringBuilder sb3 = new StringBuilder();
|
||
|
sb3.append(obj);
|
||
|
sb3.append("\n");
|
||
|
obj = sb3.toString();
|
||
|
}
|
||
|
return obj;
|
||
|
}
|
||
|
|
||
|
@Override // org.bouncycastle.pqc.math.linearalgebra.Matrix
|
||
|
public Vector rightMultiply(Vector vector) {
|
||
|
throw new RuntimeException("Not implemented.");
|
||
|
}
|
||
|
|
||
|
@Override // org.bouncycastle.pqc.math.linearalgebra.Matrix
|
||
|
public Matrix rightMultiply(Permutation permutation) {
|
||
|
throw new RuntimeException("Not implemented.");
|
||
|
}
|
||
|
|
||
|
@Override // org.bouncycastle.pqc.math.linearalgebra.Matrix
|
||
|
public Matrix rightMultiply(Matrix matrix) {
|
||
|
throw new RuntimeException("Not implemented.");
|
||
|
}
|
||
|
|
||
|
@Override // org.bouncycastle.pqc.math.linearalgebra.Matrix
|
||
|
public Vector leftMultiply(Vector vector) {
|
||
|
throw new RuntimeException("Not implemented.");
|
||
|
}
|
||
|
|
||
|
@Override // org.bouncycastle.pqc.math.linearalgebra.Matrix
|
||
|
public boolean isZero() {
|
||
|
for (int i = 0; i < this.numRows; i++) {
|
||
|
for (int i2 = 0; i2 < this.numColumns; i2++) {
|
||
|
if (this.matrix[i][i2] != 0) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
public int hashCode() {
|
||
|
int hashCode = (((this.field.hashCode() * 31) + this.numRows) * 31) + this.numColumns;
|
||
|
for (int i = 0; i < this.numRows; i++) {
|
||
|
for (int i2 = 0; i2 < this.numColumns; i2++) {
|
||
|
hashCode = (hashCode * 31) + this.matrix[i][i2];
|
||
|
}
|
||
|
}
|
||
|
return hashCode;
|
||
|
}
|
||
|
|
||
|
@Override // org.bouncycastle.pqc.math.linearalgebra.Matrix
|
||
|
public byte[] getEncoded() {
|
||
|
int i = 8;
|
||
|
int i2 = 1;
|
||
|
while (this.field.getDegree() > i) {
|
||
|
i2++;
|
||
|
i += 8;
|
||
|
}
|
||
|
int i3 = this.numRows * this.numColumns * i2;
|
||
|
int i4 = 4;
|
||
|
byte[] bArr = new byte[i3 + 4];
|
||
|
bArr[0] = (byte) this.numRows;
|
||
|
bArr[1] = (byte) (this.numRows >>> 8);
|
||
|
bArr[2] = (byte) (this.numRows >>> 16);
|
||
|
bArr[3] = (byte) (this.numRows >>> 24);
|
||
|
for (int i5 = 0; i5 < this.numRows; i5++) {
|
||
|
for (int i6 = 0; i6 < this.numColumns; i6++) {
|
||
|
int i7 = 0;
|
||
|
while (i7 < i) {
|
||
|
bArr[i4] = (byte) (this.matrix[i5][i6] >>> i7);
|
||
|
i7 += 8;
|
||
|
i4++;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return bArr;
|
||
|
}
|
||
|
|
||
|
public boolean equals(Object obj) {
|
||
|
if (obj != null && (obj instanceof GF2mMatrix)) {
|
||
|
GF2mMatrix gF2mMatrix = (GF2mMatrix) obj;
|
||
|
if (this.field.equals(gF2mMatrix.field) && gF2mMatrix.numRows == this.numColumns && gF2mMatrix.numColumns == this.numColumns) {
|
||
|
for (int i = 0; i < this.numRows; i++) {
|
||
|
for (int i2 = 0; i2 < this.numColumns; i2++) {
|
||
|
if (this.matrix[i][i2] != gF2mMatrix.matrix[i][i2]) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
@Override // org.bouncycastle.pqc.math.linearalgebra.Matrix
|
||
|
public Matrix computeInverse() {
|
||
|
int i;
|
||
|
if (this.numRows != this.numColumns) {
|
||
|
throw new ArithmeticException("Matrix is not invertible.");
|
||
|
}
|
||
|
int[][] iArr = (int[][]) Array.newInstance((Class<?>) Integer.TYPE, this.numRows, this.numRows);
|
||
|
for (int i2 = this.numRows - 1; i2 >= 0; i2--) {
|
||
|
iArr[i2] = IntUtils.clone(this.matrix[i2]);
|
||
|
}
|
||
|
int[][] iArr2 = (int[][]) Array.newInstance((Class<?>) Integer.TYPE, this.numRows, this.numRows);
|
||
|
for (int i3 = this.numRows - 1; i3 >= 0; i3--) {
|
||
|
iArr2[i3][i3] = 1;
|
||
|
}
|
||
|
for (int i4 = 0; i4 < this.numRows; i4++) {
|
||
|
if (iArr[i4][i4] == 0) {
|
||
|
int i5 = i4 + 1;
|
||
|
boolean z = false;
|
||
|
while (i5 < this.numRows) {
|
||
|
if (iArr[i5][i4] != 0) {
|
||
|
swapColumns(iArr, i4, i5);
|
||
|
swapColumns(iArr2, i4, i5);
|
||
|
i5 = this.numRows;
|
||
|
z = true;
|
||
|
}
|
||
|
i5++;
|
||
|
}
|
||
|
if (!z) {
|
||
|
throw new ArithmeticException("Matrix is not invertible.");
|
||
|
}
|
||
|
}
|
||
|
int inverse = this.field.inverse(iArr[i4][i4]);
|
||
|
multRowWithElementThis(iArr[i4], inverse);
|
||
|
multRowWithElementThis(iArr2[i4], inverse);
|
||
|
for (int i6 = 0; i6 < this.numRows; i6++) {
|
||
|
if (i6 != i4 && (i = iArr[i6][i4]) != 0) {
|
||
|
int[] multRowWithElement = multRowWithElement(iArr[i4], i);
|
||
|
int[] multRowWithElement2 = multRowWithElement(iArr2[i4], i);
|
||
|
addToRow(multRowWithElement, iArr[i6]);
|
||
|
addToRow(multRowWithElement2, iArr2[i6]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return new GF2mMatrix(this.field, iArr2);
|
||
|
}
|
||
|
|
||
|
private static void swapColumns(int[][] iArr, int i, int i2) {
|
||
|
int[] iArr2 = iArr[i];
|
||
|
iArr[i] = iArr[i2];
|
||
|
iArr[i2] = iArr2;
|
||
|
}
|
||
|
|
||
|
private void multRowWithElementThis(int[] iArr, int i) {
|
||
|
for (int length = iArr.length - 1; length >= 0; length--) {
|
||
|
iArr[length] = this.field.mult(iArr[length], i);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private int[] multRowWithElement(int[] iArr, int i) {
|
||
|
int[] iArr2 = new int[iArr.length];
|
||
|
for (int length = iArr.length - 1; length >= 0; length--) {
|
||
|
iArr2[length] = this.field.mult(iArr[length], i);
|
||
|
}
|
||
|
return iArr2;
|
||
|
}
|
||
|
|
||
|
private void addToRow(int[] iArr, int[] iArr2) {
|
||
|
for (int length = iArr2.length - 1; length >= 0; length--) {
|
||
|
iArr2[length] = this.field.add(iArr[length], iArr2[length]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public GF2mMatrix(GF2mMatrix gF2mMatrix) {
|
||
|
this.numRows = gF2mMatrix.numRows;
|
||
|
this.numColumns = gF2mMatrix.numColumns;
|
||
|
this.field = gF2mMatrix.field;
|
||
|
this.matrix = new int[this.numRows];
|
||
|
for (int i = 0; i < this.numRows; i++) {
|
||
|
this.matrix[i] = IntUtils.clone(gF2mMatrix.matrix[i]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
protected GF2mMatrix(GF2mField gF2mField, int[][] iArr) {
|
||
|
this.field = gF2mField;
|
||
|
this.matrix = iArr;
|
||
|
this.numRows = iArr.length;
|
||
|
this.numColumns = iArr[0].length;
|
||
|
}
|
||
|
|
||
|
public GF2mMatrix(GF2mField gF2mField, byte[] bArr) {
|
||
|
this.field = gF2mField;
|
||
|
int i = 8;
|
||
|
int i2 = 1;
|
||
|
while (gF2mField.getDegree() > i) {
|
||
|
i2++;
|
||
|
i += 8;
|
||
|
}
|
||
|
if (bArr.length < 5) {
|
||
|
throw new IllegalArgumentException(" Error: given array is not encoded matrix over GF(2^m)");
|
||
|
}
|
||
|
this.numRows = ((((bArr[3] & UnsignedBytes.MAX_VALUE) << 24) ^ ((bArr[2] & UnsignedBytes.MAX_VALUE) << 16)) ^ ((bArr[1] & UnsignedBytes.MAX_VALUE) << 8)) ^ (bArr[0] & UnsignedBytes.MAX_VALUE);
|
||
|
int i3 = i2 * this.numRows;
|
||
|
if (this.numRows > 0) {
|
||
|
int i4 = 4;
|
||
|
if ((bArr.length - 4) % i3 == 0) {
|
||
|
this.numColumns = (bArr.length - 4) / i3;
|
||
|
this.matrix = (int[][]) Array.newInstance((Class<?>) Integer.TYPE, this.numRows, this.numColumns);
|
||
|
for (int i5 = 0; i5 < this.numRows; i5++) {
|
||
|
for (int i6 = 0; i6 < this.numColumns; i6++) {
|
||
|
int i7 = 0;
|
||
|
while (i7 < i) {
|
||
|
int[] iArr = this.matrix[i5];
|
||
|
iArr[i6] = iArr[i6] ^ ((bArr[i4] & UnsignedBytes.MAX_VALUE) << i7);
|
||
|
i7 += 8;
|
||
|
i4++;
|
||
|
}
|
||
|
if (!this.field.isElementOfThisField(this.matrix[i5][i6])) {
|
||
|
throw new IllegalArgumentException(" Error: given array is not encoded matrix over GF(2^m)");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
throw new IllegalArgumentException(" Error: given array is not encoded matrix over GF(2^m)");
|
||
|
}
|
||
|
}
|