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