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