authorization_set_test.cpp revision 8d336ae10df66da4c0433f17c2d42e85baea32c5
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 195ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden#include "authorization_set.h" 205ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden#include "google_keymaster_utils.h" 215ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 225ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdenint main(int argc, char** argv) { 235ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden ::testing::InitGoogleTest(&argc, argv); 245ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden int result = RUN_ALL_TESTS(); 255ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden return result; 265ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 275ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 285ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdennamespace keymaster { 295ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willdennamespace test { 305ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 315ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Construction, ListProvided) { 325ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t params[] = { 335ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 345ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 355ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 365ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_ID, 7), 375ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_AUTH_ID, 8), 385ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_APPLICATION_ID, "my_app", 6), 395ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_KEY_SIZE, 256), 405ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_AUTH_TIMEOUT, 300), 415ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 425ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet set(params, array_length(params)); 435ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(8U, set.size()); 445ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 455ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 465ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Lookup, NonRepeated) { 475ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t params[] = { 485ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 495ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 505ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 515ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_ID, 7), 525ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_AUTH_ID, 8), 535ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_APPLICATION_ID, "my_app", 6), 545ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_KEY_SIZE, 256), 555ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_AUTH_TIMEOUT, 300), 565ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 575ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet set(params, array_length(params)); 585ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(8U, set.size()); 595ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 605ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden int pos = set.find(TAG_ALGORITHM); 615ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden ASSERT_NE(-1, pos); 625ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(KM_TAG_ALGORITHM, set[pos].tag); 635ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(KM_ALGORITHM_RSA, set[pos].enumerated); 645ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 655ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden pos = set.find(TAG_MAC_LENGTH); 665ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(-1, pos); 675ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 685ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden uint32_t int_val = 0; 695ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(set.GetTagValue(TAG_USER_ID, &int_val)); 705ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(7U, int_val); 715ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 725ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_blob_t blob_val; 735ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(set.GetTagValue(TAG_APPLICATION_ID, &blob_val)); 745ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(6U, blob_val.data_length); 755ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(0, memcmp(blob_val.data, "my_app", 6)); 765ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 775ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 785ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Lookup, Repeated) { 795ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t params[] = { 805ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 815ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 825ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 835ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_ID, 7), 845ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_AUTH_ID, 8), 855ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_APPLICATION_ID, "my_app", 6), 865ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_KEY_SIZE, 256), 875ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_AUTH_TIMEOUT, 300), 885ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 895ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet set(params, array_length(params)); 905ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(8U, set.size()); 915ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 925ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden int pos = set.find(TAG_PURPOSE); 935ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden ASSERT_FALSE(pos == -1); 945ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(KM_TAG_PURPOSE, set[pos].tag); 955ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(KM_PURPOSE_SIGN, set[pos].enumerated); 965ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 975ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden pos = set.find(TAG_PURPOSE, pos); 985ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(KM_TAG_PURPOSE, set[pos].tag); 995ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(KM_PURPOSE_VERIFY, set[pos].enumerated); 1005ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1015ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(-1, set.find(TAG_PURPOSE, pos)); 1025ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 1035ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1045ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Lookup, Indexed) { 1055ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t params[] = { 1065ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 1075ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 1085ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 1095ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_ID, 7), 1105ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_AUTH_ID, 8), 1115ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_APPLICATION_ID, "my_app", 6), 1125ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_KEY_SIZE, 256), 1135ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_AUTH_TIMEOUT, 300), 1145ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 1155ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet set(params, array_length(params)); 1165ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(8U, set.size()); 1175ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1185ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(KM_TAG_PURPOSE, set[0].tag); 1195ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(KM_PURPOSE_SIGN, set[0].enumerated); 1205ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1215ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // Lookup beyond end doesn't work, just returns zeros, but doens't blow up either (verify by 1225ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // running under valgrind). 1235ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(KM_TAG_INVALID, set[10].tag); 1245ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 1255ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1265ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Serialization, RoundTrip) { 1275ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t params[] = { 1285ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 1295ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 1305ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 1315ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_ID, 7), 1325ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_AUTH_ID, 8), 1335ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_APPLICATION_ID, "my_app", 6), 1345ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_KEY_SIZE, 256), 1355ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_AUTH_TIMEOUT, 300), 1365ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 1375ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet set(params, array_length(params)); 1385ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1395ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden size_t size = set.SerializedSize(); 1405ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(size > 0); 1415ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1425ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden UniquePtr<uint8_t[]> buf(new uint8_t[size]); 14358e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(buf.get() + size, set.Serialize(buf.get(), buf.get() + size)); 1445ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet deserialized(buf.get(), size); 1455ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 14658e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(AuthorizationSet::OK, deserialized.is_valid()); 1475ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1485ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(set.size(), deserialized.size()); 1495ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden for (size_t i = 0; i < set.size(); ++i) { 1505ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(set[i].tag, deserialized[i].tag); 1515ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden } 1525ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1535ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden int pos = deserialized.find(TAG_APPLICATION_ID); 1545ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden ASSERT_NE(-1, pos); 1555ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(KM_TAG_APPLICATION_ID, deserialized[pos].tag); 1565ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(6U, deserialized[pos].blob.data_length); 1575ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(0, memcmp(deserialized[pos].blob.data, "my_app", 6)); 1585ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 1595ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 16058e1a5486219a1be9264d4e863a9dd3e393906c3Shawn WilldenTEST(Deserialization, Deserialize) { 1615ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t params[] = { 1625ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 1635ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 1645ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 1655ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_ID, 7), 1665ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_AUTH_ID, 8), 1675ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_APPLICATION_ID, "my_app", 6), 1685ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_KEY_SIZE, 256), 1695ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_AUTH_TIMEOUT, 300), 1705ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 1715ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet set(params, array_length(params)); 1725ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1735ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden size_t size = set.SerializedSize(); 1745ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(size > 0); 1755ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1765ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden UniquePtr<uint8_t[]> buf(new uint8_t[size]); 17758e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(buf.get() + size, set.Serialize(buf.get(), buf.get() + size)); 1785ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet deserialized; 1795ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden const uint8_t* p = buf.get(); 18058e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_TRUE(deserialized.Deserialize(&p, p + size)); 1815ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(p, buf.get() + size); 1825ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 18358e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(AuthorizationSet::OK, deserialized.is_valid()); 1845ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1855ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(set.size(), deserialized.size()); 1865ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden for (size_t i = 0; i < set.size(); ++i) { 1875ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(set[i].tag, deserialized[i].tag); 1885ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden } 1895ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1905ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden int pos = deserialized.find(TAG_APPLICATION_ID); 1915ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden ASSERT_NE(-1, pos); 1925ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(KM_TAG_APPLICATION_ID, deserialized[pos].tag); 1935ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(6U, deserialized[pos].blob.data_length); 1945ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(0, memcmp(deserialized[pos].blob.data, "my_app", 6)); 1955ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 1965ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 1975ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Deserialization, TooShortBuffer) { 1985ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden uint8_t buf[] = {0, 0, 0}; 1995ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet deserialized(buf, array_length(buf)); 2005ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized.is_valid()); 2015ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2025ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden const uint8_t* p = buf; 20358e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_FALSE(deserialized.Deserialize(&p, p + array_length(buf))); 2045ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized.is_valid()); 2055ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 2065ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2075ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Deserialization, InvalidLengthField) { 2085ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t params[] = { 2095ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 2105ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 2115ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 2125ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_ID, 7), 2135ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_AUTH_ID, 8), 2145ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_APPLICATION_ID, "my_app", 6), 2155ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_KEY_SIZE, 256), 2165ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_AUTH_TIMEOUT, 300), 2175ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 2185ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet set(params, array_length(params)); 2195ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2205ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden size_t size = set.SerializedSize(); 2215ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(size > 0); 2225ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2235ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden UniquePtr<uint8_t[]> buf(new uint8_t[size]); 22458e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(buf.get() + size, set.Serialize(buf.get(), buf.get() + size)); 2255ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden *reinterpret_cast<uint32_t*>(buf.get()) = 9; 2265ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2275ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet deserialized(buf.get(), size); 2285ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized.is_valid()); 2295ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2305ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden const uint8_t* p = buf.get(); 23158e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_FALSE(deserialized.Deserialize(&p, p + size)); 2325ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized.is_valid()); 2335ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 2345ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2358d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willdenstatic uint32_t read_uint32(const uint8_t* buf) { 2368d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden uint32_t val; 2378d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden memcpy(&val, buf, sizeof(val)); 2388d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden return val; 2398d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden} 2408d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden 2418d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willdenstatic void add_to_uint32(uint8_t* buf, int delta) { 2428d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden uint32_t val; 2438d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden memcpy(&val, buf, sizeof(val)); 2448d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden val += delta; 2458d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden memcpy(buf, &val, sizeof(val)); 2468d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden} 2478d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden 2485ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Deserialization, MalformedIndirectData) { 2495ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t params[] = { 2505ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_APPLICATION_ID, "my_app", 6), 2515ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_APPLICATION_DATA, "foo", 3), 2525ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 2535ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet set(params, array_length(params)); 2545ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden size_t size = set.SerializedSize(); 2555ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2565ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden UniquePtr<uint8_t[]> buf(new uint8_t[size]); 25758e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(buf.get() + size, set.Serialize(buf.get(), buf.get() + size)); 2585ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2598d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // This sucks. This test, as written, requires intimate knowledge of the serialized layout of 2608d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // this particular set, which means it's brittle. But it's important to test that we handle 2618d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // broken serialized data and I can't think of a better way to write this. 2628d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // 2638d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // The contents of buf are: 2648d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // 2658d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // Bytes: Content: 2668d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // 0-3 Length of string data, which is 9. 2678d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // 4-9 "my_app" 2688d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // 10-12 "foo" 2698d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // 13-16 Number of elements, which is 2. 2708d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // 17-20 Length of elements, which is 24. 2718d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // 21-24 First tag, TAG_APPLICATION_ID 2728d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // 25-28 Length of string "my_app", 6 2738d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // 29-32 Offset of string "my_app", 0 2748d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // 33-36 Second tag, TAG_APPLICATION_DATA 2758d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // 37-40 Length of string "foo", 3 2768d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // 41-44 Offset of string "foo", 6 2778d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden 2788d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // Check that stuff is where we think. 2798d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden EXPECT_EQ('m', buf[4]); 2808d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden EXPECT_EQ('f', buf[10]); 2818d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // Length of "my_app" 2828d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden EXPECT_EQ(6U, read_uint32(buf.get() + 25)); 2838d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // Offset of "my_app" 2848d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden EXPECT_EQ(0U, read_uint32(buf.get() + 29)); 2858d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // Length of "foo" 2868d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden EXPECT_EQ(3U, read_uint32(buf.get() + 37)); 2878d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // Offset of "foo" 2888d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden EXPECT_EQ(6U, read_uint32(buf.get() + 41)); 2895ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2905ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // Check that deserialization works. 2915ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet deserialized1(buf.get(), size); 29258e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(AuthorizationSet::OK, deserialized1.is_valid()); 2935ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2945ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden const uint8_t* p = buf.get(); 29558e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_TRUE(deserialized1.Deserialize(&p, p + size)); 29658e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(AuthorizationSet::OK, deserialized1.is_valid()); 2975ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 2985ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // 2995ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // Now mess them up in various ways: 3005ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // 3015ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 3028d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // Move "foo" offset so offset + length goes off the end 3038d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden add_to_uint32(buf.get() + 41, 1); 3048d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden AuthorizationSet deserialized2(buf.get(), size); 3058d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized2.is_valid()); 3068d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden add_to_uint32(buf.get() + 41, -1); 3075ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 3088d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // Shorten the "my_app" length to make a gap between the blobs. 3098d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden add_to_uint32(buf.get() + 25, -1); 3105ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet deserialized3(buf.get(), size); 3115ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(AuthorizationSet::MALFORMED_DATA, deserialized3.is_valid()); 3128d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden add_to_uint32(buf.get() + 25, 1); 3135ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 3148d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // Extend the "my_app" length to make them overlap, and decrease the "foo" length to keep the 3158d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // total length the same. We don't detect this but should. 3168d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden // TODO(swillden): Detect overlaps and holes that leave total size correct. 3178d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden add_to_uint32(buf.get() + 25, 1); 3188d336ae10df66da4c0433f17c2d42e85baea32c5Shawn Willden add_to_uint32(buf.get() + 37, -1); 3195ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet deserialized4(buf.get(), size); 32058e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(AuthorizationSet::OK, deserialized4.is_valid()); 3215ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 3225ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 3235ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Growable, SuccessfulRoundTrip) { 3245ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t elems_buf[20]; 3255ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden uint8_t data_buf[200]; 3265ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 3275ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet growable; 3285ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(growable.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA))); 3295ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(1U, growable.size()); 3305ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 3315ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(growable.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY))); 3325ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(2U, growable.size()); 3335ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 3345ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(growable.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN))); 3355ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(3U, growable.size()); 3365ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 3375ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(growable.push_back(Authorization(TAG_APPLICATION_ID, "data", 4))); 3385ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(4U, growable.size()); 3395ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 3405ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden size_t serialize_size = growable.SerializedSize(); 3415ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden UniquePtr<uint8_t[]> serialized(new uint8_t[serialize_size]); 34258e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(serialized.get() + serialize_size, 34358e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden growable.Serialize(serialized.get(), serialized.get() + serialize_size)); 3445ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 3455ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 3465ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Growable, InsufficientElemBuf) { 3475ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t elems_buf[1]; 3485ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden uint8_t data_buf[200]; 3495ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 3505ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet growable; 35158e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(AuthorizationSet::OK, growable.is_valid()); 3525ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 3535ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // First insertion fits. 3545ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(growable.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA))); 3555ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(1U, growable.size()); 35658e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(AuthorizationSet::OK, growable.is_valid()); 3575ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 3585ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // Second does too. 3595ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(growable.push_back(Authorization(TAG_RSA_PUBLIC_EXPONENT, 3))); 3605ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(2U, growable.size()); 3615ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 3625ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 3635ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(Growable, InsufficientIndirectBuf) { 3645ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t elems_buf[3]; 3655ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden uint8_t data_buf[10]; 3665ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 3675ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet growable; 36858e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(AuthorizationSet::OK, growable.is_valid()); 3695ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 3705ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(growable.push_back(Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA))); 3715ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(1U, growable.size()); 37258e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(AuthorizationSet::OK, growable.is_valid()); 3735ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 3745ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(growable.push_back(Authorization(TAG_APPLICATION_ID, "1234567890", 10))); 3755ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(2U, growable.size()); 37658e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(AuthorizationSet::OK, growable.is_valid()); 3775ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 3785ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(growable.push_back(Authorization(TAG_APPLICATION_DATA, "1", 1))); 3795ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(3U, growable.size()); 38058e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(AuthorizationSet::OK, growable.is_valid()); 3815ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 3825ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // Can still add another entry without indirect data. Now it's full. 3835ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(growable.push_back(Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN))); 3845ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(4U, growable.size()); 38558e1a5486219a1be9264d4e863a9dd3e393906c3Shawn Willden EXPECT_EQ(AuthorizationSet::OK, growable.is_valid()); 3865ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 3875ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 3885ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(GetValue, GetInt) { 3895ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t params[] = { 3905ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 3915ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 3925ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 3935ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_ID, 7), 3945ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_AUTH_ID, 8), 3955ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_APPLICATION_ID, "my_app", 6), 3965ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_AUTH_TIMEOUT, 300), 3975ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 3985ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet set(params, array_length(params)); 3995ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4005ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden uint32_t val; 4015ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(set.GetTagValue(TAG_USER_ID, &val)); 4025ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(7U, val); 4035ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4045ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // Find one that isn't there 4055ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_FALSE(set.GetTagValue(TAG_KEY_SIZE, &val)); 4065ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 4075ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4085ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(GetValue, GetIntRep) { 4095ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t params[] = { 4105ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 4115ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 4125ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 4135ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_ID, 7), 4145ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_AUTH_ID, 8), 4155ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_APPLICATION_ID, "my_app", 6), 4165ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_AUTH_TIMEOUT, 300), 4175ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 4185ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet set(params, array_length(params)); 4195ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4205ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden uint32_t val; 4215ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(set.GetTagValue(TAG_USER_AUTH_ID, 0, &val)); 4225ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(8U, val); 4235ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4245ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // Find one that isn't there 4255ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_FALSE(set.GetTagValue(TAG_USER_AUTH_ID, 1, &val)); 4265ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 4275ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4285ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(GetValue, GetLong) { 4295ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t params1[] = { 4305ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 4315ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 4325ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_param_long(TAG_RSA_PUBLIC_EXPONENT, 3), 4335ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 4345ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet set1(params1, array_length(params1)); 4355ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4365ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t params2[] = { 4375ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 4385ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 4395ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 4405ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet set2(params2, array_length(params2)); 4415ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4425ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden uint64_t val; 4435ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(set1.GetTagValue(TAG_RSA_PUBLIC_EXPONENT, &val)); 4445ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(3U, val); 4455ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4465ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // Find one that isn't there 4475ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_FALSE(set2.GetTagValue(TAG_RSA_PUBLIC_EXPONENT, &val)); 4485ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 4495ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4505ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(GetValue, GetEnum) { 4515ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t params[] = { 4525ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 4535ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 4545ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 4555ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_ID, 7), 4565ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_AUTH_ID, 8), 4575ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_APPLICATION_ID, "my_app", 6), 4585ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_AUTH_TIMEOUT, 300), 4595ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 4605ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet set(params, array_length(params)); 4615ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4625ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_algorithm_t val; 4635ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(set.GetTagValue(TAG_ALGORITHM, &val)); 4645ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(KM_ALGORITHM_RSA, val); 4655ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4665ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // Find one that isn't there 4675ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_padding_t val2; 4685ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_FALSE(set.GetTagValue(TAG_PADDING, &val2)); 4695ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 4705ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4715ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(GetValue, GetEnumRep) { 4725ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t params[] = { 4735ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_SIGN), 4745ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 4755ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 4765ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_ID, 7), 4775ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_AUTH_ID, 8), 4785ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_APPLICATION_ID, "my_app", 6), 4795ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_AUTH_TIMEOUT, 300), 4805ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 4815ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet set(params, array_length(params)); 4825ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4835ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_purpose_t val; 4845ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(set.GetTagValue(TAG_PURPOSE, 0, &val)); 4855ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(KM_PURPOSE_SIGN, val); 4865ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(set.GetTagValue(TAG_PURPOSE, 1, &val)); 4875ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(KM_PURPOSE_VERIFY, val); 4885ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4895ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // Find one that isn't there 4905ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_FALSE(set.GetTagValue(TAG_PURPOSE, 2, &val)); 4915ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 4925ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 4935ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(GetValue, GetDate) { 4945ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t params[] = { 4955ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ACTIVE_DATETIME, 10), 4965ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 4975ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 4985ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_ID, 7), 4995ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_AUTH_ID, 8), 5005ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_APPLICATION_ID, "my_app", 6), 5015ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_AUTH_TIMEOUT, 300), 5025ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 5035ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet set(params, array_length(params)); 5045ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 5055ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden uint64_t val; 5065ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(set.GetTagValue(TAG_ACTIVE_DATETIME, &val)); 5075ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(10U, val); 5085ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 5095ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // Find one that isn't there 5105ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_FALSE(set.GetTagValue(TAG_USAGE_EXPIRE_DATETIME, &val)); 5115ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 5125ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 5135ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn WilldenTEST(GetValue, GetBlob) { 5145ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_key_param_t params[] = { 5155ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ACTIVE_DATETIME, 10), 5165ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_PURPOSE, KM_PURPOSE_VERIFY), 5175ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA), 5185ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_ID, 7), 5195ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_USER_AUTH_ID, 8), 5205ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_APPLICATION_ID, "my_app", 6), 5215ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden Authorization(TAG_AUTH_TIMEOUT, 300), 5225ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden }; 5235ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden AuthorizationSet set(params, array_length(params)); 5245ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 5255ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden keymaster_blob_t val; 5265ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_TRUE(set.GetTagValue(TAG_APPLICATION_ID, &val)); 5275ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(6U, val.data_length); 5285ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_EQ(0, memcmp(val.data, "my_app", 6)); 5295ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 5305ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden // Find one that isn't there 5315ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden EXPECT_FALSE(set.GetTagValue(TAG_APPLICATION_DATA, &val)); 5325ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} 5335ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden 5345ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} // namespace test 5355ada7b6c525d2bfd5b556a698ccb11db23e052bbShawn Willden} // namespace keymaster 536