blob: 562c8ed3b3189911e4805322e039f6df459fd11b [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>
David Benjamin4af3eaf2019-08-08 13:05:23 -040032#include <openssl/pkcs8.h>
Kenny Root8467a6d2012-08-08 17:04:40 -070033#include <openssl/x509.h>
34
Kenny Rooteca8b3c2013-04-26 16:46:01 -070035#define LOG_TAG "keymaster_test"
36#include <utils/Log.h>
Kenny Roota4cef692013-09-11 14:51:09 -070037
Shawn Willden302d2522015-02-24 09:17:38 -070038#include <hardware/keymaster0.h>
Kenny Root4fd0db72012-03-16 13:19:07 -070039
40namespace android {
41
Andreas Gampee9e7c202017-10-02 11:57:51 -070042class UniqueBlob : public std::unique_ptr<uint8_t[]> {
Kenny Root4fd0db72012-03-16 13:19:07 -070043public:
Chih-Hung Hsiehbcfe2932016-05-02 15:51:12 -070044 explicit UniqueBlob(size_t length) :
Kenny Rooteca8b3c2013-04-26 16:46:01 -070045 mLength(length) {
46 }
47
Kenny Root4fd0db72012-03-16 13:19:07 -070048 UniqueBlob(uint8_t* bytes, size_t length) :
Andreas Gampee9e7c202017-10-02 11:57:51 -070049 std::unique_ptr<uint8_t[]>(bytes), mLength(length) {
Kenny Root4fd0db72012-03-16 13:19:07 -070050 }
51
52 bool operator==(const UniqueBlob &other) const {
53 if (other.length() != mLength) {
54 return false;
55 }
56
57 const uint8_t* mine = get();
58 const uint8_t* theirs = other.get();
59
60 for (size_t i = 0; i < mLength; i++) {
61 if (mine[i] != theirs[i]) {
62 return false;
63 }
64 }
65
66 return true;
67 }
68
69 size_t length() const {
70 return mLength;
71 }
72
73 friend std::ostream &operator<<(std::ostream &stream, const UniqueBlob& blob);
74
75private:
76 size_t mLength;
77};
78
79std::ostream &operator<<(std::ostream &stream, const UniqueBlob& blob) {
80 const size_t length = blob.mLength;
81 stream << "Blob length=" << length << " < ";
82
83 const uint8_t* data = blob.get();
84 for (size_t i = 0; i < length; i++) {
85 stream << std::hex << std::setw(2) << std::setfill('0')
86 << static_cast<unsigned int>(data[i]) << ' ';
87 }
88 stream << '>' << std::endl;
89
90 return stream;
91}
92
93class UniqueKey : public UniqueBlob {
94public:
Shawn Willden302d2522015-02-24 09:17:38 -070095 UniqueKey(keymaster0_device_t** dev, uint8_t* bytes, size_t length) :
Kenny Root4fd0db72012-03-16 13:19:07 -070096 UniqueBlob(bytes, length), mDevice(dev) {
97 }
98
99 ~UniqueKey() {
100 if (mDevice != NULL && *mDevice != NULL) {
Shawn Willden302d2522015-02-24 09:17:38 -0700101 keymaster0_device_t* dev = *mDevice;
Kenny Root4fd0db72012-03-16 13:19:07 -0700102 if (dev->delete_keypair != NULL) {
103 dev->delete_keypair(dev, get(), length());
104 }
105 }
106 }
107
108private:
Shawn Willden302d2522015-02-24 09:17:38 -0700109 keymaster0_device_t** mDevice;
Kenny Root4fd0db72012-03-16 13:19:07 -0700110};
111
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700112class UniqueReadOnlyBlob {
113public:
114 UniqueReadOnlyBlob(uint8_t* data, size_t dataSize) :
115 mDataSize(dataSize) {
116 int pageSize = sysconf(_SC_PAGE_SIZE);
117 if (pageSize == -1) {
118 return;
119 }
120
121 int fd = open("/dev/zero", O_RDONLY);
122 if (fd == -1) {
123 return;
124 }
125
126 mBufferSize = (dataSize + pageSize - 1) & ~(pageSize - 1);
127 uint8_t* buffer = (uint8_t*) mmap(NULL, mBufferSize, PROT_READ | PROT_WRITE,
128 MAP_PRIVATE, fd, 0);
129 close(fd);
130
131 if (buffer == NULL) {
132 return;
133 }
134
135 memcpy(buffer, data, dataSize);
136 if (mprotect(buffer, mBufferSize, PROT_READ) == -1) {
137 munmap(buffer, mBufferSize);
138 return;
139 }
140
141 mBuffer = buffer;
142 }
143
144 ~UniqueReadOnlyBlob() {
145 munmap(mBuffer, mBufferSize);
146 }
147
148 uint8_t* get() const {
149 return mBuffer;
150 }
151
152 size_t length() const {
153 return mDataSize;
154 }
155
156private:
157 uint8_t* mBuffer;
158 size_t mBufferSize;
159 size_t mDataSize;
160};
161
Kenny Root6e1683f2013-08-19 09:51:35 -0700162
Kenny Root4fd0db72012-03-16 13:19:07 -0700163/*
164 * DER-encoded PKCS#8 format RSA key. Generated using:
165 *
166 * openssl genrsa 2048 | openssl pkcs8 -topk8 -nocrypt -outform der | recode ../x1
167 */
Kenny Root6e1683f2013-08-19 09:51:35 -0700168static uint8_t TEST_RSA_KEY_1[] = {
Kenny Root4fd0db72012-03-16 13:19:07 -0700169 0x30, 0x82, 0x04, 0xBE, 0x02, 0x01, 0x00, 0x30, 0x0D, 0x06, 0x09, 0x2A,
170 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82,
171 0x04, 0xA8, 0x30, 0x82, 0x04, 0xA4, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01,
172 0x01, 0x00, 0xD8, 0x58, 0xD4, 0x9F, 0xC0, 0xE8, 0xF0, 0xFF, 0x87, 0x27,
173 0x43, 0xE6, 0x2E, 0xE6, 0x9A, 0x42, 0x3B, 0x39, 0x94, 0x84, 0x43, 0x55,
174 0x8D, 0x20, 0x5B, 0x71, 0x88, 0xE6, 0xD1, 0x62, 0xC8, 0xF2, 0x20, 0xD0,
175 0x75, 0x13, 0x83, 0xA3, 0x5D, 0x19, 0xA8, 0x62, 0xD0, 0x5F, 0x3E, 0x8A,
176 0x7C, 0x0E, 0x26, 0xA9, 0xFF, 0xB2, 0x5E, 0x63, 0xAA, 0x3C, 0x8D, 0x13,
177 0x41, 0xAA, 0xD5, 0x03, 0x01, 0x01, 0x53, 0xC9, 0x02, 0x1C, 0xEC, 0xE8,
178 0xC4, 0x70, 0x3F, 0x43, 0xE5, 0x51, 0xD0, 0x6E, 0x52, 0x0B, 0xC4, 0x0A,
179 0xA3, 0x61, 0xDE, 0xE3, 0x72, 0x0C, 0x94, 0xF1, 0x1C, 0x2D, 0x36, 0x77,
180 0xBB, 0x16, 0xA8, 0x63, 0x4B, 0xD1, 0x07, 0x00, 0x42, 0x2D, 0x2B, 0x10,
181 0x80, 0x45, 0xF3, 0x0C, 0xF9, 0xC5, 0xAC, 0xCC, 0x64, 0x87, 0xFD, 0x5D,
182 0xC8, 0x51, 0xD4, 0x1C, 0x9E, 0x6E, 0x9B, 0xC4, 0x27, 0x5E, 0x73, 0xA7,
183 0x2A, 0xF6, 0x90, 0x42, 0x0C, 0x34, 0x93, 0xB7, 0x02, 0x19, 0xA9, 0x64,
184 0x6C, 0x46, 0x3B, 0x40, 0x02, 0x2F, 0x54, 0x69, 0x79, 0x26, 0x7D, 0xF6,
185 0x85, 0x90, 0x01, 0xD0, 0x21, 0x07, 0xD0, 0x14, 0x00, 0x65, 0x9C, 0xAC,
186 0x24, 0xE8, 0x78, 0x42, 0x3B, 0x90, 0x75, 0x19, 0x55, 0x11, 0x4E, 0xD9,
187 0xE6, 0x97, 0x87, 0xBC, 0x8D, 0x2C, 0x9B, 0xF0, 0x1F, 0x14, 0xEB, 0x6A,
188 0x57, 0xCE, 0x78, 0xAD, 0xCE, 0xD9, 0xFB, 0xB9, 0xA1, 0xEF, 0x0C, 0x1F,
189 0xDD, 0xE3, 0x5B, 0x73, 0xA0, 0xEC, 0x37, 0x9C, 0xE1, 0xFD, 0x86, 0x28,
190 0xC3, 0x4A, 0x42, 0xD0, 0xA3, 0xFE, 0x57, 0x09, 0x29, 0xD8, 0xF6, 0xEC,
191 0xE3, 0xC0, 0x71, 0x7C, 0x29, 0x27, 0xC2, 0xD1, 0x3E, 0x22, 0xBC, 0xBD,
192 0x5A, 0x85, 0x41, 0xF6, 0x15, 0xDA, 0x0C, 0x58, 0x5A, 0x61, 0x5B, 0x78,
193 0xB8, 0xAA, 0xEC, 0x5C, 0x1C, 0x79, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02,
194 0x82, 0x01, 0x00, 0x1D, 0x10, 0x31, 0xE0, 0x14, 0x26, 0x36, 0xD9, 0xDC,
195 0xEA, 0x25, 0x70, 0xF2, 0xB3, 0xFF, 0xDD, 0x0D, 0xDF, 0xBA, 0x57, 0xDA,
196 0x43, 0xCF, 0xE5, 0x9C, 0xE3, 0x2F, 0xA4, 0xF2, 0x53, 0xF6, 0xF2, 0xAF,
197 0xFD, 0xD0, 0xFC, 0x82, 0x1E, 0x9C, 0x0F, 0x2A, 0x53, 0xBB, 0xF2, 0x4F,
198 0x90, 0x83, 0x01, 0xD3, 0xA7, 0xDA, 0xB5, 0xB7, 0x80, 0x64, 0x0A, 0x26,
199 0x59, 0x83, 0xE4, 0xD3, 0x20, 0xC8, 0x2D, 0xC9, 0x77, 0xA3, 0x55, 0x07,
200 0x6E, 0x6D, 0x95, 0x36, 0xAA, 0x84, 0x4F, 0xED, 0x54, 0x24, 0xA9, 0x77,
201 0xF8, 0x85, 0xE2, 0x4B, 0xF2, 0xFA, 0x0B, 0x3E, 0xA6, 0xF5, 0x46, 0x0D,
202 0x9F, 0x1F, 0xFE, 0xF7, 0x37, 0xFF, 0xA3, 0x60, 0xF1, 0x63, 0xF2, 0x75,
203 0x6A, 0x8E, 0x10, 0xD7, 0x89, 0xD2, 0xB3, 0xFF, 0x76, 0xA5, 0xBA, 0xAF,
204 0x0A, 0xBE, 0x32, 0x5F, 0xF0, 0x48, 0x48, 0x4B, 0x9C, 0x9A, 0x3D, 0x12,
205 0xA7, 0xD2, 0x07, 0xC7, 0x59, 0x32, 0x94, 0x95, 0x65, 0x2F, 0x87, 0x34,
206 0x76, 0xBA, 0x7C, 0x08, 0x4B, 0xAB, 0xA6, 0x24, 0xDF, 0x64, 0xDB, 0x48,
207 0x63, 0x42, 0x06, 0xE2, 0x2C, 0x3D, 0xFB, 0xE5, 0x47, 0x81, 0x94, 0x98,
208 0xF7, 0x32, 0x4B, 0x28, 0xEB, 0x42, 0xB8, 0xE9, 0x8E, 0xFC, 0xC9, 0x43,
209 0xC9, 0x47, 0xE6, 0xE7, 0x1C, 0xDC, 0x71, 0xEF, 0x4D, 0x8A, 0xB1, 0xFC,
210 0x45, 0x37, 0xEC, 0xB3, 0x16, 0x88, 0x5B, 0xE2, 0xEC, 0x8B, 0x6B, 0x75,
211 0x16, 0xBE, 0x6B, 0xF8, 0x2C, 0xF8, 0xC9, 0xD1, 0xF7, 0x55, 0x87, 0x57,
212 0x5F, 0xDE, 0xF4, 0x7E, 0x72, 0x13, 0x06, 0x2A, 0x21, 0xB7, 0x78, 0x21,
213 0x05, 0xFD, 0xE2, 0x5F, 0x7B, 0x7C, 0xF0, 0x26, 0x2B, 0x75, 0x7F, 0x68,
214 0xF9, 0xA6, 0x98, 0xFD, 0x54, 0x0E, 0xCC, 0x22, 0x41, 0x7F, 0x29, 0x81,
215 0x2F, 0xA3, 0x3C, 0x3D, 0x64, 0xC8, 0x41, 0x02, 0x81, 0x81, 0x00, 0xFA,
216 0xFA, 0xE4, 0x2E, 0x30, 0xF0, 0x7A, 0x8D, 0x95, 0xB8, 0x39, 0x58, 0x27,
217 0x0F, 0x89, 0x0C, 0xDF, 0xFE, 0x2F, 0x55, 0x3B, 0x6F, 0xDD, 0x5F, 0x12,
218 0xB3, 0xD1, 0xCF, 0x5B, 0x8D, 0xB6, 0x10, 0x1C, 0x87, 0x0C, 0x30, 0x89,
219 0x2D, 0xBB, 0xB8, 0xA1, 0x78, 0x0F, 0x54, 0xA6, 0x36, 0x46, 0x05, 0x8B,
220 0x5A, 0xFF, 0x48, 0x03, 0x13, 0xAE, 0x95, 0x96, 0x5D, 0x6C, 0xDA, 0x5D,
221 0xF7, 0xAD, 0x1D, 0x33, 0xED, 0x23, 0xF5, 0x4B, 0x03, 0x78, 0xE7, 0x50,
222 0xD1, 0x2D, 0x95, 0x22, 0x35, 0x02, 0x5B, 0x4A, 0x4E, 0x73, 0xC9, 0xB7,
223 0x05, 0xC4, 0x21, 0x86, 0x1F, 0x1E, 0x40, 0x83, 0xBC, 0x8A, 0x3A, 0x95,
224 0x24, 0x62, 0xF4, 0x58, 0x38, 0x64, 0x4A, 0x89, 0x8A, 0x27, 0x59, 0x12,
225 0x9D, 0x21, 0xC3, 0xA6, 0x42, 0x1E, 0x2A, 0x3F, 0xD8, 0x65, 0x1F, 0x6E,
226 0x3E, 0x4D, 0x5C, 0xCC, 0xEA, 0x8E, 0x15, 0x02, 0x81, 0x81, 0x00, 0xDC,
227 0xAC, 0x9B, 0x00, 0xDB, 0xF9, 0xB2, 0xBF, 0xC4, 0x5E, 0xB6, 0xB7, 0x63,
228 0xEB, 0x13, 0x4B, 0xE2, 0xA6, 0xC8, 0x72, 0x90, 0xD8, 0xC2, 0x33, 0x33,
229 0xF0, 0x66, 0x75, 0xBD, 0x50, 0x7C, 0xA4, 0x8F, 0x82, 0xFB, 0xFF, 0x44,
230 0x3B, 0xE7, 0x15, 0x3A, 0x0C, 0x7A, 0xF8, 0x92, 0x86, 0x4A, 0x79, 0x32,
231 0x08, 0x82, 0x1D, 0x6A, 0xBA, 0xAD, 0x8A, 0xB3, 0x3D, 0x7F, 0xA5, 0xB4,
232 0x6F, 0x67, 0x86, 0x7E, 0xB2, 0x9C, 0x2A, 0xF6, 0x7C, 0x49, 0x21, 0xC5,
233 0x3F, 0x00, 0x3F, 0x9B, 0xF7, 0x0F, 0x6C, 0x35, 0x80, 0x75, 0x73, 0xC0,
234 0xF8, 0x3E, 0x30, 0x5F, 0x74, 0x2F, 0x15, 0x41, 0xEA, 0x0F, 0xCE, 0x0E,
235 0x18, 0x17, 0x68, 0xBA, 0xC4, 0x29, 0xF2, 0xE2, 0x2C, 0x1D, 0x55, 0x83,
236 0xB6, 0x64, 0x2E, 0x03, 0x12, 0xA4, 0x0D, 0xBF, 0x4F, 0x2E, 0xBE, 0x7C,
237 0x41, 0xD9, 0xCD, 0xD0, 0x52, 0x91, 0xD5, 0x02, 0x81, 0x81, 0x00, 0xD4,
238 0x55, 0xEB, 0x32, 0xC1, 0x28, 0xD3, 0x26, 0x72, 0x22, 0xB8, 0x31, 0x42,
239 0x6A, 0xBC, 0x52, 0x6E, 0x37, 0x48, 0xA8, 0x5D, 0x6E, 0xD8, 0xE5, 0x14,
240 0x97, 0x99, 0xCC, 0x4A, 0xF2, 0xEB, 0xB3, 0x59, 0xCF, 0x4F, 0x9A, 0xC8,
241 0x94, 0x2E, 0x9B, 0x97, 0xD0, 0x51, 0x78, 0x16, 0x5F, 0x18, 0x82, 0x9C,
242 0x51, 0xD2, 0x64, 0x84, 0x65, 0xE4, 0x70, 0x9E, 0x14, 0x50, 0x81, 0xB6,
243 0xBA, 0x52, 0x75, 0xC0, 0x76, 0xC2, 0xD3, 0x46, 0x31, 0x9B, 0xDA, 0x67,
244 0xDF, 0x71, 0x27, 0x19, 0x17, 0xAB, 0xF4, 0xBC, 0x3A, 0xFF, 0x6F, 0x0B,
245 0x2F, 0x0F, 0xAE, 0x25, 0x20, 0xB2, 0xA1, 0x76, 0x52, 0xCE, 0xC7, 0x9D,
246 0x62, 0x79, 0x6D, 0xAC, 0x2D, 0x99, 0x7C, 0x0E, 0x3D, 0x19, 0xE9, 0x1B,
247 0xFC, 0x60, 0x92, 0x7C, 0x58, 0xB7, 0xD8, 0x9A, 0xC7, 0x63, 0x56, 0x62,
248 0x18, 0xC7, 0xAE, 0xD9, 0x97, 0x1F, 0xB9, 0x02, 0x81, 0x81, 0x00, 0x91,
249 0x40, 0xC4, 0x1E, 0x82, 0xAD, 0x0F, 0x6D, 0x8E, 0xD2, 0x51, 0x2E, 0xD1,
250 0x84, 0x30, 0x85, 0x68, 0xC1, 0x23, 0x7B, 0xD5, 0xBF, 0xF7, 0xC4, 0x40,
251 0x51, 0xE2, 0xFF, 0x69, 0x07, 0x8B, 0xA3, 0xBE, 0x1B, 0x17, 0xC8, 0x64,
252 0x9F, 0x91, 0x71, 0xB5, 0x6D, 0xF5, 0x9B, 0x9C, 0xC6, 0xEC, 0x4A, 0x6E,
253 0x16, 0x8F, 0x9E, 0xD1, 0x5B, 0xE3, 0x53, 0x42, 0xBC, 0x1E, 0x43, 0x72,
254 0x4B, 0x4A, 0x37, 0x8B, 0x3A, 0x01, 0xF5, 0x7D, 0x9D, 0x3D, 0x7E, 0x0F,
255 0x19, 0x73, 0x0E, 0x6B, 0x98, 0xE9, 0xFB, 0xEE, 0x13, 0x8A, 0x3C, 0x11,
256 0x2E, 0xD5, 0xB0, 0x7D, 0x84, 0x3A, 0x61, 0xA1, 0xAB, 0x71, 0x8F, 0xCE,
257 0x53, 0x29, 0x45, 0x74, 0x7A, 0x1E, 0xAA, 0x93, 0x19, 0x3A, 0x8D, 0xC9,
258 0x4E, 0xCB, 0x0E, 0x46, 0x53, 0x84, 0xCC, 0xCF, 0xBA, 0x4D, 0x28, 0x71,
259 0x1D, 0xDF, 0x41, 0xCB, 0xF8, 0x2D, 0xA9, 0x02, 0x81, 0x80, 0x04, 0x8B,
260 0x4A, 0xEA, 0xBD, 0x39, 0x0B, 0x96, 0xC5, 0x1D, 0xA4, 0x47, 0xFD, 0x46,
261 0xD2, 0x8A, 0xEA, 0x2A, 0xF3, 0x9D, 0x3A, 0x7E, 0x16, 0x74, 0xFC, 0x13,
262 0xDE, 0x4D, 0xA9, 0x85, 0x42, 0x33, 0x02, 0x92, 0x0B, 0xB6, 0xDB, 0x7E,
263 0xEA, 0x85, 0xC2, 0x94, 0x43, 0x52, 0x37, 0x5A, 0x77, 0xAB, 0xCB, 0x61,
264 0x88, 0xDE, 0xF8, 0xFA, 0xDB, 0xE8, 0x0B, 0x95, 0x7D, 0x39, 0x19, 0xA2,
265 0x89, 0xB9, 0x32, 0xB2, 0x50, 0x38, 0xF7, 0x88, 0x69, 0xFD, 0xA4, 0x63,
266 0x1F, 0x9B, 0x03, 0xD8, 0xA6, 0x7A, 0x05, 0x76, 0x02, 0x28, 0x93, 0x82,
267 0x73, 0x7F, 0x14, 0xCC, 0xBE, 0x29, 0x10, 0xAD, 0x8A, 0x2E, 0xAC, 0xED,
268 0x11, 0xA7, 0x72, 0x7C, 0x60, 0x78, 0x72, 0xFB, 0x78, 0x20, 0x18, 0xC9,
269 0x7E, 0x63, 0xAD, 0x55, 0x54, 0x51, 0xDB, 0x9F, 0x7B, 0xD4, 0x8F, 0xB2,
270 0xDE, 0x3B, 0xF1, 0x70, 0x23, 0xE5,
271};
272
273/*
Kenny Root6e1683f2013-08-19 09:51:35 -0700274 * DER-encoded PKCS#8 format EC key. Generated using:
275 *
276 * openssl ecparam -name prime256v1 -genkey -noout | openssl pkcs8 -topk8 -nocrypt -outform der | recode ../x1
277 */
278static uint8_t TEST_EC_KEY_1[] = {
279 0x30, 0x81, 0x87, 0x02, 0x01, 0x00, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86,
280 0x48, 0xCE, 0x3D, 0x02, 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D,
281 0x03, 0x01, 0x07, 0x04, 0x6D, 0x30, 0x6B, 0x02, 0x01, 0x01, 0x04, 0x20,
282 0x25, 0xAC, 0x77, 0x2B, 0x04, 0x33, 0xC8, 0x16, 0x59, 0xA3, 0xC7, 0xE7,
283 0x11, 0x42, 0xD0, 0x11, 0x71, 0x30, 0x7B, 0xB8, 0xD2, 0x67, 0xFF, 0x9C,
284 0x5F, 0x50, 0x2E, 0xAB, 0x67, 0xD4, 0x17, 0x51, 0xA1, 0x44, 0x03, 0x42,
285 0x00, 0x04, 0xCF, 0xCE, 0xB8, 0x7F, 0x88, 0x36, 0xC4, 0xF8, 0x51, 0x29,
286 0xE2, 0xA7, 0x21, 0xC3, 0x3B, 0xFF, 0x88, 0xE3, 0x87, 0x98, 0xD1, 0xA6,
287 0x4B, 0xB3, 0x4B, 0xD5, 0x44, 0xF8, 0xE0, 0x43, 0x6B, 0x50, 0x74, 0xFB,
288 0xB0, 0xAD, 0x41, 0x1C, 0x11, 0x9D, 0xC6, 0x1E, 0x83, 0x8C, 0x49, 0xCA,
289 0xBE, 0xC6, 0xCE, 0xB6, 0xC9, 0xA1, 0xBF, 0x69, 0xA9, 0xA0, 0xA3, 0x80,
290 0x14, 0x39, 0x57, 0x94, 0xDA, 0x5D
291};
292
293
294/*
Kenny Root4fd0db72012-03-16 13:19:07 -0700295 * Generated using keys on the keyboard and lack of imagination.
296 */
297static unsigned char BOGUS_KEY_1[] = { 0xFF, 0xFF, 0xFF, 0xFF };
298
299
Kenny Root8467a6d2012-08-08 17:04:40 -0700300class KeymasterBaseTest : public ::testing::Test {
301public:
Kenny Root4fd0db72012-03-16 13:19:07 -0700302 static void SetUpTestCase() {
303 const hw_module_t* mod;
304 ASSERT_EQ(0, hw_get_module_by_class(KEYSTORE_HARDWARE_MODULE_ID, NULL, &mod))
305 << "Should be able to find a keymaster hardware module";
306
307 std::cout << "Using keymaster module: " << mod->name << std::endl;
308
Shawn Willden302d2522015-02-24 09:17:38 -0700309 ASSERT_EQ(0, keymaster0_open(mod, &sDevice))
Kenny Root4fd0db72012-03-16 13:19:07 -0700310 << "Should be able to open the keymaster device";
311
Kenny Root36ab8ed2013-09-04 22:17:56 -0700312 ASSERT_EQ(KEYMASTER_MODULE_API_VERSION_0_2, mod->module_api_version)
Kenny Root6e1683f2013-08-19 09:51:35 -0700313 << "Keymaster should implement API version 2";
314
Kenny Root4fd0db72012-03-16 13:19:07 -0700315 ASSERT_TRUE(sDevice->generate_keypair != NULL)
316 << "Should implement generate_keypair";
317
318 ASSERT_TRUE(sDevice->import_keypair != NULL)
319 << "Should implement import_keypair";
320
321 ASSERT_TRUE(sDevice->get_keypair_public != NULL)
322 << "Should implement get_keypair_public";
323
324 ASSERT_TRUE(sDevice->sign_data != NULL)
325 << "Should implement sign_data";
326
327 ASSERT_TRUE(sDevice->verify_data != NULL)
328 << "Should implement verify_data";
329 }
330
331 static void TearDownTestCase() {
Shawn Willden302d2522015-02-24 09:17:38 -0700332 ASSERT_EQ(0, keymaster0_close(sDevice));
Kenny Root4fd0db72012-03-16 13:19:07 -0700333 }
334
Kenny Root8467a6d2012-08-08 17:04:40 -0700335protected:
Shawn Willden302d2522015-02-24 09:17:38 -0700336 static keymaster0_device_t* sDevice;
Kenny Root4fd0db72012-03-16 13:19:07 -0700337};
338
Shawn Willden302d2522015-02-24 09:17:38 -0700339keymaster0_device_t* KeymasterBaseTest::sDevice = NULL;
Kenny Root4fd0db72012-03-16 13:19:07 -0700340
Kenny Root8467a6d2012-08-08 17:04:40 -0700341class KeymasterTest : public KeymasterBaseTest {
342};
343
Kenny Root6e1683f2013-08-19 09:51:35 -0700344class KeymasterAllTypesTest : public KeymasterBaseTest,
345 public ::testing::WithParamInterface<keymaster_keypair_t> {
346};
347
348class KeymasterGenerateRSATest : public KeymasterBaseTest,
Kenny Root8467a6d2012-08-08 17:04:40 -0700349 public ::testing::WithParamInterface<uint32_t> {
350};
351
Kenny Root6e1683f2013-08-19 09:51:35 -0700352class KeymasterGenerateDSATest : public KeymasterBaseTest,
353 public ::testing::WithParamInterface<uint32_t> {
354};
355
356class KeymasterGenerateECTest : public KeymasterBaseTest,
357 public ::testing::WithParamInterface<uint32_t> {
358};
359
360TEST_P(KeymasterGenerateRSATest, GenerateKeyPair_RSA_Success) {
Kenny Root4fd0db72012-03-16 13:19:07 -0700361 keymaster_keypair_t key_type = TYPE_RSA;
362 keymaster_rsa_keygen_params_t params = {
Andreas Gampe1aa58f92015-12-16 14:17:44 -0800363 .modulus_size = GetParam(),
364 .public_exponent = RSA_F4,
Kenny Root4fd0db72012-03-16 13:19:07 -0700365 };
366
367 uint8_t* key_blob;
368 size_t key_blob_length;
369
Kenny Root139d44f2012-11-20 14:37:40 -0800370 ASSERT_EQ(0,
Kenny Root4fd0db72012-03-16 13:19:07 -0700371 sDevice->generate_keypair(sDevice, key_type, &params, &key_blob, &key_blob_length))
Kenny Root6e1683f2013-08-19 09:51:35 -0700372 << "Should generate an RSA key with " << GetParam() << " bit modulus size";
Kenny Root4fd0db72012-03-16 13:19:07 -0700373 UniqueKey key(&sDevice, key_blob, key_blob_length);
Kenny Root4fd0db72012-03-16 13:19:07 -0700374
Kenny Root8467a6d2012-08-08 17:04:40 -0700375 uint8_t* x509_data = NULL;
376 size_t x509_data_length;
Kenny Root139d44f2012-11-20 14:37:40 -0800377 ASSERT_EQ(0,
Kenny Root8467a6d2012-08-08 17:04:40 -0700378 sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
379 &x509_data, &x509_data_length))
380 << "Should be able to retrieve RSA public key successfully";
381 UniqueBlob x509_blob(x509_data, x509_data_length);
382 ASSERT_FALSE(x509_blob.get() == NULL)
383 << "X509 data should be allocated";
384
385 const unsigned char *tmp = static_cast<const unsigned char*>(x509_blob.get());
David Benjamin4af3eaf2019-08-08 13:05:23 -0400386 bssl::UniquePtr<EVP_PKEY> actual(d2i_PUBKEY(NULL, &tmp,
Kenny Root8467a6d2012-08-08 17:04:40 -0700387 static_cast<long>(x509_blob.length())));
388
389 ASSERT_EQ(EVP_PKEY_RSA, EVP_PKEY_type(actual.get()->type))
390 << "Generated key type should be of type RSA";
391
David Benjamin4af3eaf2019-08-08 13:05:23 -0400392 bssl::UniquePtr<RSA> rsa(EVP_PKEY_get1_RSA(actual.get()));
Kenny Root8467a6d2012-08-08 17:04:40 -0700393 ASSERT_FALSE(rsa.get() == NULL)
394 << "Should be able to extract RSA key from EVP_PKEY";
395
Kenny Root139d44f2012-11-20 14:37:40 -0800396 ASSERT_EQ(static_cast<unsigned long>(RSA_F4), BN_get_word(rsa.get()->e))
Kenny Root8467a6d2012-08-08 17:04:40 -0700397 << "Exponent should be RSA_F4";
398
Kenny Root6e1683f2013-08-19 09:51:35 -0700399 ASSERT_EQ((GetParam() + 7) / 8, static_cast<uint32_t>(RSA_size(rsa.get())))
Kenny Root8467a6d2012-08-08 17:04:40 -0700400 << "Modulus size should be the specified parameter";
Kenny Root4fd0db72012-03-16 13:19:07 -0700401}
402
Kenny Root8467a6d2012-08-08 17:04:40 -0700403INSTANTIATE_TEST_CASE_P(RSA,
Kenny Root6e1683f2013-08-19 09:51:35 -0700404 KeymasterGenerateRSATest,
Brian Carlstrom63b64332013-05-14 15:20:28 -0700405 ::testing::Values(512U, 1024U, 2048U, 3072U, 4096U));
Kenny Root4fd0db72012-03-16 13:19:07 -0700406
Kenny Root6e1683f2013-08-19 09:51:35 -0700407
408TEST_P(KeymasterGenerateECTest, GenerateKeyPair_EC_Success) {
409 keymaster_keypair_t key_type = TYPE_EC;
410 keymaster_ec_keygen_params_t params = {
Andreas Gampe1aa58f92015-12-16 14:17:44 -0800411 .field_size = GetParam(),
Kenny Root6e1683f2013-08-19 09:51:35 -0700412 };
413
414 uint8_t* key_blob;
415 size_t key_blob_length;
416
417 ASSERT_EQ(0,
418 sDevice->generate_keypair(sDevice, key_type, &params, &key_blob, &key_blob_length))
419 << "Should generate an EC key with " << GetParam() << " field size";
420 UniqueKey key(&sDevice, key_blob, key_blob_length);
421
422 uint8_t* x509_data = NULL;
423 size_t x509_data_length;
424 ASSERT_EQ(0,
425 sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
426 &x509_data, &x509_data_length))
427 << "Should be able to retrieve EC public key successfully";
428 UniqueBlob x509_blob(x509_data, x509_data_length);
429 ASSERT_FALSE(x509_blob.get() == NULL)
430 << "X509 data should be allocated";
431
432 const unsigned char *tmp = static_cast<const unsigned char*>(x509_blob.get());
David Benjamin4af3eaf2019-08-08 13:05:23 -0400433 bssl::UniquePtr<EVP_PKEY> actual(d2i_PUBKEY(NULL, &tmp,
Kenny Root6e1683f2013-08-19 09:51:35 -0700434 static_cast<long>(x509_blob.length())));
435
436 ASSERT_EQ(EVP_PKEY_EC, EVP_PKEY_type(actual.get()->type))
437 << "Generated key type should be of type EC";
438
David Benjamin4af3eaf2019-08-08 13:05:23 -0400439 bssl::UniquePtr<EC_KEY> ecKey(EVP_PKEY_get1_EC_KEY(actual.get()));
Kenny Root6e1683f2013-08-19 09:51:35 -0700440 ASSERT_FALSE(ecKey.get() == NULL)
441 << "Should be able to extract EC key from EVP_PKEY";
442
443 ASSERT_FALSE(EC_KEY_get0_group(ecKey.get()) == NULL)
444 << "EC key should have a EC_GROUP";
445
446 ASSERT_TRUE(EC_KEY_check_key(ecKey.get()))
447 << "EC key should check correctly";
448}
449
450INSTANTIATE_TEST_CASE_P(EC,
451 KeymasterGenerateECTest,
452 ::testing::Values(192U, 224U, 256U, 384U, 521U));
453
454
455TEST_P(KeymasterAllTypesTest, GenerateKeyPair_NullParams_Failure) {
456 keymaster_keypair_t key_type = GetParam();
Kenny Root4fd0db72012-03-16 13:19:07 -0700457
458 uint8_t* key_blob;
459 size_t key_blob_length;
460
Kenny Root139d44f2012-11-20 14:37:40 -0800461 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -0700462 sDevice->generate_keypair(sDevice, key_type, NULL, &key_blob, &key_blob_length))
Kenny Root6e1683f2013-08-19 09:51:35 -0700463 << "Should not be able to generate a key with null params";
Kenny Root4fd0db72012-03-16 13:19:07 -0700464}
465
Kenny Root6e1683f2013-08-19 09:51:35 -0700466INSTANTIATE_TEST_CASE_P(Types,
467 KeymasterAllTypesTest,
468 ::testing::Values(TYPE_RSA, TYPE_DSA, TYPE_EC));
469
Kenny Root4fd0db72012-03-16 13:19:07 -0700470TEST_F(KeymasterTest, GenerateKeyPair_UnknownType_Failure) {
471 keymaster_keypair_t key_type = static_cast<keymaster_keypair_t>(0xFFFF);
472
473 uint8_t* key_blob;
474 size_t key_blob_length;
475
Kenny Root139d44f2012-11-20 14:37:40 -0800476 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -0700477 sDevice->generate_keypair(sDevice, key_type, NULL, &key_blob, &key_blob_length))
478 << "Should not generate an unknown key type";
479}
480
481TEST_F(KeymasterTest, ImportKeyPair_RSA_Success) {
482 uint8_t* key_blob;
483 size_t key_blob_length;
484
Kenny Root139d44f2012-11-20 14:37:40 -0800485 ASSERT_EQ(0,
Kenny Root6e1683f2013-08-19 09:51:35 -0700486 sDevice->import_keypair(sDevice, TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1),
Kenny Root4fd0db72012-03-16 13:19:07 -0700487 &key_blob, &key_blob_length))
488 << "Should successfully import an RSA key";
489 UniqueKey key(&sDevice, key_blob, key_blob_length);
Kenny Root8467a6d2012-08-08 17:04:40 -0700490
491 uint8_t* x509_data;
492 size_t x509_data_length;
Kenny Root139d44f2012-11-20 14:37:40 -0800493 ASSERT_EQ(0,
Kenny Root8467a6d2012-08-08 17:04:40 -0700494 sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
495 &x509_data, &x509_data_length))
496 << "Should be able to retrieve RSA public key successfully";
497 UniqueBlob x509_blob(x509_data, x509_data_length);
498
499 const unsigned char *tmp = static_cast<const unsigned char*>(x509_blob.get());
David Benjamin4af3eaf2019-08-08 13:05:23 -0400500 bssl::UniquePtr<EVP_PKEY> actual(d2i_PUBKEY(NULL, &tmp,
Kenny Root8467a6d2012-08-08 17:04:40 -0700501 static_cast<long>(x509_blob.length())));
502
Kenny Root139d44f2012-11-20 14:37:40 -0800503 ASSERT_EQ(EVP_PKEY_type(actual.get()->type), EVP_PKEY_RSA)
Kenny Root8467a6d2012-08-08 17:04:40 -0700504 << "Generated key type should be of type RSA";
505
Kenny Root6e1683f2013-08-19 09:51:35 -0700506 const unsigned char *expectedTmp = static_cast<const unsigned char*>(TEST_RSA_KEY_1);
David Benjamin4af3eaf2019-08-08 13:05:23 -0400507 bssl::UniquePtr<PKCS8_PRIV_KEY_INFO> expectedPkcs8(
508 d2i_PKCS8_PRIV_KEY_INFO(NULL, &expectedTmp,
Kenny Root6e1683f2013-08-19 09:51:35 -0700509 sizeof(TEST_RSA_KEY_1)));
510
David Benjamin4af3eaf2019-08-08 13:05:23 -0400511 bssl::UniquePtr<EVP_PKEY> expected(EVP_PKCS82PKEY(expectedPkcs8.get()));
Kenny Root6e1683f2013-08-19 09:51:35 -0700512
513 ASSERT_EQ(1, EVP_PKEY_cmp(expected.get(), actual.get()))
514 << "Expected and actual keys should match";
515}
516
517TEST_F(KeymasterTest, ImportKeyPair_EC_Success) {
518 uint8_t* key_blob;
519 size_t key_blob_length;
520
521 ASSERT_EQ(0,
522 sDevice->import_keypair(sDevice, TEST_EC_KEY_1, sizeof(TEST_EC_KEY_1),
523 &key_blob, &key_blob_length))
524 << "Should successfully import an EC key";
525 UniqueKey key(&sDevice, key_blob, key_blob_length);
526
527 uint8_t* x509_data;
528 size_t x509_data_length;
529 ASSERT_EQ(0,
530 sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
531 &x509_data, &x509_data_length))
532 << "Should be able to retrieve EC public key successfully";
533 UniqueBlob x509_blob(x509_data, x509_data_length);
534
535 const unsigned char *tmp = static_cast<const unsigned char*>(x509_blob.get());
David Benjamin4af3eaf2019-08-08 13:05:23 -0400536 bssl::UniquePtr<EVP_PKEY> actual(d2i_PUBKEY(NULL, &tmp,
Kenny Root6e1683f2013-08-19 09:51:35 -0700537 static_cast<long>(x509_blob.length())));
538
539 ASSERT_EQ(EVP_PKEY_type(actual.get()->type), EVP_PKEY_EC)
540 << "Generated key type should be of type EC";
541
542 const unsigned char *expectedTmp = static_cast<const unsigned char*>(TEST_EC_KEY_1);
David Benjamin4af3eaf2019-08-08 13:05:23 -0400543 bssl::UniquePtr<PKCS8_PRIV_KEY_INFO> expectedPkcs8(
544 d2i_PKCS8_PRIV_KEY_INFO(NULL, &expectedTmp,
Kenny Root6e1683f2013-08-19 09:51:35 -0700545 sizeof(TEST_EC_KEY_1)));
Kenny Root8467a6d2012-08-08 17:04:40 -0700546
David Benjamin4af3eaf2019-08-08 13:05:23 -0400547 bssl::UniquePtr<EVP_PKEY> expected(EVP_PKCS82PKEY(expectedPkcs8.get()));
Kenny Root8467a6d2012-08-08 17:04:40 -0700548
Kenny Root139d44f2012-11-20 14:37:40 -0800549 ASSERT_EQ(1, EVP_PKEY_cmp(expected.get(), actual.get()))
Kenny Root8467a6d2012-08-08 17:04:40 -0700550 << "Expected and actual keys should match";
Kenny Root4fd0db72012-03-16 13:19:07 -0700551}
552
553TEST_F(KeymasterTest, ImportKeyPair_BogusKey_Failure) {
554 uint8_t* key_blob;
555 size_t key_blob_length;
556
Kenny Root139d44f2012-11-20 14:37:40 -0800557 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -0700558 sDevice->import_keypair(sDevice, BOGUS_KEY_1, sizeof(BOGUS_KEY_1),
559 &key_blob, &key_blob_length))
560 << "Should not import an unknown key type";
561}
562
563TEST_F(KeymasterTest, ImportKeyPair_NullKey_Failure) {
564 uint8_t* key_blob;
565 size_t key_blob_length;
566
Kenny Root139d44f2012-11-20 14:37:40 -0800567 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -0700568 sDevice->import_keypair(sDevice, NULL, 0,
569 &key_blob, &key_blob_length))
570 << "Should not import a null key";
571}
572
573TEST_F(KeymasterTest, GetKeypairPublic_RSA_Success) {
574 uint8_t* key_blob;
575 size_t key_blob_length;
576
Kenny Root6e1683f2013-08-19 09:51:35 -0700577 UniqueReadOnlyBlob testKey(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700578 ASSERT_TRUE(testKey.get() != NULL);
579
Kenny Root4fd0db72012-03-16 13:19:07 -0700580 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700581 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700582 &key_blob, &key_blob_length))
583 << "Should successfully import an RSA key";
584 UniqueKey key(&sDevice, key_blob, key_blob_length);
585
586 uint8_t* x509_data;
587 size_t x509_data_length;
Kenny Root139d44f2012-11-20 14:37:40 -0800588 ASSERT_EQ(0,
Kenny Root4fd0db72012-03-16 13:19:07 -0700589 sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
590 &x509_data, &x509_data_length))
591 << "Should be able to retrieve RSA public key successfully";
592 UniqueBlob x509_blob(x509_data, x509_data_length);
593}
594
Kenny Root6e1683f2013-08-19 09:51:35 -0700595TEST_F(KeymasterTest, GetKeypairPublic_EC_Success) {
596 uint8_t* key_blob;
597 size_t key_blob_length;
598
599 UniqueReadOnlyBlob testKey(TEST_EC_KEY_1, sizeof(TEST_EC_KEY_1));
600 ASSERT_TRUE(testKey.get() != NULL);
601
602 ASSERT_EQ(0,
603 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
604 &key_blob, &key_blob_length))
605 << "Should successfully import an EC key";
606 UniqueKey key(&sDevice, key_blob, key_blob_length);
607
608 uint8_t* x509_data;
609 size_t x509_data_length;
610 ASSERT_EQ(0,
611 sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
612 &x509_data, &x509_data_length))
613 << "Should be able to retrieve EC public key successfully";
614 UniqueBlob x509_blob(x509_data, x509_data_length);
615}
616
617TEST_F(KeymasterTest, GetKeypairPublic_NullKey_Failure) {
Kenny Root4fd0db72012-03-16 13:19:07 -0700618 uint8_t* x509_data = NULL;
619 size_t x509_data_length;
Kenny Root139d44f2012-11-20 14:37:40 -0800620 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -0700621 sDevice->get_keypair_public(sDevice, NULL, 0,
622 &x509_data, &x509_data_length))
Kenny Root6e1683f2013-08-19 09:51:35 -0700623 << "Should not be able to retrieve public key from null key";
Kenny Root4fd0db72012-03-16 13:19:07 -0700624 UniqueBlob x509_blob(x509_data, x509_data_length);
625}
626
627TEST_F(KeymasterTest, GetKeypairPublic_RSA_NullDestination_Failure) {
628 uint8_t* key_blob;
629 size_t key_blob_length;
630
Kenny Root6e1683f2013-08-19 09:51:35 -0700631 UniqueReadOnlyBlob testKey(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
632 ASSERT_TRUE(testKey.get() != NULL);
633
634 ASSERT_EQ(0,
635 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
636 &key_blob, &key_blob_length))
637 << "Should successfully import an RSA key";
638 UniqueKey key(&sDevice, key_blob, key_blob_length);
639
640 ASSERT_EQ(-1,
641 sDevice->get_keypair_public(sDevice, key.get(), key.length(),
642 NULL, NULL))
643 << "Should not be able to succeed with NULL destination blob";
644}
645
646TEST_F(KeymasterTest, GetKeypairPublic_EC_NullDestination_Failure) {
647 uint8_t* key_blob;
648 size_t key_blob_length;
649
650 UniqueReadOnlyBlob testKey(TEST_EC_KEY_1, sizeof(TEST_EC_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700651 ASSERT_TRUE(testKey.get() != NULL);
652
Kenny Root4fd0db72012-03-16 13:19:07 -0700653 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700654 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700655 &key_blob, &key_blob_length))
656 << "Should successfully import an RSA key";
657 UniqueKey key(&sDevice, key_blob, key_blob_length);
658
Kenny Root139d44f2012-11-20 14:37:40 -0800659 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -0700660 sDevice->get_keypair_public(sDevice, key.get(), key.length(),
661 NULL, NULL))
662 << "Should not be able to succeed with NULL destination blob";
663}
664
665TEST_F(KeymasterTest, DeleteKeyPair_RSA_Success) {
666 uint8_t* key_blob;
667 size_t key_blob_length;
668
Kenny Root6e1683f2013-08-19 09:51:35 -0700669 UniqueReadOnlyBlob testKey(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700670 ASSERT_TRUE(testKey.get() != NULL);
671
Kenny Root139d44f2012-11-20 14:37:40 -0800672 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700673 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700674 &key_blob, &key_blob_length))
675 << "Should successfully import an RSA key";
676 UniqueKey key(&sDevice, key_blob, key_blob_length);
677}
678
679TEST_F(KeymasterTest, DeleteKeyPair_RSA_DoubleDelete_Failure) {
680 uint8_t* key_blob;
681 size_t key_blob_length;
682
Kenny Root6e1683f2013-08-19 09:51:35 -0700683 UniqueReadOnlyBlob testKey(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700684 ASSERT_TRUE(testKey.get() != NULL);
685
Kenny Root4fd0db72012-03-16 13:19:07 -0700686 /*
687 * This is only run if the module indicates it implements key deletion
688 * by implementing delete_keypair.
689 */
690 if (sDevice->delete_keypair != NULL) {
691 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700692 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700693 &key_blob, &key_blob_length))
694 << "Should successfully import an RSA key";
695 UniqueBlob blob(key_blob, key_blob_length);
696
Kenny Root139d44f2012-11-20 14:37:40 -0800697 ASSERT_EQ(0, sDevice->delete_keypair(sDevice, key_blob, key_blob_length))
Kenny Root4fd0db72012-03-16 13:19:07 -0700698 << "Should delete key after import";
699
Kenny Root139d44f2012-11-20 14:37:40 -0800700 ASSERT_EQ(-1, sDevice->delete_keypair(sDevice, key_blob, key_blob_length))
Kenny Root4fd0db72012-03-16 13:19:07 -0700701 << "Should not be able to delete key twice";
702 }
703}
704
705TEST_F(KeymasterTest, DeleteKeyPair_RSA_NullKey_Failure) {
706 /*
707 * This is only run if the module indicates it implements key deletion
708 * by implementing delete_keypair.
709 */
710 if (sDevice->delete_keypair != NULL) {
Kenny Root139d44f2012-11-20 14:37:40 -0800711 ASSERT_EQ(-1, sDevice->delete_keypair(sDevice, NULL, 0))
Kenny Root4fd0db72012-03-16 13:19:07 -0700712 << "Should not be able to delete null key";
713 }
714}
715
716/*
717 * DER-encoded PKCS#8 format RSA key. Generated using:
718 *
719 * openssl genrsa 512 | openssl pkcs8 -topk8 -nocrypt -outform der | recode ../x1
720 */
Kenny Root6e1683f2013-08-19 09:51:35 -0700721static uint8_t TEST_SIGN_RSA_KEY_1[] = {
Kenny Root4fd0db72012-03-16 13:19:07 -0700722 0x30, 0x82, 0x01, 0x56, 0x02, 0x01, 0x00, 0x30, 0x0D, 0x06, 0x09, 0x2A,
723 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82,
724 0x01, 0x40, 0x30, 0x82, 0x01, 0x3C, 0x02, 0x01, 0x00, 0x02, 0x41, 0x00,
725 0xBD, 0xC0, 0x7F, 0xEF, 0x75, 0x1D, 0x63, 0x2A, 0xD0, 0x9A, 0x26, 0xE5,
726 0x5B, 0xB9, 0x84, 0x7C, 0xE5, 0xC7, 0xE7, 0xDE, 0xFE, 0xB6, 0x54, 0xD9,
727 0xF0, 0x9B, 0xC2, 0xCF, 0x36, 0xDA, 0xE5, 0x4D, 0xC5, 0xD9, 0x25, 0x78,
728 0xBD, 0x55, 0x05, 0xBD, 0x86, 0xFB, 0x37, 0x15, 0x33, 0x42, 0x52, 0xED,
729 0xE5, 0xCD, 0xCB, 0xB7, 0xA2, 0x51, 0xFA, 0x36, 0xE9, 0x9C, 0x2E, 0x5D,
730 0xE3, 0xA5, 0x1F, 0x01, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x41, 0x00,
731 0x96, 0x71, 0xDE, 0xBD, 0x83, 0x94, 0x96, 0x40, 0xA6, 0xFD, 0xE1, 0xA2,
732 0xED, 0xD3, 0xAC, 0x28, 0xBE, 0xA2, 0x7D, 0xC3, 0xFF, 0x1D, 0x9F, 0x2E,
733 0xE0, 0xA7, 0x0E, 0x90, 0xEE, 0x44, 0x25, 0x92, 0xE3, 0x54, 0xDD, 0x55,
734 0xA3, 0xEF, 0x42, 0xF5, 0x52, 0x55, 0x41, 0x47, 0x5E, 0x00, 0xFB, 0x8B,
735 0x47, 0x5E, 0x45, 0x49, 0xEA, 0x3D, 0x2C, 0xFD, 0x9F, 0xEC, 0xC8, 0x4E,
736 0x4E, 0x86, 0x90, 0x31, 0x02, 0x21, 0x00, 0xE6, 0xA5, 0x55, 0xB3, 0x64,
737 0xAB, 0x90, 0x5E, 0xA2, 0xF5, 0x6B, 0x21, 0x4B, 0x15, 0xD6, 0x4A, 0xB6,
738 0x60, 0x24, 0x95, 0x65, 0xA2, 0xBE, 0xBA, 0x2A, 0x73, 0xFB, 0xFF, 0x2C,
739 0x61, 0x88, 0x9D, 0x02, 0x21, 0x00, 0xD2, 0x9C, 0x5B, 0xFE, 0x82, 0xA5,
740 0xFC, 0x52, 0x6A, 0x29, 0x38, 0xDB, 0x22, 0x3B, 0xEB, 0x74, 0x3B, 0xCA,
741 0xB4, 0xDD, 0x1D, 0xE4, 0x48, 0x60, 0x70, 0x19, 0x9B, 0x81, 0xC1, 0x83,
742 0x28, 0xB5, 0x02, 0x21, 0x00, 0x89, 0x2D, 0xFE, 0xF9, 0xF2, 0xBF, 0x43,
743 0xDF, 0xB5, 0xA6, 0xA8, 0x30, 0x26, 0x1B, 0x77, 0xD7, 0xF9, 0xFE, 0xD6,
744 0xE3, 0x70, 0x8E, 0xCA, 0x47, 0xA9, 0xA6, 0x50, 0x54, 0x25, 0xCE, 0x60,
745 0xD5, 0x02, 0x21, 0x00, 0xBE, 0x5A, 0xF8, 0x82, 0xE6, 0xCE, 0xE3, 0x6A,
746 0x11, 0xED, 0xC4, 0x27, 0xBB, 0x9F, 0x70, 0xC6, 0x93, 0xAC, 0x39, 0x20,
747 0x89, 0x7D, 0xE5, 0x34, 0xD4, 0xDD, 0x30, 0x42, 0x6D, 0x07, 0x00, 0xE9,
748 0x02, 0x20, 0x05, 0x91, 0xEF, 0x12, 0xD2, 0xD3, 0x6A, 0xD2, 0x96, 0x6B,
749 0x10, 0x62, 0xF9, 0xBA, 0xA4, 0x91, 0x48, 0x84, 0x40, 0x61, 0x67, 0x80,
750 0x68, 0x68, 0xC8, 0x60, 0xB3, 0x66, 0xC8, 0xF9, 0x08, 0x9A,
751};
752
753/*
Kenny Root6e1683f2013-08-19 09:51:35 -0700754 * DER-encoded PKCS#8 format EC key. Generated using:
755 *
756 * openssl ecparam -name prime256v1 -genkey -noout | openssl pkcs8 -topk8 -nocrypt -outform der | recode ../x1
757 */
758static uint8_t TEST_SIGN_EC_KEY_1[] = {
759 0x30, 0x81, 0x87, 0x02, 0x01, 0x00, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86,
760 0x48, 0xCE, 0x3D, 0x02, 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D,
761 0x03, 0x01, 0x07, 0x04, 0x6D, 0x30, 0x6B, 0x02, 0x01, 0x01, 0x04, 0x20,
762 0x9E, 0x66, 0x11, 0x6A, 0x89, 0xF5, 0x78, 0x57, 0xF3, 0x35, 0xA2, 0x46,
763 0x09, 0x06, 0x4B, 0x4D, 0x81, 0xEC, 0xD3, 0x9B, 0x0A, 0xC4, 0x68, 0x06,
764 0xB8, 0x42, 0x24, 0x5E, 0x74, 0x2C, 0x62, 0x79, 0xA1, 0x44, 0x03, 0x42,
765 0x00, 0x04, 0x35, 0xB5, 0x9A, 0x5C, 0xE5, 0x52, 0x35, 0xF2, 0x10, 0x6C,
766 0xD9, 0x98, 0x67, 0xED, 0x5E, 0xCB, 0x6B, 0xB8, 0x96, 0x5E, 0x54, 0x7C,
767 0x34, 0x2A, 0xA3, 0x3B, 0xF3, 0xD1, 0x39, 0x48, 0x36, 0x7A, 0xEA, 0xD8,
768 0xCA, 0xDD, 0x40, 0x8F, 0xE9, 0xE0, 0x95, 0x2E, 0x3F, 0x95, 0x0F, 0x14,
769 0xD6, 0x14, 0x78, 0xB5, 0xAD, 0x17, 0xD2, 0x5A, 0x41, 0x96, 0x99, 0x20,
770 0xC7, 0x5B, 0x0F, 0x60, 0xFD, 0xBA
771};
772
773/*
Kenny Root4fd0db72012-03-16 13:19:07 -0700774 * PKCS#1 v1.5 padded raw "Hello, world" Can be generated be generated by verifying
775 * the signature below in no padding mode:
776 *
777 * openssl rsautl -keyform der -inkey rsa.der -raw -verify -in test.sig
778 */
779static uint8_t TEST_SIGN_DATA_1[] = {
780 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
781 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
782 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
783 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
784 0xFF, 0xFF, 0xFF, 0x00, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x2C, 0x20, 0x77,
785 0x6F, 0x72, 0x6C, 0x64,
786};
787
788/*
Kenny Root6e1683f2013-08-19 09:51:35 -0700789 * Signature of TEST_SIGN_DATA_1 using TEST_SIGN_RSA_KEY_1. Generated using:
Kenny Root4fd0db72012-03-16 13:19:07 -0700790 *
791 * echo 'Hello, world' | openssl rsautl -keyform der -inkey rsa.der -sign | recode ../x1
792 */
Kenny Root6e1683f2013-08-19 09:51:35 -0700793static uint8_t TEST_SIGN_RSA_SIGNATURE_1[] = {
Kenny Root4fd0db72012-03-16 13:19:07 -0700794 0xA4, 0xBB, 0x76, 0x87, 0xFE, 0x61, 0x0C, 0x9D, 0xD6, 0xFF, 0x4B, 0x76,
795 0x96, 0x08, 0x36, 0x23, 0x11, 0xC6, 0x44, 0x3F, 0x88, 0x77, 0x97, 0xB2,
796 0xA8, 0x3B, 0xFB, 0x9C, 0x3C, 0xD3, 0x20, 0x65, 0xFD, 0x26, 0x3B, 0x2A,
797 0xB8, 0xB6, 0xD4, 0xDC, 0x91, 0xF7, 0xE2, 0xDE, 0x4D, 0xF7, 0x0E, 0xB9,
798 0x72, 0xA7, 0x29, 0x72, 0x82, 0x12, 0x7C, 0x53, 0x23, 0x21, 0xC4, 0xFF,
799 0x79, 0xE4, 0x91, 0x40,
800};
801
802/*
Kenny Root6e1683f2013-08-19 09:51:35 -0700803 * Identical to TEST_SIGN_RSA_SIGNATURE_1 except the last octet is '1' instead of '0'
Kenny Root4fd0db72012-03-16 13:19:07 -0700804 * This should fail any test.
805 */
806static uint8_t TEST_SIGN_SIGNATURE_BOGUS_1[] = {
807 0xA4, 0xBB, 0x76, 0x87, 0xFE, 0x61, 0x0C, 0x9D, 0xD6, 0xFF, 0x4B, 0x76,
808 0x96, 0x08, 0x36, 0x23, 0x11, 0xC6, 0x44, 0x3F, 0x88, 0x77, 0x97, 0xB2,
809 0xA8, 0x3B, 0xFB, 0x9C, 0x3C, 0xD3, 0x20, 0x65, 0xFD, 0x26, 0x3B, 0x2A,
810 0xB8, 0xB6, 0xD4, 0xDC, 0x91, 0xF7, 0xE2, 0xDE, 0x4D, 0xF7, 0x0E, 0xB9,
811 0x72, 0xA7, 0x29, 0x72, 0x82, 0x12, 0x7C, 0x53, 0x23, 0x21, 0xC4, 0xFF,
812 0x79, 0xE4, 0x91, 0x41,
813};
814
815TEST_F(KeymasterTest, SignData_RSA_Raw_Success) {
816 uint8_t* key_blob;
817 size_t key_blob_length;
818
Kenny Root6e1683f2013-08-19 09:51:35 -0700819 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700820 ASSERT_TRUE(testKey.get() != NULL);
821
Kenny Root4fd0db72012-03-16 13:19:07 -0700822 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700823 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700824 &key_blob, &key_blob_length))
825 << "Should successfully import an RSA key";
826 UniqueKey key(&sDevice, key_blob, key_blob_length);
827
828 keymaster_rsa_sign_params_t params = {
Andreas Gampe1aa58f92015-12-16 14:17:44 -0800829 .digest_type = DIGEST_NONE,
830 .padding_type = PADDING_NONE,
Kenny Root4fd0db72012-03-16 13:19:07 -0700831 };
832
833 uint8_t* sig;
834 size_t sig_length;
835
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700836 UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
837 ASSERT_TRUE(testData.get() != NULL);
838
Kenny Root139d44f2012-11-20 14:37:40 -0800839 ASSERT_EQ(0,
Kenny Root4fd0db72012-03-16 13:19:07 -0700840 sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700841 testData.get(), testData.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700842 &sig, &sig_length))
843 << "Should sign data successfully";
844 UniqueBlob sig_blob(sig, sig_length);
845
Kenny Root6e1683f2013-08-19 09:51:35 -0700846 UniqueBlob expected_sig(TEST_SIGN_RSA_SIGNATURE_1, sizeof(TEST_SIGN_RSA_SIGNATURE_1));
Kenny Root4fd0db72012-03-16 13:19:07 -0700847
Kenny Root139d44f2012-11-20 14:37:40 -0800848 ASSERT_EQ(expected_sig, sig_blob)
Kenny Root4fd0db72012-03-16 13:19:07 -0700849 << "Generated signature should match expected signature";
850
851 // The expected signature is actually stack data, so don't let it try to free.
852 uint8_t* unused __attribute__((unused)) = expected_sig.release();
853}
854
Kenny Root6e1683f2013-08-19 09:51:35 -0700855TEST_F(KeymasterTest, SignData_EC_Success) {
856 uint8_t* key_blob;
857 size_t key_blob_length;
858
859 UniqueReadOnlyBlob testKey(TEST_SIGN_EC_KEY_1, sizeof(TEST_SIGN_EC_KEY_1));
860 ASSERT_TRUE(testKey.get() != NULL);
861
862 ASSERT_EQ(0,
863 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
864 &key_blob, &key_blob_length))
865 << "Should successfully import an EC key";
866 UniqueKey key(&sDevice, key_blob, key_blob_length);
867
868 keymaster_ec_sign_params_t params = {
Andreas Gampe1aa58f92015-12-16 14:17:44 -0800869 .digest_type = DIGEST_NONE,
Kenny Root6e1683f2013-08-19 09:51:35 -0700870 };
871
872 uint8_t* sig;
873 size_t sig_length;
874
875 UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
876 ASSERT_TRUE(testData.get() != NULL);
877
878 ASSERT_EQ(0,
879 sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
880 testData.get(), testData.length(),
881 &sig, &sig_length))
882 << "Should sign data successfully";
883 UniqueBlob sig_blob(sig, sig_length);
884
885 uint8_t* x509_data;
886 size_t x509_data_length;
887 ASSERT_EQ(0,
888 sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
889 &x509_data, &x509_data_length))
890 << "Should be able to retrieve RSA public key successfully";
891 UniqueBlob x509_blob(x509_data, x509_data_length);
892
893 const unsigned char *tmp = static_cast<const unsigned char*>(x509_blob.get());
David Benjamin4af3eaf2019-08-08 13:05:23 -0400894 bssl::UniquePtr<EVP_PKEY> expected(d2i_PUBKEY(NULL, &tmp,
Kenny Root6e1683f2013-08-19 09:51:35 -0700895 static_cast<long>(x509_blob.length())));
896
David Benjamin4af3eaf2019-08-08 13:05:23 -0400897 bssl::UniquePtr<EC_KEY> ecKey(EVP_PKEY_get1_EC_KEY(expected.get()));
Kenny Root6e1683f2013-08-19 09:51:35 -0700898
899 ASSERT_EQ(1, ECDSA_verify(0, testData.get(), testData.length(), sig_blob.get(), sig_blob.length(), ecKey.get()))
900 << "Signature should verify";
901}
902
Kenny Root4fd0db72012-03-16 13:19:07 -0700903TEST_F(KeymasterTest, SignData_RSA_Raw_InvalidSizeInput_Failure) {
904 uint8_t* key_blob;
905 size_t key_blob_length;
906
Kenny Root6e1683f2013-08-19 09:51:35 -0700907 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700908 ASSERT_TRUE(testKey.get() != NULL);
909
Kenny Root4fd0db72012-03-16 13:19:07 -0700910 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700911 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700912 &key_blob, &key_blob_length))
913 << "Should successfully import an RSA key";
914 UniqueKey key(&sDevice, key_blob, key_blob_length);
915
916 keymaster_rsa_sign_params_t params = {
Andreas Gampe1aa58f92015-12-16 14:17:44 -0800917 .digest_type = DIGEST_NONE,
918 .padding_type = PADDING_NONE,
Kenny Root4fd0db72012-03-16 13:19:07 -0700919 };
920
921 uint8_t* sig;
922 size_t sig_length;
923
Kenny Root6e1683f2013-08-19 09:51:35 -0700924 UniqueReadOnlyBlob testData(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700925 ASSERT_TRUE(testData.get() != NULL);
926
Kenny Root139d44f2012-11-20 14:37:40 -0800927 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -0700928 sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700929 testData.get(), testData.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700930 &sig, &sig_length))
931 << "Should not be able to do raw signature on incorrect size data";
932}
933
934TEST_F(KeymasterTest, SignData_RSA_Raw_NullKey_Failure) {
935 keymaster_rsa_sign_params_t params = {
Andreas Gampe1aa58f92015-12-16 14:17:44 -0800936 .digest_type = DIGEST_NONE,
937 .padding_type = PADDING_NONE,
Kenny Root4fd0db72012-03-16 13:19:07 -0700938 };
939
940 uint8_t* sig;
941 size_t sig_length;
942
Kenny Root6e1683f2013-08-19 09:51:35 -0700943 UniqueReadOnlyBlob testData(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700944 ASSERT_TRUE(testData.get() != NULL);
945
Kenny Root139d44f2012-11-20 14:37:40 -0800946 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -0700947 sDevice->sign_data(sDevice, &params, NULL, 0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700948 testData.get(), testData.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700949 &sig, &sig_length))
950 << "Should not be able to do raw signature on incorrect size data";
951}
952
953TEST_F(KeymasterTest, SignData_RSA_Raw_NullInput_Failure) {
954 uint8_t* key_blob;
955 size_t key_blob_length;
956
Kenny Root6e1683f2013-08-19 09:51:35 -0700957 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700958 ASSERT_TRUE(testKey.get() != NULL);
959
Kenny Root4fd0db72012-03-16 13:19:07 -0700960 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700961 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700962 &key_blob, &key_blob_length))
963 << "Should successfully import an RSA key";
964 UniqueKey key(&sDevice, key_blob, key_blob_length);
965
966 keymaster_rsa_sign_params_t params = {
Andreas Gampe1aa58f92015-12-16 14:17:44 -0800967 .digest_type = DIGEST_NONE,
968 .padding_type = PADDING_NONE,
Kenny Root4fd0db72012-03-16 13:19:07 -0700969 };
970
971 uint8_t* sig;
972 size_t sig_length;
973
Kenny Root139d44f2012-11-20 14:37:40 -0800974 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -0700975 sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
976 NULL, 0,
977 &sig, &sig_length))
978 << "Should error when input data is null";
979}
980
981TEST_F(KeymasterTest, SignData_RSA_Raw_NullOutput_Failure) {
982 uint8_t* key_blob;
983 size_t key_blob_length;
984
Kenny Root6e1683f2013-08-19 09:51:35 -0700985 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700986 ASSERT_TRUE(testKey.get() != NULL);
987
Kenny Root4fd0db72012-03-16 13:19:07 -0700988 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -0700989 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -0700990 &key_blob, &key_blob_length))
991 << "Should successfully import an RSA key";
992 UniqueKey key(&sDevice, key_blob, key_blob_length);
993
994 keymaster_rsa_sign_params_t params = {
Andreas Gampe1aa58f92015-12-16 14:17:44 -0800995 .digest_type = DIGEST_NONE,
996 .padding_type = PADDING_NONE,
Kenny Root4fd0db72012-03-16 13:19:07 -0700997 };
998
Kenny Root6e1683f2013-08-19 09:51:35 -0700999 UniqueReadOnlyBlob testData(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001000 ASSERT_TRUE(testData.get() != NULL);
1001
Kenny Root139d44f2012-11-20 14:37:40 -08001002 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -07001003 sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001004 testData.get(), testData.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -07001005 NULL, NULL))
1006 << "Should error when output is null";
1007}
1008
1009TEST_F(KeymasterTest, VerifyData_RSA_Raw_Success) {
1010 uint8_t* key_blob;
1011 size_t key_blob_length;
1012
Kenny Root6e1683f2013-08-19 09:51:35 -07001013 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001014 ASSERT_TRUE(testKey.get() != NULL);
1015
Kenny Root4fd0db72012-03-16 13:19:07 -07001016 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001017 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -07001018 &key_blob, &key_blob_length))
1019 << "Should successfully import an RSA key";
1020 UniqueKey key(&sDevice, key_blob, key_blob_length);
1021
1022 keymaster_rsa_sign_params_t params = {
Andreas Gampe1aa58f92015-12-16 14:17:44 -08001023 .digest_type = DIGEST_NONE,
1024 .padding_type = PADDING_NONE,
Kenny Root4fd0db72012-03-16 13:19:07 -07001025 };
1026
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001027 UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
1028 ASSERT_TRUE(testData.get() != NULL);
1029
Kenny Root6e1683f2013-08-19 09:51:35 -07001030 UniqueReadOnlyBlob testSig(TEST_SIGN_RSA_SIGNATURE_1, sizeof(TEST_SIGN_RSA_SIGNATURE_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001031 ASSERT_TRUE(testSig.get() != NULL);
1032
Kenny Root139d44f2012-11-20 14:37:40 -08001033 ASSERT_EQ(0,
Kenny Root4fd0db72012-03-16 13:19:07 -07001034 sDevice->verify_data(sDevice, &params, key_blob, key_blob_length,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001035 testData.get(), testData.length(),
1036 testSig.get(), testSig.length()))
Kenny Root4fd0db72012-03-16 13:19:07 -07001037 << "Should verify data successfully";
1038}
1039
Kenny Root6e1683f2013-08-19 09:51:35 -07001040TEST_F(KeymasterTest, VerifyData_EC_Raw_Success) {
1041 uint8_t* key_blob;
1042 size_t key_blob_length;
1043
1044 UniqueReadOnlyBlob testKey(TEST_SIGN_EC_KEY_1, sizeof(TEST_SIGN_EC_KEY_1));
1045 ASSERT_TRUE(testKey.get() != NULL);
1046
1047 ASSERT_EQ(0,
1048 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
1049 &key_blob, &key_blob_length))
1050 << "Should successfully import an RSA key";
1051 UniqueKey key(&sDevice, key_blob, key_blob_length);
1052
1053 keymaster_ec_sign_params_t params = {
Andreas Gampe1aa58f92015-12-16 14:17:44 -08001054 .digest_type = DIGEST_NONE,
Kenny Root6e1683f2013-08-19 09:51:35 -07001055 };
1056
1057 uint8_t* sig;
1058 size_t sig_length;
1059
1060 UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
1061 ASSERT_TRUE(testData.get() != NULL);
1062
1063 ASSERT_EQ(0,
1064 sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
1065 testData.get(), testData.length(),
1066 &sig, &sig_length))
1067 << "Should sign data successfully";
1068 UniqueBlob sig_blob(sig, sig_length);
1069
1070 ASSERT_EQ(0,
1071 sDevice->verify_data(sDevice, &params, key_blob, key_blob_length,
1072 testData.get(), testData.length(),
1073 sig_blob.get(), sig_blob.length()))
1074 << "Should verify data successfully";
1075}
1076
Kenny Root4fd0db72012-03-16 13:19:07 -07001077TEST_F(KeymasterTest, VerifyData_RSA_Raw_BadSignature_Failure) {
1078 uint8_t* key_blob;
1079 size_t key_blob_length;
1080
Kenny Root6e1683f2013-08-19 09:51:35 -07001081 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001082 ASSERT_TRUE(testKey.get() != NULL);
1083
Kenny Root4fd0db72012-03-16 13:19:07 -07001084 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001085 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -07001086 &key_blob, &key_blob_length))
1087 << "Should successfully import an RSA key";
1088 UniqueKey key(&sDevice, key_blob, key_blob_length);
1089
1090 keymaster_rsa_sign_params_t params = {
Andreas Gampe1aa58f92015-12-16 14:17:44 -08001091 .digest_type = DIGEST_NONE,
1092 .padding_type = PADDING_NONE,
Kenny Root4fd0db72012-03-16 13:19:07 -07001093 };
1094
Kenny Root139d44f2012-11-20 14:37:40 -08001095 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -07001096 sDevice->verify_data(sDevice, &params, key_blob, key_blob_length,
1097 TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1),
1098 TEST_SIGN_SIGNATURE_BOGUS_1, sizeof(TEST_SIGN_SIGNATURE_BOGUS_1)))
1099 << "Should sign data successfully";
1100}
1101
Kenny Root6e1683f2013-08-19 09:51:35 -07001102TEST_F(KeymasterTest, VerifyData_EC_Raw_BadSignature_Failure) {
1103 uint8_t* key_blob;
1104 size_t key_blob_length;
1105
1106 UniqueReadOnlyBlob testKey(TEST_SIGN_EC_KEY_1, sizeof(TEST_SIGN_EC_KEY_1));
1107 ASSERT_TRUE(testKey.get() != NULL);
1108
1109 ASSERT_EQ(0,
1110 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
1111 &key_blob, &key_blob_length))
1112 << "Should successfully import an RSA key";
1113 UniqueKey key(&sDevice, key_blob, key_blob_length);
1114
1115 keymaster_ec_sign_params_t params = {
Andreas Gampe1aa58f92015-12-16 14:17:44 -08001116 .digest_type = DIGEST_NONE,
Kenny Root6e1683f2013-08-19 09:51:35 -07001117 };
1118
1119 ASSERT_EQ(-1,
1120 sDevice->verify_data(sDevice, &params, key_blob, key_blob_length,
1121 TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1),
1122 TEST_SIGN_SIGNATURE_BOGUS_1, sizeof(TEST_SIGN_SIGNATURE_BOGUS_1)))
1123 << "Should sign data successfully";
1124}
1125
Kenny Root4fd0db72012-03-16 13:19:07 -07001126TEST_F(KeymasterTest, VerifyData_RSA_Raw_NullKey_Failure) {
1127 keymaster_rsa_sign_params_t params = {
Andreas Gampe1aa58f92015-12-16 14:17:44 -08001128 .digest_type = DIGEST_NONE,
1129 .padding_type = PADDING_NONE,
Kenny Root4fd0db72012-03-16 13:19:07 -07001130 };
1131
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001132 UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
1133 ASSERT_TRUE(testData.get() != NULL);
1134
1135 UniqueReadOnlyBlob testSig(TEST_SIGN_SIGNATURE_BOGUS_1, sizeof(TEST_SIGN_SIGNATURE_BOGUS_1));
1136 ASSERT_TRUE(testSig.get() != NULL);
1137
Kenny Root139d44f2012-11-20 14:37:40 -08001138 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -07001139 sDevice->verify_data(sDevice, &params, NULL, 0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001140 testData.get(), testData.length(),
1141 testSig.get(), testSig.length()))
Kenny Root4fd0db72012-03-16 13:19:07 -07001142 << "Should fail when key is null";
1143}
1144
1145TEST_F(KeymasterTest, VerifyData_RSA_NullInput_Failure) {
1146 uint8_t* key_blob;
1147 size_t key_blob_length;
1148
1149 ASSERT_EQ(0,
Kenny Root6e1683f2013-08-19 09:51:35 -07001150 sDevice->import_keypair(sDevice, TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1),
Kenny Root4fd0db72012-03-16 13:19:07 -07001151 &key_blob, &key_blob_length))
1152 << "Should successfully import an RSA key";
1153 UniqueKey key(&sDevice, key_blob, key_blob_length);
1154
1155 keymaster_rsa_sign_params_t params = {
Andreas Gampe1aa58f92015-12-16 14:17:44 -08001156 .digest_type = DIGEST_NONE,
1157 .padding_type = PADDING_NONE,
Kenny Root4fd0db72012-03-16 13:19:07 -07001158 };
1159
Kenny Root6e1683f2013-08-19 09:51:35 -07001160 UniqueReadOnlyBlob testSig(TEST_SIGN_RSA_SIGNATURE_1, sizeof(TEST_SIGN_RSA_SIGNATURE_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001161 ASSERT_TRUE(testSig.get() != NULL);
1162
Kenny Root139d44f2012-11-20 14:37:40 -08001163 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -07001164 sDevice->verify_data(sDevice, &params, key_blob, key_blob_length,
1165 NULL, 0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001166 testSig.get(), testSig.length()))
Kenny Root4fd0db72012-03-16 13:19:07 -07001167 << "Should fail on null input";
1168}
1169
1170TEST_F(KeymasterTest, VerifyData_RSA_NullSignature_Failure) {
1171 uint8_t* key_blob;
1172 size_t key_blob_length;
1173
Kenny Root6e1683f2013-08-19 09:51:35 -07001174 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001175 ASSERT_TRUE(testKey.get() != NULL);
1176
Kenny Root4fd0db72012-03-16 13:19:07 -07001177 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001178 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -07001179 &key_blob, &key_blob_length))
1180 << "Should successfully import an RSA key";
1181 UniqueKey key(&sDevice, key_blob, key_blob_length);
1182
1183 keymaster_rsa_sign_params_t params = {
Andreas Gampe1aa58f92015-12-16 14:17:44 -08001184 .digest_type = DIGEST_NONE,
1185 .padding_type = PADDING_NONE,
Kenny Root4fd0db72012-03-16 13:19:07 -07001186 };
1187
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001188 UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
1189 ASSERT_TRUE(testData.get() != NULL);
1190
Kenny Root139d44f2012-11-20 14:37:40 -08001191 ASSERT_EQ(-1,
Kenny Root4fd0db72012-03-16 13:19:07 -07001192 sDevice->verify_data(sDevice, &params, key.get(), key.length(),
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001193 testData.get(), testData.length(),
Kenny Root4fd0db72012-03-16 13:19:07 -07001194 NULL, 0))
1195 << "Should fail on null signature";
1196}
1197
Kenny Root8ae65e72012-03-23 16:17:28 -07001198TEST_F(KeymasterTest, EraseAll_Success) {
1199 uint8_t *key1_blob, *key2_blob;
1200 size_t key1_blob_length, key2_blob_length;
1201
1202 // Only test this if the device says it supports delete_all
1203 if (sDevice->delete_all == NULL) {
1204 return;
1205 }
1206
Kenny Root6e1683f2013-08-19 09:51:35 -07001207 UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001208 ASSERT_TRUE(testKey.get() != NULL);
1209
Kenny Root8ae65e72012-03-23 16:17:28 -07001210 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001211 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
Kenny Root8ae65e72012-03-23 16:17:28 -07001212 &key1_blob, &key1_blob_length))
1213 << "Should successfully import an RSA key";
1214 UniqueKey key1(&sDevice, key1_blob, key1_blob_length);
1215
Kenny Root6e1683f2013-08-19 09:51:35 -07001216 UniqueReadOnlyBlob testKey2(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001217 ASSERT_TRUE(testKey2.get() != NULL);
1218
Kenny Root8ae65e72012-03-23 16:17:28 -07001219 ASSERT_EQ(0,
Kenny Rooteca8b3c2013-04-26 16:46:01 -07001220 sDevice->import_keypair(sDevice, testKey2.get(), testKey2.length(),
Kenny Root8ae65e72012-03-23 16:17:28 -07001221 &key2_blob, &key2_blob_length))
1222 << "Should successfully import an RSA key";
1223 UniqueKey key2(&sDevice, key2_blob, key2_blob_length);
1224
Kenny Root139d44f2012-11-20 14:37:40 -08001225 ASSERT_EQ(0, sDevice->delete_all(sDevice))
Kenny Root8ae65e72012-03-23 16:17:28 -07001226 << "Should erase all keys";
1227
1228 key1.reset();
1229
1230 uint8_t* x509_data;
1231 size_t x509_data_length;
1232 ASSERT_EQ(-1,
1233 sDevice->get_keypair_public(sDevice, key1_blob, key1_blob_length,
1234 &x509_data, &x509_data_length))
1235 << "Should be able to retrieve RSA public key 1 successfully";
1236
1237 ASSERT_EQ(-1,
1238 sDevice->get_keypair_public(sDevice, key2_blob, key2_blob_length,
1239 &x509_data, &x509_data_length))
1240 << "Should be able to retrieve RSA public key 2 successfully";
1241}
1242
Kenny Root4fd0db72012-03-16 13:19:07 -07001243}