diff options
author | Daniel Norman <danielnorman@google.com> | 2021-02-08 11:11:06 -0800 |
---|---|---|
committer | Daniel Norman <danielnorman@google.com> | 2021-02-08 14:07:55 -0800 |
commit | f86b976dba9b016816efa57156e791fffd498d64 (patch) | |
tree | 62e68f2885e6a7a73bf3386e8459f8fe98528ade /identity/aidl/default/common/IdentityCredential.cpp | |
parent | a0da4d07b75fa61fcb4f5648ba304cbf4ac50f6a (diff) | |
parent | 7fd5ae363319c3d8fa9128c39075ea82799989ab (diff) |
Merge SP1A.210208.001
Change-Id: I0c596171de3bcead62935db7388b784e55444080
Diffstat (limited to 'identity/aidl/default/common/IdentityCredential.cpp')
-rw-r--r-- | identity/aidl/default/common/IdentityCredential.cpp | 82 |
1 files changed, 72 insertions, 10 deletions
diff --git a/identity/aidl/default/common/IdentityCredential.cpp b/identity/aidl/default/common/IdentityCredential.cpp index 270fcfa8d0..94779971b1 100644 --- a/identity/aidl/default/common/IdentityCredential.cpp +++ b/identity/aidl/default/common/IdentityCredential.cpp @@ -30,6 +30,7 @@ #include <cppbor_parse.h> #include "FakeSecureHardwareProxy.h" +#include "WritableIdentityCredential.h" namespace aidl::android::hardware::identity { @@ -70,14 +71,8 @@ int IdentityCredential::initialize() { docType_ = docTypeItem->value(); testCredential_ = testCredentialItem->value(); - const vector<uint8_t>& encryptedCredentialKeys = encryptedCredentialKeysItem->value(); - - if (encryptedCredentialKeys.size() != 80) { - LOG(ERROR) << "Unexpected size for encrypted CredentialKeys"; - return IIdentityCredentialStore::STATUS_INVALID_DATA; - } - - if (!hwProxy_->initialize(testCredential_, docType_, encryptedCredentialKeys)) { + encryptedCredentialKeys_ = encryptedCredentialKeysItem->value(); + if (!hwProxy_->initialize(testCredential_, docType_, encryptedCredentialKeys_)) { LOG(ERROR) << "hwProxy->initialize failed"; return false; } @@ -87,12 +82,32 @@ int IdentityCredential::initialize() { ndk::ScopedAStatus IdentityCredential::deleteCredential( vector<uint8_t>* outProofOfDeletionSignature) { + return deleteCredentialCommon({}, false, outProofOfDeletionSignature); +} + +ndk::ScopedAStatus IdentityCredential::deleteCredentialWithChallenge( + const vector<uint8_t>& challenge, vector<uint8_t>* outProofOfDeletionSignature) { + return deleteCredentialCommon(challenge, true, outProofOfDeletionSignature); +} + +ndk::ScopedAStatus IdentityCredential::deleteCredentialCommon( + const vector<uint8_t>& challenge, bool includeChallenge, + vector<uint8_t>* outProofOfDeletionSignature) { + if (challenge.size() > 32) { + return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage( + IIdentityCredentialStore::STATUS_INVALID_DATA, "Challenge too big")); + } + cppbor::Array array = {"ProofOfDeletion", docType_, testCredential_}; + if (includeChallenge) { + array = {"ProofOfDeletion", docType_, challenge, testCredential_}; + } + vector<uint8_t> proofOfDeletionCbor = array.encode(); vector<uint8_t> podDigest = support::sha256(proofOfDeletionCbor); - optional<vector<uint8_t>> signatureOfToBeSigned = - hwProxy_->deleteCredential(docType_, proofOfDeletionCbor.size()); + optional<vector<uint8_t>> signatureOfToBeSigned = hwProxy_->deleteCredential( + docType_, challenge, includeChallenge, proofOfDeletionCbor.size()); if (!signatureOfToBeSigned) { return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage( IIdentityCredentialStore::STATUS_FAILED, "Error signing ProofOfDeletion")); @@ -111,6 +126,38 @@ ndk::ScopedAStatus IdentityCredential::deleteCredential( return ndk::ScopedAStatus::ok(); } +ndk::ScopedAStatus IdentityCredential::proveOwnership( + const vector<uint8_t>& challenge, vector<uint8_t>* outProofOfOwnershipSignature) { + if (challenge.size() > 32) { + return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage( + IIdentityCredentialStore::STATUS_INVALID_DATA, "Challenge too big")); + } + + cppbor::Array array; + array = {"ProofOfOwnership", docType_, challenge, testCredential_}; + vector<uint8_t> proofOfOwnershipCbor = array.encode(); + vector<uint8_t> podDigest = support::sha256(proofOfOwnershipCbor); + + optional<vector<uint8_t>> signatureOfToBeSigned = hwProxy_->proveOwnership( + docType_, testCredential_, challenge, proofOfOwnershipCbor.size()); + if (!signatureOfToBeSigned) { + return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage( + IIdentityCredentialStore::STATUS_FAILED, "Error signing ProofOfOwnership")); + } + + optional<vector<uint8_t>> signature = + support::coseSignEcDsaWithSignature(signatureOfToBeSigned.value(), + proofOfOwnershipCbor, // data + {}); // certificateChain + if (!signature) { + return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage( + IIdentityCredentialStore::STATUS_FAILED, "Error signing data")); + } + + *outProofOfOwnershipSignature = signature.value(); + return ndk::ScopedAStatus::ok(); +} + ndk::ScopedAStatus IdentityCredential::createEphemeralKeyPair(vector<uint8_t>* outKeyPair) { optional<vector<uint8_t>> ephemeralPriv = hwProxy_->createEphemeralKeyPair(); if (!ephemeralPriv) { @@ -833,4 +880,19 @@ ndk::ScopedAStatus IdentityCredential::generateSigningKeyPair( return ndk::ScopedAStatus::ok(); } +ndk::ScopedAStatus IdentityCredential::updateCredential( + shared_ptr<IWritableIdentityCredential>* outWritableCredential) { + sp<SecureHardwareProvisioningProxy> hwProxy = hwProxyFactory_->createProvisioningProxy(); + shared_ptr<WritableIdentityCredential> wc = + ndk::SharedRefBase::make<WritableIdentityCredential>(hwProxy, docType_, + testCredential_); + if (!wc->initializeForUpdate(encryptedCredentialKeys_)) { + return ndk::ScopedAStatus(AStatus_fromServiceSpecificErrorWithMessage( + IIdentityCredentialStore::STATUS_FAILED, + "Error initializing WritableIdentityCredential for update")); + } + *outWritableCredential = wc; + return ndk::ScopedAStatus::ok(); +} + } // namespace aidl::android::hardware::identity |