xref: /aosp_15_r20/system/keymaster/tests/android_keymaster_test_utils.cpp (revision 789431f29546679ab5188a97751fb38e3018d44d)
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