diff options
Diffstat (limited to 'keystore/operation.cpp')
| -rw-r--r-- | keystore/operation.cpp | 95 |
1 files changed, 28 insertions, 67 deletions
diff --git a/keystore/operation.cpp b/keystore/operation.cpp index 8c39716..66fcee2 100644 --- a/keystore/operation.cpp +++ b/keystore/operation.cpp @@ -20,7 +20,6 @@ #include <algorithm> namespace keystore { -using namespace android; OperationMap::OperationMap(IBinder::DeathRecipient* deathRecipient) : mDeathRecipient(deathRecipient) {} @@ -29,38 +28,22 @@ sp<IBinder> OperationMap::addOperation(uint64_t handle, uint64_t keyid, KeyPurpo const OperationMap::km_device_t& dev, const sp<IBinder>& appToken, KeyCharacteristics&& characteristics, bool pruneable) { - sp<IBinder> token = new BBinder(); - mMap[token] = Operation(handle, keyid, purpose, dev, std::move(characteristics), appToken); - if (pruneable) { - mLru.push_back(token); - } - if (mAppTokenMap.find(appToken) == mAppTokenMap.end()) { - appToken->linkToDeath(mDeathRecipient); - } + sp<IBinder> token = new ::android::BBinder(); + mMap.emplace(token, + Operation(handle, keyid, purpose, dev, std::move(characteristics), appToken)); + if (pruneable) mLru.push_back(token); + if (mAppTokenMap.find(appToken) == mAppTokenMap.end()) appToken->linkToDeath(mDeathRecipient); mAppTokenMap[appToken].push_back(token); + return token; } -bool OperationMap::getOperation(const sp<IBinder>& token, uint64_t* outHandle, uint64_t* outKeyid, - KeyPurpose* outPurpose, km_device_t* outDevice, - const KeyCharacteristics** outCharacteristics) { - if (!outHandle || !outDevice) { - return false; - } +NullOr<const OperationMap::Operation&> OperationMap::getOperation(const sp<IBinder>& token) { auto entry = mMap.find(token); - if (entry == mMap.end()) { - return false; - } - updateLru(token); + if (entry == mMap.end()) return {}; - *outHandle = entry->second.handle; - *outKeyid = entry->second.keyid; - *outPurpose = entry->second.purpose; - *outDevice = entry->second.device; - if (outCharacteristics) { - *outCharacteristics = &entry->second.characteristics; - } - return true; + updateLru(token); + return entry->second; } void OperationMap::updateLru(const sp<IBinder>& token) { @@ -71,19 +54,18 @@ void OperationMap::updateLru(const sp<IBinder>& token) { } } -bool OperationMap::removeOperation(const sp<IBinder>& token) { +NullOr<OperationMap::Operation> OperationMap::removeOperation(const sp<IBinder>& token) { auto entry = mMap.find(token); - if (entry == mMap.end()) { - return false; - } - sp<IBinder> appToken = entry->second.appToken; + if (entry == mMap.end()) return {}; + + Operation op = std::move(entry->second); mMap.erase(entry); + auto lruEntry = std::find(mLru.begin(), mLru.end(), token); - if (lruEntry != mLru.end()) { - mLru.erase(lruEntry); - } - removeOperationTracking(token, appToken); - return true; + if (lruEntry != mLru.end()) mLru.erase(lruEntry); + removeOperationTracking(token, op.appToken); + + return op; } void OperationMap::removeOperationTracking(const sp<IBinder>& token, const sp<IBinder>& appToken) { @@ -102,7 +84,7 @@ void OperationMap::removeOperationTracking(const sp<IBinder>& token, const sp<IB } bool OperationMap::hasPruneableOperation() const { - return mLru.size() != 0; + return !mLru.empty(); } size_t OperationMap::getPruneableOperationCount() const { @@ -110,40 +92,22 @@ size_t OperationMap::getPruneableOperationCount() const { } sp<IBinder> OperationMap::getOldestPruneableOperation() { - if (!hasPruneableOperation()) { - return sp<IBinder>(NULL); - } - return mLru[0]; + if (!hasPruneableOperation()) return sp<IBinder>(nullptr); + return mLru.front(); } -bool OperationMap::getOperationAuthToken(const sp<IBinder>& token, - const HardwareAuthToken** outToken) { +bool OperationMap::setOperationAuthToken(const sp<IBinder>& token, HardwareAuthToken authToken) { auto entry = mMap.find(token); - if (entry == mMap.end()) { - return false; - } - *outToken = entry->second.authToken.get(); - return true; -} + if (entry == mMap.end()) return false; -bool OperationMap::setOperationAuthToken(const sp<IBinder>& token, - const HardwareAuthToken* authToken) { - auto entry = mMap.find(token); - if (entry == mMap.end()) { - return false; - } - entry->second.authToken.reset(new HardwareAuthToken); - *entry->second.authToken = *authToken; + entry->second.authToken = std::make_unique<HardwareAuthToken>(std::move(authToken)); return true; } std::vector<sp<IBinder>> OperationMap::getOperationsForToken(const sp<IBinder>& appToken) { auto appEntry = mAppTokenMap.find(appToken); - if (appEntry != mAppTokenMap.end()) { - return appEntry->second; - } else { - return std::vector<sp<IBinder>>(); - } + if (appEntry == mAppTokenMap.end()) return {}; + return appEntry->second; } OperationMap::Operation::Operation(uint64_t handle_, uint64_t keyid_, KeyPurpose purpose_, @@ -152,7 +116,4 @@ OperationMap::Operation::Operation(uint64_t handle_, uint64_t keyid_, KeyPurpose : handle(handle_), keyid(keyid_), purpose(purpose_), device(device_), characteristics(characteristics_), appToken(appToken_) {} -OperationMap::Operation::Operation() - : handle(0), keyid(0), device(nullptr), characteristics(), appToken(nullptr) {} - -} // namespace android +} // namespace keystore |
