From 09ac3042768da991f9558e947f650504d6d99ad7 Mon Sep 17 00:00:00 2001 From: BKSSM Venkateswarlu Date: Tue, 16 Feb 2021 22:39:13 +0000 Subject: [PATCH] Sending extending length APDU always --- .../4.1/JavacardKeymaster4Device.cpp | 40 +++++++---------- provisioning_tool/Provision.cpp | 45 ++++++++----------- 2 files changed, 34 insertions(+), 51 deletions(-) diff --git a/HAL/keymaster/4.1/JavacardKeymaster4Device.cpp b/HAL/keymaster/4.1/JavacardKeymaster4Device.cpp index c9f3ab96..eb8ccdd8 100644 --- a/HAL/keymaster/4.1/JavacardKeymaster4Device.cpp +++ b/HAL/keymaster/4.1/JavacardKeymaster4Device.cpp @@ -338,35 +338,28 @@ keyFormat, std::vector& wrappedKeyDescription) { return ErrorCode::OK; } -ErrorCode constructApduMessage(Instruction& ins, std::vector& inputData, std::vector& apduOut, bool -extendedOutput=false) { +ErrorCode constructApduMessage(Instruction& ins, std::vector& inputData, std::vector& apduOut) { apduOut.push_back(static_cast(APDU_CLS)); //CLS apduOut.push_back(static_cast(ins)); //INS apduOut.push_back(static_cast(APDU_P1)); //P1 apduOut.push_back(static_cast(APDU_P2)); //P2 - if(UCHAR_MAX < inputData.size() && USHRT_MAX >= inputData.size()) { + if(USHRT_MAX >= inputData.size()) { + // Send extended length APDU always as response size is not known to HAL. + // Case 1: Lc > 0 CLS | INS | P1 | P2 | 00 | 2 bytes of Lc | CommandData | 2 bytes of Le all set to 00. + // Case 2: Lc = 0 CLS | INS | P1 | P2 | 3 bytes of Le all set to 00. //Extended length 3 bytes, starts with 0x00 apduOut.push_back(static_cast(0x00)); - apduOut.push_back(static_cast(inputData.size() >> 8)); - apduOut.push_back(static_cast(inputData.size() & 0xFF)); - //Data - apduOut.insert(apduOut.end(), inputData.begin(), inputData.end()); - //Expected length of output + if (inputData.size() > 0) { + apduOut.push_back(static_cast(inputData.size() >> 8)); + apduOut.push_back(static_cast(inputData.size() & 0xFF)); + //Data + apduOut.insert(apduOut.end(), inputData.begin(), inputData.end()); + } + //Expected length of output. + //Accepting complete length of output every time. apduOut.push_back(static_cast(0x00)); apduOut.push_back(static_cast(0x00)); - apduOut.push_back(static_cast(0x00));//Accepting complete length of output at a time - } else if(0 <= inputData.size() && UCHAR_MAX >= inputData.size()) { - //Short length - apduOut.push_back(static_cast(inputData.size())); - //Data - if(inputData.size() > 0) - apduOut.insert(apduOut.end(), inputData.begin(), inputData.end()); - //Expected length of output - apduOut.push_back(static_cast(0x00));//Accepting complete length of output at a time - if(extendedOutput) - apduOut.push_back(static_cast(0x00)); - } else { return (ErrorCode::INSUFFICIENT_BUFFER_SPACE); } @@ -423,8 +416,7 @@ static bool isSEProvisioned() { } -ErrorCode sendData(Instruction ins, std::vector& inData, std::vector& response, bool - extendedOutput=false) { +ErrorCode sendData(Instruction ins, std::vector& inData, std::vector& response) { ErrorCode ret = ErrorCode::UNKNOWN_ERROR; std::vector apdu; @@ -432,7 +424,7 @@ ErrorCode sendData(Instruction ins, std::vector& inData, std::vectorsendData(apdu.data(), apdu.size(), response)) { @@ -849,7 +841,7 @@ Return JavacardKeymaster4Device::attestKey(const hidl_vec& keyToA } else { cborData.clear(); cborOutData.clear(); - errorCode = sendData(Instruction::INS_GET_CERT_CHAIN_CMD, cborData, cborOutData, true); + errorCode = sendData(Instruction::INS_GET_CERT_CHAIN_CMD, cborData, cborOutData); if(errorCode == ErrorCode::OK) { //Skip last 2 bytes in cborData, it contains status. std::tie(item, errorCode) = decodeData(cborConverter_, std::vector(cborOutData.begin(), diff --git a/provisioning_tool/Provision.cpp b/provisioning_tool/Provision.cpp index 85bdd241..45425975 100644 --- a/provisioning_tool/Provision.cpp +++ b/provisioning_tool/Provision.cpp @@ -64,10 +64,8 @@ enum ProvisionStatus { }; // Static function declarations. -static ErrorCode constructApduMessage(Instruction& ins, std::vector& inputData, std::vector& apduOut, bool -extendedOutput=false); -static ErrorCode sendProvisionData(std::unique_ptr& transport, Instruction ins, std::vector& inData, std::vector& response, bool -extendedOutput = false); +static ErrorCode constructApduMessage(Instruction& ins, std::vector& inputData, std::vector& apduOut); +static ErrorCode sendProvisionData(std::unique_ptr& transport, Instruction ins, std::vector& inData, std::vector& response); static uint16_t getStatus(std::vector& inputData); static inline X509* parseDerCertificate(std::vector& certData) { @@ -125,35 +123,29 @@ static uint16_t getStatus(std::vector& inputData) { return (inputData.at(inputData.size()-2) << 8) | (inputData.at(inputData.size()-1)); } -static ErrorCode constructApduMessage(Instruction& ins, std::vector& inputData, std::vector& apduOut, bool -extendedOutput) { +static ErrorCode constructApduMessage(Instruction& ins, std::vector& inputData, std::vector& apduOut) { + apduOut.push_back(static_cast(APDU_CLS)); //CLS apduOut.push_back(static_cast(ins)); //INS apduOut.push_back(static_cast(APDU_P1)); //P1 apduOut.push_back(static_cast(APDU_P2)); //P2 - if(UCHAR_MAX < inputData.size() && USHRT_MAX >= inputData.size()) { + if(USHRT_MAX >= inputData.size()) { + // Send extended length APDU always as response size is not known to HAL. + // Case 1: Lc > 0 CLS | INS | P1 | P2 | 00 | 2 bytes of Lc | CommandData | 2 bytes of Le all set to 00. + // Case 2: Lc = 0 CLS | INS | P1 | P2 | 3 bytes of Le all set to 00. //Extended length 3 bytes, starts with 0x00 apduOut.push_back(static_cast(0x00)); - apduOut.push_back(static_cast(inputData.size() >> 8)); - apduOut.push_back(static_cast(inputData.size() & 0xFF)); - //Data - apduOut.insert(apduOut.end(), inputData.begin(), inputData.end()); - //Expected length of output + if (inputData.size() > 0) { + apduOut.push_back(static_cast(inputData.size() >> 8)); + apduOut.push_back(static_cast(inputData.size() & 0xFF)); + //Data + apduOut.insert(apduOut.end(), inputData.begin(), inputData.end()); + } + //Expected length of output. + //Accepting complete length of output every time. apduOut.push_back(static_cast(0x00)); apduOut.push_back(static_cast(0x00)); - apduOut.push_back(static_cast(0x00));//Accepting complete length of output at a time - } else if(0 <= inputData.size() && UCHAR_MAX >= inputData.size()) { - //Short length - apduOut.push_back(static_cast(inputData.size())); - //Data - if(inputData.size() > 0) - apduOut.insert(apduOut.end(), inputData.begin(), inputData.end()); - //Expected length of output - apduOut.push_back(static_cast(0x00));//Accepting complete length of output at a time - if(extendedOutput) - apduOut.push_back(static_cast(0x00)); - } else { return (ErrorCode::INSUFFICIENT_BUFFER_SPACE); } @@ -163,13 +155,12 @@ extendedOutput) { -static ErrorCode sendProvisionData(std::unique_ptr& transport, Instruction ins, std::vector& inData, std::vector& response, bool -extendedOutput) { +static ErrorCode sendProvisionData(std::unique_ptr& transport, Instruction ins, std::vector& inData, std::vector& response) { ErrorCode ret = ErrorCode::OK; std::vector apdu; CborConverter cborConverter; std::unique_ptr item; - ret = constructApduMessage(ins, inData, apdu, extendedOutput); + ret = constructApduMessage(ins, inData, apdu); if(ret != ErrorCode::OK) return ret; if(!transport->sendData(apdu.data(), apdu.size(), response)) {