#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