blob: e6b41c7a5bb9e7d17a27d23ea514c9d0b4284a8c [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>
Andreas Gampee9e7c202017-10-02 11:57:51 -070026#include <memory>
Kenny Root4fd0db72012-03-16 13:19:07 -070027
28#include <gtest/gtest.h>
29
Kenny Root8467a6d2012-08-08 17:04:40 -070030#include <openssl/bn.h>
31#include <openssl/evp.h>
32#include <openssl/x509.h>
33
Kenny Rooteca8b3c2013-04-26 16:46:01 -070034#define LOG_TAG "keymaster_test"
35#include <utils/Log.h>
Kenny Roota4cef692013-09-11 14:51:09 -070036
Shawn Willden302d2522015-02-24 09:17:38 -070037#include <hardware/keymaster0.h>
Kenny Root4fd0db72012-03-16 13:19:07 -070038
39namespace android {
40
Andreas Gampee9e7c202017-10-02 11:57:51 -070041class UniqueBlob : public std::unique_ptr<uint8_t[]> {
Kenny Root4fd0db72012-03-16 13:19:07 -070042public:
Chih-Hung Hsiehbcfe2932016-05-02 15:51:12 -070043 explicit UniqueBlob(size_t length) :
Kenny Rooteca8b3c2013-04-26 16:46:01 -070044 mLength(length) {
45 }
46
Kenny Root4fd0db72012-03-16 13:19:07 -070047 UniqueBlob(uint8_t* bytes, size_t length) :
Andreas Gampee9e7c202017-10-02 11:57:51 -070048 std::unique_ptr<uint8_t[]>(bytes), mLength(length) {
Kenny Root4fd0db72012-03-16 13:19:07 -070049 }
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:
Shawn Willden302d2522015-02-24 09:17:38 -070094 UniqueKey(keymaster0_device_t** dev, uint8_t* bytes, size_t length) :
Kenny Root4fd0db72012-03-16 13:19:07 -070095 UniqueBlob(bytes, length), mDevice(dev) {
96 }
97
98 ~UniqueKey() {
99 if (mDevice != NULL && *mDevice != NULL) {
Shawn Willden302d2522015-02-24 09:17:38 -0700100 keymaster0_device_t* dev = *mDevice;
Kenny Root4fd0db72012-03-16 13:19:07 -0700101 if (dev->delete_keypair != NULL) {
102 dev->delete_keypair(dev, get(), length());
103 }
104 }
105 }
106
107private:
Shawn Willden302d2522015-02-24 09:17:38 -0700108 keymaster0_device_t** mDevice;
Kenny Root4fd0db72012-03-16 13:19:07 -0700109};
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};
Andreas Gampee9e7c202017-10-02 11:57:51 -0700166typedef std::unique_ptr<BIGNUM, BIGNUM_Delete> Unique_BIGNUM;
Kenny Root8467a6d2012-08-08 17:04:40 -0700167
168struct EVP_PKEY_Delete {
169 void operator()(EVP_PKEY* p) const {
170 EVP_PKEY_free(p);
171 }
172};
Andreas Gampee9e7c202017-10-02 11:57:51 -0700173typedef std::unique_ptr<EVP_PKEY, EVP_PKEY_Delete> Unique_EVP_PKEY;
Kenny Root8467a6d2012-08-08 17:04:40 -0700174
175struct PKCS8_PRIV_KEY_INFO_Delete {
176 void operator()(PKCS8_PRIV_KEY_INFO* p) const {
177 PKCS8_PRIV_KEY_INFO_free(p);
178 }
179};
Andreas Gampee9e7c202017-10-02 11:57:51 -0700180typedef std::unique_ptr<PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO_Delete> Unique_PKCS8_PRIV_KEY_INFO;
Kenny Root8467a6d2012-08-08 17:04:40 -0700181
182struct RSA_Delete {
183 void operator()(RSA* p) const {
184 RSA_free(p);
185 }
186};
Andreas Gampee9e7c202017-10-02 11:57:51 -0700187typedef std::unique_ptr<RSA, RSA_Delete> Unique_RSA;
Kenny Root8467a6d2012-08-08 17:04:40 -0700188
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};
Andreas Gampee9e7c202017-10-02 11:57:51 -0700194typedef std::unique_ptr<EC_KEY, EC_KEY_Delete> Unique_EC_KEY;
Kenny Root6e1683f2013-08-19 09:51:35 -0700195
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
Shawn Willden302d2522015-02-24 09:17:38 -0700343 ASSERT_EQ(0, keymaster0_open(mod, &sDevice))
Kenny Root4fd0db72012-03-16 13:19:07 -0700344 << "Should be able to open the keymaster device";
345
Kenny Root36ab8ed2013-09-04 22:17:56 -0700346 ASSERT_EQ(KEYMASTER_MODULE_API_VERSION_0_2, mod->module_api_version)
Kenny Root6e1683f2013-08-19 09:51:35 -0700347 << "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() {
Shawn Willden302d2522015-02-24 09:17:38 -0700366 ASSERT_EQ(0, keymaster0_close(sDevice));
Kenny Root4fd0db72012-03-16 13:19:07 -0700367 }
368
Kenny Root8467a6d2012-08-08 17:04:40 -0700369protected:
Shawn Willden302d2522015-02-24 09:17:38 -0700370 static keymaster0_device_t* sDevice;
Kenny Root4fd0db72012-03-16 13:19:07 -0700371};
372
Shawn Willden302d2522015-02-24 09:17:38 -0700373keymaster0_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 = {
Andreas Gampe1aa58f92015-12-16 14:17:44 -0800397 .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 = {
Andreas Gampe1aa58f92015-12-16 14:17:44 -0800445 .field_size = GetParam(),
Kenny Root6e1683f2013-08-19 09:51:35 -0700446 };
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* x509_data = NULL;
653 size_t x509_data_length;
Kenny Root139d44f2012-11-20 14:37:40 -0800654 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -0700655 sDevice->get_keypair_public(sDevice, NULL, 0,
656 &x509_data, &x509_data_length))
Kenny Root6e1683f2013-08-19 09:51:35 -0700657 << "Should not be able to retrieve public key from null key";
Kenny Root4fd0db72012-03-16 13:19:07 -0700658 UniqueBlob x509_blob(x509_data, x509_data_length);
659}
660
661TEST_F(KeymasterTest, GetKeypairPublic_RSA_NullDestination_Failure) {
662 uint8_t* key_blob;
663 size_t key_blob_length;
664
Kenny Root6e1683f2013-08-19 09:51:35 -0700665 UniqueReadOnlyBlob testKey(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
666 ASSERT_TRUE(testKey.get() != NULL);
667
668 ASSERT_EQ(0,
669 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
670 &key_blob, &key_blob_length))
671 << "Should successfully import an RSA key";
672 UniqueKey key(&sDevice, key_blob, key_blob_length);
673
674 ASSERT_EQ(-1,
675 sDevice->get_keypair_public(sDevice, key.get(), key.length(),
676 NULL, NULL))
677 << "Should not be able to succeed with NULL destination blob";
678}
679
680TEST_F(KeymasterTest, GetKeypairPublic_EC_NullDestination_Failure) {
681 uint8_t* key_blob;
682 size_t key_blob_length;
683
684 UniqueReadOnlyBlob testKey(TEST_EC_KEY_1, sizeof(TEST_EC_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700685 ASSERT_TRUE(testKey.get() != NULL);
686
Kenny Root4fd0db72012-03-16 13:19:07 -0700687 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700688 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700689 &key_blob, &key_blob_length))
690 << "Should successfully import an RSA key";
691 UniqueKey key(&sDevice, key_blob, key_blob_length);
692
Kenny Root139d44f2012-11-20 14:37:40 -0800693 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -0700694 sDevice->get_keypair_public(sDevice, key.get(), key.length(),
695 NULL, NULL))
696 << "Should not be able to succeed with NULL destination blob";
697}
698
699TEST_F(KeymasterTest, DeleteKeyPair_RSA_Success) {
700 uint8_t* key_blob;
701 size_t key_blob_length;
702
Kenny Root6e1683f2013-08-19 09:51:35 -0700703 UniqueReadOnlyBlob testKey(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700704 ASSERT_TRUE(testKey.get() != NULL);
705
Kenny Root139d44f2012-11-20 14:37:40 -0800706 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700707 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700708 &key_blob, &key_blob_length))
709 << "Should successfully import an RSA key";
710 UniqueKey key(&sDevice, key_blob, key_blob_length);
711}
712
713TEST_F(KeymasterTest, DeleteKeyPair_RSA_DoubleDelete_Failure) {
714 uint8_t* key_blob;
715 size_t key_blob_length;
716
Kenny Root6e1683f2013-08-19 09:51:35 -0700717 UniqueReadOnlyBlob testKey(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700718 ASSERT_TRUE(testKey.get() != NULL);
719
Kenny Root4fd0db72012-03-16 13:19:07 -0700720 /*
721 * This is only run if the module indicates it implements key deletion
722 * by implementing delete_keypair.
723 */
724 if (sDevice->delete_keypair != NULL) {
725 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700726 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700727 &key_blob, &key_blob_length))
728 << "Should successfully import an RSA key";
729 UniqueBlob blob(key_blob, key_blob_length);
730
Kenny Root139d44f2012-11-20 14:37:40 -0800731 ASSERT_EQ(0, sDevice->delete_keypair(sDevice, key_blob, key_blob_length))
Kenny Root4fd0db72012-03-16 13:19:07 -0700732 << "Should delete key after import";
733
Kenny Root139d44f2012-11-20 14:37:40 -0800734 ASSERT_EQ(-1, sDevice->delete_keypair(sDevice, key_blob, key_blob_length))
Kenny Root4fd0db72012-03-16 13:19:07 -0700735 << "Should not be able to delete key twice";
736 }
737}
738
739TEST_F(KeymasterTest, DeleteKeyPair_RSA_NullKey_Failure) {
740 /*
741 * This is only run if the module indicates it implements key deletion
742 * by implementing delete_keypair.
743 */
744 if (sDevice->delete_keypair != NULL) {
Kenny Root139d44f2012-11-20 14:37:40 -0800745 ASSERT_EQ(-1, sDevice->delete_keypair(sDevice, NULL, 0))
Kenny Root4fd0db72012-03-16 13:19:07 -0700746 << "Should not be able to delete null key";
747 }
748}
749
750/*
751 * DER-encoded PKCS#8 format RSA key. Generated using:
752 *
753 * openssl genrsa 512 | openssl pkcs8 -topk8 -nocrypt -outform der | recode ../x1
754 */
Kenny Root6e1683f2013-08-19 09:51:35 -0700755static uint8_t TEST_SIGN_RSA_KEY_1[] = {
Kenny Root4fd0db72012-03-16 13:19:07 -0700756 0x30, 0x82, 0x01, 0x56, 0x02, 0x01, 0x00, 0x30, 0x0D, 0x06, 0x09, 0x2A,
757 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82,
758 0x01, 0x40, 0x30, 0x82, 0x01, 0x3C, 0x02, 0x01, 0x00, 0x02, 0x41, 0x00,
759 0xBD, 0xC0, 0x7F, 0xEF, 0x75, 0x1D, 0x63, 0x2A, 0xD0, 0x9A, 0x26, 0xE5,
760 0x5B, 0xB9, 0x84, 0x7C, 0xE5, 0xC7, 0xE7, 0xDE, 0xFE, 0xB6, 0x54, 0xD9,
761 0xF0, 0x9B, 0xC2, 0xCF, 0x36, 0xDA, 0xE5, 0x4D, 0xC5, 0xD9, 0x25, 0x78,
762 0xBD, 0x55, 0x05, 0xBD, 0x86, 0xFB, 0x37, 0x15, 0x33, 0x42, 0x52, 0xED,
763 0xE5, 0xCD, 0xCB, 0xB7, 0xA2, 0x51, 0xFA, 0x36, 0xE9, 0x9C, 0x2E, 0x5D,
764 0xE3, 0xA5, 0x1F, 0x01, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x41, 0x00,
765 0x96, 0x71, 0xDE, 0xBD, 0x83, 0x94, 0x96, 0x40, 0xA6, 0xFD, 0xE1, 0xA2,
766 0xED, 0xD3, 0xAC, 0x28, 0xBE, 0xA2, 0x7D, 0xC3, 0xFF, 0x1D, 0x9F, 0x2E,
767 0xE0, 0xA7, 0x0E, 0x90, 0xEE, 0x44, 0x25, 0x92, 0xE3, 0x54, 0xDD, 0x55,
768 0xA3, 0xEF, 0x42, 0xF5, 0x52, 0x55, 0x41, 0x47, 0x5E, 0x00, 0xFB, 0x8B,
769 0x47, 0x5E, 0x45, 0x49, 0xEA, 0x3D, 0x2C, 0xFD, 0x9F, 0xEC, 0xC8, 0x4E,
770 0x4E, 0x86, 0x90, 0x31, 0x02, 0x21, 0x00, 0xE6, 0xA5, 0x55, 0xB3, 0x64,
771 0xAB, 0x90, 0x5E, 0xA2, 0xF5, 0x6B, 0x21, 0x4B, 0x15, 0xD6, 0x4A, 0xB6,
772 0x60, 0x24, 0x95, 0x65, 0xA2, 0xBE, 0xBA, 0x2A, 0x73, 0xFB, 0xFF, 0x2C,
773 0x61, 0x88, 0x9D, 0x02, 0x21, 0x00, 0xD2, 0x9C, 0x5B, 0xFE, 0x82, 0xA5,
774 0xFC, 0x52, 0x6A, 0x29, 0x38, 0xDB, 0x22, 0x3B, 0xEB, 0x74, 0x3B, 0xCA,
775 0xB4, 0xDD, 0x1D, 0xE4, 0x48, 0x60, 0x70, 0x19, 0x9B, 0x81, 0xC1, 0x83,
776 0x28, 0xB5, 0x02, 0x21, 0x00, 0x89, 0x2D, 0xFE, 0xF9, 0xF2, 0xBF, 0x43,
777 0xDF, 0xB5, 0xA6, 0xA8, 0x30, 0x26, 0x1B, 0x77, 0xD7, 0xF9, 0xFE, 0xD6,
778 0xE3, 0x70, 0x8E, 0xCA, 0x47, 0xA9, 0xA6, 0x50, 0x54, 0x25, 0xCE, 0x60,
779 0xD5, 0x02, 0x21, 0x00, 0xBE, 0x5A, 0xF8, 0x82, 0xE6, 0xCE, 0xE3, 0x6A,
780 0x11, 0xED, 0xC4, 0x27, 0xBB, 0x9F, 0x70, 0xC6, 0x93, 0xAC, 0x39, 0x20,
781 0x89, 0x7D, 0xE5, 0x34, 0xD4, 0xDD, 0x30, 0x42, 0x6D, 0x07, 0x00, 0xE9,
782 0x02, 0x20, 0x05, 0x91, 0xEF, 0x12, 0xD2, 0xD3, 0x6A, 0xD2, 0x96, 0x6B,
783 0x10, 0x62, 0xF9, 0xBA, 0xA4, 0x91, 0x48, 0x84, 0x40, 0x61, 0x67, 0x80,
784 0x68, 0x68, 0xC8, 0x60, 0xB3, 0x66, 0xC8, 0xF9, 0x08, 0x9A,
785};
786
787/*
Kenny Root6e1683f2013-08-19 09:51:35 -0700788 * DER-encoded PKCS#8 format EC key. Generated using:
789 *
790 * openssl ecparam -name prime256v1 -genkey -noout | openssl pkcs8 -topk8 -nocrypt -outform der | recode ../x1
791 */
792static uint8_t TEST_SIGN_EC_KEY_1[] = {
793 0x30, 0x81, 0x87, 0x02, 0x01, 0x00, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86,
794 0x48, 0xCE, 0x3D, 0x02, 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D,
795 0x03, 0x01, 0x07, 0x04, 0x6D, 0x30, 0x6B, 0x02, 0x01, 0x01, 0x04, 0x20,
796 0x9E, 0x66, 0x11, 0x6A, 0x89, 0xF5, 0x78, 0x57, 0xF3, 0x35, 0xA2, 0x46,
797 0x09, 0x06, 0x4B, 0x4D, 0x81, 0xEC, 0xD3, 0x9B, 0x0A, 0xC4, 0x68, 0x06,
798 0xB8, 0x42, 0x24, 0x5E, 0x74, 0x2C, 0x62, 0x79, 0xA1, 0x44, 0x03, 0x42,
799 0x00, 0x04, 0x35, 0xB5, 0x9A, 0x5C, 0xE5, 0x52, 0x35, 0xF2, 0x10, 0x6C,
800 0xD9, 0x98, 0x67, 0xED, 0x5E, 0xCB, 0x6B, 0xB8, 0x96, 0x5E, 0x54, 0x7C,
801 0x34, 0x2A, 0xA3, 0x3B, 0xF3, 0xD1, 0x39, 0x48, 0x36, 0x7A, 0xEA, 0xD8,
802 0xCA, 0xDD, 0x40, 0x8F, 0xE9, 0xE0, 0x95, 0x2E, 0x3F, 0x95, 0x0F, 0x14,
803 0xD6, 0x14, 0x78, 0xB5, 0xAD, 0x17, 0xD2, 0x5A, 0x41, 0x96, 0x99, 0x20,
804 0xC7, 0x5B, 0x0F, 0x60, 0xFD, 0xBA
805};
806
807/*
Kenny Root4fd0db72012-03-16 13:19:07 -0700808 * PKCS#1 v1.5 padded raw "Hello, world" Can be generated be generated by verifying
809 * the signature below in no padding mode:
810 *
811 * openssl rsautl -keyform der -inkey rsa.der -raw -verify -in test.sig
812 */
813static uint8_t TEST_SIGN_DATA_1[] = {
814 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
815 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
816 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
817 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
818 0xFF, 0xFF, 0xFF, 0x00, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x2C, 0x20, 0x77,
819 0x6F, 0x72, 0x6C, 0x64,
820};
821
822/*
Kenny Root6e1683f2013-08-19 09:51:35 -0700823 * Signature of TEST_SIGN_DATA_1 using TEST_SIGN_RSA_KEY_1. Generated using:
Kenny Root4fd0db72012-03-16 13:19:07 -0700824 *
825 * echo 'Hello, world' | openssl rsautl -keyform der -inkey rsa.der -sign | recode ../x1
826 */
Kenny Root6e1683f2013-08-19 09:51:35 -0700827static uint8_t TEST_SIGN_RSA_SIGNATURE_1[] = {
Kenny Root4fd0db72012-03-16 13:19:07 -0700828 0xA4, 0xBB, 0x76, 0x87, 0xFE, 0x61, 0x0C, 0x9D, 0xD6, 0xFF, 0x4B, 0x76,
829 0x96, 0x08, 0x36, 0x23, 0x11, 0xC6, 0x44, 0x3F, 0x88, 0x77, 0x97, 0xB2,
830 0xA8, 0x3B, 0xFB, 0x9C, 0x3C, 0xD3, 0x20, 0x65, 0xFD, 0x26, 0x3B, 0x2A,
831 0xB8, 0xB6, 0xD4, 0xDC, 0x91, 0xF7, 0xE2, 0xDE, 0x4D, 0xF7, 0x0E, 0xB9,
832 0x72, 0xA7, 0x29, 0x72, 0x82, 0x12, 0x7C, 0x53, 0x23, 0x21, 0xC4, 0xFF,
833 0x79, 0xE4, 0x91, 0x40,
834};
835
836/*
Kenny Root6e1683f2013-08-19 09:51:35 -0700837 * Identical to TEST_SIGN_RSA_SIGNATURE_1 except the last octet is '1' instead of '0'
Kenny Root4fd0db72012-03-16 13:19:07 -0700838 * This should fail any test.
839 */
840static uint8_t TEST_SIGN_SIGNATURE_BOGUS_1[] = {
841 0xA4, 0xBB, 0x76, 0x87, 0xFE, 0x61, 0x0C, 0x9D, 0xD6, 0xFF, 0x4B, 0x76,
842 0x96, 0x08, 0x36, 0x23, 0x11, 0xC6, 0x44, 0x3F, 0x88, 0x77, 0x97, 0xB2,
843 0xA8, 0x3B, 0xFB, 0x9C, 0x3C, 0xD3, 0x20, 0x65, 0xFD, 0x26, 0x3B, 0x2A,
844 0xB8, 0xB6, 0xD4, 0xDC, 0x91, 0xF7, 0xE2, 0xDE, 0x4D, 0xF7, 0x0E, 0xB9,
845 0x72, 0xA7, 0x29, 0x72, 0x82, 0x12, 0x7C, 0x53, 0x23, 0x21, 0xC4, 0xFF,
846 0x79, 0xE4, 0x91, 0x41,
847};
848
849TEST_F(KeymasterTest, SignData_RSA_Raw_Success) {
850 uint8_t* key_blob;
851 size_t key_blob_length;
852
Kenny Root6e1683f2013-08-19 09:51:35 -0700853 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700854 ASSERT_TRUE(testKey.get() != NULL);
855
Kenny Root4fd0db72012-03-16 13:19:07 -0700856 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700857 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700858 &key_blob, &key_blob_length))
859 << "Should successfully import an RSA key";
860 UniqueKey key(&sDevice, key_blob, key_blob_length);
861
862 keymaster_rsa_sign_params_t params = {
Andreas Gampe1aa58f92015-12-16 14:17:44 -0800863 .digest_type = DIGEST_NONE,
864 .padding_type = PADDING_NONE,
Kenny Root4fd0db72012-03-16 13:19:07 -0700865 };
866
867 uint8_t* sig;
868 size_t sig_length;
869
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700870 UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
871 ASSERT_TRUE(testData.get() != NULL);
872
Kenny Root139d44f2012-11-20 14:37:40 -0800873 ASSERT_EQ(0,
Kenny Root4fd0db72012-03-16 13:19:07 -0700874 sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700875 testData.get(), testData.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700876 &sig, &sig_length))
877 << "Should sign data successfully";
878 UniqueBlob sig_blob(sig, sig_length);
879
Kenny Root6e1683f2013-08-19 09:51:35 -0700880 UniqueBlob expected_sig(TEST_SIGN_RSA_SIGNATURE_1, sizeof(TEST_SIGN_RSA_SIGNATURE_1));
Kenny Root4fd0db72012-03-16 13:19:07 -0700881
Kenny Root139d44f2012-11-20 14:37:40 -0800882 ASSERT_EQ(expected_sig, sig_blob)
Kenny Root4fd0db72012-03-16 13:19:07 -0700883 << "Generated signature should match expected signature";
884
885 // The expected signature is actually stack data, so don't let it try to free.
886 uint8_t* unused __attribute__((unused)) = expected_sig.release();
887}
888
Kenny Root6e1683f2013-08-19 09:51:35 -0700889TEST_F(KeymasterTest, SignData_EC_Success) {
890 uint8_t* key_blob;
891 size_t key_blob_length;
892
893 UniqueReadOnlyBlob testKey(TEST_SIGN_EC_KEY_1, sizeof(TEST_SIGN_EC_KEY_1));
894 ASSERT_TRUE(testKey.get() != NULL);
895
896 ASSERT_EQ(0,
897 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
898 &key_blob, &key_blob_length))
899 << "Should successfully import an EC key";
900 UniqueKey key(&sDevice, key_blob, key_blob_length);
901
902 keymaster_ec_sign_params_t params = {
Andreas Gampe1aa58f92015-12-16 14:17:44 -0800903 .digest_type = DIGEST_NONE,
Kenny Root6e1683f2013-08-19 09:51:35 -0700904 };
905
906 uint8_t* sig;
907 size_t sig_length;
908
909 UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
910 ASSERT_TRUE(testData.get() != NULL);
911
912 ASSERT_EQ(0,
913 sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
914 testData.get(), testData.length(),
915 &sig, &sig_length))
916 << "Should sign data successfully";
917 UniqueBlob sig_blob(sig, sig_length);
918
919 uint8_t* x509_data;
920 size_t x509_data_length;
921 ASSERT_EQ(0,
922 sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
923 &x509_data, &x509_data_length))
924 << "Should be able to retrieve RSA public key successfully";
925 UniqueBlob x509_blob(x509_data, x509_data_length);
926
927 const unsigned char *tmp = static_cast<const unsigned char*>(x509_blob.get());
928 Unique_EVP_PKEY expected(d2i_PUBKEY((EVP_PKEY**) NULL, &tmp,
929 static_cast<long>(x509_blob.length())));
930
931 Unique_EC_KEY ecKey(EVP_PKEY_get1_EC_KEY(expected.get()));
932
933 ASSERT_EQ(1, ECDSA_verify(0, testData.get(), testData.length(), sig_blob.get(), sig_blob.length(), ecKey.get()))
934 << "Signature should verify";
935}
936
Kenny Root4fd0db72012-03-16 13:19:07 -0700937TEST_F(KeymasterTest, SignData_RSA_Raw_InvalidSizeInput_Failure) {
938 uint8_t* key_blob;
939 size_t key_blob_length;
940
Kenny Root6e1683f2013-08-19 09:51:35 -0700941 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700942 ASSERT_TRUE(testKey.get() != NULL);
943
Kenny Root4fd0db72012-03-16 13:19:07 -0700944 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700945 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700946 &key_blob, &key_blob_length))
947 << "Should successfully import an RSA key";
948 UniqueKey key(&sDevice, key_blob, key_blob_length);
949
950 keymaster_rsa_sign_params_t params = {
Andreas Gampe1aa58f92015-12-16 14:17:44 -0800951 .digest_type = DIGEST_NONE,
952 .padding_type = PADDING_NONE,
Kenny Root4fd0db72012-03-16 13:19:07 -0700953 };
954
955 uint8_t* sig;
956 size_t sig_length;
957
Kenny Root6e1683f2013-08-19 09:51:35 -0700958 UniqueReadOnlyBlob testData(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700959 ASSERT_TRUE(testData.get() != NULL);
960
Kenny Root139d44f2012-11-20 14:37:40 -0800961 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -0700962 sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700963 testData.get(), testData.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700964 &sig, &sig_length))
965 << "Should not be able to do raw signature on incorrect size data";
966}
967
968TEST_F(KeymasterTest, SignData_RSA_Raw_NullKey_Failure) {
969 keymaster_rsa_sign_params_t params = {
Andreas Gampe1aa58f92015-12-16 14:17:44 -0800970 .digest_type = DIGEST_NONE,
971 .padding_type = PADDING_NONE,
Kenny Root4fd0db72012-03-16 13:19:07 -0700972 };
973
974 uint8_t* sig;
975 size_t sig_length;
976
Kenny Root6e1683f2013-08-19 09:51:35 -0700977 UniqueReadOnlyBlob testData(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700978 ASSERT_TRUE(testData.get() != NULL);
979
Kenny Root139d44f2012-11-20 14:37:40 -0800980 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -0700981 sDevice->sign_data(sDevice, &params, NULL, 0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700982 testData.get(), testData.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700983 &sig, &sig_length))
984 << "Should not be able to do raw signature on incorrect size data";
985}
986
987TEST_F(KeymasterTest, SignData_RSA_Raw_NullInput_Failure) {
988 uint8_t* key_blob;
989 size_t key_blob_length;
990
Kenny Root6e1683f2013-08-19 09:51:35 -0700991 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700992 ASSERT_TRUE(testKey.get() != NULL);
993
Kenny Root4fd0db72012-03-16 13:19:07 -0700994 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700995 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700996 &key_blob, &key_blob_length))
997 << "Should successfully import an RSA key";
998 UniqueKey key(&sDevice, key_blob, key_blob_length);
999
1000 keymaster_rsa_sign_params_t params = {
Andreas Gampe1aa58f92015-12-16 14:17:44 -08001001 .digest_type = DIGEST_NONE,
1002 .padding_type = PADDING_NONE,
Kenny Root4fd0db72012-03-16 13:19:07 -07001003 };
1004
1005 uint8_t* sig;
1006 size_t sig_length;
1007
Kenny Root139d44f2012-11-20 14:37:40 -08001008 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -07001009 sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
1010 NULL, 0,
1011 &sig, &sig_length))
1012 << "Should error when input data is null";
1013}
1014
1015TEST_F(KeymasterTest, SignData_RSA_Raw_NullOutput_Failure) {
1016 uint8_t* key_blob;
1017 size_t key_blob_length;
1018
Kenny Root6e1683f2013-08-19 09:51:35 -07001019 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001020 ASSERT_TRUE(testKey.get() != NULL);
1021
Kenny Root4fd0db72012-03-16 13:19:07 -07001022 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001023 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -07001024 &key_blob, &key_blob_length))
1025 << "Should successfully import an RSA key";
1026 UniqueKey key(&sDevice, key_blob, key_blob_length);
1027
1028 keymaster_rsa_sign_params_t params = {
Andreas Gampe1aa58f92015-12-16 14:17:44 -08001029 .digest_type = DIGEST_NONE,
1030 .padding_type = PADDING_NONE,
Kenny Root4fd0db72012-03-16 13:19:07 -07001031 };
1032
Kenny Root6e1683f2013-08-19 09:51:35 -07001033 UniqueReadOnlyBlob testData(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001034 ASSERT_TRUE(testData.get() != NULL);
1035
Kenny Root139d44f2012-11-20 14:37:40 -08001036 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -07001037 sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001038 testData.get(), testData.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -07001039 NULL, NULL))
1040 << "Should error when output is null";
1041}
1042
1043TEST_F(KeymasterTest, VerifyData_RSA_Raw_Success) {
1044 uint8_t* key_blob;
1045 size_t key_blob_length;
1046
Kenny Root6e1683f2013-08-19 09:51:35 -07001047 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001048 ASSERT_TRUE(testKey.get() != NULL);
1049
Kenny Root4fd0db72012-03-16 13:19:07 -07001050 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001051 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -07001052 &key_blob, &key_blob_length))
1053 << "Should successfully import an RSA key";
1054 UniqueKey key(&sDevice, key_blob, key_blob_length);
1055
1056 keymaster_rsa_sign_params_t params = {
Andreas Gampe1aa58f92015-12-16 14:17:44 -08001057 .digest_type = DIGEST_NONE,
1058 .padding_type = PADDING_NONE,
Kenny Root4fd0db72012-03-16 13:19:07 -07001059 };
1060
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001061 UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
1062 ASSERT_TRUE(testData.get() != NULL);
1063
Kenny Root6e1683f2013-08-19 09:51:35 -07001064 UniqueReadOnlyBlob testSig(TEST_SIGN_RSA_SIGNATURE_1, sizeof(TEST_SIGN_RSA_SIGNATURE_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001065 ASSERT_TRUE(testSig.get() != NULL);
1066
Kenny Root139d44f2012-11-20 14:37:40 -08001067 ASSERT_EQ(0,
Kenny Root4fd0db72012-03-16 13:19:07 -07001068 sDevice->verify_data(sDevice, &params, key_blob, key_blob_length,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001069 testData.get(), testData.length(),
1070 testSig.get(), testSig.length()))
Kenny Root4fd0db72012-03-16 13:19:07 -07001071 << "Should verify data successfully";
1072}
1073
Kenny Root6e1683f2013-08-19 09:51:35 -07001074TEST_F(KeymasterTest, VerifyData_EC_Raw_Success) {
1075 uint8_t* key_blob;
1076 size_t key_blob_length;
1077
1078 UniqueReadOnlyBlob testKey(TEST_SIGN_EC_KEY_1, sizeof(TEST_SIGN_EC_KEY_1));
1079 ASSERT_TRUE(testKey.get() != NULL);
1080
1081 ASSERT_EQ(0,
1082 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
1083 &key_blob, &key_blob_length))
1084 << "Should successfully import an RSA key";
1085 UniqueKey key(&sDevice, key_blob, key_blob_length);
1086
1087 keymaster_ec_sign_params_t params = {
Andreas Gampe1aa58f92015-12-16 14:17:44 -08001088 .digest_type = DIGEST_NONE,
Kenny Root6e1683f2013-08-19 09:51:35 -07001089 };
1090
1091 uint8_t* sig;
1092 size_t sig_length;
1093
1094 UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
1095 ASSERT_TRUE(testData.get() != NULL);
1096
1097 ASSERT_EQ(0,
1098 sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
1099 testData.get(), testData.length(),
1100 &sig, &sig_length))
1101 << "Should sign data successfully";
1102 UniqueBlob sig_blob(sig, sig_length);
1103
1104 ASSERT_EQ(0,
1105 sDevice->verify_data(sDevice, &params, key_blob, key_blob_length,
1106 testData.get(), testData.length(),
1107 sig_blob.get(), sig_blob.length()))
1108 << "Should verify data successfully";
1109}
1110
Kenny Root4fd0db72012-03-16 13:19:07 -07001111TEST_F(KeymasterTest, VerifyData_RSA_Raw_BadSignature_Failure) {
1112 uint8_t* key_blob;
1113 size_t key_blob_length;
1114
Kenny Root6e1683f2013-08-19 09:51:35 -07001115 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001116 ASSERT_TRUE(testKey.get() != NULL);
1117
Kenny Root4fd0db72012-03-16 13:19:07 -07001118 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001119 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -07001120 &key_blob, &key_blob_length))
1121 << "Should successfully import an RSA key";
1122 UniqueKey key(&sDevice, key_blob, key_blob_length);
1123
1124 keymaster_rsa_sign_params_t params = {
Andreas Gampe1aa58f92015-12-16 14:17:44 -08001125 .digest_type = DIGEST_NONE,
1126 .padding_type = PADDING_NONE,
Kenny Root4fd0db72012-03-16 13:19:07 -07001127 };
1128
Kenny Root139d44f2012-11-20 14:37:40 -08001129 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -07001130 sDevice->verify_data(sDevice, &params, key_blob, key_blob_length,
1131 TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1),
1132 TEST_SIGN_SIGNATURE_BOGUS_1, sizeof(TEST_SIGN_SIGNATURE_BOGUS_1)))
1133 << "Should sign data successfully";
1134}
1135
Kenny Root6e1683f2013-08-19 09:51:35 -07001136TEST_F(KeymasterTest, VerifyData_EC_Raw_BadSignature_Failure) {
1137 uint8_t* key_blob;
1138 size_t key_blob_length;
1139
1140 UniqueReadOnlyBlob testKey(TEST_SIGN_EC_KEY_1, sizeof(TEST_SIGN_EC_KEY_1));
1141 ASSERT_TRUE(testKey.get() != NULL);
1142
1143 ASSERT_EQ(0,
1144 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
1145 &key_blob, &key_blob_length))
1146 << "Should successfully import an RSA key";
1147 UniqueKey key(&sDevice, key_blob, key_blob_length);
1148
1149 keymaster_ec_sign_params_t params = {
Andreas Gampe1aa58f92015-12-16 14:17:44 -08001150 .digest_type = DIGEST_NONE,
Kenny Root6e1683f2013-08-19 09:51:35 -07001151 };
1152
1153 ASSERT_EQ(-1,
1154 sDevice->verify_data(sDevice, &params, key_blob, key_blob_length,
1155 TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1),
1156 TEST_SIGN_SIGNATURE_BOGUS_1, sizeof(TEST_SIGN_SIGNATURE_BOGUS_1)))
1157 << "Should sign data successfully";
1158}
1159
Kenny Root4fd0db72012-03-16 13:19:07 -07001160TEST_F(KeymasterTest, VerifyData_RSA_Raw_NullKey_Failure) {
1161 keymaster_rsa_sign_params_t params = {
Andreas Gampe1aa58f92015-12-16 14:17:44 -08001162 .digest_type = DIGEST_NONE,
1163 .padding_type = PADDING_NONE,
Kenny Root4fd0db72012-03-16 13:19:07 -07001164 };
1165
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001166 UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
1167 ASSERT_TRUE(testData.get() != NULL);
1168
1169 UniqueReadOnlyBlob testSig(TEST_SIGN_SIGNATURE_BOGUS_1, sizeof(TEST_SIGN_SIGNATURE_BOGUS_1));
1170 ASSERT_TRUE(testSig.get() != NULL);
1171
Kenny Root139d44f2012-11-20 14:37:40 -08001172 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -07001173 sDevice->verify_data(sDevice, &params, NULL, 0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001174 testData.get(), testData.length(),
1175 testSig.get(), testSig.length()))
Kenny Root4fd0db72012-03-16 13:19:07 -07001176 << "Should fail when key is null";
1177}
1178
1179TEST_F(KeymasterTest, VerifyData_RSA_NullInput_Failure) {
1180 uint8_t* key_blob;
1181 size_t key_blob_length;
1182
1183 ASSERT_EQ(0,
Kenny Root6e1683f2013-08-19 09:51:35 -07001184 sDevice->import_keypair(sDevice, TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1),
Kenny Root4fd0db72012-03-16 13:19:07 -07001185 &key_blob, &key_blob_length))
1186 << "Should successfully import an RSA key";
1187 UniqueKey key(&sDevice, key_blob, key_blob_length);
1188
1189 keymaster_rsa_sign_params_t params = {
Andreas Gampe1aa58f92015-12-16 14:17:44 -08001190 .digest_type = DIGEST_NONE,
1191 .padding_type = PADDING_NONE,
Kenny Root4fd0db72012-03-16 13:19:07 -07001192 };
1193
Kenny Root6e1683f2013-08-19 09:51:35 -07001194 UniqueReadOnlyBlob testSig(TEST_SIGN_RSA_SIGNATURE_1, sizeof(TEST_SIGN_RSA_SIGNATURE_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001195 ASSERT_TRUE(testSig.get() != NULL);
1196
Kenny Root139d44f2012-11-20 14:37:40 -08001197 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -07001198 sDevice->verify_data(sDevice, &params, key_blob, key_blob_length,
1199 NULL, 0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001200 testSig.get(), testSig.length()))
Kenny Root4fd0db72012-03-16 13:19:07 -07001201 << "Should fail on null input";
1202}
1203
1204TEST_F(KeymasterTest, VerifyData_RSA_NullSignature_Failure) {
1205 uint8_t* key_blob;
1206 size_t key_blob_length;
1207
Kenny Root6e1683f2013-08-19 09:51:35 -07001208 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001209 ASSERT_TRUE(testKey.get() != NULL);
1210
Kenny Root4fd0db72012-03-16 13:19:07 -07001211 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001212 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -07001213 &key_blob, &key_blob_length))
1214 << "Should successfully import an RSA key";
1215 UniqueKey key(&sDevice, key_blob, key_blob_length);
1216
1217 keymaster_rsa_sign_params_t params = {
Andreas Gampe1aa58f92015-12-16 14:17:44 -08001218 .digest_type = DIGEST_NONE,
1219 .padding_type = PADDING_NONE,
Kenny Root4fd0db72012-03-16 13:19:07 -07001220 };
1221
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001222 UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
1223 ASSERT_TRUE(testData.get() != NULL);
1224
Kenny Root139d44f2012-11-20 14:37:40 -08001225 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -07001226 sDevice->verify_data(sDevice, &params, key.get(), key.length(),
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001227 testData.get(), testData.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -07001228 NULL, 0))
1229 << "Should fail on null signature";
1230}
1231
Kenny Root8ae65e72012-03-23 16:17:28 -07001232TEST_F(KeymasterTest, EraseAll_Success) {
1233 uint8_t *key1_blob, *key2_blob;
1234 size_t key1_blob_length, key2_blob_length;
1235
1236 // Only test this if the device says it supports delete_all
1237 if (sDevice->delete_all == NULL) {
1238 return;
1239 }
1240
Kenny Root6e1683f2013-08-19 09:51:35 -07001241 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001242 ASSERT_TRUE(testKey.get() != NULL);
1243
Kenny Root8ae65e72012-03-23 16:17:28 -07001244 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001245 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root8ae65e72012-03-23 16:17:28 -07001246 &key1_blob, &key1_blob_length))
1247 << "Should successfully import an RSA key";
1248 UniqueKey key1(&sDevice, key1_blob, key1_blob_length);
1249
Kenny Root6e1683f2013-08-19 09:51:35 -07001250 UniqueReadOnlyBlob testKey2(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001251 ASSERT_TRUE(testKey2.get() != NULL);
1252
Kenny Root8ae65e72012-03-23 16:17:28 -07001253 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001254 sDevice->import_keypair(sDevice, testKey2.get(), testKey2.length(),
Kenny Root8ae65e72012-03-23 16:17:28 -07001255 &key2_blob, &key2_blob_length))
1256 << "Should successfully import an RSA key";
1257 UniqueKey key2(&sDevice, key2_blob, key2_blob_length);
1258
Kenny Root139d44f2012-11-20 14:37:40 -08001259 ASSERT_EQ(0, sDevice->delete_all(sDevice))
Kenny Root8ae65e72012-03-23 16:17:28 -07001260 << "Should erase all keys";
1261
1262 key1.reset();
1263
1264 uint8_t* x509_data;
1265 size_t x509_data_length;
1266 ASSERT_EQ(-1,
1267 sDevice->get_keypair_public(sDevice, key1_blob, key1_blob_length,
1268 &x509_data, &x509_data_length))
1269 << "Should be able to retrieve RSA public key 1 successfully";
1270
1271 ASSERT_EQ(-1,
1272 sDevice->get_keypair_public(sDevice, key2_blob, key2_blob_length,
1273 &x509_data, &x509_data_length))
1274 << "Should be able to retrieve RSA public key 2 successfully";
1275}
1276
Kenny Root4fd0db72012-03-16 13:19:07 -07001277}