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
4 changes: 2 additions & 2 deletions HAL/keymaster/4.1/CborConverter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,7 @@ bool CborConverter::getMultiBinaryArray(const std::unique_ptr<Item>& item, const
}

bool CborConverter::getBinaryArray(const std::unique_ptr<Item>& item, const uint32_t pos,
::android::hardware::hidl_vec<uint8_t>& value) {
::android::hardware::hidl_vec<uint8_t>& value) {
bool ret = false;
std::unique_ptr<Item> strItem(nullptr);
getItemAtPos(item, pos, strItem);
Expand All @@ -259,7 +259,7 @@ ::android::hardware::hidl_vec<uint8_t>& value) {
}

bool CborConverter::getBinaryArray(const std::unique_ptr<Item>& item, const uint32_t pos,
::android::hardware::hidl_string& value) {
::android::hardware::hidl_string& value) {
std::vector<uint8_t> vec;
std::string str;
if(!getBinaryArray(item, pos, vec)) {
Expand Down
72 changes: 36 additions & 36 deletions HAL/keymaster/4.1/JavacardKeymaster4Device.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -300,8 +300,8 @@ keyFormat, std::vector<uint8_t>& wrappedKeyDescription) {
keymaster_key_blob_t keyMaterial = {keyData, keyDataLen};

keymaster_error_t error = parse_wrapped_key(KeymasterKeyBlob(keyMaterial), &kmIv, &kmTransitKey,
&kmSecureKey, &kmTag, &authSet,
&kmKeyFormat, &kmWrappedKeyDescription);
&kmSecureKey, &kmTag, &authSet,
&kmKeyFormat, &kmWrappedKeyDescription);
if (error != KM_ERROR_OK) return legacy_enum_conversion(error);
blob2Vec(kmIv.data, kmIv.data_length, iv);
blob2Vec(kmTransitKey.key_material, kmTransitKey.key_material_size, transitKey);
Expand Down Expand Up @@ -348,7 +348,7 @@ ErrorCode constructApduMessage(Instruction& ins, std::vector<uint8_t>& inputData
}

uint16_t getStatus(std::vector<uint8_t>& inputData) {
//Last two bytes are the status SW0SW1
//Last two bytes are the status SW0SW1
return (inputData.at(inputData.size()-2) << 8) | (inputData.at(inputData.size()-1));
}

Expand Down Expand Up @@ -391,7 +391,7 @@ Return<ErrorCode> setBootParams() {
std::vector<uint8_t> verifiedBootKeyHash(32, 0);

return JavacardKeymaster4Device::setBootParams(GetOsVersion(), GetOsPatchlevel(), verifiedBootKey, verifiedBootKeyHash,
KM_VERIFIED_BOOT_UNVERIFIED, 0/*deviceLocked*/);
KM_VERIFIED_BOOT_UNVERIFIED, 0/*deviceLocked*/);
}

