From abe6e2712fb887b8a1a2cec07fea43c4b8c4377f Mon Sep 17 00:00:00 2001 From: BKSSM Venkateswarlu Date: Thu, 18 Jun 2020 16:29:49 +0530 Subject: [PATCH] Fixed the issues observed while running vts test case EncryptionOperationsTest#RsaNoPaddingShortMessage. --- HAL/keymaster/4.1/CborConverter.cpp | 5 +- .../4.1/JavacardOperationContext.cpp | 1 + .../include/JavacardOperationContext.h | 117 +++++++++--------- 3 files changed, 63 insertions(+), 60 deletions(-) diff --git a/HAL/keymaster/4.1/CborConverter.cpp b/HAL/keymaster/4.1/CborConverter.cpp index c0643ed8..e7217c2d 100644 --- a/HAL/keymaster/4.1/CborConverter.cpp +++ b/HAL/keymaster/4.1/CborConverter.cpp @@ -297,10 +297,13 @@ bool CborConverter::getHmacSharingParameters(const std::unique_ptr& item, bool CborConverter::addVerificationToken(Array& array, const VerificationToken& verificationToken) { + std::vector 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(verificationToken.securityLevel)); vToken.add((std::vector(verificationToken.mac))); array.add(std::move(vToken)); diff --git a/HAL/keymaster/4.1/JavacardOperationContext.cpp b/HAL/keymaster/4.1/JavacardOperationContext.cpp index 0e1de44c..b37b4a18 100644 --- a/HAL/keymaster/4.1/JavacardOperationContext.cpp +++ b/HAL/keymaster/4.1/JavacardOperationContext.cpp @@ -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; } diff --git a/HAL/keymaster/include/JavacardOperationContext.h b/HAL/keymaster/include/JavacardOperationContext.h index f5e78a9c..d78b1aea 100644 --- a/HAL/keymaster/include/JavacardOperationContext.h +++ b/HAL/keymaster/include/JavacardOperationContext.h @@ -42,7 +42,7 @@ enum class Operation; struct BufferedData { uint8_t buf[MAX_BUF_SIZE]; - int buf_len; + size_t buf_len; }; struct OperationInfo { @@ -86,64 +86,63 @@ class OperationContext { ErrorCode internalUpdate(uint64_t operHandle, uint8_t* input, size_t input_len, Operation opr, std::vector& 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 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 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