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