1*789431f2SAndroid Build Coastguard Worker /*
2*789431f2SAndroid Build Coastguard Worker **
3*789431f2SAndroid Build Coastguard Worker ** Copyright 2016, The Android Open Source Project
4*789431f2SAndroid Build Coastguard Worker **
5*789431f2SAndroid Build Coastguard Worker ** Licensed under the Apache License, Version 2.0 (the "License");
6*789431f2SAndroid Build Coastguard Worker ** you may not use this file except in compliance with the License.
7*789431f2SAndroid Build Coastguard Worker ** You may obtain a copy of the License at
8*789431f2SAndroid Build Coastguard Worker **
9*789431f2SAndroid Build Coastguard Worker ** http://www.apache.org/licenses/LICENSE-2.0
10*789431f2SAndroid Build Coastguard Worker **
11*789431f2SAndroid Build Coastguard Worker ** Unless required by applicable law or agreed to in writing, software
12*789431f2SAndroid Build Coastguard Worker ** distributed under the License is distributed on an "AS IS" BASIS,
13*789431f2SAndroid Build Coastguard Worker ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*789431f2SAndroid Build Coastguard Worker ** See the License for the specific language governing permissions and
15*789431f2SAndroid Build Coastguard Worker ** limitations under the License.
16*789431f2SAndroid Build Coastguard Worker */
17*789431f2SAndroid Build Coastguard Worker
18*789431f2SAndroid Build Coastguard Worker #define LOG_TAG "[email protected]"
19*789431f2SAndroid Build Coastguard Worker
20*789431f2SAndroid Build Coastguard Worker #include "include/AndroidKeymaster3Device.h"
21*789431f2SAndroid Build Coastguard Worker
22*789431f2SAndroid Build Coastguard Worker #include <android/log.h>
23*789431f2SAndroid Build Coastguard Worker
24*789431f2SAndroid Build Coastguard Worker #include "keymaster_tags.h"
25*789431f2SAndroid Build Coastguard Worker
26*789431f2SAndroid Build Coastguard Worker #include <keymaster/android_keymaster.h>
27*789431f2SAndroid Build Coastguard Worker #include <keymaster/android_keymaster_messages.h>
28*789431f2SAndroid Build Coastguard Worker #include <keymaster/contexts/keymaster1_passthrough_context.h>
29*789431f2SAndroid Build Coastguard Worker #include <keymaster/contexts/keymaster2_passthrough_context.h>
30*789431f2SAndroid Build Coastguard Worker #include <keymaster/contexts/pure_soft_keymaster_context.h>
31*789431f2SAndroid Build Coastguard Worker #include <keymaster/contexts/soft_keymaster_context.h>
32*789431f2SAndroid Build Coastguard Worker #include <keymaster/keymaster_configuration.h>
33*789431f2SAndroid Build Coastguard Worker #include <keymaster/keymaster_enforcement.h>
34*789431f2SAndroid Build Coastguard Worker #include <keymaster/km_openssl/soft_keymaster_enforcement.h>
35*789431f2SAndroid Build Coastguard Worker
36*789431f2SAndroid Build Coastguard Worker using ::keymaster::AbortOperationRequest;
37*789431f2SAndroid Build Coastguard Worker using ::keymaster::AbortOperationResponse;
38*789431f2SAndroid Build Coastguard Worker using ::keymaster::AddEntropyRequest;
39*789431f2SAndroid Build Coastguard Worker using ::keymaster::AddEntropyResponse;
40*789431f2SAndroid Build Coastguard Worker using ::keymaster::AttestKeyRequest;
41*789431f2SAndroid Build Coastguard Worker using ::keymaster::AttestKeyResponse;
42*789431f2SAndroid Build Coastguard Worker using ::keymaster::AuthorizationSet;
43*789431f2SAndroid Build Coastguard Worker using ::keymaster::BeginOperationRequest;
44*789431f2SAndroid Build Coastguard Worker using ::keymaster::BeginOperationResponse;
45*789431f2SAndroid Build Coastguard Worker using ::keymaster::ExportKeyRequest;
46*789431f2SAndroid Build Coastguard Worker using ::keymaster::ExportKeyResponse;
47*789431f2SAndroid Build Coastguard Worker using ::keymaster::FinishOperationRequest;
48*789431f2SAndroid Build Coastguard Worker using ::keymaster::FinishOperationResponse;
49*789431f2SAndroid Build Coastguard Worker using ::keymaster::GenerateKeyRequest;
50*789431f2SAndroid Build Coastguard Worker using ::keymaster::GenerateKeyResponse;
51*789431f2SAndroid Build Coastguard Worker using ::keymaster::GetKeyCharacteristicsRequest;
52*789431f2SAndroid Build Coastguard Worker using ::keymaster::GetKeyCharacteristicsResponse;
53*789431f2SAndroid Build Coastguard Worker using ::keymaster::ImportKeyRequest;
54*789431f2SAndroid Build Coastguard Worker using ::keymaster::ImportKeyResponse;
55*789431f2SAndroid Build Coastguard Worker using ::keymaster::UpdateOperationRequest;
56*789431f2SAndroid Build Coastguard Worker using ::keymaster::UpdateOperationResponse;
57*789431f2SAndroid Build Coastguard Worker
58*789431f2SAndroid Build Coastguard Worker namespace keymaster {
59*789431f2SAndroid Build Coastguard Worker namespace ng {
60*789431f2SAndroid Build Coastguard Worker
61*789431f2SAndroid Build Coastguard Worker namespace {
62*789431f2SAndroid Build Coastguard Worker
63*789431f2SAndroid Build Coastguard Worker constexpr size_t kOperationTableSize = 16;
64*789431f2SAndroid Build Coastguard Worker
legacy_enum_conversion(const Tag value)65*789431f2SAndroid Build Coastguard Worker inline keymaster_tag_t legacy_enum_conversion(const Tag value) {
66*789431f2SAndroid Build Coastguard Worker return keymaster_tag_t(value);
67*789431f2SAndroid Build Coastguard Worker }
legacy_enum_conversion(const keymaster_tag_t value)68*789431f2SAndroid Build Coastguard Worker inline Tag legacy_enum_conversion(const keymaster_tag_t value) {
69*789431f2SAndroid Build Coastguard Worker return Tag(value);
70*789431f2SAndroid Build Coastguard Worker }
legacy_enum_conversion(const KeyPurpose value)71*789431f2SAndroid Build Coastguard Worker inline keymaster_purpose_t legacy_enum_conversion(const KeyPurpose value) {
72*789431f2SAndroid Build Coastguard Worker return keymaster_purpose_t(value);
73*789431f2SAndroid Build Coastguard Worker }
legacy_enum_conversion(const KeyFormat value)74*789431f2SAndroid Build Coastguard Worker inline keymaster_key_format_t legacy_enum_conversion(const KeyFormat value) {
75*789431f2SAndroid Build Coastguard Worker return keymaster_key_format_t(value);
76*789431f2SAndroid Build Coastguard Worker }
legacy_enum_conversion(const keymaster_error_t value)77*789431f2SAndroid Build Coastguard Worker inline ErrorCode legacy_enum_conversion(const keymaster_error_t value) {
78*789431f2SAndroid Build Coastguard Worker return ErrorCode(value);
79*789431f2SAndroid Build Coastguard Worker }
80*789431f2SAndroid Build Coastguard Worker
typeFromTag(const keymaster_tag_t tag)81*789431f2SAndroid Build Coastguard Worker inline keymaster_tag_type_t typeFromTag(const keymaster_tag_t tag) {
82*789431f2SAndroid Build Coastguard Worker return keymaster_tag_get_type(tag);
83*789431f2SAndroid Build Coastguard Worker }
84*789431f2SAndroid Build Coastguard Worker
85*789431f2SAndroid Build Coastguard Worker class KmParamSet : public keymaster_key_param_set_t {
86*789431f2SAndroid Build Coastguard Worker public:
KmParamSet(const hidl_vec<KeyParameter> & keyParams)87*789431f2SAndroid Build Coastguard Worker explicit KmParamSet(const hidl_vec<KeyParameter>& keyParams) {
88*789431f2SAndroid Build Coastguard Worker params = new (std::nothrow) keymaster_key_param_t[keyParams.size()];
89*789431f2SAndroid Build Coastguard Worker length = keyParams.size();
90*789431f2SAndroid Build Coastguard Worker for (size_t i = 0; i < keyParams.size(); ++i) {
91*789431f2SAndroid Build Coastguard Worker auto tag = legacy_enum_conversion(keyParams[i].tag);
92*789431f2SAndroid Build Coastguard Worker switch (typeFromTag(tag)) {
93*789431f2SAndroid Build Coastguard Worker case KM_ENUM:
94*789431f2SAndroid Build Coastguard Worker case KM_ENUM_REP:
95*789431f2SAndroid Build Coastguard Worker params[i] = keymaster_param_enum(tag, keyParams[i].f.integer);
96*789431f2SAndroid Build Coastguard Worker break;
97*789431f2SAndroid Build Coastguard Worker case KM_UINT:
98*789431f2SAndroid Build Coastguard Worker case KM_UINT_REP:
99*789431f2SAndroid Build Coastguard Worker params[i] = keymaster_param_int(tag, keyParams[i].f.integer);
100*789431f2SAndroid Build Coastguard Worker break;
101*789431f2SAndroid Build Coastguard Worker case KM_ULONG:
102*789431f2SAndroid Build Coastguard Worker case KM_ULONG_REP:
103*789431f2SAndroid Build Coastguard Worker params[i] = keymaster_param_long(tag, keyParams[i].f.longInteger);
104*789431f2SAndroid Build Coastguard Worker break;
105*789431f2SAndroid Build Coastguard Worker case KM_DATE:
106*789431f2SAndroid Build Coastguard Worker params[i] = keymaster_param_date(tag, keyParams[i].f.dateTime);
107*789431f2SAndroid Build Coastguard Worker break;
108*789431f2SAndroid Build Coastguard Worker case KM_BOOL:
109*789431f2SAndroid Build Coastguard Worker if (keyParams[i].f.boolValue)
110*789431f2SAndroid Build Coastguard Worker params[i] = keymaster_param_bool(tag);
111*789431f2SAndroid Build Coastguard Worker else
112*789431f2SAndroid Build Coastguard Worker params[i].tag = KM_TAG_INVALID;
113*789431f2SAndroid Build Coastguard Worker break;
114*789431f2SAndroid Build Coastguard Worker case KM_BIGNUM:
115*789431f2SAndroid Build Coastguard Worker case KM_BYTES:
116*789431f2SAndroid Build Coastguard Worker params[i] =
117*789431f2SAndroid Build Coastguard Worker keymaster_param_blob(tag, &keyParams[i].blob[0], keyParams[i].blob.size());
118*789431f2SAndroid Build Coastguard Worker break;
119*789431f2SAndroid Build Coastguard Worker case KM_INVALID:
120*789431f2SAndroid Build Coastguard Worker default:
121*789431f2SAndroid Build Coastguard Worker params[i].tag = KM_TAG_INVALID;
122*789431f2SAndroid Build Coastguard Worker /* just skip */
123*789431f2SAndroid Build Coastguard Worker break;
124*789431f2SAndroid Build Coastguard Worker }
125*789431f2SAndroid Build Coastguard Worker }
126*789431f2SAndroid Build Coastguard Worker }
KmParamSet(KmParamSet && other)127*789431f2SAndroid Build Coastguard Worker KmParamSet(KmParamSet&& other) : keymaster_key_param_set_t{other.params, other.length} {
128*789431f2SAndroid Build Coastguard Worker other.length = 0;
129*789431f2SAndroid Build Coastguard Worker other.params = nullptr;
130*789431f2SAndroid Build Coastguard Worker }
131*789431f2SAndroid Build Coastguard Worker KmParamSet(const KmParamSet&) = delete;
~KmParamSet()132*789431f2SAndroid Build Coastguard Worker ~KmParamSet() { delete[] params; }
133*789431f2SAndroid Build Coastguard Worker };
134*789431f2SAndroid Build Coastguard Worker
kmBlob2hidlVec(const keymaster_key_blob_t & blob)135*789431f2SAndroid Build Coastguard Worker inline hidl_vec<uint8_t> kmBlob2hidlVec(const keymaster_key_blob_t& blob) {
136*789431f2SAndroid Build Coastguard Worker hidl_vec<uint8_t> result;
137*789431f2SAndroid Build Coastguard Worker result.setToExternal(const_cast<unsigned char*>(blob.key_material), blob.key_material_size);
138*789431f2SAndroid Build Coastguard Worker return result;
139*789431f2SAndroid Build Coastguard Worker }
140*789431f2SAndroid Build Coastguard Worker
kmBlob2hidlVec(const keymaster_blob_t & blob)141*789431f2SAndroid Build Coastguard Worker inline hidl_vec<uint8_t> kmBlob2hidlVec(const keymaster_blob_t& blob) {
142*789431f2SAndroid Build Coastguard Worker hidl_vec<uint8_t> result;
143*789431f2SAndroid Build Coastguard Worker result.setToExternal(const_cast<unsigned char*>(blob.data), blob.data_length);
144*789431f2SAndroid Build Coastguard Worker return result;
145*789431f2SAndroid Build Coastguard Worker }
146*789431f2SAndroid Build Coastguard Worker
kmBuffer2hidlVec(const::keymaster::Buffer & buf)147*789431f2SAndroid Build Coastguard Worker inline hidl_vec<uint8_t> kmBuffer2hidlVec(const ::keymaster::Buffer& buf) {
148*789431f2SAndroid Build Coastguard Worker hidl_vec<uint8_t> result;
149*789431f2SAndroid Build Coastguard Worker result.setToExternal(const_cast<unsigned char*>(buf.peek_read()), buf.available_read());
150*789431f2SAndroid Build Coastguard Worker return result;
151*789431f2SAndroid Build Coastguard Worker }
152*789431f2SAndroid Build Coastguard Worker
153*789431f2SAndroid Build Coastguard Worker inline static hidl_vec<hidl_vec<uint8_t>>
kmCertChain2Hidl(const keymaster_cert_chain_t & cert_chain)154*789431f2SAndroid Build Coastguard Worker kmCertChain2Hidl(const keymaster_cert_chain_t& cert_chain) {
155*789431f2SAndroid Build Coastguard Worker hidl_vec<hidl_vec<uint8_t>> result;
156*789431f2SAndroid Build Coastguard Worker if (!cert_chain.entry_count || !cert_chain.entries) return result;
157*789431f2SAndroid Build Coastguard Worker
158*789431f2SAndroid Build Coastguard Worker result.resize(cert_chain.entry_count);
159*789431f2SAndroid Build Coastguard Worker for (size_t i = 0; i < cert_chain.entry_count; ++i) {
160*789431f2SAndroid Build Coastguard Worker result[i] = kmBlob2hidlVec(cert_chain.entries[i]);
161*789431f2SAndroid Build Coastguard Worker }
162*789431f2SAndroid Build Coastguard Worker
163*789431f2SAndroid Build Coastguard Worker return result;
164*789431f2SAndroid Build Coastguard Worker }
165*789431f2SAndroid Build Coastguard Worker
kmParamSet2Hidl(const keymaster_key_param_set_t & set)166*789431f2SAndroid Build Coastguard Worker static inline hidl_vec<KeyParameter> kmParamSet2Hidl(const keymaster_key_param_set_t& set) {
167*789431f2SAndroid Build Coastguard Worker hidl_vec<KeyParameter> result;
168*789431f2SAndroid Build Coastguard Worker if (set.length == 0 || set.params == nullptr) return result;
169*789431f2SAndroid Build Coastguard Worker
170*789431f2SAndroid Build Coastguard Worker result.resize(set.length);
171*789431f2SAndroid Build Coastguard Worker keymaster_key_param_t* params = set.params;
172*789431f2SAndroid Build Coastguard Worker for (size_t i = 0; i < set.length; ++i) {
173*789431f2SAndroid Build Coastguard Worker auto tag = params[i].tag;
174*789431f2SAndroid Build Coastguard Worker result[i].tag = legacy_enum_conversion(tag);
175*789431f2SAndroid Build Coastguard Worker switch (typeFromTag(tag)) {
176*789431f2SAndroid Build Coastguard Worker case KM_ENUM:
177*789431f2SAndroid Build Coastguard Worker case KM_ENUM_REP:
178*789431f2SAndroid Build Coastguard Worker result[i].f.integer = params[i].enumerated;
179*789431f2SAndroid Build Coastguard Worker break;
180*789431f2SAndroid Build Coastguard Worker case KM_UINT:
181*789431f2SAndroid Build Coastguard Worker case KM_UINT_REP:
182*789431f2SAndroid Build Coastguard Worker result[i].f.integer = params[i].integer;
183*789431f2SAndroid Build Coastguard Worker break;
184*789431f2SAndroid Build Coastguard Worker case KM_ULONG:
185*789431f2SAndroid Build Coastguard Worker case KM_ULONG_REP:
186*789431f2SAndroid Build Coastguard Worker result[i].f.longInteger = params[i].long_integer;
187*789431f2SAndroid Build Coastguard Worker break;
188*789431f2SAndroid Build Coastguard Worker case KM_DATE:
189*789431f2SAndroid Build Coastguard Worker result[i].f.dateTime = params[i].date_time;
190*789431f2SAndroid Build Coastguard Worker break;
191*789431f2SAndroid Build Coastguard Worker case KM_BOOL:
192*789431f2SAndroid Build Coastguard Worker result[i].f.boolValue = params[i].boolean;
193*789431f2SAndroid Build Coastguard Worker break;
194*789431f2SAndroid Build Coastguard Worker case KM_BIGNUM:
195*789431f2SAndroid Build Coastguard Worker case KM_BYTES:
196*789431f2SAndroid Build Coastguard Worker result[i].blob.setToExternal(const_cast<unsigned char*>(params[i].blob.data),
197*789431f2SAndroid Build Coastguard Worker params[i].blob.data_length);
198*789431f2SAndroid Build Coastguard Worker break;
199*789431f2SAndroid Build Coastguard Worker case KM_INVALID:
200*789431f2SAndroid Build Coastguard Worker default:
201*789431f2SAndroid Build Coastguard Worker params[i].tag = KM_TAG_INVALID;
202*789431f2SAndroid Build Coastguard Worker /* just skip */
203*789431f2SAndroid Build Coastguard Worker break;
204*789431f2SAndroid Build Coastguard Worker }
205*789431f2SAndroid Build Coastguard Worker }
206*789431f2SAndroid Build Coastguard Worker return result;
207*789431f2SAndroid Build Coastguard Worker }
208*789431f2SAndroid Build Coastguard Worker
addClientAndAppData(const hidl_vec<uint8_t> & clientId,const hidl_vec<uint8_t> & appData,::keymaster::AuthorizationSet * params)209*789431f2SAndroid Build Coastguard Worker void addClientAndAppData(const hidl_vec<uint8_t>& clientId, const hidl_vec<uint8_t>& appData,
210*789431f2SAndroid Build Coastguard Worker ::keymaster::AuthorizationSet* params) {
211*789431f2SAndroid Build Coastguard Worker params->Clear();
212*789431f2SAndroid Build Coastguard Worker if (clientId.size()) {
213*789431f2SAndroid Build Coastguard Worker params->push_back(::keymaster::TAG_APPLICATION_ID, clientId.data(), clientId.size());
214*789431f2SAndroid Build Coastguard Worker }
215*789431f2SAndroid Build Coastguard Worker if (appData.size()) {
216*789431f2SAndroid Build Coastguard Worker params->push_back(::keymaster::TAG_APPLICATION_DATA, appData.data(), appData.size());
217*789431f2SAndroid Build Coastguard Worker }
218*789431f2SAndroid Build Coastguard Worker }
219*789431f2SAndroid Build Coastguard Worker
220*789431f2SAndroid Build Coastguard Worker } // anonymous namespace
221*789431f2SAndroid Build Coastguard Worker
AndroidKeymaster3Device()222*789431f2SAndroid Build Coastguard Worker AndroidKeymaster3Device::AndroidKeymaster3Device()
223*789431f2SAndroid Build Coastguard Worker : impl_(new (std::nothrow)::keymaster::AndroidKeymaster(
224*789431f2SAndroid Build Coastguard Worker []() -> auto{
225*789431f2SAndroid Build Coastguard Worker auto context = new (std::nothrow) PureSoftKeymasterContext(KmVersion::KEYMASTER_3);
226*789431f2SAndroid Build Coastguard Worker context->SetSystemVersion(GetOsVersion(), GetOsPatchlevel());
227*789431f2SAndroid Build Coastguard Worker context->SetVendorPatchlevel(GetVendorPatchlevel());
228*789431f2SAndroid Build Coastguard Worker // Software devices cannot be configured by the boot loader but they have
229*789431f2SAndroid Build Coastguard Worker // to return a boot patch level. So lets just return the OS patch level.
230*789431f2SAndroid Build Coastguard Worker // The OS patch level only has a year and a month so we just add the 1st
231*789431f2SAndroid Build Coastguard Worker // of the month as day field.
232*789431f2SAndroid Build Coastguard Worker context->SetBootPatchlevel(GetOsPatchlevel() * 100 + 1);
233*789431f2SAndroid Build Coastguard Worker return context;
234*789431f2SAndroid Build Coastguard Worker }(),
235*789431f2SAndroid Build Coastguard Worker kOperationTableSize)),
236*789431f2SAndroid Build Coastguard Worker profile_(KeymasterHardwareProfile::SW) {}
237*789431f2SAndroid Build Coastguard Worker
AndroidKeymaster3Device(KeymasterContext * context,KeymasterHardwareProfile profile)238*789431f2SAndroid Build Coastguard Worker AndroidKeymaster3Device::AndroidKeymaster3Device(KeymasterContext* context,
239*789431f2SAndroid Build Coastguard Worker KeymasterHardwareProfile profile)
240*789431f2SAndroid Build Coastguard Worker : impl_(new (std::nothrow)::keymaster::AndroidKeymaster(context, kOperationTableSize)),
241*789431f2SAndroid Build Coastguard Worker profile_(profile) {}
242*789431f2SAndroid Build Coastguard Worker
~AndroidKeymaster3Device()243*789431f2SAndroid Build Coastguard Worker AndroidKeymaster3Device::~AndroidKeymaster3Device() {}
244*789431f2SAndroid Build Coastguard Worker
245*789431f2SAndroid Build Coastguard Worker // Methods from ::android::hardware::keymaster::V3_0::IKeymasterDevice follow.
getHardwareFeatures(getHardwareFeatures_cb _hidl_cb)246*789431f2SAndroid Build Coastguard Worker Return<void> AndroidKeymaster3Device::getHardwareFeatures(getHardwareFeatures_cb _hidl_cb) {
247*789431f2SAndroid Build Coastguard Worker switch (profile_) {
248*789431f2SAndroid Build Coastguard Worker case KeymasterHardwareProfile::KM0:
249*789431f2SAndroid Build Coastguard Worker _hidl_cb(true /* is_secure */, false /* supports_ec */,
250*789431f2SAndroid Build Coastguard Worker false /* supports_symmetric_cryptography */, false /* supports_attestation */,
251*789431f2SAndroid Build Coastguard Worker false /* supportsAllDigests */, "SoftwareWrappedKeymaster0Device", "Google");
252*789431f2SAndroid Build Coastguard Worker break;
253*789431f2SAndroid Build Coastguard Worker case KeymasterHardwareProfile::KM1:
254*789431f2SAndroid Build Coastguard Worker _hidl_cb(true /* is_secure */, true /* supports_ec */,
255*789431f2SAndroid Build Coastguard Worker true /* supports_symmetric_cryptography */, false /* supports_attestation */,
256*789431f2SAndroid Build Coastguard Worker false /* supportsAllDigests */, "SoftwareWrappedKeymaster1Device", "Google");
257*789431f2SAndroid Build Coastguard Worker break;
258*789431f2SAndroid Build Coastguard Worker case KeymasterHardwareProfile::KM2:
259*789431f2SAndroid Build Coastguard Worker _hidl_cb(true /* is_secure */, true /* supports_ec */,
260*789431f2SAndroid Build Coastguard Worker true /* supports_symmetric_cryptography */, true /* supports_attestation */,
261*789431f2SAndroid Build Coastguard Worker true /* supportsAllDigests */, "SoftwareWrappedKeymaster2Device", "Google");
262*789431f2SAndroid Build Coastguard Worker break;
263*789431f2SAndroid Build Coastguard Worker case KeymasterHardwareProfile::SW:
264*789431f2SAndroid Build Coastguard Worker default:
265*789431f2SAndroid Build Coastguard Worker _hidl_cb(false /* is_secure */, false /* supports_ec */,
266*789431f2SAndroid Build Coastguard Worker false /* supports_symmetric_cryptography */, false /* supports_attestation */,
267*789431f2SAndroid Build Coastguard Worker false /* supportsAllDigests */, "SoftwareKeymasterDevice", "Google");
268*789431f2SAndroid Build Coastguard Worker break;
269*789431f2SAndroid Build Coastguard Worker }
270*789431f2SAndroid Build Coastguard Worker return Void();
271*789431f2SAndroid Build Coastguard Worker }
272*789431f2SAndroid Build Coastguard Worker
addRngEntropy(const hidl_vec<uint8_t> & data)273*789431f2SAndroid Build Coastguard Worker Return<ErrorCode> AndroidKeymaster3Device::addRngEntropy(const hidl_vec<uint8_t>& data) {
274*789431f2SAndroid Build Coastguard Worker if (data.size() == 0) return ErrorCode::OK;
275*789431f2SAndroid Build Coastguard Worker AddEntropyRequest request(impl_->message_version());
276*789431f2SAndroid Build Coastguard Worker request.random_data.Reinitialize(data.data(), data.size());
277*789431f2SAndroid Build Coastguard Worker
278*789431f2SAndroid Build Coastguard Worker AddEntropyResponse response(impl_->message_version());
279*789431f2SAndroid Build Coastguard Worker impl_->AddRngEntropy(request, &response);
280*789431f2SAndroid Build Coastguard Worker
281*789431f2SAndroid Build Coastguard Worker return legacy_enum_conversion(response.error);
282*789431f2SAndroid Build Coastguard Worker }
283*789431f2SAndroid Build Coastguard Worker
generateKey(const hidl_vec<KeyParameter> & keyParams,generateKey_cb _hidl_cb)284*789431f2SAndroid Build Coastguard Worker Return<void> AndroidKeymaster3Device::generateKey(const hidl_vec<KeyParameter>& keyParams,
285*789431f2SAndroid Build Coastguard Worker generateKey_cb _hidl_cb) {
286*789431f2SAndroid Build Coastguard Worker GenerateKeyRequest request(impl_->message_version());
287*789431f2SAndroid Build Coastguard Worker request.key_description.Reinitialize(KmParamSet(keyParams));
288*789431f2SAndroid Build Coastguard Worker
289*789431f2SAndroid Build Coastguard Worker GenerateKeyResponse response(impl_->message_version());
290*789431f2SAndroid Build Coastguard Worker impl_->GenerateKey(request, &response);
291*789431f2SAndroid Build Coastguard Worker
292*789431f2SAndroid Build Coastguard Worker KeyCharacteristics resultCharacteristics;
293*789431f2SAndroid Build Coastguard Worker hidl_vec<uint8_t> resultKeyBlob;
294*789431f2SAndroid Build Coastguard Worker if (response.error == KM_ERROR_OK) {
295*789431f2SAndroid Build Coastguard Worker resultKeyBlob = kmBlob2hidlVec(response.key_blob);
296*789431f2SAndroid Build Coastguard Worker resultCharacteristics.teeEnforced = kmParamSet2Hidl(response.enforced);
297*789431f2SAndroid Build Coastguard Worker resultCharacteristics.softwareEnforced = kmParamSet2Hidl(response.unenforced);
298*789431f2SAndroid Build Coastguard Worker }
299*789431f2SAndroid Build Coastguard Worker _hidl_cb(legacy_enum_conversion(response.error), resultKeyBlob, resultCharacteristics);
300*789431f2SAndroid Build Coastguard Worker return Void();
301*789431f2SAndroid Build Coastguard Worker }
302*789431f2SAndroid Build Coastguard Worker
getKeyCharacteristics(const hidl_vec<uint8_t> & keyBlob,const hidl_vec<uint8_t> & clientId,const hidl_vec<uint8_t> & appData,getKeyCharacteristics_cb _hidl_cb)303*789431f2SAndroid Build Coastguard Worker Return<void> AndroidKeymaster3Device::getKeyCharacteristics(const hidl_vec<uint8_t>& keyBlob,
304*789431f2SAndroid Build Coastguard Worker const hidl_vec<uint8_t>& clientId,
305*789431f2SAndroid Build Coastguard Worker const hidl_vec<uint8_t>& appData,
306*789431f2SAndroid Build Coastguard Worker getKeyCharacteristics_cb _hidl_cb) {
307*789431f2SAndroid Build Coastguard Worker GetKeyCharacteristicsRequest request(impl_->message_version());
308*789431f2SAndroid Build Coastguard Worker request.SetKeyMaterial(keyBlob.data(), keyBlob.size());
309*789431f2SAndroid Build Coastguard Worker addClientAndAppData(clientId, appData, &request.additional_params);
310*789431f2SAndroid Build Coastguard Worker
311*789431f2SAndroid Build Coastguard Worker GetKeyCharacteristicsResponse response(impl_->message_version());
312*789431f2SAndroid Build Coastguard Worker impl_->GetKeyCharacteristics(request, &response);
313*789431f2SAndroid Build Coastguard Worker
314*789431f2SAndroid Build Coastguard Worker KeyCharacteristics resultCharacteristics;
315*789431f2SAndroid Build Coastguard Worker if (response.error == KM_ERROR_OK) {
316*789431f2SAndroid Build Coastguard Worker resultCharacteristics.teeEnforced = kmParamSet2Hidl(response.enforced);
317*789431f2SAndroid Build Coastguard Worker resultCharacteristics.softwareEnforced = kmParamSet2Hidl(response.unenforced);
318*789431f2SAndroid Build Coastguard Worker }
319*789431f2SAndroid Build Coastguard Worker _hidl_cb(legacy_enum_conversion(response.error), resultCharacteristics);
320*789431f2SAndroid Build Coastguard Worker return Void();
321*789431f2SAndroid Build Coastguard Worker }
322*789431f2SAndroid Build Coastguard Worker
importKey(const hidl_vec<KeyParameter> & params,KeyFormat keyFormat,const hidl_vec<uint8_t> & keyData,importKey_cb _hidl_cb)323*789431f2SAndroid Build Coastguard Worker Return<void> AndroidKeymaster3Device::importKey(const hidl_vec<KeyParameter>& params,
324*789431f2SAndroid Build Coastguard Worker KeyFormat keyFormat,
325*789431f2SAndroid Build Coastguard Worker const hidl_vec<uint8_t>& keyData,
326*789431f2SAndroid Build Coastguard Worker importKey_cb _hidl_cb) {
327*789431f2SAndroid Build Coastguard Worker ImportKeyRequest request(impl_->message_version());
328*789431f2SAndroid Build Coastguard Worker request.key_description.Reinitialize(KmParamSet(params));
329*789431f2SAndroid Build Coastguard Worker request.key_format = legacy_enum_conversion(keyFormat);
330*789431f2SAndroid Build Coastguard Worker request.key_data = KeymasterKeyBlob(keyData.data(), keyData.size());
331*789431f2SAndroid Build Coastguard Worker
332*789431f2SAndroid Build Coastguard Worker ImportKeyResponse response(impl_->message_version());
333*789431f2SAndroid Build Coastguard Worker impl_->ImportKey(request, &response);
334*789431f2SAndroid Build Coastguard Worker
335*789431f2SAndroid Build Coastguard Worker KeyCharacteristics resultCharacteristics;
336*789431f2SAndroid Build Coastguard Worker hidl_vec<uint8_t> resultKeyBlob;
337*789431f2SAndroid Build Coastguard Worker if (response.error == KM_ERROR_OK) {
338*789431f2SAndroid Build Coastguard Worker resultKeyBlob = kmBlob2hidlVec(response.key_blob);
339*789431f2SAndroid Build Coastguard Worker resultCharacteristics.teeEnforced = kmParamSet2Hidl(response.enforced);
340*789431f2SAndroid Build Coastguard Worker resultCharacteristics.softwareEnforced = kmParamSet2Hidl(response.unenforced);
341*789431f2SAndroid Build Coastguard Worker }
342*789431f2SAndroid Build Coastguard Worker _hidl_cb(legacy_enum_conversion(response.error), resultKeyBlob, resultCharacteristics);
343*789431f2SAndroid Build Coastguard Worker return Void();
344*789431f2SAndroid Build Coastguard Worker }
345*789431f2SAndroid Build Coastguard Worker
exportKey(KeyFormat exportFormat,const hidl_vec<uint8_t> & keyBlob,const hidl_vec<uint8_t> & clientId,const hidl_vec<uint8_t> & appData,exportKey_cb _hidl_cb)346*789431f2SAndroid Build Coastguard Worker Return<void> AndroidKeymaster3Device::exportKey(KeyFormat exportFormat,
347*789431f2SAndroid Build Coastguard Worker const hidl_vec<uint8_t>& keyBlob,
348*789431f2SAndroid Build Coastguard Worker const hidl_vec<uint8_t>& clientId,
349*789431f2SAndroid Build Coastguard Worker const hidl_vec<uint8_t>& appData,
350*789431f2SAndroid Build Coastguard Worker exportKey_cb _hidl_cb) {
351*789431f2SAndroid Build Coastguard Worker ExportKeyRequest request(impl_->message_version());
352*789431f2SAndroid Build Coastguard Worker request.key_format = legacy_enum_conversion(exportFormat);
353*789431f2SAndroid Build Coastguard Worker request.SetKeyMaterial(keyBlob.data(), keyBlob.size());
354*789431f2SAndroid Build Coastguard Worker addClientAndAppData(clientId, appData, &request.additional_params);
355*789431f2SAndroid Build Coastguard Worker
356*789431f2SAndroid Build Coastguard Worker ExportKeyResponse response(impl_->message_version());
357*789431f2SAndroid Build Coastguard Worker impl_->ExportKey(request, &response);
358*789431f2SAndroid Build Coastguard Worker
359*789431f2SAndroid Build Coastguard Worker hidl_vec<uint8_t> resultKeyBlob;
360*789431f2SAndroid Build Coastguard Worker if (response.error == KM_ERROR_OK) {
361*789431f2SAndroid Build Coastguard Worker resultKeyBlob.setToExternal(response.key_data, response.key_data_length);
362*789431f2SAndroid Build Coastguard Worker }
363*789431f2SAndroid Build Coastguard Worker _hidl_cb(legacy_enum_conversion(response.error), resultKeyBlob);
364*789431f2SAndroid Build Coastguard Worker return Void();
365*789431f2SAndroid Build Coastguard Worker }
366*789431f2SAndroid Build Coastguard Worker
attestKey(const hidl_vec<uint8_t> & keyToAttest,const hidl_vec<KeyParameter> & attestParams,attestKey_cb _hidl_cb)367*789431f2SAndroid Build Coastguard Worker Return<void> AndroidKeymaster3Device::attestKey(const hidl_vec<uint8_t>& keyToAttest,
368*789431f2SAndroid Build Coastguard Worker const hidl_vec<KeyParameter>& attestParams,
369*789431f2SAndroid Build Coastguard Worker attestKey_cb _hidl_cb) {
370*789431f2SAndroid Build Coastguard Worker AttestKeyRequest request(impl_->message_version());
371*789431f2SAndroid Build Coastguard Worker request.SetKeyMaterial(keyToAttest.data(), keyToAttest.size());
372*789431f2SAndroid Build Coastguard Worker request.attest_params.Reinitialize(KmParamSet(attestParams));
373*789431f2SAndroid Build Coastguard Worker
374*789431f2SAndroid Build Coastguard Worker AttestKeyResponse response(impl_->message_version());
375*789431f2SAndroid Build Coastguard Worker impl_->AttestKey(request, &response);
376*789431f2SAndroid Build Coastguard Worker
377*789431f2SAndroid Build Coastguard Worker hidl_vec<hidl_vec<uint8_t>> resultCertChain;
378*789431f2SAndroid Build Coastguard Worker if (response.error == KM_ERROR_OK) {
379*789431f2SAndroid Build Coastguard Worker resultCertChain = kmCertChain2Hidl(response.certificate_chain);
380*789431f2SAndroid Build Coastguard Worker }
381*789431f2SAndroid Build Coastguard Worker _hidl_cb(legacy_enum_conversion(response.error), resultCertChain);
382*789431f2SAndroid Build Coastguard Worker return Void();
383*789431f2SAndroid Build Coastguard Worker }
384*789431f2SAndroid Build Coastguard Worker
upgradeKey(const hidl_vec<uint8_t> & keyBlobToUpgrade,const hidl_vec<KeyParameter> & upgradeParams,upgradeKey_cb _hidl_cb)385*789431f2SAndroid Build Coastguard Worker Return<void> AndroidKeymaster3Device::upgradeKey(const hidl_vec<uint8_t>& keyBlobToUpgrade,
386*789431f2SAndroid Build Coastguard Worker const hidl_vec<KeyParameter>& upgradeParams,
387*789431f2SAndroid Build Coastguard Worker upgradeKey_cb _hidl_cb) {
388*789431f2SAndroid Build Coastguard Worker // There's nothing to be done to upgrade software key blobs. Further, the software
389*789431f2SAndroid Build Coastguard Worker // implementation never returns ErrorCode::KEY_REQUIRES_UPGRADE, so this should never be called.
390*789431f2SAndroid Build Coastguard Worker UpgradeKeyRequest request(impl_->message_version());
391*789431f2SAndroid Build Coastguard Worker request.SetKeyMaterial(keyBlobToUpgrade.data(), keyBlobToUpgrade.size());
392*789431f2SAndroid Build Coastguard Worker request.upgrade_params.Reinitialize(KmParamSet(upgradeParams));
393*789431f2SAndroid Build Coastguard Worker
394*789431f2SAndroid Build Coastguard Worker UpgradeKeyResponse response(impl_->message_version());
395*789431f2SAndroid Build Coastguard Worker impl_->UpgradeKey(request, &response);
396*789431f2SAndroid Build Coastguard Worker
397*789431f2SAndroid Build Coastguard Worker if (response.error == KM_ERROR_OK) {
398*789431f2SAndroid Build Coastguard Worker _hidl_cb(ErrorCode::OK, kmBlob2hidlVec(response.upgraded_key));
399*789431f2SAndroid Build Coastguard Worker } else {
400*789431f2SAndroid Build Coastguard Worker _hidl_cb(legacy_enum_conversion(response.error), hidl_vec<uint8_t>());
401*789431f2SAndroid Build Coastguard Worker }
402*789431f2SAndroid Build Coastguard Worker return Void();
403*789431f2SAndroid Build Coastguard Worker }
404*789431f2SAndroid Build Coastguard Worker
deleteKey(const hidl_vec<uint8_t> & keyBlob)405*789431f2SAndroid Build Coastguard Worker Return<ErrorCode> AndroidKeymaster3Device::deleteKey(const hidl_vec<uint8_t>& keyBlob) {
406*789431f2SAndroid Build Coastguard Worker // There's nothing to be done to delete software key blobs.
407*789431f2SAndroid Build Coastguard Worker DeleteKeyRequest request(impl_->message_version());
408*789431f2SAndroid Build Coastguard Worker request.SetKeyMaterial(keyBlob.data(), keyBlob.size());
409*789431f2SAndroid Build Coastguard Worker
410*789431f2SAndroid Build Coastguard Worker DeleteKeyResponse response(impl_->message_version());
411*789431f2SAndroid Build Coastguard Worker impl_->DeleteKey(request, &response);
412*789431f2SAndroid Build Coastguard Worker
413*789431f2SAndroid Build Coastguard Worker return legacy_enum_conversion(response.error);
414*789431f2SAndroid Build Coastguard Worker }
415*789431f2SAndroid Build Coastguard Worker
deleteAllKeys()416*789431f2SAndroid Build Coastguard Worker Return<ErrorCode> AndroidKeymaster3Device::deleteAllKeys() {
417*789431f2SAndroid Build Coastguard Worker // There's nothing to be done to delete software key blobs.
418*789431f2SAndroid Build Coastguard Worker DeleteAllKeysRequest request(impl_->message_version());
419*789431f2SAndroid Build Coastguard Worker DeleteAllKeysResponse response(impl_->message_version());
420*789431f2SAndroid Build Coastguard Worker impl_->DeleteAllKeys(request, &response);
421*789431f2SAndroid Build Coastguard Worker
422*789431f2SAndroid Build Coastguard Worker return legacy_enum_conversion(response.error);
423*789431f2SAndroid Build Coastguard Worker }
424*789431f2SAndroid Build Coastguard Worker
destroyAttestationIds()425*789431f2SAndroid Build Coastguard Worker Return<ErrorCode> AndroidKeymaster3Device::destroyAttestationIds() {
426*789431f2SAndroid Build Coastguard Worker return ErrorCode::UNIMPLEMENTED;
427*789431f2SAndroid Build Coastguard Worker }
428*789431f2SAndroid Build Coastguard Worker
begin(KeyPurpose purpose,const hidl_vec<uint8_t> & key,const hidl_vec<KeyParameter> & inParams,begin_cb _hidl_cb)429*789431f2SAndroid Build Coastguard Worker Return<void> AndroidKeymaster3Device::begin(KeyPurpose purpose, const hidl_vec<uint8_t>& key,
430*789431f2SAndroid Build Coastguard Worker const hidl_vec<KeyParameter>& inParams,
431*789431f2SAndroid Build Coastguard Worker begin_cb _hidl_cb) {
432*789431f2SAndroid Build Coastguard Worker
433*789431f2SAndroid Build Coastguard Worker BeginOperationRequest request(impl_->message_version());
434*789431f2SAndroid Build Coastguard Worker request.purpose = legacy_enum_conversion(purpose);
435*789431f2SAndroid Build Coastguard Worker request.SetKeyMaterial(key.data(), key.size());
436*789431f2SAndroid Build Coastguard Worker request.additional_params.Reinitialize(KmParamSet(inParams));
437*789431f2SAndroid Build Coastguard Worker
438*789431f2SAndroid Build Coastguard Worker BeginOperationResponse response(impl_->message_version());
439*789431f2SAndroid Build Coastguard Worker impl_->BeginOperation(request, &response);
440*789431f2SAndroid Build Coastguard Worker
441*789431f2SAndroid Build Coastguard Worker hidl_vec<KeyParameter> resultParams;
442*789431f2SAndroid Build Coastguard Worker if (response.error == KM_ERROR_OK) {
443*789431f2SAndroid Build Coastguard Worker resultParams = kmParamSet2Hidl(response.output_params);
444*789431f2SAndroid Build Coastguard Worker }
445*789431f2SAndroid Build Coastguard Worker
446*789431f2SAndroid Build Coastguard Worker _hidl_cb(legacy_enum_conversion(response.error), resultParams, response.op_handle);
447*789431f2SAndroid Build Coastguard Worker return Void();
448*789431f2SAndroid Build Coastguard Worker }
449*789431f2SAndroid Build Coastguard Worker
update(uint64_t operationHandle,const hidl_vec<KeyParameter> & inParams,const hidl_vec<uint8_t> & input,update_cb _hidl_cb)450*789431f2SAndroid Build Coastguard Worker Return<void> AndroidKeymaster3Device::update(uint64_t operationHandle,
451*789431f2SAndroid Build Coastguard Worker const hidl_vec<KeyParameter>& inParams,
452*789431f2SAndroid Build Coastguard Worker const hidl_vec<uint8_t>& input, update_cb _hidl_cb) {
453*789431f2SAndroid Build Coastguard Worker UpdateOperationRequest request(impl_->message_version());
454*789431f2SAndroid Build Coastguard Worker request.op_handle = operationHandle;
455*789431f2SAndroid Build Coastguard Worker request.input.Reinitialize(input.data(), input.size());
456*789431f2SAndroid Build Coastguard Worker request.additional_params.Reinitialize(KmParamSet(inParams));
457*789431f2SAndroid Build Coastguard Worker
458*789431f2SAndroid Build Coastguard Worker UpdateOperationResponse response(impl_->message_version());
459*789431f2SAndroid Build Coastguard Worker impl_->UpdateOperation(request, &response);
460*789431f2SAndroid Build Coastguard Worker
461*789431f2SAndroid Build Coastguard Worker uint32_t resultConsumed = 0;
462*789431f2SAndroid Build Coastguard Worker hidl_vec<KeyParameter> resultParams;
463*789431f2SAndroid Build Coastguard Worker hidl_vec<uint8_t> resultBlob;
464*789431f2SAndroid Build Coastguard Worker if (response.error == KM_ERROR_OK) {
465*789431f2SAndroid Build Coastguard Worker resultConsumed = response.input_consumed;
466*789431f2SAndroid Build Coastguard Worker resultParams = kmParamSet2Hidl(response.output_params);
467*789431f2SAndroid Build Coastguard Worker resultBlob = kmBuffer2hidlVec(response.output);
468*789431f2SAndroid Build Coastguard Worker }
469*789431f2SAndroid Build Coastguard Worker _hidl_cb(legacy_enum_conversion(response.error), resultConsumed, resultParams, resultBlob);
470*789431f2SAndroid Build Coastguard Worker return Void();
471*789431f2SAndroid Build Coastguard Worker }
472*789431f2SAndroid Build Coastguard Worker
finish(uint64_t operationHandle,const hidl_vec<KeyParameter> & inParams,const hidl_vec<uint8_t> & input,const hidl_vec<uint8_t> & signature,finish_cb _hidl_cb)473*789431f2SAndroid Build Coastguard Worker Return<void> AndroidKeymaster3Device::finish(uint64_t operationHandle,
474*789431f2SAndroid Build Coastguard Worker const hidl_vec<KeyParameter>& inParams,
475*789431f2SAndroid Build Coastguard Worker const hidl_vec<uint8_t>& input,
476*789431f2SAndroid Build Coastguard Worker const hidl_vec<uint8_t>& signature,
477*789431f2SAndroid Build Coastguard Worker finish_cb _hidl_cb) {
478*789431f2SAndroid Build Coastguard Worker FinishOperationRequest request(impl_->message_version());
479*789431f2SAndroid Build Coastguard Worker request.op_handle = operationHandle;
480*789431f2SAndroid Build Coastguard Worker request.input.Reinitialize(input.data(), input.size());
481*789431f2SAndroid Build Coastguard Worker request.signature.Reinitialize(signature.data(), signature.size());
482*789431f2SAndroid Build Coastguard Worker request.additional_params.Reinitialize(KmParamSet(inParams));
483*789431f2SAndroid Build Coastguard Worker
484*789431f2SAndroid Build Coastguard Worker FinishOperationResponse response(impl_->message_version());
485*789431f2SAndroid Build Coastguard Worker impl_->FinishOperation(request, &response);
486*789431f2SAndroid Build Coastguard Worker
487*789431f2SAndroid Build Coastguard Worker hidl_vec<KeyParameter> resultParams;
488*789431f2SAndroid Build Coastguard Worker hidl_vec<uint8_t> resultBlob;
489*789431f2SAndroid Build Coastguard Worker if (response.error == KM_ERROR_OK) {
490*789431f2SAndroid Build Coastguard Worker resultParams = kmParamSet2Hidl(response.output_params);
491*789431f2SAndroid Build Coastguard Worker resultBlob = kmBuffer2hidlVec(response.output);
492*789431f2SAndroid Build Coastguard Worker }
493*789431f2SAndroid Build Coastguard Worker _hidl_cb(legacy_enum_conversion(response.error), resultParams, resultBlob);
494*789431f2SAndroid Build Coastguard Worker return Void();
495*789431f2SAndroid Build Coastguard Worker }
496*789431f2SAndroid Build Coastguard Worker
abort(uint64_t operationHandle)497*789431f2SAndroid Build Coastguard Worker Return<ErrorCode> AndroidKeymaster3Device::abort(uint64_t operationHandle) {
498*789431f2SAndroid Build Coastguard Worker AbortOperationRequest request(impl_->message_version());
499*789431f2SAndroid Build Coastguard Worker request.op_handle = operationHandle;
500*789431f2SAndroid Build Coastguard Worker
501*789431f2SAndroid Build Coastguard Worker AbortOperationResponse response(impl_->message_version());
502*789431f2SAndroid Build Coastguard Worker impl_->AbortOperation(request, &response);
503*789431f2SAndroid Build Coastguard Worker
504*789431f2SAndroid Build Coastguard Worker return legacy_enum_conversion(response.error);
505*789431f2SAndroid Build Coastguard Worker }
506*789431f2SAndroid Build Coastguard Worker
CreateKeymasterDevice()507*789431f2SAndroid Build Coastguard Worker IKeymasterDevice* CreateKeymasterDevice() {
508*789431f2SAndroid Build Coastguard Worker return new (std::nothrow) AndroidKeymaster3Device();
509*789431f2SAndroid Build Coastguard Worker }
510*789431f2SAndroid Build Coastguard Worker
CreateKeymasterDevice(keymaster2_device_t * km2_device)511*789431f2SAndroid Build Coastguard Worker IKeymasterDevice* CreateKeymasterDevice(keymaster2_device_t* km2_device) {
512*789431f2SAndroid Build Coastguard Worker if (ConfigureDevice(km2_device) != KM_ERROR_OK) return nullptr;
513*789431f2SAndroid Build Coastguard Worker auto context =
514*789431f2SAndroid Build Coastguard Worker new (std::nothrow) Keymaster2PassthroughContext(KmVersion::KEYMASTER_3, km2_device);
515*789431f2SAndroid Build Coastguard Worker context->SetSystemVersion(GetOsVersion(), GetOsPatchlevel());
516*789431f2SAndroid Build Coastguard Worker return new (std::nothrow) AndroidKeymaster3Device(context, KeymasterHardwareProfile::KM2);
517*789431f2SAndroid Build Coastguard Worker }
518*789431f2SAndroid Build Coastguard Worker
CreateKeymasterDevice(keymaster1_device_t * km1_device)519*789431f2SAndroid Build Coastguard Worker IKeymasterDevice* CreateKeymasterDevice(keymaster1_device_t* km1_device) {
520*789431f2SAndroid Build Coastguard Worker auto context =
521*789431f2SAndroid Build Coastguard Worker new (std::nothrow) Keymaster1PassthroughContext(KmVersion::KEYMASTER_3, km1_device);
522*789431f2SAndroid Build Coastguard Worker context->SetSystemVersion(GetOsVersion(), GetOsPatchlevel());
523*789431f2SAndroid Build Coastguard Worker return new (std::nothrow) AndroidKeymaster3Device(context, KeymasterHardwareProfile::KM1);
524*789431f2SAndroid Build Coastguard Worker }
525*789431f2SAndroid Build Coastguard Worker
526*789431f2SAndroid Build Coastguard Worker } // namespace ng
527*789431f2SAndroid Build Coastguard Worker } // namespace keymaster
528