blob: b3d3f3598513f7b13f0cb4ef436675ce2e1a0993 [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>
35#include <utils/UniquePtr.h>
36
37#include <hardware/keymaster.h>
Kenny Root4fd0db72012-03-16 13:19:07 -070038
39namespace android {
40
41class UniqueBlob : public UniquePtr<uint8_t[]> {
42public:
Kenny Rooteca8b3c2013-04-26 16:46:01 -070043 UniqueBlob(size_t length) :
44 mLength(length) {
45 }
46
Kenny Root4fd0db72012-03-16 13:19:07 -070047 UniqueBlob(uint8_t* bytes, size_t length) :
48 UniquePtr<uint8_t[]>(bytes), mLength(length) {
49 }
50
51 bool operator==(const UniqueBlob &other) const {
52 if (other.length() != mLength) {
53 return false;
54 }
55
56 const uint8_t* mine = get();
57 const uint8_t* theirs = other.get();
58
59 for (size_t i = 0; i < mLength; i++) {
60 if (mine[i] != theirs[i]) {
61 return false;
62 }
63 }
64
65 return true;
66 }
67
68 size_t length() const {
69 return mLength;
70 }
71
72 friend std::ostream &operator<<(std::ostream &stream, const UniqueBlob& blob);
73
74private:
75 size_t mLength;
76};
77
78std::ostream &operator<<(std::ostream &stream, const UniqueBlob& blob) {
79 const size_t length = blob.mLength;
80 stream << "Blob length=" << length << " < ";
81
82 const uint8_t* data = blob.get();
83 for (size_t i = 0; i < length; i++) {
84 stream << std::hex << std::setw(2) << std::setfill('0')
85 << static_cast<unsigned int>(data[i]) << ' ';
86 }
87 stream << '>' << std::endl;
88
89 return stream;
90}
91
92class UniqueKey : public UniqueBlob {
93public:
94 UniqueKey(keymaster_device_t** dev, uint8_t* bytes, size_t length) :
95 UniqueBlob(bytes, length), mDevice(dev) {
96 }
97
98 ~UniqueKey() {
99 if (mDevice != NULL && *mDevice != NULL) {
100 keymaster_device_t* dev = *mDevice;
101 if (dev->delete_keypair != NULL) {
102 dev->delete_keypair(dev, get(), length());
103 }
104 }
105 }
106
107private:
108 keymaster_device_t** mDevice;
109};
110
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700111class UniqueReadOnlyBlob {
112public:
113 UniqueReadOnlyBlob(uint8_t* data, size_t dataSize) :
114 mDataSize(dataSize) {
115 int pageSize = sysconf(_SC_PAGE_SIZE);
116 if (pageSize == -1) {
117 return;
118 }
119
120 int fd = open("/dev/zero", O_RDONLY);
121 if (fd == -1) {
122 return;
123 }
124
125 mBufferSize = (dataSize + pageSize - 1) & ~(pageSize - 1);
126 uint8_t* buffer = (uint8_t*) mmap(NULL, mBufferSize, PROT_READ | PROT_WRITE,
127 MAP_PRIVATE, fd, 0);
128 close(fd);
129
130 if (buffer == NULL) {
131 return;
132 }
133
134 memcpy(buffer, data, dataSize);
135 if (mprotect(buffer, mBufferSize, PROT_READ) == -1) {
136 munmap(buffer, mBufferSize);
137 return;
138 }
139
140 mBuffer = buffer;
141 }
142
143 ~UniqueReadOnlyBlob() {
144 munmap(mBuffer, mBufferSize);
145 }
146
147 uint8_t* get() const {
148 return mBuffer;
149 }
150
151 size_t length() const {
152 return mDataSize;
153 }
154
155private:
156 uint8_t* mBuffer;
157 size_t mBufferSize;
158 size_t mDataSize;
159};
160
Kenny Root8467a6d2012-08-08 17:04:40 -0700161struct BIGNUM_Delete {
162 void operator()(BIGNUM* p) const {
163 BN_free(p);
164 }
165};
166typedef UniquePtr<BIGNUM, BIGNUM_Delete> Unique_BIGNUM;
167
168struct EVP_PKEY_Delete {
169 void operator()(EVP_PKEY* p) const {
170 EVP_PKEY_free(p);
171 }
172};
173typedef UniquePtr<EVP_PKEY, EVP_PKEY_Delete> Unique_EVP_PKEY;
174
175struct PKCS8_PRIV_KEY_INFO_Delete {
176 void operator()(PKCS8_PRIV_KEY_INFO* p) const {
177 PKCS8_PRIV_KEY_INFO_free(p);
178 }
179};
180typedef UniquePtr<PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO_Delete> Unique_PKCS8_PRIV_KEY_INFO;
181
182struct RSA_Delete {
183 void operator()(RSA* p) const {
184 RSA_free(p);
185 }
186};
187typedef UniquePtr<RSA, RSA_Delete> Unique_RSA;
188
Kenny Root6e1683f2013-08-19 09:51:35 -0700189struct EC_KEY_Delete {
190 void operator()(EC_KEY* p) const {
191 EC_KEY_free(p);
192 }
193};
194typedef UniquePtr<EC_KEY, EC_KEY_Delete> Unique_EC_KEY;
195
196
Kenny Root4fd0db72012-03-16 13:19:07 -0700197/*
198 * DER-encoded PKCS#8 format RSA key. Generated using:
199 *
200 * openssl genrsa 2048 | openssl pkcs8 -topk8 -nocrypt -outform der | recode ../x1
201 */
Kenny Root6e1683f2013-08-19 09:51:35 -0700202static uint8_t TEST_RSA_KEY_1[] = {
Kenny Root4fd0db72012-03-16 13:19:07 -0700203 0x30, 0x82, 0x04, 0xBE, 0x02, 0x01, 0x00, 0x30, 0x0D, 0x06, 0x09, 0x2A,
204 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82,
205 0x04, 0xA8, 0x30, 0x82, 0x04, 0xA4, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01,
206 0x01, 0x00, 0xD8, 0x58, 0xD4, 0x9F, 0xC0, 0xE8, 0xF0, 0xFF, 0x87, 0x27,
207 0x43, 0xE6, 0x2E, 0xE6, 0x9A, 0x42, 0x3B, 0x39, 0x94, 0x84, 0x43, 0x55,
208 0x8D, 0x20, 0x5B, 0x71, 0x88, 0xE6, 0xD1, 0x62, 0xC8, 0xF2, 0x20, 0xD0,
209 0x75, 0x13, 0x83, 0xA3, 0x5D, 0x19, 0xA8, 0x62, 0xD0, 0x5F, 0x3E, 0x8A,
210 0x7C, 0x0E, 0x26, 0xA9, 0xFF, 0xB2, 0x5E, 0x63, 0xAA, 0x3C, 0x8D, 0x13,
211 0x41, 0xAA, 0xD5, 0x03, 0x01, 0x01, 0x53, 0xC9, 0x02, 0x1C, 0xEC, 0xE8,
212 0xC4, 0x70, 0x3F, 0x43, 0xE5, 0x51, 0xD0, 0x6E, 0x52, 0x0B, 0xC4, 0x0A,
213 0xA3, 0x61, 0xDE, 0xE3, 0x72, 0x0C, 0x94, 0xF1, 0x1C, 0x2D, 0x36, 0x77,
214 0xBB, 0x16, 0xA8, 0x63, 0x4B, 0xD1, 0x07, 0x00, 0x42, 0x2D, 0x2B, 0x10,
215 0x80, 0x45, 0xF3, 0x0C, 0xF9, 0xC5, 0xAC, 0xCC, 0x64, 0x87, 0xFD, 0x5D,
216 0xC8, 0x51, 0xD4, 0x1C, 0x9E, 0x6E, 0x9B, 0xC4, 0x27, 0x5E, 0x73, 0xA7,
217 0x2A, 0xF6, 0x90, 0x42, 0x0C, 0x34, 0x93, 0xB7, 0x02, 0x19, 0xA9, 0x64,
218 0x6C, 0x46, 0x3B, 0x40, 0x02, 0x2F, 0x54, 0x69, 0x79, 0x26, 0x7D, 0xF6,
219 0x85, 0x90, 0x01, 0xD0, 0x21, 0x07, 0xD0, 0x14, 0x00, 0x65, 0x9C, 0xAC,
220 0x24, 0xE8, 0x78, 0x42, 0x3B, 0x90, 0x75, 0x19, 0x55, 0x11, 0x4E, 0xD9,
221 0xE6, 0x97, 0x87, 0xBC, 0x8D, 0x2C, 0x9B, 0xF0, 0x1F, 0x14, 0xEB, 0x6A,
222 0x57, 0xCE, 0x78, 0xAD, 0xCE, 0xD9, 0xFB, 0xB9, 0xA1, 0xEF, 0x0C, 0x1F,
223 0xDD, 0xE3, 0x5B, 0x73, 0xA0, 0xEC, 0x37, 0x9C, 0xE1, 0xFD, 0x86, 0x28,
224 0xC3, 0x4A, 0x42, 0xD0, 0xA3, 0xFE, 0x57, 0x09, 0x29, 0xD8, 0xF6, 0xEC,
225 0xE3, 0xC0, 0x71, 0x7C, 0x29, 0x27, 0xC2, 0xD1, 0x3E, 0x22, 0xBC, 0xBD,
226 0x5A, 0x85, 0x41, 0xF6, 0x15, 0xDA, 0x0C, 0x58, 0x5A, 0x61, 0x5B, 0x78,
227 0xB8, 0xAA, 0xEC, 0x5C, 0x1C, 0x79, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02,
228 0x82, 0x01, 0x00, 0x1D, 0x10, 0x31, 0xE0, 0x14, 0x26, 0x36, 0xD9, 0xDC,
229 0xEA, 0x25, 0x70, 0xF2, 0xB3, 0xFF, 0xDD, 0x0D, 0xDF, 0xBA, 0x57, 0xDA,
230 0x43, 0xCF, 0xE5, 0x9C, 0xE3, 0x2F, 0xA4, 0xF2, 0x53, 0xF6, 0xF2, 0xAF,
231 0xFD, 0xD0, 0xFC, 0x82, 0x1E, 0x9C, 0x0F, 0x2A, 0x53, 0xBB, 0xF2, 0x4F,
232 0x90, 0x83, 0x01, 0xD3, 0xA7, 0xDA, 0xB5, 0xB7, 0x80, 0x64, 0x0A, 0x26,
233 0x59, 0x83, 0xE4, 0xD3, 0x20, 0xC8, 0x2D, 0xC9, 0x77, 0xA3, 0x55, 0x07,
234 0x6E, 0x6D, 0x95, 0x36, 0xAA, 0x84, 0x4F, 0xED, 0x54, 0x24, 0xA9, 0x77,
235 0xF8, 0x85, 0xE2, 0x4B, 0xF2, 0xFA, 0x0B, 0x3E, 0xA6, 0xF5, 0x46, 0x0D,
236 0x9F, 0x1F, 0xFE, 0xF7, 0x37, 0xFF, 0xA3, 0x60, 0xF1, 0x63, 0xF2, 0x75,
237 0x6A, 0x8E, 0x10, 0xD7, 0x89, 0xD2, 0xB3, 0xFF, 0x76, 0xA5, 0xBA, 0xAF,
238 0x0A, 0xBE, 0x32, 0x5F, 0xF0, 0x48, 0x48, 0x4B, 0x9C, 0x9A, 0x3D, 0x12,
239 0xA7, 0xD2, 0x07, 0xC7, 0x59, 0x32, 0x94, 0x95, 0x65, 0x2F, 0x87, 0x34,
240 0x76, 0xBA, 0x7C, 0x08, 0x4B, 0xAB, 0xA6, 0x24, 0xDF, 0x64, 0xDB, 0x48,
241 0x63, 0x42, 0x06, 0xE2, 0x2C, 0x3D, 0xFB, 0xE5, 0x47, 0x81, 0x94, 0x98,
242 0xF7, 0x32, 0x4B, 0x28, 0xEB, 0x42, 0xB8, 0xE9, 0x8E, 0xFC, 0xC9, 0x43,
243 0xC9, 0x47, 0xE6, 0xE7, 0x1C, 0xDC, 0x71, 0xEF, 0x4D, 0x8A, 0xB1, 0xFC,
244 0x45, 0x37, 0xEC, 0xB3, 0x16, 0x88, 0x5B, 0xE2, 0xEC, 0x8B, 0x6B, 0x75,
245 0x16, 0xBE, 0x6B, 0xF8, 0x2C, 0xF8, 0xC9, 0xD1, 0xF7, 0x55, 0x87, 0x57,
246 0x5F, 0xDE, 0xF4, 0x7E, 0x72, 0x13, 0x06, 0x2A, 0x21, 0xB7, 0x78, 0x21,
247 0x05, 0xFD, 0xE2, 0x5F, 0x7B, 0x7C, 0xF0, 0x26, 0x2B, 0x75, 0x7F, 0x68,
248 0xF9, 0xA6, 0x98, 0xFD, 0x54, 0x0E, 0xCC, 0x22, 0x41, 0x7F, 0x29, 0x81,
249 0x2F, 0xA3, 0x3C, 0x3D, 0x64, 0xC8, 0x41, 0x02, 0x81, 0x81, 0x00, 0xFA,
250 0xFA, 0xE4, 0x2E, 0x30, 0xF0, 0x7A, 0x8D, 0x95, 0xB8, 0x39, 0x58, 0x27,
251 0x0F, 0x89, 0x0C, 0xDF, 0xFE, 0x2F, 0x55, 0x3B, 0x6F, 0xDD, 0x5F, 0x12,
252 0xB3, 0xD1, 0xCF, 0x5B, 0x8D, 0xB6, 0x10, 0x1C, 0x87, 0x0C, 0x30, 0x89,
253 0x2D, 0xBB, 0xB8, 0xA1, 0x78, 0x0F, 0x54, 0xA6, 0x36, 0x46, 0x05, 0x8B,
254 0x5A, 0xFF, 0x48, 0x03, 0x13, 0xAE, 0x95, 0x96, 0x5D, 0x6C, 0xDA, 0x5D,
255 0xF7, 0xAD, 0x1D, 0x33, 0xED, 0x23, 0xF5, 0x4B, 0x03, 0x78, 0xE7, 0x50,
256 0xD1, 0x2D, 0x95, 0x22, 0x35, 0x02, 0x5B, 0x4A, 0x4E, 0x73, 0xC9, 0xB7,
257 0x05, 0xC4, 0x21, 0x86, 0x1F, 0x1E, 0x40, 0x83, 0xBC, 0x8A, 0x3A, 0x95,
258 0x24, 0x62, 0xF4, 0x58, 0x38, 0x64, 0x4A, 0x89, 0x8A, 0x27, 0x59, 0x12,
259 0x9D, 0x21, 0xC3, 0xA6, 0x42, 0x1E, 0x2A, 0x3F, 0xD8, 0x65, 0x1F, 0x6E,
260 0x3E, 0x4D, 0x5C, 0xCC, 0xEA, 0x8E, 0x15, 0x02, 0x81, 0x81, 0x00, 0xDC,
261 0xAC, 0x9B, 0x00, 0xDB, 0xF9, 0xB2, 0xBF, 0xC4, 0x5E, 0xB6, 0xB7, 0x63,
262 0xEB, 0x13, 0x4B, 0xE2, 0xA6, 0xC8, 0x72, 0x90, 0xD8, 0xC2, 0x33, 0x33,
263 0xF0, 0x66, 0x75, 0xBD, 0x50, 0x7C, 0xA4, 0x8F, 0x82, 0xFB, 0xFF, 0x44,
264 0x3B, 0xE7, 0x15, 0x3A, 0x0C, 0x7A, 0xF8, 0x92, 0x86, 0x4A, 0x79, 0x32,
265 0x08, 0x82, 0x1D, 0x6A, 0xBA, 0xAD, 0x8A, 0xB3, 0x3D, 0x7F, 0xA5, 0xB4,
266 0x6F, 0x67, 0x86, 0x7E, 0xB2, 0x9C, 0x2A, 0xF6, 0x7C, 0x49, 0x21, 0xC5,
267 0x3F, 0x00, 0x3F, 0x9B, 0xF7, 0x0F, 0x6C, 0x35, 0x80, 0x75, 0x73, 0xC0,
268 0xF8, 0x3E, 0x30, 0x5F, 0x74, 0x2F, 0x15, 0x41, 0xEA, 0x0F, 0xCE, 0x0E,
269 0x18, 0x17, 0x68, 0xBA, 0xC4, 0x29, 0xF2, 0xE2, 0x2C, 0x1D, 0x55, 0x83,
270 0xB6, 0x64, 0x2E, 0x03, 0x12, 0xA4, 0x0D, 0xBF, 0x4F, 0x2E, 0xBE, 0x7C,
271 0x41, 0xD9, 0xCD, 0xD0, 0x52, 0x91, 0xD5, 0x02, 0x81, 0x81, 0x00, 0xD4,
272 0x55, 0xEB, 0x32, 0xC1, 0x28, 0xD3, 0x26, 0x72, 0x22, 0xB8, 0x31, 0x42,
273 0x6A, 0xBC, 0x52, 0x6E, 0x37, 0x48, 0xA8, 0x5D, 0x6E, 0xD8, 0xE5, 0x14,
274 0x97, 0x99, 0xCC, 0x4A, 0xF2, 0xEB, 0xB3, 0x59, 0xCF, 0x4F, 0x9A, 0xC8,
275 0x94, 0x2E, 0x9B, 0x97, 0xD0, 0x51, 0x78, 0x16, 0x5F, 0x18, 0x82, 0x9C,
276 0x51, 0xD2, 0x64, 0x84, 0x65, 0xE4, 0x70, 0x9E, 0x14, 0x50, 0x81, 0xB6,
277 0xBA, 0x52, 0x75, 0xC0, 0x76, 0xC2, 0xD3, 0x46, 0x31, 0x9B, 0xDA, 0x67,
278 0xDF, 0x71, 0x27, 0x19, 0x17, 0xAB, 0xF4, 0xBC, 0x3A, 0xFF, 0x6F, 0x0B,
279 0x2F, 0x0F, 0xAE, 0x25, 0x20, 0xB2, 0xA1, 0x76, 0x52, 0xCE, 0xC7, 0x9D,
280 0x62, 0x79, 0x6D, 0xAC, 0x2D, 0x99, 0x7C, 0x0E, 0x3D, 0x19, 0xE9, 0x1B,
281 0xFC, 0x60, 0x92, 0x7C, 0x58, 0xB7, 0xD8, 0x9A, 0xC7, 0x63, 0x56, 0x62,
282 0x18, 0xC7, 0xAE, 0xD9, 0x97, 0x1F, 0xB9, 0x02, 0x81, 0x81, 0x00, 0x91,
283 0x40, 0xC4, 0x1E, 0x82, 0xAD, 0x0F, 0x6D, 0x8E, 0xD2, 0x51, 0x2E, 0xD1,
284 0x84, 0x30, 0x85, 0x68, 0xC1, 0x23, 0x7B, 0xD5, 0xBF, 0xF7, 0xC4, 0x40,
285 0x51, 0xE2, 0xFF, 0x69, 0x07, 0x8B, 0xA3, 0xBE, 0x1B, 0x17, 0xC8, 0x64,
286 0x9F, 0x91, 0x71, 0xB5, 0x6D, 0xF5, 0x9B, 0x9C, 0xC6, 0xEC, 0x4A, 0x6E,
287 0x16, 0x8F, 0x9E, 0xD1, 0x5B, 0xE3, 0x53, 0x42, 0xBC, 0x1E, 0x43, 0x72,
288 0x4B, 0x4A, 0x37, 0x8B, 0x3A, 0x01, 0xF5, 0x7D, 0x9D, 0x3D, 0x7E, 0x0F,
289 0x19, 0x73, 0x0E, 0x6B, 0x98, 0xE9, 0xFB, 0xEE, 0x13, 0x8A, 0x3C, 0x11,
290 0x2E, 0xD5, 0xB0, 0x7D, 0x84, 0x3A, 0x61, 0xA1, 0xAB, 0x71, 0x8F, 0xCE,
291 0x53, 0x29, 0x45, 0x74, 0x7A, 0x1E, 0xAA, 0x93, 0x19, 0x3A, 0x8D, 0xC9,
292 0x4E, 0xCB, 0x0E, 0x46, 0x53, 0x84, 0xCC, 0xCF, 0xBA, 0x4D, 0x28, 0x71,
293 0x1D, 0xDF, 0x41, 0xCB, 0xF8, 0x2D, 0xA9, 0x02, 0x81, 0x80, 0x04, 0x8B,
294 0x4A, 0xEA, 0xBD, 0x39, 0x0B, 0x96, 0xC5, 0x1D, 0xA4, 0x47, 0xFD, 0x46,
295 0xD2, 0x8A, 0xEA, 0x2A, 0xF3, 0x9D, 0x3A, 0x7E, 0x16, 0x74, 0xFC, 0x13,
296 0xDE, 0x4D, 0xA9, 0x85, 0x42, 0x33, 0x02, 0x92, 0x0B, 0xB6, 0xDB, 0x7E,
297 0xEA, 0x85, 0xC2, 0x94, 0x43, 0x52, 0x37, 0x5A, 0x77, 0xAB, 0xCB, 0x61,
298 0x88, 0xDE, 0xF8, 0xFA, 0xDB, 0xE8, 0x0B, 0x95, 0x7D, 0x39, 0x19, 0xA2,
299 0x89, 0xB9, 0x32, 0xB2, 0x50, 0x38, 0xF7, 0x88, 0x69, 0xFD, 0xA4, 0x63,
300 0x1F, 0x9B, 0x03, 0xD8, 0xA6, 0x7A, 0x05, 0x76, 0x02, 0x28, 0x93, 0x82,
301 0x73, 0x7F, 0x14, 0xCC, 0xBE, 0x29, 0x10, 0xAD, 0x8A, 0x2E, 0xAC, 0xED,
302 0x11, 0xA7, 0x72, 0x7C, 0x60, 0x78, 0x72, 0xFB, 0x78, 0x20, 0x18, 0xC9,
303 0x7E, 0x63, 0xAD, 0x55, 0x54, 0x51, 0xDB, 0x9F, 0x7B, 0xD4, 0x8F, 0xB2,
304 0xDE, 0x3B, 0xF1, 0x70, 0x23, 0xE5,
305};
306
307/*
Kenny Root6e1683f2013-08-19 09:51:35 -0700308 * DER-encoded PKCS#8 format EC key. Generated using:
309 *
310 * openssl ecparam -name prime256v1 -genkey -noout | openssl pkcs8 -topk8 -nocrypt -outform der | recode ../x1
311 */
312static uint8_t TEST_EC_KEY_1[] = {
313 0x30, 0x81, 0x87, 0x02, 0x01, 0x00, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86,
314 0x48, 0xCE, 0x3D, 0x02, 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D,
315 0x03, 0x01, 0x07, 0x04, 0x6D, 0x30, 0x6B, 0x02, 0x01, 0x01, 0x04, 0x20,
316 0x25, 0xAC, 0x77, 0x2B, 0x04, 0x33, 0xC8, 0x16, 0x59, 0xA3, 0xC7, 0xE7,
317 0x11, 0x42, 0xD0, 0x11, 0x71, 0x30, 0x7B, 0xB8, 0xD2, 0x67, 0xFF, 0x9C,
318 0x5F, 0x50, 0x2E, 0xAB, 0x67, 0xD4, 0x17, 0x51, 0xA1, 0x44, 0x03, 0x42,
319 0x00, 0x04, 0xCF, 0xCE, 0xB8, 0x7F, 0x88, 0x36, 0xC4, 0xF8, 0x51, 0x29,
320 0xE2, 0xA7, 0x21, 0xC3, 0x3B, 0xFF, 0x88, 0xE3, 0x87, 0x98, 0xD1, 0xA6,
321 0x4B, 0xB3, 0x4B, 0xD5, 0x44, 0xF8, 0xE0, 0x43, 0x6B, 0x50, 0x74, 0xFB,
322 0xB0, 0xAD, 0x41, 0x1C, 0x11, 0x9D, 0xC6, 0x1E, 0x83, 0x8C, 0x49, 0xCA,
323 0xBE, 0xC6, 0xCE, 0xB6, 0xC9, 0xA1, 0xBF, 0x69, 0xA9, 0xA0, 0xA3, 0x80,
324 0x14, 0x39, 0x57, 0x94, 0xDA, 0x5D
325};
326
327
328/*
Kenny Root4fd0db72012-03-16 13:19:07 -0700329 * Generated using keys on the keyboard and lack of imagination.
330 */
331static unsigned char BOGUS_KEY_1[] = { 0xFF, 0xFF, 0xFF, 0xFF };
332
333
Kenny Root8467a6d2012-08-08 17:04:40 -0700334class KeymasterBaseTest : public ::testing::Test {
335public:
Kenny Root4fd0db72012-03-16 13:19:07 -0700336 static void SetUpTestCase() {
337 const hw_module_t* mod;
338 ASSERT_EQ(0, hw_get_module_by_class(KEYSTORE_HARDWARE_MODULE_ID, NULL, &mod))
339 << "Should be able to find a keymaster hardware module";
340
341 std::cout << "Using keymaster module: " << mod->name << std::endl;
342
343 ASSERT_EQ(0, keymaster_open(mod, &sDevice))
344 << "Should be able to open the keymaster device";
345
Kenny Root6e1683f2013-08-19 09:51:35 -0700346 ASSERT_EQ(2U, sDevice->client_version)
347 << "Keymaster should implement API version 2";
348
Kenny Root4fd0db72012-03-16 13:19:07 -0700349 ASSERT_TRUE(sDevice->generate_keypair != NULL)
350 << "Should implement generate_keypair";
351
352 ASSERT_TRUE(sDevice->import_keypair != NULL)
353 << "Should implement import_keypair";
354
355 ASSERT_TRUE(sDevice->get_keypair_public != NULL)
356 << "Should implement get_keypair_public";
357
358 ASSERT_TRUE(sDevice->sign_data != NULL)
359 << "Should implement sign_data";
360
361 ASSERT_TRUE(sDevice->verify_data != NULL)
362 << "Should implement verify_data";
363 }
364
365 static void TearDownTestCase() {
366 ASSERT_EQ(0, keymaster_close(sDevice));
367 }
368
Kenny Root8467a6d2012-08-08 17:04:40 -0700369protected:
Kenny Root4fd0db72012-03-16 13:19:07 -0700370 static keymaster_device_t* sDevice;
371};
372
Kenny Root8467a6d2012-08-08 17:04:40 -0700373keymaster_device_t* KeymasterBaseTest::sDevice = NULL;
Kenny Root4fd0db72012-03-16 13:19:07 -0700374
Kenny Root8467a6d2012-08-08 17:04:40 -0700375class KeymasterTest : public KeymasterBaseTest {
376};
377
Kenny Root6e1683f2013-08-19 09:51:35 -0700378class KeymasterAllTypesTest : public KeymasterBaseTest,
379 public ::testing::WithParamInterface<keymaster_keypair_t> {
380};
381
382class KeymasterGenerateRSATest : public KeymasterBaseTest,
Kenny Root8467a6d2012-08-08 17:04:40 -0700383 public ::testing::WithParamInterface<uint32_t> {
384};
385
Kenny Root6e1683f2013-08-19 09:51:35 -0700386class KeymasterGenerateDSATest : public KeymasterBaseTest,
387 public ::testing::WithParamInterface<uint32_t> {
388};
389
390class KeymasterGenerateECTest : public KeymasterBaseTest,
391 public ::testing::WithParamInterface<uint32_t> {
392};
393
394TEST_P(KeymasterGenerateRSATest, GenerateKeyPair_RSA_Success) {
Kenny Root4fd0db72012-03-16 13:19:07 -0700395 keymaster_keypair_t key_type = TYPE_RSA;
396 keymaster_rsa_keygen_params_t params = {
Kenny Root8467a6d2012-08-08 17:04:40 -0700397 modulus_size: GetParam(),
398 public_exponent: RSA_F4,
Kenny Root4fd0db72012-03-16 13:19:07 -0700399 };
400
401 uint8_t* key_blob;
402 size_t key_blob_length;
403
Kenny Root139d44f2012-11-20 14:37:40 -0800404 ASSERT_EQ(0,
Kenny Root4fd0db72012-03-16 13:19:07 -0700405 sDevice->generate_keypair(sDevice, key_type, &params, &key_blob, &key_blob_length))
Kenny Root6e1683f2013-08-19 09:51:35 -0700406 << "Should generate an RSA key with " << GetParam() << " bit modulus size";
Kenny Root4fd0db72012-03-16 13:19:07 -0700407 UniqueKey key(&sDevice, key_blob, key_blob_length);
Kenny Root4fd0db72012-03-16 13:19:07 -0700408
Kenny Root8467a6d2012-08-08 17:04:40 -0700409 uint8_t* x509_data = NULL;
410 size_t x509_data_length;
Kenny Root139d44f2012-11-20 14:37:40 -0800411 ASSERT_EQ(0,
Kenny Root8467a6d2012-08-08 17:04:40 -0700412 sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
413 &x509_data, &x509_data_length))
414 << "Should be able to retrieve RSA public key successfully";
415 UniqueBlob x509_blob(x509_data, x509_data_length);
416 ASSERT_FALSE(x509_blob.get() == NULL)
417 << "X509 data should be allocated";
418
419 const unsigned char *tmp = static_cast<const unsigned char*>(x509_blob.get());
420 Unique_EVP_PKEY actual(d2i_PUBKEY((EVP_PKEY**) NULL, &tmp,
421 static_cast<long>(x509_blob.length())));
422
423 ASSERT_EQ(EVP_PKEY_RSA, EVP_PKEY_type(actual.get()->type))
424 << "Generated key type should be of type RSA";
425
426 Unique_RSA rsa(EVP_PKEY_get1_RSA(actual.get()));
427 ASSERT_FALSE(rsa.get() == NULL)
428 << "Should be able to extract RSA key from EVP_PKEY";
429
Kenny Root139d44f2012-11-20 14:37:40 -0800430 ASSERT_EQ(static_cast<unsigned long>(RSA_F4), BN_get_word(rsa.get()->e))
Kenny Root8467a6d2012-08-08 17:04:40 -0700431 << "Exponent should be RSA_F4";
432
Kenny Root6e1683f2013-08-19 09:51:35 -0700433 ASSERT_EQ((GetParam() + 7) / 8, static_cast<uint32_t>(RSA_size(rsa.get())))
Kenny Root8467a6d2012-08-08 17:04:40 -0700434 << "Modulus size should be the specified parameter";
Kenny Root4fd0db72012-03-16 13:19:07 -0700435}
436
Kenny Root8467a6d2012-08-08 17:04:40 -0700437INSTANTIATE_TEST_CASE_P(RSA,
Kenny Root6e1683f2013-08-19 09:51:35 -0700438 KeymasterGenerateRSATest,
Brian Carlstrom63b64332013-05-14 15:20:28 -0700439 ::testing::Values(512U, 1024U, 2048U, 3072U, 4096U));
Kenny Root4fd0db72012-03-16 13:19:07 -0700440
Kenny Root6e1683f2013-08-19 09:51:35 -0700441
442TEST_P(KeymasterGenerateECTest, GenerateKeyPair_EC_Success) {
443 keymaster_keypair_t key_type = TYPE_EC;
444 keymaster_ec_keygen_params_t params = {
445 field_size: GetParam(),
446 };
447
448 uint8_t* key_blob;
449 size_t key_blob_length;
450
451 ASSERT_EQ(0,
452 sDevice->generate_keypair(sDevice, key_type, &params, &key_blob, &key_blob_length))
453 << "Should generate an EC key with " << GetParam() << " field size";
454 UniqueKey key(&sDevice, key_blob, key_blob_length);
455
456 uint8_t* x509_data = NULL;
457 size_t x509_data_length;
458 ASSERT_EQ(0,
459 sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
460 &x509_data, &x509_data_length))
461 << "Should be able to retrieve EC public key successfully";
462 UniqueBlob x509_blob(x509_data, x509_data_length);
463 ASSERT_FALSE(x509_blob.get() == NULL)
464 << "X509 data should be allocated";
465
466 const unsigned char *tmp = static_cast<const unsigned char*>(x509_blob.get());
467 Unique_EVP_PKEY actual(d2i_PUBKEY((EVP_PKEY**) NULL, &tmp,
468 static_cast<long>(x509_blob.length())));
469
470 ASSERT_EQ(EVP_PKEY_EC, EVP_PKEY_type(actual.get()->type))
471 << "Generated key type should be of type EC";
472
473 Unique_EC_KEY ecKey(EVP_PKEY_get1_EC_KEY(actual.get()));
474 ASSERT_FALSE(ecKey.get() == NULL)
475 << "Should be able to extract EC key from EVP_PKEY";
476
477 ASSERT_FALSE(EC_KEY_get0_group(ecKey.get()) == NULL)
478 << "EC key should have a EC_GROUP";
479
480 ASSERT_TRUE(EC_KEY_check_key(ecKey.get()))
481 << "EC key should check correctly";
482}
483
484INSTANTIATE_TEST_CASE_P(EC,
485 KeymasterGenerateECTest,
486 ::testing::Values(192U, 224U, 256U, 384U, 521U));
487
488
489TEST_P(KeymasterAllTypesTest, GenerateKeyPair_NullParams_Failure) {
490 keymaster_keypair_t key_type = GetParam();
Kenny Root4fd0db72012-03-16 13:19:07 -0700491
492 uint8_t* key_blob;
493 size_t key_blob_length;
494
Kenny Root139d44f2012-11-20 14:37:40 -0800495 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -0700496 sDevice->generate_keypair(sDevice, key_type, NULL, &key_blob, &key_blob_length))
Kenny Root6e1683f2013-08-19 09:51:35 -0700497 << "Should not be able to generate a key with null params";
Kenny Root4fd0db72012-03-16 13:19:07 -0700498}
499
Kenny Root6e1683f2013-08-19 09:51:35 -0700500INSTANTIATE_TEST_CASE_P(Types,
501 KeymasterAllTypesTest,
502 ::testing::Values(TYPE_RSA, TYPE_DSA, TYPE_EC));
503
Kenny Root4fd0db72012-03-16 13:19:07 -0700504TEST_F(KeymasterTest, GenerateKeyPair_UnknownType_Failure) {
505 keymaster_keypair_t key_type = static_cast<keymaster_keypair_t>(0xFFFF);
506
507 uint8_t* key_blob;
508 size_t key_blob_length;
509
Kenny Root139d44f2012-11-20 14:37:40 -0800510 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -0700511 sDevice->generate_keypair(sDevice, key_type, NULL, &key_blob, &key_blob_length))
512 << "Should not generate an unknown key type";
513}
514
515TEST_F(KeymasterTest, ImportKeyPair_RSA_Success) {
516 uint8_t* key_blob;
517 size_t key_blob_length;
518
Kenny Root139d44f2012-11-20 14:37:40 -0800519 ASSERT_EQ(0,
Kenny Root6e1683f2013-08-19 09:51:35 -0700520 sDevice->import_keypair(sDevice, TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1),
Kenny Root4fd0db72012-03-16 13:19:07 -0700521 &key_blob, &key_blob_length))
522 << "Should successfully import an RSA key";
523 UniqueKey key(&sDevice, key_blob, key_blob_length);
Kenny Root8467a6d2012-08-08 17:04:40 -0700524
525 uint8_t* x509_data;
526 size_t x509_data_length;
Kenny Root139d44f2012-11-20 14:37:40 -0800527 ASSERT_EQ(0,
Kenny Root8467a6d2012-08-08 17:04:40 -0700528 sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
529 &x509_data, &x509_data_length))
530 << "Should be able to retrieve RSA public key successfully";
531 UniqueBlob x509_blob(x509_data, x509_data_length);
532
533 const unsigned char *tmp = static_cast<const unsigned char*>(x509_blob.get());
534 Unique_EVP_PKEY actual(d2i_PUBKEY((EVP_PKEY**) NULL, &tmp,
535 static_cast<long>(x509_blob.length())));
536
Kenny Root139d44f2012-11-20 14:37:40 -0800537 ASSERT_EQ(EVP_PKEY_type(actual.get()->type), EVP_PKEY_RSA)
Kenny Root8467a6d2012-08-08 17:04:40 -0700538 << "Generated key type should be of type RSA";
539
Kenny Root6e1683f2013-08-19 09:51:35 -0700540 const unsigned char *expectedTmp = static_cast<const unsigned char*>(TEST_RSA_KEY_1);
Kenny Root8467a6d2012-08-08 17:04:40 -0700541 Unique_PKCS8_PRIV_KEY_INFO expectedPkcs8(
542 d2i_PKCS8_PRIV_KEY_INFO((PKCS8_PRIV_KEY_INFO**) NULL, &expectedTmp,
Kenny Root6e1683f2013-08-19 09:51:35 -0700543 sizeof(TEST_RSA_KEY_1)));
544
545 Unique_EVP_PKEY expected(EVP_PKCS82PKEY(expectedPkcs8.get()));
546
547 ASSERT_EQ(1, EVP_PKEY_cmp(expected.get(), actual.get()))
548 << "Expected and actual keys should match";
549}
550
551TEST_F(KeymasterTest, ImportKeyPair_EC_Success) {
552 uint8_t* key_blob;
553 size_t key_blob_length;
554
555 ASSERT_EQ(0,
556 sDevice->import_keypair(sDevice, TEST_EC_KEY_1, sizeof(TEST_EC_KEY_1),
557 &key_blob, &key_blob_length))
558 << "Should successfully import an EC key";
559 UniqueKey key(&sDevice, key_blob, key_blob_length);
560
561 uint8_t* x509_data;
562 size_t x509_data_length;
563 ASSERT_EQ(0,
564 sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
565 &x509_data, &x509_data_length))
566 << "Should be able to retrieve EC public key successfully";
567 UniqueBlob x509_blob(x509_data, x509_data_length);
568
569 const unsigned char *tmp = static_cast<const unsigned char*>(x509_blob.get());
570 Unique_EVP_PKEY actual(d2i_PUBKEY((EVP_PKEY**) NULL, &tmp,
571 static_cast<long>(x509_blob.length())));
572
573 ASSERT_EQ(EVP_PKEY_type(actual.get()->type), EVP_PKEY_EC)
574 << "Generated key type should be of type EC";
575
576 const unsigned char *expectedTmp = static_cast<const unsigned char*>(TEST_EC_KEY_1);
577 Unique_PKCS8_PRIV_KEY_INFO expectedPkcs8(
578 d2i_PKCS8_PRIV_KEY_INFO((PKCS8_PRIV_KEY_INFO**) NULL, &expectedTmp,
579 sizeof(TEST_EC_KEY_1)));
Kenny Root8467a6d2012-08-08 17:04:40 -0700580
581 Unique_EVP_PKEY expected(EVP_PKCS82PKEY(expectedPkcs8.get()));
582
Kenny Root139d44f2012-11-20 14:37:40 -0800583 ASSERT_EQ(1, EVP_PKEY_cmp(expected.get(), actual.get()))
Kenny Root8467a6d2012-08-08 17:04:40 -0700584 << "Expected and actual keys should match";
Kenny Root4fd0db72012-03-16 13:19:07 -0700585}
586
587TEST_F(KeymasterTest, ImportKeyPair_BogusKey_Failure) {
588 uint8_t* key_blob;
589 size_t key_blob_length;
590
Kenny Root139d44f2012-11-20 14:37:40 -0800591 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -0700592 sDevice->import_keypair(sDevice, BOGUS_KEY_1, sizeof(BOGUS_KEY_1),
593 &key_blob, &key_blob_length))
594 << "Should not import an unknown key type";
595}
596
597TEST_F(KeymasterTest, ImportKeyPair_NullKey_Failure) {
598 uint8_t* key_blob;
599 size_t key_blob_length;
600
Kenny Root139d44f2012-11-20 14:37:40 -0800601 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -0700602 sDevice->import_keypair(sDevice, NULL, 0,
603 &key_blob, &key_blob_length))
604 << "Should not import a null key";
605}
606
607TEST_F(KeymasterTest, GetKeypairPublic_RSA_Success) {
608 uint8_t* key_blob;
609 size_t key_blob_length;
610
Kenny Root6e1683f2013-08-19 09:51:35 -0700611 UniqueReadOnlyBlob testKey(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700612 ASSERT_TRUE(testKey.get() != NULL);
613
Kenny Root4fd0db72012-03-16 13:19:07 -0700614 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700615 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700616 &key_blob, &key_blob_length))
617 << "Should successfully import an RSA key";
618 UniqueKey key(&sDevice, key_blob, key_blob_length);
619
620 uint8_t* x509_data;
621 size_t x509_data_length;
Kenny Root139d44f2012-11-20 14:37:40 -0800622 ASSERT_EQ(0,
Kenny Root4fd0db72012-03-16 13:19:07 -0700623 sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
624 &x509_data, &x509_data_length))
625 << "Should be able to retrieve RSA public key successfully";
626 UniqueBlob x509_blob(x509_data, x509_data_length);
627}
628
Kenny Root6e1683f2013-08-19 09:51:35 -0700629TEST_F(KeymasterTest, GetKeypairPublic_EC_Success) {
630 uint8_t* key_blob;
631 size_t key_blob_length;
632
633 UniqueReadOnlyBlob testKey(TEST_EC_KEY_1, sizeof(TEST_EC_KEY_1));
634 ASSERT_TRUE(testKey.get() != NULL);
635
636 ASSERT_EQ(0,
637 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
638 &key_blob, &key_blob_length))
639 << "Should successfully import an EC key";
640 UniqueKey key(&sDevice, key_blob, key_blob_length);
641
642 uint8_t* x509_data;
643 size_t x509_data_length;
644 ASSERT_EQ(0,
645 sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
646 &x509_data, &x509_data_length))
647 << "Should be able to retrieve EC public key successfully";
648 UniqueBlob x509_blob(x509_data, x509_data_length);
649}
650
651TEST_F(KeymasterTest, GetKeypairPublic_NullKey_Failure) {
Kenny Root4fd0db72012-03-16 13:19:07 -0700652 uint8_t* key_blob;
653 size_t key_blob_length;
654
655 uint8_t* x509_data = NULL;
656 size_t x509_data_length;
Kenny Root139d44f2012-11-20 14:37:40 -0800657 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -0700658 sDevice->get_keypair_public(sDevice, NULL, 0,
659 &x509_data, &x509_data_length))
Kenny Root6e1683f2013-08-19 09:51:35 -0700660 << "Should not be able to retrieve public key from null key";
Kenny Root4fd0db72012-03-16 13:19:07 -0700661 UniqueBlob x509_blob(x509_data, x509_data_length);
662}
663
664TEST_F(KeymasterTest, GetKeypairPublic_RSA_NullDestination_Failure) {
665 uint8_t* key_blob;
666 size_t key_blob_length;
667
Kenny Root6e1683f2013-08-19 09:51:35 -0700668 UniqueReadOnlyBlob testKey(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
669 ASSERT_TRUE(testKey.get() != NULL);
670
671 ASSERT_EQ(0,
672 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
673 &key_blob, &key_blob_length))
674 << "Should successfully import an RSA key";
675 UniqueKey key(&sDevice, key_blob, key_blob_length);
676
677 ASSERT_EQ(-1,
678 sDevice->get_keypair_public(sDevice, key.get(), key.length(),
679 NULL, NULL))
680 << "Should not be able to succeed with NULL destination blob";
681}
682
683TEST_F(KeymasterTest, GetKeypairPublic_EC_NullDestination_Failure) {
684 uint8_t* key_blob;
685 size_t key_blob_length;
686
687 UniqueReadOnlyBlob testKey(TEST_EC_KEY_1, sizeof(TEST_EC_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700688 ASSERT_TRUE(testKey.get() != NULL);
689
Kenny Root4fd0db72012-03-16 13:19:07 -0700690 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700691 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700692 &key_blob, &key_blob_length))
693 << "Should successfully import an RSA key";
694 UniqueKey key(&sDevice, key_blob, key_blob_length);
695
Kenny Root139d44f2012-11-20 14:37:40 -0800696 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -0700697 sDevice->get_keypair_public(sDevice, key.get(), key.length(),
698 NULL, NULL))
699 << "Should not be able to succeed with NULL destination blob";
700}
701
702TEST_F(KeymasterTest, DeleteKeyPair_RSA_Success) {
703 uint8_t* key_blob;
704 size_t key_blob_length;
705
Kenny Root6e1683f2013-08-19 09:51:35 -0700706 UniqueReadOnlyBlob testKey(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700707 ASSERT_TRUE(testKey.get() != NULL);
708
Kenny Root139d44f2012-11-20 14:37:40 -0800709 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700710 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700711 &key_blob, &key_blob_length))
712 << "Should successfully import an RSA key";
713 UniqueKey key(&sDevice, key_blob, key_blob_length);
714}
715
716TEST_F(KeymasterTest, DeleteKeyPair_RSA_DoubleDelete_Failure) {
717 uint8_t* key_blob;
718 size_t key_blob_length;
719
Kenny Root6e1683f2013-08-19 09:51:35 -0700720 UniqueReadOnlyBlob testKey(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700721 ASSERT_TRUE(testKey.get() != NULL);
722
Kenny Root4fd0db72012-03-16 13:19:07 -0700723 /*
724 * This is only run if the module indicates it implements key deletion
725 * by implementing delete_keypair.
726 */
727 if (sDevice->delete_keypair != NULL) {
728 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700729 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700730 &key_blob, &key_blob_length))
731 << "Should successfully import an RSA key";
732 UniqueBlob blob(key_blob, key_blob_length);
733
Kenny Root139d44f2012-11-20 14:37:40 -0800734 ASSERT_EQ(0, sDevice->delete_keypair(sDevice, key_blob, key_blob_length))
Kenny Root4fd0db72012-03-16 13:19:07 -0700735 << "Should delete key after import";
736
Kenny Root139d44f2012-11-20 14:37:40 -0800737 ASSERT_EQ(-1, sDevice->delete_keypair(sDevice, key_blob, key_blob_length))
Kenny Root4fd0db72012-03-16 13:19:07 -0700738 << "Should not be able to delete key twice";
739 }
740}
741
742TEST_F(KeymasterTest, DeleteKeyPair_RSA_NullKey_Failure) {
743 /*
744 * This is only run if the module indicates it implements key deletion
745 * by implementing delete_keypair.
746 */
747 if (sDevice->delete_keypair != NULL) {
Kenny Root139d44f2012-11-20 14:37:40 -0800748 ASSERT_EQ(-1, sDevice->delete_keypair(sDevice, NULL, 0))
Kenny Root4fd0db72012-03-16 13:19:07 -0700749 << "Should not be able to delete null key";
750 }
751}
752
753/*
754 * DER-encoded PKCS#8 format RSA key. Generated using:
755 *
756 * openssl genrsa 512 | openssl pkcs8 -topk8 -nocrypt -outform der | recode ../x1
757 */
Kenny Root6e1683f2013-08-19 09:51:35 -0700758static uint8_t TEST_SIGN_RSA_KEY_1[] = {
Kenny Root4fd0db72012-03-16 13:19:07 -0700759 0x30, 0x82, 0x01, 0x56, 0x02, 0x01, 0x00, 0x30, 0x0D, 0x06, 0x09, 0x2A,
760 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82,
761 0x01, 0x40, 0x30, 0x82, 0x01, 0x3C, 0x02, 0x01, 0x00, 0x02, 0x41, 0x00,
762 0xBD, 0xC0, 0x7F, 0xEF, 0x75, 0x1D, 0x63, 0x2A, 0xD0, 0x9A, 0x26, 0xE5,
763 0x5B, 0xB9, 0x84, 0x7C, 0xE5, 0xC7, 0xE7, 0xDE, 0xFE, 0xB6, 0x54, 0xD9,
764 0xF0, 0x9B, 0xC2, 0xCF, 0x36, 0xDA, 0xE5, 0x4D, 0xC5, 0xD9, 0x25, 0x78,
765 0xBD, 0x55, 0x05, 0xBD, 0x86, 0xFB, 0x37, 0x15, 0x33, 0x42, 0x52, 0xED,
766 0xE5, 0xCD, 0xCB, 0xB7, 0xA2, 0x51, 0xFA, 0x36, 0xE9, 0x9C, 0x2E, 0x5D,
767 0xE3, 0xA5, 0x1F, 0x01, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x41, 0x00,
768 0x96, 0x71, 0xDE, 0xBD, 0x83, 0x94, 0x96, 0x40, 0xA6, 0xFD, 0xE1, 0xA2,
769 0xED, 0xD3, 0xAC, 0x28, 0xBE, 0xA2, 0x7D, 0xC3, 0xFF, 0x1D, 0x9F, 0x2E,
770 0xE0, 0xA7, 0x0E, 0x90, 0xEE, 0x44, 0x25, 0x92, 0xE3, 0x54, 0xDD, 0x55,
771 0xA3, 0xEF, 0x42, 0xF5, 0x52, 0x55, 0x41, 0x47, 0x5E, 0x00, 0xFB, 0x8B,
772 0x47, 0x5E, 0x45, 0x49, 0xEA, 0x3D, 0x2C, 0xFD, 0x9F, 0xEC, 0xC8, 0x4E,
773 0x4E, 0x86, 0x90, 0x31, 0x02, 0x21, 0x00, 0xE6, 0xA5, 0x55, 0xB3, 0x64,
774 0xAB, 0x90, 0x5E, 0xA2, 0xF5, 0x6B, 0x21, 0x4B, 0x15, 0xD6, 0x4A, 0xB6,
775 0x60, 0x24, 0x95, 0x65, 0xA2, 0xBE, 0xBA, 0x2A, 0x73, 0xFB, 0xFF, 0x2C,
776 0x61, 0x88, 0x9D, 0x02, 0x21, 0x00, 0xD2, 0x9C, 0x5B, 0xFE, 0x82, 0xA5,
777 0xFC, 0x52, 0x6A, 0x29, 0x38, 0xDB, 0x22, 0x3B, 0xEB, 0x74, 0x3B, 0xCA,
778 0xB4, 0xDD, 0x1D, 0xE4, 0x48, 0x60, 0x70, 0x19, 0x9B, 0x81, 0xC1, 0x83,
779 0x28, 0xB5, 0x02, 0x21, 0x00, 0x89, 0x2D, 0xFE, 0xF9, 0xF2, 0xBF, 0x43,
780 0xDF, 0xB5, 0xA6, 0xA8, 0x30, 0x26, 0x1B, 0x77, 0xD7, 0xF9, 0xFE, 0xD6,
781 0xE3, 0x70, 0x8E, 0xCA, 0x47, 0xA9, 0xA6, 0x50, 0x54, 0x25, 0xCE, 0x60,
782 0xD5, 0x02, 0x21, 0x00, 0xBE, 0x5A, 0xF8, 0x82, 0xE6, 0xCE, 0xE3, 0x6A,
783 0x11, 0xED, 0xC4, 0x27, 0xBB, 0x9F, 0x70, 0xC6, 0x93, 0xAC, 0x39, 0x20,
784 0x89, 0x7D, 0xE5, 0x34, 0xD4, 0xDD, 0x30, 0x42, 0x6D, 0x07, 0x00, 0xE9,
785 0x02, 0x20, 0x05, 0x91, 0xEF, 0x12, 0xD2, 0xD3, 0x6A, 0xD2, 0x96, 0x6B,
786 0x10, 0x62, 0xF9, 0xBA, 0xA4, 0x91, 0x48, 0x84, 0x40, 0x61, 0x67, 0x80,
787 0x68, 0x68, 0xC8, 0x60, 0xB3, 0x66, 0xC8, 0xF9, 0x08, 0x9A,
788};
789
790/*
Kenny Root6e1683f2013-08-19 09:51:35 -0700791 * DER-encoded PKCS#8 format EC key. Generated using:
792 *
793 * openssl ecparam -name prime256v1 -genkey -noout | openssl pkcs8 -topk8 -nocrypt -outform der | recode ../x1
794 */
795static uint8_t TEST_SIGN_EC_KEY_1[] = {
796 0x30, 0x81, 0x87, 0x02, 0x01, 0x00, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86,
797 0x48, 0xCE, 0x3D, 0x02, 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D,
798 0x03, 0x01, 0x07, 0x04, 0x6D, 0x30, 0x6B, 0x02, 0x01, 0x01, 0x04, 0x20,
799 0x9E, 0x66, 0x11, 0x6A, 0x89, 0xF5, 0x78, 0x57, 0xF3, 0x35, 0xA2, 0x46,
800 0x09, 0x06, 0x4B, 0x4D, 0x81, 0xEC, 0xD3, 0x9B, 0x0A, 0xC4, 0x68, 0x06,
801 0xB8, 0x42, 0x24, 0x5E, 0x74, 0x2C, 0x62, 0x79, 0xA1, 0x44, 0x03, 0x42,
802 0x00, 0x04, 0x35, 0xB5, 0x9A, 0x5C, 0xE5, 0x52, 0x35, 0xF2, 0x10, 0x6C,
803 0xD9, 0x98, 0x67, 0xED, 0x5E, 0xCB, 0x6B, 0xB8, 0x96, 0x5E, 0x54, 0x7C,
804 0x34, 0x2A, 0xA3, 0x3B, 0xF3, 0xD1, 0x39, 0x48, 0x36, 0x7A, 0xEA, 0xD8,
805 0xCA, 0xDD, 0x40, 0x8F, 0xE9, 0xE0, 0x95, 0x2E, 0x3F, 0x95, 0x0F, 0x14,
806 0xD6, 0x14, 0x78, 0xB5, 0xAD, 0x17, 0xD2, 0x5A, 0x41, 0x96, 0x99, 0x20,
807 0xC7, 0x5B, 0x0F, 0x60, 0xFD, 0xBA
808};
809
810/*
Kenny Root4fd0db72012-03-16 13:19:07 -0700811 * PKCS#1 v1.5 padded raw "Hello, world" Can be generated be generated by verifying
812 * the signature below in no padding mode:
813 *
814 * openssl rsautl -keyform der -inkey rsa.der -raw -verify -in test.sig
815 */
816static uint8_t TEST_SIGN_DATA_1[] = {
817 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
818 0xFF, 0xFF, 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, 0x00, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x2C, 0x20, 0x77,
822 0x6F, 0x72, 0x6C, 0x64,
823};
824
825/*
Kenny Root6e1683f2013-08-19 09:51:35 -0700826 * Signature of TEST_SIGN_DATA_1 using TEST_SIGN_RSA_KEY_1. Generated using:
Kenny Root4fd0db72012-03-16 13:19:07 -0700827 *
828 * echo 'Hello, world' | openssl rsautl -keyform der -inkey rsa.der -sign | recode ../x1
829 */
Kenny Root6e1683f2013-08-19 09:51:35 -0700830static uint8_t TEST_SIGN_RSA_SIGNATURE_1[] = {
Kenny Root4fd0db72012-03-16 13:19:07 -0700831 0xA4, 0xBB, 0x76, 0x87, 0xFE, 0x61, 0x0C, 0x9D, 0xD6, 0xFF, 0x4B, 0x76,
832 0x96, 0x08, 0x36, 0x23, 0x11, 0xC6, 0x44, 0x3F, 0x88, 0x77, 0x97, 0xB2,
833 0xA8, 0x3B, 0xFB, 0x9C, 0x3C, 0xD3, 0x20, 0x65, 0xFD, 0x26, 0x3B, 0x2A,
834 0xB8, 0xB6, 0xD4, 0xDC, 0x91, 0xF7, 0xE2, 0xDE, 0x4D, 0xF7, 0x0E, 0xB9,
835 0x72, 0xA7, 0x29, 0x72, 0x82, 0x12, 0x7C, 0x53, 0x23, 0x21, 0xC4, 0xFF,
836 0x79, 0xE4, 0x91, 0x40,
837};
838
839/*
Kenny Root6e1683f2013-08-19 09:51:35 -0700840 * Identical to TEST_SIGN_RSA_SIGNATURE_1 except the last octet is '1' instead of '0'
Kenny Root4fd0db72012-03-16 13:19:07 -0700841 * This should fail any test.
842 */
843static uint8_t TEST_SIGN_SIGNATURE_BOGUS_1[] = {
844 0xA4, 0xBB, 0x76, 0x87, 0xFE, 0x61, 0x0C, 0x9D, 0xD6, 0xFF, 0x4B, 0x76,
845 0x96, 0x08, 0x36, 0x23, 0x11, 0xC6, 0x44, 0x3F, 0x88, 0x77, 0x97, 0xB2,
846 0xA8, 0x3B, 0xFB, 0x9C, 0x3C, 0xD3, 0x20, 0x65, 0xFD, 0x26, 0x3B, 0x2A,
847 0xB8, 0xB6, 0xD4, 0xDC, 0x91, 0xF7, 0xE2, 0xDE, 0x4D, 0xF7, 0x0E, 0xB9,
848 0x72, 0xA7, 0x29, 0x72, 0x82, 0x12, 0x7C, 0x53, 0x23, 0x21, 0xC4, 0xFF,
849 0x79, 0xE4, 0x91, 0x41,
850};
851
852TEST_F(KeymasterTest, SignData_RSA_Raw_Success) {
853 uint8_t* key_blob;
854 size_t key_blob_length;
855
Kenny Root6e1683f2013-08-19 09:51:35 -0700856 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700857 ASSERT_TRUE(testKey.get() != NULL);
858
Kenny Root4fd0db72012-03-16 13:19:07 -0700859 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700860 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700861 &key_blob, &key_blob_length))
862 << "Should successfully import an RSA key";
863 UniqueKey key(&sDevice, key_blob, key_blob_length);
864
865 keymaster_rsa_sign_params_t params = {
866 digest_type: DIGEST_NONE,
867 padding_type: PADDING_NONE,
868 };
869
870 uint8_t* sig;
871 size_t sig_length;
872
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700873 UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
874 ASSERT_TRUE(testData.get() != NULL);
875
Kenny Root139d44f2012-11-20 14:37:40 -0800876 ASSERT_EQ(0,
Kenny Root4fd0db72012-03-16 13:19:07 -0700877 sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700878 testData.get(), testData.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700879 &sig, &sig_length))
880 << "Should sign data successfully";
881 UniqueBlob sig_blob(sig, sig_length);
882
Kenny Root6e1683f2013-08-19 09:51:35 -0700883 UniqueBlob expected_sig(TEST_SIGN_RSA_SIGNATURE_1, sizeof(TEST_SIGN_RSA_SIGNATURE_1));
Kenny Root4fd0db72012-03-16 13:19:07 -0700884
Kenny Root139d44f2012-11-20 14:37:40 -0800885 ASSERT_EQ(expected_sig, sig_blob)
Kenny Root4fd0db72012-03-16 13:19:07 -0700886 << "Generated signature should match expected signature";
887
888 // The expected signature is actually stack data, so don't let it try to free.
889 uint8_t* unused __attribute__((unused)) = expected_sig.release();
890}
891
Kenny Root6e1683f2013-08-19 09:51:35 -0700892TEST_F(KeymasterTest, SignData_EC_Success) {
893 uint8_t* key_blob;
894 size_t key_blob_length;
895
896 UniqueReadOnlyBlob testKey(TEST_SIGN_EC_KEY_1, sizeof(TEST_SIGN_EC_KEY_1));
897 ASSERT_TRUE(testKey.get() != NULL);
898
899 ASSERT_EQ(0,
900 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
901 &key_blob, &key_blob_length))
902 << "Should successfully import an EC key";
903 UniqueKey key(&sDevice, key_blob, key_blob_length);
904
905 keymaster_ec_sign_params_t params = {
906 digest_type: DIGEST_NONE,
907 };
908
909 uint8_t* sig;
910 size_t sig_length;
911
912 UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
913 ASSERT_TRUE(testData.get() != NULL);
914
915 ASSERT_EQ(0,
916 sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
917 testData.get(), testData.length(),
918 &sig, &sig_length))
919 << "Should sign data successfully";
920 UniqueBlob sig_blob(sig, sig_length);
921
922 uint8_t* x509_data;
923 size_t x509_data_length;
924 ASSERT_EQ(0,
925 sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
926 &x509_data, &x509_data_length))
927 << "Should be able to retrieve RSA public key successfully";
928 UniqueBlob x509_blob(x509_data, x509_data_length);
929
930 const unsigned char *tmp = static_cast<const unsigned char*>(x509_blob.get());
931 Unique_EVP_PKEY expected(d2i_PUBKEY((EVP_PKEY**) NULL, &tmp,
932 static_cast<long>(x509_blob.length())));
933
934 Unique_EC_KEY ecKey(EVP_PKEY_get1_EC_KEY(expected.get()));
935
936 ASSERT_EQ(1, ECDSA_verify(0, testData.get(), testData.length(), sig_blob.get(), sig_blob.length(), ecKey.get()))
937 << "Signature should verify";
938}
939
Kenny Root4fd0db72012-03-16 13:19:07 -0700940TEST_F(KeymasterTest, SignData_RSA_Raw_InvalidSizeInput_Failure) {
941 uint8_t* key_blob;
942 size_t key_blob_length;
943
Kenny Root6e1683f2013-08-19 09:51:35 -0700944 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700945 ASSERT_TRUE(testKey.get() != NULL);
946
Kenny Root4fd0db72012-03-16 13:19:07 -0700947 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700948 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700949 &key_blob, &key_blob_length))
950 << "Should successfully import an RSA key";
951 UniqueKey key(&sDevice, key_blob, key_blob_length);
952
953 keymaster_rsa_sign_params_t params = {
954 digest_type: DIGEST_NONE,
955 padding_type: PADDING_NONE,
956 };
957
958 uint8_t* sig;
959 size_t sig_length;
960
Kenny Root6e1683f2013-08-19 09:51:35 -0700961 UniqueReadOnlyBlob testData(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700962 ASSERT_TRUE(testData.get() != NULL);
963
Kenny Root139d44f2012-11-20 14:37:40 -0800964 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -0700965 sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700966 testData.get(), testData.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700967 &sig, &sig_length))
968 << "Should not be able to do raw signature on incorrect size data";
969}
970
971TEST_F(KeymasterTest, SignData_RSA_Raw_NullKey_Failure) {
972 keymaster_rsa_sign_params_t params = {
973 digest_type: DIGEST_NONE,
974 padding_type: PADDING_NONE,
975 };
976
977 uint8_t* sig;
978 size_t sig_length;
979
Kenny Root6e1683f2013-08-19 09:51:35 -0700980 UniqueReadOnlyBlob testData(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700981 ASSERT_TRUE(testData.get() != NULL);
982
Kenny Root139d44f2012-11-20 14:37:40 -0800983 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -0700984 sDevice->sign_data(sDevice, &params, NULL, 0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700985 testData.get(), testData.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700986 &sig, &sig_length))
987 << "Should not be able to do raw signature on incorrect size data";
988}
989
990TEST_F(KeymasterTest, SignData_RSA_Raw_NullInput_Failure) {
991 uint8_t* key_blob;
992 size_t key_blob_length;
993
Kenny Root6e1683f2013-08-19 09:51:35 -0700994 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700995 ASSERT_TRUE(testKey.get() != NULL);
996
Kenny Root4fd0db72012-03-16 13:19:07 -0700997 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700998 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700999 &key_blob, &key_blob_length))
1000 << "Should successfully import an RSA key";
1001 UniqueKey key(&sDevice, key_blob, key_blob_length);
1002
1003 keymaster_rsa_sign_params_t params = {
1004 digest_type: DIGEST_NONE,
1005 padding_type: PADDING_NONE,
1006 };
1007
1008 uint8_t* sig;
1009 size_t sig_length;
1010
Kenny Root139d44f2012-11-20 14:37:40 -08001011 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -07001012 sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
1013 NULL, 0,
1014 &sig, &sig_length))
1015 << "Should error when input data is null";
1016}
1017
1018TEST_F(KeymasterTest, SignData_RSA_Raw_NullOutput_Failure) {
1019 uint8_t* key_blob;
1020 size_t key_blob_length;
1021
Kenny Root6e1683f2013-08-19 09:51:35 -07001022 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001023 ASSERT_TRUE(testKey.get() != NULL);
1024
Kenny Root4fd0db72012-03-16 13:19:07 -07001025 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001026 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -07001027 &key_blob, &key_blob_length))
1028 << "Should successfully import an RSA key";
1029 UniqueKey key(&sDevice, key_blob, key_blob_length);
1030
1031 keymaster_rsa_sign_params_t params = {
1032 digest_type: DIGEST_NONE,
1033 padding_type: PADDING_NONE,
1034 };
1035
1036 uint8_t* sig;
1037 size_t sig_length;
1038
Kenny Root6e1683f2013-08-19 09:51:35 -07001039 UniqueReadOnlyBlob testData(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001040 ASSERT_TRUE(testData.get() != NULL);
1041
Kenny Root139d44f2012-11-20 14:37:40 -08001042 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -07001043 sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001044 testData.get(), testData.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -07001045 NULL, NULL))
1046 << "Should error when output is null";
1047}
1048
1049TEST_F(KeymasterTest, VerifyData_RSA_Raw_Success) {
1050 uint8_t* key_blob;
1051 size_t key_blob_length;
1052
Kenny Root6e1683f2013-08-19 09:51:35 -07001053 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001054 ASSERT_TRUE(testKey.get() != NULL);
1055
Kenny Root4fd0db72012-03-16 13:19:07 -07001056 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001057 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -07001058 &key_blob, &key_blob_length))
1059 << "Should successfully import an RSA key";
1060 UniqueKey key(&sDevice, key_blob, key_blob_length);
1061
1062 keymaster_rsa_sign_params_t params = {
1063 digest_type: DIGEST_NONE,
1064 padding_type: PADDING_NONE,
1065 };
1066
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001067 UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
1068 ASSERT_TRUE(testData.get() != NULL);
1069
Kenny Root6e1683f2013-08-19 09:51:35 -07001070 UniqueReadOnlyBlob testSig(TEST_SIGN_RSA_SIGNATURE_1, sizeof(TEST_SIGN_RSA_SIGNATURE_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001071 ASSERT_TRUE(testSig.get() != NULL);
1072
Kenny Root139d44f2012-11-20 14:37:40 -08001073 ASSERT_EQ(0,
Kenny Root4fd0db72012-03-16 13:19:07 -07001074 sDevice->verify_data(sDevice, &params, key_blob, key_blob_length,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001075 testData.get(), testData.length(),
1076 testSig.get(), testSig.length()))
Kenny Root4fd0db72012-03-16 13:19:07 -07001077 << "Should verify data successfully";
1078}
1079
Kenny Root6e1683f2013-08-19 09:51:35 -07001080TEST_F(KeymasterTest, VerifyData_EC_Raw_Success) {
1081 uint8_t* key_blob;
1082 size_t key_blob_length;
1083
1084 UniqueReadOnlyBlob testKey(TEST_SIGN_EC_KEY_1, sizeof(TEST_SIGN_EC_KEY_1));
1085 ASSERT_TRUE(testKey.get() != NULL);
1086
1087 ASSERT_EQ(0,
1088 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
1089 &key_blob, &key_blob_length))
1090 << "Should successfully import an RSA key";
1091 UniqueKey key(&sDevice, key_blob, key_blob_length);
1092
1093 keymaster_ec_sign_params_t params = {
1094 digest_type: DIGEST_NONE,
1095 };
1096
1097 uint8_t* sig;
1098 size_t sig_length;
1099
1100 UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
1101 ASSERT_TRUE(testData.get() != NULL);
1102
1103 ASSERT_EQ(0,
1104 sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
1105 testData.get(), testData.length(),
1106 &sig, &sig_length))
1107 << "Should sign data successfully";
1108 UniqueBlob sig_blob(sig, sig_length);
1109
1110 ASSERT_EQ(0,
1111 sDevice->verify_data(sDevice, &params, key_blob, key_blob_length,
1112 testData.get(), testData.length(),
1113 sig_blob.get(), sig_blob.length()))
1114 << "Should verify data successfully";
1115}
1116
Kenny Root4fd0db72012-03-16 13:19:07 -07001117TEST_F(KeymasterTest, VerifyData_RSA_Raw_BadSignature_Failure) {
1118 uint8_t* key_blob;
1119 size_t key_blob_length;
1120
Kenny Root6e1683f2013-08-19 09:51:35 -07001121 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001122 ASSERT_TRUE(testKey.get() != NULL);
1123
Kenny Root4fd0db72012-03-16 13:19:07 -07001124 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001125 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -07001126 &key_blob, &key_blob_length))
1127 << "Should successfully import an RSA key";
1128 UniqueKey key(&sDevice, key_blob, key_blob_length);
1129
1130 keymaster_rsa_sign_params_t params = {
1131 digest_type: DIGEST_NONE,
1132 padding_type: PADDING_NONE,
1133 };
1134
Kenny Root139d44f2012-11-20 14:37:40 -08001135 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -07001136 sDevice->verify_data(sDevice, &params, key_blob, key_blob_length,
1137 TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1),
1138 TEST_SIGN_SIGNATURE_BOGUS_1, sizeof(TEST_SIGN_SIGNATURE_BOGUS_1)))
1139 << "Should sign data successfully";
1140}
1141
Kenny Root6e1683f2013-08-19 09:51:35 -07001142TEST_F(KeymasterTest, VerifyData_EC_Raw_BadSignature_Failure) {
1143 uint8_t* key_blob;
1144 size_t key_blob_length;
1145
1146 UniqueReadOnlyBlob testKey(TEST_SIGN_EC_KEY_1, sizeof(TEST_SIGN_EC_KEY_1));
1147 ASSERT_TRUE(testKey.get() != NULL);
1148
1149 ASSERT_EQ(0,
1150 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
1151 &key_blob, &key_blob_length))
1152 << "Should successfully import an RSA key";
1153 UniqueKey key(&sDevice, key_blob, key_blob_length);
1154
1155 keymaster_ec_sign_params_t params = {
1156 digest_type: DIGEST_NONE,
1157 };
1158
1159 ASSERT_EQ(-1,
1160 sDevice->verify_data(sDevice, &params, key_blob, key_blob_length,
1161 TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1),
1162 TEST_SIGN_SIGNATURE_BOGUS_1, sizeof(TEST_SIGN_SIGNATURE_BOGUS_1)))
1163 << "Should sign data successfully";
1164}
1165
Kenny Root4fd0db72012-03-16 13:19:07 -07001166TEST_F(KeymasterTest, VerifyData_RSA_Raw_NullKey_Failure) {
1167 keymaster_rsa_sign_params_t params = {
1168 digest_type: DIGEST_NONE,
1169 padding_type: PADDING_NONE,
1170 };
1171
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001172 UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
1173 ASSERT_TRUE(testData.get() != NULL);
1174
1175 UniqueReadOnlyBlob testSig(TEST_SIGN_SIGNATURE_BOGUS_1, sizeof(TEST_SIGN_SIGNATURE_BOGUS_1));
1176 ASSERT_TRUE(testSig.get() != NULL);
1177
Kenny Root139d44f2012-11-20 14:37:40 -08001178 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -07001179 sDevice->verify_data(sDevice, &params, NULL, 0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001180 testData.get(), testData.length(),
1181 testSig.get(), testSig.length()))
Kenny Root4fd0db72012-03-16 13:19:07 -07001182 << "Should fail when key is null";
1183}
1184
1185TEST_F(KeymasterTest, VerifyData_RSA_NullInput_Failure) {
1186 uint8_t* key_blob;
1187 size_t key_blob_length;
1188
1189 ASSERT_EQ(0,
Kenny Root6e1683f2013-08-19 09:51:35 -07001190 sDevice->import_keypair(sDevice, TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1),
Kenny Root4fd0db72012-03-16 13:19:07 -07001191 &key_blob, &key_blob_length))
1192 << "Should successfully import an RSA key";
1193 UniqueKey key(&sDevice, key_blob, key_blob_length);
1194
1195 keymaster_rsa_sign_params_t params = {
1196 digest_type: DIGEST_NONE,
1197 padding_type: PADDING_NONE,
1198 };
1199
Kenny Root6e1683f2013-08-19 09:51:35 -07001200 UniqueReadOnlyBlob testSig(TEST_SIGN_RSA_SIGNATURE_1, sizeof(TEST_SIGN_RSA_SIGNATURE_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001201 ASSERT_TRUE(testSig.get() != NULL);
1202
Kenny Root139d44f2012-11-20 14:37:40 -08001203 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -07001204 sDevice->verify_data(sDevice, &params, key_blob, key_blob_length,
1205 NULL, 0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001206 testSig.get(), testSig.length()))
Kenny Root4fd0db72012-03-16 13:19:07 -07001207 << "Should fail on null input";
1208}
1209
1210TEST_F(KeymasterTest, VerifyData_RSA_NullSignature_Failure) {
1211 uint8_t* key_blob;
1212 size_t key_blob_length;
1213
Kenny Root6e1683f2013-08-19 09:51:35 -07001214 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001215 ASSERT_TRUE(testKey.get() != NULL);
1216
Kenny Root4fd0db72012-03-16 13:19:07 -07001217 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001218 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -07001219 &key_blob, &key_blob_length))
1220 << "Should successfully import an RSA key";
1221 UniqueKey key(&sDevice, key_blob, key_blob_length);
1222
1223 keymaster_rsa_sign_params_t params = {
1224 digest_type: DIGEST_NONE,
1225 padding_type: PADDING_NONE,
1226 };
1227
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001228 UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
1229 ASSERT_TRUE(testData.get() != NULL);
1230
Kenny Root139d44f2012-11-20 14:37:40 -08001231 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -07001232 sDevice->verify_data(sDevice, &params, key.get(), key.length(),
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001233 testData.get(), testData.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -07001234 NULL, 0))
1235 << "Should fail on null signature";
1236}
1237
Kenny Root8ae65e72012-03-23 16:17:28 -07001238TEST_F(KeymasterTest, EraseAll_Success) {
1239 uint8_t *key1_blob, *key2_blob;
1240 size_t key1_blob_length, key2_blob_length;
1241
1242 // Only test this if the device says it supports delete_all
1243 if (sDevice->delete_all == NULL) {
1244 return;
1245 }
1246
Kenny Root6e1683f2013-08-19 09:51:35 -07001247 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001248 ASSERT_TRUE(testKey.get() != NULL);
1249
Kenny Root8ae65e72012-03-23 16:17:28 -07001250 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001251 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root8ae65e72012-03-23 16:17:28 -07001252 &key1_blob, &key1_blob_length))
1253 << "Should successfully import an RSA key";
1254 UniqueKey key1(&sDevice, key1_blob, key1_blob_length);
1255
Kenny Root6e1683f2013-08-19 09:51:35 -07001256 UniqueReadOnlyBlob testKey2(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001257 ASSERT_TRUE(testKey2.get() != NULL);
1258
Kenny Root8ae65e72012-03-23 16:17:28 -07001259 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001260 sDevice->import_keypair(sDevice, testKey2.get(), testKey2.length(),
Kenny Root8ae65e72012-03-23 16:17:28 -07001261 &key2_blob, &key2_blob_length))
1262 << "Should successfully import an RSA key";
1263 UniqueKey key2(&sDevice, key2_blob, key2_blob_length);
1264
Kenny Root139d44f2012-11-20 14:37:40 -08001265 ASSERT_EQ(0, sDevice->delete_all(sDevice))
Kenny Root8ae65e72012-03-23 16:17:28 -07001266 << "Should erase all keys";
1267
1268 key1.reset();
1269
1270 uint8_t* x509_data;
1271 size_t x509_data_length;
1272 ASSERT_EQ(-1,
1273 sDevice->get_keypair_public(sDevice, key1_blob, key1_blob_length,
1274 &x509_data, &x509_data_length))
1275 << "Should be able to retrieve RSA public key 1 successfully";
1276
1277 ASSERT_EQ(-1,
1278 sDevice->get_keypair_public(sDevice, key2_blob, key2_blob_length,
1279 &x509_data, &x509_data_length))
1280 << "Should be able to retrieve RSA public key 2 successfully";
1281}
1282
Kenny Root4fd0db72012-03-16 13:19:07 -07001283}