| #include <android-base/logging.h> |
| #include <android/security/IKeystoreService.h> |
| #include <binder/IServiceManager.h> |
| #include <private/android_filesystem_config.h> |
| |
| #include <vector> |
| #include "include/wifikeystorehal/keystore.h" |
| |
| namespace android { |
| namespace system { |
| namespace wifi { |
| namespace keystore { |
| namespace V1_0 { |
| namespace implementation { |
| |
| using security::IKeystoreService; |
| // Methods from ::android::hardware::wifi::keystore::V1_0::IKeystore follow. |
| Return<void> Keystore::getBlob(const hidl_string& key, getBlob_cb _hidl_cb) { |
| sp<IKeystoreService> service = interface_cast<IKeystoreService>( |
| defaultServiceManager()->getService(String16("android.security.keystore"))); |
| if (service == nullptr) { |
| _hidl_cb(KeystoreStatusCode::ERROR_UNKNOWN, {}); |
| return Void(); |
| } |
| ::std::vector<uint8_t> value; |
| // Retrieve the blob as wifi user. |
| auto ret = service->get(String16(key.c_str()), AID_WIFI, &value); |
| if (!ret.isOk()) { |
| _hidl_cb(KeystoreStatusCode::ERROR_UNKNOWN, {}); |
| return Void(); |
| } |
| _hidl_cb(KeystoreStatusCode::SUCCESS, (hidl_vec<uint8_t>)value); |
| return Void(); |
| } |
| |
| Return<void> Keystore::getPublicKey(const hidl_string& keyId, getPublicKey_cb _hidl_cb) { |
| sp<IKeystoreService> service = interface_cast<IKeystoreService>( |
| defaultServiceManager()->getService(String16("android.security.keystore"))); |
| if (service == nullptr) { |
| _hidl_cb(KeystoreStatusCode::ERROR_UNKNOWN, {}); |
| return Void(); |
| } |
| ::std::vector<uint8_t> pubkey; |
| auto ret = service->get_pubkey(String16(keyId.c_str()), &pubkey); |
| if (!ret.isOk()) { |
| _hidl_cb(KeystoreStatusCode::ERROR_UNKNOWN, {}); |
| return Void(); |
| } |
| _hidl_cb(KeystoreStatusCode::SUCCESS, (hidl_vec<uint8_t>)pubkey); |
| return Void(); |
| } |
| |
| Return<void> Keystore::sign(const hidl_string& keyId, const hidl_vec<uint8_t>& dataToSign, |
| sign_cb _hidl_cb) { |
| sp<IKeystoreService> service = interface_cast<IKeystoreService>( |
| defaultServiceManager()->getService(String16("android.security.keystore"))); |
| if (service == nullptr) { |
| _hidl_cb(KeystoreStatusCode::ERROR_UNKNOWN, {}); |
| return Void(); |
| } |
| ::std::vector<uint8_t> signedData; |
| |
| auto ret = service->sign(String16(keyId.c_str()), dataToSign, &signedData); |
| if (!ret.isOk()) { |
| _hidl_cb(KeystoreStatusCode::ERROR_UNKNOWN, {}); |
| return Void(); |
| } |
| _hidl_cb(KeystoreStatusCode::SUCCESS, (hidl_vec<uint8_t>)signedData); |
| return Void(); |
| } |
| |
| IKeystore* HIDL_FETCH_IKeystore(const char* /* name */) { |
| return new Keystore(); |
| } |
| } // namespace implementation |
| } // namespace V1_0 |
| } // namespace keystore |
| } // namespace wifi |
| } // namespace system |
| } // namespace android |