authorization_set_test.cpp revision 834e80747cbb960f8a4028c5c8604bf5218ecdb9
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 19834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden#define KEYMASTER_NAME_TAGS 20834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden 215ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden#include "authorization_set.h" 225ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden#include "google_keymaster_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 30834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willdenstatic bool operator==(const keymaster_key_param_t& a, const keymaster_key_param_t& b) { 31834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden if (a.tag != b.tag) { 32834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden return false; 33834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden } 34834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden 35834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden switch (keymaster_tag_get_type(a.tag)) { 36834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden default: 37834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden return false; 38834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden case KM_INVALID: 39834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden return true; 40834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden case KM_INT_REP: 41834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden case KM_INT: 42834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden return a.integer == b.integer; 43834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden case KM_ENUM_REP: 44834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden case KM_ENUM: 45834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden return a.enumerated == b.enumerated; 46834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden case KM_LONG: 47834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden return a.long_integer == b.long_integer; 48834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden case KM_DATE: 49834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden return a.date_time == b.date_time; 50834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden case KM_BOOL: 51834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden return a.boolean == b.boolean; 52834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden case KM_BIGNUM: 53834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden case KM_BYTES: 54834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden if ((a.blob.data == NULL || b.blob.data == NULL) && a.blob.data != b.blob.data) 55834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden return false; 56834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden return a.blob.data_length == b.blob.data_length && 57834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden (memcmp(a.blob.data, b.blob.data, a.blob.data_length) == 0); 58834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden } 59834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden} 60834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden 61834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willdenstatic std::ostream& operator<<(std::ostream& os, const keymaster_key_param_t& param) { 62834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden os << "Tag: " << keymaster_tag_mask_type(param.tag); 63834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden switch (keymaster_tag_get_type(param.tag)) { 64834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden case KM_INVALID: 65834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden os << " Invalid"; 66834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden break; 67834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden case KM_INT_REP: 68834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden os << " (Rep) "; 69834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden /* Falls through */ 70834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden case KM_INT: 71834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden os << " Int: " << param.integer; 72834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden break; 73834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden case KM_ENUM_REP: 74834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden os << " (Rep) "; 75834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden /* Falls through */ 76834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden case KM_ENUM: 77834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden os << " Enum: " << param.enumerated; 78834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden break; 79834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden case KM_LONG: 80834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden os << " Long: " << param.long_integer; 81834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden break; 82834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden case KM_DATE: 83834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden os << " Date: " << param.date_time; 84834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden break; 85834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden case KM_BOOL: 86834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden os << " Bool: " << param.boolean; 87834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden break; 88834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden case KM_BIGNUM: 89834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden os << " Bignum: "; 90834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden break; 91834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden case KM_BYTES: 92834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden os << " Bytes: "; 93834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden break; 94834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden } 95834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden os << std::endl; 96834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden return os; 97834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden} 98834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden 995ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdennamespace keymaster { 100834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden 101834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willdenstatic bool operator==(const AuthorizationSet& a, const AuthorizationSet& b) { 102834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden if (a.size() != b.size()) 103834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden return false; 104834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden 105834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden for (size_t i = 0; i < a.size(); ++i) 106834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden if (!(a[i] == b[i])) 107834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden return false; 108834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden return true; 109834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden} 110834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden 1115ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdennamespace test { 1125ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1135ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Construction, ListProvided) { 1145ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t params[] = { 1155ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 1165ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 1175ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 1185ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_ID, 7), 1195ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_AUTH_ID, 8), 1205ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_APPLICATION_ID, "my_app", 6), 1215ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_KEY_SIZE, 256), 1225ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_AUTH_TIMEOUT, 300), 1235ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 1245ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet set(params, array_length(params)); 1255ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(8U, set.size()); 1265ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 1275ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 128834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn WilldenTEST(Construction, Copy) { 129834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden keymaster_key_param_t params[] = { 130834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 131834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 132834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 133834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden Authorization(TAG_USER_ID, 7), 134834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden Authorization(TAG_USER_AUTH_ID, 8), 135834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden Authorization(TAG_APPLICATION_ID, "my_app", 6), 136834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden Authorization(TAG_KEY_SIZE, 256), 137834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden Authorization(TAG_AUTH_TIMEOUT, 300), 138834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden }; 139834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden AuthorizationSet set(params, array_length(params)); 140834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden AuthorizationSet set2(set); 141834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden ASSERT_EQ(set.size(), set2.size()); 142834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden for (size_t i = 0; i < set.size(); ++i) 143834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden EXPECT_EQ(set[i], set2[i]); 144834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden} 145834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden 1465ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Lookup, NonRepeated) { 1475ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t params[] = { 1485ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 1495ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 1505ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 1515ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_ID, 7), 1525ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_AUTH_ID, 8), 1535ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_APPLICATION_ID, "my_app", 6), 1545ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_KEY_SIZE, 256), 1555ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_AUTH_TIMEOUT, 300), 1565ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 1575ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet set(params, array_length(params)); 1585ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(8U, set.size()); 1595ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1605ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden int pos = set.find(TAG_ALGORITHM); 1615ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden ASSERT_NE(-1, pos); 1625ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(KM_TAG_ALGORITHM, set[pos].tag); 1635ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(KM_ALGORITHM_RSA, set[pos].enumerated); 1645ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1655ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden pos = set.find(TAG_MAC_LENGTH); 1665ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(-1, pos); 1675ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1685ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden uint32_t int_val = 0; 1695ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(set.GetTagValue(TAG_USER_ID, &int_val)); 1705ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(7U, int_val); 1715ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1725ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_blob_t blob_val; 1735ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(set.GetTagValue(TAG_APPLICATION_ID, &blob_val)); 1745ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(6U, blob_val.data_length); 1755ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(0, memcmp(blob_val.data, "my_app", 6)); 1765ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 1775ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1785ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Lookup, Repeated) { 1795ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t params[] = { 1805ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 1815ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 1825ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 1835ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_ID, 7), 1845ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_AUTH_ID, 8), 1855ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_APPLICATION_ID, "my_app", 6), 1865ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_KEY_SIZE, 256), 1875ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_AUTH_TIMEOUT, 300), 1885ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 1895ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet set(params, array_length(params)); 1905ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(8U, set.size()); 1915ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1925ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden int pos = set.find(TAG_PURPOSE); 1935ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden ASSERT_FALSE(pos == -1); 1945ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(KM_TAG_PURPOSE, set[pos].tag); 1955ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(KM_PURPOSE_SIGN, set[pos].enumerated); 1965ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1975ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden pos = set.find(TAG_PURPOSE, pos); 1985ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(KM_TAG_PURPOSE, set[pos].tag); 1995ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(KM_PURPOSE_VERIFY, set[pos].enumerated); 2005ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2015ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(-1, set.find(TAG_PURPOSE, pos)); 2025ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 2035ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2045ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Lookup, Indexed) { 2055ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t params[] = { 2065ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 2075ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 2085ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 2095ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_ID, 7), 2105ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_AUTH_ID, 8), 2115ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_APPLICATION_ID, "my_app", 6), 2125ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_KEY_SIZE, 256), 2135ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_AUTH_TIMEOUT, 300), 2145ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 2155ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet set(params, array_length(params)); 2165ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(8U, set.size()); 2175ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2185ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(KM_TAG_PURPOSE, set[0].tag); 2195ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(KM_PURPOSE_SIGN, set[0].enumerated); 2205ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2215ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // Lookup beyond end doesn't work, just returns zeros, but doens't blow up either (verify by 2225ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // running under valgrind). 2235ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(KM_TAG_INVALID, set[10].tag); 2245ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 2255ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2265ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Serialization, RoundTrip) { 2275ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t params[] = { 2285ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 2295ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 2305ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 2315ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_ID, 7), 2325ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_AUTH_ID, 8), 2335ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_APPLICATION_ID, "my_app", 6), 2345ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_KEY_SIZE, 256), 2355ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_AUTH_TIMEOUT, 300), 236834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden Authorization(TAG_ALL_USERS), 237834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden Authorization(TAG_RSA_PUBLIC_EXPONENT, 3), 238834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden Authorization(TAG_ACTIVE_DATETIME, 10), 2395ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 2405ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet set(params, array_length(params)); 2415ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2425ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden size_t size = set.SerializedSize(); 2435ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(size > 0); 2445ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2455ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden UniquePtr<uint8_t[]> buf(new uint8_t[size]); 24658e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(buf.get() + size, set.Serialize(buf.get(), buf.get() + size)); 2475ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet deserialized(buf.get(), size); 2485ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 24958e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(AuthorizationSet::OK, deserialized.is_valid()); 2505ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2515ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(set.size(), deserialized.size()); 2525ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden for (size_t i = 0; i < set.size(); ++i) { 253834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden EXPECT_EQ(set[i], deserialized[i]); 2545ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden } 2555ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2565ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden int pos = deserialized.find(TAG_APPLICATION_ID); 2575ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden ASSERT_NE(-1, pos); 2585ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(KM_TAG_APPLICATION_ID, deserialized[pos].tag); 2595ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(6U, deserialized[pos].blob.data_length); 2605ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(0, memcmp(deserialized[pos].blob.data, "my_app", 6)); 2615ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 2625ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 26358e1a5486219a1be9264d4e863a9dd3e393906c3Shawn WilldenTEST(Deserialization, Deserialize) { 2645ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t params[] = { 2655ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 2665ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 2675ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 2685ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_ID, 7), 2695ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_AUTH_ID, 8), 2705ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_APPLICATION_ID, "my_app", 6), 2715ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_KEY_SIZE, 256), 2725ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_AUTH_TIMEOUT, 300), 2735ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 2745ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet set(params, array_length(params)); 2755ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2765ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden size_t size = set.SerializedSize(); 2775ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(size > 0); 2785ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2795ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden UniquePtr<uint8_t[]> buf(new uint8_t[size]); 28058e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(buf.get() + size, set.Serialize(buf.get(), buf.get() + size)); 2815ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet deserialized; 2825ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden const uint8_t* p = buf.get(); 28358e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_TRUE(deserialized.Deserialize(&p, p + size)); 2845ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(p, buf.get() + size); 2855ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 28658e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(AuthorizationSet::OK, deserialized.is_valid()); 2875ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2885ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(set.size(), deserialized.size()); 2895ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden for (size_t i = 0; i < set.size(); ++i) { 2905ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(set[i].tag, deserialized[i].tag); 2915ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden } 2925ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2935ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden int pos = deserialized.find(TAG_APPLICATION_ID); 2945ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden ASSERT_NE(-1, pos); 2955ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(KM_TAG_APPLICATION_ID, deserialized[pos].tag); 2965ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(6U, deserialized[pos].blob.data_length); 2975ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(0, memcmp(deserialized[pos].blob.data, "my_app", 6)); 2985ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 2995ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 3005ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Deserialization, TooShortBuffer) { 3015ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden uint8_t buf[] = {0, 0, 0}; 3025ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet deserialized(buf, array_length(buf)); 3035ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized.is_valid()); 3045ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 3055ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden const uint8_t* p = buf; 30658e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_FALSE(deserialized.Deserialize(&p, p + array_length(buf))); 3075ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized.is_valid()); 3085ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 3095ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 3105ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Deserialization, InvalidLengthField) { 3115ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t params[] = { 3125ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 3135ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 3145ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 3155ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_ID, 7), 3165ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_AUTH_ID, 8), 3175ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_APPLICATION_ID, "my_app", 6), 3185ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_KEY_SIZE, 256), 3195ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_AUTH_TIMEOUT, 300), 3205ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 3215ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet set(params, array_length(params)); 3225ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 3235ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden size_t size = set.SerializedSize(); 3245ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(size > 0); 3255ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 3265ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden UniquePtr<uint8_t[]> buf(new uint8_t[size]); 32758e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(buf.get() + size, set.Serialize(buf.get(), buf.get() + size)); 3285ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden *reinterpret_cast<uint32_t*>(buf.get()) = 9; 3295ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 3305ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet deserialized(buf.get(), size); 3315ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized.is_valid()); 3325ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 3335ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden const uint8_t* p = buf.get(); 33458e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_FALSE(deserialized.Deserialize(&p, p + size)); 3355ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized.is_valid()); 3365ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 3375ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 3388d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willdenstatic uint32_t read_uint32(const uint8_t* buf) { 3398d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden uint32_t val; 3408d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden memcpy(&val, buf, sizeof(val)); 3418d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden return val; 3428d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden} 3438d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden 3448d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willdenstatic void add_to_uint32(uint8_t* buf, int delta) { 3458d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden uint32_t val; 3468d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden memcpy(&val, buf, sizeof(val)); 3478d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden val += delta; 3488d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden memcpy(buf, &val, sizeof(val)); 3498d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden} 3508d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden 3515ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Deserialization, MalformedIndirectData) { 3525ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t params[] = { 3535ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_APPLICATION_ID, "my_app", 6), 3545ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_APPLICATION_DATA, "foo", 3), 3555ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 3565ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet set(params, array_length(params)); 3575ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden size_t size = set.SerializedSize(); 3585ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 3595ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden UniquePtr<uint8_t[]> buf(new uint8_t[size]); 36058e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(buf.get() + size, set.Serialize(buf.get(), buf.get() + size)); 3615ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 3628d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // This sucks. This test, as written, requires intimate knowledge of the serialized layout of 3638d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // this particular set, which means it's brittle. But it's important to test that we handle 3648d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // broken serialized data and I can't think of a better way to write this. 3658d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // 3668d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // The contents of buf are: 3678d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // 3688d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // Bytes: Content: 3698d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // 0-3 Length of string data, which is 9. 3708d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // 4-9 "my_app" 3718d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // 10-12 "foo" 3728d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // 13-16 Number of elements, which is 2. 3738d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // 17-20 Length of elements, which is 24. 3748d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // 21-24 First tag, TAG_APPLICATION_ID 3758d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // 25-28 Length of string "my_app", 6 3768d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // 29-32 Offset of string "my_app", 0 3778d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // 33-36 Second tag, TAG_APPLICATION_DATA 3788d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // 37-40 Length of string "foo", 3 3798d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // 41-44 Offset of string "foo", 6 3808d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden 3818d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // Check that stuff is where we think. 3828d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden EXPECT_EQ('m', buf[4]); 3838d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden EXPECT_EQ('f', buf[10]); 3848d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // Length of "my_app" 3858d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden EXPECT_EQ(6U, read_uint32(buf.get() + 25)); 3868d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // Offset of "my_app" 3878d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden EXPECT_EQ(0U, read_uint32(buf.get() + 29)); 3888d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // Length of "foo" 3898d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden EXPECT_EQ(3U, read_uint32(buf.get() + 37)); 3908d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // Offset of "foo" 3918d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden EXPECT_EQ(6U, read_uint32(buf.get() + 41)); 3925ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 3935ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // Check that deserialization works. 3945ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet deserialized1(buf.get(), size); 39558e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(AuthorizationSet::OK, deserialized1.is_valid()); 3965ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 3975ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden const uint8_t* p = buf.get(); 39858e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_TRUE(deserialized1.Deserialize(&p, p + size)); 39958e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(AuthorizationSet::OK, deserialized1.is_valid()); 4005ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4015ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // 4025ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // Now mess them up in various ways: 4035ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // 4045ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4058d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // Move "foo" offset so offset + length goes off the end 4068d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden add_to_uint32(buf.get() + 41, 1); 4078d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden AuthorizationSet deserialized2(buf.get(), size); 4088d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized2.is_valid()); 4098d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden add_to_uint32(buf.get() + 41, -1); 4105ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4118d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // Shorten the "my_app" length to make a gap between the blobs. 4128d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden add_to_uint32(buf.get() + 25, -1); 4135ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet deserialized3(buf.get(), size); 4145ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized3.is_valid()); 4158d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden add_to_uint32(buf.get() + 25, 1); 4165ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4178d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // Extend the "my_app" length to make them overlap, and decrease the "foo" length to keep the 4188d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // total length the same. We don't detect this but should. 4198d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // TODO(swillden): Detect overlaps and holes that leave total size correct. 4208d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden add_to_uint32(buf.get() + 25, 1); 4218d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden add_to_uint32(buf.get() + 37, -1); 4225ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet deserialized4(buf.get(), size); 42358e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(AuthorizationSet::OK, deserialized4.is_valid()); 4245ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 4255ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4265ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Growable, SuccessfulRoundTrip) { 4275ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t elems_buf[20]; 4285ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden uint8_t data_buf[200]; 4295ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4305ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet growable; 4315ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(growable.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA))); 4325ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(1U, growable.size()); 4335ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4345ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(growable.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY))); 4355ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(2U, growable.size()); 4365ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4375ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(growable.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN))); 4385ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(3U, growable.size()); 4395ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4405ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(growable.push_back(Authorization(TAG_APPLICATION_ID, "data", 4))); 4415ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(4U, growable.size()); 4425ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 443834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden EXPECT_TRUE(growable.push_back(Authorization(TAG_APPLICATION_DATA, "some more data", 14))); 444834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden EXPECT_EQ(5U, growable.size()); 445834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden 4465ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden size_t serialize_size = growable.SerializedSize(); 4475ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden UniquePtr<uint8_t[]> serialized(new uint8_t[serialize_size]); 44858e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(serialized.get() + serialize_size, 44958e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden growable.Serialize(serialized.get(), serialized.get() + serialize_size)); 450834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden 451834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden AuthorizationSet deserialized(serialized.get(), serialize_size); 452834e80747cbb960f8a4028c5c8604bf5218ecdb9Shawn Willden EXPECT_EQ(growable, deserialized); 4535ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 4545ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4555ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Growable, InsufficientElemBuf) { 4565ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t elems_buf[1]; 4575ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden uint8_t data_buf[200]; 4585ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4595ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet growable; 46058e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(AuthorizationSet::OK, growable.is_valid()); 4615ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4625ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // First insertion fits. 4635ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(growable.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA))); 4645ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(1U, growable.size()); 46558e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(AuthorizationSet::OK, growable.is_valid()); 4665ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4675ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // Second does too. 4685ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(growable.push_back(Authorization(TAG_RSA_PUBLIC_EXPONENT, 3))); 4695ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(2U, growable.size()); 4705ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 4715ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4725ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Growable, InsufficientIndirectBuf) { 4735ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t elems_buf[3]; 4745ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden uint8_t data_buf[10]; 4755ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4765ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet growable; 47758e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(AuthorizationSet::OK, growable.is_valid()); 4785ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4795ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(growable.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA))); 4805ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(1U, growable.size()); 48158e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(AuthorizationSet::OK, growable.is_valid()); 4825ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4835ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(growable.push_back(Authorization(TAG_APPLICATION_ID, "1234567890", 10))); 4845ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(2U, growable.size()); 48558e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(AuthorizationSet::OK, growable.is_valid()); 4865ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4875ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(growable.push_back(Authorization(TAG_APPLICATION_DATA, "1", 1))); 4885ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(3U, growable.size()); 48958e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(AuthorizationSet::OK, growable.is_valid()); 4905ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4915ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // Can still add another entry without indirect data. Now it's full. 4925ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(growable.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN))); 4935ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(4U, growable.size()); 49458e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(AuthorizationSet::OK, growable.is_valid()); 4955ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 4965ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4975ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(GetValue, GetInt) { 4985ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t params[] = { 4995ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 5005ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 5015ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 5025ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_ID, 7), 5035ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_AUTH_ID, 8), 5045ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_APPLICATION_ID, "my_app", 6), 5055ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_AUTH_TIMEOUT, 300), 5065ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 5075ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet set(params, array_length(params)); 5085ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 5095ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden uint32_t val; 5105ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(set.GetTagValue(TAG_USER_ID, &val)); 5115ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(7U, val); 5125ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 5135ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // Find one that isn't there 5145ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_FALSE(set.GetTagValue(TAG_KEY_SIZE, &val)); 5155ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 5165ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 5175ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(GetValue, GetIntRep) { 5185ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t params[] = { 5195ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 5205ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 5215ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 5225ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_ID, 7), 5235ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_AUTH_ID, 8), 5245ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_APPLICATION_ID, "my_app", 6), 5255ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_AUTH_TIMEOUT, 300), 5265ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 5275ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet set(params, array_length(params)); 5285ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 5295ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden uint32_t val; 5305ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(set.GetTagValue(TAG_USER_AUTH_ID, 0, &val)); 5315ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(8U, val); 5325ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 5335ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // Find one that isn't there 5345ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_FALSE(set.GetTagValue(TAG_USER_AUTH_ID, 1, &val)); 5355ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 5365ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 5375ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(GetValue, GetLong) { 5385ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t params1[] = { 5395ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 5405ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 5415ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_param_long(TAG_RSA_PUBLIC_EXPONENT, 3), 5425ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 5435ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet set1(params1, array_length(params1)); 5445ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 5455ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t params2[] = { 5465ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 5475ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 5485ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 5495ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet set2(params2, array_length(params2)); 5505ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 5515ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden uint64_t val; 5525ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(set1.GetTagValue(TAG_RSA_PUBLIC_EXPONENT, &val)); 5535ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(3U, val); 5545ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 5555ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // Find one that isn't there 5565ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_FALSE(set2.GetTagValue(TAG_RSA_PUBLIC_EXPONENT, &val)); 5575ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 5585ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 5595ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(GetValue, GetEnum) { 5605ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t params[] = { 5615ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 5625ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 5635ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 5645ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_ID, 7), 5655ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_AUTH_ID, 8), 5665ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_APPLICATION_ID, "my_app", 6), 5675ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_AUTH_TIMEOUT, 300), 5685ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 5695ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet set(params, array_length(params)); 5705ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 5715ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_algorithm_t val; 5725ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(set.GetTagValue(TAG_ALGORITHM, &val)); 5735ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(KM_ALGORITHM_RSA, val); 5745ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 5755ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // Find one that isn't there 5765ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_padding_t val2; 5775ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_FALSE(set.GetTagValue(TAG_PADDING, &val2)); 5785ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 5795ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 5805ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(GetValue, GetEnumRep) { 5815ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t params[] = { 5825ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 5835ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 5845ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 5855ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_ID, 7), 5865ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_AUTH_ID, 8), 5875ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_APPLICATION_ID, "my_app", 6), 5885ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_AUTH_TIMEOUT, 300), 5895ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 5905ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet set(params, array_length(params)); 5915ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 5925ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_purpose_t val; 5935ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(set.GetTagValue(TAG_PURPOSE, 0, &val)); 5945ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(KM_PURPOSE_SIGN, val); 5955ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(set.GetTagValue(TAG_PURPOSE, 1, &val)); 5965ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(KM_PURPOSE_VERIFY, val); 5975ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 5985ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // Find one that isn't there 5995ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_FALSE(set.GetTagValue(TAG_PURPOSE, 2, &val)); 6005ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 6015ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 6025ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(GetValue, GetDate) { 6035ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t params[] = { 6045ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ACTIVE_DATETIME, 10), 6055ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 6065ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 6075ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_ID, 7), 6085ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_AUTH_ID, 8), 6095ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_APPLICATION_ID, "my_app", 6), 6105ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_AUTH_TIMEOUT, 300), 6115ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 6125ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet set(params, array_length(params)); 6135ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 6145ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden uint64_t val; 6155ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(set.GetTagValue(TAG_ACTIVE_DATETIME, &val)); 6165ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(10U, val); 6175ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 6185ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // Find one that isn't there 6195ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_FALSE(set.GetTagValue(TAG_USAGE_EXPIRE_DATETIME, &val)); 6205ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 6215ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 6225ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(GetValue, GetBlob) { 6235ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t params[] = { 6245ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ACTIVE_DATETIME, 10), 6255ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 6265ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 6275ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_ID, 7), 6285ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_AUTH_ID, 8), 6295ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_APPLICATION_ID, "my_app", 6), 6305ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_AUTH_TIMEOUT, 300), 6315ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 6325ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet set(params, array_length(params)); 6335ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 6345ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_blob_t val; 6355ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(set.GetTagValue(TAG_APPLICATION_ID, &val)); 6365ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(6U, val.data_length); 6375ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(0, memcmp(val.data, "my_app", 6)); 6385ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 6395ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // Find one that isn't there 6405ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_FALSE(set.GetTagValue(TAG_APPLICATION_DATA, &val)); 6415ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 6425ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 6435ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} // namespace test 6445ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} // namespace keymaster 645