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 <gtest/gtest.h>
18*789431f2SAndroid Build Coastguard Worker
19*789431f2SAndroid Build Coastguard Worker #include <keymaster/android_keymaster_utils.h>
20*789431f2SAndroid Build Coastguard Worker #include <keymaster/authorization_set.h>
21*789431f2SAndroid Build Coastguard Worker
22*789431f2SAndroid Build Coastguard Worker #include "android_keymaster_test_utils.h"
23*789431f2SAndroid Build Coastguard Worker
24*789431f2SAndroid Build Coastguard Worker namespace keymaster {
25*789431f2SAndroid Build Coastguard Worker
26*789431f2SAndroid Build Coastguard Worker namespace test {
27*789431f2SAndroid Build Coastguard Worker
TEST(Construction,ListProvided)28*789431f2SAndroid Build Coastguard Worker TEST(Construction, ListProvided) {
29*789431f2SAndroid Build Coastguard Worker keymaster_key_param_t params[] = {
30*789431f2SAndroid Build Coastguard Worker Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
31*789431f2SAndroid Build Coastguard Worker Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
32*789431f2SAndroid Build Coastguard Worker Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
33*789431f2SAndroid Build Coastguard Worker Authorization(TAG_USER_ID, 7),
34*789431f2SAndroid Build Coastguard Worker Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD),
35*789431f2SAndroid Build Coastguard Worker Authorization(TAG_APPLICATION_ID, "my_app", 6),
36*789431f2SAndroid Build Coastguard Worker Authorization(TAG_KEY_SIZE, 256),
37*789431f2SAndroid Build Coastguard Worker Authorization(TAG_AUTH_TIMEOUT, 300),
38*789431f2SAndroid Build Coastguard Worker };
39*789431f2SAndroid Build Coastguard Worker AuthorizationSet set(params, array_length(params));
40*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(8U, set.size());
41*789431f2SAndroid Build Coastguard Worker }
42*789431f2SAndroid Build Coastguard Worker
TEST(Construction,Copy)43*789431f2SAndroid Build Coastguard Worker TEST(Construction, Copy) {
44*789431f2SAndroid Build Coastguard Worker keymaster_key_param_t params[] = {
45*789431f2SAndroid Build Coastguard Worker Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
46*789431f2SAndroid Build Coastguard Worker Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
47*789431f2SAndroid Build Coastguard Worker Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA),
48*789431f2SAndroid Build Coastguard Worker Authorization(TAG_USER_ID, 7),
49*789431f2SAndroid Build Coastguard Worker Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD),
50*789431f2SAndroid Build Coastguard Worker Authorization(TAG_APPLICATION_ID, "my_app", 6),
51*789431f2SAndroid Build Coastguard Worker Authorization(TAG_KEY_SIZE, 256),
52*789431f2SAndroid Build Coastguard Worker Authorization(TAG_AUTH_TIMEOUT, 300),
53*789431f2SAndroid Build Coastguard Worker };
54*789431f2SAndroid Build Coastguard Worker AuthorizationSet set(params, array_length(params));
55*789431f2SAndroid Build Coastguard Worker AuthorizationSet set2(set);
56*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(set, set2);
57*789431f2SAndroid Build Coastguard Worker }
58*789431f2SAndroid Build Coastguard Worker
TEST(Construction,NullProvided)59*789431f2SAndroid Build Coastguard Worker TEST(Construction, NullProvided) {
60*789431f2SAndroid Build Coastguard Worker keymaster_key_param_t params[] = {
61*789431f2SAndroid Build Coastguard Worker Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN),
62*789431f2SAndroid Build Coastguard Worker Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
63*789431f2SAndroid Build Coastguard Worker };
64*789431f2SAndroid Build Coastguard Worker
65*789431f2SAndroid Build Coastguard Worker AuthorizationSet set1(params, 0);
66*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0U, set1.size());
67*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(AuthorizationSet::OK, set1.is_valid());
68*789431f2SAndroid Build Coastguard Worker
69*789431f2SAndroid Build Coastguard Worker AuthorizationSet set2(reinterpret_cast<keymaster_key_param_t*>(NULL), array_length(params));
70*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0U, set2.size());
71*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(AuthorizationSet::OK, set2.is_valid());
72*789431f2SAndroid Build Coastguard Worker }
73*789431f2SAndroid Build Coastguard Worker
TEST(Lookup,NonRepeated)74*789431f2SAndroid Build Coastguard Worker TEST(Lookup, NonRepeated) {
75*789431f2SAndroid Build Coastguard Worker AuthorizationSet set(AuthorizationSetBuilder()
76*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
77*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
78*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
79*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_ID, 7)
80*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD)
81*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_APPLICATION_ID, "my_app", 6)
82*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_KEY_SIZE, 256)
83*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_AUTH_TIMEOUT, 300));
84*789431f2SAndroid Build Coastguard Worker
85*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(8U, set.size());
86*789431f2SAndroid Build Coastguard Worker
87*789431f2SAndroid Build Coastguard Worker int pos = set.find(TAG_ALGORITHM);
88*789431f2SAndroid Build Coastguard Worker ASSERT_NE(-1, pos);
89*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_TAG_ALGORITHM, set[pos].tag);
90*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ALGORITHM_RSA, set[pos].enumerated);
91*789431f2SAndroid Build Coastguard Worker
92*789431f2SAndroid Build Coastguard Worker pos = set.find(TAG_MAC_LENGTH);
93*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(-1, pos);
94*789431f2SAndroid Build Coastguard Worker
95*789431f2SAndroid Build Coastguard Worker uint32_t int_val = 0;
96*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(set.GetTagValue(TAG_USER_ID, &int_val));
97*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(7U, int_val);
98*789431f2SAndroid Build Coastguard Worker
99*789431f2SAndroid Build Coastguard Worker keymaster_blob_t blob_val;
100*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(set.GetTagValue(TAG_APPLICATION_ID, &blob_val));
101*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(6U, blob_val.data_length);
102*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(blob_val.data, "my_app", 6));
103*789431f2SAndroid Build Coastguard Worker }
104*789431f2SAndroid Build Coastguard Worker
TEST(Lookup,Repeated)105*789431f2SAndroid Build Coastguard Worker TEST(Lookup, Repeated) {
106*789431f2SAndroid Build Coastguard Worker AuthorizationSet set(AuthorizationSetBuilder()
107*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
108*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
109*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
110*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_ID, 7)
111*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_SECURE_ID, 47727)
112*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD)
113*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_APPLICATION_ID, "my_app", 6)
114*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_KEY_SIZE, 256)
115*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_AUTH_TIMEOUT, 300));
116*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(9U, set.size());
117*789431f2SAndroid Build Coastguard Worker
118*789431f2SAndroid Build Coastguard Worker int pos = set.find(TAG_PURPOSE);
119*789431f2SAndroid Build Coastguard Worker ASSERT_FALSE(pos == -1);
120*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_TAG_PURPOSE, set[pos].tag);
121*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_PURPOSE_SIGN, set[pos].enumerated);
122*789431f2SAndroid Build Coastguard Worker
123*789431f2SAndroid Build Coastguard Worker pos = set.find(TAG_PURPOSE, pos);
124*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_TAG_PURPOSE, set[pos].tag);
125*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_PURPOSE_VERIFY, set[pos].enumerated);
126*789431f2SAndroid Build Coastguard Worker
127*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(-1, set.find(TAG_PURPOSE, pos));
128*789431f2SAndroid Build Coastguard Worker
129*789431f2SAndroid Build Coastguard Worker pos = set.find(TAG_USER_SECURE_ID, pos);
130*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_TAG_USER_SECURE_ID, set[pos].tag);
131*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(47727U, set[pos].long_integer);
132*789431f2SAndroid Build Coastguard Worker }
133*789431f2SAndroid Build Coastguard Worker
TEST(Lookup,Indexed)134*789431f2SAndroid Build Coastguard Worker TEST(Lookup, Indexed) {
135*789431f2SAndroid Build Coastguard Worker AuthorizationSet set(AuthorizationSetBuilder()
136*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
137*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
138*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
139*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_ID, 7)
140*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD)
141*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_APPLICATION_ID, "my_app", 6)
142*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_KEY_SIZE, 256)
143*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_AUTH_TIMEOUT, 300));
144*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(8U, set.size());
145*789431f2SAndroid Build Coastguard Worker
146*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_TAG_PURPOSE, set[0].tag);
147*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_PURPOSE_SIGN, set[0].enumerated);
148*789431f2SAndroid Build Coastguard Worker
149*789431f2SAndroid Build Coastguard Worker // Lookup beyond end doesn't work, just returns zeros, but doens't blow up either (verify by
150*789431f2SAndroid Build Coastguard Worker // running under valgrind).
151*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_TAG_INVALID, set[10].tag);
152*789431f2SAndroid Build Coastguard Worker }
153*789431f2SAndroid Build Coastguard Worker
TEST(Serialization,RoundTrip)154*789431f2SAndroid Build Coastguard Worker TEST(Serialization, RoundTrip) {
155*789431f2SAndroid Build Coastguard Worker AuthorizationSet set(AuthorizationSetBuilder()
156*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
157*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
158*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
159*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_ID, 7)
160*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD)
161*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_APPLICATION_ID, "my_app", 6)
162*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_KEY_SIZE, 256)
163*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_SECURE_ID, 47727)
164*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_AUTH_TIMEOUT, 300)
165*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ALL_USERS)
166*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_RSA_PUBLIC_EXPONENT, 3)
167*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ACTIVE_DATETIME, 10));
168*789431f2SAndroid Build Coastguard Worker
169*789431f2SAndroid Build Coastguard Worker size_t size = set.SerializedSize();
170*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(size > 0);
171*789431f2SAndroid Build Coastguard Worker
172*789431f2SAndroid Build Coastguard Worker UniquePtr<uint8_t[]> buf(new uint8_t[size]);
173*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(buf.get() + size, set.Serialize(buf.get(), buf.get() + size));
174*789431f2SAndroid Build Coastguard Worker AuthorizationSet deserialized(buf.get(), size);
175*789431f2SAndroid Build Coastguard Worker
176*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(AuthorizationSet::OK, deserialized.is_valid());
177*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(set, deserialized);
178*789431f2SAndroid Build Coastguard Worker
179*789431f2SAndroid Build Coastguard Worker int pos = deserialized.find(TAG_APPLICATION_ID);
180*789431f2SAndroid Build Coastguard Worker ASSERT_NE(-1, pos);
181*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_TAG_APPLICATION_ID, deserialized[pos].tag);
182*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(6U, deserialized[pos].blob.data_length);
183*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(deserialized[pos].blob.data, "my_app", 6));
184*789431f2SAndroid Build Coastguard Worker }
185*789431f2SAndroid Build Coastguard Worker
TEST(Deserialization,Deserialize)186*789431f2SAndroid Build Coastguard Worker TEST(Deserialization, Deserialize) {
187*789431f2SAndroid Build Coastguard Worker AuthorizationSet set(AuthorizationSetBuilder()
188*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
189*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
190*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
191*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_ID, 7)
192*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD)
193*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_APPLICATION_ID, "my_app", 6)
194*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_KEY_SIZE, 256)
195*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_AUTH_TIMEOUT, 300));
196*789431f2SAndroid Build Coastguard Worker
197*789431f2SAndroid Build Coastguard Worker size_t size = set.SerializedSize();
198*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(size > 0);
199*789431f2SAndroid Build Coastguard Worker
200*789431f2SAndroid Build Coastguard Worker UniquePtr<uint8_t[]> buf(new uint8_t[size]);
201*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(buf.get() + size, set.Serialize(buf.get(), buf.get() + size));
202*789431f2SAndroid Build Coastguard Worker AuthorizationSet deserialized;
203*789431f2SAndroid Build Coastguard Worker const uint8_t* p = buf.get();
204*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(deserialized.Deserialize(&p, p + size));
205*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(p, buf.get() + size);
206*789431f2SAndroid Build Coastguard Worker
207*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(AuthorizationSet::OK, deserialized.is_valid());
208*789431f2SAndroid Build Coastguard Worker
209*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(set.size(), deserialized.size());
210*789431f2SAndroid Build Coastguard Worker for (size_t i = 0; i < set.size(); ++i) {
211*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(set[i].tag, deserialized[i].tag);
212*789431f2SAndroid Build Coastguard Worker }
213*789431f2SAndroid Build Coastguard Worker
214*789431f2SAndroid Build Coastguard Worker int pos = deserialized.find(TAG_APPLICATION_ID);
215*789431f2SAndroid Build Coastguard Worker ASSERT_NE(-1, pos);
216*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_TAG_APPLICATION_ID, deserialized[pos].tag);
217*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(6U, deserialized[pos].blob.data_length);
218*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(deserialized[pos].blob.data, "my_app", 6));
219*789431f2SAndroid Build Coastguard Worker }
220*789431f2SAndroid Build Coastguard Worker
TEST(Deserialization,TooShortBuffer)221*789431f2SAndroid Build Coastguard Worker TEST(Deserialization, TooShortBuffer) {
222*789431f2SAndroid Build Coastguard Worker uint8_t buf[] = {0, 0, 0};
223*789431f2SAndroid Build Coastguard Worker AuthorizationSet deserialized(buf, array_length(buf));
224*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized.is_valid());
225*789431f2SAndroid Build Coastguard Worker
226*789431f2SAndroid Build Coastguard Worker const uint8_t* p = buf;
227*789431f2SAndroid Build Coastguard Worker EXPECT_FALSE(deserialized.Deserialize(&p, p + array_length(buf)));
228*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized.is_valid());
229*789431f2SAndroid Build Coastguard Worker }
230*789431f2SAndroid Build Coastguard Worker
TEST(Deserialization,InvalidLengthField)231*789431f2SAndroid Build Coastguard Worker TEST(Deserialization, InvalidLengthField) {
232*789431f2SAndroid Build Coastguard Worker AuthorizationSet set(AuthorizationSetBuilder()
233*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
234*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
235*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
236*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_ID, 7)
237*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD)
238*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_APPLICATION_ID, "my_app", 6)
239*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_KEY_SIZE, 256)
240*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_AUTH_TIMEOUT, 300));
241*789431f2SAndroid Build Coastguard Worker
242*789431f2SAndroid Build Coastguard Worker size_t size = set.SerializedSize();
243*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(size > 0);
244*789431f2SAndroid Build Coastguard Worker
245*789431f2SAndroid Build Coastguard Worker UniquePtr<uint8_t[]> buf(new uint8_t[size]);
246*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(buf.get() + size, set.Serialize(buf.get(), buf.get() + size));
247*789431f2SAndroid Build Coastguard Worker *reinterpret_cast<uint32_t*>(buf.get()) = 9;
248*789431f2SAndroid Build Coastguard Worker
249*789431f2SAndroid Build Coastguard Worker AuthorizationSet deserialized(buf.get(), size);
250*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized.is_valid());
251*789431f2SAndroid Build Coastguard Worker
252*789431f2SAndroid Build Coastguard Worker const uint8_t* p = buf.get();
253*789431f2SAndroid Build Coastguard Worker EXPECT_FALSE(deserialized.Deserialize(&p, p + size));
254*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized.is_valid());
255*789431f2SAndroid Build Coastguard Worker }
256*789431f2SAndroid Build Coastguard Worker
TEST(Clear,ClearRecoversFromError)257*789431f2SAndroid Build Coastguard Worker TEST(Clear, ClearRecoversFromError) {
258*789431f2SAndroid Build Coastguard Worker uint8_t buf[] = {0, 0, 0};
259*789431f2SAndroid Build Coastguard Worker AuthorizationSet deserialized(buf, array_length(buf));
260*789431f2SAndroid Build Coastguard Worker ASSERT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized.is_valid());
261*789431f2SAndroid Build Coastguard Worker
262*789431f2SAndroid Build Coastguard Worker deserialized.Clear();
263*789431f2SAndroid Build Coastguard Worker ASSERT_EQ(AuthorizationSet::OK, deserialized.is_valid());
264*789431f2SAndroid Build Coastguard Worker }
265*789431f2SAndroid Build Coastguard Worker
read_uint32(const uint8_t * buf)266*789431f2SAndroid Build Coastguard Worker static uint32_t read_uint32(const uint8_t* buf) {
267*789431f2SAndroid Build Coastguard Worker uint32_t val;
268*789431f2SAndroid Build Coastguard Worker memcpy(&val, buf, sizeof(val));
269*789431f2SAndroid Build Coastguard Worker return val;
270*789431f2SAndroid Build Coastguard Worker }
271*789431f2SAndroid Build Coastguard Worker
add_to_uint32(uint8_t * buf,int delta)272*789431f2SAndroid Build Coastguard Worker static void add_to_uint32(uint8_t* buf, int delta) {
273*789431f2SAndroid Build Coastguard Worker uint32_t val;
274*789431f2SAndroid Build Coastguard Worker memcpy(&val, buf, sizeof(val));
275*789431f2SAndroid Build Coastguard Worker val += delta;
276*789431f2SAndroid Build Coastguard Worker memcpy(buf, &val, sizeof(val));
277*789431f2SAndroid Build Coastguard Worker }
278*789431f2SAndroid Build Coastguard Worker
TEST(Deserialization,MalformedIndirectData)279*789431f2SAndroid Build Coastguard Worker TEST(Deserialization, MalformedIndirectData) {
280*789431f2SAndroid Build Coastguard Worker AuthorizationSet set(AuthorizationSetBuilder()
281*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_APPLICATION_ID, "my_app", 6)
282*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_APPLICATION_DATA, "foo", 3));
283*789431f2SAndroid Build Coastguard Worker size_t size = set.SerializedSize();
284*789431f2SAndroid Build Coastguard Worker
285*789431f2SAndroid Build Coastguard Worker UniquePtr<uint8_t[]> buf(new uint8_t[size]);
286*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(buf.get() + size, set.Serialize(buf.get(), buf.get() + size));
287*789431f2SAndroid Build Coastguard Worker
288*789431f2SAndroid Build Coastguard Worker // This sucks. This test, as written, requires intimate knowledge of the serialized layout of
289*789431f2SAndroid Build Coastguard Worker // this particular set, which means it's brittle. But it's important to test that we handle
290*789431f2SAndroid Build Coastguard Worker // broken serialized data and I can't think of a better way to write this.
291*789431f2SAndroid Build Coastguard Worker //
292*789431f2SAndroid Build Coastguard Worker // The contents of buf are:
293*789431f2SAndroid Build Coastguard Worker //
294*789431f2SAndroid Build Coastguard Worker // Bytes: Content:
295*789431f2SAndroid Build Coastguard Worker // 0-3 Length of string data, which is 9.
296*789431f2SAndroid Build Coastguard Worker // 4-9 "my_app"
297*789431f2SAndroid Build Coastguard Worker // 10-12 "foo"
298*789431f2SAndroid Build Coastguard Worker // 13-16 Number of elements, which is 2.
299*789431f2SAndroid Build Coastguard Worker // 17-20 Length of elements, which is 24.
300*789431f2SAndroid Build Coastguard Worker // 21-24 First tag, TAG_APPLICATION_ID
301*789431f2SAndroid Build Coastguard Worker // 25-28 Length of string "my_app", 6
302*789431f2SAndroid Build Coastguard Worker // 29-32 Offset of string "my_app", 0
303*789431f2SAndroid Build Coastguard Worker // 33-36 Second tag, TAG_APPLICATION_DATA
304*789431f2SAndroid Build Coastguard Worker // 37-40 Length of string "foo", 3
305*789431f2SAndroid Build Coastguard Worker // 41-44 Offset of string "foo", 6
306*789431f2SAndroid Build Coastguard Worker
307*789431f2SAndroid Build Coastguard Worker // Check that stuff is where we think.
308*789431f2SAndroid Build Coastguard Worker EXPECT_EQ('m', buf[4]);
309*789431f2SAndroid Build Coastguard Worker EXPECT_EQ('f', buf[10]);
310*789431f2SAndroid Build Coastguard Worker // Length of "my_app"
311*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(6U, read_uint32(buf.get() + 25));
312*789431f2SAndroid Build Coastguard Worker // Offset of "my_app"
313*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0U, read_uint32(buf.get() + 29));
314*789431f2SAndroid Build Coastguard Worker // Length of "foo"
315*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(3U, read_uint32(buf.get() + 37));
316*789431f2SAndroid Build Coastguard Worker // Offset of "foo"
317*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(6U, read_uint32(buf.get() + 41));
318*789431f2SAndroid Build Coastguard Worker
319*789431f2SAndroid Build Coastguard Worker // Check that deserialization works.
320*789431f2SAndroid Build Coastguard Worker AuthorizationSet deserialized1(buf.get(), size);
321*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(AuthorizationSet::OK, deserialized1.is_valid());
322*789431f2SAndroid Build Coastguard Worker
323*789431f2SAndroid Build Coastguard Worker const uint8_t* p = buf.get();
324*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(deserialized1.Deserialize(&p, p + size));
325*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(AuthorizationSet::OK, deserialized1.is_valid());
326*789431f2SAndroid Build Coastguard Worker
327*789431f2SAndroid Build Coastguard Worker //
328*789431f2SAndroid Build Coastguard Worker // Now mess them up in various ways:
329*789431f2SAndroid Build Coastguard Worker //
330*789431f2SAndroid Build Coastguard Worker
331*789431f2SAndroid Build Coastguard Worker // Move "foo" offset so offset + length goes off the end
332*789431f2SAndroid Build Coastguard Worker add_to_uint32(buf.get() + 41, 1);
333*789431f2SAndroid Build Coastguard Worker AuthorizationSet deserialized2(buf.get(), size);
334*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized2.is_valid());
335*789431f2SAndroid Build Coastguard Worker add_to_uint32(buf.get() + 41, -1);
336*789431f2SAndroid Build Coastguard Worker
337*789431f2SAndroid Build Coastguard Worker // Shorten the "my_app" length to make a gap between the blobs.
338*789431f2SAndroid Build Coastguard Worker add_to_uint32(buf.get() + 25, -1);
339*789431f2SAndroid Build Coastguard Worker AuthorizationSet deserialized3(buf.get(), size);
340*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized3.is_valid());
341*789431f2SAndroid Build Coastguard Worker add_to_uint32(buf.get() + 25, 1);
342*789431f2SAndroid Build Coastguard Worker
343*789431f2SAndroid Build Coastguard Worker // Extend the "my_app" length to make them overlap, and decrease the "foo" length to keep the
344*789431f2SAndroid Build Coastguard Worker // total length the same. We don't detect this but should.
345*789431f2SAndroid Build Coastguard Worker // TODO(swillden): Detect overlaps and holes that leave total size correct.
346*789431f2SAndroid Build Coastguard Worker add_to_uint32(buf.get() + 25, 1);
347*789431f2SAndroid Build Coastguard Worker add_to_uint32(buf.get() + 37, -1);
348*789431f2SAndroid Build Coastguard Worker AuthorizationSet deserialized4(buf.get(), size);
349*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(AuthorizationSet::OK, deserialized4.is_valid());
350*789431f2SAndroid Build Coastguard Worker }
351*789431f2SAndroid Build Coastguard Worker
TEST(Growable,SuccessfulRoundTrip)352*789431f2SAndroid Build Coastguard Worker TEST(Growable, SuccessfulRoundTrip) {
353*789431f2SAndroid Build Coastguard Worker AuthorizationSet growable;
354*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(growable.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)));
355*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(1U, growable.size());
356*789431f2SAndroid Build Coastguard Worker
357*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(growable.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)));
358*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(2U, growable.size());
359*789431f2SAndroid Build Coastguard Worker
360*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(growable.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)));
361*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(3U, growable.size());
362*789431f2SAndroid Build Coastguard Worker
363*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(growable.push_back(Authorization(TAG_APPLICATION_ID, "data", 4)));
364*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(4U, growable.size());
365*789431f2SAndroid Build Coastguard Worker
366*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(growable.push_back(Authorization(TAG_APPLICATION_DATA, "some more data", 14)));
367*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(5U, growable.size());
368*789431f2SAndroid Build Coastguard Worker
369*789431f2SAndroid Build Coastguard Worker size_t serialize_size = growable.SerializedSize();
370*789431f2SAndroid Build Coastguard Worker UniquePtr<uint8_t[]> serialized(new uint8_t[serialize_size]);
371*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(serialized.get() + serialize_size,
372*789431f2SAndroid Build Coastguard Worker growable.Serialize(serialized.get(), serialized.get() + serialize_size));
373*789431f2SAndroid Build Coastguard Worker
374*789431f2SAndroid Build Coastguard Worker AuthorizationSet deserialized(serialized.get(), serialize_size);
375*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(growable, deserialized);
376*789431f2SAndroid Build Coastguard Worker }
377*789431f2SAndroid Build Coastguard Worker
TEST(Growable,InsufficientElemBuf)378*789431f2SAndroid Build Coastguard Worker TEST(Growable, InsufficientElemBuf) {
379*789431f2SAndroid Build Coastguard Worker AuthorizationSet growable;
380*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(AuthorizationSet::OK, growable.is_valid());
381*789431f2SAndroid Build Coastguard Worker
382*789431f2SAndroid Build Coastguard Worker // First insertion fits.
383*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(growable.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)));
384*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(1U, growable.size());
385*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(AuthorizationSet::OK, growable.is_valid());
386*789431f2SAndroid Build Coastguard Worker
387*789431f2SAndroid Build Coastguard Worker // Second does too.
388*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(growable.push_back(Authorization(TAG_RSA_PUBLIC_EXPONENT, 3)));
389*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(2U, growable.size());
390*789431f2SAndroid Build Coastguard Worker }
391*789431f2SAndroid Build Coastguard Worker
TEST(Growable,InsufficientIndirectBuf)392*789431f2SAndroid Build Coastguard Worker TEST(Growable, InsufficientIndirectBuf) {
393*789431f2SAndroid Build Coastguard Worker AuthorizationSet growable;
394*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(AuthorizationSet::OK, growable.is_valid());
395*789431f2SAndroid Build Coastguard Worker
396*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(growable.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)));
397*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(1U, growable.size());
398*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(AuthorizationSet::OK, growable.is_valid());
399*789431f2SAndroid Build Coastguard Worker
400*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(growable.push_back(Authorization(TAG_APPLICATION_ID, "1234567890", 10)));
401*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(2U, growable.size());
402*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(AuthorizationSet::OK, growable.is_valid());
403*789431f2SAndroid Build Coastguard Worker
404*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(growable.push_back(Authorization(TAG_APPLICATION_DATA, "1", 1)));
405*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(3U, growable.size());
406*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(AuthorizationSet::OK, growable.is_valid());
407*789431f2SAndroid Build Coastguard Worker
408*789431f2SAndroid Build Coastguard Worker // Can still add another entry without indirect data. Now it's full.
409*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(growable.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)));
410*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(4U, growable.size());
411*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(AuthorizationSet::OK, growable.is_valid());
412*789431f2SAndroid Build Coastguard Worker }
413*789431f2SAndroid Build Coastguard Worker
TEST(Growable,PushBackSets)414*789431f2SAndroid Build Coastguard Worker TEST(Growable, PushBackSets) {
415*789431f2SAndroid Build Coastguard Worker AuthorizationSetBuilder builder;
416*789431f2SAndroid Build Coastguard Worker builder.Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
417*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
418*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
419*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_ID, 7)
420*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD)
421*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_APPLICATION_ID, "my_app", 6)
422*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_KEY_SIZE, 256)
423*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_AUTH_TIMEOUT, 300);
424*789431f2SAndroid Build Coastguard Worker
425*789431f2SAndroid Build Coastguard Worker AuthorizationSet set1(builder.build());
426*789431f2SAndroid Build Coastguard Worker AuthorizationSet set2(builder.build());
427*789431f2SAndroid Build Coastguard Worker
428*789431f2SAndroid Build Coastguard Worker AuthorizationSet combined;
429*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(combined.push_back(set1));
430*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(combined.push_back(set2));
431*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(set1.size() + set2.size(), combined.size());
432*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(12U, combined.indirect_size());
433*789431f2SAndroid Build Coastguard Worker }
434*789431f2SAndroid Build Coastguard Worker
TEST(GetValue,GetInt)435*789431f2SAndroid Build Coastguard Worker TEST(GetValue, GetInt) {
436*789431f2SAndroid Build Coastguard Worker AuthorizationSet set(AuthorizationSetBuilder()
437*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
438*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
439*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
440*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_ID, 7)
441*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD)
442*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_APPLICATION_ID, "my_app", 6)
443*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_AUTH_TIMEOUT, 300));
444*789431f2SAndroid Build Coastguard Worker
445*789431f2SAndroid Build Coastguard Worker uint32_t val;
446*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(set.GetTagValue(TAG_USER_ID, &val));
447*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(7U, val);
448*789431f2SAndroid Build Coastguard Worker
449*789431f2SAndroid Build Coastguard Worker // Find one that isn't there
450*789431f2SAndroid Build Coastguard Worker EXPECT_FALSE(set.GetTagValue(TAG_KEY_SIZE, &val));
451*789431f2SAndroid Build Coastguard Worker }
452*789431f2SAndroid Build Coastguard Worker
TEST(GetValue,GetLong)453*789431f2SAndroid Build Coastguard Worker TEST(GetValue, GetLong) {
454*789431f2SAndroid Build Coastguard Worker AuthorizationSet set1(AuthorizationSetBuilder()
455*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
456*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
457*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
458*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_RSA_PUBLIC_EXPONENT, 3));
459*789431f2SAndroid Build Coastguard Worker
460*789431f2SAndroid Build Coastguard Worker AuthorizationSet set2(AuthorizationSetBuilder()
461*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
462*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
463*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA));
464*789431f2SAndroid Build Coastguard Worker
465*789431f2SAndroid Build Coastguard Worker uint64_t val;
466*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(set1.GetTagValue(TAG_RSA_PUBLIC_EXPONENT, &val));
467*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(3U, val);
468*789431f2SAndroid Build Coastguard Worker
469*789431f2SAndroid Build Coastguard Worker // Find one that isn't there
470*789431f2SAndroid Build Coastguard Worker EXPECT_FALSE(set2.GetTagValue(TAG_RSA_PUBLIC_EXPONENT, &val));
471*789431f2SAndroid Build Coastguard Worker }
472*789431f2SAndroid Build Coastguard Worker
TEST(GetValue,GetLongRep)473*789431f2SAndroid Build Coastguard Worker TEST(GetValue, GetLongRep) {
474*789431f2SAndroid Build Coastguard Worker AuthorizationSet set1(AuthorizationSetBuilder()
475*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
476*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
477*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
478*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_SECURE_ID, 8338)
479*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_SECURE_ID, 4334)
480*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_RSA_PUBLIC_EXPONENT, 3));
481*789431f2SAndroid Build Coastguard Worker
482*789431f2SAndroid Build Coastguard Worker AuthorizationSet set2(AuthorizationSetBuilder()
483*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
484*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
485*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA));
486*789431f2SAndroid Build Coastguard Worker
487*789431f2SAndroid Build Coastguard Worker uint64_t val;
488*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(set1.GetTagValue(TAG_USER_SECURE_ID, 0, &val));
489*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(8338U, val);
490*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(set1.GetTagValue(TAG_USER_SECURE_ID, 1, &val));
491*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(4334U, val);
492*789431f2SAndroid Build Coastguard Worker
493*789431f2SAndroid Build Coastguard Worker // Find one that isn't there
494*789431f2SAndroid Build Coastguard Worker EXPECT_FALSE(set2.GetTagValue(TAG_USER_SECURE_ID, &val));
495*789431f2SAndroid Build Coastguard Worker }
496*789431f2SAndroid Build Coastguard Worker
TEST(GetValue,GetEnum)497*789431f2SAndroid Build Coastguard Worker TEST(GetValue, GetEnum) {
498*789431f2SAndroid Build Coastguard Worker AuthorizationSet set(AuthorizationSetBuilder()
499*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
500*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
501*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
502*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_ID, 7)
503*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD)
504*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_APPLICATION_ID, "my_app", 6)
505*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_AUTH_TIMEOUT, 300));
506*789431f2SAndroid Build Coastguard Worker
507*789431f2SAndroid Build Coastguard Worker keymaster_algorithm_t val;
508*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(set.GetTagValue(TAG_ALGORITHM, &val));
509*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ALGORITHM_RSA, val);
510*789431f2SAndroid Build Coastguard Worker
511*789431f2SAndroid Build Coastguard Worker // Find one that isn't there
512*789431f2SAndroid Build Coastguard Worker keymaster_padding_t val2;
513*789431f2SAndroid Build Coastguard Worker EXPECT_FALSE(set.GetTagValue(TAG_PADDING, &val2));
514*789431f2SAndroid Build Coastguard Worker }
515*789431f2SAndroid Build Coastguard Worker
TEST(GetValue,GetEnumRep)516*789431f2SAndroid Build Coastguard Worker TEST(GetValue, GetEnumRep) {
517*789431f2SAndroid Build Coastguard Worker AuthorizationSet set(AuthorizationSetBuilder()
518*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
519*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
520*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
521*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_ID, 7)
522*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD)
523*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_APPLICATION_ID, "my_app", 6)
524*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_AUTH_TIMEOUT, 300));
525*789431f2SAndroid Build Coastguard Worker
526*789431f2SAndroid Build Coastguard Worker keymaster_purpose_t val;
527*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(set.GetTagValue(TAG_PURPOSE, 0, &val));
528*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_PURPOSE_SIGN, val);
529*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(set.GetTagValue(TAG_PURPOSE, 1, &val));
530*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_PURPOSE_VERIFY, val);
531*789431f2SAndroid Build Coastguard Worker
532*789431f2SAndroid Build Coastguard Worker // Find one that isn't there
533*789431f2SAndroid Build Coastguard Worker EXPECT_FALSE(set.GetTagValue(TAG_PURPOSE, 2, &val));
534*789431f2SAndroid Build Coastguard Worker }
535*789431f2SAndroid Build Coastguard Worker
TEST(GetValue,GetDate)536*789431f2SAndroid Build Coastguard Worker TEST(GetValue, GetDate) {
537*789431f2SAndroid Build Coastguard Worker AuthorizationSet set(AuthorizationSetBuilder()
538*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ACTIVE_DATETIME, 10)
539*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
540*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
541*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
542*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_ID, 7)
543*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD)
544*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_APPLICATION_ID, "my_app", 6)
545*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_AUTH_TIMEOUT, 300));
546*789431f2SAndroid Build Coastguard Worker
547*789431f2SAndroid Build Coastguard Worker uint64_t val;
548*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(set.GetTagValue(TAG_ACTIVE_DATETIME, &val));
549*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(10U, val);
550*789431f2SAndroid Build Coastguard Worker
551*789431f2SAndroid Build Coastguard Worker // Find one that isn't there
552*789431f2SAndroid Build Coastguard Worker EXPECT_FALSE(set.GetTagValue(TAG_USAGE_EXPIRE_DATETIME, &val));
553*789431f2SAndroid Build Coastguard Worker }
554*789431f2SAndroid Build Coastguard Worker
TEST(GetValue,GetBlob)555*789431f2SAndroid Build Coastguard Worker TEST(GetValue, GetBlob) {
556*789431f2SAndroid Build Coastguard Worker AuthorizationSet set(AuthorizationSetBuilder()
557*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
558*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
559*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
560*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_ID, 7)
561*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD)
562*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_APPLICATION_ID, "my_app", 6)
563*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_AUTH_TIMEOUT, 300));
564*789431f2SAndroid Build Coastguard Worker
565*789431f2SAndroid Build Coastguard Worker keymaster_blob_t val;
566*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(set.GetTagValue(TAG_APPLICATION_ID, &val));
567*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(6U, val.data_length);
568*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(val.data, "my_app", 6));
569*789431f2SAndroid Build Coastguard Worker
570*789431f2SAndroid Build Coastguard Worker // Find one that isn't there
571*789431f2SAndroid Build Coastguard Worker EXPECT_FALSE(set.GetTagValue(TAG_APPLICATION_DATA, &val));
572*789431f2SAndroid Build Coastguard Worker }
573*789431f2SAndroid Build Coastguard Worker
TEST(Deduplication,NoDuplicates)574*789431f2SAndroid Build Coastguard Worker TEST(Deduplication, NoDuplicates) {
575*789431f2SAndroid Build Coastguard Worker AuthorizationSet set(AuthorizationSetBuilder()
576*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ACTIVE_DATETIME, 10)
577*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
578*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_ID, 7)
579*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD));
580*789431f2SAndroid Build Coastguard Worker AuthorizationSet copy(set);
581*789431f2SAndroid Build Coastguard Worker
582*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(copy, set);
583*789431f2SAndroid Build Coastguard Worker set.Deduplicate();
584*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(copy.size(), set.size());
585*789431f2SAndroid Build Coastguard Worker
586*789431f2SAndroid Build Coastguard Worker // Sets no longer compare equal, because of ordering (ugh, maybe it should be
587*789431f2SAndroid Build Coastguard Worker // AuthorizationList, not AuthorizationSet).
588*789431f2SAndroid Build Coastguard Worker EXPECT_NE(copy, set);
589*789431f2SAndroid Build Coastguard Worker }
590*789431f2SAndroid Build Coastguard Worker
TEST(Deduplication,NoDuplicatesHasInvalid)591*789431f2SAndroid Build Coastguard Worker TEST(Deduplication, NoDuplicatesHasInvalid) {
592*789431f2SAndroid Build Coastguard Worker AuthorizationSet set(AuthorizationSetBuilder()
593*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ACTIVE_DATETIME, 10)
594*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_INVALID)
595*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
596*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_ID, 7)
597*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD));
598*789431f2SAndroid Build Coastguard Worker AuthorizationSet copy(set);
599*789431f2SAndroid Build Coastguard Worker
600*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(copy, set);
601*789431f2SAndroid Build Coastguard Worker set.Deduplicate();
602*789431f2SAndroid Build Coastguard Worker
603*789431f2SAndroid Build Coastguard Worker // Deduplicate should have removed the invalid.
604*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(copy.size() - 1, set.size());
605*789431f2SAndroid Build Coastguard Worker EXPECT_NE(copy, set);
606*789431f2SAndroid Build Coastguard Worker }
607*789431f2SAndroid Build Coastguard Worker
TEST(Deduplication,DuplicateEnum)608*789431f2SAndroid Build Coastguard Worker TEST(Deduplication, DuplicateEnum) {
609*789431f2SAndroid Build Coastguard Worker AuthorizationSet set(AuthorizationSetBuilder()
610*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
611*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ACTIVE_DATETIME, 10)
612*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
613*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_ID, 7)
614*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
615*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD));
616*789431f2SAndroid Build Coastguard Worker AuthorizationSet copy(set);
617*789431f2SAndroid Build Coastguard Worker
618*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(copy, set);
619*789431f2SAndroid Build Coastguard Worker set.Deduplicate();
620*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(copy.size() - 2, set.size());
621*789431f2SAndroid Build Coastguard Worker EXPECT_NE(copy, set);
622*789431f2SAndroid Build Coastguard Worker }
623*789431f2SAndroid Build Coastguard Worker
TEST(Deduplication,DuplicateBlob)624*789431f2SAndroid Build Coastguard Worker TEST(Deduplication, DuplicateBlob) {
625*789431f2SAndroid Build Coastguard Worker AuthorizationSet set(AuthorizationSetBuilder()
626*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
627*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ACTIVE_DATETIME, 10)
628*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_APPLICATION_DATA, "data", 4)
629*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
630*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_ID, 7)
631*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
632*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_APPLICATION_DATA, "data", 4)
633*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_APPLICATION_DATA, "foo", 3)
634*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD));
635*789431f2SAndroid Build Coastguard Worker AuthorizationSet copy(set);
636*789431f2SAndroid Build Coastguard Worker
637*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(copy, set);
638*789431f2SAndroid Build Coastguard Worker set.Deduplicate();
639*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(copy.size() - 3, set.size());
640*789431f2SAndroid Build Coastguard Worker EXPECT_NE(copy, set);
641*789431f2SAndroid Build Coastguard Worker
642*789431f2SAndroid Build Coastguard Worker // The real test here is that valgrind reports no leak.
643*789431f2SAndroid Build Coastguard Worker }
644*789431f2SAndroid Build Coastguard Worker
TEST(Difference,Disjoint)645*789431f2SAndroid Build Coastguard Worker TEST(Difference, Disjoint) {
646*789431f2SAndroid Build Coastguard Worker AuthorizationSet set1(AuthorizationSetBuilder()
647*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_APPLICATION_DATA, "data", 4)
648*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
649*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ACTIVE_DATETIME, 10));
650*789431f2SAndroid Build Coastguard Worker
651*789431f2SAndroid Build Coastguard Worker AuthorizationSet set2(AuthorizationSetBuilder()
652*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_ID, 7)
653*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_APPLICATION_DATA, "foo", 3)
654*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD));
655*789431f2SAndroid Build Coastguard Worker
656*789431f2SAndroid Build Coastguard Worker // Elements are the same as set1, but happen to be in a different order
657*789431f2SAndroid Build Coastguard Worker AuthorizationSet expected(AuthorizationSetBuilder()
658*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
659*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ACTIVE_DATETIME, 10)
660*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_APPLICATION_DATA, "data", 4));
661*789431f2SAndroid Build Coastguard Worker
662*789431f2SAndroid Build Coastguard Worker set1.Difference(set2);
663*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(expected, set1);
664*789431f2SAndroid Build Coastguard Worker }
665*789431f2SAndroid Build Coastguard Worker
TEST(Difference,Overlap)666*789431f2SAndroid Build Coastguard Worker TEST(Difference, Overlap) {
667*789431f2SAndroid Build Coastguard Worker AuthorizationSet set1(AuthorizationSetBuilder()
668*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
669*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ACTIVE_DATETIME, 10)
670*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_APPLICATION_DATA, "data", 4));
671*789431f2SAndroid Build Coastguard Worker
672*789431f2SAndroid Build Coastguard Worker AuthorizationSet set2(AuthorizationSetBuilder()
673*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
674*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ACTIVE_DATETIME, 10)
675*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_APPLICATION_DATA, "data", 4));
676*789431f2SAndroid Build Coastguard Worker
677*789431f2SAndroid Build Coastguard Worker AuthorizationSet empty;
678*789431f2SAndroid Build Coastguard Worker set1.Difference(set2);
679*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(empty, set1);
680*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(0U, set1.size());
681*789431f2SAndroid Build Coastguard Worker }
682*789431f2SAndroid Build Coastguard Worker
TEST(Difference,NullSet)683*789431f2SAndroid Build Coastguard Worker TEST(Difference, NullSet) {
684*789431f2SAndroid Build Coastguard Worker AuthorizationSet set1(AuthorizationSetBuilder()
685*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
686*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ACTIVE_DATETIME, 10)
687*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_APPLICATION_DATA, "data", 4));
688*789431f2SAndroid Build Coastguard Worker
689*789431f2SAndroid Build Coastguard Worker AuthorizationSet set2;
690*789431f2SAndroid Build Coastguard Worker
691*789431f2SAndroid Build Coastguard Worker AuthorizationSet expected(AuthorizationSetBuilder()
692*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
693*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ACTIVE_DATETIME, 10)
694*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_APPLICATION_DATA, "data", 4));
695*789431f2SAndroid Build Coastguard Worker
696*789431f2SAndroid Build Coastguard Worker set1.Difference(set2);
697*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(expected, set1);
698*789431f2SAndroid Build Coastguard Worker }
699*789431f2SAndroid Build Coastguard Worker
TEST(Proxy,Contains)700*789431f2SAndroid Build Coastguard Worker TEST(Proxy, Contains) {
701*789431f2SAndroid Build Coastguard Worker AuthorizationSet hw_set(AuthorizationSetBuilder()
702*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
703*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY));
704*789431f2SAndroid Build Coastguard Worker AuthorizationSet sw_set(AuthorizationSetBuilder()
705*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ACTIVE_DATETIME, 10)
706*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_APPLICATION_DATA, "data", 4));
707*789431f2SAndroid Build Coastguard Worker AuthProxy proxy(hw_set, sw_set);
708*789431f2SAndroid Build Coastguard Worker
709*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(proxy.Contains(TAG_PURPOSE));
710*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(proxy.Contains(TAG_ACTIVE_DATETIME));
711*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(proxy.Contains(TAG_APPLICATION_DATA));
712*789431f2SAndroid Build Coastguard Worker EXPECT_FALSE(proxy.Contains(TAG_USER_ID));
713*789431f2SAndroid Build Coastguard Worker }
714*789431f2SAndroid Build Coastguard Worker
TEST(Proxy,GetTagValue)715*789431f2SAndroid Build Coastguard Worker TEST(Proxy, GetTagValue) {
716*789431f2SAndroid Build Coastguard Worker AuthorizationSet hw_set(
717*789431f2SAndroid Build Coastguard Worker AuthorizationSetBuilder().Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY));
718*789431f2SAndroid Build Coastguard Worker AuthorizationSet sw_set(
719*789431f2SAndroid Build Coastguard Worker AuthorizationSetBuilder().Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA));
720*789431f2SAndroid Build Coastguard Worker AuthProxy proxy(hw_set, sw_set);
721*789431f2SAndroid Build Coastguard Worker
722*789431f2SAndroid Build Coastguard Worker keymaster_purpose_t purpose;
723*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(proxy.GetTagValue(TAG_PURPOSE, &purpose));
724*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_PURPOSE_VERIFY, purpose);
725*789431f2SAndroid Build Coastguard Worker
726*789431f2SAndroid Build Coastguard Worker keymaster_algorithm_t algo;
727*789431f2SAndroid Build Coastguard Worker EXPECT_TRUE(proxy.GetTagValue(TAG_ALGORITHM, &algo));
728*789431f2SAndroid Build Coastguard Worker EXPECT_EQ(KM_ALGORITHM_RSA, algo);
729*789431f2SAndroid Build Coastguard Worker
730*789431f2SAndroid Build Coastguard Worker keymaster_block_mode_t mode;
731*789431f2SAndroid Build Coastguard Worker EXPECT_FALSE(proxy.GetTagValue(TAG_BLOCK_MODE, &mode));
732*789431f2SAndroid Build Coastguard Worker }
733*789431f2SAndroid Build Coastguard Worker
TEST(Proxy,GetTagCount)734*789431f2SAndroid Build Coastguard Worker TEST(Proxy, GetTagCount) {
735*789431f2SAndroid Build Coastguard Worker AuthorizationSet hw_set(AuthorizationSetBuilder()
736*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
737*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY));
738*789431f2SAndroid Build Coastguard Worker // Note: would not normally expect a tag to appear in both hw_enforced and sw_enforced.
739*789431f2SAndroid Build Coastguard Worker AuthorizationSet sw_set(AuthorizationSetBuilder()
740*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_ACTIVE_DATETIME, 10)
741*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_PURPOSE, KM_PURPOSE_ENCRYPT)
742*789431f2SAndroid Build Coastguard Worker .Authorization(TAG_APPLICATION_DATA, "data", 4));
743*789431f2SAndroid Build Coastguard Worker AuthProxy proxy(hw_set, sw_set);
744*789431f2SAndroid Build Coastguard Worker
745*789431f2SAndroid Build Coastguard Worker EXPECT_EQ((size_t)3, proxy.GetTagCount(TAG_PURPOSE));
746*789431f2SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, proxy.GetTagCount(TAG_ACTIVE_DATETIME));
747*789431f2SAndroid Build Coastguard Worker EXPECT_EQ((size_t)1, proxy.GetTagCount(TAG_APPLICATION_DATA));
748*789431f2SAndroid Build Coastguard Worker EXPECT_EQ((size_t)0, proxy.GetTagCount(TAG_USER_ID));
749*789431f2SAndroid Build Coastguard Worker }
750*789431f2SAndroid Build Coastguard Worker
751*789431f2SAndroid Build Coastguard Worker } // namespace test
752*789431f2SAndroid Build Coastguard Worker } // namespace keymaster
753