12b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart#include <android-base/logging.h> 22b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart#include <binder/IServiceManager.h> 32b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart#include <keystore/IKeystoreService.h> 42b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart#include <private/android_filesystem_config.h> 52b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart 62b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart#include "include/wifikeystorehal/keystore.h" 72b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart 82b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewartnamespace android { 92b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewartnamespace system { 102b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewartnamespace wifi { 112b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewartnamespace keystore { 122b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewartnamespace V1_0 { 132b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewartnamespace implementation { 142b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart// Methods from ::android::hardware::wifi::keystore::V1_0::IKeystore follow. 152b1020d6d79f97e6bd9268453ad30282a86e9304Paul StewartReturn<void> Keystore::getBlob(const hidl_string& key, getBlob_cb _hidl_cb) { 162b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart sp<IKeystoreService> service = interface_cast<IKeystoreService>( 172b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart defaultServiceManager()->getService( 182b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart String16("android.security.keystore"))); 192b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart if (service == nullptr) { 202b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart _hidl_cb(KeystoreStatusCode::ERROR_UNKNOWN, {}); 212b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart return Void(); 222b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart } 232b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart hidl_vec<uint8_t> value; 242b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart // Retrieve the blob as wifi user. 25c620a935eb7447523c380c4e5832a1ad332697f8Scott Randolph auto ret = service->get(String16(key.c_str()), AID_WIFI, &value); 262b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart if (!ret.isOk()) { 272b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart _hidl_cb(KeystoreStatusCode::ERROR_UNKNOWN, {}); 282b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart return Void(); 292b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart } 302b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart _hidl_cb(KeystoreStatusCode::SUCCESS, value); 312b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart return Void(); 322b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart} 332b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart 342b1020d6d79f97e6bd9268453ad30282a86e9304Paul StewartReturn<void> Keystore::getPublicKey( 352b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart const hidl_string& keyId, getPublicKey_cb _hidl_cb) { 362b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart sp<IKeystoreService> service = interface_cast<IKeystoreService>( 372b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart defaultServiceManager()->getService( 382b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart String16("android.security.keystore"))); 392b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart if (service == nullptr) { 402b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart _hidl_cb(KeystoreStatusCode::ERROR_UNKNOWN, {}); 412b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart return Void(); 422b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart } 432b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart hidl_vec<uint8_t> pubkey; 44c620a935eb7447523c380c4e5832a1ad332697f8Scott Randolph auto ret = service->get_pubkey(String16(keyId.c_str()), &pubkey); 452b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart if (!ret.isOk()) { 462b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart _hidl_cb(KeystoreStatusCode::ERROR_UNKNOWN, {}); 472b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart return Void(); 482b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart } 492b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart _hidl_cb(KeystoreStatusCode::SUCCESS, pubkey); 502b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart return Void(); 512b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart} 522b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart 532b1020d6d79f97e6bd9268453ad30282a86e9304Paul StewartReturn<void> Keystore::sign( 542b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart const hidl_string& keyId, const hidl_vec<uint8_t>& dataToSign, 552b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart sign_cb _hidl_cb) { 562b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart sp<IKeystoreService> service = interface_cast<IKeystoreService>( 572b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart defaultServiceManager()->getService( 582b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart String16("android.security.keystore"))); 592b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart if (service == nullptr) { 602b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart _hidl_cb(KeystoreStatusCode::ERROR_UNKNOWN, {}); 612b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart return Void(); 622b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart } 632b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart hidl_vec<uint8_t> signedData; 64c620a935eb7447523c380c4e5832a1ad332697f8Scott Randolph auto ret = service->sign(String16(keyId.c_str()), dataToSign, &signedData); 652b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart if (!ret.isOk()) { 662b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart _hidl_cb(KeystoreStatusCode::ERROR_UNKNOWN, {}); 672b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart return Void(); 682b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart } 692b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart _hidl_cb(KeystoreStatusCode::SUCCESS, signedData); 702b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart return Void(); 712b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart} 722b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart 732b1020d6d79f97e6bd9268453ad30282a86e9304Paul StewartIKeystore* HIDL_FETCH_IKeystore(const char* /* name */) { 742b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart return new Keystore(); 752b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart} 762b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart} // namespace implementation 772b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart} // namespace V1_0 782b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart} // namespace keystore 792b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart} // namespace wifi 802b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart} // namespace system 812b1020d6d79f97e6bd9268453ad30282a86e9304Paul Stewart} // namespace android 82