1 /*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include <fcntl.h>
18 #include <stdlib.h>
19 #include <unistd.h>
20 #include <sys/mman.h>
21 #include <sys/stat.h>
22 #include <sys/types.h>
23
24 #include <fstream>
25 #include <iostream>
26
27 #include <gtest/gtest.h>
28
29 #include <openssl/bn.h>
30 #include <openssl/evp.h>
31 #include <openssl/x509.h>
32
33 #define LOG_TAG "keymaster_test"
34 #include <utils/Log.h>
35
36 #include <UniquePtr.h>
37
38 #include <hardware/keymaster0.h>
39
40 namespace android {
41
42 class UniqueBlob : public UniquePtr<uint8_t[]> {
43 public:
UniqueBlob(size_t length)44 explicit UniqueBlob(size_t length) :
45 mLength(length) {
46 }
47
UniqueBlob(uint8_t * bytes,size_t length)48 UniqueBlob(uint8_t* bytes, size_t length) :
49 UniquePtr<uint8_t[]>(bytes), mLength(length) {
50 }
51
operator ==(const UniqueBlob & other) const52 bool operator==(const UniqueBlob &other) const {
53 if (other.length() != mLength) {
54 return false;
55 }
56
57 const uint8_t* mine = get();
58 const uint8_t* theirs = other.get();
59
60 for (size_t i = 0; i < mLength; i++) {
61 if (mine[i] != theirs[i]) {
62 return false;
63 }
64 }
65
66 return true;
67 }
68
length() const69 size_t length() const {
70 return mLength;
71 }
72
73 friend std::ostream &operator<<(std::ostream &stream, const UniqueBlob& blob);
74
75 private:
76 size_t mLength;
77 };
78
operator <<(std::ostream & stream,const UniqueBlob & blob)79 std::ostream &operator<<(std::ostream &stream, const UniqueBlob& blob) {
80 const size_t length = blob.mLength;
81 stream << "Blob length=" << length << " < ";
82
83 const uint8_t* data = blob.get();
84 for (size_t i = 0; i < length; i++) {
85 stream << std::hex << std::setw(2) << std::setfill('0')
86 << static_cast<unsigned int>(data[i]) << ' ';
87 }
88 stream << '>' << std::endl;
89
90 return stream;
91 }
92
93 class UniqueKey : public UniqueBlob {
94 public:
UniqueKey(keymaster0_device_t ** dev,uint8_t * bytes,size_t length)95 UniqueKey(keymaster0_device_t** dev, uint8_t* bytes, size_t length) :
96 UniqueBlob(bytes, length), mDevice(dev) {
97 }
98
~UniqueKey()99 ~UniqueKey() {
100 if (mDevice != NULL && *mDevice != NULL) {
101 keymaster0_device_t* dev = *mDevice;
102 if (dev->delete_keypair != NULL) {
103 dev->delete_keypair(dev, get(), length());
104 }
105 }
106 }
107
108 private:
109 keymaster0_device_t** mDevice;
110 };
111
112 class UniqueReadOnlyBlob {
113 public:
UniqueReadOnlyBlob(uint8_t * data,size_t dataSize)114 UniqueReadOnlyBlob(uint8_t* data, size_t dataSize) :
115 mDataSize(dataSize) {
116 int pageSize = sysconf(_SC_PAGE_SIZE);
117 if (pageSize == -1) {
118 return;
119 }
120
121 int fd = open("/dev/zero", O_RDONLY);
122 if (fd == -1) {
123 return;
124 }
125
126 mBufferSize = (dataSize + pageSize - 1) & ~(pageSize - 1);
127 uint8_t* buffer = (uint8_t*) mmap(NULL, mBufferSize, PROT_READ | PROT_WRITE,
128 MAP_PRIVATE, fd, 0);
129 close(fd);
130
131 if (buffer == NULL) {
132 return;
133 }
134
135 memcpy(buffer, data, dataSize);
136 if (mprotect(buffer, mBufferSize, PROT_READ) == -1) {
137 munmap(buffer, mBufferSize);
138 return;
139 }
140
141 mBuffer = buffer;
142 }
143
~UniqueReadOnlyBlob()144 ~UniqueReadOnlyBlob() {
145 munmap(mBuffer, mBufferSize);
146 }
147
get() const148 uint8_t* get() const {
149 return mBuffer;
150 }
151
length() const152 size_t length() const {
153 return mDataSize;
154 }
155
156 private:
157 uint8_t* mBuffer;
158 size_t mBufferSize;
159 size_t mDataSize;
160 };
161
162 struct BIGNUM_Delete {
operator ()android::BIGNUM_Delete163 void operator()(BIGNUM* p) const {
164 BN_free(p);
165 }
166 };
167 typedef UniquePtr<BIGNUM, BIGNUM_Delete> Unique_BIGNUM;
168
169 struct EVP_PKEY_Delete {
operator ()android::EVP_PKEY_Delete170 void operator()(EVP_PKEY* p) const {
171 EVP_PKEY_free(p);
172 }
173 };
174 typedef UniquePtr<EVP_PKEY, EVP_PKEY_Delete> Unique_EVP_PKEY;
175
176 struct PKCS8_PRIV_KEY_INFO_Delete {
operator ()android::PKCS8_PRIV_KEY_INFO_Delete177 void operator()(PKCS8_PRIV_KEY_INFO* p) const {
178 PKCS8_PRIV_KEY_INFO_free(p);
179 }
180 };
181 typedef UniquePtr<PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO_Delete> Unique_PKCS8_PRIV_KEY_INFO;
182
183 struct RSA_Delete {
operator ()android::RSA_Delete184 void operator()(RSA* p) const {
185 RSA_free(p);
186 }
187 };
188 typedef UniquePtr<RSA, RSA_Delete> Unique_RSA;
189
190 struct EC_KEY_Delete {
operator ()android::EC_KEY_Delete191 void operator()(EC_KEY* p) const {
192 EC_KEY_free(p);
193 }
194 };
195 typedef UniquePtr<EC_KEY, EC_KEY_Delete> Unique_EC_KEY;
196
197
198 /*
199 * DER-encoded PKCS#8 format RSA key. Generated using:
200 *
201 * openssl genrsa 2048 | openssl pkcs8 -topk8 -nocrypt -outform der | recode ../x1
202 */
203 static uint8_t TEST_RSA_KEY_1[] = {
204 0x30, 0x82, 0x04, 0xBE, 0x02, 0x01, 0x00, 0x30, 0x0D, 0x06, 0x09, 0x2A,
205 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82,
206 0x04, 0xA8, 0x30, 0x82, 0x04, 0xA4, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01,
207 0x01, 0x00, 0xD8, 0x58, 0xD4, 0x9F, 0xC0, 0xE8, 0xF0, 0xFF, 0x87, 0x27,
208 0x43, 0xE6, 0x2E, 0xE6, 0x9A, 0x42, 0x3B, 0x39, 0x94, 0x84, 0x43, 0x55,
209 0x8D, 0x20, 0x5B, 0x71, 0x88, 0xE6, 0xD1, 0x62, 0xC8, 0xF2, 0x20, 0xD0,
210 0x75, 0x13, 0x83, 0xA3, 0x5D, 0x19, 0xA8, 0x62, 0xD0, 0x5F, 0x3E, 0x8A,
211 0x7C, 0x0E, 0x26, 0xA9, 0xFF, 0xB2, 0x5E, 0x63, 0xAA, 0x3C, 0x8D, 0x13,
212 0x41, 0xAA, 0xD5, 0x03, 0x01, 0x01, 0x53, 0xC9, 0x02, 0x1C, 0xEC, 0xE8,
213 0xC4, 0x70, 0x3F, 0x43, 0xE5, 0x51, 0xD0, 0x6E, 0x52, 0x0B, 0xC4, 0x0A,
214 0xA3, 0x61, 0xDE, 0xE3, 0x72, 0x0C, 0x94, 0xF1, 0x1C, 0x2D, 0x36, 0x77,
215 0xBB, 0x16, 0xA8, 0x63, 0x4B, 0xD1, 0x07, 0x00, 0x42, 0x2D, 0x2B, 0x10,
216 0x80, 0x45, 0xF3, 0x0C, 0xF9, 0xC5, 0xAC, 0xCC, 0x64, 0x87, 0xFD, 0x5D,
217 0xC8, 0x51, 0xD4, 0x1C, 0x9E, 0x6E, 0x9B, 0xC4, 0x27, 0x5E, 0x73, 0xA7,
218 0x2A, 0xF6, 0x90, 0x42, 0x0C, 0x34, 0x93, 0xB7, 0x02, 0x19, 0xA9, 0x64,
219 0x6C, 0x46, 0x3B, 0x40, 0x02, 0x2F, 0x54, 0x69, 0x79, 0x26, 0x7D, 0xF6,
220 0x85, 0x90, 0x01, 0xD0, 0x21, 0x07, 0xD0, 0x14, 0x00, 0x65, 0x9C, 0xAC,
221 0x24, 0xE8, 0x78, 0x42, 0x3B, 0x90, 0x75, 0x19, 0x55, 0x11, 0x4E, 0xD9,
222 0xE6, 0x97, 0x87, 0xBC, 0x8D, 0x2C, 0x9B, 0xF0, 0x1F, 0x14, 0xEB, 0x6A,
223 0x57, 0xCE, 0x78, 0xAD, 0xCE, 0xD9, 0xFB, 0xB9, 0xA1, 0xEF, 0x0C, 0x1F,
224 0xDD, 0xE3, 0x5B, 0x73, 0xA0, 0xEC, 0x37, 0x9C, 0xE1, 0xFD, 0x86, 0x28,
225 0xC3, 0x4A, 0x42, 0xD0, 0xA3, 0xFE, 0x57, 0x09, 0x29, 0xD8, 0xF6, 0xEC,
226 0xE3, 0xC0, 0x71, 0x7C, 0x29, 0x27, 0xC2, 0xD1, 0x3E, 0x22, 0xBC, 0xBD,
227 0x5A, 0x85, 0x41, 0xF6, 0x15, 0xDA, 0x0C, 0x58, 0x5A, 0x61, 0x5B, 0x78,
228 0xB8, 0xAA, 0xEC, 0x5C, 0x1C, 0x79, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02,
229 0x82, 0x01, 0x00, 0x1D, 0x10, 0x31, 0xE0, 0x14, 0x26, 0x36, 0xD9, 0xDC,
230 0xEA, 0x25, 0x70, 0xF2, 0xB3, 0xFF, 0xDD, 0x0D, 0xDF, 0xBA, 0x57, 0xDA,
231 0x43, 0xCF, 0xE5, 0x9C, 0xE3, 0x2F, 0xA4, 0xF2, 0x53, 0xF6, 0xF2, 0xAF,
232 0xFD, 0xD0, 0xFC, 0x82, 0x1E, 0x9C, 0x0F, 0x2A, 0x53, 0xBB, 0xF2, 0x4F,
233 0x90, 0x83, 0x01, 0xD3, 0xA7, 0xDA, 0xB5, 0xB7, 0x80, 0x64, 0x0A, 0x26,
234 0x59, 0x83, 0xE4, 0xD3, 0x20, 0xC8, 0x2D, 0xC9, 0x77, 0xA3, 0x55, 0x07,
235 0x6E, 0x6D, 0x95, 0x36, 0xAA, 0x84, 0x4F, 0xED, 0x54, 0x24, 0xA9, 0x77,
236 0xF8, 0x85, 0xE2, 0x4B, 0xF2, 0xFA, 0x0B, 0x3E, 0xA6, 0xF5, 0x46, 0x0D,
237 0x9F, 0x1F, 0xFE, 0xF7, 0x37, 0xFF, 0xA3, 0x60, 0xF1, 0x63, 0xF2, 0x75,
238 0x6A, 0x8E, 0x10, 0xD7, 0x89, 0xD2, 0xB3, 0xFF, 0x76, 0xA5, 0xBA, 0xAF,
239 0x0A, 0xBE, 0x32, 0x5F, 0xF0, 0x48, 0x48, 0x4B, 0x9C, 0x9A, 0x3D, 0x12,
240 0xA7, 0xD2, 0x07, 0xC7, 0x59, 0x32, 0x94, 0x95, 0x65, 0x2F, 0x87, 0x34,
241 0x76, 0xBA, 0x7C, 0x08, 0x4B, 0xAB, 0xA6, 0x24, 0xDF, 0x64, 0xDB, 0x48,
242 0x63, 0x42, 0x06, 0xE2, 0x2C, 0x3D, 0xFB, 0xE5, 0x47, 0x81, 0x94, 0x98,
243 0xF7, 0x32, 0x4B, 0x28, 0xEB, 0x42, 0xB8, 0xE9, 0x8E, 0xFC, 0xC9, 0x43,
244 0xC9, 0x47, 0xE6, 0xE7, 0x1C, 0xDC, 0x71, 0xEF, 0x4D, 0x8A, 0xB1, 0xFC,
245 0x45, 0x37, 0xEC, 0xB3, 0x16, 0x88, 0x5B, 0xE2, 0xEC, 0x8B, 0x6B, 0x75,
246 0x16, 0xBE, 0x6B, 0xF8, 0x2C, 0xF8, 0xC9, 0xD1, 0xF7, 0x55, 0x87, 0x57,
247 0x5F, 0xDE, 0xF4, 0x7E, 0x72, 0x13, 0x06, 0x2A, 0x21, 0xB7, 0x78, 0x21,
248 0x05, 0xFD, 0xE2, 0x5F, 0x7B, 0x7C, 0xF0, 0x26, 0x2B, 0x75, 0x7F, 0x68,
249 0xF9, 0xA6, 0x98, 0xFD, 0x54, 0x0E, 0xCC, 0x22, 0x41, 0x7F, 0x29, 0x81,
250 0x2F, 0xA3, 0x3C, 0x3D, 0x64, 0xC8, 0x41, 0x02, 0x81, 0x81, 0x00, 0xFA,
251 0xFA, 0xE4, 0x2E, 0x30, 0xF0, 0x7A, 0x8D, 0x95, 0xB8, 0x39, 0x58, 0x27,
252 0x0F, 0x89, 0x0C, 0xDF, 0xFE, 0x2F, 0x55, 0x3B, 0x6F, 0xDD, 0x5F, 0x12,
253 0xB3, 0xD1, 0xCF, 0x5B, 0x8D, 0xB6, 0x10, 0x1C, 0x87, 0x0C, 0x30, 0x89,
254 0x2D, 0xBB, 0xB8, 0xA1, 0x78, 0x0F, 0x54, 0xA6, 0x36, 0x46, 0x05, 0x8B,
255 0x5A, 0xFF, 0x48, 0x03, 0x13, 0xAE, 0x95, 0x96, 0x5D, 0x6C, 0xDA, 0x5D,
256 0xF7, 0xAD, 0x1D, 0x33, 0xED, 0x23, 0xF5, 0x4B, 0x03, 0x78, 0xE7, 0x50,
257 0xD1, 0x2D, 0x95, 0x22, 0x35, 0x02, 0x5B, 0x4A, 0x4E, 0x73, 0xC9, 0xB7,
258 0x05, 0xC4, 0x21, 0x86, 0x1F, 0x1E, 0x40, 0x83, 0xBC, 0x8A, 0x3A, 0x95,
259 0x24, 0x62, 0xF4, 0x58, 0x38, 0x64, 0x4A, 0x89, 0x8A, 0x27, 0x59, 0x12,
260 0x9D, 0x21, 0xC3, 0xA6, 0x42, 0x1E, 0x2A, 0x3F, 0xD8, 0x65, 0x1F, 0x6E,
261 0x3E, 0x4D, 0x5C, 0xCC, 0xEA, 0x8E, 0x15, 0x02, 0x81, 0x81, 0x00, 0xDC,
262 0xAC, 0x9B, 0x00, 0xDB, 0xF9, 0xB2, 0xBF, 0xC4, 0x5E, 0xB6, 0xB7, 0x63,
263 0xEB, 0x13, 0x4B, 0xE2, 0xA6, 0xC8, 0x72, 0x90, 0xD8, 0xC2, 0x33, 0x33,
264 0xF0, 0x66, 0x75, 0xBD, 0x50, 0x7C, 0xA4, 0x8F, 0x82, 0xFB, 0xFF, 0x44,
265 0x3B, 0xE7, 0x15, 0x3A, 0x0C, 0x7A, 0xF8, 0x92, 0x86, 0x4A, 0x79, 0x32,
266 0x08, 0x82, 0x1D, 0x6A, 0xBA, 0xAD, 0x8A, 0xB3, 0x3D, 0x7F, 0xA5, 0xB4,
267 0x6F, 0x67, 0x86, 0x7E, 0xB2, 0x9C, 0x2A, 0xF6, 0x7C, 0x49, 0x21, 0xC5,
268 0x3F, 0x00, 0x3F, 0x9B, 0xF7, 0x0F, 0x6C, 0x35, 0x80, 0x75, 0x73, 0xC0,
269 0xF8, 0x3E, 0x30, 0x5F, 0x74, 0x2F, 0x15, 0x41, 0xEA, 0x0F, 0xCE, 0x0E,
270 0x18, 0x17, 0x68, 0xBA, 0xC4, 0x29, 0xF2, 0xE2, 0x2C, 0x1D, 0x55, 0x83,
271 0xB6, 0x64, 0x2E, 0x03, 0x12, 0xA4, 0x0D, 0xBF, 0x4F, 0x2E, 0xBE, 0x7C,
272 0x41, 0xD9, 0xCD, 0xD0, 0x52, 0x91, 0xD5, 0x02, 0x81, 0x81, 0x00, 0xD4,
273 0x55, 0xEB, 0x32, 0xC1, 0x28, 0xD3, 0x26, 0x72, 0x22, 0xB8, 0x31, 0x42,
274 0x6A, 0xBC, 0x52, 0x6E, 0x37, 0x48, 0xA8, 0x5D, 0x6E, 0xD8, 0xE5, 0x14,
275 0x97, 0x99, 0xCC, 0x4A, 0xF2, 0xEB, 0xB3, 0x59, 0xCF, 0x4F, 0x9A, 0xC8,
276 0x94, 0x2E, 0x9B, 0x97, 0xD0, 0x51, 0x78, 0x16, 0x5F, 0x18, 0x82, 0x9C,
277 0x51, 0xD2, 0x64, 0x84, 0x65, 0xE4, 0x70, 0x9E, 0x14, 0x50, 0x81, 0xB6,
278 0xBA, 0x52, 0x75, 0xC0, 0x76, 0xC2, 0xD3, 0x46, 0x31, 0x9B, 0xDA, 0x67,
279 0xDF, 0x71, 0x27, 0x19, 0x17, 0xAB, 0xF4, 0xBC, 0x3A, 0xFF, 0x6F, 0x0B,
280 0x2F, 0x0F, 0xAE, 0x25, 0x20, 0xB2, 0xA1, 0x76, 0x52, 0xCE, 0xC7, 0x9D,
281 0x62, 0x79, 0x6D, 0xAC, 0x2D, 0x99, 0x7C, 0x0E, 0x3D, 0x19, 0xE9, 0x1B,
282 0xFC, 0x60, 0x92, 0x7C, 0x58, 0xB7, 0xD8, 0x9A, 0xC7, 0x63, 0x56, 0x62,
283 0x18, 0xC7, 0xAE, 0xD9, 0x97, 0x1F, 0xB9, 0x02, 0x81, 0x81, 0x00, 0x91,
284 0x40, 0xC4, 0x1E, 0x82, 0xAD, 0x0F, 0x6D, 0x8E, 0xD2, 0x51, 0x2E, 0xD1,
285 0x84, 0x30, 0x85, 0x68, 0xC1, 0x23, 0x7B, 0xD5, 0xBF, 0xF7, 0xC4, 0x40,
286 0x51, 0xE2, 0xFF, 0x69, 0x07, 0x8B, 0xA3, 0xBE, 0x1B, 0x17, 0xC8, 0x64,
287 0x9F, 0x91, 0x71, 0xB5, 0x6D, 0xF5, 0x9B, 0x9C, 0xC6, 0xEC, 0x4A, 0x6E,
288 0x16, 0x8F, 0x9E, 0xD1, 0x5B, 0xE3, 0x53, 0x42, 0xBC, 0x1E, 0x43, 0x72,
289 0x4B, 0x4A, 0x37, 0x8B, 0x3A, 0x01, 0xF5, 0x7D, 0x9D, 0x3D, 0x7E, 0x0F,
290 0x19, 0x73, 0x0E, 0x6B, 0x98, 0xE9, 0xFB, 0xEE, 0x13, 0x8A, 0x3C, 0x11,
291 0x2E, 0xD5, 0xB0, 0x7D, 0x84, 0x3A, 0x61, 0xA1, 0xAB, 0x71, 0x8F, 0xCE,
292 0x53, 0x29, 0x45, 0x74, 0x7A, 0x1E, 0xAA, 0x93, 0x19, 0x3A, 0x8D, 0xC9,
293 0x4E, 0xCB, 0x0E, 0x46, 0x53, 0x84, 0xCC, 0xCF, 0xBA, 0x4D, 0x28, 0x71,
294 0x1D, 0xDF, 0x41, 0xCB, 0xF8, 0x2D, 0xA9, 0x02, 0x81, 0x80, 0x04, 0x8B,
295 0x4A, 0xEA, 0xBD, 0x39, 0x0B, 0x96, 0xC5, 0x1D, 0xA4, 0x47, 0xFD, 0x46,
296 0xD2, 0x8A, 0xEA, 0x2A, 0xF3, 0x9D, 0x3A, 0x7E, 0x16, 0x74, 0xFC, 0x13,
297 0xDE, 0x4D, 0xA9, 0x85, 0x42, 0x33, 0x02, 0x92, 0x0B, 0xB6, 0xDB, 0x7E,
298 0xEA, 0x85, 0xC2, 0x94, 0x43, 0x52, 0x37, 0x5A, 0x77, 0xAB, 0xCB, 0x61,
299 0x88, 0xDE, 0xF8, 0xFA, 0xDB, 0xE8, 0x0B, 0x95, 0x7D, 0x39, 0x19, 0xA2,
300 0x89, 0xB9, 0x32, 0xB2, 0x50, 0x38, 0xF7, 0x88, 0x69, 0xFD, 0xA4, 0x63,
301 0x1F, 0x9B, 0x03, 0xD8, 0xA6, 0x7A, 0x05, 0x76, 0x02, 0x28, 0x93, 0x82,
302 0x73, 0x7F, 0x14, 0xCC, 0xBE, 0x29, 0x10, 0xAD, 0x8A, 0x2E, 0xAC, 0xED,
303 0x11, 0xA7, 0x72, 0x7C, 0x60, 0x78, 0x72, 0xFB, 0x78, 0x20, 0x18, 0xC9,
304 0x7E, 0x63, 0xAD, 0x55, 0x54, 0x51, 0xDB, 0x9F, 0x7B, 0xD4, 0x8F, 0xB2,
305 0xDE, 0x3B, 0xF1, 0x70, 0x23, 0xE5,
306 };
307
308 /*
309 * DER-encoded PKCS#8 format EC key. Generated using:
310 *
311 * openssl ecparam -name prime256v1 -genkey -noout | openssl pkcs8 -topk8 -nocrypt -outform der | recode ../x1
312 */
313 static uint8_t TEST_EC_KEY_1[] = {
314 0x30, 0x81, 0x87, 0x02, 0x01, 0x00, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86,
315 0x48, 0xCE, 0x3D, 0x02, 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D,
316 0x03, 0x01, 0x07, 0x04, 0x6D, 0x30, 0x6B, 0x02, 0x01, 0x01, 0x04, 0x20,
317 0x25, 0xAC, 0x77, 0x2B, 0x04, 0x33, 0xC8, 0x16, 0x59, 0xA3, 0xC7, 0xE7,
318 0x11, 0x42, 0xD0, 0x11, 0x71, 0x30, 0x7B, 0xB8, 0xD2, 0x67, 0xFF, 0x9C,
319 0x5F, 0x50, 0x2E, 0xAB, 0x67, 0xD4, 0x17, 0x51, 0xA1, 0x44, 0x03, 0x42,
320 0x00, 0x04, 0xCF, 0xCE, 0xB8, 0x7F, 0x88, 0x36, 0xC4, 0xF8, 0x51, 0x29,
321 0xE2, 0xA7, 0x21, 0xC3, 0x3B, 0xFF, 0x88, 0xE3, 0x87, 0x98, 0xD1, 0xA6,
322 0x4B, 0xB3, 0x4B, 0xD5, 0x44, 0xF8, 0xE0, 0x43, 0x6B, 0x50, 0x74, 0xFB,
323 0xB0, 0xAD, 0x41, 0x1C, 0x11, 0x9D, 0xC6, 0x1E, 0x83, 0x8C, 0x49, 0xCA,
324 0xBE, 0xC6, 0xCE, 0xB6, 0xC9, 0xA1, 0xBF, 0x69, 0xA9, 0xA0, 0xA3, 0x80,
325 0x14, 0x39, 0x57, 0x94, 0xDA, 0x5D
326 };
327
328
329 /*
330 * Generated using keys on the keyboard and lack of imagination.
331 */
332 static unsigned char BOGUS_KEY_1[] = { 0xFF, 0xFF, 0xFF, 0xFF };
333
334
335 class KeymasterBaseTest : public ::testing::Test {
336 public:
SetUpTestCase()337 static void SetUpTestCase() {
338 const hw_module_t* mod;
339 ASSERT_EQ(0, hw_get_module_by_class(KEYSTORE_HARDWARE_MODULE_ID, NULL, &mod))
340 << "Should be able to find a keymaster hardware module";
341
342 std::cout << "Using keymaster module: " << mod->name << std::endl;
343
344 ASSERT_EQ(0, keymaster0_open(mod, &sDevice))
345 << "Should be able to open the keymaster device";
346
347 ASSERT_EQ(KEYMASTER_MODULE_API_VERSION_0_2, mod->module_api_version)
348 << "Keymaster should implement API version 2";
349
350 ASSERT_TRUE(sDevice->generate_keypair != NULL)
351 << "Should implement generate_keypair";
352
353 ASSERT_TRUE(sDevice->import_keypair != NULL)
354 << "Should implement import_keypair";
355
356 ASSERT_TRUE(sDevice->get_keypair_public != NULL)
357 << "Should implement get_keypair_public";
358
359 ASSERT_TRUE(sDevice->sign_data != NULL)
360 << "Should implement sign_data";
361
362 ASSERT_TRUE(sDevice->verify_data != NULL)
363 << "Should implement verify_data";
364 }
365
TearDownTestCase()366 static void TearDownTestCase() {
367 ASSERT_EQ(0, keymaster0_close(sDevice));
368 }
369
370 protected:
371 static keymaster0_device_t* sDevice;
372 };
373
374 keymaster0_device_t* KeymasterBaseTest::sDevice = NULL;
375
376 class KeymasterTest : public KeymasterBaseTest {
377 };
378
379 class KeymasterAllTypesTest : public KeymasterBaseTest,
380 public ::testing::WithParamInterface<keymaster_keypair_t> {
381 };
382
383 class KeymasterGenerateRSATest : public KeymasterBaseTest,
384 public ::testing::WithParamInterface<uint32_t> {
385 };
386
387 class KeymasterGenerateDSATest : public KeymasterBaseTest,
388 public ::testing::WithParamInterface<uint32_t> {
389 };
390
391 class KeymasterGenerateECTest : public KeymasterBaseTest,
392 public ::testing::WithParamInterface<uint32_t> {
393 };
394
TEST_P(KeymasterGenerateRSATest,GenerateKeyPair_RSA_Success)395 TEST_P(KeymasterGenerateRSATest, GenerateKeyPair_RSA_Success) {
396 keymaster_keypair_t key_type = TYPE_RSA;
397 keymaster_rsa_keygen_params_t params = {
398 .modulus_size = GetParam(),
399 .public_exponent = RSA_F4,
400 };
401
402 uint8_t* key_blob;
403 size_t key_blob_length;
404
405 ASSERT_EQ(0,
406 sDevice->generate_keypair(sDevice, key_type, ¶ms, &key_blob, &key_blob_length))
407 << "Should generate an RSA key with " << GetParam() << " bit modulus size";
408 UniqueKey key(&sDevice, key_blob, key_blob_length);
409
410 uint8_t* x509_data = NULL;
411 size_t x509_data_length;
412 ASSERT_EQ(0,
413 sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
414 &x509_data, &x509_data_length))
415 << "Should be able to retrieve RSA public key successfully";
416 UniqueBlob x509_blob(x509_data, x509_data_length);
417 ASSERT_FALSE(x509_blob.get() == NULL)
418 << "X509 data should be allocated";
419
420 const unsigned char *tmp = static_cast<const unsigned char*>(x509_blob.get());
421 Unique_EVP_PKEY actual(d2i_PUBKEY((EVP_PKEY**) NULL, &tmp,
422 static_cast<long>(x509_blob.length())));
423
424 ASSERT_EQ(EVP_PKEY_RSA, EVP_PKEY_type(actual.get()->type))
425 << "Generated key type should be of type RSA";
426
427 Unique_RSA rsa(EVP_PKEY_get1_RSA(actual.get()));
428 ASSERT_FALSE(rsa.get() == NULL)
429 << "Should be able to extract RSA key from EVP_PKEY";
430
431 ASSERT_EQ(static_cast<unsigned long>(RSA_F4), BN_get_word(rsa.get()->e))
432 << "Exponent should be RSA_F4";
433
434 ASSERT_EQ((GetParam() + 7) / 8, static_cast<uint32_t>(RSA_size(rsa.get())))
435 << "Modulus size should be the specified parameter";
436 }
437
438 INSTANTIATE_TEST_CASE_P(RSA,
439 KeymasterGenerateRSATest,
440 ::testing::Values(512U, 1024U, 2048U, 3072U, 4096U));
441
442
TEST_P(KeymasterGenerateECTest,GenerateKeyPair_EC_Success)443 TEST_P(KeymasterGenerateECTest, GenerateKeyPair_EC_Success) {
444 keymaster_keypair_t key_type = TYPE_EC;
445 keymaster_ec_keygen_params_t params = {
446 .field_size = GetParam(),
447 };
448
449 uint8_t* key_blob;
450 size_t key_blob_length;
451
452 ASSERT_EQ(0,
453 sDevice->generate_keypair(sDevice, key_type, ¶ms, &key_blob, &key_blob_length))
454 << "Should generate an EC key with " << GetParam() << " field size";
455 UniqueKey key(&sDevice, key_blob, key_blob_length);
456
457 uint8_t* x509_data = NULL;
458 size_t x509_data_length;
459 ASSERT_EQ(0,
460 sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
461 &x509_data, &x509_data_length))
462 << "Should be able to retrieve EC public key successfully";
463 UniqueBlob x509_blob(x509_data, x509_data_length);
464 ASSERT_FALSE(x509_blob.get() == NULL)
465 << "X509 data should be allocated";
466
467 const unsigned char *tmp = static_cast<const unsigned char*>(x509_blob.get());
468 Unique_EVP_PKEY actual(d2i_PUBKEY((EVP_PKEY**) NULL, &tmp,
469 static_cast<long>(x509_blob.length())));
470
471 ASSERT_EQ(EVP_PKEY_EC, EVP_PKEY_type(actual.get()->type))
472 << "Generated key type should be of type EC";
473
474 Unique_EC_KEY ecKey(EVP_PKEY_get1_EC_KEY(actual.get()));
475 ASSERT_FALSE(ecKey.get() == NULL)
476 << "Should be able to extract EC key from EVP_PKEY";
477
478 ASSERT_FALSE(EC_KEY_get0_group(ecKey.get()) == NULL)
479 << "EC key should have a EC_GROUP";
480
481 ASSERT_TRUE(EC_KEY_check_key(ecKey.get()))
482 << "EC key should check correctly";
483 }
484
485 INSTANTIATE_TEST_CASE_P(EC,
486 KeymasterGenerateECTest,
487 ::testing::Values(192U, 224U, 256U, 384U, 521U));
488
489
TEST_P(KeymasterAllTypesTest,GenerateKeyPair_NullParams_Failure)490 TEST_P(KeymasterAllTypesTest, GenerateKeyPair_NullParams_Failure) {
491 keymaster_keypair_t key_type = GetParam();
492
493 uint8_t* key_blob;
494 size_t key_blob_length;
495
496 ASSERT_EQ(-1,
497 sDevice->generate_keypair(sDevice, key_type, NULL, &key_blob, &key_blob_length))
498 << "Should not be able to generate a key with null params";
499 }
500
501 INSTANTIATE_TEST_CASE_P(Types,
502 KeymasterAllTypesTest,
503 ::testing::Values(TYPE_RSA, TYPE_DSA, TYPE_EC));
504
TEST_F(KeymasterTest,GenerateKeyPair_UnknownType_Failure)505 TEST_F(KeymasterTest, GenerateKeyPair_UnknownType_Failure) {
506 keymaster_keypair_t key_type = static_cast<keymaster_keypair_t>(0xFFFF);
507
508 uint8_t* key_blob;
509 size_t key_blob_length;
510
511 ASSERT_EQ(-1,
512 sDevice->generate_keypair(sDevice, key_type, NULL, &key_blob, &key_blob_length))
513 << "Should not generate an unknown key type";
514 }
515
TEST_F(KeymasterTest,ImportKeyPair_RSA_Success)516 TEST_F(KeymasterTest, ImportKeyPair_RSA_Success) {
517 uint8_t* key_blob;
518 size_t key_blob_length;
519
520 ASSERT_EQ(0,
521 sDevice->import_keypair(sDevice, TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1),
522 &key_blob, &key_blob_length))
523 << "Should successfully import an RSA key";
524 UniqueKey key(&sDevice, key_blob, key_blob_length);
525
526 uint8_t* x509_data;
527 size_t x509_data_length;
528 ASSERT_EQ(0,
529 sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
530 &x509_data, &x509_data_length))
531 << "Should be able to retrieve RSA public key successfully";
532 UniqueBlob x509_blob(x509_data, x509_data_length);
533
534 const unsigned char *tmp = static_cast<const unsigned char*>(x509_blob.get());
535 Unique_EVP_PKEY actual(d2i_PUBKEY((EVP_PKEY**) NULL, &tmp,
536 static_cast<long>(x509_blob.length())));
537
538 ASSERT_EQ(EVP_PKEY_type(actual.get()->type), EVP_PKEY_RSA)
539 << "Generated key type should be of type RSA";
540
541 const unsigned char *expectedTmp = static_cast<const unsigned char*>(TEST_RSA_KEY_1);
542 Unique_PKCS8_PRIV_KEY_INFO expectedPkcs8(
543 d2i_PKCS8_PRIV_KEY_INFO((PKCS8_PRIV_KEY_INFO**) NULL, &expectedTmp,
544 sizeof(TEST_RSA_KEY_1)));
545
546 Unique_EVP_PKEY expected(EVP_PKCS82PKEY(expectedPkcs8.get()));
547
548 ASSERT_EQ(1, EVP_PKEY_cmp(expected.get(), actual.get()))
549 << "Expected and actual keys should match";
550 }
551
TEST_F(KeymasterTest,ImportKeyPair_EC_Success)552 TEST_F(KeymasterTest, ImportKeyPair_EC_Success) {
553 uint8_t* key_blob;
554 size_t key_blob_length;
555
556 ASSERT_EQ(0,
557 sDevice->import_keypair(sDevice, TEST_EC_KEY_1, sizeof(TEST_EC_KEY_1),
558 &key_blob, &key_blob_length))
559 << "Should successfully import an EC key";
560 UniqueKey key(&sDevice, key_blob, key_blob_length);
561
562 uint8_t* x509_data;
563 size_t x509_data_length;
564 ASSERT_EQ(0,
565 sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
566 &x509_data, &x509_data_length))
567 << "Should be able to retrieve EC public key successfully";
568 UniqueBlob x509_blob(x509_data, x509_data_length);
569
570 const unsigned char *tmp = static_cast<const unsigned char*>(x509_blob.get());
571 Unique_EVP_PKEY actual(d2i_PUBKEY((EVP_PKEY**) NULL, &tmp,
572 static_cast<long>(x509_blob.length())));
573
574 ASSERT_EQ(EVP_PKEY_type(actual.get()->type), EVP_PKEY_EC)
575 << "Generated key type should be of type EC";
576
577 const unsigned char *expectedTmp = static_cast<const unsigned char*>(TEST_EC_KEY_1);
578 Unique_PKCS8_PRIV_KEY_INFO expectedPkcs8(
579 d2i_PKCS8_PRIV_KEY_INFO((PKCS8_PRIV_KEY_INFO**) NULL, &expectedTmp,
580 sizeof(TEST_EC_KEY_1)));
581
582 Unique_EVP_PKEY expected(EVP_PKCS82PKEY(expectedPkcs8.get()));
583
584 ASSERT_EQ(1, EVP_PKEY_cmp(expected.get(), actual.get()))
585 << "Expected and actual keys should match";
586 }
587
TEST_F(KeymasterTest,ImportKeyPair_BogusKey_Failure)588 TEST_F(KeymasterTest, ImportKeyPair_BogusKey_Failure) {
589 uint8_t* key_blob;
590 size_t key_blob_length;
591
592 ASSERT_EQ(-1,
593 sDevice->import_keypair(sDevice, BOGUS_KEY_1, sizeof(BOGUS_KEY_1),
594 &key_blob, &key_blob_length))
595 << "Should not import an unknown key type";
596 }
597
TEST_F(KeymasterTest,ImportKeyPair_NullKey_Failure)598 TEST_F(KeymasterTest, ImportKeyPair_NullKey_Failure) {
599 uint8_t* key_blob;
600 size_t key_blob_length;
601
602 ASSERT_EQ(-1,
603 sDevice->import_keypair(sDevice, NULL, 0,
604 &key_blob, &key_blob_length))
605 << "Should not import a null key";
606 }
607
TEST_F(KeymasterTest,GetKeypairPublic_RSA_Success)608 TEST_F(KeymasterTest, GetKeypairPublic_RSA_Success) {
609 uint8_t* key_blob;
610 size_t key_blob_length;
611
612 UniqueReadOnlyBlob testKey(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
613 ASSERT_TRUE(testKey.get() != NULL);
614
615 ASSERT_EQ(0,
616 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
617 &key_blob, &key_blob_length))
618 << "Should successfully import an RSA key";
619 UniqueKey key(&sDevice, key_blob, key_blob_length);
620
621 uint8_t* x509_data;
622 size_t x509_data_length;
623 ASSERT_EQ(0,
624 sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
625 &x509_data, &x509_data_length))
626 << "Should be able to retrieve RSA public key successfully";
627 UniqueBlob x509_blob(x509_data, x509_data_length);
628 }
629
TEST_F(KeymasterTest,GetKeypairPublic_EC_Success)630 TEST_F(KeymasterTest, GetKeypairPublic_EC_Success) {
631 uint8_t* key_blob;
632 size_t key_blob_length;
633
634 UniqueReadOnlyBlob testKey(TEST_EC_KEY_1, sizeof(TEST_EC_KEY_1));
635 ASSERT_TRUE(testKey.get() != NULL);
636
637 ASSERT_EQ(0,
638 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
639 &key_blob, &key_blob_length))
640 << "Should successfully import an EC key";
641 UniqueKey key(&sDevice, key_blob, key_blob_length);
642
643 uint8_t* x509_data;
644 size_t x509_data_length;
645 ASSERT_EQ(0,
646 sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
647 &x509_data, &x509_data_length))
648 << "Should be able to retrieve EC public key successfully";
649 UniqueBlob x509_blob(x509_data, x509_data_length);
650 }
651
TEST_F(KeymasterTest,GetKeypairPublic_NullKey_Failure)652 TEST_F(KeymasterTest, GetKeypairPublic_NullKey_Failure) {
653 uint8_t* key_blob;
654 size_t key_blob_length;
655
656 uint8_t* x509_data = NULL;
657 size_t x509_data_length;
658 ASSERT_EQ(-1,
659 sDevice->get_keypair_public(sDevice, NULL, 0,
660 &x509_data, &x509_data_length))
661 << "Should not be able to retrieve public key from null key";
662 UniqueBlob x509_blob(x509_data, x509_data_length);
663 }
664
TEST_F(KeymasterTest,GetKeypairPublic_RSA_NullDestination_Failure)665 TEST_F(KeymasterTest, GetKeypairPublic_RSA_NullDestination_Failure) {
666 uint8_t* key_blob;
667 size_t key_blob_length;
668
669 UniqueReadOnlyBlob testKey(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
670 ASSERT_TRUE(testKey.get() != NULL);
671
672 ASSERT_EQ(0,
673 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
674 &key_blob, &key_blob_length))
675 << "Should successfully import an RSA key";
676 UniqueKey key(&sDevice, key_blob, key_blob_length);
677
678 ASSERT_EQ(-1,
679 sDevice->get_keypair_public(sDevice, key.get(), key.length(),
680 NULL, NULL))
681 << "Should not be able to succeed with NULL destination blob";
682 }
683
TEST_F(KeymasterTest,GetKeypairPublic_EC_NullDestination_Failure)684 TEST_F(KeymasterTest, GetKeypairPublic_EC_NullDestination_Failure) {
685 uint8_t* key_blob;
686 size_t key_blob_length;
687
688 UniqueReadOnlyBlob testKey(TEST_EC_KEY_1, sizeof(TEST_EC_KEY_1));
689 ASSERT_TRUE(testKey.get() != NULL);
690
691 ASSERT_EQ(0,
692 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
693 &key_blob, &key_blob_length))
694 << "Should successfully import an RSA key";
695 UniqueKey key(&sDevice, key_blob, key_blob_length);
696
697 ASSERT_EQ(-1,
698 sDevice->get_keypair_public(sDevice, key.get(), key.length(),
699 NULL, NULL))
700 << "Should not be able to succeed with NULL destination blob";
701 }
702
TEST_F(KeymasterTest,DeleteKeyPair_RSA_Success)703 TEST_F(KeymasterTest, DeleteKeyPair_RSA_Success) {
704 uint8_t* key_blob;
705 size_t key_blob_length;
706
707 UniqueReadOnlyBlob testKey(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
708 ASSERT_TRUE(testKey.get() != NULL);
709
710 ASSERT_EQ(0,
711 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
712 &key_blob, &key_blob_length))
713 << "Should successfully import an RSA key";
714 UniqueKey key(&sDevice, key_blob, key_blob_length);
715 }
716
TEST_F(KeymasterTest,DeleteKeyPair_RSA_DoubleDelete_Failure)717 TEST_F(KeymasterTest, DeleteKeyPair_RSA_DoubleDelete_Failure) {
718 uint8_t* key_blob;
719 size_t key_blob_length;
720
721 UniqueReadOnlyBlob testKey(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
722 ASSERT_TRUE(testKey.get() != NULL);
723
724 /*
725 * This is only run if the module indicates it implements key deletion
726 * by implementing delete_keypair.
727 */
728 if (sDevice->delete_keypair != NULL) {
729 ASSERT_EQ(0,
730 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
731 &key_blob, &key_blob_length))
732 << "Should successfully import an RSA key";
733 UniqueBlob blob(key_blob, key_blob_length);
734
735 ASSERT_EQ(0, sDevice->delete_keypair(sDevice, key_blob, key_blob_length))
736 << "Should delete key after import";
737
738 ASSERT_EQ(-1, sDevice->delete_keypair(sDevice, key_blob, key_blob_length))
739 << "Should not be able to delete key twice";
740 }
741 }
742
TEST_F(KeymasterTest,DeleteKeyPair_RSA_NullKey_Failure)743 TEST_F(KeymasterTest, DeleteKeyPair_RSA_NullKey_Failure) {
744 /*
745 * This is only run if the module indicates it implements key deletion
746 * by implementing delete_keypair.
747 */
748 if (sDevice->delete_keypair != NULL) {
749 ASSERT_EQ(-1, sDevice->delete_keypair(sDevice, NULL, 0))
750 << "Should not be able to delete null key";
751 }
752 }
753
754 /*
755 * DER-encoded PKCS#8 format RSA key. Generated using:
756 *
757 * openssl genrsa 512 | openssl pkcs8 -topk8 -nocrypt -outform der | recode ../x1
758 */
759 static uint8_t TEST_SIGN_RSA_KEY_1[] = {
760 0x30, 0x82, 0x01, 0x56, 0x02, 0x01, 0x00, 0x30, 0x0D, 0x06, 0x09, 0x2A,
761 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82,
762 0x01, 0x40, 0x30, 0x82, 0x01, 0x3C, 0x02, 0x01, 0x00, 0x02, 0x41, 0x00,
763 0xBD, 0xC0, 0x7F, 0xEF, 0x75, 0x1D, 0x63, 0x2A, 0xD0, 0x9A, 0x26, 0xE5,
764 0x5B, 0xB9, 0x84, 0x7C, 0xE5, 0xC7, 0xE7, 0xDE, 0xFE, 0xB6, 0x54, 0xD9,
765 0xF0, 0x9B, 0xC2, 0xCF, 0x36, 0xDA, 0xE5, 0x4D, 0xC5, 0xD9, 0x25, 0x78,
766 0xBD, 0x55, 0x05, 0xBD, 0x86, 0xFB, 0x37, 0x15, 0x33, 0x42, 0x52, 0xED,
767 0xE5, 0xCD, 0xCB, 0xB7, 0xA2, 0x51, 0xFA, 0x36, 0xE9, 0x9C, 0x2E, 0x5D,
768 0xE3, 0xA5, 0x1F, 0x01, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x41, 0x00,
769 0x96, 0x71, 0xDE, 0xBD, 0x83, 0x94, 0x96, 0x40, 0xA6, 0xFD, 0xE1, 0xA2,
770 0xED, 0xD3, 0xAC, 0x28, 0xBE, 0xA2, 0x7D, 0xC3, 0xFF, 0x1D, 0x9F, 0x2E,
771 0xE0, 0xA7, 0x0E, 0x90, 0xEE, 0x44, 0x25, 0x92, 0xE3, 0x54, 0xDD, 0x55,
772 0xA3, 0xEF, 0x42, 0xF5, 0x52, 0x55, 0x41, 0x47, 0x5E, 0x00, 0xFB, 0x8B,
773 0x47, 0x5E, 0x45, 0x49, 0xEA, 0x3D, 0x2C, 0xFD, 0x9F, 0xEC, 0xC8, 0x4E,
774 0x4E, 0x86, 0x90, 0x31, 0x02, 0x21, 0x00, 0xE6, 0xA5, 0x55, 0xB3, 0x64,
775 0xAB, 0x90, 0x5E, 0xA2, 0xF5, 0x6B, 0x21, 0x4B, 0x15, 0xD6, 0x4A, 0xB6,
776 0x60, 0x24, 0x95, 0x65, 0xA2, 0xBE, 0xBA, 0x2A, 0x73, 0xFB, 0xFF, 0x2C,
777 0x61, 0x88, 0x9D, 0x02, 0x21, 0x00, 0xD2, 0x9C, 0x5B, 0xFE, 0x82, 0xA5,
778 0xFC, 0x52, 0x6A, 0x29, 0x38, 0xDB, 0x22, 0x3B, 0xEB, 0x74, 0x3B, 0xCA,
779 0xB4, 0xDD, 0x1D, 0xE4, 0x48, 0x60, 0x70, 0x19, 0x9B, 0x81, 0xC1, 0x83,
780 0x28, 0xB5, 0x02, 0x21, 0x00, 0x89, 0x2D, 0xFE, 0xF9, 0xF2, 0xBF, 0x43,
781 0xDF, 0xB5, 0xA6, 0xA8, 0x30, 0x26, 0x1B, 0x77, 0xD7, 0xF9, 0xFE, 0xD6,
782 0xE3, 0x70, 0x8E, 0xCA, 0x47, 0xA9, 0xA6, 0x50, 0x54, 0x25, 0xCE, 0x60,
783 0xD5, 0x02, 0x21, 0x00, 0xBE, 0x5A, 0xF8, 0x82, 0xE6, 0xCE, 0xE3, 0x6A,
784 0x11, 0xED, 0xC4, 0x27, 0xBB, 0x9F, 0x70, 0xC6, 0x93, 0xAC, 0x39, 0x20,
785 0x89, 0x7D, 0xE5, 0x34, 0xD4, 0xDD, 0x30, 0x42, 0x6D, 0x07, 0x00, 0xE9,
786 0x02, 0x20, 0x05, 0x91, 0xEF, 0x12, 0xD2, 0xD3, 0x6A, 0xD2, 0x96, 0x6B,
787 0x10, 0x62, 0xF9, 0xBA, 0xA4, 0x91, 0x48, 0x84, 0x40, 0x61, 0x67, 0x80,
788 0x68, 0x68, 0xC8, 0x60, 0xB3, 0x66, 0xC8, 0xF9, 0x08, 0x9A,
789 };
790
791 /*
792 * DER-encoded PKCS#8 format EC key. Generated using:
793 *
794 * openssl ecparam -name prime256v1 -genkey -noout | openssl pkcs8 -topk8 -nocrypt -outform der | recode ../x1
795 */
796 static uint8_t TEST_SIGN_EC_KEY_1[] = {
797 0x30, 0x81, 0x87, 0x02, 0x01, 0x00, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86,
798 0x48, 0xCE, 0x3D, 0x02, 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D,
799 0x03, 0x01, 0x07, 0x04, 0x6D, 0x30, 0x6B, 0x02, 0x01, 0x01, 0x04, 0x20,
800 0x9E, 0x66, 0x11, 0x6A, 0x89, 0xF5, 0x78, 0x57, 0xF3, 0x35, 0xA2, 0x46,
801 0x09, 0x06, 0x4B, 0x4D, 0x81, 0xEC, 0xD3, 0x9B, 0x0A, 0xC4, 0x68, 0x06,
802 0xB8, 0x42, 0x24, 0x5E, 0x74, 0x2C, 0x62, 0x79, 0xA1, 0x44, 0x03, 0x42,
803 0x00, 0x04, 0x35, 0xB5, 0x9A, 0x5C, 0xE5, 0x52, 0x35, 0xF2, 0x10, 0x6C,
804 0xD9, 0x98, 0x67, 0xED, 0x5E, 0xCB, 0x6B, 0xB8, 0x96, 0x5E, 0x54, 0x7C,
805 0x34, 0x2A, 0xA3, 0x3B, 0xF3, 0xD1, 0x39, 0x48, 0x36, 0x7A, 0xEA, 0xD8,
806 0xCA, 0xDD, 0x40, 0x8F, 0xE9, 0xE0, 0x95, 0x2E, 0x3F, 0x95, 0x0F, 0x14,
807 0xD6, 0x14, 0x78, 0xB5, 0xAD, 0x17, 0xD2, 0x5A, 0x41, 0x96, 0x99, 0x20,
808 0xC7, 0x5B, 0x0F, 0x60, 0xFD, 0xBA
809 };
810
811 /*
812 * PKCS#1 v1.5 padded raw "Hello, world" Can be generated be generated by verifying
813 * the signature below in no padding mode:
814 *
815 * openssl rsautl -keyform der -inkey rsa.der -raw -verify -in test.sig
816 */
817 static uint8_t TEST_SIGN_DATA_1[] = {
818 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
819 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
820 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
821 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
822 0xFF, 0xFF, 0xFF, 0x00, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x2C, 0x20, 0x77,
823 0x6F, 0x72, 0x6C, 0x64,
824 };
825
826 /*
827 * Signature of TEST_SIGN_DATA_1 using TEST_SIGN_RSA_KEY_1. Generated using:
828 *
829 * echo 'Hello, world' | openssl rsautl -keyform der -inkey rsa.der -sign | recode ../x1
830 */
831 static uint8_t TEST_SIGN_RSA_SIGNATURE_1[] = {
832 0xA4, 0xBB, 0x76, 0x87, 0xFE, 0x61, 0x0C, 0x9D, 0xD6, 0xFF, 0x4B, 0x76,
833 0x96, 0x08, 0x36, 0x23, 0x11, 0xC6, 0x44, 0x3F, 0x88, 0x77, 0x97, 0xB2,
834 0xA8, 0x3B, 0xFB, 0x9C, 0x3C, 0xD3, 0x20, 0x65, 0xFD, 0x26, 0x3B, 0x2A,
835 0xB8, 0xB6, 0xD4, 0xDC, 0x91, 0xF7, 0xE2, 0xDE, 0x4D, 0xF7, 0x0E, 0xB9,
836 0x72, 0xA7, 0x29, 0x72, 0x82, 0x12, 0x7C, 0x53, 0x23, 0x21, 0xC4, 0xFF,
837 0x79, 0xE4, 0x91, 0x40,
838 };
839
840 /*
841 * Identical to TEST_SIGN_RSA_SIGNATURE_1 except the last octet is '1' instead of '0'
842 * This should fail any test.
843 */
844 static uint8_t TEST_SIGN_SIGNATURE_BOGUS_1[] = {
845 0xA4, 0xBB, 0x76, 0x87, 0xFE, 0x61, 0x0C, 0x9D, 0xD6, 0xFF, 0x4B, 0x76,
846 0x96, 0x08, 0x36, 0x23, 0x11, 0xC6, 0x44, 0x3F, 0x88, 0x77, 0x97, 0xB2,
847 0xA8, 0x3B, 0xFB, 0x9C, 0x3C, 0xD3, 0x20, 0x65, 0xFD, 0x26, 0x3B, 0x2A,
848 0xB8, 0xB6, 0xD4, 0xDC, 0x91, 0xF7, 0xE2, 0xDE, 0x4D, 0xF7, 0x0E, 0xB9,
849 0x72, 0xA7, 0x29, 0x72, 0x82, 0x12, 0x7C, 0x53, 0x23, 0x21, 0xC4, 0xFF,
850 0x79, 0xE4, 0x91, 0x41,
851 };
852
TEST_F(KeymasterTest,SignData_RSA_Raw_Success)853 TEST_F(KeymasterTest, SignData_RSA_Raw_Success) {
854 uint8_t* key_blob;
855 size_t key_blob_length;
856
857 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
858 ASSERT_TRUE(testKey.get() != NULL);
859
860 ASSERT_EQ(0,
861 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
862 &key_blob, &key_blob_length))
863 << "Should successfully import an RSA key";
864 UniqueKey key(&sDevice, key_blob, key_blob_length);
865
866 keymaster_rsa_sign_params_t params = {
867 .digest_type = DIGEST_NONE,
868 .padding_type = PADDING_NONE,
869 };
870
871 uint8_t* sig;
872 size_t sig_length;
873
874 UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
875 ASSERT_TRUE(testData.get() != NULL);
876
877 ASSERT_EQ(0,
878 sDevice->sign_data(sDevice, ¶ms, key_blob, key_blob_length,
879 testData.get(), testData.length(),
880 &sig, &sig_length))
881 << "Should sign data successfully";
882 UniqueBlob sig_blob(sig, sig_length);
883
884 UniqueBlob expected_sig(TEST_SIGN_RSA_SIGNATURE_1, sizeof(TEST_SIGN_RSA_SIGNATURE_1));
885
886 ASSERT_EQ(expected_sig, sig_blob)
887 << "Generated signature should match expected signature";
888
889 // The expected signature is actually stack data, so don't let it try to free.
890 uint8_t* unused __attribute__((unused)) = expected_sig.release();
891 }
892
TEST_F(KeymasterTest,SignData_EC_Success)893 TEST_F(KeymasterTest, SignData_EC_Success) {
894 uint8_t* key_blob;
895 size_t key_blob_length;
896
897 UniqueReadOnlyBlob testKey(TEST_SIGN_EC_KEY_1, sizeof(TEST_SIGN_EC_KEY_1));
898 ASSERT_TRUE(testKey.get() != NULL);
899
900 ASSERT_EQ(0,
901 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
902 &key_blob, &key_blob_length))
903 << "Should successfully import an EC key";
904 UniqueKey key(&sDevice, key_blob, key_blob_length);
905
906 keymaster_ec_sign_params_t params = {
907 .digest_type = DIGEST_NONE,
908 };
909
910 uint8_t* sig;
911 size_t sig_length;
912
913 UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
914 ASSERT_TRUE(testData.get() != NULL);
915
916 ASSERT_EQ(0,
917 sDevice->sign_data(sDevice, ¶ms, key_blob, key_blob_length,
918 testData.get(), testData.length(),
919 &sig, &sig_length))
920 << "Should sign data successfully";
921 UniqueBlob sig_blob(sig, sig_length);
922
923 uint8_t* x509_data;
924 size_t x509_data_length;
925 ASSERT_EQ(0,
926 sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
927 &x509_data, &x509_data_length))
928 << "Should be able to retrieve RSA public key successfully";
929 UniqueBlob x509_blob(x509_data, x509_data_length);
930
931 const unsigned char *tmp = static_cast<const unsigned char*>(x509_blob.get());
932 Unique_EVP_PKEY expected(d2i_PUBKEY((EVP_PKEY**) NULL, &tmp,
933 static_cast<long>(x509_blob.length())));
934
935 Unique_EC_KEY ecKey(EVP_PKEY_get1_EC_KEY(expected.get()));
936
937 ASSERT_EQ(1, ECDSA_verify(0, testData.get(), testData.length(), sig_blob.get(), sig_blob.length(), ecKey.get()))
938 << "Signature should verify";
939 }
940
TEST_F(KeymasterTest,SignData_RSA_Raw_InvalidSizeInput_Failure)941 TEST_F(KeymasterTest, SignData_RSA_Raw_InvalidSizeInput_Failure) {
942 uint8_t* key_blob;
943 size_t key_blob_length;
944
945 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
946 ASSERT_TRUE(testKey.get() != NULL);
947
948 ASSERT_EQ(0,
949 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
950 &key_blob, &key_blob_length))
951 << "Should successfully import an RSA key";
952 UniqueKey key(&sDevice, key_blob, key_blob_length);
953
954 keymaster_rsa_sign_params_t params = {
955 .digest_type = DIGEST_NONE,
956 .padding_type = PADDING_NONE,
957 };
958
959 uint8_t* sig;
960 size_t sig_length;
961
962 UniqueReadOnlyBlob testData(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
963 ASSERT_TRUE(testData.get() != NULL);
964
965 ASSERT_EQ(-1,
966 sDevice->sign_data(sDevice, ¶ms, key_blob, key_blob_length,
967 testData.get(), testData.length(),
968 &sig, &sig_length))
969 << "Should not be able to do raw signature on incorrect size data";
970 }
971
TEST_F(KeymasterTest,SignData_RSA_Raw_NullKey_Failure)972 TEST_F(KeymasterTest, SignData_RSA_Raw_NullKey_Failure) {
973 keymaster_rsa_sign_params_t params = {
974 .digest_type = DIGEST_NONE,
975 .padding_type = PADDING_NONE,
976 };
977
978 uint8_t* sig;
979 size_t sig_length;
980
981 UniqueReadOnlyBlob testData(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
982 ASSERT_TRUE(testData.get() != NULL);
983
984 ASSERT_EQ(-1,
985 sDevice->sign_data(sDevice, ¶ms, NULL, 0,
986 testData.get(), testData.length(),
987 &sig, &sig_length))
988 << "Should not be able to do raw signature on incorrect size data";
989 }
990
TEST_F(KeymasterTest,SignData_RSA_Raw_NullInput_Failure)991 TEST_F(KeymasterTest, SignData_RSA_Raw_NullInput_Failure) {
992 uint8_t* key_blob;
993 size_t key_blob_length;
994
995 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
996 ASSERT_TRUE(testKey.get() != NULL);
997
998 ASSERT_EQ(0,
999 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
1000 &key_blob, &key_blob_length))
1001 << "Should successfully import an RSA key";
1002 UniqueKey key(&sDevice, key_blob, key_blob_length);
1003
1004 keymaster_rsa_sign_params_t params = {
1005 .digest_type = DIGEST_NONE,
1006 .padding_type = PADDING_NONE,
1007 };
1008
1009 uint8_t* sig;
1010 size_t sig_length;
1011
1012 ASSERT_EQ(-1,
1013 sDevice->sign_data(sDevice, ¶ms, key_blob, key_blob_length,
1014 NULL, 0,
1015 &sig, &sig_length))
1016 << "Should error when input data is null";
1017 }
1018
TEST_F(KeymasterTest,SignData_RSA_Raw_NullOutput_Failure)1019 TEST_F(KeymasterTest, SignData_RSA_Raw_NullOutput_Failure) {
1020 uint8_t* key_blob;
1021 size_t key_blob_length;
1022
1023 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
1024 ASSERT_TRUE(testKey.get() != NULL);
1025
1026 ASSERT_EQ(0,
1027 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
1028 &key_blob, &key_blob_length))
1029 << "Should successfully import an RSA key";
1030 UniqueKey key(&sDevice, key_blob, key_blob_length);
1031
1032 keymaster_rsa_sign_params_t params = {
1033 .digest_type = DIGEST_NONE,
1034 .padding_type = PADDING_NONE,
1035 };
1036
1037 uint8_t* sig;
1038 size_t sig_length;
1039
1040 UniqueReadOnlyBlob testData(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
1041 ASSERT_TRUE(testData.get() != NULL);
1042
1043 ASSERT_EQ(-1,
1044 sDevice->sign_data(sDevice, ¶ms, key_blob, key_blob_length,
1045 testData.get(), testData.length(),
1046 NULL, NULL))
1047 << "Should error when output is null";
1048 }
1049
TEST_F(KeymasterTest,VerifyData_RSA_Raw_Success)1050 TEST_F(KeymasterTest, VerifyData_RSA_Raw_Success) {
1051 uint8_t* key_blob;
1052 size_t key_blob_length;
1053
1054 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
1055 ASSERT_TRUE(testKey.get() != NULL);
1056
1057 ASSERT_EQ(0,
1058 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
1059 &key_blob, &key_blob_length))
1060 << "Should successfully import an RSA key";
1061 UniqueKey key(&sDevice, key_blob, key_blob_length);
1062
1063 keymaster_rsa_sign_params_t params = {
1064 .digest_type = DIGEST_NONE,
1065 .padding_type = PADDING_NONE,
1066 };
1067
1068 UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
1069 ASSERT_TRUE(testData.get() != NULL);
1070
1071 UniqueReadOnlyBlob testSig(TEST_SIGN_RSA_SIGNATURE_1, sizeof(TEST_SIGN_RSA_SIGNATURE_1));
1072 ASSERT_TRUE(testSig.get() != NULL);
1073
1074 ASSERT_EQ(0,
1075 sDevice->verify_data(sDevice, ¶ms, key_blob, key_blob_length,
1076 testData.get(), testData.length(),
1077 testSig.get(), testSig.length()))
1078 << "Should verify data successfully";
1079 }
1080
TEST_F(KeymasterTest,VerifyData_EC_Raw_Success)1081 TEST_F(KeymasterTest, VerifyData_EC_Raw_Success) {
1082 uint8_t* key_blob;
1083 size_t key_blob_length;
1084
1085 UniqueReadOnlyBlob testKey(TEST_SIGN_EC_KEY_1, sizeof(TEST_SIGN_EC_KEY_1));
1086 ASSERT_TRUE(testKey.get() != NULL);
1087
1088 ASSERT_EQ(0,
1089 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
1090 &key_blob, &key_blob_length))
1091 << "Should successfully import an RSA key";
1092 UniqueKey key(&sDevice, key_blob, key_blob_length);
1093
1094 keymaster_ec_sign_params_t params = {
1095 .digest_type = DIGEST_NONE,
1096 };
1097
1098 uint8_t* sig;
1099 size_t sig_length;
1100
1101 UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
1102 ASSERT_TRUE(testData.get() != NULL);
1103
1104 ASSERT_EQ(0,
1105 sDevice->sign_data(sDevice, ¶ms, key_blob, key_blob_length,
1106 testData.get(), testData.length(),
1107 &sig, &sig_length))
1108 << "Should sign data successfully";
1109 UniqueBlob sig_blob(sig, sig_length);
1110
1111 ASSERT_EQ(0,
1112 sDevice->verify_data(sDevice, ¶ms, key_blob, key_blob_length,
1113 testData.get(), testData.length(),
1114 sig_blob.get(), sig_blob.length()))
1115 << "Should verify data successfully";
1116 }
1117
TEST_F(KeymasterTest,VerifyData_RSA_Raw_BadSignature_Failure)1118 TEST_F(KeymasterTest, VerifyData_RSA_Raw_BadSignature_Failure) {
1119 uint8_t* key_blob;
1120 size_t key_blob_length;
1121
1122 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
1123 ASSERT_TRUE(testKey.get() != NULL);
1124
1125 ASSERT_EQ(0,
1126 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
1127 &key_blob, &key_blob_length))
1128 << "Should successfully import an RSA key";
1129 UniqueKey key(&sDevice, key_blob, key_blob_length);
1130
1131 keymaster_rsa_sign_params_t params = {
1132 .digest_type = DIGEST_NONE,
1133 .padding_type = PADDING_NONE,
1134 };
1135
1136 ASSERT_EQ(-1,
1137 sDevice->verify_data(sDevice, ¶ms, key_blob, key_blob_length,
1138 TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1),
1139 TEST_SIGN_SIGNATURE_BOGUS_1, sizeof(TEST_SIGN_SIGNATURE_BOGUS_1)))
1140 << "Should sign data successfully";
1141 }
1142
TEST_F(KeymasterTest,VerifyData_EC_Raw_BadSignature_Failure)1143 TEST_F(KeymasterTest, VerifyData_EC_Raw_BadSignature_Failure) {
1144 uint8_t* key_blob;
1145 size_t key_blob_length;
1146
1147 UniqueReadOnlyBlob testKey(TEST_SIGN_EC_KEY_1, sizeof(TEST_SIGN_EC_KEY_1));
1148 ASSERT_TRUE(testKey.get() != NULL);
1149
1150 ASSERT_EQ(0,
1151 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
1152 &key_blob, &key_blob_length))
1153 << "Should successfully import an RSA key";
1154 UniqueKey key(&sDevice, key_blob, key_blob_length);
1155
1156 keymaster_ec_sign_params_t params = {
1157 .digest_type = DIGEST_NONE,
1158 };
1159
1160 ASSERT_EQ(-1,
1161 sDevice->verify_data(sDevice, ¶ms, key_blob, key_blob_length,
1162 TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1),
1163 TEST_SIGN_SIGNATURE_BOGUS_1, sizeof(TEST_SIGN_SIGNATURE_BOGUS_1)))
1164 << "Should sign data successfully";
1165 }
1166
TEST_F(KeymasterTest,VerifyData_RSA_Raw_NullKey_Failure)1167 TEST_F(KeymasterTest, VerifyData_RSA_Raw_NullKey_Failure) {
1168 keymaster_rsa_sign_params_t params = {
1169 .digest_type = DIGEST_NONE,
1170 .padding_type = PADDING_NONE,
1171 };
1172
1173 UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
1174 ASSERT_TRUE(testData.get() != NULL);
1175
1176 UniqueReadOnlyBlob testSig(TEST_SIGN_SIGNATURE_BOGUS_1, sizeof(TEST_SIGN_SIGNATURE_BOGUS_1));
1177 ASSERT_TRUE(testSig.get() != NULL);
1178
1179 ASSERT_EQ(-1,
1180 sDevice->verify_data(sDevice, ¶ms, NULL, 0,
1181 testData.get(), testData.length(),
1182 testSig.get(), testSig.length()))
1183 << "Should fail when key is null";
1184 }
1185
TEST_F(KeymasterTest,VerifyData_RSA_NullInput_Failure)1186 TEST_F(KeymasterTest, VerifyData_RSA_NullInput_Failure) {
1187 uint8_t* key_blob;
1188 size_t key_blob_length;
1189
1190 ASSERT_EQ(0,
1191 sDevice->import_keypair(sDevice, TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1),
1192 &key_blob, &key_blob_length))
1193 << "Should successfully import an RSA key";
1194 UniqueKey key(&sDevice, key_blob, key_blob_length);
1195
1196 keymaster_rsa_sign_params_t params = {
1197 .digest_type = DIGEST_NONE,
1198 .padding_type = PADDING_NONE,
1199 };
1200
1201 UniqueReadOnlyBlob testSig(TEST_SIGN_RSA_SIGNATURE_1, sizeof(TEST_SIGN_RSA_SIGNATURE_1));
1202 ASSERT_TRUE(testSig.get() != NULL);
1203
1204 ASSERT_EQ(-1,
1205 sDevice->verify_data(sDevice, ¶ms, key_blob, key_blob_length,
1206 NULL, 0,
1207 testSig.get(), testSig.length()))
1208 << "Should fail on null input";
1209 }
1210
TEST_F(KeymasterTest,VerifyData_RSA_NullSignature_Failure)1211 TEST_F(KeymasterTest, VerifyData_RSA_NullSignature_Failure) {
1212 uint8_t* key_blob;
1213 size_t key_blob_length;
1214
1215 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
1216 ASSERT_TRUE(testKey.get() != NULL);
1217
1218 ASSERT_EQ(0,
1219 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
1220 &key_blob, &key_blob_length))
1221 << "Should successfully import an RSA key";
1222 UniqueKey key(&sDevice, key_blob, key_blob_length);
1223
1224 keymaster_rsa_sign_params_t params = {
1225 .digest_type = DIGEST_NONE,
1226 .padding_type = PADDING_NONE,
1227 };
1228
1229 UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
1230 ASSERT_TRUE(testData.get() != NULL);
1231
1232 ASSERT_EQ(-1,
1233 sDevice->verify_data(sDevice, ¶ms, key.get(), key.length(),
1234 testData.get(), testData.length(),
1235 NULL, 0))
1236 << "Should fail on null signature";
1237 }
1238
TEST_F(KeymasterTest,EraseAll_Success)1239 TEST_F(KeymasterTest, EraseAll_Success) {
1240 uint8_t *key1_blob, *key2_blob;
1241 size_t key1_blob_length, key2_blob_length;
1242
1243 // Only test this if the device says it supports delete_all
1244 if (sDevice->delete_all == NULL) {
1245 return;
1246 }
1247
1248 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
1249 ASSERT_TRUE(testKey.get() != NULL);
1250
1251 ASSERT_EQ(0,
1252 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
1253 &key1_blob, &key1_blob_length))
1254 << "Should successfully import an RSA key";
1255 UniqueKey key1(&sDevice, key1_blob, key1_blob_length);
1256
1257 UniqueReadOnlyBlob testKey2(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
1258 ASSERT_TRUE(testKey2.get() != NULL);
1259
1260 ASSERT_EQ(0,
1261 sDevice->import_keypair(sDevice, testKey2.get(), testKey2.length(),
1262 &key2_blob, &key2_blob_length))
1263 << "Should successfully import an RSA key";
1264 UniqueKey key2(&sDevice, key2_blob, key2_blob_length);
1265
1266 ASSERT_EQ(0, sDevice->delete_all(sDevice))
1267 << "Should erase all keys";
1268
1269 key1.reset();
1270
1271 uint8_t* x509_data;
1272 size_t x509_data_length;
1273 ASSERT_EQ(-1,
1274 sDevice->get_keypair_public(sDevice, key1_blob, key1_blob_length,
1275 &x509_data, &x509_data_length))
1276 << "Should be able to retrieve RSA public key 1 successfully";
1277
1278 ASSERT_EQ(-1,
1279 sDevice->get_keypair_public(sDevice, key2_blob, key2_blob_length,
1280 &x509_data, &x509_data_length))
1281 << "Should be able to retrieve RSA public key 2 successfully";
1282 }
1283
1284 }
1285