Skip to content
This repository was archived by the owner on May 24, 2026. It is now read-only.
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
Original file line numberDiff line numberDiff line change
Expand Up@@ -1226,16 +1226,14 @@ private short getProvisionDataBufferOffset(byte dataType) {
}
return 0;
}

private void persistProvisionData(byte[] buf, short off, short len, short maxSize, short copyToOff) {
if (len > maxSize) {
KMException.throwIt(KMError.INVALID_INPUT_LENGTH);
}
JCSystem.beginTransaction();
Util.arrayCopyNonAtomic(buf, off, provisionData, Util.setShort(provisionData, copyToOff, len), len);
JCSystem.commitTransaction();
Util.arrayCopy(buf, off, provisionData, Util.setShort(provisionData, copyToOff, len), len);
}

private void persistCertificateChain(byte[] certChain, short certChainOff, short certChainLen) {
persistProvisionData(certChain, certChainOff, certChainLen,
KMConfigurations.CERT_CHAIN_MAX_SIZE, CERT_CHAIN_OFFSET);
Expand DownExpand Up@@ -1264,9 +1262,7 @@ public void persistProvisionData(byte[] buffer, short certChainOff, short certCh
// Next single byte holds the byte string header.
// Next 3 bytes holds the total length of the certificate chain.
// clear buffer.
JCSystem.beginTransaction();
Util.arrayFillNonAtomic(provisionData, (short) 0, (short) provisionData.length, (byte) 0);
JCSystem.commitTransaction();
Util.arrayFill(provisionData, (short) 0, (short) provisionData.length, (byte) 0);
// Persist data.
persistCertificateChain(buffer, certChainOff, certChainLen);
persistCertficateIssuer(buffer, certIssuerOff, certIssuerLen);
Expand Down
49 changes: 31 additions & 18 deletions Applet/src/com/android/javacard/keymaster/KMRepository.java
Original file line numberDiff line numberDiff line change
Expand Up@@ -509,19 +509,15 @@ private void writeDataEntry(byte bufType, short id, byte[] buf, short offset, sh
JCSystem.beginTransaction();
Util.setShort(dataTable, (short) (id + DATA_INDEX_ENTRY_OFFSET), dataPtr);
Util.setShort(dataTable, (short) (id + DATA_INDEX_ENTRY_LENGTH), len);
Util.arrayCopyNonAtomic(buf, offset, dataTable, dataPtr, len);
JCSystem.commitTransaction();
// End Transaction
Util.arrayCopy(buf, offset, dataTable, dataPtr, len);
} else {
if (len != dataLen) {
KMException.throwIt(KMError.UNKNOWN_ERROR);
}
dataPtr = Util.getShort(dataTable, (short) (id + DATA_INDEX_ENTRY_OFFSET));
// Begin Transaction
JCSystem.beginTransaction();
Util.arrayCopyNonAtomic(buf, offset, dataTable, dataPtr, len);
JCSystem.commitTransaction();
// End Transaction
Util.arrayCopy(buf, offset, dataTable, dataPtr, len);
}
}

Expand All@@ -535,7 +531,11 @@ public byte[] getHeap() {
}

public short getHmacNonce() {
return readData(HMAC_NONCE);
short blob = readData(HMAC_NONCE);
if (blob == KMType.INVALID_VALUE) {
KMException.throwIt(KMError.INVALID_DATA);
}
return blob;
}

public short getComputedHmacKey() {
Expand DownExpand Up@@ -598,8 +598,9 @@ public short getOsVersion() {
return KMInteger.uint_32(
KMByteBlob.cast(blob).getBuffer(), KMByteBlob.cast(blob).getStartOff());
} else {
return KMInteger.uint_32(zero, (short) 0);
KMException.throwIt(KMError.INVALID_DATA);
}
return KMType.INVALID_VALUE;
}

public short getVendorPatchLevel() {
Expand All@@ -608,8 +609,9 @@ public short getVendorPatchLevel() {
return KMInteger.uint_32(
KMByteBlob.cast(blob).getBuffer(), KMByteBlob.cast(blob).getStartOff());
} else {
return KMInteger.uint_32(zero, (short) 0);
KMException.throwIt(KMError.INVALID_DATA);
}
return KMType.INVALID_VALUE;
}

public short getBootPatchLevel() {
Expand All@@ -618,8 +620,9 @@ public short getBootPatchLevel() {
return KMInteger.uint_32(
KMByteBlob.cast(blob).getBuffer(), KMByteBlob.cast(blob).getStartOff());
} else {
return KMInteger.uint_32(zero, (short) 0);
KMException.throwIt(KMError.INVALID_DATA);
}
return KMType.INVALID_VALUE;
}

public short getOsPatch() {
Expand All@@ -628,15 +631,16 @@ public short getOsPatch() {
return KMInteger.uint_32(
KMByteBlob.cast(blob).getBuffer(), KMByteBlob.cast(blob).getStartOff());
} else {
return KMInteger.uint_32(zero, (short) 0);
KMException.throwIt(KMError.INVALID_DATA);
}
return KMType.INVALID_VALUE;
}

public short readROT(short version) {
short totalLength = 0;
short length = dataLength(BOOT_VERIFIED_BOOT_KEY);
if (length == 0) {
return KMType.INVALID_VALUE;
KMException.throwIt(KMError.INVALID_DATA);
}
totalLength += length;
// As per specification The root of trust
Expand All@@ -646,16 +650,16 @@ public short readROT(short version) {
// the root of trust.

if ((length = dataLength(BOOT_VERIFIED_BOOT_HASH)) == 0) {
return KMType.INVALID_VALUE;
KMException.throwIt(KMError.INVALID_DATA);
}
totalLength += length;
}
if ((length = dataLength(BOOT_VERIFIED_BOOT_STATE)) == 0) {
return KMType.INVALID_VALUE;
KMException.throwIt(KMError.INVALID_DATA);
}
totalLength += length;
if ((length = dataLength(BOOT_DEVICE_LOCKED_STATUS)) == 0) {
return KMType.INVALID_VALUE;
KMException.throwIt(KMError.INVALID_DATA);
}
totalLength += length;

Expand All@@ -679,11 +683,19 @@ public short readROT(short version) {
}

public short getVerifiedBootKey() {
return readData(BOOT_VERIFIED_BOOT_KEY);
short blob = readData(BOOT_VERIFIED_BOOT_KEY);
if (blob == KMType.INVALID_VALUE) {
KMException.throwIt(KMError.INVALID_DATA);
}
return blob;
}

public short getVerifiedBootHash() {
return readData(BOOT_VERIFIED_BOOT_HASH);
short blob = readData(BOOT_VERIFIED_BOOT_HASH);
if (blob == KMType.INVALID_VALUE) {
KMException.throwIt(KMError.INVALID_DATA);
}
return blob;
}

public boolean getBootLoaderLock() {
Expand DownExpand Up@@ -724,8 +736,9 @@ public short getDeviceTimeStamp() {
return KMInteger.uint_64(KMByteBlob.cast(blob).getBuffer(),
KMByteBlob.cast(blob).getStartOff());
} else {
return KMInteger.uint_64(zero, (short) 0);
KMException.throwIt(KMError.INVALID_DATA);
}
return blob;
}

public void setOsVersion(byte[] buf, short start, short len) {
Expand Down