• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
35     auto error = card_->sendEarlyBootEndedEvent(false);
36     if (error != KM_ERROR_OK) {
37         LOG(ERROR) << "Error in sending earlyBoot event javacard.";
38         return keymint::km_utils::kmError2ScopedAStatus(error);
39     }
40     error = card_->initializeJavacard();
41     if (error != KM_ERROR_OK) {
42         LOG(ERROR) << "Error in initializing javacard.";
43         return keymint::km_utils::kmError2ScopedAStatus(error);
44     }
45     cppbor::Array request;
46     cbor_.addSharedSecretParameters(request, params);
47     auto [item, err] = card_->sendRequest(Instruction::INS_COMPUTE_SHARED_SECRET_CMD, request);
48     if (err != KM_ERROR_OK) {
49         LOG(ERROR) << "Error in sending in computeSharedSecret.";
50         return keymint::km_utils::kmError2ScopedAStatus(err);
51     }
52     auto optSecret = cbor_.getByteArrayVec(item, 1);
53     if (!optSecret) {
54         LOG(ERROR) << "Error in decoding the response in computeSharedSecret.";
55         return keymint::km_utils::kmError2ScopedAStatus(KM_ERROR_UNKNOWN_ERROR);
56     }
57     *secret = std::move(optSecret.value());
58     return ScopedAStatus::ok();
59 }
60 
61 }  // namespace aidl::android::hardware::security::sharedsecret
62