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