authorization_set_test.cpp revision 2c242009007a38b5c8003137fb8ba5a1fdb73b70
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>
2098d9b92547a9a7553b99e3e941a4175926f95b62Shawn Willden#include <keymaster/google_keymaster_utils.h>
2198d9b92547a9a7553b99e3e941a4175926f95b62Shawn Willden
227636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden#include "google_keymaster_test_utils.h"
235ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
245ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdenint main(int argc, char** argv) {
255ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    ::testing::InitGoogleTest(&argc, argv);
265ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    int result = RUN_ALL_TESTS();
275ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    return result;
285ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
295ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
305ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdennamespace keymaster {
31834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden
325ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdennamespace test {
335ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
345ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Construction, ListProvided) {
355ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    keymaster_key_param_t params[] = {
362c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden        Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
372c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden        Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), Authorization(TAG_USER_ID, 7),
382c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden        Authorization(TAG_USER_AUTH_ID, 8), Authorization(TAG_APPLICATION_ID, "my_app", 6),
392c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden        Authorization(TAG_KEY_SIZE, 256), Authorization(TAG_AUTH_TIMEOUT, 300),
405ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    };
415ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    AuthorizationSet set(params, array_length(params));
425ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(8U, set.size());
435ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
445ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
45834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn WilldenTEST(Construction, Copy) {
46834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden    keymaster_key_param_t params[] = {
472c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden        Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY),
482c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden        Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), Authorization(TAG_USER_ID, 7),
492c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden        Authorization(TAG_USER_AUTH_ID, 8), Authorization(TAG_APPLICATION_ID, "my_app", 6),
502c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden        Authorization(TAG_KEY_SIZE, 256), Authorization(TAG_AUTH_TIMEOUT, 300),
51834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden    };
52834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden    AuthorizationSet set(params, array_length(params));
53834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden    AuthorizationSet set2(set);
547636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    EXPECT_EQ(set, set2);
55834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden}
56834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden
575ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Lookup, NonRepeated) {
582c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
592c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
602c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
612c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
622c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_ID, 7)
632c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_AUTH_ID, 8)
642c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_ID, "my_app", 6)
652c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_KEY_SIZE, 256)
662c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_AUTH_TIMEOUT, 300));
672c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden
685ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(8U, set.size());
695ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
705ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    int pos = set.find(TAG_ALGORITHM);
715ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    ASSERT_NE(-1, pos);
725ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(KM_TAG_ALGORITHM, set[pos].tag);
735ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(KM_ALGORITHM_RSA, set[pos].enumerated);
745ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
755ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    pos = set.find(TAG_MAC_LENGTH);
765ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(-1, pos);
775ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
785ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    uint32_t int_val = 0;
795ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(set.GetTagValue(TAG_USER_ID, &int_val));
805ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(7U, int_val);
815ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
825ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    keymaster_blob_t blob_val;
835ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(set.GetTagValue(TAG_APPLICATION_ID, &blob_val));
845ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(6U, blob_val.data_length);
855ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(0, memcmp(blob_val.data, "my_app", 6));
865ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
875ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
885ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Lookup, Repeated) {
892c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
902c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
912c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
922c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
932c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_ID, 7)
942c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_AUTH_ID, 8)
952c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_ID, "my_app", 6)
962c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_KEY_SIZE, 256)
972c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_AUTH_TIMEOUT, 300));
985ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(8U, set.size());
995ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
1005ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    int pos = set.find(TAG_PURPOSE);
1015ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    ASSERT_FALSE(pos == -1);
1025ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(KM_TAG_PURPOSE, set[pos].tag);
1035ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(KM_PURPOSE_SIGN, set[pos].enumerated);
1045ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
1055ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    pos = set.find(TAG_PURPOSE, pos);
1065ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(KM_TAG_PURPOSE, set[pos].tag);
1075ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(KM_PURPOSE_VERIFY, set[pos].enumerated);
1085ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
1095ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(-1, set.find(TAG_PURPOSE, pos));
1105ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
1115ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
1125ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Lookup, Indexed) {
1132c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
1142c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
1152c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
1162c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
1172c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_ID, 7)
1182c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_AUTH_ID, 8)
1192c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_ID, "my_app", 6)
1202c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_KEY_SIZE, 256)
1212c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_AUTH_TIMEOUT, 300));
1225ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(8U, set.size());
1235ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
1245ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(KM_TAG_PURPOSE, set[0].tag);
1255ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(KM_PURPOSE_SIGN, set[0].enumerated);
1265ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
1275ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    // Lookup beyond end doesn't work, just returns zeros, but doens't blow up either (verify by
1285ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    // running under valgrind).
1295ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(KM_TAG_INVALID, set[10].tag);
1305ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
1315ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
1325ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Serialization, RoundTrip) {
1332c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
1342c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
1352c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
1362c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
1372c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_ID, 7)
1382c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_AUTH_ID, 8)
1392c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_ID, "my_app", 6)
1402c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_KEY_SIZE, 256)
1412c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_AUTH_TIMEOUT, 300)
1422c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ALL_USERS)
1432c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_RSA_PUBLIC_EXPONENT, 3)
1442c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ACTIVE_DATETIME, 10));
1455ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
1465ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    size_t size = set.SerializedSize();
1475ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(size > 0);
1485ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
1495ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    UniquePtr<uint8_t[]> buf(new uint8_t[size]);
15058e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(buf.get() + size, set.Serialize(buf.get(), buf.get() + size));
1515ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    AuthorizationSet deserialized(buf.get(), size);
1525ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
15358e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(AuthorizationSet::OK, deserialized.is_valid());
1547636471bd1c553ac179f0dddc17133491d0e1fafShawn Willden    EXPECT_EQ(set, deserialized);
1555ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
1565ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    int pos = deserialized.find(TAG_APPLICATION_ID);
1575ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    ASSERT_NE(-1, pos);
1585ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(KM_TAG_APPLICATION_ID, deserialized[pos].tag);
1595ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(6U, deserialized[pos].blob.data_length);
1605ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(0, memcmp(deserialized[pos].blob.data, "my_app", 6));
1615ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
1625ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
16358e1a5486219a1be9264d4e863a9dd3e393906c3Shawn WilldenTEST(Deserialization, Deserialize) {
1642c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
1652c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
1662c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
1672c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
1682c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_ID, 7)
1692c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_AUTH_ID, 8)
1702c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_ID, "my_app", 6)
1712c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_KEY_SIZE, 256)
1722c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_AUTH_TIMEOUT, 300));
1735ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
1745ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    size_t size = set.SerializedSize();
1755ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(size > 0);
1765ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
1775ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    UniquePtr<uint8_t[]> buf(new uint8_t[size]);
17858e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(buf.get() + size, set.Serialize(buf.get(), buf.get() + size));
1795ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    AuthorizationSet deserialized;
1805ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    const uint8_t* p = buf.get();
18158e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_TRUE(deserialized.Deserialize(&p, p + size));
1825ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(p, buf.get() + size);
1835ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
18458e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(AuthorizationSet::OK, deserialized.is_valid());
1855ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
1865ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(set.size(), deserialized.size());
1875ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    for (size_t i = 0; i < set.size(); ++i) {
1885ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden        EXPECT_EQ(set[i].tag, deserialized[i].tag);
1895ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    }
1905ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
1915ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    int pos = deserialized.find(TAG_APPLICATION_ID);
1925ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    ASSERT_NE(-1, pos);
1935ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(KM_TAG_APPLICATION_ID, deserialized[pos].tag);
1945ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(6U, deserialized[pos].blob.data_length);
1955ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(0, memcmp(deserialized[pos].blob.data, "my_app", 6));
1965ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
1975ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
1985ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Deserialization, TooShortBuffer) {
1995ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    uint8_t buf[] = {0, 0, 0};
2005ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    AuthorizationSet deserialized(buf, array_length(buf));
2015ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized.is_valid());
2025ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
2035ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    const uint8_t* p = buf;
20458e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_FALSE(deserialized.Deserialize(&p, p + array_length(buf)));
2055ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized.is_valid());
2065ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
2075ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
2085ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Deserialization, InvalidLengthField) {
2092c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
2102c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
2112c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
2122c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
2132c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_ID, 7)
2142c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_AUTH_ID, 8)
2152c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_ID, "my_app", 6)
2162c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_KEY_SIZE, 256)
2172c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_AUTH_TIMEOUT, 300));
2185ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
2195ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    size_t size = set.SerializedSize();
2205ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(size > 0);
2215ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
2225ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    UniquePtr<uint8_t[]> buf(new uint8_t[size]);
22358e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(buf.get() + size, set.Serialize(buf.get(), buf.get() + size));
2245ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    *reinterpret_cast<uint32_t*>(buf.get()) = 9;
2255ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
2265ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    AuthorizationSet deserialized(buf.get(), size);
2275ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized.is_valid());
2285ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
2295ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    const uint8_t* p = buf.get();
23058e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_FALSE(deserialized.Deserialize(&p, p + size));
2315ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized.is_valid());
2325ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
2335ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
2348d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willdenstatic uint32_t read_uint32(const uint8_t* buf) {
2358d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    uint32_t val;
2368d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    memcpy(&val, buf, sizeof(val));
2378d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    return val;
2388d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden}
2398d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden
2408d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willdenstatic void add_to_uint32(uint8_t* buf, int delta) {
2418d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    uint32_t val;
2428d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    memcpy(&val, buf, sizeof(val));
2438d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    val += delta;
2448d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    memcpy(buf, &val, sizeof(val));
2458d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden}
2468d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden
2475ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Deserialization, MalformedIndirectData) {
2482c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
2492c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_ID, "my_app", 6)
2502c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_DATA, "foo", 3));
2515ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    size_t size = set.SerializedSize();
2525ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
2535ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    UniquePtr<uint8_t[]> buf(new uint8_t[size]);
25458e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(buf.get() + size, set.Serialize(buf.get(), buf.get() + size));
2555ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
2568d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // This sucks.  This test, as written, requires intimate knowledge of the serialized layout of
2578d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // this particular set, which means it's brittle.  But it's important to test that we handle
2588d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // broken serialized data and I can't think of a better way to write this.
2598d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    //
2608d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // The contents of buf are:
2618d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    //
2628d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // Bytes:   Content:
2638d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // 0-3      Length of string data, which is 9.
2648d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // 4-9      "my_app"
2658d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // 10-12    "foo"
2668d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // 13-16    Number of elements, which is 2.
2678d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // 17-20    Length of elements, which is 24.
2688d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // 21-24    First tag, TAG_APPLICATION_ID
2698d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // 25-28    Length of string "my_app", 6
2708d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // 29-32    Offset of string "my_app", 0
2718d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // 33-36    Second tag, TAG_APPLICATION_DATA
2728d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // 37-40    Length of string "foo", 3
2738d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // 41-44    Offset of string "foo", 6
2748d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden
2758d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // Check that stuff is where we think.
2768d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    EXPECT_EQ('m', buf[4]);
2778d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    EXPECT_EQ('f', buf[10]);
2788d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // Length of "my_app"
2798d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    EXPECT_EQ(6U, read_uint32(buf.get() + 25));
2808d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // Offset of "my_app"
2818d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    EXPECT_EQ(0U, read_uint32(buf.get() + 29));
2828d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // Length of "foo"
2838d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    EXPECT_EQ(3U, read_uint32(buf.get() + 37));
2848d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // Offset of "foo"
2858d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    EXPECT_EQ(6U, read_uint32(buf.get() + 41));
2865ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
2875ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    // Check that deserialization works.
2885ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    AuthorizationSet deserialized1(buf.get(), size);
28958e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(AuthorizationSet::OK, deserialized1.is_valid());
2905ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
2915ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    const uint8_t* p = buf.get();
29258e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_TRUE(deserialized1.Deserialize(&p, p + size));
29358e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(AuthorizationSet::OK, deserialized1.is_valid());
2945ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
2955ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    //
2965ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    // Now mess them up in various ways:
2975ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    //
2985ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
2998d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // Move "foo" offset so offset + length goes off the end
3008d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    add_to_uint32(buf.get() + 41, 1);
3018d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    AuthorizationSet deserialized2(buf.get(), size);
3028d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized2.is_valid());
3038d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    add_to_uint32(buf.get() + 41, -1);
3045ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3058d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // Shorten the "my_app" length to make a gap between the blobs.
3068d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    add_to_uint32(buf.get() + 25, -1);
3075ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    AuthorizationSet deserialized3(buf.get(), size);
3085ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized3.is_valid());
3098d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    add_to_uint32(buf.get() + 25, 1);
3105ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3118d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // Extend the "my_app" length to make them overlap, and decrease the "foo" length to keep the
3128d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // total length the same.  We don't detect this but should.
3138d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    // TODO(swillden): Detect overlaps and holes that leave total size correct.
3148d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    add_to_uint32(buf.get() + 25, 1);
3158d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden    add_to_uint32(buf.get() + 37, -1);
3165ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    AuthorizationSet deserialized4(buf.get(), size);
31758e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(AuthorizationSet::OK, deserialized4.is_valid());
3185ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
3195ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3205ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Growable, SuccessfulRoundTrip) {
3215ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    keymaster_key_param_t elems_buf[20];
3225ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    uint8_t data_buf[200];
3235ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3245ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    AuthorizationSet growable;
3255ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(growable.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)));
3265ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(1U, growable.size());
3275ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3285ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(growable.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)));
3295ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(2U, growable.size());
3305ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3315ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(growable.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)));
3325ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(3U, growable.size());
3335ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3345ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(growable.push_back(Authorization(TAG_APPLICATION_ID, "data", 4)));
3355ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(4U, growable.size());
3365ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
337834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden    EXPECT_TRUE(growable.push_back(Authorization(TAG_APPLICATION_DATA, "some more data", 14)));
338834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden    EXPECT_EQ(5U, growable.size());
339834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden
3405ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    size_t serialize_size = growable.SerializedSize();
3415ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    UniquePtr<uint8_t[]> serialized(new uint8_t[serialize_size]);
34258e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(serialized.get() + serialize_size,
34358e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden              growable.Serialize(serialized.get(), serialized.get() + serialize_size));
344834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden
345834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden    AuthorizationSet deserialized(serialized.get(), serialize_size);
346834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden    EXPECT_EQ(growable, deserialized);
3475ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
3485ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3495ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Growable, InsufficientElemBuf) {
3505ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    keymaster_key_param_t elems_buf[1];
3515ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    uint8_t data_buf[200];
3525ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3535ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    AuthorizationSet growable;
35458e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(AuthorizationSet::OK, growable.is_valid());
3555ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3565ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    // First insertion fits.
3575ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(growable.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)));
3585ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(1U, growable.size());
35958e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(AuthorizationSet::OK, growable.is_valid());
3605ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3615ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    // Second does too.
3625ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(growable.push_back(Authorization(TAG_RSA_PUBLIC_EXPONENT, 3)));
3635ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(2U, growable.size());
3645ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
3655ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3665ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Growable, InsufficientIndirectBuf) {
3675ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    keymaster_key_param_t elems_buf[3];
3685ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    uint8_t data_buf[10];
3695ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3705ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    AuthorizationSet growable;
37158e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(AuthorizationSet::OK, growable.is_valid());
3725ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3735ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(growable.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)));
3745ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(1U, growable.size());
37558e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(AuthorizationSet::OK, growable.is_valid());
3765ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3775ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(growable.push_back(Authorization(TAG_APPLICATION_ID, "1234567890", 10)));
3785ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(2U, growable.size());
37958e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(AuthorizationSet::OK, growable.is_valid());
3805ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3815ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(growable.push_back(Authorization(TAG_APPLICATION_DATA, "1", 1)));
3825ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(3U, growable.size());
38358e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(AuthorizationSet::OK, growable.is_valid());
3845ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
3855ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    // Can still add another entry without indirect data.  Now it's full.
3865ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(growable.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)));
3875ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(4U, growable.size());
38858e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden    EXPECT_EQ(AuthorizationSet::OK, growable.is_valid());
3895ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
3905ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
391370121346777e13437c275fbe7a975d899cc325cShawn WilldenTEST(Growable, PushBackSets) {
3922c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSetBuilder builder;
3932c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    builder.Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
3942c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden        .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
3952c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden        .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
3962c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden        .Authorization(TAG_USER_ID, 7)
3972c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden        .Authorization(TAG_USER_AUTH_ID, 8)
3982c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden        .Authorization(TAG_APPLICATION_ID, "my_app", 6)
3992c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden        .Authorization(TAG_KEY_SIZE, 256)
4002c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden        .Authorization(TAG_AUTH_TIMEOUT, 300);
4012c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden
4022c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set1(builder.build());
4032c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set2(builder.build());
404370121346777e13437c275fbe7a975d899cc325cShawn Willden
405370121346777e13437c275fbe7a975d899cc325cShawn Willden    AuthorizationSet combined;
406370121346777e13437c275fbe7a975d899cc325cShawn Willden    EXPECT_TRUE(combined.push_back(set1));
407370121346777e13437c275fbe7a975d899cc325cShawn Willden    EXPECT_TRUE(combined.push_back(set2));
4082c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    EXPECT_EQ(set1.size() + set2.size(), combined.size());
409370121346777e13437c275fbe7a975d899cc325cShawn Willden    EXPECT_EQ(12U, combined.indirect_size());
410370121346777e13437c275fbe7a975d899cc325cShawn Willden}
411370121346777e13437c275fbe7a975d899cc325cShawn Willden
4125ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(GetValue, GetInt) {
4132c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
4142c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
4152c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
4162c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
4172c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_ID, 7)
4182c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_AUTH_ID, 8)
4192c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_ID, "my_app", 6)
4202c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_AUTH_TIMEOUT, 300));
4215ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
4225ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    uint32_t val;
4235ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(set.GetTagValue(TAG_USER_ID, &val));
4245ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(7U, val);
4255ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
4265ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    // Find one that isn't there
4275ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_FALSE(set.GetTagValue(TAG_KEY_SIZE, &val));
4285ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
4295ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
4305ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(GetValue, GetIntRep) {
4312c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
4322c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
4332c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
4342c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
4352c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_ID, 7)
4362c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_AUTH_ID, 8)
4372c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_ID, "my_app", 6)
4382c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_KEY_SIZE, 256)
4392c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_AUTH_TIMEOUT, 300));
4405ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
4415ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    uint32_t val;
4425ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(set.GetTagValue(TAG_USER_AUTH_ID, 0, &val));
4435ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(8U, val);
4445ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
4455ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    // Find one that isn't there
4465ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_FALSE(set.GetTagValue(TAG_USER_AUTH_ID, 1, &val));
4475ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
4485ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
4495ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(GetValue, GetLong) {
4502c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set1(AuthorizationSetBuilder()
4512c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                              .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
4522c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                              .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
4532c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                              .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
4542c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                              .Authorization(TAG_RSA_PUBLIC_EXPONENT, 3));
4555ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
4562c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set2(AuthorizationSetBuilder()
4572c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                              .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
4582c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                              .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
4592c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                              .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA));
4605ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
4615ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    uint64_t val;
4625ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(set1.GetTagValue(TAG_RSA_PUBLIC_EXPONENT, &val));
4635ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(3U, val);
4645ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
4655ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    // Find one that isn't there
4665ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_FALSE(set2.GetTagValue(TAG_RSA_PUBLIC_EXPONENT, &val));
4675ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
4685ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
4695ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(GetValue, GetEnum) {
4702c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
4712c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
4722c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
4732c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
4742c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_ID, 7)
4752c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_AUTH_ID, 8)
4762c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_ID, "my_app", 6)
4772c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_AUTH_TIMEOUT, 300));
4785ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
4795ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    keymaster_algorithm_t val;
4805ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(set.GetTagValue(TAG_ALGORITHM, &val));
4815ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(KM_ALGORITHM_RSA, val);
4825ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
4835ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    // Find one that isn't there
4845ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    keymaster_padding_t val2;
4855ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_FALSE(set.GetTagValue(TAG_PADDING, &val2));
4865ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
4875ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
4885ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(GetValue, GetEnumRep) {
4892c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
4902c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
4912c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
4922c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
4932c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_ID, 7)
4942c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_AUTH_ID, 8)
4952c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_ID, "my_app", 6)
4962c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_AUTH_TIMEOUT, 300));
4975ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
4985ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    keymaster_purpose_t val;
4995ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(set.GetTagValue(TAG_PURPOSE, 0, &val));
5005ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(KM_PURPOSE_SIGN, val);
5015ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(set.GetTagValue(TAG_PURPOSE, 1, &val));
5025ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(KM_PURPOSE_VERIFY, val);
5035ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
5045ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    // Find one that isn't there
5055ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_FALSE(set.GetTagValue(TAG_PURPOSE, 2, &val));
5065ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
5075ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
5085ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(GetValue, GetDate) {
5092c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
5102c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ACTIVE_DATETIME, 10)
5112c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
5122c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
5132c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
5142c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_ID, 7)
5152c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_AUTH_ID, 8)
5162c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_ID, "my_app", 6)
5172c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_AUTH_TIMEOUT, 300));
5185ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
5195ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    uint64_t val;
5205ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(set.GetTagValue(TAG_ACTIVE_DATETIME, &val));
5215ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(10U, val);
5225ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
5235ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    // Find one that isn't there
5245ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_FALSE(set.GetTagValue(TAG_USAGE_EXPIRE_DATETIME, &val));
5255ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
5265ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
5275ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(GetValue, GetBlob) {
5282c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
5292c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN)
5302c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
5312c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA)
5322c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_ID, 7)
5332c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_AUTH_ID, 8)
5342c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_ID, "my_app", 6)
5352c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_AUTH_TIMEOUT, 300));
5365ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
5375ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    keymaster_blob_t val;
5385ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_TRUE(set.GetTagValue(TAG_APPLICATION_ID, &val));
5395ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(6U, val.data_length);
5405ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_EQ(0, memcmp(val.data, "my_app", 6));
5415ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
5425ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    // Find one that isn't there
5435ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden    EXPECT_FALSE(set.GetTagValue(TAG_APPLICATION_DATA, &val));
5445ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}
5455ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden
5462c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn WilldenTEST(Deduplication, NoDuplicates) {
5472c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
5482c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ACTIVE_DATETIME, 10)
5492c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
5502c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_ID, 7)
5512c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_AUTH_ID, 8));
5522c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet copy(set);
5532c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden
5542c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    EXPECT_EQ(copy, set);
5552c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    set.Deduplicate();
5562c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    EXPECT_EQ(copy.size(), set.size());
5572c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden
5582c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    // Sets no longer compare equal, because of ordering (ugh, maybe it should be
5592c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    // AuthorizationList, not AuthorizationSet).
5602c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    EXPECT_NE(copy, set);
5612c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden}
5622c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden
5632c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn WilldenTEST(Deduplication, NoDuplicatesHasInvalid) {
5642c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
5652c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ACTIVE_DATETIME, 10)
5662c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_INVALID)
5672c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
5682c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_ID, 7)
5692c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_AUTH_ID, 8));
5702c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet copy(set);
5712c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden
5722c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    EXPECT_EQ(copy, set);
5732c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    set.Deduplicate();
5742c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden
5752c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    // Deduplicate should have removed the invalid.
5762c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    EXPECT_EQ(copy.size() - 1, set.size());
5772c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    EXPECT_NE(copy, set);
5782c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden}
5792c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden
5802c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn WilldenTEST(Deduplication, DuplicateEnum) {
5812c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
5822c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
5832c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ACTIVE_DATETIME, 10)
5842c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
5852c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_ID, 7)
5862c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
5872c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_AUTH_ID, 8));
5882c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet copy(set);
5892c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden
5902c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    EXPECT_EQ(copy, set);
5912c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    set.Deduplicate();
5922c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    EXPECT_EQ(copy.size() - 2, set.size());
5932c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    EXPECT_NE(copy, set);
5942c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden}
5952c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden
5962c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn WilldenTEST(Deduplication, DuplicateBlob) {
5972c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet set(AuthorizationSetBuilder()
5982c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
5992c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_ACTIVE_DATETIME, 10)
6002c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_DATA, "data", 4)
6012c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
6022c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_ID, 7)
6032c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY)
6042c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_DATA, "data", 4)
6052c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_APPLICATION_DATA, "foo", 3)
6062c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden                             .Authorization(TAG_USER_AUTH_ID, 8));
6072c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    AuthorizationSet copy(set);
6082c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden
6092c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    EXPECT_EQ(copy, set);
6102c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    set.Deduplicate();
6112c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    EXPECT_EQ(copy.size() - 3, set.size());
6122c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    EXPECT_NE(copy, set);
6132c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden
6142c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden    // The real test here is that valgrind reports no leak.
6152c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden}
6162c242009007a38b5c8003137fb8ba5a1fdb73b70Shawn Willden
6175ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}  // namespace test
6185ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden}  // namespace keymaster
619