1*789431f2SAndroid Build Coastguard Worker /*
2*789431f2SAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project
3*789431f2SAndroid Build Coastguard Worker *
4*789431f2SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*789431f2SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*789431f2SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*789431f2SAndroid Build Coastguard Worker *
8*789431f2SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*789431f2SAndroid Build Coastguard Worker *
10*789431f2SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*789431f2SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*789431f2SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*789431f2SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*789431f2SAndroid Build Coastguard Worker * limitations under the License.
15*789431f2SAndroid Build Coastguard Worker */
16*789431f2SAndroid Build Coastguard Worker
17*789431f2SAndroid Build Coastguard Worker #include "android_keymaster_test_utils.h"
18*789431f2SAndroid Build Coastguard Worker
19*789431f2SAndroid Build Coastguard Worker #include <algorithm>
20*789431f2SAndroid Build Coastguard Worker
21*789431f2SAndroid Build Coastguard Worker #include <openssl/rand.h>
22*789431f2SAndroid Build Coastguard Worker
23*789431f2SAndroid Build Coastguard Worker #include <keymaster/android_keymaster_messages.h>
24*789431f2SAndroid Build Coastguard Worker #include <keymaster/android_keymaster_utils.h>
25*789431f2SAndroid Build Coastguard Worker
26*789431f2SAndroid Build Coastguard Worker using std::copy_if;
27*789431f2SAndroid Build Coastguard Worker using std::find_if;
28*789431f2SAndroid Build Coastguard Worker using std::is_permutation;
29*789431f2SAndroid Build Coastguard Worker using std::ostream;
30*789431f2SAndroid Build Coastguard Worker using std::string;
31*789431f2SAndroid Build Coastguard Worker using std::vector;
32*789431f2SAndroid Build Coastguard Worker
33*789431f2SAndroid Build Coastguard Worker #ifndef KEYMASTER_NAME_TAGS
34*789431f2SAndroid Build Coastguard Worker #error Keymaster test code requires that KEYMASTER_NAME_TAGS is defined
35*789431f2SAndroid Build Coastguard Worker #endif
36*789431f2SAndroid Build Coastguard Worker
operator <<(std::ostream & os,const keymaster_key_param_t & param)37*789431f2SAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& os, const keymaster_key_param_t& param) {
38*789431f2SAndroid Build Coastguard Worker os << "Tag: " << keymaster::StringifyTag(param.tag);
39*789431f2SAndroid Build Coastguard Worker switch (keymaster_tag_get_type(param.tag)) {
40*789431f2SAndroid Build Coastguard Worker case KM_INVALID:
41*789431f2SAndroid Build Coastguard Worker os << " Invalid";
42*789431f2SAndroid Build Coastguard Worker break;
43*789431f2SAndroid Build Coastguard Worker case KM_UINT_REP:
44*789431f2SAndroid Build Coastguard Worker os << " (Rep)";
45*789431f2SAndroid Build Coastguard Worker /* Falls through */
46*789431f2SAndroid Build Coastguard Worker [[fallthrough]];
47*789431f2SAndroid Build Coastguard Worker case KM_UINT:
48*789431f2SAndroid Build Coastguard Worker os << " Int: " << param.integer;
49*789431f2SAndroid Build Coastguard Worker break;
50*789431f2SAndroid Build Coastguard Worker case KM_ENUM_REP:
51*789431f2SAndroid Build Coastguard Worker os << " (Rep)";
52*789431f2SAndroid Build Coastguard Worker /* Falls through */
53*789431f2SAndroid Build Coastguard Worker [[fallthrough]];
54*789431f2SAndroid Build Coastguard Worker case KM_ENUM:
55*789431f2SAndroid Build Coastguard Worker os << " Enum: " << param.enumerated;
56*789431f2SAndroid Build Coastguard Worker break;
57*789431f2SAndroid Build Coastguard Worker case KM_ULONG_REP:
58*789431f2SAndroid Build Coastguard Worker os << " (Rep)";
59*789431f2SAndroid Build Coastguard Worker /* Falls through */
60*789431f2SAndroid Build Coastguard Worker [[fallthrough]];
61*789431f2SAndroid Build Coastguard Worker case KM_ULONG:
62*789431f2SAndroid Build Coastguard Worker os << " Long: " << param.long_integer;
63*789431f2SAndroid Build Coastguard Worker break;
64*789431f2SAndroid Build Coastguard Worker case KM_DATE:
65*789431f2SAndroid Build Coastguard Worker os << " Date: " << param.date_time;
66*789431f2SAndroid Build Coastguard Worker break;
67*789431f2SAndroid Build Coastguard Worker case KM_BOOL:
68*789431f2SAndroid Build Coastguard Worker os << " Bool: " << param.boolean;
69*789431f2SAndroid Build Coastguard Worker break;
70*789431f2SAndroid Build Coastguard Worker case KM_BIGNUM:
71*789431f2SAndroid Build Coastguard Worker os << " Bignum: ";
72*789431f2SAndroid Build Coastguard Worker if (!param.blob.data)
73*789431f2SAndroid Build Coastguard Worker os << "(null)";
74*789431f2SAndroid Build Coastguard Worker else
75*789431f2SAndroid Build Coastguard Worker for (size_t i = 0; i < param.blob.data_length; ++i)
76*789431f2SAndroid Build Coastguard Worker os << std::hex << std::setw(2) << static_cast<int>(param.blob.data[i]) << std::dec;
77*789431f2SAndroid Build Coastguard Worker break;
78*789431f2SAndroid Build Coastguard Worker case KM_BYTES:
79*789431f2SAndroid Build Coastguard Worker os << " Bytes: ";
80*789431f2SAndroid Build Coastguard Worker if (!param.blob.data)
81*789431f2SAndroid Build Coastguard Worker os << "(null)";
82*789431f2SAndroid Build Coastguard Worker else
83*789431f2SAndroid Build Coastguard Worker for (size_t i = 0; i < param.blob.data_length; ++i)
84*789431f2SAndroid Build Coastguard Worker os << std::hex << std::setw(2) << static_cast<int>(param.blob.data[i]) << std::dec;
85*789431f2SAndroid Build Coastguard Worker break;
86*789431f2SAndroid Build Coastguard Worker }
87*789431f2SAndroid Build Coastguard Worker return os;
88*789431f2SAndroid Build Coastguard Worker }
89*789431f2SAndroid Build Coastguard Worker
operator ==(const keymaster_key_param_t & a,const keymaster_key_param_t & b)90*789431f2SAndroid Build Coastguard Worker bool operator==(const keymaster_key_param_t& a, const keymaster_key_param_t& b) {
91*789431f2SAndroid Build Coastguard Worker if (a.tag != b.tag) {
92*789431f2SAndroid Build Coastguard Worker return false;
93*789431f2SAndroid Build Coastguard Worker }
94*789431f2SAndroid Build Coastguard Worker
95*789431f2SAndroid Build Coastguard Worker switch (keymaster_tag_get_type(a.tag)) {
96*789431f2SAndroid Build Coastguard Worker case KM_INVALID:
97*789431f2SAndroid Build Coastguard Worker return true;
98*789431f2SAndroid Build Coastguard Worker case KM_UINT_REP:
99*789431f2SAndroid Build Coastguard Worker case KM_UINT:
100*789431f2SAndroid Build Coastguard Worker return a.integer == b.integer;
101*789431f2SAndroid Build Coastguard Worker case KM_ENUM_REP:
102*789431f2SAndroid Build Coastguard Worker case KM_ENUM:
103*789431f2SAndroid Build Coastguard Worker return a.enumerated == b.enumerated;
104*789431f2SAndroid Build Coastguard Worker case KM_ULONG:
105*789431f2SAndroid Build Coastguard Worker case KM_ULONG_REP:
106*789431f2SAndroid Build Coastguard Worker return a.long_integer == b.long_integer;
107*789431f2SAndroid Build Coastguard Worker case KM_DATE:
108*789431f2SAndroid Build Coastguard Worker return a.date_time == b.date_time;
109*789431f2SAndroid Build Coastguard Worker case KM_BOOL:
110*789431f2SAndroid Build Coastguard Worker return a.boolean == b.boolean;
111*789431f2SAndroid Build Coastguard Worker case KM_BIGNUM:
112*789431f2SAndroid Build Coastguard Worker case KM_BYTES:
113*789431f2SAndroid Build Coastguard Worker if ((a.blob.data == nullptr || b.blob.data == nullptr) && a.blob.data != b.blob.data)
114*789431f2SAndroid Build Coastguard Worker return false;
115*789431f2SAndroid Build Coastguard Worker return a.blob.data_length == b.blob.data_length &&
116*789431f2SAndroid Build Coastguard Worker (memcmp(a.blob.data, b.blob.data, a.blob.data_length) == 0);
117*789431f2SAndroid Build Coastguard Worker }
118*789431f2SAndroid Build Coastguard Worker
119*789431f2SAndroid Build Coastguard Worker return false;
120*789431f2SAndroid Build Coastguard Worker }
121*789431f2SAndroid Build Coastguard Worker
122*789431f2SAndroid Build Coastguard Worker static char hex_value[256] = {
123*789431f2SAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
124*789431f2SAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
125*789431f2SAndroid Build Coastguard Worker 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, // '0'..'9'
126*789431f2SAndroid Build Coastguard Worker 0, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 'A'..'F'
127*789431f2SAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, 13, 14, 15, 0,
128*789431f2SAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, // 'a'..'f'
129*789431f2SAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
130*789431f2SAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
131*789431f2SAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
132*789431f2SAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
133*789431f2SAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
134*789431f2SAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
135*789431f2SAndroid Build Coastguard Worker
hex2str(string a)136*789431f2SAndroid Build Coastguard Worker string hex2str(string a) {
137*789431f2SAndroid Build Coastguard Worker string b;
138*789431f2SAndroid Build Coastguard Worker size_t num = a.size() / 2;
139*789431f2SAndroid Build Coastguard Worker b.resize(num);
140*789431f2SAndroid Build Coastguard Worker for (size_t i = 0; i < num; i++) {
141*789431f2SAndroid Build Coastguard Worker b[i] = (hex_value[a[i * 2] & 0xFF] << 4) + (hex_value[a[i * 2 + 1] & 0xFF]);
142*789431f2SAndroid Build Coastguard Worker }
143*789431f2SAndroid Build Coastguard Worker return b;
144*789431f2SAndroid Build Coastguard Worker }
145*789431f2SAndroid Build Coastguard Worker
146*789431f2SAndroid Build Coastguard Worker namespace keymaster {
147*789431f2SAndroid Build Coastguard Worker
operator ==(const AuthorizationSet & a,const AuthorizationSet & b)148*789431f2SAndroid Build Coastguard Worker bool operator==(const AuthorizationSet& a, const AuthorizationSet& b) {
149*789431f2SAndroid Build Coastguard Worker if (a.size() != b.size()) return false;
150*789431f2SAndroid Build Coastguard Worker
151*789431f2SAndroid Build Coastguard Worker for (size_t i = 0; i < a.size(); ++i)
152*789431f2SAndroid Build Coastguard Worker if (!(a[i] == b[i])) return false;
153*789431f2SAndroid Build Coastguard Worker return true;
154*789431f2SAndroid Build Coastguard Worker }
155*789431f2SAndroid Build Coastguard Worker
operator !=(const AuthorizationSet & a,const AuthorizationSet & b)156*789431f2SAndroid Build Coastguard Worker bool operator!=(const AuthorizationSet& a, const AuthorizationSet& b) {
157*789431f2SAndroid Build Coastguard Worker return !(a == b);
158*789431f2SAndroid Build Coastguard Worker }
159*789431f2SAndroid Build Coastguard Worker
operator <<(std::ostream & os,const AuthorizationSet & set)160*789431f2SAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& os, const AuthorizationSet& set) {
161*789431f2SAndroid Build Coastguard Worker if (set.size() == 0)
162*789431f2SAndroid Build Coastguard Worker os << "(Empty)" << std::endl;
163*789431f2SAndroid Build Coastguard Worker else {
164*789431f2SAndroid Build Coastguard Worker os << "\n";
165*789431f2SAndroid Build Coastguard Worker for (size_t i = 0; i < set.size(); ++i)
166*789431f2SAndroid Build Coastguard Worker os << set[i] << std::endl;
167*789431f2SAndroid Build Coastguard Worker }
168*789431f2SAndroid Build Coastguard Worker return os;
169*789431f2SAndroid Build Coastguard Worker }
170*789431f2SAndroid Build Coastguard Worker
171*789431f2SAndroid Build Coastguard Worker } // namespace keymaster
172