319 lines
9.6 KiB
Java
319 lines
9.6 KiB
Java
package net.sf.scuba.smartcards;
|
|
|
|
import com.google.common.primitives.UnsignedBytes;
|
|
import java.io.IOException;
|
|
import java.io.ObjectInputStream;
|
|
import java.io.Serializable;
|
|
import java.nio.ByteBuffer;
|
|
import java.util.Arrays;
|
|
|
|
/* loaded from: classes6.dex */
|
|
public final class CommandAPDU implements Serializable {
|
|
private static final int MAX_APDU_SIZE = 65544;
|
|
private static final long serialVersionUID = 398698301286670877L;
|
|
private byte[] apdu;
|
|
private transient int dataOffset;
|
|
private transient int nc;
|
|
private transient int ne;
|
|
|
|
public CommandAPDU(byte[] bArr) {
|
|
this.apdu = (byte[]) bArr.clone();
|
|
parse();
|
|
}
|
|
|
|
public CommandAPDU(byte[] bArr, int i, int i2) {
|
|
checkArrayBounds(bArr, i, i2);
|
|
byte[] bArr2 = new byte[i2];
|
|
this.apdu = bArr2;
|
|
System.arraycopy(bArr, i, bArr2, 0, i2);
|
|
parse();
|
|
}
|
|
|
|
private void checkArrayBounds(byte[] bArr, int i, int i2) {
|
|
if (i < 0 || i2 < 0) {
|
|
throw new IllegalArgumentException("Offset and length must not be negative");
|
|
}
|
|
if (bArr != null) {
|
|
if (i > bArr.length - i2) {
|
|
throw new IllegalArgumentException("Offset plus length exceed array size");
|
|
}
|
|
} else if (i != 0 && i2 != 0) {
|
|
throw new IllegalArgumentException("offset and length must be 0 if array is null");
|
|
}
|
|
}
|
|
|
|
public CommandAPDU(ByteBuffer byteBuffer) {
|
|
byte[] bArr = new byte[byteBuffer.remaining()];
|
|
this.apdu = bArr;
|
|
byteBuffer.get(bArr);
|
|
parse();
|
|
}
|
|
|
|
public CommandAPDU(int i, int i2, int i3, int i4) {
|
|
this(i, i2, i3, i4, null, 0, 0, 0);
|
|
}
|
|
|
|
public CommandAPDU(int i, int i2, int i3, int i4, int i5) {
|
|
this(i, i2, i3, i4, null, 0, 0, i5);
|
|
}
|
|
|
|
public CommandAPDU(int i, int i2, int i3, int i4, byte[] bArr) {
|
|
this(i, i2, i3, i4, bArr, 0, arrayLength(bArr), 0);
|
|
}
|
|
|
|
public CommandAPDU(int i, int i2, int i3, int i4, byte[] bArr, int i5, int i6) {
|
|
this(i, i2, i3, i4, bArr, i5, i6, 0);
|
|
}
|
|
|
|
public CommandAPDU(int i, int i2, int i3, int i4, byte[] bArr, int i5) {
|
|
this(i, i2, i3, i4, bArr, 0, arrayLength(bArr), i5);
|
|
}
|
|
|
|
private static int arrayLength(byte[] bArr) {
|
|
if (bArr != null) {
|
|
return bArr.length;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
private void parse() {
|
|
byte[] bArr = this.apdu;
|
|
if (bArr.length < 4) {
|
|
throw new IllegalArgumentException("apdu must be at least 4 bytes long");
|
|
}
|
|
if (bArr.length == 4) {
|
|
return;
|
|
}
|
|
int i = bArr[4] & UnsignedBytes.MAX_VALUE;
|
|
if (bArr.length == 5) {
|
|
if (i == 0) {
|
|
i = 256;
|
|
}
|
|
this.ne = i;
|
|
return;
|
|
}
|
|
if (i != 0) {
|
|
if (bArr.length == i + 5) {
|
|
this.nc = i;
|
|
this.dataOffset = 5;
|
|
return;
|
|
} else {
|
|
if (bArr.length == i + 6) {
|
|
this.nc = i;
|
|
this.dataOffset = 5;
|
|
int i2 = bArr[bArr.length - 1] & UnsignedBytes.MAX_VALUE;
|
|
this.ne = i2 != 0 ? i2 : 256;
|
|
return;
|
|
}
|
|
StringBuilder sb = new StringBuilder("Invalid APDU: length=");
|
|
sb.append(this.apdu.length);
|
|
sb.append(", b1=");
|
|
sb.append(i);
|
|
throw new IllegalArgumentException(sb.toString());
|
|
}
|
|
}
|
|
if (bArr.length < 7) {
|
|
StringBuilder sb2 = new StringBuilder("Invalid APDU: length=");
|
|
sb2.append(this.apdu.length);
|
|
sb2.append(", b1=");
|
|
sb2.append(i);
|
|
throw new IllegalArgumentException(sb2.toString());
|
|
}
|
|
int i3 = ((bArr[5] & UnsignedBytes.MAX_VALUE) << 8) | (bArr[6] & UnsignedBytes.MAX_VALUE);
|
|
if (bArr.length == 7) {
|
|
if (i3 == 0) {
|
|
i3 = 65536;
|
|
}
|
|
this.ne = i3;
|
|
return;
|
|
}
|
|
if (i3 == 0) {
|
|
StringBuilder sb3 = new StringBuilder("Invalid APDU: length=");
|
|
sb3.append(this.apdu.length);
|
|
sb3.append(", b1=");
|
|
sb3.append(i);
|
|
sb3.append(", b2||b3=");
|
|
sb3.append(i3);
|
|
throw new IllegalArgumentException(sb3.toString());
|
|
}
|
|
if (bArr.length == i3 + 7) {
|
|
this.nc = i3;
|
|
this.dataOffset = 7;
|
|
return;
|
|
}
|
|
if (bArr.length == i3 + 9) {
|
|
this.nc = i3;
|
|
this.dataOffset = 7;
|
|
int length = bArr.length;
|
|
int i4 = (bArr[length - 1] & UnsignedBytes.MAX_VALUE) | ((bArr[length - 2] & UnsignedBytes.MAX_VALUE) << 8);
|
|
this.ne = i4 != 0 ? i4 : 65536;
|
|
return;
|
|
}
|
|
StringBuilder sb4 = new StringBuilder("Invalid APDU: length=");
|
|
sb4.append(this.apdu.length);
|
|
sb4.append(", b1=");
|
|
sb4.append(i);
|
|
sb4.append(", b2||b3=");
|
|
sb4.append(i3);
|
|
throw new IllegalArgumentException(sb4.toString());
|
|
}
|
|
|
|
public CommandAPDU(int i, int i2, int i3, int i4, byte[] bArr, int i5, int i6, int i7) {
|
|
byte b;
|
|
checkArrayBounds(bArr, i5, i6);
|
|
if (i6 > 65535) {
|
|
throw new IllegalArgumentException("dataLength is too large");
|
|
}
|
|
if (i7 < 0) {
|
|
throw new IllegalArgumentException("ne must not be negative");
|
|
}
|
|
if (i7 > 65536) {
|
|
throw new IllegalArgumentException("ne is too large");
|
|
}
|
|
this.ne = i7;
|
|
this.nc = i6;
|
|
if (i6 == 0) {
|
|
if (i7 == 0) {
|
|
this.apdu = new byte[4];
|
|
setHeader(i, i2, i3, i4);
|
|
return;
|
|
}
|
|
if (i7 <= 256) {
|
|
r10 = i7 != 256 ? (byte) i7 : (byte) 0;
|
|
this.apdu = new byte[5];
|
|
setHeader(i, i2, i3, i4);
|
|
this.apdu[4] = r10;
|
|
return;
|
|
}
|
|
if (i7 == 65536) {
|
|
b = 0;
|
|
} else {
|
|
r10 = (byte) (i7 >> 8);
|
|
b = (byte) i7;
|
|
}
|
|
this.apdu = new byte[7];
|
|
setHeader(i, i2, i3, i4);
|
|
byte[] bArr2 = this.apdu;
|
|
bArr2[5] = r10;
|
|
bArr2[6] = b;
|
|
return;
|
|
}
|
|
if (i7 == 0) {
|
|
if (i6 <= 255) {
|
|
this.apdu = new byte[i6 + 5];
|
|
setHeader(i, i2, i3, i4);
|
|
byte[] bArr3 = this.apdu;
|
|
bArr3[4] = (byte) i6;
|
|
this.dataOffset = 5;
|
|
System.arraycopy(bArr, i5, bArr3, 5, i6);
|
|
return;
|
|
}
|
|
this.apdu = new byte[i6 + 7];
|
|
setHeader(i, i2, i3, i4);
|
|
byte[] bArr4 = this.apdu;
|
|
bArr4[4] = 0;
|
|
bArr4[5] = (byte) (i6 >> 8);
|
|
bArr4[6] = (byte) i6;
|
|
this.dataOffset = 7;
|
|
System.arraycopy(bArr, i5, bArr4, 7, i6);
|
|
return;
|
|
}
|
|
if (i6 <= 255 && i7 <= 256) {
|
|
this.apdu = new byte[i6 + 6];
|
|
setHeader(i, i2, i3, i4);
|
|
byte[] bArr5 = this.apdu;
|
|
bArr5[4] = (byte) i6;
|
|
this.dataOffset = 5;
|
|
System.arraycopy(bArr, i5, bArr5, 5, i6);
|
|
this.apdu[r1.length - 1] = i7 != 256 ? (byte) i7 : (byte) 0;
|
|
return;
|
|
}
|
|
this.apdu = new byte[i6 + 9];
|
|
setHeader(i, i2, i3, i4);
|
|
byte[] bArr6 = this.apdu;
|
|
bArr6[4] = 0;
|
|
bArr6[5] = (byte) (i6 >> 8);
|
|
bArr6[6] = (byte) i6;
|
|
this.dataOffset = 7;
|
|
System.arraycopy(bArr, i5, bArr6, 7, i6);
|
|
if (i7 != 65536) {
|
|
byte[] bArr7 = this.apdu;
|
|
int length = bArr7.length;
|
|
bArr7[length - 2] = (byte) (i7 >> 8);
|
|
bArr7[length - 1] = (byte) i7;
|
|
}
|
|
}
|
|
|
|
private void setHeader(int i, int i2, int i3, int i4) {
|
|
byte[] bArr = this.apdu;
|
|
bArr[0] = (byte) i;
|
|
bArr[1] = (byte) i2;
|
|
bArr[2] = (byte) i3;
|
|
bArr[3] = (byte) i4;
|
|
}
|
|
|
|
public final int getCLA() {
|
|
return this.apdu[0] & UnsignedBytes.MAX_VALUE;
|
|
}
|
|
|
|
public final int getINS() {
|
|
return this.apdu[1] & UnsignedBytes.MAX_VALUE;
|
|
}
|
|
|
|
public final int getP1() {
|
|
return this.apdu[2] & UnsignedBytes.MAX_VALUE;
|
|
}
|
|
|
|
public final int getP2() {
|
|
return this.apdu[3] & UnsignedBytes.MAX_VALUE;
|
|
}
|
|
|
|
public final byte[] getData() {
|
|
int i = this.nc;
|
|
byte[] bArr = new byte[i];
|
|
System.arraycopy(this.apdu, this.dataOffset, bArr, 0, i);
|
|
return bArr;
|
|
}
|
|
|
|
public final byte[] getBytes() {
|
|
return (byte[]) this.apdu.clone();
|
|
}
|
|
|
|
public final String toString() {
|
|
StringBuilder sb = new StringBuilder("CommmandAPDU: ");
|
|
sb.append(this.apdu.length);
|
|
sb.append(" bytes, nc=");
|
|
sb.append(this.nc);
|
|
sb.append(", ne=");
|
|
sb.append(this.ne);
|
|
return sb.toString();
|
|
}
|
|
|
|
public final boolean equals(Object obj) {
|
|
if (this == obj) {
|
|
return true;
|
|
}
|
|
if (obj instanceof CommandAPDU) {
|
|
return Arrays.equals(this.apdu, ((CommandAPDU) obj).apdu);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public final int hashCode() {
|
|
return Arrays.hashCode(this.apdu);
|
|
}
|
|
|
|
private void readObject(ObjectInputStream objectInputStream) throws IOException, ClassNotFoundException {
|
|
this.apdu = (byte[]) objectInputStream.readUnshared();
|
|
parse();
|
|
}
|
|
|
|
public final int getNe() {
|
|
return this.ne;
|
|
}
|
|
|
|
public final int getNc() {
|
|
return this.nc;
|
|
}
|
|
}
|