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
5 changes: 4 additions & 1 deletion HAL/keymaster/4.1/CborConverter.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -297,10 +297,13 @@ bool CborConverter::getHmacSharingParameters(const std::unique_ptr<Item>& item,

bool CborConverter::addVerificationToken(Array& array, const VerificationToken&
verificationToken) {
std::vector<uint8_t> encodedParamsVerified;
Array vToken;
vToken.add(verificationToken.challenge);
vToken.add(verificationToken.timestamp);
addKeyparameters(vToken, verificationToken.parametersVerified);
//addKeyparameters(vToken, verificationToken.parametersVerified);
/* TODO Need to get proper encodedParamsVerified */
vToken.add(std::move(encodedParamsVerified));
vToken.add(static_cast<uint64_t>(verificationToken.securityLevel));
vToken.add((std::vector<uint8_t>(verificationToken.mac)));
array.add(std::move(vToken));
Expand Down
1 change: 1 addition & 0 deletions HAL/keymaster/4.1/JavacardOperationContext.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -67,6 +67,7 @@ ErrorCode OperationContext::setOperationInfo(uint64_t operationHandle, KeyPurpos
ErrorCode OperationContext::setOperationInfo(uint64_t operationHandle, OperationInfo& operInfo) {
OperationData data;
data.info = operInfo;
memset((void*)&(data.data), 0x00, sizeof(data.data));
operationTable[operationHandle] = data;
return ErrorCode::OK;
}
Expand Down
117 changes: 58 additions & 59 deletions HAL/keymaster/include/JavacardOperationContext.h
Original file line numberDiff line numberDiff line change
Expand Up@@ -42,7 +42,7 @@ enum class Operation;

struct BufferedData {
uint8_t buf[MAX_BUF_SIZE];
int buf_len;
size_t buf_len;
};

struct OperationInfo {
Expand DownExpand Up@@ -86,64 +86,63 @@ class OperationContext {
ErrorCode internalUpdate(uint64_t operHandle, uint8_t* input, size_t input_len, Operation opr, std::vector<uint8_t>&
out);
ErrorCode handleInternalUpdate(uint64_t operHandle, uint8_t* data, size_t len, Operation opr,
sendDataToSE_cb cb, bool finish=false) {
ErrorCode errorCode = ErrorCode::OK;
std::vector<uint8_t> out;
OperationData oprData;

if(ErrorCode::OK != (errorCode = getOperationData(operHandle, oprData))) {
return errorCode;
}

if(Algorithm::AES == oprData.info.alg || Algorithm::TRIPLE_DES == oprData.info.alg) {
if(ErrorCode::OK != (errorCode = internalUpdate(operHandle, data, len,
opr, out))) {
return errorCode;
}

if(ErrorCode::OK != (errorCode = cb(out, finish))) {
return errorCode;
}
} else {
if(oprData.info.digest == Digest::NONE) {
if(finish) {
for(int i = 0; i < oprData.data.buf_len; ++i) {
out[i] = oprData.data.buf[i];
}
if(ErrorCode::OK != (errorCode = cb(out, finish))) {
return errorCode;
}
} else {
/* For RSA/EC algorithms just do buffering, don't send data to SE in update.
* input message length should not be more than the MAX_BUF_SIZE.
*/
if(oprData.data.buf_len <= MAX_BUF_SIZE) {
size_t bufIndex = oprData.data.buf_len;
size_t pos = 0;
for(; (pos < len) && (pos < (MAX_BUF_SIZE-bufIndex)); pos++)
{
oprData.data.buf[bufIndex+pos] = data[pos];
}
oprData.data.buf_len += pos;
}
}
} else {
for(size_t j=0; j < len; ++j)
{
out[j] = data[j];
}
/* if len=0, then no need to call the callback, since there is no information to be send to javacard,
* but if finish flag is true irrespective of len callback should be called.
*/
if(len != 0 || finish) {
if(ErrorCode::OK != (errorCode = cb(out, finish))) {
return errorCode;
}
}
}
}
return errorCode;
}
sendDataToSE_cb cb, bool finish=false) {
ErrorCode errorCode = ErrorCode::OK;
std::vector<uint8_t> out;

if(Algorithm::AES == operationTable[operHandle].info.alg ||
Algorithm::TRIPLE_DES == operationTable[operHandle].info.alg) {
if(ErrorCode::OK != (errorCode = internalUpdate(operHandle, data, len,
opr, out))) {
return errorCode;
}

if(ErrorCode::OK != (errorCode = cb(out, finish))) {
return errorCode;
}
} else {
/* Asymmetric */
if(operationTable[operHandle].info.purpose == KeyPurpose::DECRYPT ||
operationTable[operHandle].info.digest == Digest::NONE) {
/* In case of Decrypt, sign with no digest cases buffer the data in
* update call and send data to SE in finish call.
*/
if(finish) {
for(size_t i = 0; i < operationTable[operHandle].data.buf_len; ++i) {
out.push_back(operationTable[operHandle].data.buf[i]);
}
if(ErrorCode::OK != (errorCode = cb(out, finish))) {
return errorCode;
}
} else {
//Input message length should not be more than the MAX_BUF_SIZE.
if(operationTable[operHandle].data.buf_len <= MAX_BUF_SIZE) {
size_t bufIndex = operationTable[operHandle].data.buf_len;
size_t pos = 0;
for(; (pos < len) && (pos < (MAX_BUF_SIZE-bufIndex)); pos++)
{
operationTable[operHandle].data.buf[bufIndex+pos] = data[pos];
}
operationTable[operHandle].data.buf_len += pos;
}
}
} else {
for(size_t j=0; j < len; ++j)
{
out.push_back(data[j]);
}
/* if len=0, then no need to call the callback, since there is no information to be send to javacard,
* but if finish flag is true irrespective of length the callback should be called.
*/
if(len != 0 || finish) {
if(ErrorCode::OK != (errorCode = cb(out, finish))) {
return errorCode;
}
}
}
}
return errorCode;
}
};

} // namespace javacard
Expand Down