447 lines
17 KiB
Java
447 lines
17 KiB
Java
|
package net.sf.scuba.smartcards;
|
||
|
|
||
|
import java.math.BigInteger;
|
||
|
import o.ghS;
|
||
|
import org.jmrtd.cbeff.ISO781611;
|
||
|
|
||
|
/* loaded from: classes6.dex */
|
||
|
public class ISOFileInfo extends FileInfo {
|
||
|
public static final byte A0 = -96;
|
||
|
public static final byte A1 = -95;
|
||
|
public static final byte A2 = -94;
|
||
|
public static final byte A5 = -91;
|
||
|
public static final byte AB = -85;
|
||
|
public static final byte AC = -84;
|
||
|
public static final byte CHANNEL_SECURITY = -114;
|
||
|
public static final byte DATA_BYTES1 = Byte.MIN_VALUE;
|
||
|
public static final byte DATA_BYTES2 = -127;
|
||
|
public static final byte DF_NAME = -124;
|
||
|
public static final byte ENV_TEMP_EF = -115;
|
||
|
public static final byte FCI_BYTE = 111;
|
||
|
public static final byte FCI_EXT = -121;
|
||
|
public static final byte FCP_BYTE = 98;
|
||
|
public static final byte FILE_DESCRIPTOR = -126;
|
||
|
public static final byte FILE_IDENTIFIER = -125;
|
||
|
public static final byte FMD_BYTE = 100;
|
||
|
public static final byte LCS_BYTE = -118;
|
||
|
public static final byte PROP_INFO = -123;
|
||
|
public static final byte SECURITY_ATTR_COMPACT = -116;
|
||
|
public static final byte SECURITY_ATTR_EXP = -117;
|
||
|
public static final byte SECURITY_ATTR_PROP = -122;
|
||
|
public static final byte SHORT_EF = -120;
|
||
|
byte[] a0;
|
||
|
byte[] a1;
|
||
|
byte[] a2;
|
||
|
byte[] a5;
|
||
|
byte[] ab;
|
||
|
byte[] ac;
|
||
|
byte channelSecurity;
|
||
|
byte dataCodingByte;
|
||
|
byte descriptorByte;
|
||
|
byte[] dfName;
|
||
|
short envTempEF;
|
||
|
short fciExt;
|
||
|
short fid;
|
||
|
int fileLength;
|
||
|
int fileLengthFCI;
|
||
|
byte lcsByte;
|
||
|
byte mainTag;
|
||
|
short maxRecordSize;
|
||
|
short maxRecordsCount;
|
||
|
byte[] propInfo;
|
||
|
byte[] secAttrCompact;
|
||
|
byte[] secAttrExp;
|
||
|
byte[] secAttrProp;
|
||
|
byte shortEF;
|
||
|
|
||
|
/* JADX WARN: Failed to find 'out' block for switch in B:22:0x0079. Please report as an issue. */
|
||
|
/* JADX WARN: Failed to find 'out' block for switch in B:23:0x007c. Please report as an issue. */
|
||
|
/* JADX WARN: Failed to find 'out' block for switch in B:24:0x007f. Please report as an issue. */
|
||
|
public ISOFileInfo(byte[] bArr) throws CardServiceException {
|
||
|
this.mainTag = (byte) -1;
|
||
|
this.fileLength = -1;
|
||
|
this.fileLengthFCI = -1;
|
||
|
this.descriptorByte = (byte) -1;
|
||
|
this.dataCodingByte = (byte) -1;
|
||
|
this.maxRecordSize = (short) -1;
|
||
|
this.maxRecordsCount = (short) -1;
|
||
|
this.fid = (short) -1;
|
||
|
this.dfName = null;
|
||
|
this.propInfo = null;
|
||
|
this.secAttrProp = null;
|
||
|
this.secAttrExp = null;
|
||
|
this.secAttrCompact = null;
|
||
|
this.fciExt = (short) -1;
|
||
|
this.envTempEF = (short) -1;
|
||
|
this.shortEF = (byte) -1;
|
||
|
this.lcsByte = (byte) -1;
|
||
|
this.channelSecurity = (byte) -1;
|
||
|
this.a0 = null;
|
||
|
this.a1 = null;
|
||
|
this.a2 = null;
|
||
|
this.a5 = null;
|
||
|
this.ab = null;
|
||
|
this.ac = null;
|
||
|
if (bArr.length == 0) {
|
||
|
return;
|
||
|
}
|
||
|
byte b = bArr[0];
|
||
|
if (b != 111 && b != 98 && b != 100) {
|
||
|
throw new CardServiceException("Malformed FCI data");
|
||
|
}
|
||
|
this.mainTag = b;
|
||
|
int i = bArr[1];
|
||
|
byte[] bArr2 = new byte[i];
|
||
|
System.arraycopy(bArr, 2, bArr2, 0, i);
|
||
|
int i2 = 0;
|
||
|
while (i2 < i) {
|
||
|
try {
|
||
|
byte b2 = bArr2[i2];
|
||
|
int i3 = i2 + 2;
|
||
|
int i4 = bArr2[i2 + 1];
|
||
|
byte[] bArr3 = new byte[i4];
|
||
|
System.arraycopy(bArr2, i3, bArr3, 0, i4);
|
||
|
int i5 = i3 + i4;
|
||
|
if (b2 == -91) {
|
||
|
byte[] bArr4 = new byte[i4];
|
||
|
this.a5 = bArr4;
|
||
|
System.arraycopy(bArr3, 0, bArr4, 0, i4);
|
||
|
} else if (b2 == -85) {
|
||
|
byte[] bArr5 = new byte[i4];
|
||
|
this.ab = bArr5;
|
||
|
System.arraycopy(bArr3, 0, bArr5, 0, i4);
|
||
|
} else if (b2 != -84) {
|
||
|
switch (b2) {
|
||
|
case Byte.MIN_VALUE:
|
||
|
this.fileLength = new BigInteger(bArr3).abs().intValue();
|
||
|
break;
|
||
|
case -127:
|
||
|
checkLen(i4, 2);
|
||
|
this.fileLengthFCI = new BigInteger(bArr3).intValue();
|
||
|
break;
|
||
|
case -126:
|
||
|
checkLen(i4, 1, 6);
|
||
|
this.descriptorByte = bArr3[0];
|
||
|
if (1 != i4) {
|
||
|
this.dataCodingByte = bArr3[1];
|
||
|
if (2 != i4) {
|
||
|
int i6 = 3;
|
||
|
if (i4 == 3) {
|
||
|
this.maxRecordSize = bArr3[2];
|
||
|
} else {
|
||
|
this.maxRecordSize = new BigInteger(new byte[]{bArr3[2], bArr3[3]}).shortValue();
|
||
|
i6 = 4;
|
||
|
}
|
||
|
if (i6 == i4) {
|
||
|
break;
|
||
|
} else if (i4 == 5) {
|
||
|
this.maxRecordsCount = bArr3[i6];
|
||
|
break;
|
||
|
} else {
|
||
|
this.maxRecordsCount = new BigInteger(new byte[]{bArr3[i6], bArr3[i6 + 1]}).shortValue();
|
||
|
break;
|
||
|
}
|
||
|
} else {
|
||
|
break;
|
||
|
}
|
||
|
} else {
|
||
|
break;
|
||
|
}
|
||
|
case -125:
|
||
|
checkLen(i4, 2);
|
||
|
this.fid = new BigInteger(bArr3).shortValue();
|
||
|
break;
|
||
|
case -124:
|
||
|
checkLen(i4, 0, 16);
|
||
|
byte[] bArr6 = new byte[i4];
|
||
|
this.dfName = bArr6;
|
||
|
System.arraycopy(bArr3, 0, bArr6, 0, i4);
|
||
|
break;
|
||
|
case -123:
|
||
|
byte[] bArr7 = new byte[i4];
|
||
|
this.propInfo = bArr7;
|
||
|
System.arraycopy(bArr3, 0, bArr7, 0, i4);
|
||
|
break;
|
||
|
case -122:
|
||
|
byte[] bArr8 = new byte[i4];
|
||
|
this.secAttrProp = bArr8;
|
||
|
System.arraycopy(bArr3, 0, bArr8, 0, i4);
|
||
|
break;
|
||
|
case -121:
|
||
|
checkLen(i4, 2);
|
||
|
this.fciExt = new BigInteger(bArr3).shortValue();
|
||
|
break;
|
||
|
case -120:
|
||
|
checkLen(i4, 0, 1);
|
||
|
if (i4 != 0) {
|
||
|
this.shortEF = bArr3[0];
|
||
|
break;
|
||
|
} else {
|
||
|
this.shortEF = (byte) 0;
|
||
|
break;
|
||
|
}
|
||
|
default:
|
||
|
switch (b2) {
|
||
|
case -118:
|
||
|
checkLen(i4, 1);
|
||
|
this.lcsByte = bArr3[0];
|
||
|
break;
|
||
|
case -117:
|
||
|
byte[] bArr9 = new byte[i4];
|
||
|
this.secAttrExp = bArr9;
|
||
|
System.arraycopy(bArr3, 0, bArr9, 0, i4);
|
||
|
break;
|
||
|
case -116:
|
||
|
byte[] bArr10 = new byte[i4];
|
||
|
this.secAttrCompact = bArr10;
|
||
|
System.arraycopy(bArr3, 0, bArr10, 0, i4);
|
||
|
break;
|
||
|
case -115:
|
||
|
checkLen(i4, 2);
|
||
|
this.envTempEF = new BigInteger(bArr3).shortValue();
|
||
|
break;
|
||
|
case -114:
|
||
|
checkLen(i4, 1);
|
||
|
this.channelSecurity = bArr3[0];
|
||
|
break;
|
||
|
default:
|
||
|
switch (b2) {
|
||
|
case -96:
|
||
|
byte[] bArr11 = new byte[i4];
|
||
|
this.a0 = bArr11;
|
||
|
System.arraycopy(bArr3, 0, bArr11, 0, i4);
|
||
|
break;
|
||
|
case ISO781611.BIOMETRIC_HEADER_TEMPLATE_BASE_TAG /* -95 */:
|
||
|
byte[] bArr12 = new byte[i4];
|
||
|
this.a1 = bArr12;
|
||
|
System.arraycopy(bArr3, 0, bArr12, 0, i4);
|
||
|
break;
|
||
|
case -94:
|
||
|
byte[] bArr13 = new byte[i4];
|
||
|
this.a2 = bArr13;
|
||
|
System.arraycopy(bArr3, 0, bArr13, 0, i4);
|
||
|
break;
|
||
|
default:
|
||
|
throw new CardServiceException("Malformed FCI: unrecognized tag.");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
byte[] bArr14 = new byte[i4];
|
||
|
this.ac = bArr14;
|
||
|
System.arraycopy(bArr3, 0, bArr14, 0, i4);
|
||
|
}
|
||
|
i2 = i5;
|
||
|
} catch (ArrayIndexOutOfBoundsException unused) {
|
||
|
throw new CardServiceException("Malformed FCI.");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private static void checkLen(int i, int i2) throws CardServiceException {
|
||
|
if (i != i2) {
|
||
|
throw new CardServiceException("Malformed FCI.");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private static void checkLen(int i, int i2, int i3) throws CardServiceException {
|
||
|
if (i < i2 || i > i3) {
|
||
|
throw new CardServiceException("Malformed FCI.");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public byte[] getFormatted() {
|
||
|
String e;
|
||
|
String e2;
|
||
|
byte[] bArr = new byte[0];
|
||
|
if (this.mainTag == -1) {
|
||
|
return bArr;
|
||
|
}
|
||
|
int i = this.fileLength;
|
||
|
if (i != -1) {
|
||
|
bArr = catArray(bArr, getArray(Byte.MIN_VALUE, ghS.c(ghS.e((short) i))));
|
||
|
}
|
||
|
int i2 = this.fileLengthFCI;
|
||
|
if (i2 != -1) {
|
||
|
bArr = catArray(bArr, getArray(DATA_BYTES2, ghS.c(ghS.e((short) i2))));
|
||
|
}
|
||
|
byte b = this.descriptorByte;
|
||
|
if (b != -1) {
|
||
|
byte[] bArr2 = {b};
|
||
|
byte[] bArr3 = new byte[0];
|
||
|
byte b2 = this.dataCodingByte;
|
||
|
if (b2 != -1) {
|
||
|
bArr3 = new byte[]{b2};
|
||
|
}
|
||
|
byte[] bArr4 = new byte[0];
|
||
|
short s = this.maxRecordSize;
|
||
|
if (s != -1) {
|
||
|
if (s > 256) {
|
||
|
e2 = ghS.e(s);
|
||
|
} else if (this.maxRecordsCount == -1) {
|
||
|
e2 = ghS.e((byte) s);
|
||
|
} else {
|
||
|
e2 = ghS.e(s);
|
||
|
}
|
||
|
bArr4 = ghS.c(e2);
|
||
|
}
|
||
|
byte[] bArr5 = new byte[0];
|
||
|
short s2 = this.maxRecordsCount;
|
||
|
if (s2 != -1) {
|
||
|
if (s2 <= 256) {
|
||
|
e = ghS.e((byte) s2);
|
||
|
} else {
|
||
|
e = ghS.e(s2);
|
||
|
}
|
||
|
bArr5 = ghS.c(e);
|
||
|
}
|
||
|
bArr = catArray(bArr, getArray((byte) -126, catArray(catArray(catArray(bArr2, bArr3), bArr4), bArr5)));
|
||
|
}
|
||
|
short s3 = this.fid;
|
||
|
if (s3 != -1) {
|
||
|
bArr = catArray(bArr, getArray(FILE_IDENTIFIER, ghS.c(ghS.e(s3))));
|
||
|
}
|
||
|
byte[] bArr6 = this.dfName;
|
||
|
if (bArr6 != null) {
|
||
|
bArr = catArray(bArr, getArray((byte) -124, bArr6));
|
||
|
}
|
||
|
byte[] bArr7 = this.propInfo;
|
||
|
if (bArr7 != null) {
|
||
|
bArr = catArray(bArr, getArray(PROP_INFO, bArr7));
|
||
|
}
|
||
|
byte[] bArr8 = this.secAttrProp;
|
||
|
if (bArr8 != null) {
|
||
|
bArr = catArray(bArr, getArray((byte) -122, bArr8));
|
||
|
}
|
||
|
short s4 = this.fciExt;
|
||
|
if (s4 != -1) {
|
||
|
bArr = catArray(bArr, getArray(FCI_EXT, ghS.c(ghS.e(s4))));
|
||
|
}
|
||
|
byte b3 = this.shortEF;
|
||
|
if (b3 != -1) {
|
||
|
bArr = catArray(bArr, getArray((byte) -120, b3 == 0 ? new byte[0] : new byte[]{b3}));
|
||
|
}
|
||
|
byte b4 = this.lcsByte;
|
||
|
if (b4 != -1) {
|
||
|
bArr = catArray(bArr, getArray(LCS_BYTE, new byte[]{b4}));
|
||
|
}
|
||
|
byte[] bArr9 = this.secAttrExp;
|
||
|
if (bArr9 != null) {
|
||
|
bArr = catArray(bArr, getArray(SECURITY_ATTR_EXP, bArr9));
|
||
|
}
|
||
|
byte[] bArr10 = this.secAttrCompact;
|
||
|
if (bArr10 != null) {
|
||
|
bArr = catArray(bArr, getArray(SECURITY_ATTR_COMPACT, bArr10));
|
||
|
}
|
||
|
short s5 = this.envTempEF;
|
||
|
if (s5 != -1) {
|
||
|
bArr = catArray(bArr, getArray(ENV_TEMP_EF, ghS.c(ghS.e(s5))));
|
||
|
}
|
||
|
byte b5 = this.channelSecurity;
|
||
|
if (b5 != -1) {
|
||
|
bArr = catArray(bArr, getArray(CHANNEL_SECURITY, new byte[]{b5}));
|
||
|
}
|
||
|
byte[] bArr11 = this.a0;
|
||
|
if (bArr11 != null) {
|
||
|
bArr = catArray(bArr, getArray(A0, bArr11));
|
||
|
}
|
||
|
byte[] bArr12 = this.a1;
|
||
|
if (bArr12 != null) {
|
||
|
bArr = catArray(bArr, getArray(A1, bArr12));
|
||
|
}
|
||
|
byte[] bArr13 = this.a2;
|
||
|
if (bArr13 != null) {
|
||
|
bArr = catArray(bArr, getArray((byte) -94, bArr13));
|
||
|
}
|
||
|
byte[] bArr14 = this.a5;
|
||
|
if (bArr14 != null) {
|
||
|
bArr = catArray(bArr, getArray(A5, bArr14));
|
||
|
}
|
||
|
byte[] bArr15 = this.ab;
|
||
|
if (bArr15 != null) {
|
||
|
bArr = catArray(bArr, getArray(AB, bArr15));
|
||
|
}
|
||
|
byte[] bArr16 = this.ac;
|
||
|
if (bArr16 != null) {
|
||
|
bArr = catArray(bArr, getArray((byte) -84, bArr16));
|
||
|
}
|
||
|
return getArray(this.mainTag, bArr);
|
||
|
}
|
||
|
|
||
|
private static byte[] getArray(byte b, byte[] bArr) {
|
||
|
byte[] bArr2 = new byte[bArr.length + 2];
|
||
|
bArr2[0] = b;
|
||
|
bArr2[1] = (byte) bArr.length;
|
||
|
System.arraycopy(bArr, 0, bArr2, 2, bArr.length);
|
||
|
return bArr2;
|
||
|
}
|
||
|
|
||
|
private static byte[] catArray(byte[] bArr, byte[] bArr2) {
|
||
|
byte[] bArr3 = new byte[bArr.length + bArr2.length];
|
||
|
System.arraycopy(bArr, 0, bArr3, 0, bArr.length);
|
||
|
System.arraycopy(bArr2, 0, bArr3, bArr.length, bArr2.length);
|
||
|
return bArr3;
|
||
|
}
|
||
|
|
||
|
public String toString() {
|
||
|
StringBuilder sb = new StringBuilder("Length: ");
|
||
|
sb.append(this.fileLength);
|
||
|
sb.append("\nLength FCI: ");
|
||
|
sb.append(this.fileLengthFCI);
|
||
|
sb.append("\nDesc byte: ");
|
||
|
sb.append((int) this.descriptorByte);
|
||
|
sb.append("\nData byte: ");
|
||
|
sb.append((int) this.dataCodingByte);
|
||
|
sb.append("\nRecord size: ");
|
||
|
sb.append((int) this.maxRecordSize);
|
||
|
sb.append("\nRecord count: ");
|
||
|
sb.append((int) this.maxRecordsCount);
|
||
|
sb.append("\nFID: ");
|
||
|
sb.append(ghS.e(this.fid));
|
||
|
sb.append("\nDF name: ");
|
||
|
sb.append(ghS.c(this.dfName));
|
||
|
sb.append("\npropInfo: ");
|
||
|
sb.append(ghS.c(this.propInfo));
|
||
|
sb.append("\nsecAttrProp: ");
|
||
|
sb.append(ghS.c(this.secAttrProp));
|
||
|
sb.append("\nsecAttrExp: ");
|
||
|
sb.append(ghS.c(this.secAttrExp));
|
||
|
sb.append("\nsecAttrComp: ");
|
||
|
sb.append(ghS.c(this.secAttrCompact));
|
||
|
sb.append("\nFCI ext: ");
|
||
|
sb.append(ghS.e(this.fciExt));
|
||
|
sb.append("\nEF env temp: ");
|
||
|
sb.append(ghS.e(this.envTempEF));
|
||
|
sb.append("\nShort EF: ");
|
||
|
sb.append(ghS.e(this.shortEF));
|
||
|
sb.append("\nLCS byte: ");
|
||
|
sb.append(ghS.e(this.lcsByte));
|
||
|
sb.append("\nChannel sec: ");
|
||
|
sb.append(ghS.e(this.channelSecurity));
|
||
|
sb.append("\na0: ");
|
||
|
sb.append(ghS.c(this.a0));
|
||
|
sb.append("\na1: ");
|
||
|
sb.append(ghS.c(this.a1));
|
||
|
sb.append("\na2: ");
|
||
|
sb.append(ghS.c(this.a2));
|
||
|
sb.append("\na5: ");
|
||
|
sb.append(ghS.c(this.a5));
|
||
|
sb.append("\nab: ");
|
||
|
sb.append(ghS.c(this.ab));
|
||
|
sb.append("\nac: ");
|
||
|
sb.append(ghS.c(this.ac));
|
||
|
sb.append("\n");
|
||
|
return sb.toString();
|
||
|
}
|
||
|
|
||
|
@Override // net.sf.scuba.smartcards.FileInfo
|
||
|
public int getFileLength() {
|
||
|
return this.fileLength;
|
||
|
}
|
||
|
|
||
|
@Override // net.sf.scuba.smartcards.FileInfo
|
||
|
public short getFID() {
|
||
|
return this.fid;
|
||
|
}
|
||
|
}
|