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)11ScopedAStatus 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)32JavacardSharedSecret::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