Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
308911b
Merge pull request #68 from BKSSMVenkateswarlu/jc_keymaster_41_androi…
BKSSMVenkateswarlu Apr 16, 2021
e1cae02
Move operationtable to RAM and notifiy back to HAL about se reset
Apr 16, 2021
db72f53
Handle the reset event from Applet
Apr 16, 2021
9d922da
Move operationtable to RAM
Apr 16, 2021
eb1c2c6
Card Reset change
Apr 19, 2021
12ae971
Added a new test case to test the card reset functionality
Apr 19, 2021
88bf1e6
Added a new test case to test reset events
Apr 19, 2021
8f46ec6
Updated the unit test
Apr 19, 2021
7537836
updated the unittest
Apr 19, 2021
6c445f0
Fixed the issue observed while executing vts
Apr 20, 2021
5dd4508
Added comment and fixed one issue
Apr 20, 2021
4884c98
Clear the operation data associated with operation handle
Apr 21, 2021
a53f8e7
1. Handled the reset event in provision tool.
Apr 22, 2021
891bb86
Corrected the testcase
Apr 22, 2021
fe547ac
Added logs for reset event
Apr 26, 2021
ff365d2
Addressed review comments in the Applet code
Apr 27, 2021
f57570b
renamed the function names appropriately
Apr 28, 2021
7867add
Updated the comment
Apr 28, 2021
febc040
Renamed canary bit name to power reset status
Apr 28, 2021
c9656fd
renamed function and variables names appropriately
Apr 28, 2021
5a10d4f
renamed function names and added comments.
Apr 28, 2021
806bbc4
variable names changed properly
Apr 28, 2021
34d0f79
Merge pull request #36 from BKSSMVenkateswarlu/jc_keymaster_41_androi…
mdwivedi Apr 28, 2021
190f9d2
Merge pull request #70 from divegeek/jc_keymaster_41_android_11
BKSSMVenkateswarlu Apr 29, 2021
86f1cce
Fixed the failure in Unittest
Apr 29, 2021
1be6a40
Fixed the erros after merging branch
Apr 29, 2021
e83ce6b
Allow checking of boot signal event for setting boot parameters only …
Apr 29, 2021
441bad1
Merge pull request #39 from BKSSMVenkateswarlu/jc_keymaster_41_androi…
mdwivedi Apr 29, 2021
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 number Diff line number Diff line change
Expand Up @@ -416,20 +416,23 @@ private Object getInstanceFromPool(Object[] pool, byte alg) {
return object;
}

private void releaseInstance(Object[] pool, short index) {
if (((KMInstance) pool[index]).reserved != 0) {
JCSystem.beginTransaction();
((KMInstance) pool[index]).reserved = 0;
JCSystem.commitTransaction();
}
}

