Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 12 additions & 20 deletions Applet/src/com/android/javacard/keymaster/KMBignumTag.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,11 +30,6 @@ public class KMBignumTag extends KMTag {

private static KMBignumTag prototype;

// The allowed tag keys of type bool tag
private static final short[] tags = {
CERTIFICATE_SERIAL_NUM,
};

private KMBignumTag() {
}

Expand All@@ -56,15 +51,8 @@ public static short exp() {
return ptr;
}

public static short instance(short key) {
if (!validateKey(key)) {
ISOException.throwIt(ISO7816.SW_DATA_INVALID);
}
return instance(key, KMByteBlob.exp());
}

public static short instance(short key, short byteBlob) {
if (!validateKey(key)) {
if (!validateKey(key, byteBlob)) {
ISOException.throwIt(ISO7816.SW_DATA_INVALID);
}
if (heap[byteBlob] != BYTE_BLOB_TYPE) {
Expand DownExpand Up@@ -104,13 +92,17 @@ public short length() {
return KMByteBlob.cast(blobPtr).length();
}

private static boolean validateKey(short key) {
short index = (short) tags.length;
while (--index >= 0) {
if (tags[index] == key) {
return true;
}
private static boolean validateKey(short key, short byteBlob) {
short valueLen = KMByteBlob.cast(byteBlob).length();
switch (key) {
case CERTIFICATE_SERIAL_NUM:
if (valueLen > MAX_CERTIFICATE_SERIAL_SIZE) {
return false;
}
break;
default:
return false;
}
return false;
return true;
}
}
84 changes: 40 additions & 44 deletions Applet/src/com/android/javacard/keymaster/KMByteTag.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -30,34 +30,6 @@ public class KMByteTag extends KMTag {

private static KMByteTag prototype;

// MAX ApplicationID or Application Data size
public static final short MAX_APP_ID_APP_DATA_SIZE = 64;

// The allowed tag keys of type bool tag
private static final short[] tags = {
APPLICATION_ID,
APPLICATION_DATA,
ROOT_OF_TRUST,
UNIQUE_ID,
ATTESTATION_CHALLENGE,
ATTESTATION_APPLICATION_ID,
ATTESTATION_ID_BRAND,
ATTESTATION_ID_DEVICE,
ATTESTATION_ID_PRODUCT,
ATTESTATION_ID_SERIAL,
ATTESTATION_ID_IMEI,
ATTESTATION_ID_MEID,
ATTESTATION_ID_MANUFACTURER,
ATTESTATION_ID_MODEL,
ASSOCIATED_DATA,
NONCE,
CONFIRMATION_TOKEN,
VERIFIED_BOOT_KEY,
VERIFIED_BOOT_HASH,
CERTIFICATE_SERIAL_NUM,
CERTIFICATE_SUBJECT_NAME,
};

private KMByteTag() {
}

Expand DownExpand Up@@ -104,35 +76,59 @@ public static KMByteTag cast(short ptr) {
}

public short getKey() {
return Util.getShort(heap, (short) (KMType.instanceTable[KM_BYTE_TAG_OFFSET] + TLV_HEADER_SIZE + 2));
return Util.getShort(heap,
(short) (KMType.instanceTable[KM_BYTE_TAG_OFFSET] + TLV_HEADER_SIZE + 2));
}

public short getTagType() {
return KMType.BYTES_TAG;
}

public short getValue() {
return Util.getShort(heap, (short) (KMType.instanceTable[KM_BYTE_TAG_OFFSET] + TLV_HEADER_SIZE + 4));
return Util.getShort(heap,
(short) (KMType.instanceTable[KM_BYTE_TAG_OFFSET] + TLV_HEADER_SIZE + 4));
}

public short length() {
short blobPtr = Util.getShort(heap, (short) (KMType.instanceTable[KM_BYTE_TAG_OFFSET] + TLV_HEADER_SIZE + 4));
short blobPtr = Util.getShort(heap,
(short) (KMType.instanceTable[KM_BYTE_TAG_OFFSET] + TLV_HEADER_SIZE + 4));
return KMByteBlob.cast(blobPtr).length();
}

private static boolean validateKey(short key, short keyBlob) {
boolean result = false;
short index = (short) tags.length;
while (--index >= 0) {
if (tags[index] == key) {
result = true;
if(key == APPLICATION_ID || key == APPLICATION_DATA) {
if (KMByteBlob.cast(keyBlob).length() > MAX_APP_ID_APP_DATA_SIZE) {
result = false;
}
}
break;
}
private static boolean validateKey(short key, short byteBlob) {
short valueLen = KMByteBlob.cast(byteBlob).length();
switch (key) {
case ROOT_OF_TRUST:
case UNIQUE_ID:
case ATTESTATION_APPLICATION_ID:
case ATTESTATION_ID_BRAND:
case ATTESTATION_ID_DEVICE:
case ATTESTATION_ID_PRODUCT:
case ATTESTATION_ID_SERIAL:
case ATTESTATION_ID_IMEI:
case ATTESTATION_ID_MEID:
case ATTESTATION_ID_MANUFACTURER:
case ATTESTATION_ID_MODEL:
case ASSOCIATED_DATA:
case NONCE:
case CONFIRMATION_TOKEN:
case VERIFIED_BOOT_KEY:
case VERIFIED_BOOT_HASH:
case CERTIFICATE_SUBJECT_NAME:
break;
case APPLICATION_ID:
case APPLICATION_DATA:
if (valueLen > MAX_APP_ID_APP_DATA_SIZE) {
return false;
}
break;
case ATTESTATION_CHALLENGE:
if (valueLen > MAX_ATTESTATION_CHALLENGE_SIZE) {
return false;
}
break;
default:
return false;
}
return result;
}
Expand Down
Loading