1*789431f2SAndroid Build Coastguard Worker /*
2*789431f2SAndroid Build Coastguard Worker * Copyright (C) 2014 The Android Open Source Project
3*789431f2SAndroid Build Coastguard Worker *
4*789431f2SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*789431f2SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*789431f2SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*789431f2SAndroid Build Coastguard Worker *
8*789431f2SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*789431f2SAndroid Build Coastguard Worker *
10*789431f2SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*789431f2SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*789431f2SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*789431f2SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*789431f2SAndroid Build Coastguard Worker * limitations under the License.
15*789431f2SAndroid Build Coastguard Worker */
16*789431f2SAndroid Build Coastguard Worker
17*789431f2SAndroid Build Coastguard Worker #include <errno.h>
18*789431f2SAndroid Build Coastguard Worker #include <stdio.h>
19*789431f2SAndroid Build Coastguard Worker #include <time.h>
20*789431f2SAndroid Build Coastguard Worker
21*789431f2SAndroid Build Coastguard Worker #include <keymaster/android_keymaster.h>
22*789431f2SAndroid Build Coastguard Worker #include <keymaster/authorization_set.h>
23*789431f2SAndroid Build Coastguard Worker #include <keymaster/km_openssl/soft_keymaster_enforcement.h>
24*789431f2SAndroid Build Coastguard Worker
25*789431f2SAndroid Build Coastguard Worker #include "android_keymaster_test_utils.h"
26*789431f2SAndroid Build Coastguard Worker
27*789431f2SAndroid Build Coastguard Worker namespace keymaster {
28*789431f2SAndroid Build Coastguard Worker namespace test {
29*789431f2SAndroid Build Coastguard Worker
30*789431f2SAndroid Build Coastguard Worker class EnforcementTestKeymasterEnforcement : public SoftKeymasterEnforcement {
31*789431f2SAndroid Build Coastguard Worker public:
EnforcementTestKeymasterEnforcement()32*789431f2SAndroid Build Coastguard Worker EnforcementTestKeymasterEnforcement()
33*789431f2SAndroid Build Coastguard Worker : SoftKeymasterEnforcement(3, 3), current_time_(10000), report_token_valid_(true) {}
34*789431f2SAndroid Build Coastguard Worker
AuthorizeOperation(const keymaster_purpose_t purpose,const km_id_t keyid,const AuthProxy & auth_set)35*789431f2SAndroid Build Coastguard Worker keymaster_error_t AuthorizeOperation(const keymaster_purpose_t purpose, const km_id_t keyid,
36*789431f2SAndroid Build Coastguard Worker const AuthProxy& auth_set) {
37*789431f2SAndroid Build Coastguard Worker AuthorizationSet empty_set;
38*789431f2SAndroid Build Coastguard Worker return KeymasterEnforcement::AuthorizeOperation(
39*789431f2SAndroid Build Coastguard Worker purpose, keyid, auth_set, empty_set, 0 /* op_handle */, true /* is_begin_operation */);
40*789431f2SAndroid Build Coastguard Worker }
41*789431f2SAndroid Build Coastguard Worker using KeymasterEnforcement::AuthorizeOperation;
42*789431f2SAndroid Build Coastguard Worker
get_current_time_ms() const43*789431f2SAndroid Build Coastguard Worker uint64_t get_current_time_ms() const override { return current_time_ * 1000; }
activation_date_valid(uint64_t activation_date) const44*789431f2SAndroid Build Coastguard Worker bool activation_date_valid(uint64_t activation_date) const override {
45*789431f2SAndroid Build Coastguard Worker // Convert java date to time_t, non-portably.
46*789431f2SAndroid Build Coastguard Worker time_t activation_time = activation_date / 1000;
47*789431f2SAndroid Build Coastguard Worker return difftime(time(NULL), activation_time) >= 0;
48*789431f2SAndroid Build Coastguard Worker }
expiration_date_passed(uint64_t expiration_date) const49*789431f2SAndroid Build Coastguard Worker bool expiration_date_passed(uint64_t expiration_date) const override {
50*789431f2SAndroid Build Coastguard Worker // Convert jave date to time_t, non-portably.
51*789431f2SAndroid Build Coastguard Worker time_t expiration_time = expiration_date / 1000;
52*789431f2SAndroid Build Coastguard Worker return difftime(time(NULL), expiration_time) > 0;
53*789431f2SAndroid Build Coastguard Worker }
auth_token_timed_out(const hw_auth_token_t & token,uint32_t timeout) const54*789431f2SAndroid Build Coastguard Worker bool auth_token_timed_out(const hw_auth_token_t& token, uint32_t timeout) const override {
55*789431f2SAndroid Build Coastguard Worker return current_time_ > ntoh(token.timestamp) + timeout;
56*789431f2SAndroid Build Coastguard Worker }
ValidateTokenSignature(const hw_auth_token_t &) const57*789431f2SAndroid Build Coastguard Worker bool ValidateTokenSignature(const hw_auth_token_t&) const override {
58*789431f2SAndroid Build Coastguard Worker return report_token_valid_;
59*789431f2SAndroid Build Coastguard Worker }
60*789431f2SAndroid Build Coastguard Worker
tick(unsigned seconds=1)61*789431f2SAndroid Build Coastguard Worker void tick(unsigned seconds = 1) { current_time_ += seconds; }
current_time()62*789431f2SAndroid Build Coastguard Worker uint32_t current_time() { return current_time_; }
set_report_token_valid(bool report_token_valid)63*789431f2SAndroid Build Coastguard Worker void set_report_token_valid(bool report_token_valid) {
64*789431f2SAndroid Build Coastguard Worker report_token_valid_ = report_token_valid;
65*789431f2SAndroid Build Coastguard Worker }
66*789431f2SAndroid Build Coastguard Worker
67*789431f2SAndroid Build Coastguard Worker private:
68*789431f2SAndroid Build Coastguard Worker uint32_t current_time_;
69*789431f2SAndroid Build Coastguard Worker bool report_token_valid_;
70*789431f2SAndroid Build Coastguard Worker };
71*789431f2SAndroid Build Coastguard Worker
72*789431f2SAndroid Build Coastguard Worker class KeymasterBaseTest : public ::testing::Test {
73*789431f2SAndroid Build Coastguard Worker protected:
KeymasterBaseTest()74*789431f2SAndroid Build Coastguard Worker KeymasterBaseTest() {
75*789431f2SAndroid Build Coastguard Worker past_time = 0;
76*789431f2SAndroid Build Coastguard Worker
77*789431f2SAndroid Build Coastguard Worker time_t t = time(NULL);
78*789431f2SAndroid Build Coastguard Worker future_tm = localtime(&t);
79*789431f2SAndroid Build Coastguard Worker future_tm->tm_year += 1;
80*789431f2SAndroid Build Coastguard Worker future_time = static_cast<uint64_t>(mktime(future_tm)) * 1000;
81*789431f2SAndroid Build Coastguard Worker sign_param = Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN);
82*789431f2SAndroid Build Coastguard Worker }
~KeymasterBaseTest()83*789431f2SAndroid Build Coastguard Worker virtual ~KeymasterBaseTest() {}
84*789431f2SAndroid Build Coastguard Worker
85*789431f2SAndroid Build Coastguard Worker EnforcementTestKeymasterEnforcement kmen;
86*789431f2SAndroid Build Coastguard Worker
87*789431f2SAndroid Build Coastguard Worker tm past_tm;
88*789431f2SAndroid Build Coastguard Worker tm* future_tm;
89*789431f2SAndroid Build Coastguard Worker uint64_t past_time;
90*789431f2SAndroid Build Coastguard Worker uint64_t future_time;
91*789431f2SAndroid Build Coastguard Worker static const km_id_t key_id = 0xa;
92*789431f2SAndroid Build Coastguard Worker static const uid_t uid = 0xf;
93*789431f2SAndroid Build Coastguard Worker keymaster_key_param_t sign_param;
94*789431f2SAndroid Build Coastguard Worker AuthorizationSet empty;
95*789431f2SAndroid Build Coastguard Worker };
96*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestValidKeyPeriodNoTags)97*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestValidKeyPeriodNoTags) {
98*789431f2SAndroid Build Coastguard Worker keymaster_key_param_t params[] = {
99*789431f2SAndroid Build Coastguard Worker sign_param,
100*789431f2SAndroid Build Coastguard Worker };
101*789431f2SAndroid Build Coastguard Worker AuthorizationSet single_auth_set(params, array_length(params));
102*789431f2SAndroid Build Coastguard Worker
103*789431f2SAndroid Build Coastguard Worker keymaster_error_t kmer =
104*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(single_auth_set, empty));
105*789431f2SAndroid Build Coastguard Worker ASSERT_EQ(KM_ERROR_OK, kmer);
106*789431f2SAndroid Build Coastguard Worker }
107*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestInvalidActiveTime)108*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestInvalidActiveTime) {
109*789431f2SAndroid Build Coastguard Worker keymaster_key_param_t params[] = {
110*789431f2SAndroid Build Coastguard Worker Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
111*789431f2SAndroid Build Coastguard Worker Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
112*789431f2SAndroid Build Coastguard Worker Authorization(TAG_NO_AUTH_REQUIRED),
113*789431f2SAndroid Build Coastguard Worker Authorization(TAG_ACTIVE_DATETIME, future_time),
114*789431f2SAndroid Build Coastguard Worker };
115*789431f2SAndroid Build Coastguard Worker
116*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(params, array_length(params));
117*789431f2SAndroid Build Coastguard Worker
118*789431f2SAndroid Build Coastguard Worker ASSERT_EQ(KM_ERROR_KEY_NOT_YET_VALID,
119*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty)));
120*789431f2SAndroid Build Coastguard Worker
121*789431f2SAndroid Build Coastguard Worker // Pubkey ops allowed.
122*789431f2SAndroid Build Coastguard Worker ASSERT_EQ(KM_ERROR_OK,
123*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, key_id, AuthProxy(auth_set, empty)));
124*789431f2SAndroid Build Coastguard Worker }
125*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestValidActiveTime)126*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestValidActiveTime) {
127*789431f2SAndroid Build Coastguard Worker keymaster_key_param_t params[] = {
128*789431f2SAndroid Build Coastguard Worker Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
129*789431f2SAndroid Build Coastguard Worker Authorization(TAG_ACTIVE_DATETIME, past_time),
130*789431f2SAndroid Build Coastguard Worker };
131*789431f2SAndroid Build Coastguard Worker
132*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(params, array_length(params));
133*789431f2SAndroid Build Coastguard Worker
134*789431f2SAndroid Build Coastguard Worker keymaster_error_t kmer_valid_time =
135*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty));
136*789431f2SAndroid Build Coastguard Worker ASSERT_EQ(KM_ERROR_OK, kmer_valid_time);
137*789431f2SAndroid Build Coastguard Worker }
138*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestInvalidOriginationExpireTime)139*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestInvalidOriginationExpireTime) {
140*789431f2SAndroid Build Coastguard Worker keymaster_key_param_t params[] = {
141*789431f2SAndroid Build Coastguard Worker Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
142*789431f2SAndroid Build Coastguard Worker Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
143*789431f2SAndroid Build Coastguard Worker Authorization(TAG_ORIGINATION_EXPIRE_DATETIME, past_time),
144*789431f2SAndroid Build Coastguard Worker };
145*789431f2SAndroid Build Coastguard Worker
146*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(params, array_length(params));
147*789431f2SAndroid Build Coastguard Worker
148*789431f2SAndroid Build Coastguard Worker ASSERT_EQ(KM_ERROR_KEY_EXPIRED,
149*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty)));
150*789431f2SAndroid Build Coastguard Worker
151*789431f2SAndroid Build Coastguard Worker // Pubkey ops allowed.
152*789431f2SAndroid Build Coastguard Worker ASSERT_EQ(KM_ERROR_OK,
153*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, key_id, AuthProxy(auth_set, empty)));
154*789431f2SAndroid Build Coastguard Worker }
155*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestInvalidOriginationExpireTimeOnUsgae)156*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestInvalidOriginationExpireTimeOnUsgae) {
157*789431f2SAndroid Build Coastguard Worker keymaster_key_param_t params[] = {
158*789431f2SAndroid Build Coastguard Worker Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
159*789431f2SAndroid Build Coastguard Worker Authorization(TAG_ORIGINATION_EXPIRE_DATETIME, past_time),
160*789431f2SAndroid Build Coastguard Worker };
161*789431f2SAndroid Build Coastguard Worker
162*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(params, array_length(params));
163*789431f2SAndroid Build Coastguard Worker
164*789431f2SAndroid Build Coastguard Worker keymaster_error_t kmer_invalid_origination =
165*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, key_id, AuthProxy(auth_set, empty));
166*789431f2SAndroid Build Coastguard Worker ASSERT_EQ(KM_ERROR_OK, kmer_invalid_origination);
167*789431f2SAndroid Build Coastguard Worker }
168*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestValidOriginationExpireTime)169*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestValidOriginationExpireTime) {
170*789431f2SAndroid Build Coastguard Worker keymaster_key_param_t params[] = {
171*789431f2SAndroid Build Coastguard Worker Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
172*789431f2SAndroid Build Coastguard Worker Authorization(TAG_ORIGINATION_EXPIRE_DATETIME, future_time),
173*789431f2SAndroid Build Coastguard Worker };
174*789431f2SAndroid Build Coastguard Worker
175*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(params, array_length(params));
176*789431f2SAndroid Build Coastguard Worker
177*789431f2SAndroid Build Coastguard Worker keymaster_error_t kmer_valid_origination =
178*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty));
179*789431f2SAndroid Build Coastguard Worker ASSERT_EQ(KM_ERROR_OK, kmer_valid_origination);
180*789431f2SAndroid Build Coastguard Worker }
181*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestInvalidUsageExpireTime)182*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestInvalidUsageExpireTime) {
183*789431f2SAndroid Build Coastguard Worker keymaster_key_param_t params[] = {
184*789431f2SAndroid Build Coastguard Worker Authorization(TAG_ALGORITHM, KM_ALGORITHM_AES),
185*789431f2SAndroid Build Coastguard Worker Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
186*789431f2SAndroid Build Coastguard Worker Authorization(TAG_USAGE_EXPIRE_DATETIME, past_time),
187*789431f2SAndroid Build Coastguard Worker };
188*789431f2SAndroid Build Coastguard Worker
189*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(params, array_length(params));
190*789431f2SAndroid Build Coastguard Worker
191*789431f2SAndroid Build Coastguard Worker keymaster_error_t kmer_invalid_origination =
192*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, key_id, AuthProxy(auth_set, empty));
193*789431f2SAndroid Build Coastguard Worker ASSERT_EQ(KM_ERROR_KEY_EXPIRED, kmer_invalid_origination);
194*789431f2SAndroid Build Coastguard Worker }
195*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestInvalidPubkeyUsageExpireTime)196*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestInvalidPubkeyUsageExpireTime) {
197*789431f2SAndroid Build Coastguard Worker keymaster_key_param_t params[] = {
198*789431f2SAndroid Build Coastguard Worker Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
199*789431f2SAndroid Build Coastguard Worker Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
200*789431f2SAndroid Build Coastguard Worker Authorization(TAG_USAGE_EXPIRE_DATETIME, past_time),
201*789431f2SAndroid Build Coastguard Worker };
202*789431f2SAndroid Build Coastguard Worker
203*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(params, array_length(params));
204*789431f2SAndroid Build Coastguard Worker
205*789431f2SAndroid Build Coastguard Worker keymaster_error_t kmer_invalid_origination =
206*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, key_id, AuthProxy(auth_set, empty));
207*789431f2SAndroid Build Coastguard Worker // Pubkey ops allowed.
208*789431f2SAndroid Build Coastguard Worker ASSERT_EQ(KM_ERROR_OK, kmer_invalid_origination);
209*789431f2SAndroid Build Coastguard Worker }
210*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestInvalidUsageExpireTimeOnOrigination)211*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestInvalidUsageExpireTimeOnOrigination) {
212*789431f2SAndroid Build Coastguard Worker keymaster_key_param_t params[] = {
213*789431f2SAndroid Build Coastguard Worker Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
214*789431f2SAndroid Build Coastguard Worker Authorization(TAG_USAGE_EXPIRE_DATETIME, past_time),
215*789431f2SAndroid Build Coastguard Worker };
216*789431f2SAndroid Build Coastguard Worker
217*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(params, array_length(params));
218*789431f2SAndroid Build Coastguard Worker
219*789431f2SAndroid Build Coastguard Worker keymaster_error_t kmer_invalid_origination =
220*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty));
221*789431f2SAndroid Build Coastguard Worker ASSERT_EQ(KM_ERROR_OK, kmer_invalid_origination);
222*789431f2SAndroid Build Coastguard Worker }
223*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestValidUsageExpireTime)224*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestValidUsageExpireTime) {
225*789431f2SAndroid Build Coastguard Worker keymaster_key_param_t params[] = {
226*789431f2SAndroid Build Coastguard Worker Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
227*789431f2SAndroid Build Coastguard Worker Authorization(TAG_USAGE_EXPIRE_DATETIME, future_time),
228*789431f2SAndroid Build Coastguard Worker };
229*789431f2SAndroid Build Coastguard Worker
230*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(params, array_length(params));
231*789431f2SAndroid Build Coastguard Worker
232*789431f2SAndroid Build Coastguard Worker keymaster_error_t kmer_valid_usage =
233*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, key_id, AuthProxy(auth_set, empty));
234*789431f2SAndroid Build Coastguard Worker ASSERT_EQ(KM_ERROR_OK, kmer_valid_usage);
235*789431f2SAndroid Build Coastguard Worker }
236*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestValidSingleUseAccesses)237*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestValidSingleUseAccesses) {
238*789431f2SAndroid Build Coastguard Worker keymaster_key_param_t params[] = {
239*789431f2SAndroid Build Coastguard Worker Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
240*789431f2SAndroid Build Coastguard Worker };
241*789431f2SAndroid Build Coastguard Worker
242*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(params, array_length(params));
243*789431f2SAndroid Build Coastguard Worker
244*789431f2SAndroid Build Coastguard Worker keymaster_error_t kmer1 =
245*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty));
246*789431f2SAndroid Build Coastguard Worker keymaster_error_t kmer2 =
247*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty));
248*789431f2SAndroid Build Coastguard Worker
249*789431f2SAndroid Build Coastguard Worker ASSERT_EQ(KM_ERROR_OK, kmer1);
250*789431f2SAndroid Build Coastguard Worker ASSERT_EQ(KM_ERROR_OK, kmer2);
251*789431f2SAndroid Build Coastguard Worker }
252*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestInvalidMaxOps)253*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestInvalidMaxOps) {
254*789431f2SAndroid Build Coastguard Worker keymaster_key_param_t params[] = {
255*789431f2SAndroid Build Coastguard Worker Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
256*789431f2SAndroid Build Coastguard Worker Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
257*789431f2SAndroid Build Coastguard Worker Authorization(TAG_MAX_USES_PER_BOOT, 4),
258*789431f2SAndroid Build Coastguard Worker };
259*789431f2SAndroid Build Coastguard Worker
260*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(params, array_length(params));
261*789431f2SAndroid Build Coastguard Worker
262*789431f2SAndroid Build Coastguard Worker ASSERT_EQ(KM_ERROR_OK,
263*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty)));
264*789431f2SAndroid Build Coastguard Worker ASSERT_EQ(KM_ERROR_OK,
265*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty)));
266*789431f2SAndroid Build Coastguard Worker ASSERT_EQ(KM_ERROR_OK,
267*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty)));
268*789431f2SAndroid Build Coastguard Worker ASSERT_EQ(KM_ERROR_OK,
269*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty)));
270*789431f2SAndroid Build Coastguard Worker ASSERT_EQ(KM_ERROR_KEY_MAX_OPS_EXCEEDED,
271*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty)));
272*789431f2SAndroid Build Coastguard Worker // Pubkey ops allowed.
273*789431f2SAndroid Build Coastguard Worker ASSERT_EQ(KM_ERROR_OK,
274*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, key_id, AuthProxy(auth_set, empty)));
275*789431f2SAndroid Build Coastguard Worker }
276*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestOverFlowMaxOpsTable)277*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestOverFlowMaxOpsTable) {
278*789431f2SAndroid Build Coastguard Worker keymaster_key_param_t params[] = {
279*789431f2SAndroid Build Coastguard Worker Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
280*789431f2SAndroid Build Coastguard Worker Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
281*789431f2SAndroid Build Coastguard Worker Authorization(TAG_MAX_USES_PER_BOOT, 2),
282*789431f2SAndroid Build Coastguard Worker };
283*789431f2SAndroid Build Coastguard Worker
284*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(params, array_length(params));
285*789431f2SAndroid Build Coastguard Worker
286*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK,
287*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, 1 /* key_id */, AuthProxy(auth_set, empty)));
288*789431f2SAndroid Build Coastguard Worker
289*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK,
290*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, 2 /* key_id */, AuthProxy(auth_set, empty)));
291*789431f2SAndroid Build Coastguard Worker
292*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK,
293*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, 3 /* key_id */, AuthProxy(auth_set, empty)));
294*789431f2SAndroid Build Coastguard Worker
295*789431f2SAndroid Build Coastguard Worker // Key 4 should fail, because table is full.
296*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_TOO_MANY_OPERATIONS,
297*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, 4 /* key_id */, AuthProxy(auth_set, empty)));
298*789431f2SAndroid Build Coastguard Worker
299*789431f2SAndroid Build Coastguard Worker // Key 1 still works, because it's already in the table and hasn't reached max.
300*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK,
301*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, 1 /* key_id */, AuthProxy(auth_set, empty)));
302*789431f2SAndroid Build Coastguard Worker
303*789431f2SAndroid Build Coastguard Worker // Key 1 no longer works, because it's reached max.
304*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_KEY_MAX_OPS_EXCEEDED,
305*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, 1 /* key_id */, AuthProxy(auth_set, empty)));
306*789431f2SAndroid Build Coastguard Worker
307*789431f2SAndroid Build Coastguard Worker // Key 4 should fail, because table is (still and forever) full.
308*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_TOO_MANY_OPERATIONS,
309*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, 4 /* key_id */, AuthProxy(auth_set, empty)));
310*789431f2SAndroid Build Coastguard Worker
311*789431f2SAndroid Build Coastguard Worker // Pubkey ops allowed.
312*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK, kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, 1 /* key_id */,
313*789431f2SAndroid Build Coastguard Worker AuthProxy(auth_set, empty)));
314*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK, kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, 4 /* key_id */,
315*789431f2SAndroid Build Coastguard Worker AuthProxy(auth_set, empty)));
316*789431f2SAndroid Build Coastguard Worker }
317*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestInvalidTimeBetweenOps)318*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestInvalidTimeBetweenOps) {
319*789431f2SAndroid Build Coastguard Worker keymaster_key_param_t params[] = {
320*789431f2SAndroid Build Coastguard Worker Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
321*789431f2SAndroid Build Coastguard Worker Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
322*789431f2SAndroid Build Coastguard Worker Authorization(TAG_MIN_SECONDS_BETWEEN_OPS, 10),
323*789431f2SAndroid Build Coastguard Worker };
324*789431f2SAndroid Build Coastguard Worker
325*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(params, array_length(params));
326*789431f2SAndroid Build Coastguard Worker
327*789431f2SAndroid Build Coastguard Worker keymaster_error_t kmer1 =
328*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty));
329*789431f2SAndroid Build Coastguard Worker keymaster_error_t kmer2 =
330*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty));
331*789431f2SAndroid Build Coastguard Worker keymaster_error_t kmer3 =
332*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, key_id, AuthProxy(auth_set, empty));
333*789431f2SAndroid Build Coastguard Worker
334*789431f2SAndroid Build Coastguard Worker ASSERT_EQ(KM_ERROR_OK, kmer1);
335*789431f2SAndroid Build Coastguard Worker kmen.tick(2);
336*789431f2SAndroid Build Coastguard Worker ASSERT_EQ(KM_ERROR_KEY_RATE_LIMIT_EXCEEDED, kmer2);
337*789431f2SAndroid Build Coastguard Worker
338*789431f2SAndroid Build Coastguard Worker // Allowed because it's a pubkey op.
339*789431f2SAndroid Build Coastguard Worker ASSERT_EQ(KM_ERROR_OK, kmer3);
340*789431f2SAndroid Build Coastguard Worker }
341*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestValidTimeBetweenOps)342*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestValidTimeBetweenOps) {
343*789431f2SAndroid Build Coastguard Worker keymaster_key_param_t params[] = {
344*789431f2SAndroid Build Coastguard Worker Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
345*789431f2SAndroid Build Coastguard Worker Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
346*789431f2SAndroid Build Coastguard Worker Authorization(TAG_MIN_SECONDS_BETWEEN_OPS, 2),
347*789431f2SAndroid Build Coastguard Worker };
348*789431f2SAndroid Build Coastguard Worker
349*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(params, array_length(params));
350*789431f2SAndroid Build Coastguard Worker
351*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK,
352*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, key_id, AuthProxy(auth_set, empty)));
353*789431f2SAndroid Build Coastguard Worker kmen.tick();
354*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_KEY_RATE_LIMIT_EXCEEDED,
355*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty)));
356*789431f2SAndroid Build Coastguard Worker kmen.tick();
357*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK,
358*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty)));
359*789431f2SAndroid Build Coastguard Worker }
360*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestOptTimeoutTableOverflow)361*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestOptTimeoutTableOverflow) {
362*789431f2SAndroid Build Coastguard Worker keymaster_key_param_t params[] = {
363*789431f2SAndroid Build Coastguard Worker Authorization(TAG_ALGORITHM, KM_ALGORITHM_AES),
364*789431f2SAndroid Build Coastguard Worker Authorization(TAG_MIN_SECONDS_BETWEEN_OPS, 4),
365*789431f2SAndroid Build Coastguard Worker Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
366*789431f2SAndroid Build Coastguard Worker };
367*789431f2SAndroid Build Coastguard Worker
368*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(params, array_length(params));
369*789431f2SAndroid Build Coastguard Worker
370*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK, kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, 1 /* key_id */,
371*789431f2SAndroid Build Coastguard Worker AuthProxy(auth_set, empty)));
372*789431f2SAndroid Build Coastguard Worker
373*789431f2SAndroid Build Coastguard Worker kmen.tick();
374*789431f2SAndroid Build Coastguard Worker
375*789431f2SAndroid Build Coastguard Worker // Key 1 fails because it's too soon
376*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(
377*789431f2SAndroid Build Coastguard Worker KM_ERROR_KEY_RATE_LIMIT_EXCEEDED,
378*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, 1 /* key_id */, AuthProxy(auth_set, empty)));
379*789431f2SAndroid Build Coastguard Worker
380*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK, kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, 2 /* key_id */,
381*789431f2SAndroid Build Coastguard Worker AuthProxy(auth_set, empty)));
382*789431f2SAndroid Build Coastguard Worker
383*789431f2SAndroid Build Coastguard Worker kmen.tick();
384*789431f2SAndroid Build Coastguard Worker
385*789431f2SAndroid Build Coastguard Worker // Key 1 fails because it's too soon
386*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(
387*789431f2SAndroid Build Coastguard Worker KM_ERROR_KEY_RATE_LIMIT_EXCEEDED,
388*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, 1 /* key_id */, AuthProxy(auth_set, empty)));
389*789431f2SAndroid Build Coastguard Worker // Key 2 fails because it's too soon
390*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(
391*789431f2SAndroid Build Coastguard Worker KM_ERROR_KEY_RATE_LIMIT_EXCEEDED,
392*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, 2 /* key_id */, AuthProxy(auth_set, empty)));
393*789431f2SAndroid Build Coastguard Worker
394*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK, kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, 3 /* key_id */,
395*789431f2SAndroid Build Coastguard Worker AuthProxy(auth_set, empty)));
396*789431f2SAndroid Build Coastguard Worker
397*789431f2SAndroid Build Coastguard Worker kmen.tick();
398*789431f2SAndroid Build Coastguard Worker
399*789431f2SAndroid Build Coastguard Worker // Key 1 fails because it's too soon
400*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(
401*789431f2SAndroid Build Coastguard Worker KM_ERROR_KEY_RATE_LIMIT_EXCEEDED,
402*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, 1 /* key_id */, AuthProxy(auth_set, empty)));
403*789431f2SAndroid Build Coastguard Worker // Key 2 fails because it's too soon
404*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(
405*789431f2SAndroid Build Coastguard Worker KM_ERROR_KEY_RATE_LIMIT_EXCEEDED,
406*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, 2 /* key_id */, AuthProxy(auth_set, empty)));
407*789431f2SAndroid Build Coastguard Worker // Key 3 fails because it's too soon
408*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(
409*789431f2SAndroid Build Coastguard Worker KM_ERROR_KEY_RATE_LIMIT_EXCEEDED,
410*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, 3 /* key_id */, AuthProxy(auth_set, empty)));
411*789431f2SAndroid Build Coastguard Worker // Key 4 fails because the table is full
412*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(
413*789431f2SAndroid Build Coastguard Worker KM_ERROR_TOO_MANY_OPERATIONS,
414*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, 4 /* key_id */, AuthProxy(auth_set, empty)));
415*789431f2SAndroid Build Coastguard Worker
416*789431f2SAndroid Build Coastguard Worker kmen.tick();
417*789431f2SAndroid Build Coastguard Worker
418*789431f2SAndroid Build Coastguard Worker // Key 4 succeeds because key 1 expired.
419*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK, kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, 4 /* key_id */,
420*789431f2SAndroid Build Coastguard Worker AuthProxy(auth_set, empty)));
421*789431f2SAndroid Build Coastguard Worker
422*789431f2SAndroid Build Coastguard Worker // Key 1 fails because the table is full... and key 1 is no longer in it.
423*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(
424*789431f2SAndroid Build Coastguard Worker KM_ERROR_TOO_MANY_OPERATIONS,
425*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, 1 /* key_id */, AuthProxy(auth_set, empty)));
426*789431f2SAndroid Build Coastguard Worker // Key 2 fails because it's too soon
427*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(
428*789431f2SAndroid Build Coastguard Worker KM_ERROR_KEY_RATE_LIMIT_EXCEEDED,
429*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, 2 /* key_id */, AuthProxy(auth_set, empty)));
430*789431f2SAndroid Build Coastguard Worker // Key 3 fails because it's too soon
431*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(
432*789431f2SAndroid Build Coastguard Worker KM_ERROR_KEY_RATE_LIMIT_EXCEEDED,
433*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, 3 /* key_id */, AuthProxy(auth_set, empty)));
434*789431f2SAndroid Build Coastguard Worker
435*789431f2SAndroid Build Coastguard Worker kmen.tick();
436*789431f2SAndroid Build Coastguard Worker
437*789431f2SAndroid Build Coastguard Worker // Key 1 succeeds because key 2 expired
438*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK, kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, 1 /* key_id */,
439*789431f2SAndroid Build Coastguard Worker AuthProxy(auth_set, empty)));
440*789431f2SAndroid Build Coastguard Worker // Key 2 fails because the table is full... and key 2 is no longer in it.
441*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(
442*789431f2SAndroid Build Coastguard Worker KM_ERROR_TOO_MANY_OPERATIONS,
443*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, 2 /* key_id */, AuthProxy(auth_set, empty)));
444*789431f2SAndroid Build Coastguard Worker // Key 3 fails because it's too soon
445*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(
446*789431f2SAndroid Build Coastguard Worker KM_ERROR_KEY_RATE_LIMIT_EXCEEDED,
447*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, 3 /* key_id */, AuthProxy(auth_set, empty)));
448*789431f2SAndroid Build Coastguard Worker // Key 4 fails because it's too soon
449*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(
450*789431f2SAndroid Build Coastguard Worker KM_ERROR_KEY_RATE_LIMIT_EXCEEDED,
451*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, 4 /* key_id */, AuthProxy(auth_set, empty)));
452*789431f2SAndroid Build Coastguard Worker
453*789431f2SAndroid Build Coastguard Worker kmen.tick(4);
454*789431f2SAndroid Build Coastguard Worker
455*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK, kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, 1 /* key_id */,
456*789431f2SAndroid Build Coastguard Worker AuthProxy(auth_set, empty)));
457*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK, kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, 2 /* key_id */,
458*789431f2SAndroid Build Coastguard Worker AuthProxy(auth_set, empty)));
459*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK, kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, 3 /* key_id */,
460*789431f2SAndroid Build Coastguard Worker AuthProxy(auth_set, empty)));
461*789431f2SAndroid Build Coastguard Worker }
462*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestPubkeyOptTimeoutTableOverflow)463*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestPubkeyOptTimeoutTableOverflow) {
464*789431f2SAndroid Build Coastguard Worker keymaster_key_param_t params[] = {
465*789431f2SAndroid Build Coastguard Worker Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
466*789431f2SAndroid Build Coastguard Worker Authorization(TAG_MIN_SECONDS_BETWEEN_OPS, 4),
467*789431f2SAndroid Build Coastguard Worker Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
468*789431f2SAndroid Build Coastguard Worker };
469*789431f2SAndroid Build Coastguard Worker
470*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(params, array_length(params));
471*789431f2SAndroid Build Coastguard Worker
472*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK,
473*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, 1 /* key_id */, AuthProxy(auth_set, empty)));
474*789431f2SAndroid Build Coastguard Worker
475*789431f2SAndroid Build Coastguard Worker kmen.tick();
476*789431f2SAndroid Build Coastguard Worker
477*789431f2SAndroid Build Coastguard Worker // Key 1 fails because it's too soon
478*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_KEY_RATE_LIMIT_EXCEEDED,
479*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, 1 /* key_id */, AuthProxy(auth_set, empty)));
480*789431f2SAndroid Build Coastguard Worker // Too soo, but pubkey ops allowed.
481*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK, kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, 1 /* key_id */,
482*789431f2SAndroid Build Coastguard Worker AuthProxy(auth_set, empty)));
483*789431f2SAndroid Build Coastguard Worker }
484*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestInvalidPurpose)485*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestInvalidPurpose) {
486*789431f2SAndroid Build Coastguard Worker keymaster_purpose_t invalidPurpose1 = static_cast<keymaster_purpose_t>(-1);
487*789431f2SAndroid Build Coastguard Worker keymaster_purpose_t invalidPurpose2 = static_cast<keymaster_purpose_t>(4);
488*789431f2SAndroid Build Coastguard Worker
489*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(
490*789431f2SAndroid Build Coastguard Worker AuthorizationSetBuilder().Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY));
491*789431f2SAndroid Build Coastguard Worker
492*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
493*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(invalidPurpose1, key_id, AuthProxy(auth_set, empty)));
494*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE,
495*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(invalidPurpose2, key_id, AuthProxy(auth_set, empty)));
496*789431f2SAndroid Build Coastguard Worker }
497*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestIncompatiblePurposeSymmetricKey)498*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestIncompatiblePurposeSymmetricKey) {
499*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(AuthorizationSetBuilder()
500*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ALGORITHM, KM_ALGORITHM_AES)
501*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
502*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN));
503*789431f2SAndroid Build Coastguard Worker
504*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK,
505*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty)));
506*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK,
507*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, key_id, AuthProxy(auth_set, empty)));
508*789431f2SAndroid Build Coastguard Worker
509*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE,
510*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_ENCRYPT, key_id, AuthProxy(auth_set, empty)));
511*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE,
512*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_DECRYPT, key_id, AuthProxy(auth_set, empty)));
513*789431f2SAndroid Build Coastguard Worker }
514*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestIncompatiblePurposeAssymmetricKey)515*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestIncompatiblePurposeAssymmetricKey) {
516*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(AuthorizationSetBuilder()
517*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
518*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
519*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN));
520*789431f2SAndroid Build Coastguard Worker
521*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK,
522*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty)));
523*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK,
524*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, key_id, AuthProxy(auth_set, empty)));
525*789431f2SAndroid Build Coastguard Worker
526*789431f2SAndroid Build Coastguard Worker // This one is allowed because it's a pubkey op.
527*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK,
528*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_ENCRYPT, key_id, AuthProxy(auth_set, empty)));
529*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE,
530*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_DECRYPT, key_id, AuthProxy(auth_set, empty)));
531*789431f2SAndroid Build Coastguard Worker }
532*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestInvalidCallerNonce)533*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestInvalidCallerNonce) {
534*789431f2SAndroid Build Coastguard Worker AuthorizationSet no_caller_nonce(AuthorizationSetBuilder()
535*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_ENCRYPT)
536*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_DECRYPT)
537*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ALGORITHM, KM_ALGORITHM_AES));
538*789431f2SAndroid Build Coastguard Worker AuthorizationSet caller_nonce(AuthorizationSetBuilder()
539*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_ENCRYPT)
540*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_DECRYPT)
541*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ALGORITHM, KM_ALGORITHM_HMAC)
542*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_CALLER_NONCE));
543*789431f2SAndroid Build Coastguard Worker AuthorizationSet begin_params(AuthorizationSetBuilder().Authorization(TAG_NONCE, "foo", 3));
544*789431f2SAndroid Build Coastguard Worker
545*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK, kmen.AuthorizeOperation(
546*789431f2SAndroid Build Coastguard Worker KM_PURPOSE_ENCRYPT, key_id, AuthProxy(caller_nonce, empty),
547*789431f2SAndroid Build Coastguard Worker begin_params, 0 /* challenge */, true /* is_begin_operation */));
548*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK, kmen.AuthorizeOperation(
549*789431f2SAndroid Build Coastguard Worker KM_PURPOSE_DECRYPT, key_id, AuthProxy(caller_nonce, empty),
550*789431f2SAndroid Build Coastguard Worker begin_params, 0 /* challenge */, true /* is_begin_operation */));
551*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_CALLER_NONCE_PROHIBITED,
552*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_ENCRYPT, key_id, AuthProxy(no_caller_nonce, empty),
553*789431f2SAndroid Build Coastguard Worker begin_params, 0 /* challenge */,
554*789431f2SAndroid Build Coastguard Worker true /* is_begin_operation */));
555*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK, kmen.AuthorizeOperation(
556*789431f2SAndroid Build Coastguard Worker KM_PURPOSE_DECRYPT, key_id, AuthProxy(no_caller_nonce, empty),
557*789431f2SAndroid Build Coastguard Worker begin_params, 0 /* challenge */, true /* is_begin_operation */));
558*789431f2SAndroid Build Coastguard Worker }
559*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestBootloaderOnly)560*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestBootloaderOnly) {
561*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(AuthorizationSetBuilder()
562*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
563*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
564*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_BOOTLOADER_ONLY));
565*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_INVALID_KEY_BLOB,
566*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty)));
567*789431f2SAndroid Build Coastguard Worker
568*789431f2SAndroid Build Coastguard Worker // Pubkey ops allowed.
569*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK,
570*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, key_id, AuthProxy(auth_set, empty)));
571*789431f2SAndroid Build Coastguard Worker }
572*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestInvalidTag)573*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestInvalidTag) {
574*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(AuthorizationSetBuilder()
575*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_INVALID)
576*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN));
577*789431f2SAndroid Build Coastguard Worker
578*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_INVALID_KEY_BLOB,
579*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty)));
580*789431f2SAndroid Build Coastguard Worker }
581*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestAuthPerOpSuccess)582*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestAuthPerOpSuccess) {
583*789431f2SAndroid Build Coastguard Worker hw_auth_token_t token;
584*789431f2SAndroid Build Coastguard Worker memset(&token, 0, sizeof(token));
585*789431f2SAndroid Build Coastguard Worker token.version = HW_AUTH_TOKEN_VERSION;
586*789431f2SAndroid Build Coastguard Worker token.challenge = 99;
587*789431f2SAndroid Build Coastguard Worker token.user_id = 9;
588*789431f2SAndroid Build Coastguard Worker token.authenticator_id = 0;
589*789431f2SAndroid Build Coastguard Worker token.authenticator_type = hton(static_cast<uint32_t>(HW_AUTH_PASSWORD));
590*789431f2SAndroid Build Coastguard Worker token.timestamp = 0;
591*789431f2SAndroid Build Coastguard Worker
592*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(AuthorizationSetBuilder()
593*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_SECURE_ID, token.user_id)
594*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_ANY)
595*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN));
596*789431f2SAndroid Build Coastguard Worker
597*789431f2SAndroid Build Coastguard Worker AuthorizationSet op_params;
598*789431f2SAndroid Build Coastguard Worker op_params.push_back(Authorization(TAG_AUTH_TOKEN, &token, sizeof(token)));
599*789431f2SAndroid Build Coastguard Worker
600*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK,
601*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty),
602*789431f2SAndroid Build Coastguard Worker op_params, token.challenge, false /* is_begin_operation */));
603*789431f2SAndroid Build Coastguard Worker }
604*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestAuthPerOpInvalidTokenSignature)605*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestAuthPerOpInvalidTokenSignature) {
606*789431f2SAndroid Build Coastguard Worker hw_auth_token_t token;
607*789431f2SAndroid Build Coastguard Worker memset(&token, 0, sizeof(token));
608*789431f2SAndroid Build Coastguard Worker token.version = HW_AUTH_TOKEN_VERSION;
609*789431f2SAndroid Build Coastguard Worker token.challenge = 99;
610*789431f2SAndroid Build Coastguard Worker token.user_id = 9;
611*789431f2SAndroid Build Coastguard Worker token.authenticator_id = 0;
612*789431f2SAndroid Build Coastguard Worker token.authenticator_type = hton(static_cast<uint32_t>(HW_AUTH_PASSWORD));
613*789431f2SAndroid Build Coastguard Worker token.timestamp = 0;
614*789431f2SAndroid Build Coastguard Worker
615*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(AuthorizationSetBuilder()
616*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ALGORITHM, KM_ALGORITHM_EC)
617*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_SECURE_ID, token.user_id)
618*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_ANY)
619*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN));
620*789431f2SAndroid Build Coastguard Worker
621*789431f2SAndroid Build Coastguard Worker AuthorizationSet op_params;
622*789431f2SAndroid Build Coastguard Worker op_params.push_back(Authorization(TAG_AUTH_TOKEN, &token, sizeof(token)));
623*789431f2SAndroid Build Coastguard Worker
624*789431f2SAndroid Build Coastguard Worker kmen.set_report_token_valid(false);
625*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_KEY_USER_NOT_AUTHENTICATED,
626*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty),
627*789431f2SAndroid Build Coastguard Worker op_params, token.challenge, false /* is_begin_operation */));
628*789431f2SAndroid Build Coastguard Worker // Pubkey ops allowed.
629*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK,
630*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, key_id, AuthProxy(auth_set, empty),
631*789431f2SAndroid Build Coastguard Worker op_params, token.challenge, false /* is_begin_operation */));
632*789431f2SAndroid Build Coastguard Worker }
633*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestAuthPerOpWrongChallenge)634*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestAuthPerOpWrongChallenge) {
635*789431f2SAndroid Build Coastguard Worker hw_auth_token_t token;
636*789431f2SAndroid Build Coastguard Worker memset(&token, 0, sizeof(token));
637*789431f2SAndroid Build Coastguard Worker token.version = HW_AUTH_TOKEN_VERSION;
638*789431f2SAndroid Build Coastguard Worker token.challenge = 99;
639*789431f2SAndroid Build Coastguard Worker token.user_id = 9;
640*789431f2SAndroid Build Coastguard Worker token.authenticator_id = 0;
641*789431f2SAndroid Build Coastguard Worker token.authenticator_type = hton(static_cast<uint32_t>(HW_AUTH_PASSWORD));
642*789431f2SAndroid Build Coastguard Worker token.timestamp = 0;
643*789431f2SAndroid Build Coastguard Worker
644*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(AuthorizationSetBuilder()
645*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_SECURE_ID, token.user_id)
646*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_ANY)
647*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN));
648*789431f2SAndroid Build Coastguard Worker
649*789431f2SAndroid Build Coastguard Worker AuthorizationSet op_params;
650*789431f2SAndroid Build Coastguard Worker op_params.push_back(Authorization(TAG_AUTH_TOKEN, &token, sizeof(token)));
651*789431f2SAndroid Build Coastguard Worker
652*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_KEY_USER_NOT_AUTHENTICATED,
653*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty),
654*789431f2SAndroid Build Coastguard Worker op_params, token.challenge + 1 /* doesn't match token */,
655*789431f2SAndroid Build Coastguard Worker false /* is_begin_operation */));
656*789431f2SAndroid Build Coastguard Worker }
657*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestAuthPerOpNoAuthType)658*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestAuthPerOpNoAuthType) {
659*789431f2SAndroid Build Coastguard Worker hw_auth_token_t token;
660*789431f2SAndroid Build Coastguard Worker memset(&token, 0, sizeof(token));
661*789431f2SAndroid Build Coastguard Worker token.version = HW_AUTH_TOKEN_VERSION;
662*789431f2SAndroid Build Coastguard Worker token.challenge = 99;
663*789431f2SAndroid Build Coastguard Worker token.user_id = 9;
664*789431f2SAndroid Build Coastguard Worker token.authenticator_id = 0;
665*789431f2SAndroid Build Coastguard Worker token.authenticator_type = hton(static_cast<uint32_t>(HW_AUTH_PASSWORD));
666*789431f2SAndroid Build Coastguard Worker token.timestamp = 0;
667*789431f2SAndroid Build Coastguard Worker
668*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(AuthorizationSetBuilder()
669*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
670*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_SECURE_ID, token.user_id)
671*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN));
672*789431f2SAndroid Build Coastguard Worker
673*789431f2SAndroid Build Coastguard Worker AuthorizationSet op_params;
674*789431f2SAndroid Build Coastguard Worker op_params.push_back(Authorization(TAG_AUTH_TOKEN, &token, sizeof(token)));
675*789431f2SAndroid Build Coastguard Worker
676*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_KEY_USER_NOT_AUTHENTICATED,
677*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty),
678*789431f2SAndroid Build Coastguard Worker op_params, token.challenge, false /* is_begin_operation */));
679*789431f2SAndroid Build Coastguard Worker // Pubkey ops allowed.
680*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK,
681*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, key_id, AuthProxy(auth_set, empty),
682*789431f2SAndroid Build Coastguard Worker op_params, token.challenge, false /* is_begin_operation */));
683*789431f2SAndroid Build Coastguard Worker }
684*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestAuthPerOpWrongAuthType)685*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestAuthPerOpWrongAuthType) {
686*789431f2SAndroid Build Coastguard Worker hw_auth_token_t token;
687*789431f2SAndroid Build Coastguard Worker memset(&token, 0, sizeof(token));
688*789431f2SAndroid Build Coastguard Worker token.version = HW_AUTH_TOKEN_VERSION;
689*789431f2SAndroid Build Coastguard Worker token.challenge = 99;
690*789431f2SAndroid Build Coastguard Worker token.user_id = 9;
691*789431f2SAndroid Build Coastguard Worker token.authenticator_id = 0;
692*789431f2SAndroid Build Coastguard Worker token.authenticator_type = hton(static_cast<uint32_t>(HW_AUTH_PASSWORD));
693*789431f2SAndroid Build Coastguard Worker token.timestamp = 0;
694*789431f2SAndroid Build Coastguard Worker
695*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(
696*789431f2SAndroid Build Coastguard Worker AuthorizationSetBuilder()
697*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
698*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_SECURE_ID, token.user_id)
699*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_FINGERPRINT /* doesn't match token */)
700*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN));
701*789431f2SAndroid Build Coastguard Worker
702*789431f2SAndroid Build Coastguard Worker AuthorizationSet op_params;
703*789431f2SAndroid Build Coastguard Worker op_params.push_back(Authorization(TAG_AUTH_TOKEN, &token, sizeof(token)));
704*789431f2SAndroid Build Coastguard Worker
705*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_KEY_USER_NOT_AUTHENTICATED,
706*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty),
707*789431f2SAndroid Build Coastguard Worker op_params, token.challenge, false /* is_begin_operation */));
708*789431f2SAndroid Build Coastguard Worker // Pubkey ops allowed.
709*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK,
710*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, key_id, AuthProxy(auth_set, empty),
711*789431f2SAndroid Build Coastguard Worker op_params, token.challenge, false /* is_begin_operation */));
712*789431f2SAndroid Build Coastguard Worker }
713*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestAuthPerOpWrongSid)714*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestAuthPerOpWrongSid) {
715*789431f2SAndroid Build Coastguard Worker hw_auth_token_t token;
716*789431f2SAndroid Build Coastguard Worker memset(&token, 0, sizeof(token));
717*789431f2SAndroid Build Coastguard Worker token.version = HW_AUTH_TOKEN_VERSION;
718*789431f2SAndroid Build Coastguard Worker token.challenge = 99;
719*789431f2SAndroid Build Coastguard Worker token.user_id = 9;
720*789431f2SAndroid Build Coastguard Worker token.authenticator_id = 0;
721*789431f2SAndroid Build Coastguard Worker token.authenticator_type = hton(static_cast<uint32_t>(HW_AUTH_PASSWORD));
722*789431f2SAndroid Build Coastguard Worker token.timestamp = 0;
723*789431f2SAndroid Build Coastguard Worker
724*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(
725*789431f2SAndroid Build Coastguard Worker AuthorizationSetBuilder()
726*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
727*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_SECURE_ID, token.user_id + 1 /* doesn't match token */)
728*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_ANY)
729*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN));
730*789431f2SAndroid Build Coastguard Worker
731*789431f2SAndroid Build Coastguard Worker AuthorizationSet op_params;
732*789431f2SAndroid Build Coastguard Worker op_params.push_back(Authorization(TAG_AUTH_TOKEN, &token, sizeof(token)));
733*789431f2SAndroid Build Coastguard Worker
734*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_KEY_USER_NOT_AUTHENTICATED,
735*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty),
736*789431f2SAndroid Build Coastguard Worker op_params, token.challenge, false /* is_begin_operation */));
737*789431f2SAndroid Build Coastguard Worker // Pubkey op allowed.
738*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK,
739*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, key_id, AuthProxy(auth_set, empty),
740*789431f2SAndroid Build Coastguard Worker op_params, token.challenge, false /* is_begin_operation */));
741*789431f2SAndroid Build Coastguard Worker }
742*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestAuthPerOpSuccessAlternateSid)743*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestAuthPerOpSuccessAlternateSid) {
744*789431f2SAndroid Build Coastguard Worker hw_auth_token_t token;
745*789431f2SAndroid Build Coastguard Worker memset(&token, 0, sizeof(token));
746*789431f2SAndroid Build Coastguard Worker token.version = HW_AUTH_TOKEN_VERSION;
747*789431f2SAndroid Build Coastguard Worker token.challenge = 99;
748*789431f2SAndroid Build Coastguard Worker token.user_id = 9;
749*789431f2SAndroid Build Coastguard Worker token.authenticator_id = 10;
750*789431f2SAndroid Build Coastguard Worker token.authenticator_type = hton(static_cast<uint32_t>(HW_AUTH_PASSWORD));
751*789431f2SAndroid Build Coastguard Worker token.timestamp = 0;
752*789431f2SAndroid Build Coastguard Worker
753*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(AuthorizationSetBuilder()
754*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_SECURE_ID, token.authenticator_id)
755*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_ANY)
756*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN));
757*789431f2SAndroid Build Coastguard Worker
758*789431f2SAndroid Build Coastguard Worker AuthorizationSet op_params;
759*789431f2SAndroid Build Coastguard Worker op_params.push_back(Authorization(TAG_AUTH_TOKEN, &token, sizeof(token)));
760*789431f2SAndroid Build Coastguard Worker
761*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK,
762*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty),
763*789431f2SAndroid Build Coastguard Worker op_params, token.challenge, false /* is_begin_operation */));
764*789431f2SAndroid Build Coastguard Worker }
765*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestAuthPerOpMissingToken)766*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestAuthPerOpMissingToken) {
767*789431f2SAndroid Build Coastguard Worker hw_auth_token_t token;
768*789431f2SAndroid Build Coastguard Worker memset(&token, 0, sizeof(token));
769*789431f2SAndroid Build Coastguard Worker token.version = HW_AUTH_TOKEN_VERSION;
770*789431f2SAndroid Build Coastguard Worker token.challenge = 99;
771*789431f2SAndroid Build Coastguard Worker token.user_id = 9;
772*789431f2SAndroid Build Coastguard Worker token.authenticator_id = 0;
773*789431f2SAndroid Build Coastguard Worker token.authenticator_type = hton(static_cast<uint32_t>(HW_AUTH_PASSWORD));
774*789431f2SAndroid Build Coastguard Worker token.timestamp = 0;
775*789431f2SAndroid Build Coastguard Worker
776*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(AuthorizationSetBuilder()
777*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
778*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_SECURE_ID, token.user_id)
779*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_ANY)
780*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN));
781*789431f2SAndroid Build Coastguard Worker
782*789431f2SAndroid Build Coastguard Worker AuthorizationSet op_params;
783*789431f2SAndroid Build Coastguard Worker
784*789431f2SAndroid Build Coastguard Worker // During begin we can skip the auth token
785*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK,
786*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty),
787*789431f2SAndroid Build Coastguard Worker op_params, token.challenge, true /* is_begin_operation */));
788*789431f2SAndroid Build Coastguard Worker // Afterwards we must have authentication
789*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_KEY_USER_NOT_AUTHENTICATED,
790*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty),
791*789431f2SAndroid Build Coastguard Worker op_params, token.challenge, false /* is_begin_operation */));
792*789431f2SAndroid Build Coastguard Worker // Pubkey ops allowed
793*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK,
794*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, key_id, AuthProxy(auth_set, empty),
795*789431f2SAndroid Build Coastguard Worker op_params, token.challenge, false /* is_begin_operation */));
796*789431f2SAndroid Build Coastguard Worker
797*789431f2SAndroid Build Coastguard Worker auth_set.Reinitialize(AuthorizationSetBuilder()
798*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ALGORITHM, KM_ALGORITHM_AES)
799*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_SECURE_ID, token.user_id)
800*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_ANY)
801*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
802*789431f2SAndroid Build Coastguard Worker .build());
803*789431f2SAndroid Build Coastguard Worker
804*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_KEY_USER_NOT_AUTHENTICATED,
805*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, key_id, AuthProxy(auth_set, empty),
806*789431f2SAndroid Build Coastguard Worker op_params, token.challenge, false /* is_begin_operation */));
807*789431f2SAndroid Build Coastguard Worker }
808*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestAuthAndNoAuth)809*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestAuthAndNoAuth) {
810*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(AuthorizationSetBuilder()
811*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_SECURE_ID, 1)
812*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_NO_AUTH_REQUIRED)
813*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN));
814*789431f2SAndroid Build Coastguard Worker
815*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_INVALID_KEY_BLOB,
816*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty)));
817*789431f2SAndroid Build Coastguard Worker }
818*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestTimedAuthSuccess)819*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestTimedAuthSuccess) {
820*789431f2SAndroid Build Coastguard Worker hw_auth_token_t token;
821*789431f2SAndroid Build Coastguard Worker memset(&token, 0, sizeof(token));
822*789431f2SAndroid Build Coastguard Worker token.version = HW_AUTH_TOKEN_VERSION;
823*789431f2SAndroid Build Coastguard Worker token.challenge = 99;
824*789431f2SAndroid Build Coastguard Worker token.user_id = 9;
825*789431f2SAndroid Build Coastguard Worker token.authenticator_id = 0;
826*789431f2SAndroid Build Coastguard Worker token.authenticator_type = hton(static_cast<uint32_t>(HW_AUTH_PASSWORD));
827*789431f2SAndroid Build Coastguard Worker token.timestamp = hton(kmen.current_time());
828*789431f2SAndroid Build Coastguard Worker
829*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(AuthorizationSetBuilder()
830*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
831*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_SECURE_ID, token.user_id)
832*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_AUTH_TIMEOUT, 1)
833*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_ANY)
834*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN));
835*789431f2SAndroid Build Coastguard Worker
836*789431f2SAndroid Build Coastguard Worker AuthorizationSet op_params;
837*789431f2SAndroid Build Coastguard Worker op_params.push_back(Authorization(TAG_AUTH_TOKEN, &token, sizeof(token)));
838*789431f2SAndroid Build Coastguard Worker
839*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK, kmen.AuthorizeOperation(
840*789431f2SAndroid Build Coastguard Worker KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty), op_params,
841*789431f2SAndroid Build Coastguard Worker 0 /* irrelevant */, false /* is_begin_operation */));
842*789431f2SAndroid Build Coastguard Worker }
843*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestTimedAuthTimedOut)844*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestTimedAuthTimedOut) {
845*789431f2SAndroid Build Coastguard Worker hw_auth_token_t token;
846*789431f2SAndroid Build Coastguard Worker memset(&token, 0, sizeof(token));
847*789431f2SAndroid Build Coastguard Worker token.version = HW_AUTH_TOKEN_VERSION;
848*789431f2SAndroid Build Coastguard Worker token.challenge = 99;
849*789431f2SAndroid Build Coastguard Worker token.user_id = 9;
850*789431f2SAndroid Build Coastguard Worker token.authenticator_id = 0;
851*789431f2SAndroid Build Coastguard Worker token.authenticator_type = hton(static_cast<uint32_t>(HW_AUTH_PASSWORD));
852*789431f2SAndroid Build Coastguard Worker token.timestamp = hton(static_cast<uint64_t>(kmen.current_time()));
853*789431f2SAndroid Build Coastguard Worker
854*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(AuthorizationSetBuilder()
855*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
856*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_SECURE_ID, token.user_id)
857*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_AUTH_TIMEOUT, 1)
858*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_ANY)
859*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN));
860*789431f2SAndroid Build Coastguard Worker
861*789431f2SAndroid Build Coastguard Worker AuthorizationSet op_params;
862*789431f2SAndroid Build Coastguard Worker op_params.push_back(Authorization(TAG_AUTH_TOKEN, &token, sizeof(token)));
863*789431f2SAndroid Build Coastguard Worker
864*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK, kmen.AuthorizeOperation(
865*789431f2SAndroid Build Coastguard Worker KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty), op_params,
866*789431f2SAndroid Build Coastguard Worker 0 /* irrelevant */, false /* is_begin_operation */));
867*789431f2SAndroid Build Coastguard Worker
868*789431f2SAndroid Build Coastguard Worker kmen.tick(1);
869*789431f2SAndroid Build Coastguard Worker
870*789431f2SAndroid Build Coastguard Worker // token still good
871*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK, kmen.AuthorizeOperation(
872*789431f2SAndroid Build Coastguard Worker KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty), op_params,
873*789431f2SAndroid Build Coastguard Worker 0 /* irrelevant */, false /* is_begin_operation */));
874*789431f2SAndroid Build Coastguard Worker
875*789431f2SAndroid Build Coastguard Worker kmen.tick(1);
876*789431f2SAndroid Build Coastguard Worker
877*789431f2SAndroid Build Coastguard Worker // token expired, not allowed during begin.
878*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_KEY_USER_NOT_AUTHENTICATED,
879*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty),
880*789431f2SAndroid Build Coastguard Worker op_params, 0 /* irrelevant */,
881*789431f2SAndroid Build Coastguard Worker true /* is_begin_operation */));
882*789431f2SAndroid Build Coastguard Worker
883*789431f2SAndroid Build Coastguard Worker // token expired, afterwards it's okay.
884*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK, kmen.AuthorizeOperation(
885*789431f2SAndroid Build Coastguard Worker KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty), op_params,
886*789431f2SAndroid Build Coastguard Worker 0 /* irrelevant */, false /* is_begin_operation */));
887*789431f2SAndroid Build Coastguard Worker
888*789431f2SAndroid Build Coastguard Worker // Pubkey ops allowed.
889*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK, kmen.AuthorizeOperation(
890*789431f2SAndroid Build Coastguard Worker KM_PURPOSE_VERIFY, key_id, AuthProxy(auth_set, empty), op_params,
891*789431f2SAndroid Build Coastguard Worker 0 /* irrelevant */, true /* is_begin_operation */));
892*789431f2SAndroid Build Coastguard Worker }
893*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestTimedAuthMissingToken)894*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestTimedAuthMissingToken) {
895*789431f2SAndroid Build Coastguard Worker hw_auth_token_t token;
896*789431f2SAndroid Build Coastguard Worker memset(&token, 0, sizeof(token));
897*789431f2SAndroid Build Coastguard Worker token.version = HW_AUTH_TOKEN_VERSION;
898*789431f2SAndroid Build Coastguard Worker token.challenge = 99;
899*789431f2SAndroid Build Coastguard Worker token.user_id = 9;
900*789431f2SAndroid Build Coastguard Worker token.authenticator_id = 0;
901*789431f2SAndroid Build Coastguard Worker token.authenticator_type = hton(static_cast<uint32_t>(HW_AUTH_PASSWORD));
902*789431f2SAndroid Build Coastguard Worker token.timestamp = hton(static_cast<uint64_t>(kmen.current_time()));
903*789431f2SAndroid Build Coastguard Worker
904*789431f2SAndroid Build Coastguard Worker AuthorizationSet auth_set(AuthorizationSetBuilder()
905*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
906*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_SECURE_ID, token.user_id)
907*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_AUTH_TIMEOUT, 1)
908*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_ANY)
909*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN));
910*789431f2SAndroid Build Coastguard Worker
911*789431f2SAndroid Build Coastguard Worker AuthorizationSet op_params;
912*789431f2SAndroid Build Coastguard Worker
913*789431f2SAndroid Build Coastguard Worker // Unlike auth-per-op, must have the auth token during begin.
914*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_KEY_USER_NOT_AUTHENTICATED,
915*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty),
916*789431f2SAndroid Build Coastguard Worker op_params, token.challenge, true /* is_begin_operation */));
917*789431f2SAndroid Build Coastguard Worker
918*789431f2SAndroid Build Coastguard Worker // Later we don't check (though begin would fail, so there wouldn't be a later).
919*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK,
920*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_SIGN, key_id, AuthProxy(auth_set, empty),
921*789431f2SAndroid Build Coastguard Worker op_params, token.challenge, false /* is_begin_operation */));
922*789431f2SAndroid Build Coastguard Worker
923*789431f2SAndroid Build Coastguard Worker // Pubkey ops allowed.
924*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ERROR_OK,
925*789431f2SAndroid Build Coastguard Worker kmen.AuthorizeOperation(KM_PURPOSE_VERIFY, key_id, AuthProxy(auth_set, empty),
926*789431f2SAndroid Build Coastguard Worker op_params, token.challenge, true /* is_begin_operation */));
927*789431f2SAndroid Build Coastguard Worker }
928*789431f2SAndroid Build Coastguard Worker
TEST_F(KeymasterBaseTest,TestCreateKeyId)929*789431f2SAndroid Build Coastguard Worker TEST_F(KeymasterBaseTest, TestCreateKeyId) {
930*789431f2SAndroid Build Coastguard Worker keymaster_key_blob_t blob = {reinterpret_cast<const uint8_t*>("foobar"), 6};
931*789431f2SAndroid Build Coastguard Worker
932*789431f2SAndroid Build Coastguard Worker km_id_t key_id = 0;
933*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(kmen.CreateKeyId(blob, &key_id));
934*789431f2SAndroid Build Coastguard Worker EXPECT_NE(0U, key_id);
935*789431f2SAndroid Build Coastguard Worker }
936*789431f2SAndroid Build Coastguard Worker
937*789431f2SAndroid Build Coastguard Worker }; /* namespace test */
938*789431f2SAndroid Build Coastguard Worker }; /* namespace keymaster */
939