private void releaseInstance(Object[] pool, Object object) {
short index = 0;
short len = (short) pool.length;
while (index < len) {
if (pool[index] != null) {
if (object == ((KMInstance) pool[index]).object) {
JCSystem.beginTransaction();
((KMInstance) pool[index]).reserved = 0;
JCSystem.commitTransaction();
releaseInstance(pool, index);
break;
}
} else {
// Reached end.
break;
}
index++;
}
Expand Down Expand Up @@ -1275,4 +1278,22 @@ public KMAttestationKey getAttestationKey() {
public KMPreSharedKey getPresharedKey() {
return (KMPreSharedKey) preSharedKey;
}

private void releasePool(Object[] pool) {
short index = 0;
short len = (short) pool.length;
while (index < len) {
if (pool[index] != null) {
releaseInstance(pool, index);
}
index++;
}
}

@Override
public void releaseAllOperations() {
releasePool(cipherPool);
releasePool(sigPool);
releasePool(operationPool);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,6 @@

public class KMOperationImpl implements KMOperation {

private Cipher cipher;
private Signature signature;
private static final short CIPHER_ALG_OFFSET = 0x00;
private static final short PADDING_OFFSET = 0x01;
private static final short OPER_MODE_OFFSET = 0x02;
Expand All @@ -34,9 +32,12 @@ public class KMOperationImpl implements KMOperation {
//Java Card after the GCM update operation.
private static final short AES_GCM_UPDATE_LEN_OFFSET = 0x05;
private short[] parameters;
// Either one of Cipher/Signature instance is stored.
private Object[] operationInst;

public KMOperationImpl() {
parameters = JCSystem.makeTransientShortArray((short) 6, JCSystem.CLEAR_ON_RESET);
operationInst = JCSystem.makeTransientObjectArray((short) 1, JCSystem.CLEAR_ON_RESET);
}

public short getMode() {
Expand Down Expand Up @@ -80,19 +81,15 @@ public void setCipherAlgorithm(short cipherAlg) {
}

public void setCipher(Cipher cipher) {
JCSystem.beginTransaction();
this.cipher = cipher;
JCSystem.commitTransaction();
operationInst[0] = cipher;
}

public void setSignature(Signature signer) {
JCSystem.beginTransaction();
this.signature = signer;
JCSystem.commitTransaction();
operationInst[0] = signer;
}

private void resetCipher() {
setCipher(null);
operationInst[0] = null;
parameters[MAC_LENGTH_OFFSET] = 0;
parameters[AES_GCM_UPDATE_LEN_OFFSET] = 0;
parameters[BLOCK_MODE_OFFSET] = 0;
Expand All @@ -104,7 +101,7 @@ private void resetCipher() {
@Override
public short update(byte[] inputDataBuf, short inputDataStart,
short inputDataLength, byte[] outputDataBuf, short outputDataStart) {
short len = cipher.update(inputDataBuf, inputDataStart, inputDataLength,
short len = ((Cipher) operationInst[0]).update(inputDataBuf, inputDataStart, inputDataLength,
outputDataBuf, outputDataStart);
if (parameters[CIPHER_ALG_OFFSET] == KMType.AES && parameters[BLOCK_MODE_OFFSET] == KMType.GCM) {
// Every time Block size data is stored as intermediate result.
Expand All @@ -116,14 +113,15 @@ public short update(byte[] inputDataBuf, short inputDataStart,
@Override
public short update(byte[] inputDataBuf, short inputDataStart,
short inputDataLength) {
signature.update(inputDataBuf, inputDataStart, inputDataLength);
((Signature) operationInst[0]).update(inputDataBuf, inputDataStart, inputDataLength);
return 0;
}

@Override
public short finish(byte[] inputDataBuf, short inputDataStart,
short inputDataLen, byte[] outputDataBuf, short outputDataStart) {
byte[] tmpArray = KMAndroidSEProvider.getInstance().tmpArray;
Cipher cipher = (Cipher) operationInst[0];
short cipherAlg = parameters[CIPHER_ALG_OFFSET];
short blockMode = parameters[BLOCK_MODE_OFFSET];
short mode = parameters[OPER_MODE_OFFSET];
Expand Down Expand Up @@ -209,11 +207,11 @@ public short sign(byte[] inputDataBuf, short inputDataStart,
short inputDataLength, byte[] signBuf, short signStart) {
short len = 0;
try {
len = signature.sign(inputDataBuf, inputDataStart, inputDataLength,
len = ((Signature) operationInst[0]).sign(inputDataBuf, inputDataStart, inputDataLength,
signBuf, signStart);
} finally {
KMAndroidSEProvider.getInstance().releaseSignatureInstance(signature);
setSignature(null);
KMAndroidSEProvider.getInstance().releaseSignatureInstance((Signature) operationInst[0]);
operationInst[0] = null;
}
return len;
}
Expand All @@ -223,31 +221,33 @@ public boolean verify(byte[] inputDataBuf, short inputDataStart,
short inputDataLength, byte[] signBuf, short signStart, short signLength) {
boolean ret = false;
try {
ret = signature.verify(inputDataBuf, inputDataStart, inputDataLength,
ret = ((Signature) operationInst[0]).verify(inputDataBuf, inputDataStart, inputDataLength,
signBuf, signStart, signLength);
} finally {
KMAndroidSEProvider.getInstance().releaseSignatureInstance(signature);
setSignature(null);
KMAndroidSEProvider.getInstance().releaseSignatureInstance((Signature) operationInst[0]);
operationInst[0] = null;
}
return ret;
}

@Override
public void abort() {
if (cipher != null) {
KMAndroidSEProvider.getInstance().releaseCipherInstance(cipher);
resetCipher();
}
if (signature != null) {
KMAndroidSEProvider.getInstance().releaseSignatureInstance(signature);
setSignature(null);
if (operationInst[0] != null) {
if (parameters[OPER_MODE_OFFSET] == KMType.ENCRYPT ||
parameters[OPER_MODE_OFFSET] == KMType.DECRYPT) {
KMAndroidSEProvider.getInstance().releaseCipherInstance((Cipher) operationInst[0]);
resetCipher();
} else {
KMAndroidSEProvider.getInstance().releaseSignatureInstance((Signature) operationInst[0]);
}
operationInst[0] = null;
}
KMAndroidSEProvider.getInstance().releaseOperationInstance(this);
}

@Override
public void updateAAD(byte[] dataBuf, short dataStart, short dataLength) {
((AEADCipher) cipher).updateAAD(dataBuf, dataStart, dataLength);
((AEADCipher) operationInst[0]).updateAAD(dataBuf, dataStart, dataLength);
}

@Override
Expand All @@ -258,4 +258,4 @@ public short getAESGCMOutputSize(short dataSize, short macLength) {
return (short) (parameters[AES_GCM_UPDATE_LEN_OFFSET] + dataSize - macLength);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1315,4 +1315,9 @@ public KMAttestationKey getAttestationKey() {
public KMPreSharedKey getPresharedKey() {
return (KMPreSharedKey) preSharedKey;
}

@Override
public void releaseAllOperations() {
//Do nothing.
}
}
Loading