ErrorCode sendData(Instruction ins, std::vector<uint8_t>& inData, std::vector<uint8_t>& response) {
Expand Down Expand Up @@ -425,7 +425,7 @@ ErrorCode sendData(Instruction ins, std::vector<uint8_t>& inData, std::vector<ui
}

ErrorCode JavacardKeymaster4Device::provision(const hidl_vec<KeyParameter>& keyParams, KeyFormat keyFormat, const hidl_vec<uint8_t>&
keyData) {
keyData) {
cppbor::Array array;
cppbor::Array subArray;
std::unique_ptr<Item> item;
Expand Down Expand Up @@ -489,7 +489,7 @@ keyData) {
}

ErrorCode JavacardKeymaster4Device::setBootParams(uint32_t osVersion, uint32_t osPatchLevel, const std::vector<uint8_t>& verifiedBootKey,
std::vector<uint8_t>& verifiedBootKeyHash, keymaster_verified_boot_t kmVerifiedBoot, bool deviceLocked) {
std::vector<uint8_t>& verifiedBootKeyHash, keymaster_verified_boot_t kmVerifiedBoot, bool deviceLocked) {
cppbor::Array array;
std::vector<uint8_t> apdu;
std::vector<uint8_t> response;
Expand Down Expand Up @@ -729,7 +729,7 @@ Return<void> JavacardKeymaster4Device::generateKey(const hidl_vec<KeyParameter>&
hidl_vec<KeyParameter> updatedParams(keyParams);

if(!findTag(keyParams, Tag::CREATION_DATETIME) &&
!findTag(keyParams, Tag::ACTIVE_DATETIME)) {
!findTag(keyParams, Tag::ACTIVE_DATETIME)) {
//Add CREATION_DATETIME in HAL, as secure element is not having clock.
size_t size = keyParams.size();
updatedParams.resize(size+1);
Expand All @@ -749,7 +749,7 @@ Return<void> JavacardKeymaster4Device::generateKey(const hidl_vec<KeyParameter>&
true);
if (item != nullptr) {
if(!cborConverter_.getBinaryArray(item, 1, keyBlob) ||
!cborConverter_.getKeyCharacteristics(item, 2, keyCharacteristics)) {
!cborConverter_.getKeyCharacteristics(item, 2, keyCharacteristics)) {
//Clear the buffer.
keyBlob.setToExternal(nullptr, 0);
keyCharacteristics.softwareEnforced.setToExternal(nullptr, 0);
Expand All @@ -763,20 +763,20 @@ Return<void> JavacardKeymaster4Device::generateKey(const hidl_vec<KeyParameter>&
}

Return<void> JavacardKeymaster4Device::importKey(const hidl_vec<KeyParameter>& keyParams, KeyFormat keyFormat, const hidl_vec<uint8_t>& keyData, importKey_cb _hidl_cb) {
cppbor::Array array;
std::unique_ptr<Item> item;
hidl_vec<uint8_t> keyBlob;
std::vector<uint8_t> cborOutData;
ErrorCode errorCode = ErrorCode::UNKNOWN_ERROR;
KeyCharacteristics keyCharacteristics;
cppbor::Array array;
std::unique_ptr<Item> item;
hidl_vec<uint8_t> keyBlob;
std::vector<uint8_t> cborOutData;
ErrorCode errorCode = ErrorCode::UNKNOWN_ERROR;
KeyCharacteristics keyCharacteristics;
cppbor::Array subArray;

if(keyFormat != KeyFormat::PKCS8 && keyFormat != KeyFormat::RAW) {
_hidl_cb(ErrorCode::UNSUPPORTED_KEY_FORMAT, keyBlob, keyCharacteristics);
return Void();
}
cborConverter_.addKeyparameters(array, keyParams);
array.add(static_cast<uint32_t>(KeyFormat::RAW)); //javacard accepts only RAW.
cborConverter_.addKeyparameters(array, keyParams);
array.add(static_cast<uint32_t>(KeyFormat::RAW)); //javacard accepts only RAW.
if(ErrorCode::OK != (errorCode = prepareCborArrayFromKeyData(keyParams, keyFormat, keyData, subArray))) {
_hidl_cb(errorCode, keyBlob, keyCharacteristics);
return Void();
Expand All @@ -785,27 +785,27 @@ Return<void> JavacardKeymaster4Device::importKey(const hidl_vec<KeyParameter>& k
cppbor::Bstr bstr(encodedArray.begin(), encodedArray.end());
array.add(bstr);

std::vector<uint8_t> cborData = array.encode();
std::vector<uint8_t> cborData = array.encode();

errorCode = sendData(Instruction::INS_IMPORT_KEY_CMD, cborData, cborOutData);
errorCode = sendData(Instruction::INS_IMPORT_KEY_CMD, cborData, cborOutData);

if((errorCode == ErrorCode::OK) && (cborOutData.size() > 2)) {
//Skip last 2 bytes in cborData, it contains status.
std::tie(item, errorCode) = cborConverter_.decodeData(std::vector<uint8_t>(cborOutData.begin(), cborOutData.end()-2),
true);
if (item != nullptr) {
if((errorCode == ErrorCode::OK) && (cborOutData.size() > 2)) {
//Skip last 2 bytes in cborData, it contains status.
std::tie(item, errorCode) = cborConverter_.decodeData(std::vector<uint8_t>(cborOutData.begin(), cborOutData.end()-2),
true);
if (item != nullptr) {
if(!cborConverter_.getBinaryArray(item, 1, keyBlob) ||
!cborConverter_.getKeyCharacteristics(item, 2, keyCharacteristics)) {
!cborConverter_.getKeyCharacteristics(item, 2, keyCharacteristics)) {
//Clear the buffer.
keyBlob.setToExternal(nullptr, 0);
keyCharacteristics.softwareEnforced.setToExternal(nullptr, 0);
keyCharacteristics.hardwareEnforced.setToExternal(nullptr, 0);
errorCode = ErrorCode::UNKNOWN_ERROR;
}
}
}
_hidl_cb(errorCode, keyBlob, keyCharacteristics);
return Void();
}
}
_hidl_cb(errorCode, keyBlob, keyCharacteristics);
return Void();
}

Return<void> JavacardKeymaster4Device::importWrappedKey(const hidl_vec<uint8_t>& wrappedKeyData, const hidl_vec<uint8_t>& wrappingKeyBlob, const hidl_vec<uint8_t>& maskingKey, const hidl_vec<KeyParameter>& unwrappingParams, uint64_t passwordSid, uint64_t biometricSid, importWrappedKey_cb _hidl_cb) {
Expand All @@ -824,7 +824,7 @@ Return<void> JavacardKeymaster4Device::importWrappedKey(const hidl_vec<uint8_t>&
std::vector<uint8_t> wrappedKeyDescription;

if(ErrorCode::OK != (errorCode = parseWrappedKey(wrappedKeyData, iv, transitKey, secureKey,
tag, authList, keyFormat, wrappedKeyDescription))) {
tag, authList, keyFormat, wrappedKeyDescription))) {
_hidl_cb(errorCode, keyBlob, keyCharacteristics);
return Void();
}
Expand All @@ -850,7 +850,7 @@ Return<void> JavacardKeymaster4Device::importWrappedKey(const hidl_vec<uint8_t>&
true);
if (item != nullptr) {
if(!cborConverter_.getBinaryArray(item, 1, keyBlob) ||
!cborConverter_.getKeyCharacteristics(item, 2, keyCharacteristics)) {
!cborConverter_.getKeyCharacteristics(item, 2, keyCharacteristics)) {
//Clear the buffer.
keyBlob.setToExternal(nullptr, 0);
keyCharacteristics.softwareEnforced.setToExternal(nullptr, 0);
Expand Down Expand Up @@ -899,9 +899,9 @@ Return<void> JavacardKeymaster4Device::exportKey(KeyFormat exportFormat, const h

//Check if keyblob is corrupted
getKeyCharacteristics(keyBlob, clientId, appData,
[&](ErrorCode error, KeyCharacteristics /*keyCharacteristics*/) {
errorCode = error;
});
[&](ErrorCode error, KeyCharacteristics /*keyCharacteristics*/) {
errorCode = error;
});

if(errorCode != ErrorCode::OK) {
_hidl_cb(errorCode, resultKeyBlob);
Expand Down Expand Up @@ -1088,7 +1088,7 @@ Return<void> JavacardKeymaster4Device::begin(KeyPurpose purpose, const hidl_vec<
/* keyCharacteristics.hardwareEnforced is required to store algorithm, digest and padding values in operationInfo
* structure. To retrieve keyCharacteristics.hardwareEnforced, parse the keyBlob.
*/
/* TODO if keyBlob is corrupted it crashes in cbor */
/* TODO if keyBlob is corrupted it crashes in cbor */
std::tie(blobItem, errorCode) = cborConverter_.decodeData(std::vector<uint8_t>(keyBlob), false);

if(blobItem != nullptr) {
Expand Down Expand Up @@ -1182,7 +1182,7 @@ Return<void> JavacardKeymaster4Device::update(uint64_t operationHandle, const hi
//cipher text and finally copy it to the output. getBinaryArray function appends the new cipher text
//at the end of the tempOut(std::vector<uint8_t>).
if((outParams.size() == 0 && !cborConverter_.getKeyParameters(item, 2, outParams)) ||
!cborConverter_.getBinaryArray(item, 3, tempOut)) {
!cborConverter_.getBinaryArray(item, 3, tempOut)) {
outParams.setToExternal(nullptr, 0);
tempOut.clear();
errorCode = ErrorCode::UNKNOWN_ERROR;
Expand Down Expand Up @@ -1293,7 +1293,7 @@ Return<void> JavacardKeymaster4Device::finish(uint64_t operationHandle, const hi
//the cipher text and finally copy it to the output. getBinaryArray function appends the new cipher
//text at the end of the tempOut(std::vector<uint8_t>).
if((outParams.size() == 0 && !cborConverter_.getKeyParameters(item, keyParamPos, outParams)) ||
!cborConverter_.getBinaryArray(item, outputPos, tempOut)) {
!cborConverter_.getBinaryArray(item, outputPos, tempOut)) {
outParams.setToExternal(nullptr, 0);
tempOut.clear();
errorCode = ErrorCode::UNKNOWN_ERROR;
Expand Down
30 changes: 17 additions & 13 deletions HAL/keymaster/4.1/JavacardOperationContext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@ enum class Operation {
};

inline ErrorCode hidlParamSet2OperatinInfo(const hidl_vec<KeyParameter>& params, OperationInfo& info) {
for(int i = 0; i < params.size(); i++) {
const KeyParameter &param = params[i];
for(int i = 0; i < params.size(); i++) {
const KeyParameter &param = params[i];
switch(param.tag) {
case Tag::ALGORITHM:
info.alg = static_cast<Algorithm>(param.f.integer);
Expand All @@ -53,11 +53,12 @@ inline ErrorCode hidlParamSet2OperatinInfo(const hidl_vec<KeyParameter>& params,
default:
continue;
}
}
}
return ErrorCode::OK;
}

ErrorCode OperationContext::setOperationInfo(uint64_t operationHandle, KeyPurpose purpose, Algorithm alg, const hidl_vec<KeyParameter>& params) {
ErrorCode OperationContext::setOperationInfo(uint64_t operationHandle, KeyPurpose purpose, Algorithm alg,
const hidl_vec<KeyParameter>& params) {
ErrorCode errorCode = ErrorCode::OK;
OperationData data;
if(ErrorCode::OK != (errorCode = hidlParamSet2OperatinInfo(params, data.info))) {
Expand All @@ -78,7 +79,8 @@ ErrorCode OperationContext::clearOperationData(uint64_t operHandle) {
return ErrorCode::OK;
}

ErrorCode OperationContext::validateInputData(uint64_t operHandle, Operation opr, const std::vector<uint8_t>& actualInput, std::vector<uint8_t>& input) {
ErrorCode OperationContext::validateInputData(uint64_t operHandle, Operation opr,
const std::vector<uint8_t>& actualInput, std::vector<uint8_t>& input) {
ErrorCode errorCode = ErrorCode::OK;

OperationData& oprData = operationTable[operHandle];
Expand Down Expand Up @@ -126,7 +128,8 @@ ErrorCode OperationContext::validateInputData(uint64_t operHandle, Operation opr
return errorCode;
}

ErrorCode OperationContext::update(uint64_t operHandle, const std::vector<uint8_t>& actualInput, sendDataToSE_cb cb) {
ErrorCode OperationContext::update(uint64_t operHandle, const std::vector<uint8_t>& actualInput,
sendDataToSE_cb cb) {
ErrorCode errorCode = ErrorCode::OK;
std::vector<uint8_t> input;

Expand All @@ -143,20 +146,20 @@ ErrorCode OperationContext::update(uint64_t operHandle, const std::vector<uint8_
auto end = first + MAX_ALLOWED_INPUT_SIZE;
std::vector<uint8_t> newInput(first, end);
if(ErrorCode::OK != (errorCode = handleInternalUpdate(operHandle, newInput.data(), newInput.size(),
Operation::Update, cb))) {
Operation::Update, cb))) {
return errorCode;
}
}
if(extraData > 0) {
std::vector<uint8_t> finalInput(input.cend()-extraData, input.cend());
if(ErrorCode::OK != (errorCode = handleInternalUpdate(operHandle, finalInput.data(), finalInput.size(),
Operation::Update, cb))) {
Operation::Update, cb))) {
return errorCode;
}
}
} else {
if(ErrorCode::OK != (errorCode = handleInternalUpdate(operHandle, input.data(), input.size(),
Operation::Update, cb))) {
Operation::Update, cb))) {
return errorCode;
}
}
Expand All @@ -180,28 +183,29 @@ ErrorCode OperationContext::finish(uint64_t operHandle, const std::vector<uint8_
auto end = first + MAX_ALLOWED_INPUT_SIZE;
std::vector<uint8_t> newInput(first, end);
if(ErrorCode::OK != (errorCode = handleInternalUpdate(operHandle, newInput.data(), newInput.size(),
Operation::Update, cb))) {
Operation::Update, cb))) {
return errorCode;
}
}
if(extraData > 0) {
std::vector<uint8_t> finalInput(input.cend()-extraData, input.cend());
if(ErrorCode::OK != (errorCode = handleInternalUpdate(operHandle, finalInput.data(), finalInput.size(),
Operation::Finish, cb, true))) {
Operation::Finish, cb, true))) {
return errorCode;
}
}
} else {
if(ErrorCode::OK != (errorCode = handleInternalUpdate(operHandle, input.data(), input.size(),
Operation::Finish, cb, true))) {
Operation::Finish, cb, true))) {
return errorCode;
}
}
return errorCode;
}

/* This function is called for only symmetric operations */
ErrorCode OperationContext::getBlockAlignedData(uint64_t operHandle, uint8_t* input, size_t input_len, Operation opr, std::vector<uint8_t>& out) {
ErrorCode OperationContext::getBlockAlignedData(uint64_t operHandle, uint8_t* input, size_t input_len,
Operation opr, std::vector<uint8_t>& out) {
int dataToSELen = 0;
int inputConsumed = 0;/*Length of the data consumed from input */
int blockSize = 0;
Expand Down