blob: e5e1dfd2232a9ce4d2e87b0d9a0a2d7b03cf17d3 [file] [log] [blame]
Kenny Root4fd0db72012-03-16 13:19:07 -07001/*
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
Kenny Rooteca8b3c2013-04-26 16:46:01 -070017#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>
Kenny Root4fd0db72012-03-16 13:19:07 -070023
Kenny Rooteca8b3c2013-04-26 16:46:01 -070024#include <fstream>
25#include <iostream>
Kenny Root4fd0db72012-03-16 13:19:07 -070026
27#include <gtest/gtest.h>
28
Kenny Root8467a6d2012-08-08 17:04:40 -070029#include <openssl/bn.h>
30#include <openssl/evp.h>
31#include <openssl/x509.h>
32
Kenny Rooteca8b3c2013-04-26 16:46:01 -070033#define LOG_TAG "keymaster_test"
34#include <utils/Log.h>
Kenny Roota4cef692013-09-11 14:51:09 -070035
36#include <UniquePtr.h>
Kenny Rooteca8b3c2013-04-26 16:46:01 -070037
Shawn Willden302d2522015-02-24 09:17:38 -070038#include <hardware/keymaster0.h>
Kenny Root4fd0db72012-03-16 13:19:07 -070039
40namespace android {
41
42class UniqueBlob : public UniquePtr<uint8_t[]> {
43public:
Kenny Rooteca8b3c2013-04-26 16:46:01 -070044 UniqueBlob(size_t length) :
45 mLength(length) {
46 }
47
Kenny Root4fd0db72012-03-16 13:19:07 -070048 UniqueBlob(uint8_t* bytes, size_t length) :
49 UniquePtr<uint8_t[]>(bytes), mLength(length) {
50 }
51
52 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
69 size_t length() const {
70 return mLength;
71 }
72
73 friend std::ostream &operator<<(std::ostream &stream, const UniqueBlob& blob);
74
75private:
76 size_t mLength;
77};
78
79std::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
93class UniqueKey : public UniqueBlob {
94public:
Shawn Willden302d2522015-02-24 09:17:38 -070095 UniqueKey(keymaster0_device_t** dev, uint8_t* bytes, size_t length) :
Kenny Root4fd0db72012-03-16 13:19:07 -070096 UniqueBlob(bytes, length), mDevice(dev) {
97 }
98
99 ~UniqueKey() {
100 if (mDevice != NULL && *mDevice != NULL) {
Shawn Willden302d2522015-02-24 09:17:38 -0700101 keymaster0_device_t* dev = *mDevice;
Kenny Root4fd0db72012-03-16 13:19:07 -0700102 if (dev->delete_keypair != NULL) {
103 dev->delete_keypair(dev, get(), length());
104 }
105 }
106 }
107
108private:
Shawn Willden302d2522015-02-24 09:17:38 -0700109 keymaster0_device_t** mDevice;
Kenny Root4fd0db72012-03-16 13:19:07 -0700110};
111
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700112class UniqueReadOnlyBlob {
113public:
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
144 ~UniqueReadOnlyBlob() {
145 munmap(mBuffer, mBufferSize);
146 }
147
148 uint8_t* get() const {
149 return mBuffer;
150 }
151
152 size_t length() const {
153 return mDataSize;
154 }
155
156private:
157 uint8_t* mBuffer;
158 size_t mBufferSize;
159 size_t mDataSize;
160};
161
Kenny Root8467a6d2012-08-08 17:04:40 -0700162struct BIGNUM_Delete {
163 void operator()(BIGNUM* p) const {
164 BN_free(p);
165 }
166};
167typedef UniquePtr<BIGNUM, BIGNUM_Delete> Unique_BIGNUM;
168
169struct EVP_PKEY_Delete {
170 void operator()(EVP_PKEY* p) const {
171 EVP_PKEY_free(p);
172 }
173};
174typedef UniquePtr<EVP_PKEY, EVP_PKEY_Delete> Unique_EVP_PKEY;
175
176struct PKCS8_PRIV_KEY_INFO_Delete {
177 void operator()(PKCS8_PRIV_KEY_INFO* p) const {
178 PKCS8_PRIV_KEY_INFO_free(p);
179 }
180};
181typedef UniquePtr<PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO_Delete> Unique_PKCS8_PRIV_KEY_INFO;
182
183struct RSA_Delete {
184 void operator()(RSA* p) const {
185 RSA_free(p);
186 }
187};
188typedef UniquePtr<RSA, RSA_Delete> Unique_RSA;
189
Kenny Root6e1683f2013-08-19 09:51:35 -0700190struct EC_KEY_Delete {
191 void operator()(EC_KEY* p) const {
192 EC_KEY_free(p);
193 }
194};
195typedef UniquePtr<EC_KEY, EC_KEY_Delete> Unique_EC_KEY;
196
197
Kenny Root4fd0db72012-03-16 13:19:07 -0700198/*
199 * DER-encoded PKCS#8 format RSA key. Generated using:
200 *
201 * openssl genrsa 2048 | openssl pkcs8 -topk8 -nocrypt -outform der | recode ../x1
202 */
Kenny Root6e1683f2013-08-19 09:51:35 -0700203static uint8_t TEST_RSA_KEY_1[] = {
Kenny Root4fd0db72012-03-16 13:19:07 -0700204 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/*
Kenny Root6e1683f2013-08-19 09:51:35 -0700309 * 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 */
313static 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/*
Kenny Root4fd0db72012-03-16 13:19:07 -0700330 * Generated using keys on the keyboard and lack of imagination.
331 */
332static unsigned char BOGUS_KEY_1[] = { 0xFF, 0xFF, 0xFF, 0xFF };
333
334
Kenny Root8467a6d2012-08-08 17:04:40 -0700335class KeymasterBaseTest : public ::testing::Test {
336public:
Kenny Root4fd0db72012-03-16 13:19:07 -0700337 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
Shawn Willden302d2522015-02-24 09:17:38 -0700344 ASSERT_EQ(0, keymaster0_open(mod, &sDevice))
Kenny Root4fd0db72012-03-16 13:19:07 -0700345 << "Should be able to open the keymaster device";
346
Kenny Root36ab8ed2013-09-04 22:17:56 -0700347 ASSERT_EQ(KEYMASTER_MODULE_API_VERSION_0_2, mod->module_api_version)
Kenny Root6e1683f2013-08-19 09:51:35 -0700348 << "Keymaster should implement API version 2";
349
Kenny Root4fd0db72012-03-16 13:19:07 -0700350 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
366 static void TearDownTestCase() {
Shawn Willden302d2522015-02-24 09:17:38 -0700367 ASSERT_EQ(0, keymaster0_close(sDevice));
Kenny Root4fd0db72012-03-16 13:19:07 -0700368 }
369
Kenny Root8467a6d2012-08-08 17:04:40 -0700370protected:
Shawn Willden302d2522015-02-24 09:17:38 -0700371 static keymaster0_device_t* sDevice;
Kenny Root4fd0db72012-03-16 13:19:07 -0700372};
373
Shawn Willden302d2522015-02-24 09:17:38 -0700374keymaster0_device_t* KeymasterBaseTest::sDevice = NULL;
Kenny Root4fd0db72012-03-16 13:19:07 -0700375
Kenny Root8467a6d2012-08-08 17:04:40 -0700376class KeymasterTest : public KeymasterBaseTest {
377};
378
Kenny Root6e1683f2013-08-19 09:51:35 -0700379class KeymasterAllTypesTest : public KeymasterBaseTest,
380 public ::testing::WithParamInterface<keymaster_keypair_t> {
381};
382
383class KeymasterGenerateRSATest : public KeymasterBaseTest,
Kenny Root8467a6d2012-08-08 17:04:40 -0700384 public ::testing::WithParamInterface<uint32_t> {
385};
386
Kenny Root6e1683f2013-08-19 09:51:35 -0700387class KeymasterGenerateDSATest : public KeymasterBaseTest,
388 public ::testing::WithParamInterface<uint32_t> {
389};
390
391class KeymasterGenerateECTest : public KeymasterBaseTest,
392 public ::testing::WithParamInterface<uint32_t> {
393};
394
395TEST_P(KeymasterGenerateRSATest, GenerateKeyPair_RSA_Success) {
Kenny Root4fd0db72012-03-16 13:19:07 -0700396 keymaster_keypair_t key_type = TYPE_RSA;
397 keymaster_rsa_keygen_params_t params = {
Kenny Root8467a6d2012-08-08 17:04:40 -0700398 modulus_size: GetParam(),
399 public_exponent: RSA_F4,
Kenny Root4fd0db72012-03-16 13:19:07 -0700400 };
401
402 uint8_t* key_blob;
403 size_t key_blob_length;
404
Kenny Root139d44f2012-11-20 14:37:40 -0800405 ASSERT_EQ(0,
Kenny Root4fd0db72012-03-16 13:19:07 -0700406 sDevice->generate_keypair(sDevice, key_type, &params, &key_blob, &key_blob_length))
Kenny Root6e1683f2013-08-19 09:51:35 -0700407 << "Should generate an RSA key with " << GetParam() << " bit modulus size";
Kenny Root4fd0db72012-03-16 13:19:07 -0700408 UniqueKey key(&sDevice, key_blob, key_blob_length);
Kenny Root4fd0db72012-03-16 13:19:07 -0700409
Kenny Root8467a6d2012-08-08 17:04:40 -0700410 uint8_t* x509_data = NULL;
411 size_t x509_data_length;
Kenny Root139d44f2012-11-20 14:37:40 -0800412 ASSERT_EQ(0,
Kenny Root8467a6d2012-08-08 17:04:40 -0700413 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
Kenny Root139d44f2012-11-20 14:37:40 -0800431 ASSERT_EQ(static_cast<unsigned long>(RSA_F4), BN_get_word(rsa.get()->e))
Kenny Root8467a6d2012-08-08 17:04:40 -0700432 << "Exponent should be RSA_F4";
433
Kenny Root6e1683f2013-08-19 09:51:35 -0700434 ASSERT_EQ((GetParam() + 7) / 8, static_cast<uint32_t>(RSA_size(rsa.get())))
Kenny Root8467a6d2012-08-08 17:04:40 -0700435 << "Modulus size should be the specified parameter";
Kenny Root4fd0db72012-03-16 13:19:07 -0700436}
437
Kenny Root8467a6d2012-08-08 17:04:40 -0700438INSTANTIATE_TEST_CASE_P(RSA,
Kenny Root6e1683f2013-08-19 09:51:35 -0700439 KeymasterGenerateRSATest,
Brian Carlstrom63b64332013-05-14 15:20:28 -0700440 ::testing::Values(512U, 1024U, 2048U, 3072U, 4096U));
Kenny Root4fd0db72012-03-16 13:19:07 -0700441
Kenny Root6e1683f2013-08-19 09:51:35 -0700442
443TEST_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, &params, &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
485INSTANTIATE_TEST_CASE_P(EC,
486 KeymasterGenerateECTest,
487 ::testing::Values(192U, 224U, 256U, 384U, 521U));
488
489
490TEST_P(KeymasterAllTypesTest, GenerateKeyPair_NullParams_Failure) {
491 keymaster_keypair_t key_type = GetParam();
Kenny Root4fd0db72012-03-16 13:19:07 -0700492
493 uint8_t* key_blob;
494 size_t key_blob_length;
495
Kenny Root139d44f2012-11-20 14:37:40 -0800496 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -0700497 sDevice->generate_keypair(sDevice, key_type, NULL, &key_blob, &key_blob_length))
Kenny Root6e1683f2013-08-19 09:51:35 -0700498 << "Should not be able to generate a key with null params";
Kenny Root4fd0db72012-03-16 13:19:07 -0700499}
500
Kenny Root6e1683f2013-08-19 09:51:35 -0700501INSTANTIATE_TEST_CASE_P(Types,
502 KeymasterAllTypesTest,
503 ::testing::Values(TYPE_RSA, TYPE_DSA, TYPE_EC));
504
Kenny Root4fd0db72012-03-16 13:19:07 -0700505TEST_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
Kenny Root139d44f2012-11-20 14:37:40 -0800511 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -0700512 sDevice->generate_keypair(sDevice, key_type, NULL, &key_blob, &key_blob_length))
513 << "Should not generate an unknown key type";
514}
515
516TEST_F(KeymasterTest, ImportKeyPair_RSA_Success) {
517 uint8_t* key_blob;
518 size_t key_blob_length;
519
Kenny Root139d44f2012-11-20 14:37:40 -0800520 ASSERT_EQ(0,
Kenny Root6e1683f2013-08-19 09:51:35 -0700521 sDevice->import_keypair(sDevice, TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1),
Kenny Root4fd0db72012-03-16 13:19:07 -0700522 &key_blob, &key_blob_length))
523 << "Should successfully import an RSA key";
524 UniqueKey key(&sDevice, key_blob, key_blob_length);
Kenny Root8467a6d2012-08-08 17:04:40 -0700525
526 uint8_t* x509_data;
527 size_t x509_data_length;
Kenny Root139d44f2012-11-20 14:37:40 -0800528 ASSERT_EQ(0,
Kenny Root8467a6d2012-08-08 17:04:40 -0700529 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
Kenny Root139d44f2012-11-20 14:37:40 -0800538 ASSERT_EQ(EVP_PKEY_type(actual.get()->type), EVP_PKEY_RSA)
Kenny Root8467a6d2012-08-08 17:04:40 -0700539 << "Generated key type should be of type RSA";
540
Kenny Root6e1683f2013-08-19 09:51:35 -0700541 const unsigned char *expectedTmp = static_cast<const unsigned char*>(TEST_RSA_KEY_1);
Kenny Root8467a6d2012-08-08 17:04:40 -0700542 Unique_PKCS8_PRIV_KEY_INFO expectedPkcs8(
543 d2i_PKCS8_PRIV_KEY_INFO((PKCS8_PRIV_KEY_INFO**) NULL, &expectedTmp,
Kenny Root6e1683f2013-08-19 09:51:35 -0700544 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
552TEST_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)));
Kenny Root8467a6d2012-08-08 17:04:40 -0700581
582 Unique_EVP_PKEY expected(EVP_PKCS82PKEY(expectedPkcs8.get()));
583
Kenny Root139d44f2012-11-20 14:37:40 -0800584 ASSERT_EQ(1, EVP_PKEY_cmp(expected.get(), actual.get()))
Kenny Root8467a6d2012-08-08 17:04:40 -0700585 << "Expected and actual keys should match";
Kenny Root4fd0db72012-03-16 13:19:07 -0700586}
587
588TEST_F(KeymasterTest, ImportKeyPair_BogusKey_Failure) {
589 uint8_t* key_blob;
590 size_t key_blob_length;
591
Kenny Root139d44f2012-11-20 14:37:40 -0800592 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -0700593 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
598TEST_F(KeymasterTest, ImportKeyPair_NullKey_Failure) {
599 uint8_t* key_blob;
600 size_t key_blob_length;
601
Kenny Root139d44f2012-11-20 14:37:40 -0800602 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -0700603 sDevice->import_keypair(sDevice, NULL, 0,
604 &key_blob, &key_blob_length))
605 << "Should not import a null key";
606}
607
608TEST_F(KeymasterTest, GetKeypairPublic_RSA_Success) {
609 uint8_t* key_blob;
610 size_t key_blob_length;
611
Kenny Root6e1683f2013-08-19 09:51:35 -0700612 UniqueReadOnlyBlob testKey(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700613 ASSERT_TRUE(testKey.get() != NULL);
614
Kenny Root4fd0db72012-03-16 13:19:07 -0700615 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700616 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700617 &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;
Kenny Root139d44f2012-11-20 14:37:40 -0800623 ASSERT_EQ(0,
Kenny Root4fd0db72012-03-16 13:19:07 -0700624 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
Kenny Root6e1683f2013-08-19 09:51:35 -0700630TEST_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
652TEST_F(KeymasterTest, GetKeypairPublic_NullKey_Failure) {
Kenny Root4fd0db72012-03-16 13:19:07 -0700653 uint8_t* key_blob;
654 size_t key_blob_length;
655
656 uint8_t* x509_data = NULL;
657 size_t x509_data_length;
Kenny Root139d44f2012-11-20 14:37:40 -0800658 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -0700659 sDevice->get_keypair_public(sDevice, NULL, 0,
660 &x509_data, &x509_data_length))
Kenny Root6e1683f2013-08-19 09:51:35 -0700661 << "Should not be able to retrieve public key from null key";
Kenny Root4fd0db72012-03-16 13:19:07 -0700662 UniqueBlob x509_blob(x509_data, x509_data_length);
663}
664
665TEST_F(KeymasterTest, GetKeypairPublic_RSA_NullDestination_Failure) {
666 uint8_t* key_blob;
667 size_t key_blob_length;
668
Kenny Root6e1683f2013-08-19 09:51:35 -0700669 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
684TEST_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));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700689 ASSERT_TRUE(testKey.get() != NULL);
690
Kenny Root4fd0db72012-03-16 13:19:07 -0700691 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700692 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700693 &key_blob, &key_blob_length))
694 << "Should successfully import an RSA key";
695 UniqueKey key(&sDevice, key_blob, key_blob_length);
696
Kenny Root139d44f2012-11-20 14:37:40 -0800697 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -0700698 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
703TEST_F(KeymasterTest, DeleteKeyPair_RSA_Success) {
704 uint8_t* key_blob;
705 size_t key_blob_length;
706
Kenny Root6e1683f2013-08-19 09:51:35 -0700707 UniqueReadOnlyBlob testKey(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700708 ASSERT_TRUE(testKey.get() != NULL);
709
Kenny Root139d44f2012-11-20 14:37:40 -0800710 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700711 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700712 &key_blob, &key_blob_length))
713 << "Should successfully import an RSA key";
714 UniqueKey key(&sDevice, key_blob, key_blob_length);
715}
716
717TEST_F(KeymasterTest, DeleteKeyPair_RSA_DoubleDelete_Failure) {
718 uint8_t* key_blob;
719 size_t key_blob_length;
720
Kenny Root6e1683f2013-08-19 09:51:35 -0700721 UniqueReadOnlyBlob testKey(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700722 ASSERT_TRUE(testKey.get() != NULL);
723
Kenny Root4fd0db72012-03-16 13:19:07 -0700724 /*
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,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700730 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700731 &key_blob, &key_blob_length))
732 << "Should successfully import an RSA key";
733 UniqueBlob blob(key_blob, key_blob_length);
734
Kenny Root139d44f2012-11-20 14:37:40 -0800735 ASSERT_EQ(0, sDevice->delete_keypair(sDevice, key_blob, key_blob_length))
Kenny Root4fd0db72012-03-16 13:19:07 -0700736 << "Should delete key after import";
737
Kenny Root139d44f2012-11-20 14:37:40 -0800738 ASSERT_EQ(-1, sDevice->delete_keypair(sDevice, key_blob, key_blob_length))
Kenny Root4fd0db72012-03-16 13:19:07 -0700739 << "Should not be able to delete key twice";
740 }
741}
742
743TEST_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) {
Kenny Root139d44f2012-11-20 14:37:40 -0800749 ASSERT_EQ(-1, sDevice->delete_keypair(sDevice, NULL, 0))
Kenny Root4fd0db72012-03-16 13:19:07 -0700750 << "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 */
Kenny Root6e1683f2013-08-19 09:51:35 -0700759static uint8_t TEST_SIGN_RSA_KEY_1[] = {
Kenny Root4fd0db72012-03-16 13:19:07 -0700760 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/*
Kenny Root6e1683f2013-08-19 09:51:35 -0700792 * 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 */
796static 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/*
Kenny Root4fd0db72012-03-16 13:19:07 -0700812 * 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 */
817static 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/*
Kenny Root6e1683f2013-08-19 09:51:35 -0700827 * Signature of TEST_SIGN_DATA_1 using TEST_SIGN_RSA_KEY_1. Generated using:
Kenny Root4fd0db72012-03-16 13:19:07 -0700828 *
829 * echo 'Hello, world' | openssl rsautl -keyform der -inkey rsa.der -sign | recode ../x1
830 */
Kenny Root6e1683f2013-08-19 09:51:35 -0700831static uint8_t TEST_SIGN_RSA_SIGNATURE_1[] = {
Kenny Root4fd0db72012-03-16 13:19:07 -0700832 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/*
Kenny Root6e1683f2013-08-19 09:51:35 -0700841 * Identical to TEST_SIGN_RSA_SIGNATURE_1 except the last octet is '1' instead of '0'
Kenny Root4fd0db72012-03-16 13:19:07 -0700842 * This should fail any test.
843 */
844static 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
853TEST_F(KeymasterTest, SignData_RSA_Raw_Success) {
854 uint8_t* key_blob;
855 size_t key_blob_length;
856
Kenny Root6e1683f2013-08-19 09:51:35 -0700857 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700858 ASSERT_TRUE(testKey.get() != NULL);
859
Kenny Root4fd0db72012-03-16 13:19:07 -0700860 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700861 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700862 &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
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700874 UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
875 ASSERT_TRUE(testData.get() != NULL);
876
Kenny Root139d44f2012-11-20 14:37:40 -0800877 ASSERT_EQ(0,
Kenny Root4fd0db72012-03-16 13:19:07 -0700878 sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700879 testData.get(), testData.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700880 &sig, &sig_length))
881 << "Should sign data successfully";
882 UniqueBlob sig_blob(sig, sig_length);
883
Kenny Root6e1683f2013-08-19 09:51:35 -0700884 UniqueBlob expected_sig(TEST_SIGN_RSA_SIGNATURE_1, sizeof(TEST_SIGN_RSA_SIGNATURE_1));
Kenny Root4fd0db72012-03-16 13:19:07 -0700885
Kenny Root139d44f2012-11-20 14:37:40 -0800886 ASSERT_EQ(expected_sig, sig_blob)
Kenny Root4fd0db72012-03-16 13:19:07 -0700887 << "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
Kenny Root6e1683f2013-08-19 09:51:35 -0700893TEST_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, &params, 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
Kenny Root4fd0db72012-03-16 13:19:07 -0700941TEST_F(KeymasterTest, SignData_RSA_Raw_InvalidSizeInput_Failure) {
942 uint8_t* key_blob;
943 size_t key_blob_length;
944
Kenny Root6e1683f2013-08-19 09:51:35 -0700945 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700946 ASSERT_TRUE(testKey.get() != NULL);
947
Kenny Root4fd0db72012-03-16 13:19:07 -0700948 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700949 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700950 &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
Kenny Root6e1683f2013-08-19 09:51:35 -0700962 UniqueReadOnlyBlob testData(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700963 ASSERT_TRUE(testData.get() != NULL);
964
Kenny Root139d44f2012-11-20 14:37:40 -0800965 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -0700966 sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700967 testData.get(), testData.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700968 &sig, &sig_length))
969 << "Should not be able to do raw signature on incorrect size data";
970}
971
972TEST_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
Kenny Root6e1683f2013-08-19 09:51:35 -0700981 UniqueReadOnlyBlob testData(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700982 ASSERT_TRUE(testData.get() != NULL);
983
Kenny Root139d44f2012-11-20 14:37:40 -0800984 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -0700985 sDevice->sign_data(sDevice, &params, NULL, 0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700986 testData.get(), testData.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700987 &sig, &sig_length))
988 << "Should not be able to do raw signature on incorrect size data";
989}
990
991TEST_F(KeymasterTest, SignData_RSA_Raw_NullInput_Failure) {
992 uint8_t* key_blob;
993 size_t key_blob_length;
994
Kenny Root6e1683f2013-08-19 09:51:35 -0700995 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700996 ASSERT_TRUE(testKey.get() != NULL);
997
Kenny Root4fd0db72012-03-16 13:19:07 -0700998 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700999 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -07001000 &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
Kenny Root139d44f2012-11-20 14:37:40 -08001012 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -07001013 sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
1014 NULL, 0,
1015 &sig, &sig_length))
1016 << "Should error when input data is null";
1017}
1018
1019TEST_F(KeymasterTest, SignData_RSA_Raw_NullOutput_Failure) {
1020 uint8_t* key_blob;
1021 size_t key_blob_length;
1022
Kenny Root6e1683f2013-08-19 09:51:35 -07001023 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001024 ASSERT_TRUE(testKey.get() != NULL);
1025
Kenny Root4fd0db72012-03-16 13:19:07 -07001026 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001027 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -07001028 &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
Kenny Root6e1683f2013-08-19 09:51:35 -07001040 UniqueReadOnlyBlob testData(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001041 ASSERT_TRUE(testData.get() != NULL);
1042
Kenny Root139d44f2012-11-20 14:37:40 -08001043 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -07001044 sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001045 testData.get(), testData.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -07001046 NULL, NULL))
1047 << "Should error when output is null";
1048}
1049
1050TEST_F(KeymasterTest, VerifyData_RSA_Raw_Success) {
1051 uint8_t* key_blob;
1052 size_t key_blob_length;
1053
Kenny Root6e1683f2013-08-19 09:51:35 -07001054 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001055 ASSERT_TRUE(testKey.get() != NULL);
1056
Kenny Root4fd0db72012-03-16 13:19:07 -07001057 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001058 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -07001059 &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
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001068 UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
1069 ASSERT_TRUE(testData.get() != NULL);
1070
Kenny Root6e1683f2013-08-19 09:51:35 -07001071 UniqueReadOnlyBlob testSig(TEST_SIGN_RSA_SIGNATURE_1, sizeof(TEST_SIGN_RSA_SIGNATURE_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001072 ASSERT_TRUE(testSig.get() != NULL);
1073
Kenny Root139d44f2012-11-20 14:37:40 -08001074 ASSERT_EQ(0,
Kenny Root4fd0db72012-03-16 13:19:07 -07001075 sDevice->verify_data(sDevice, &params, key_blob, key_blob_length,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001076 testData.get(), testData.length(),
1077 testSig.get(), testSig.length()))
Kenny Root4fd0db72012-03-16 13:19:07 -07001078 << "Should verify data successfully";
1079}
1080
Kenny Root6e1683f2013-08-19 09:51:35 -07001081TEST_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, &params, 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, &params, key_blob, key_blob_length,
1113 testData.get(), testData.length(),
1114 sig_blob.get(), sig_blob.length()))
1115 << "Should verify data successfully";
1116}
1117
Kenny Root4fd0db72012-03-16 13:19:07 -07001118TEST_F(KeymasterTest, VerifyData_RSA_Raw_BadSignature_Failure) {
1119 uint8_t* key_blob;
1120 size_t key_blob_length;
1121
Kenny Root6e1683f2013-08-19 09:51:35 -07001122 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001123 ASSERT_TRUE(testKey.get() != NULL);
1124
Kenny Root4fd0db72012-03-16 13:19:07 -07001125 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001126 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -07001127 &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
Kenny Root139d44f2012-11-20 14:37:40 -08001136 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -07001137 sDevice->verify_data(sDevice, &params, 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
Kenny Root6e1683f2013-08-19 09:51:35 -07001143TEST_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, &params, 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
Kenny Root4fd0db72012-03-16 13:19:07 -07001167TEST_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
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001173 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
Kenny Root139d44f2012-11-20 14:37:40 -08001179 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -07001180 sDevice->verify_data(sDevice, &params, NULL, 0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001181 testData.get(), testData.length(),
1182 testSig.get(), testSig.length()))
Kenny Root4fd0db72012-03-16 13:19:07 -07001183 << "Should fail when key is null";
1184}
1185
1186TEST_F(KeymasterTest, VerifyData_RSA_NullInput_Failure) {
1187 uint8_t* key_blob;
1188 size_t key_blob_length;
1189
1190 ASSERT_EQ(0,
Kenny Root6e1683f2013-08-19 09:51:35 -07001191 sDevice->import_keypair(sDevice, TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1),
Kenny Root4fd0db72012-03-16 13:19:07 -07001192 &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
Kenny Root6e1683f2013-08-19 09:51:35 -07001201 UniqueReadOnlyBlob testSig(TEST_SIGN_RSA_SIGNATURE_1, sizeof(TEST_SIGN_RSA_SIGNATURE_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001202 ASSERT_TRUE(testSig.get() != NULL);
1203
Kenny Root139d44f2012-11-20 14:37:40 -08001204 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -07001205 sDevice->verify_data(sDevice, &params, key_blob, key_blob_length,
1206 NULL, 0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001207 testSig.get(), testSig.length()))
Kenny Root4fd0db72012-03-16 13:19:07 -07001208 << "Should fail on null input";
1209}
1210
1211TEST_F(KeymasterTest, VerifyData_RSA_NullSignature_Failure) {
1212 uint8_t* key_blob;
1213 size_t key_blob_length;
1214
Kenny Root6e1683f2013-08-19 09:51:35 -07001215 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001216 ASSERT_TRUE(testKey.get() != NULL);
1217
Kenny Root4fd0db72012-03-16 13:19:07 -07001218 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001219 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -07001220 &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
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001229 UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
1230 ASSERT_TRUE(testData.get() != NULL);
1231
Kenny Root139d44f2012-11-20 14:37:40 -08001232 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -07001233 sDevice->verify_data(sDevice, &params, key.get(), key.length(),
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001234 testData.get(), testData.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -07001235 NULL, 0))
1236 << "Should fail on null signature";
1237}
1238
Kenny Root8ae65e72012-03-23 16:17:28 -07001239TEST_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
Kenny Root6e1683f2013-08-19 09:51:35 -07001248 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001249 ASSERT_TRUE(testKey.get() != NULL);
1250
Kenny Root8ae65e72012-03-23 16:17:28 -07001251 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001252 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root8ae65e72012-03-23 16:17:28 -07001253 &key1_blob, &key1_blob_length))
1254 << "Should successfully import an RSA key";
1255 UniqueKey key1(&sDevice, key1_blob, key1_blob_length);
1256
Kenny Root6e1683f2013-08-19 09:51:35 -07001257 UniqueReadOnlyBlob testKey2(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001258 ASSERT_TRUE(testKey2.get() != NULL);
1259
Kenny Root8ae65e72012-03-23 16:17:28 -07001260 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001261 sDevice->import_keypair(sDevice, testKey2.get(), testKey2.length(),
Kenny Root8ae65e72012-03-23 16:17:28 -07001262 &key2_blob, &key2_blob_length))
1263 << "Should successfully import an RSA key";
1264 UniqueKey key2(&sDevice, key2_blob, key2_blob_length);
1265
Kenny Root139d44f2012-11-20 14:37:40 -08001266 ASSERT_EQ(0, sDevice->delete_all(sDevice))
Kenny Root8ae65e72012-03-23 16:17:28 -07001267 << "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
Kenny Root4fd0db72012-03-16 13:19:07 -07001284}