15ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden/*
25ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * Copyright (C) 2014 The Android Open Source Project
35ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden *
45ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * Licensed under the Apache License, Version 2.0 (the "License");
55ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * you may not use this file except in compliance with the License.
65ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * You may obtain a copy of the License at
75ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden *
85ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden *      http://www.apache.org/licenses/LICENSE-2.0
95ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden *
105ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * Unless required by applicable law or agreed to in writing, software
115ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * distributed under the License is distributed on an "AS IS" BASIS,
125ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * See the License for the specific language governing permissions and
145ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden * limitations under the License.
155ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden */
165ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
175ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden#include <gtest/gtest.h>
185ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
1998d9b92547a9a7553b99e3e941a4175926f95b62Shawn Willden#include <keymaster/authorization_set.h>
20b6837e7a62a1192e33beef586282812239ee8b28Shawn Willden#include <keymaster/android_keymaster_utils.h>
2198d9b92547a9a7553b99e3e941a4175926f95b62Shawn Willden
22b6837e7a62a1192e33beef586282812239ee8b28Shawn Willden#include "android_keymaster_test_utils.h"
235ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
245ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdennamespace keymaster {
25834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden
265ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdennamespace test {
275ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
285ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Construction, ListProvided) {
295ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    keymaster_key_param_t params[] = {
302c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden        Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
312c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden        Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), Authorization(TAG_USER_ID, 7),
32eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden        Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD),
33eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden        Authorization(TAG_APPLICATION_ID, "my_app", 6), Authorization(TAG_KEY_SIZE, 256),
34eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden        Authorization(TAG_AUTH_TIMEOUT, 300),
355ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    };
365ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    AuthorizationSet set(params, array_length(params));
375ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(8U, set.size());
385ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
395ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
40834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn WilldenTEST(Construction, Copy) {
41834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden    keymaster_key_param_t params[] = {
422c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden        Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
432c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden        Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), Authorization(TAG_USER_ID, 7),
44eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden        Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD),
45eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden        Authorization(TAG_APPLICATION_ID, "my_app", 6), Authorization(TAG_KEY_SIZE, 256),
46eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden        Authorization(TAG_AUTH_TIMEOUT, 300),
47834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden    };
48834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden    AuthorizationSet set(params, array_length(params));
49834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden    AuthorizationSet set2(set);
507636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    EXPECT_EQ(set, set2);
51834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden}
52834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden
53b58dcde804dc9f69f89c620592b910083f32b01cShawn WilldenTEST(Construction, NullProvided) {
54b58dcde804dc9f69f89c620592b910083f32b01cShawn Willden    keymaster_key_param_t params[] = {
55b58dcde804dc9f69f89c620592b910083f32b01cShawn Willden        Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
56b58dcde804dc9f69f89c620592b910083f32b01cShawn Willden    };
57b58dcde804dc9f69f89c620592b910083f32b01cShawn Willden
58b58dcde804dc9f69f89c620592b910083f32b01cShawn Willden    AuthorizationSet set1(params, 0);
5972a5fdde1095cc012b232987d1f02de9b0507b89Shawn Willden    EXPECT_EQ(0U, set1.size());
60b58dcde804dc9f69f89c620592b910083f32b01cShawn Willden    EXPECT_EQ(AuthorizationSet::OK, set1.is_valid());
61b58dcde804dc9f69f89c620592b910083f32b01cShawn Willden
62b58dcde804dc9f69f89c620592b910083f32b01cShawn Willden    AuthorizationSet set2(reinterpret_cast<keymaster_key_param_t*>(NULL), array_length(params));
6372a5fdde1095cc012b232987d1f02de9b0507b89Shawn Willden    EXPECT_EQ(0U, set2.size());
64b58dcde804dc9f69f89c620592b910083f32b01cShawn Willden    EXPECT_EQ(AuthorizationSet::OK, set2.is_valid());
65b58dcde804dc9f69f89c620592b910083f32b01cShawn Willden}
66b58dcde804dc9f69f89c620592b910083f32b01cShawn Willden
675ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Lookup, NonRepeated) {
682c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
692c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
702c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
712c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
722c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_ID, 7)
73eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden                             .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD)
742c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_ID, "my_app", 6)
752c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_KEY_SIZE, 256)
762c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_AUTH_TIMEOUT, 300));
772c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden
785ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(8U, set.size());
795ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
805ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    int pos = set.find(TAG_ALGORITHM);
815ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    ASSERT_NE(-1, pos);
825ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(KM_TAG_ALGORITHM, set[pos].tag);
835ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(KM_ALGORITHM_RSA, set[pos].enumerated);
845ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
855ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    pos = set.find(TAG_MAC_LENGTH);
865ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(-1, pos);
875ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
885ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    uint32_t int_val = 0;
895ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(set.GetTagValue(TAG_USER_ID, &int_val));
905ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(7U, int_val);
915ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
925ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    keymaster_blob_t blob_val;
935ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(set.GetTagValue(TAG_APPLICATION_ID, &blob_val));
945ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(6U, blob_val.data_length);
955ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(0, memcmp(blob_val.data, "my_app", 6));
965ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
975ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
985ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Lookup, Repeated) {
992c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
1002c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
1012c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
1022c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
1032c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_ID, 7)
10482114e7cbf97f65348d32b2685dd52427525146dShawn Willden                             .Authorization(TAG_USER_SECURE_ID, 47727)
105eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden                             .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD)
1062c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_ID, "my_app", 6)
1072c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_KEY_SIZE, 256)
1082c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_AUTH_TIMEOUT, 300));
10982114e7cbf97f65348d32b2685dd52427525146dShawn Willden    EXPECT_EQ(9U, set.size());
1105ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
1115ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    int pos = set.find(TAG_PURPOSE);
1125ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    ASSERT_FALSE(pos == -1);
1135ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(KM_TAG_PURPOSE, set[pos].tag);
1145ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(KM_PURPOSE_SIGN, set[pos].enumerated);
1155ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
1165ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    pos = set.find(TAG_PURPOSE, pos);
1175ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(KM_TAG_PURPOSE, set[pos].tag);
1185ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(KM_PURPOSE_VERIFY, set[pos].enumerated);
1195ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
1205ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(-1, set.find(TAG_PURPOSE, pos));
12182114e7cbf97f65348d32b2685dd52427525146dShawn Willden
12282114e7cbf97f65348d32b2685dd52427525146dShawn Willden    pos = set.find(TAG_USER_SECURE_ID, pos);
12382114e7cbf97f65348d32b2685dd52427525146dShawn Willden    EXPECT_EQ(KM_TAG_USER_SECURE_ID, set[pos].tag);
12482114e7cbf97f65348d32b2685dd52427525146dShawn Willden    EXPECT_EQ(47727U, set[pos].long_integer);
1255ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
1265ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
1275ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Lookup, Indexed) {
1282c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
1292c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
1302c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
1312c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
1322c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_ID, 7)
133eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden                             .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD)
1342c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_ID, "my_app", 6)
1352c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_KEY_SIZE, 256)
1362c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_AUTH_TIMEOUT, 300));
1375ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(8U, set.size());
1385ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
1395ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(KM_TAG_PURPOSE, set[0].tag);
1405ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(KM_PURPOSE_SIGN, set[0].enumerated);
1415ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
1425ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    // Lookup beyond end doesn't work, just returns zeros, but doens't blow up either (verify by
1435ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    // running under valgrind).
1445ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(KM_TAG_INVALID, set[10].tag);
1455ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
1465ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
1475ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Serialization, RoundTrip) {
1482c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
1492c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
1502c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
1512c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
1522c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_ID, 7)
153eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden                             .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD)
1542c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_ID, "my_app", 6)
1552c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_KEY_SIZE, 256)
15682114e7cbf97f65348d32b2685dd52427525146dShawn Willden                             .Authorization(TAG_USER_SECURE_ID, 47727)
1572c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_AUTH_TIMEOUT, 300)
1582c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ALL_USERS)
1592c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_RSA_PUBLIC_EXPONENT, 3)
1602c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ACTIVE_DATETIME, 10));
1615ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
1625ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    size_t size = set.SerializedSize();
1635ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(size > 0);
1645ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
1655ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    UniquePtr<uint8_t[]> buf(new uint8_t[size]);
16658e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(buf.get() + size, set.Serialize(buf.get(), buf.get() + size));
1675ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    AuthorizationSet deserialized(buf.get(), size);
1685ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
16958e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(AuthorizationSet::OK, deserialized.is_valid());
1707636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    EXPECT_EQ(set, deserialized);
1715ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
1725ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    int pos = deserialized.find(TAG_APPLICATION_ID);
1735ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    ASSERT_NE(-1, pos);
1745ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(KM_TAG_APPLICATION_ID, deserialized[pos].tag);
1755ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(6U, deserialized[pos].blob.data_length);
1765ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(0, memcmp(deserialized[pos].blob.data, "my_app", 6));
1775ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
1785ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
17958e1a5486219a1be9264d4e863a9dd3e393906c3Shawn WilldenTEST(Deserialization, Deserialize) {
1802c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
1812c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
1822c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
1832c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
1842c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_ID, 7)
185eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden                             .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD)
1862c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_ID, "my_app", 6)
1872c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_KEY_SIZE, 256)
1882c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_AUTH_TIMEOUT, 300));
1895ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
1905ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    size_t size = set.SerializedSize();
1915ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(size > 0);
1925ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
1935ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    UniquePtr<uint8_t[]> buf(new uint8_t[size]);
19458e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(buf.get() + size, set.Serialize(buf.get(), buf.get() + size));
1955ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    AuthorizationSet deserialized;
1965ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    const uint8_t* p = buf.get();
19758e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_TRUE(deserialized.Deserialize(&p, p + size));
1985ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(p, buf.get() + size);
1995ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
20058e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(AuthorizationSet::OK, deserialized.is_valid());
2015ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
2025ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(set.size(), deserialized.size());
2035ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    for (size_t i = 0; i < set.size(); ++i) {
2045ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden        EXPECT_EQ(set[i].tag, deserialized[i].tag);
2055ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    }
2065ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
2075ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    int pos = deserialized.find(TAG_APPLICATION_ID);
2085ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    ASSERT_NE(-1, pos);
2095ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(KM_TAG_APPLICATION_ID, deserialized[pos].tag);
2105ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(6U, deserialized[pos].blob.data_length);
2115ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(0, memcmp(deserialized[pos].blob.data, "my_app", 6));
2125ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
2135ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
2145ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Deserialization, TooShortBuffer) {
2155ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    uint8_t buf[] = {0, 0, 0};
2165ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    AuthorizationSet deserialized(buf, array_length(buf));
2175ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized.is_valid());
2185ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
2195ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    const uint8_t* p = buf;
22058e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_FALSE(deserialized.Deserialize(&p, p + array_length(buf)));
2215ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized.is_valid());
2225ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
2235ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
2245ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Deserialization, InvalidLengthField) {
2252c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
2262c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
2272c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
2282c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
2292c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_ID, 7)
230eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden                             .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD)
2312c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_ID, "my_app", 6)
2322c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_KEY_SIZE, 256)
2332c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_AUTH_TIMEOUT, 300));
2345ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
2355ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    size_t size = set.SerializedSize();
2365ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(size > 0);
2375ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
2385ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    UniquePtr<uint8_t[]> buf(new uint8_t[size]);
23958e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(buf.get() + size, set.Serialize(buf.get(), buf.get() + size));
2405ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    *reinterpret_cast<uint32_t*>(buf.get()) = 9;
2415ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
2425ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    AuthorizationSet deserialized(buf.get(), size);
2435ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized.is_valid());
2445ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
2455ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    const uint8_t* p = buf.get();
24658e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_FALSE(deserialized.Deserialize(&p, p + size));
2475ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized.is_valid());
2485ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
2495ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
2508d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willdenstatic uint32_t read_uint32(const uint8_t* buf) {
2518d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    uint32_t val;
2528d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    memcpy(&val, buf, sizeof(val));
2538d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    return val;
2548d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden}
2558d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden
2568d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willdenstatic void add_to_uint32(uint8_t* buf, int delta) {
2578d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    uint32_t val;
2588d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    memcpy(&val, buf, sizeof(val));
2598d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    val += delta;
2608d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    memcpy(buf, &val, sizeof(val));
2618d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden}
2628d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden
2635ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Deserialization, MalformedIndirectData) {
2642c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
2652c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_ID, "my_app", 6)
2662c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_DATA, "foo", 3));
2675ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    size_t size = set.SerializedSize();
2685ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
2695ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    UniquePtr<uint8_t[]> buf(new uint8_t[size]);
27058e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(buf.get() + size, set.Serialize(buf.get(), buf.get() + size));
2715ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
2728d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // This sucks.  This test, as written, requires intimate knowledge of the serialized layout of
2738d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // this particular set, which means it's brittle.  But it's important to test that we handle
2748d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // broken serialized data and I can't think of a better way to write this.
2758d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    //
2768d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // The contents of buf are:
2778d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    //
2788d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // Bytes:   Content:
2798d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // 0-3      Length of string data, which is 9.
2808d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // 4-9      "my_app"
2818d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // 10-12    "foo"
2828d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // 13-16    Number of elements, which is 2.
2838d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // 17-20    Length of elements, which is 24.
2848d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // 21-24    First tag, TAG_APPLICATION_ID
2858d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // 25-28    Length of string "my_app", 6
2868d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // 29-32    Offset of string "my_app", 0
2878d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // 33-36    Second tag, TAG_APPLICATION_DATA
2888d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // 37-40    Length of string "foo", 3
2898d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // 41-44    Offset of string "foo", 6
2908d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden
2918d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // Check that stuff is where we think.
2928d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    EXPECT_EQ('m', buf[4]);
2938d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    EXPECT_EQ('f', buf[10]);
2948d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // Length of "my_app"
2958d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    EXPECT_EQ(6U, read_uint32(buf.get() + 25));
2968d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // Offset of "my_app"
2978d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    EXPECT_EQ(0U, read_uint32(buf.get() + 29));
2988d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // Length of "foo"
2998d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    EXPECT_EQ(3U, read_uint32(buf.get() + 37));
3008d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // Offset of "foo"
3018d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    EXPECT_EQ(6U, read_uint32(buf.get() + 41));
3025ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3035ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    // Check that deserialization works.
3045ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    AuthorizationSet deserialized1(buf.get(), size);
30558e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(AuthorizationSet::OK, deserialized1.is_valid());
3065ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3075ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    const uint8_t* p = buf.get();
30858e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_TRUE(deserialized1.Deserialize(&p, p + size));
30958e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(AuthorizationSet::OK, deserialized1.is_valid());
3105ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3115ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    //
3125ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    // Now mess them up in various ways:
3135ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    //
3145ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3158d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // Move "foo" offset so offset + length goes off the end
3168d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    add_to_uint32(buf.get() + 41, 1);
3178d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    AuthorizationSet deserialized2(buf.get(), size);
3188d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized2.is_valid());
3198d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    add_to_uint32(buf.get() + 41, -1);
3205ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3218d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // Shorten the "my_app" length to make a gap between the blobs.
3228d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    add_to_uint32(buf.get() + 25, -1);
3235ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    AuthorizationSet deserialized3(buf.get(), size);
3245ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized3.is_valid());
3258d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    add_to_uint32(buf.get() + 25, 1);
3265ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3278d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // Extend the "my_app" length to make them overlap, and decrease the "foo" length to keep the
3288d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // total length the same.  We don't detect this but should.
3298d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // TODO(swillden): Detect overlaps and holes that leave total size correct.
3308d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    add_to_uint32(buf.get() + 25, 1);
3318d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    add_to_uint32(buf.get() + 37, -1);
3325ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    AuthorizationSet deserialized4(buf.get(), size);
33358e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(AuthorizationSet::OK, deserialized4.is_valid());
3345ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
3355ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3365ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Growable, SuccessfulRoundTrip) {
3375ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    AuthorizationSet growable;
3385ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(growable.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)));
3395ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(1U, growable.size());
3405ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3415ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(growable.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)));
3425ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(2U, growable.size());
3435ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3445ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(growable.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)));
3455ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(3U, growable.size());
3465ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3475ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(growable.push_back(Authorization(TAG_APPLICATION_ID, "data", 4)));
3485ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(4U, growable.size());
3495ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
350834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden    EXPECT_TRUE(growable.push_back(Authorization(TAG_APPLICATION_DATA, "some more data", 14)));
351834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden    EXPECT_EQ(5U, growable.size());
352834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden
3535ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    size_t serialize_size = growable.SerializedSize();
3545ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    UniquePtr<uint8_t[]> serialized(new uint8_t[serialize_size]);
35558e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(serialized.get() + serialize_size,
35658e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden              growable.Serialize(serialized.get(), serialized.get() + serialize_size));
357834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden
358834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden    AuthorizationSet deserialized(serialized.get(), serialize_size);
359834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden    EXPECT_EQ(growable, deserialized);
3605ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
3615ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3625ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Growable, InsufficientElemBuf) {
3635ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    AuthorizationSet growable;
36458e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(AuthorizationSet::OK, growable.is_valid());
3655ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3665ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    // First insertion fits.
3675ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(growable.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)));
3685ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(1U, growable.size());
36958e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(AuthorizationSet::OK, growable.is_valid());
3705ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3715ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    // Second does too.
3725ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(growable.push_back(Authorization(TAG_RSA_PUBLIC_EXPONENT, 3)));
3735ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(2U, growable.size());
3745ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
3755ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3765ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Growable, InsufficientIndirectBuf) {
3775ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    AuthorizationSet growable;
37858e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(AuthorizationSet::OK, growable.is_valid());
3795ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3805ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(growable.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)));
3815ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(1U, growable.size());
38258e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(AuthorizationSet::OK, growable.is_valid());
3835ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3845ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(growable.push_back(Authorization(TAG_APPLICATION_ID, "1234567890", 10)));
3855ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(2U, growable.size());
38658e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(AuthorizationSet::OK, growable.is_valid());
3875ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3885ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(growable.push_back(Authorization(TAG_APPLICATION_DATA, "1", 1)));
3895ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(3U, growable.size());
39058e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(AuthorizationSet::OK, growable.is_valid());
3915ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3925ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    // Can still add another entry without indirect data.  Now it's full.
3935ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(growable.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)));
3945ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(4U, growable.size());
39558e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(AuthorizationSet::OK, growable.is_valid());
3965ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
3975ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
398370121346777e13437c275fbe7a975d899cc325cShawn WilldenTEST(Growable, PushBackSets) {
3992c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSetBuilder builder;
4002c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    builder.Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
4012c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden        .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
4022c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden        .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
4032c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden        .Authorization(TAG_USER_ID, 7)
404eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden        .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD)
4052c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden        .Authorization(TAG_APPLICATION_ID, "my_app", 6)
4062c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden        .Authorization(TAG_KEY_SIZE, 256)
4072c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden        .Authorization(TAG_AUTH_TIMEOUT, 300);
4082c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden
4092c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set1(builder.build());
4102c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set2(builder.build());
411370121346777e13437c275fbe7a975d899cc325cShawn Willden
412370121346777e13437c275fbe7a975d899cc325cShawn Willden    AuthorizationSet combined;
413370121346777e13437c275fbe7a975d899cc325cShawn Willden    EXPECT_TRUE(combined.push_back(set1));
414370121346777e13437c275fbe7a975d899cc325cShawn Willden    EXPECT_TRUE(combined.push_back(set2));
4152c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    EXPECT_EQ(set1.size() + set2.size(), combined.size());
416370121346777e13437c275fbe7a975d899cc325cShawn Willden    EXPECT_EQ(12U, combined.indirect_size());
417370121346777e13437c275fbe7a975d899cc325cShawn Willden}
418370121346777e13437c275fbe7a975d899cc325cShawn Willden
4195ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(GetValue, GetInt) {
4202c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
4212c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
4222c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
4232c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
4242c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_ID, 7)
425eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden                             .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD)
4262c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_ID, "my_app", 6)
4272c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_AUTH_TIMEOUT, 300));
4285ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
4295ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    uint32_t val;
4305ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(set.GetTagValue(TAG_USER_ID, &val));
4315ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(7U, val);
4325ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
4335ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    // Find one that isn't there
4345ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_FALSE(set.GetTagValue(TAG_KEY_SIZE, &val));
4355ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
4365ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
4375ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(GetValue, GetLong) {
4382c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set1(AuthorizationSetBuilder()
4392c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                              .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
4402c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                              .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
4412c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                              .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
4422c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                              .Authorization(TAG_RSA_PUBLIC_EXPONENT, 3));
4435ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
4442c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set2(AuthorizationSetBuilder()
4452c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                              .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
4462c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                              .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
4472c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                              .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA));
4485ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
4495ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    uint64_t val;
4505ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(set1.GetTagValue(TAG_RSA_PUBLIC_EXPONENT, &val));
4515ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(3U, val);
4525ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
4535ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    // Find one that isn't there
4545ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_FALSE(set2.GetTagValue(TAG_RSA_PUBLIC_EXPONENT, &val));
4555ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
4565ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
45782114e7cbf97f65348d32b2685dd52427525146dShawn WilldenTEST(GetValue, GetLongRep) {
45882114e7cbf97f65348d32b2685dd52427525146dShawn Willden    AuthorizationSet set1(AuthorizationSetBuilder()
45982114e7cbf97f65348d32b2685dd52427525146dShawn Willden                              .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
46082114e7cbf97f65348d32b2685dd52427525146dShawn Willden                              .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
46182114e7cbf97f65348d32b2685dd52427525146dShawn Willden                              .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
46282114e7cbf97f65348d32b2685dd52427525146dShawn Willden                              .Authorization(TAG_USER_SECURE_ID, 8338)
46382114e7cbf97f65348d32b2685dd52427525146dShawn Willden                              .Authorization(TAG_USER_SECURE_ID, 4334)
46482114e7cbf97f65348d32b2685dd52427525146dShawn Willden                              .Authorization(TAG_RSA_PUBLIC_EXPONENT, 3));
46582114e7cbf97f65348d32b2685dd52427525146dShawn Willden
46682114e7cbf97f65348d32b2685dd52427525146dShawn Willden    AuthorizationSet set2(AuthorizationSetBuilder()
46782114e7cbf97f65348d32b2685dd52427525146dShawn Willden                              .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
46882114e7cbf97f65348d32b2685dd52427525146dShawn Willden                              .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
46982114e7cbf97f65348d32b2685dd52427525146dShawn Willden                              .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA));
47082114e7cbf97f65348d32b2685dd52427525146dShawn Willden
47182114e7cbf97f65348d32b2685dd52427525146dShawn Willden    uint64_t val;
47282114e7cbf97f65348d32b2685dd52427525146dShawn Willden    EXPECT_TRUE(set1.GetTagValue(TAG_USER_SECURE_ID, 0, &val));
47382114e7cbf97f65348d32b2685dd52427525146dShawn Willden    EXPECT_EQ(8338U, val);
47482114e7cbf97f65348d32b2685dd52427525146dShawn Willden    EXPECT_TRUE(set1.GetTagValue(TAG_USER_SECURE_ID, 1, &val));
47582114e7cbf97f65348d32b2685dd52427525146dShawn Willden    EXPECT_EQ(4334U, val);
47682114e7cbf97f65348d32b2685dd52427525146dShawn Willden
47782114e7cbf97f65348d32b2685dd52427525146dShawn Willden    // Find one that isn't there
47882114e7cbf97f65348d32b2685dd52427525146dShawn Willden    EXPECT_FALSE(set2.GetTagValue(TAG_USER_SECURE_ID, &val));
47982114e7cbf97f65348d32b2685dd52427525146dShawn Willden}
48082114e7cbf97f65348d32b2685dd52427525146dShawn Willden
4815ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(GetValue, GetEnum) {
4822c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
4832c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
4842c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
4852c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
4862c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_ID, 7)
487eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden                             .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD)
4882c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_ID, "my_app", 6)
4892c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_AUTH_TIMEOUT, 300));
4905ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
4915ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    keymaster_algorithm_t val;
4925ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(set.GetTagValue(TAG_ALGORITHM, &val));
4935ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(KM_ALGORITHM_RSA, val);
4945ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
4955ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    // Find one that isn't there
4965ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    keymaster_padding_t val2;
4975ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_FALSE(set.GetTagValue(TAG_PADDING, &val2));
4985ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
4995ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
5005ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(GetValue, GetEnumRep) {
5012c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
5022c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
5032c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
5042c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
5052c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_ID, 7)
506eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden                             .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD)
5072c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_ID, "my_app", 6)
5082c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_AUTH_TIMEOUT, 300));
5095ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
5105ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    keymaster_purpose_t val;
5115ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(set.GetTagValue(TAG_PURPOSE, 0, &val));
5125ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(KM_PURPOSE_SIGN, val);
5135ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(set.GetTagValue(TAG_PURPOSE, 1, &val));
5145ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(KM_PURPOSE_VERIFY, val);
5155ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
5165ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    // Find one that isn't there
5175ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_FALSE(set.GetTagValue(TAG_PURPOSE, 2, &val));
5185ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
5195ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
5205ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(GetValue, GetDate) {
5212c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
5222c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ACTIVE_DATETIME, 10)
5232c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
5242c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
5252c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
5262c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_ID, 7)
527eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden                             .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD)
5282c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_ID, "my_app", 6)
5292c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_AUTH_TIMEOUT, 300));
5305ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
5315ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    uint64_t val;
5325ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(set.GetTagValue(TAG_ACTIVE_DATETIME, &val));
5335ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(10U, val);
5345ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
5355ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    // Find one that isn't there
5365ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_FALSE(set.GetTagValue(TAG_USAGE_EXPIRE_DATETIME, &val));
5375ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
5385ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
5395ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(GetValue, GetBlob) {
5402c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
5412c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
5422c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
5432c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
5442c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_ID, 7)
545eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden                             .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD)
5462c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_ID, "my_app", 6)
5472c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_AUTH_TIMEOUT, 300));
5485ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
5495ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    keymaster_blob_t val;
5505ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(set.GetTagValue(TAG_APPLICATION_ID, &val));
5515ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(6U, val.data_length);
5525ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(0, memcmp(val.data, "my_app", 6));
5535ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
5545ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    // Find one that isn't there
5555ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_FALSE(set.GetTagValue(TAG_APPLICATION_DATA, &val));
5565ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
5575ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
5582c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn WilldenTEST(Deduplication, NoDuplicates) {
5592c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
5602c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ACTIVE_DATETIME, 10)
5612c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
5622c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_ID, 7)
563eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden                             .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD));
5642c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet copy(set);
5652c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden
5662c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    EXPECT_EQ(copy, set);
5672c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    set.Deduplicate();
5682c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    EXPECT_EQ(copy.size(), set.size());
5692c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden
5702c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    // Sets no longer compare equal, because of ordering (ugh, maybe it should be
5712c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    // AuthorizationList, not AuthorizationSet).
5722c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    EXPECT_NE(copy, set);
5732c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden}
5742c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden
5752c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn WilldenTEST(Deduplication, NoDuplicatesHasInvalid) {
5762c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
5772c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ACTIVE_DATETIME, 10)
5782c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_INVALID)
5792c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
5802c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_ID, 7)
581eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden                             .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD));
5822c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet copy(set);
5832c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden
5842c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    EXPECT_EQ(copy, set);
5852c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    set.Deduplicate();
5862c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden
5872c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    // Deduplicate should have removed the invalid.
5882c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    EXPECT_EQ(copy.size() - 1, set.size());
5892c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    EXPECT_NE(copy, set);
5902c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden}
5912c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden
5922c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn WilldenTEST(Deduplication, DuplicateEnum) {
5932c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
5942c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
5952c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ACTIVE_DATETIME, 10)
5962c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
5972c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_ID, 7)
5982c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
599eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden                             .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD));
6002c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet copy(set);
6012c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden
6022c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    EXPECT_EQ(copy, set);
6032c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    set.Deduplicate();
6042c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    EXPECT_EQ(copy.size() - 2, set.size());
6052c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    EXPECT_NE(copy, set);
6062c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden}
6072c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden
6082c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn WilldenTEST(Deduplication, DuplicateBlob) {
6092c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
6102c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
6112c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ACTIVE_DATETIME, 10)
6122c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_DATA, "data", 4)
6132c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
6142c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_ID, 7)
6152c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
6162c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_DATA, "data", 4)
6172c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_DATA, "foo", 3)
618eb63b9799eadcaa6ef206f8b804d7432e0dab14aShawn Willden                             .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD));
6192c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet copy(set);
6202c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden
6212c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    EXPECT_EQ(copy, set);
6222c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    set.Deduplicate();
6232c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    EXPECT_EQ(copy.size() - 3, set.size());
6242c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    EXPECT_NE(copy, set);
6252c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden
6262c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    // The real test here is that valgrind reports no leak.
6272c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden}
6282c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden
629391a367df2352bed7e70885493421892a1cdaffcTucker SylvestroTEST(Union, Disjoint) {
630391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro    AuthorizationSet set1(AuthorizationSetBuilder()
631391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
632391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_ACTIVE_DATETIME, 10)
633391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_APPLICATION_DATA, "data", 4));
634391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro
635391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro    AuthorizationSet set2(AuthorizationSetBuilder()
636391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_USER_ID, 7)
637391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_APPLICATION_DATA, "foo", 3)
638391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD));
639391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro
640391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro    AuthorizationSet expected(AuthorizationSetBuilder()
641391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD)
642391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
643391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_USER_ID, 7)
644391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_ACTIVE_DATETIME, 10)
645391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_APPLICATION_DATA, "data", 4)
646391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_APPLICATION_DATA, "foo", 3));
647391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro
648391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro    set1.Union(set2);
649391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro    EXPECT_EQ(expected, set1);
650391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro}
651391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro
652391a367df2352bed7e70885493421892a1cdaffcTucker SylvestroTEST(Union, Overlap) {
653391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro    AuthorizationSet set1(AuthorizationSetBuilder()
654391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
655391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_ACTIVE_DATETIME, 10)
656391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_APPLICATION_DATA, "data", 4));
657391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro
658391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro    AuthorizationSet set2(AuthorizationSetBuilder()
659391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
660391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_ACTIVE_DATETIME, 10)
661391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_APPLICATION_DATA, "data", 4));
662391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro
663391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro    AuthorizationSet expected(AuthorizationSetBuilder()
664391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
665391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_ACTIVE_DATETIME, 10)
666391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_APPLICATION_DATA, "data", 4));
667391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro
668391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro    set1.Union(set2);
669391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro    EXPECT_EQ(expected, set1);
670391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro}
671391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro
672391a367df2352bed7e70885493421892a1cdaffcTucker SylvestroTEST(Union, Empty) {
673391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro    AuthorizationSet set1(AuthorizationSetBuilder()
674391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
675391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_ACTIVE_DATETIME, 10)
676391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_APPLICATION_DATA, "data", 4));
677391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro
678391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro    AuthorizationSet set2;
679391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro
680391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro    AuthorizationSet expected(AuthorizationSetBuilder()
681391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
682391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_ACTIVE_DATETIME, 10)
683391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_APPLICATION_DATA, "data", 4));
684391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro
685391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro    set1.Union(set2);
686391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro    EXPECT_EQ(expected, set1);
687391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro}
688391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro
689391a367df2352bed7e70885493421892a1cdaffcTucker SylvestroTEST(Difference, Disjoint) {
690391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro    AuthorizationSet set1(AuthorizationSetBuilder()
691391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_APPLICATION_DATA, "data", 4)
692391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
693391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_ACTIVE_DATETIME, 10));
694391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro
695391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro    AuthorizationSet set2(AuthorizationSetBuilder()
696391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_USER_ID, 7)
697391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_APPLICATION_DATA, "foo", 3)
698391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD));
699391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro
700391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro    // Elements are the same as set1, but happen to be in a different order
701391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro    AuthorizationSet expected(AuthorizationSetBuilder()
702391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
703391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_ACTIVE_DATETIME, 10)
704391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_APPLICATION_DATA, "data", 4));
705391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro
706391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro    set1.Difference(set2);
707391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro    EXPECT_EQ(expected, set1);
708391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro}
709391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro
710391a367df2352bed7e70885493421892a1cdaffcTucker SylvestroTEST(Difference, Overlap) {
711391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro    AuthorizationSet set1(AuthorizationSetBuilder()
712391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
713391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_ACTIVE_DATETIME, 10)
714391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_APPLICATION_DATA, "data", 4));
715391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro
716391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro    AuthorizationSet set2(AuthorizationSetBuilder()
717391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
718391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_ACTIVE_DATETIME, 10)
719391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_APPLICATION_DATA, "data", 4));
720391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro
721391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro    AuthorizationSet empty;
722391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro    set1.Difference(set2);
723391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro    EXPECT_EQ(empty, set1);
724391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro    EXPECT_EQ(0U, set1.size());
725391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro}
726391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro
727391a367df2352bed7e70885493421892a1cdaffcTucker SylvestroTEST(Difference, NullSet) {
728391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro    AuthorizationSet set1(AuthorizationSetBuilder()
729391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
730391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_ACTIVE_DATETIME, 10)
731391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_APPLICATION_DATA, "data", 4));
732391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro
733391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro    AuthorizationSet set2;
734391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro
735391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro    AuthorizationSet expected(AuthorizationSetBuilder()
736391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
737391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_ACTIVE_DATETIME, 10)
738391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro                             .Authorization(TAG_APPLICATION_DATA, "data", 4));
739391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro
740391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro    set1.Difference(set2);
741391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro    EXPECT_EQ(expected, set1);
742391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro}
743391a367df2352bed7e70885493421892a1cdaffcTucker Sylvestro
7445ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}  // namespace test
7455ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}  // namespace keymaster
746