Skip to content
This repository was archived by the owner on May 24, 2026. It is now read-only.
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
40 changes: 16 additions & 24 deletions HAL/keymaster/4.1/JavacardKeymaster4Device.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -338,35 +338,28 @@ keyFormat, std::vector<uint8_t>& wrappedKeyDescription) {
return ErrorCode::OK;
}

ErrorCode constructApduMessage(Instruction& ins, std::vector<uint8_t>& inputData, std::vector<uint8_t>& apduOut, bool
extendedOutput=false) {
ErrorCode constructApduMessage(Instruction& ins, std::vector<uint8_t>& inputData, std::vector<uint8_t>& apduOut) {
apduOut.push_back(static_cast<uint8_t>(APDU_CLS)); //CLS
apduOut.push_back(static_cast<uint8_t>(ins)); //INS
apduOut.push_back(static_cast<uint8_t>(APDU_P1)); //P1
apduOut.push_back(static_cast<uint8_t>(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<uint8_t>(0x00));
apduOut.push_back(static_cast<uint8_t>(inputData.size() >> 8));
apduOut.push_back(static_cast<uint8_t>(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<uint8_t>(inputData.size() >> 8));
apduOut.push_back(static_cast<uint8_t>(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<uint8_t>(0x00));
apduOut.push_back(static_cast<uint8_t>(0x00));
apduOut.push_back(static_cast<uint8_t>(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<uint8_t>(inputData.size()));
//Data
if(inputData.size() > 0)
apduOut.insert(apduOut.end(), inputData.begin(), inputData.end());
//Expected length of output
apduOut.push_back(static_cast<uint8_t>(0x00));//Accepting complete length of output at a time
if(extendedOutput)
apduOut.push_back(static_cast<uint8_t>(0x00));

} else {
return (ErrorCode::INSUFFICIENT_BUFFER_SPACE);
}
Expand DownExpand Up@@ -423,16 +416,15 @@ static bool isSEProvisioned() {
}


ErrorCode sendData(Instruction ins, std::vector<uint8_t>& inData, std::vector<uint8_t>& response, bool
extendedOutput=false) {
ErrorCode sendData(Instruction ins, std::vector<uint8_t>& inData, std::vector<uint8_t>& response) {
ErrorCode ret = ErrorCode::UNKNOWN_ERROR;
std::vector<uint8_t> apdu;

if (!isSEProvisioned()) {
LOG(ERROR) << "Javacard applet is not provisioned.";
return ret;
}
ret = constructApduMessage(ins, inData, apdu, extendedOutput);
ret = constructApduMessage(ins, inData, apdu);
if(ret != ErrorCode::OK) return ret;

if(!getTransportFactoryInstance()->sendData(apdu.data(), apdu.size(), response)) {
Expand DownExpand Up@@ -849,7 +841,7 @@ Return<void> JavacardKeymaster4Device::attestKey(const hidl_vec<uint8_t>& 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<uint8_t>(cborOutData.begin(),
Expand Down
45 changes: 18 additions & 27 deletions provisioning_tool/Provision.cpp
Original file line numberDiff line numberDiff line change
Expand Up@@ -64,10 +64,8 @@ enum ProvisionStatus {
};

// Static function declarations.
static ErrorCode constructApduMessage(Instruction& ins, std::vector<uint8_t>& inputData, std::vector<uint8_t>& apduOut, bool
extendedOutput=false);
static ErrorCode sendProvisionData(std::unique_ptr<se_transport::TransportFactory>& transport, Instruction ins, std::vector<uint8_t>& inData, std::vector<uint8_t>& response, bool
extendedOutput = false);
static ErrorCode constructApduMessage(Instruction& ins, std::vector<uint8_t>& inputData, std::vector<uint8_t>& apduOut);
static ErrorCode sendProvisionData(std::unique_ptr<se_transport::TransportFactory>& transport, Instruction ins, std::vector<uint8_t>& inData, std::vector<uint8_t>& response);
static uint16_t getStatus(std::vector<uint8_t>& inputData);

static inline X509* parseDerCertificate(std::vector<uint8_t>& certData) {
Expand DownExpand Up@@ -125,35 +123,29 @@ static uint16_t getStatus(std::vector<uint8_t>& inputData) {
return (inputData.at(inputData.size()-2) << 8) | (inputData.at(inputData.size()-1));
}

static ErrorCode constructApduMessage(Instruction& ins, std::vector<uint8_t>& inputData, std::vector<uint8_t>& apduOut, bool
extendedOutput) {
static ErrorCode constructApduMessage(Instruction& ins, std::vector<uint8_t>& inputData, std::vector<uint8_t>& apduOut) {

apduOut.push_back(static_cast<uint8_t>(APDU_CLS)); //CLS
apduOut.push_back(static_cast<uint8_t>(ins)); //INS
apduOut.push_back(static_cast<uint8_t>(APDU_P1)); //P1
apduOut.push_back(static_cast<uint8_t>(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<uint8_t>(0x00));
apduOut.push_back(static_cast<uint8_t>(inputData.size() >> 8));
apduOut.push_back(static_cast<uint8_t>(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<uint8_t>(inputData.size() >> 8));
apduOut.push_back(static_cast<uint8_t>(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<uint8_t>(0x00));
apduOut.push_back(static_cast<uint8_t>(0x00));
apduOut.push_back(static_cast<uint8_t>(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<uint8_t>(inputData.size()));
//Data
if(inputData.size() > 0)
apduOut.insert(apduOut.end(), inputData.begin(), inputData.end());
//Expected length of output
apduOut.push_back(static_cast<uint8_t>(0x00));//Accepting complete length of output at a time
if(extendedOutput)
apduOut.push_back(static_cast<uint8_t>(0x00));

} else {
return (ErrorCode::INSUFFICIENT_BUFFER_SPACE);
}
Expand All@@ -163,13 +155,12 @@ extendedOutput) {



static ErrorCode sendProvisionData(std::unique_ptr<se_transport::TransportFactory>& transport, Instruction ins, std::vector<uint8_t>& inData, std::vector<uint8_t>& response, bool
extendedOutput) {
static ErrorCode sendProvisionData(std::unique_ptr<se_transport::TransportFactory>& transport, Instruction ins, std::vector<uint8_t>& inData, std::vector<uint8_t>& response) {
ErrorCode ret = ErrorCode::OK;
std::vector<uint8_t> apdu;
CborConverter cborConverter;
std::unique_ptr<Item> 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)) {
Expand Down