xref: /aosp_15_r20/external/libese/ready_se/google/keymint/KM300/HAL/JavacardSharedSecret.cpp (revision 5c4dab75aa57366379dce576b1a9e082a44e2b3a)
1 #define LOG_TAG "javacard.strongbox.keymint.operation-impl"
2 #include "JavacardSharedSecret.h"
3 
4 #include <android-base/logging.h>
5 
6 #include <KeyMintUtils.h>
7 
8 namespace aidl::android::hardware::security::sharedsecret {
9 using ::keymint::javacard::Instruction;
10 
getSharedSecretParameters(SharedSecretParameters * params)11 ScopedAStatus JavacardSharedSecret::getSharedSecretParameters(SharedSecretParameters* params) {
12     auto error = card_->initializeJavacard();
13     if (error != KM_ERROR_OK) {
14         LOG(ERROR) << "Error in initializing javacard.";
15         return keymint::km_utils::kmError2ScopedAStatus(error);
16     }
17     auto [item, err] = card_->sendRequest(Instruction::INS_GET_SHARED_SECRET_PARAM_CMD);
18     if (err != KM_ERROR_OK) {
19         LOG(ERROR) << "Error in sending in getSharedSecretParameters.";
20         return keymint::km_utils::kmError2ScopedAStatus(err);
21     }
22     auto optSSParams = cbor_.getSharedSecretParameters(item, 1);
23     if (!optSSParams) {
24         LOG(ERROR) << "Error in sending in getSharedSecretParameters.";
25         return keymint::km_utils::kmError2ScopedAStatus(KM_ERROR_UNKNOWN_ERROR);
26     }
27     *params = std::move(optSSParams.value());
28     return ScopedAStatus::ok();
29 }
30 
31 ScopedAStatus
computeSharedSecret(const std::vector<SharedSecretParameters> & params,std::vector<uint8_t> * secret)32 JavacardSharedSecret::computeSharedSecret(const std::vector<SharedSecretParameters>& params,
33                                           std::vector<uint8_t>* secret) {
34     card_->sendPendingEvents();
35     auto error = card_->initializeJavacard();
36     if (error != KM_ERROR_OK) {
37         LOG(ERROR) << "Error in initializing javacard.";
38         return keymint::km_utils::kmError2ScopedAStatus(error);
39     }
40     cppbor::Array request;
41     cbor_.addSharedSecretParameters(request, params);
42     auto [item, err] = card_->sendRequest(Instruction::INS_COMPUTE_SHARED_SECRET_CMD, request);
43     if (err != KM_ERROR_OK) {
44         LOG(ERROR) << "Error in sending in computeSharedSecret.";
45         return keymint::km_utils::kmError2ScopedAStatus(err);
46     }
47     auto optSecret = cbor_.getByteArrayVec(item, 1);
48     if (!optSecret) {
49         LOG(ERROR) << "Error in decoding the response in computeSharedSecret.";
50         return keymint::km_utils::kmError2ScopedAStatus(KM_ERROR_UNKNOWN_ERROR);
51     }
52     *secret = std::move(optSecret.value());
53     return ScopedAStatus::ok();
54 }
55 
56 }  // namespace aidl::android::hardware::security::sharedsecret
57