1#include <android-base/logging.h>
2#include <binder/IServiceManager.h>
3#include <keystore/IKeystoreService.h>
4#include <private/android_filesystem_config.h>
5
6#include "include/wifikeystorehal/keystore.h"
7
8namespace android {
9namespace system {
10namespace wifi {
11namespace keystore {
12namespace V1_0 {
13namespace implementation {
14// Methods from ::android::hardware::wifi::keystore::V1_0::IKeystore follow.
15Return<void> Keystore::getBlob(const hidl_string& key, getBlob_cb _hidl_cb) {
16  sp<IKeystoreService> service = interface_cast<IKeystoreService>(
17          defaultServiceManager()->getService(
18                  String16("android.security.keystore")));
19  if (service == nullptr) {
20    _hidl_cb(KeystoreStatusCode::ERROR_UNKNOWN, {});
21    return Void();
22  }
23  hidl_vec<uint8_t> value;
24  // Retrieve the blob as wifi user.
25  auto ret = service->get(String16(key.c_str()), AID_WIFI, &value);
26  if (!ret.isOk()) {
27    _hidl_cb(KeystoreStatusCode::ERROR_UNKNOWN, {});
28    return Void();
29  }
30  _hidl_cb(KeystoreStatusCode::SUCCESS, value);
31  return Void();
32}
33
34Return<void> Keystore::getPublicKey(
35        const hidl_string& keyId, getPublicKey_cb _hidl_cb) {
36  sp<IKeystoreService> service = interface_cast<IKeystoreService>(
37          defaultServiceManager()->getService(
38                  String16("android.security.keystore")));
39  if (service == nullptr) {
40    _hidl_cb(KeystoreStatusCode::ERROR_UNKNOWN, {});
41    return Void();
42  }
43  hidl_vec<uint8_t> pubkey;
44  auto ret = service->get_pubkey(String16(keyId.c_str()), &pubkey);
45  if (!ret.isOk()) {
46    _hidl_cb(KeystoreStatusCode::ERROR_UNKNOWN, {});
47    return Void();
48  }
49  _hidl_cb(KeystoreStatusCode::SUCCESS, pubkey);
50  return Void();
51}
52
53Return<void> Keystore::sign(
54        const hidl_string& keyId, const hidl_vec<uint8_t>& dataToSign,
55        sign_cb _hidl_cb) {
56  sp<IKeystoreService> service = interface_cast<IKeystoreService>(
57          defaultServiceManager()->getService(
58                  String16("android.security.keystore")));
59  if (service == nullptr) {
60    _hidl_cb(KeystoreStatusCode::ERROR_UNKNOWN, {});
61    return Void();
62  }
63  hidl_vec<uint8_t> signedData;
64  auto ret = service->sign(String16(keyId.c_str()), dataToSign, &signedData);
65  if (!ret.isOk()) {
66    _hidl_cb(KeystoreStatusCode::ERROR_UNKNOWN, {});
67    return Void();
68  }
69  _hidl_cb(KeystoreStatusCode::SUCCESS, signedData);
70  return Void();
71}
72
73IKeystore* HIDL_FETCH_IKeystore(const char* /* name */) {
74    return new Keystore();
75}
76}  // namespace implementation
77}  // namespace V1_0
78}  // namespace keystore
79}  // namespace wifi
80}  // namespace system
81}  // namespace android
82