blob: 7037ffd727712002e4619e0fad115c2f751f6e48 [file] [log] [blame]
Jean-Baptiste Queru711cb432013-02-13 11:20:54 -08001/*
2 * Copyright (C) 2011 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#include <errno.h>
17#include <string.h>
18#include <stdint.h>
19
20// For debugging
21#define LOG_NDEBUG 0
22
23// TEE is the Trusted Execution Environment
24#define LOG_TAG "TEEKeyMaster"
25#include <cutils/log.h>
26
27#include <hardware/hardware.h>
28#include <hardware/keymaster.h>
29
30#include <openssl/bn.h>
31#include <openssl/err.h>
32#include <openssl/evp.h>
33#include <openssl/rand.h>
34#include <openssl/x509.h>
35
36#include <cryptoki.h>
37#include <pkcs11.h>
38
Kenny Root7c4e5d42013-09-11 14:44:44 -070039#include <UniquePtr.h>
Jean-Baptiste Queru711cb432013-02-13 11:20:54 -080040
41
42/** The size of a key ID in bytes */
43#define ID_LENGTH 32
44
45/** The current stored key version. */
46const static uint32_t KEY_VERSION = 1;
47
48
49struct EVP_PKEY_Delete {
50 void operator()(EVP_PKEY* p) const {
51 EVP_PKEY_free(p);
52 }
53};
54typedef UniquePtr<EVP_PKEY, EVP_PKEY_Delete> Unique_EVP_PKEY;
55
56struct RSA_Delete {
57 void operator()(RSA* p) const {
58 RSA_free(p);
59 }
60};
61typedef UniquePtr<RSA, RSA_Delete> Unique_RSA;
62
63struct PKCS8_PRIV_KEY_INFO_Delete {
64 void operator()(PKCS8_PRIV_KEY_INFO* p) const {
65 PKCS8_PRIV_KEY_INFO_free(p);
66 }
67};
68typedef UniquePtr<PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO_Delete> Unique_PKCS8_PRIV_KEY_INFO;
69
70typedef UniquePtr<keymaster_device_t> Unique_keymaster_device_t;
71
72typedef UniquePtr<CK_BYTE[]> Unique_CK_BYTE;
73
74typedef UniquePtr<CK_ATTRIBUTE[]> Unique_CK_ATTRIBUTE;
75
76class ByteArray {
77public:
78 ByteArray(CK_BYTE* array, size_t len) :
79 mArray(array), mLength(len) {
80 }
81
82 ByteArray(size_t len) :
83 mLength(len) {
84 mArray = new CK_BYTE[len];
85 }
86
87 ~ByteArray() {
88 if (mArray != NULL) {
89 delete[] mArray;
90 }
91 }
92
93 CK_BYTE* get() const {
94 return mArray;
95 }
96
97 void setLength(size_t length) {
98 mLength = length;
99 }
100
101 size_t length() const {
102 return mLength;
103 }
104
105 CK_BYTE* release() {
106 CK_BYTE* array = mArray;
107 mArray = NULL;
108 return array;
109 }
110
111private:
112 CK_BYTE* mArray;
113 size_t mLength;
114};
115typedef UniquePtr<ByteArray> Unique_ByteArray;
116
117class CryptoSession {
118public:
119 CryptoSession(CK_SESSION_HANDLE masterHandle) :
120 mHandle(masterHandle), mSubsession(CK_INVALID_HANDLE) {
121 CK_SESSION_HANDLE subsessionHandle = mHandle;
122 CK_RV openSessionRV = C_OpenSession(CKV_TOKEN_USER,
123 CKF_SERIAL_SESSION | CKF_RW_SESSION | CKVF_OPEN_SUB_SESSION,
124 NULL,
125 NULL,
126 &subsessionHandle);
127
128 if (openSessionRV != CKR_OK || subsessionHandle == CK_INVALID_HANDLE) {
129 (void) C_Finalize(NULL_PTR);
130 ALOGE("Error opening secondary session with TEE: 0x%x", openSessionRV);
131 } else {
132 ALOGV("Opening subsession 0x%x", subsessionHandle);
133 mSubsession = subsessionHandle;
134 }
135 }
136
137 ~CryptoSession() {
138 if (mSubsession != CK_INVALID_HANDLE) {
139 CK_RV rv = C_CloseSession(mSubsession);
140 ALOGV("Closing subsession 0x%x: 0x%x", mSubsession, rv);
141 mSubsession = CK_INVALID_HANDLE;
142 }
143 }
144
145 CK_SESSION_HANDLE get() const {
146 return mSubsession;
147 }
148
149 CK_SESSION_HANDLE getPrimary() const {
150 return mHandle;
151 }
152
153private:
154 CK_SESSION_HANDLE mHandle;
155 CK_SESSION_HANDLE mSubsession;
156};
157
158class ObjectHandle {
159public:
160 ObjectHandle(const CryptoSession* session, CK_OBJECT_HANDLE handle = CK_INVALID_HANDLE) :
161 mSession(session), mHandle(handle) {
162 }
163
164 ~ObjectHandle() {
165 if (mHandle != CK_INVALID_HANDLE) {
166 CK_RV rv = C_CloseObjectHandle(mSession->getPrimary(), mHandle);
167 if (rv != CKR_OK) {
168 ALOGW("Couldn't close object handle 0x%x: 0x%x", mHandle, rv);
169 } else {
170 ALOGV("Closing object handle 0x%x", mHandle);
171 mHandle = CK_INVALID_HANDLE;
172 }
173 }
174 }
175
176 CK_OBJECT_HANDLE get() const {
177 return mHandle;
178 }
179
180 void reset(CK_OBJECT_HANDLE handle) {
181 mHandle = handle;
182 }
183
184private:
185 const CryptoSession* mSession;
186 CK_OBJECT_HANDLE mHandle;
187};
188
189
190/**
191 * Many OpenSSL APIs take ownership of an argument on success but don't free the argument
192 * on failure. This means we need to tell our scoped pointers when we've transferred ownership,
193 * without triggering a warning by not using the result of release().
194 */
195#define OWNERSHIP_TRANSFERRED(obj) \
196 typeof (obj.release()) _dummy __attribute__((unused)) = obj.release()
197
198
199/*
200 * Checks this thread's OpenSSL error queue and logs if
201 * necessary.
202 */
203static void logOpenSSLError(const char* location) {
204 int error = ERR_get_error();
205
206 if (error != 0) {
207 char message[256];
208 ERR_error_string_n(error, message, sizeof(message));
209 ALOGE("OpenSSL error in %s %d: %s", location, error, message);
210 }
211
212 ERR_clear_error();
213 ERR_remove_state(0);
214}
215
216
217/**
218 * Convert from OpenSSL's BIGNUM format to TEE's Big Integer format.
219 */
220static ByteArray* bignum_to_array(const BIGNUM* bn) {
221 const int bignumSize = BN_num_bytes(bn);
222
223 Unique_CK_BYTE bytes(new CK_BYTE[bignumSize]);
224
225 unsigned char* tmp = reinterpret_cast<unsigned char*>(bytes.get());
226 if (BN_bn2bin(bn, tmp) != bignumSize) {
227 ALOGE("public exponent size wasn't what was expected");
228 return NULL;
229 }
230
231 return new ByteArray(bytes.release(), bignumSize);
232}
233
234static void set_attribute(CK_ATTRIBUTE* attrib, CK_ATTRIBUTE_TYPE type, void* pValue,
235 CK_ULONG ulValueLen) {
236 attrib->type = type;
237 attrib->pValue = pValue;
238 attrib->ulValueLen = ulValueLen;
239}
240
241static ByteArray* generate_random_id() {
242 Unique_ByteArray id(new ByteArray(ID_LENGTH));
243 if (RAND_pseudo_bytes(reinterpret_cast<unsigned char*>(id->get()), id->length()) < 0) {
244 return NULL;
245 }
246
247 return id.release();
248}
249
250static int keyblob_save(ByteArray* objId, uint8_t** key_blob, size_t* key_blob_length) {
251 Unique_ByteArray handleBlob(new ByteArray(sizeof(uint32_t) + objId->length()));
252 if (handleBlob.get() == NULL) {
253 ALOGE("Could not allocate key blob");
254 return -1;
255 }
256 uint8_t* tmp = handleBlob->get();
257 for (size_t i = 0; i < sizeof(uint32_t); i++) {
258 *tmp++ = KEY_VERSION >> ((sizeof(uint32_t) - i - 1) * 8);
259 }
260 memcpy(tmp, objId->get(), objId->length());
261
262 *key_blob_length = handleBlob->length();
263 *key_blob = handleBlob->get();
264 ByteArray* unused __attribute__((unused)) = handleBlob.release();
265
266 return 0;
267}
268
269static int find_single_object(const uint8_t* obj_id, const size_t obj_id_length,
270 CK_OBJECT_CLASS obj_class, const CryptoSession* session, ObjectHandle* object) {
271
272 // Note that the CKA_ID attribute is never written, so we can cast away const here.
273 void* obj_id_ptr = reinterpret_cast<void*>(const_cast<uint8_t*>(obj_id));
274 CK_ATTRIBUTE attributes[] = {
275 { CKA_ID, obj_id_ptr, obj_id_length },
276 { CKA_CLASS, &obj_class, sizeof(obj_class) },
277 };
278
279 CK_RV rv = C_FindObjectsInit(session->get(), attributes,
280 sizeof(attributes) / sizeof(CK_ATTRIBUTE));
281 if (rv != CKR_OK) {
282 ALOGE("Error in C_FindObjectsInit: 0x%x", rv);
283 return -1;
284 }
285
286 CK_OBJECT_HANDLE tmpHandle;
287 CK_ULONG tmpCount;
288
289 rv = C_FindObjects(session->get(), &tmpHandle, 1, &tmpCount);
290 ALOGV("Found %d object 0x%x : class 0x%x", tmpCount, tmpHandle, obj_class);
291 if (rv != CKR_OK || tmpCount != 1) {
292 C_FindObjectsFinal(session->get());
293 ALOGE("Couldn't find key!");
294 return -1;
295 }
296 C_FindObjectsFinal(session->get());
297
298 object->reset(tmpHandle);
299 return 0;
300}
301
302static int keyblob_restore(const CryptoSession* session, const uint8_t* keyBlob,
303 const size_t keyBlobLength, ObjectHandle* public_key, ObjectHandle* private_key) {
304 if (keyBlob == NULL) {
305 ALOGE("key blob was null");
306 return -1;
307 }
308
309 if (keyBlobLength < (sizeof(KEY_VERSION) + ID_LENGTH)) {
310 ALOGE("key blob is not correct size");
311 return -1;
312 }
313
314 uint32_t keyVersion = 0;
315
316 const uint8_t* p = keyBlob;
317 for (size_t i = 0; i < sizeof(keyVersion); i++) {
318 keyVersion = (keyVersion << 8) | *p++;
319 }
320
321 if (keyVersion != 1) {
322 ALOGE("Invalid key version %d", keyVersion);
323 return -1;
324 }
325
326 return find_single_object(p, ID_LENGTH, CKO_PUBLIC_KEY, session, public_key)
327 || find_single_object(p, ID_LENGTH, CKO_PRIVATE_KEY, session, private_key);
328}
329
330static int tee_generate_keypair(const keymaster_device_t* dev,
331 const keymaster_keypair_t type, const void* key_params,
332 uint8_t** key_blob, size_t* key_blob_length) {
333 CK_BBOOL bTRUE = CK_TRUE;
334
335 if (type != TYPE_RSA) {
336 ALOGW("Unknown key type %d", type);
337 return -1;
338 }
339
340 if (key_params == NULL) {
341 ALOGW("generate_keypair params were NULL");
342 return -1;
343 }
344
345 keymaster_rsa_keygen_params_t* rsa_params = (keymaster_rsa_keygen_params_t*) key_params;
346
347 CK_MECHANISM mechanism = {
348 CKM_RSA_PKCS_KEY_PAIR_GEN, NULL, 0,
349 };
350 CK_ULONG modulusBits = (CK_ULONG) rsa_params->modulus_size;
351
352 /**
353 * Convert our unsigned 64-bit integer to the TEE Big Integer class. It's
354 * an unsigned array of bytes with MSB first.
355 */
356 CK_BYTE publicExponent[sizeof(uint64_t)];
357 const uint64_t exp = rsa_params->public_exponent;
358 size_t offset = sizeof(publicExponent) - 1;
359 for (size_t i = 0; i < sizeof(publicExponent); i++) {
360 publicExponent[offset--] = (exp >> (i * CHAR_BIT)) & 0xFF;
361 }
362
363 Unique_ByteArray objId(generate_random_id());
364 if (objId.get() == NULL) {
365 ALOGE("Couldn't generate random key ID");
366 return -1;
367 }
368
369 CK_ATTRIBUTE publicKeyTemplate[] = {
370 {CKA_ID, objId->get(), objId->length()},
371 {CKA_TOKEN, &bTRUE, sizeof(bTRUE)},
372 {CKA_ENCRYPT, &bTRUE, sizeof(bTRUE)},
373 {CKA_VERIFY, &bTRUE, sizeof(bTRUE)},
374 {CKA_MODULUS_BITS, &modulusBits, sizeof(modulusBits)},
375 {CKA_PUBLIC_EXPONENT, publicExponent, sizeof(publicExponent)},
376 };
377
378 CK_ATTRIBUTE privateKeyTemplate[] = {
379 {CKA_ID, objId->get(), objId->length()},
380 {CKA_TOKEN, &bTRUE, sizeof(bTRUE)},
381 {CKA_DECRYPT, &bTRUE, sizeof(bTRUE)},
382 {CKA_SIGN, &bTRUE, sizeof(bTRUE)},
383 };
384
385 CryptoSession session(reinterpret_cast<CK_SESSION_HANDLE>(dev->context));
386
387 CK_OBJECT_HANDLE hPublicKey, hPrivateKey;
388 CK_RV rv = C_GenerateKeyPair(session.get(),
389 &mechanism,
390 publicKeyTemplate,
391 sizeof(publicKeyTemplate)/sizeof(CK_ATTRIBUTE),
392 privateKeyTemplate,
393 sizeof(privateKeyTemplate)/sizeof(CK_ATTRIBUTE),
394 &hPublicKey,
395 &hPrivateKey);
396
397 if (rv != CKR_OK) {
398 ALOGE("Generate keypair failed: 0x%x", rv);
399 return -1;
400 }
401
402 ObjectHandle publicKey(&session, hPublicKey);
403 ObjectHandle privateKey(&session, hPrivateKey);
404 ALOGV("public handle = 0x%x, private handle = 0x%x", publicKey.get(), privateKey.get());
405
406 return keyblob_save(objId.get(), key_blob, key_blob_length);
407}
408
409static int tee_import_keypair(const keymaster_device_t* dev,
410 const uint8_t* key, const size_t key_length,
411 uint8_t** key_blob, size_t* key_blob_length) {
412 CK_RV rv;
413 CK_BBOOL bTRUE = CK_TRUE;
414
415 if (key == NULL) {
416 ALOGW("provided key is null");
417 return -1;
418 }
419
420 Unique_PKCS8_PRIV_KEY_INFO pkcs8(d2i_PKCS8_PRIV_KEY_INFO(NULL, &key, key_length));
421 if (pkcs8.get() == NULL) {
422 logOpenSSLError("tee_import_keypair");
423 return -1;
424 }
425
426 /* assign to EVP */
427 Unique_EVP_PKEY pkey(EVP_PKCS82PKEY(pkcs8.get()));
428 if (pkey.get() == NULL) {
429 logOpenSSLError("tee_import_keypair");
430 return -1;
431 }
432
433 if (EVP_PKEY_type(pkey->type) != EVP_PKEY_RSA) {
434 ALOGE("Unsupported key type: %d", EVP_PKEY_type(pkey->type));
435 return -1;
436 }
437
438 Unique_RSA rsa(EVP_PKEY_get1_RSA(pkey.get()));
439 if (rsa.get() == NULL) {
440 logOpenSSLError("tee_import_keypair");
441 return -1;
442 }
443
444 Unique_ByteArray modulus(bignum_to_array(rsa->n));
445 if (modulus.get() == NULL) {
446 ALOGW("Could not convert modulus to array");
447 return -1;
448 }
449
450 Unique_ByteArray publicExponent(bignum_to_array(rsa->e));
451 if (publicExponent.get() == NULL) {
452 ALOGW("Could not convert publicExponent to array");
453 return -1;
454 }
455
456 CK_KEY_TYPE rsaType = CKK_RSA;
457
458 CK_OBJECT_CLASS pubClass = CKO_PUBLIC_KEY;
459
460 Unique_ByteArray objId(generate_random_id());
461 if (objId.get() == NULL) {
462 ALOGE("Couldn't generate random key ID");
463 return -1;
464 }
465
466 CK_ATTRIBUTE publicKeyTemplate[] = {
467 {CKA_ID, objId->get(), objId->length()},
468 {CKA_TOKEN, &bTRUE, sizeof(bTRUE)},
469 {CKA_CLASS, &pubClass, sizeof(pubClass)},
470 {CKA_KEY_TYPE, &rsaType, sizeof(rsaType)},
471 {CKA_ENCRYPT, &bTRUE, sizeof(bTRUE)},
472 {CKA_VERIFY, &bTRUE, sizeof(bTRUE)},
473 {CKA_MODULUS, modulus->get(), modulus->length()},
474 {CKA_PUBLIC_EXPONENT, publicExponent->get(), publicExponent->length()},
475 };
476
477 CryptoSession session(reinterpret_cast<CK_SESSION_HANDLE>(dev->context));
478
479 CK_OBJECT_HANDLE hPublicKey;
480 rv = C_CreateObject(session.get(),
481 publicKeyTemplate,
482 sizeof(publicKeyTemplate)/sizeof(CK_ATTRIBUTE),
483 &hPublicKey);
484 if (rv != CKR_OK) {
485 ALOGE("Creation of public key failed: 0x%x", rv);
486 return -1;
487 }
488 ObjectHandle publicKey(&session, hPublicKey);
489
490 Unique_ByteArray privateExponent(bignum_to_array(rsa->d));
491 if (privateExponent.get() == NULL) {
492 ALOGW("Could not convert private exponent");
493 return -1;
494 }
495
496
497 /*
498 * Normally we need:
499 * CKA_ID
500 * CKA_TOKEN
501 * CKA_CLASS
502 * CKA_KEY_TYPE
503 *
504 * CKA_DECRYPT
505 * CKA_SIGN
506 *
507 * CKA_MODULUS
508 * CKA_PUBLIC_EXPONENT
509 * CKA_PRIVATE_EXPONENT
510 */
511#define PRIV_ATTRIB_NORMAL_NUM (4 + 2 + 3)
512
513 /*
514 * For additional private key values:
515 * CKA_PRIME_1
516 * CKA_PRIME_2
517 *
518 * CKA_EXPONENT_1
519 * CKA_EXPONENT_2
520 *
521 * CKA_COEFFICIENT
522 */
523#define PRIV_ATTRIB_EXTENDED_NUM (PRIV_ATTRIB_NORMAL_NUM + 5)
524
525 /*
526 * If we have the prime, prime exponents, and coefficient, we can
527 * copy them in.
528 */
529 bool has_extra_data = (rsa->p != NULL) && (rsa->q != NULL) && (rsa->dmp1 != NULL) &&
530 (rsa->dmq1 != NULL) && (rsa->iqmp != NULL);
531
532 Unique_CK_ATTRIBUTE privateKeyTemplate(new CK_ATTRIBUTE[
533 has_extra_data ? PRIV_ATTRIB_EXTENDED_NUM : PRIV_ATTRIB_NORMAL_NUM]);
534
535 CK_OBJECT_CLASS privClass = CKO_PRIVATE_KEY;
536
537 size_t templateOffset = 0;
538
539 set_attribute(&privateKeyTemplate[templateOffset++], CKA_ID, objId->get(), objId->length());
540 set_attribute(&privateKeyTemplate[templateOffset++], CKA_TOKEN, &bTRUE, sizeof(bTRUE));
541 set_attribute(&privateKeyTemplate[templateOffset++], CKA_CLASS, &privClass, sizeof(privClass));
542 set_attribute(&privateKeyTemplate[templateOffset++], CKA_KEY_TYPE, &rsaType, sizeof(rsaType));
543
544 set_attribute(&privateKeyTemplate[templateOffset++], CKA_DECRYPT, &bTRUE, sizeof(bTRUE));
545 set_attribute(&privateKeyTemplate[templateOffset++], CKA_SIGN, &bTRUE, sizeof(bTRUE));
546
547 set_attribute(&privateKeyTemplate[templateOffset++], CKA_MODULUS, modulus->get(),
548 modulus->length());
549 set_attribute(&privateKeyTemplate[templateOffset++], CKA_PUBLIC_EXPONENT,
550 publicExponent->get(), publicExponent->length());
551 set_attribute(&privateKeyTemplate[templateOffset++], CKA_PRIVATE_EXPONENT,
552 privateExponent->get(), privateExponent->length());
553
554 Unique_ByteArray prime1, prime2, exp1, exp2, coeff;
555 if (has_extra_data) {
556 prime1.reset(bignum_to_array(rsa->p));
557 if (prime1->get() == NULL) {
558 ALOGW("Could not convert prime1");
559 return -1;
560 }
561 set_attribute(&privateKeyTemplate[templateOffset++], CKA_PRIME_1, prime1->get(),
562 prime1->length());
563
564 prime2.reset(bignum_to_array(rsa->q));
565 if (prime2->get() == NULL) {
566 ALOGW("Could not convert prime2");
567 return -1;
568 }
569 set_attribute(&privateKeyTemplate[templateOffset++], CKA_PRIME_2, prime2->get(),
570 prime2->length());
571
572 exp1.reset(bignum_to_array(rsa->dmp1));
573 if (exp1->get() == NULL) {
574 ALOGW("Could not convert exponent 1");
575 return -1;
576 }
577 set_attribute(&privateKeyTemplate[templateOffset++], CKA_EXPONENT_1, exp1->get(),
578 exp1->length());
579
580 exp2.reset(bignum_to_array(rsa->dmq1));
581 if (exp2->get() == NULL) {
582 ALOGW("Could not convert exponent 2");
583 return -1;
584 }
585 set_attribute(&privateKeyTemplate[templateOffset++], CKA_EXPONENT_2, exp2->get(),
586 exp2->length());
587
588 coeff.reset(bignum_to_array(rsa->iqmp));
589 if (coeff->get() == NULL) {
590 ALOGW("Could not convert coefficient");
591 return -1;
592 }
593 set_attribute(&privateKeyTemplate[templateOffset++], CKA_COEFFICIENT, coeff->get(),
594 coeff->length());
595 }
596
597 CK_OBJECT_HANDLE hPrivateKey;
598 rv = C_CreateObject(session.get(),
599 privateKeyTemplate.get(),
600 templateOffset,
601 &hPrivateKey);
602 if (rv != CKR_OK) {
603 ALOGE("Creation of private key failed: 0x%x", rv);
604 return -1;
605 }
606 ObjectHandle privateKey(&session, hPrivateKey);
607
608 ALOGV("public handle = 0x%x, private handle = 0x%x", publicKey.get(), privateKey.get());
609
610 return keyblob_save(objId.get(), key_blob, key_blob_length);
611}
612
613static int tee_get_keypair_public(const struct keymaster_device* dev,
614 const uint8_t* key_blob, const size_t key_blob_length,
615 uint8_t** x509_data, size_t* x509_data_length) {
616
617 CryptoSession session(reinterpret_cast<CK_SESSION_HANDLE>(dev->context));
618
619 ObjectHandle publicKey(&session);
620 ObjectHandle privateKey(&session);
621
622 if (keyblob_restore(&session, key_blob, key_blob_length, &publicKey, &privateKey)) {
623 return -1;
624 }
625
626 if (x509_data == NULL || x509_data_length == NULL) {
627 ALOGW("Provided destination variables were null");
628 return -1;
629 }
630
631 CK_ATTRIBUTE attributes[] = {
632 {CKA_MODULUS, NULL, 0},
633 {CKA_PUBLIC_EXPONENT, NULL, 0},
634 };
635
636 // Call first to get the sizes of the values.
637 CK_RV rv = C_GetAttributeValue(session.get(), publicKey.get(), attributes,
638 sizeof(attributes)/sizeof(CK_ATTRIBUTE));
639 if (rv != CKR_OK) {
640 ALOGW("Could not query attribute value sizes: 0x%02x", rv);
641 return -1;
642 }
643
644 ByteArray modulus(new CK_BYTE[attributes[0].ulValueLen], attributes[0].ulValueLen);
645 ByteArray exponent(new CK_BYTE[attributes[1].ulValueLen], attributes[1].ulValueLen);
646
647 attributes[0].pValue = modulus.get();
648 attributes[1].pValue = exponent.get();
649
650 rv = C_GetAttributeValue(session.get(), publicKey.get(), attributes,
651 sizeof(attributes) / sizeof(CK_ATTRIBUTE));
652 if (rv != CKR_OK) {
653 ALOGW("Could not query attribute values: 0x%02x", rv);
654 return -1;
655 }
656
657 ALOGV("modulus is %d (ret=%d), exponent is %d (ret=%d)",
658 modulus.length(), attributes[0].ulValueLen,
659 exponent.length(), attributes[1].ulValueLen);
660
661 /*
662 * Work around a bug in the implementation. The first call to measure how large the array
663 * should be sometimes returns values that are too large. The call to get the actual value
664 * returns the correct length of the array, so use that instead.
665 */
666 modulus.setLength(attributes[0].ulValueLen);
667 exponent.setLength(attributes[1].ulValueLen);
668
669 Unique_RSA rsa(RSA_new());
670 if (rsa.get() == NULL) {
671 ALOGE("Could not allocate RSA structure");
672 return -1;
673 }
674
675 rsa->n = BN_bin2bn(reinterpret_cast<const unsigned char*>(modulus.get()), modulus.length(),
676 NULL);
677 if (rsa->n == NULL) {
678 logOpenSSLError("tee_get_keypair_public");
679 return -1;
680 }
681
682 rsa->e = BN_bin2bn(reinterpret_cast<const unsigned char*>(exponent.get()), exponent.length(),
683 NULL);
684 if (rsa->e == NULL) {
685 logOpenSSLError("tee_get_keypair_public");
686 return -1;
687 }
688
689 Unique_EVP_PKEY pkey(EVP_PKEY_new());
690 if (pkey.get() == NULL) {
691 ALOGE("Could not allocate EVP_PKEY structure");
692 return -1;
693 }
694 if (EVP_PKEY_assign_RSA(pkey.get(), rsa.get()) != 1) {
695 logOpenSSLError("tee_get_keypair_public");
696 return -1;
697 }
698 OWNERSHIP_TRANSFERRED(rsa);
699
700 int len = i2d_PUBKEY(pkey.get(), NULL);
701 if (len <= 0) {
702 logOpenSSLError("tee_get_keypair_public");
703 return -1;
704 }
705
706 UniquePtr<uint8_t> key(static_cast<uint8_t*>(malloc(len)));
707 if (key.get() == NULL) {
708 ALOGE("Could not allocate memory for public key data");
709 return -1;
710 }
711
712 unsigned char* tmp = reinterpret_cast<unsigned char*>(key.get());
713 if (i2d_PUBKEY(pkey.get(), &tmp) != len) {
714 logOpenSSLError("tee_get_keypair_public");
715 return -1;
716 }
717
718 ALOGV("Length of x509 data is %d", len);
719 *x509_data_length = len;
720 *x509_data = key.release();
721
722 return 0;
723}
724
725static int tee_delete_keypair(const struct keymaster_device* dev,
726 const uint8_t* key_blob, const size_t key_blob_length) {
727
728 CryptoSession session(reinterpret_cast<CK_SESSION_HANDLE>(dev->context));
729
730 ObjectHandle publicKey(&session);
731 ObjectHandle privateKey(&session);
732
733 if (keyblob_restore(&session, key_blob, key_blob_length, &publicKey, &privateKey)) {
734 return -1;
735 }
736
737 // Delete the private key.
738 CK_RV rv = C_DestroyObject(session.get(), privateKey.get());
739 if (rv != CKR_OK) {
740 ALOGW("Could destroy private key object: 0x%02x", rv);
741 return -1;
742 }
743
744 // Delete the public key.
745 rv = C_DestroyObject(session.get(), publicKey.get());
746 if (rv != CKR_OK) {
747 ALOGW("Could destroy public key object: 0x%02x", rv);
748 return -1;
749 }
750
751 return 0;
752}
753
754static int tee_sign_data(const keymaster_device_t* dev,
755 const void* params,
756 const uint8_t* key_blob, const size_t key_blob_length,
757 const uint8_t* data, const size_t dataLength,
758 uint8_t** signedData, size_t* signedDataLength) {
759 ALOGV("tee_sign_data(%p, %p, %llu, %p, %llu, %p, %p)", dev, key_blob,
760 (unsigned long long) key_blob_length, data, (unsigned long long) dataLength, signedData,
761 signedDataLength);
762
763 if (params == NULL) {
764 ALOGW("Signing params were null");
765 return -1;
766 }
767
768 CryptoSession session(reinterpret_cast<CK_SESSION_HANDLE>(dev->context));
769
770 ObjectHandle publicKey(&session);
771 ObjectHandle privateKey(&session);
772
773 if (keyblob_restore(&session, key_blob, key_blob_length, &publicKey, &privateKey)) {
774 return -1;
775 }
776 ALOGV("public handle = 0x%x, private handle = 0x%x", publicKey.get(), privateKey.get());
777
778 keymaster_rsa_sign_params_t* sign_params = (keymaster_rsa_sign_params_t*) params;
779 if (sign_params->digest_type != DIGEST_NONE) {
780 ALOGW("Cannot handle digest type %d", sign_params->digest_type);
781 return -1;
782 } else if (sign_params->padding_type != PADDING_NONE) {
783 ALOGW("Cannot handle padding type %d", sign_params->padding_type);
784 return -1;
785 }
786
787 CK_MECHANISM rawRsaMechanism = {
788 CKM_RSA_X_509, NULL, 0
789 };
790
791 CK_RV rv = C_SignInit(session.get(), &rawRsaMechanism, privateKey.get());
792 if (rv != CKR_OK) {
793 ALOGV("C_SignInit failed: 0x%x", rv);
794 return -1;
795 }
796
797 CK_BYTE signature[1024];
798 CK_ULONG signatureLength = 1024;
799
800 rv = C_Sign(session.get(), data, dataLength, signature, &signatureLength);
801 if (rv != CKR_OK) {
802 ALOGV("C_SignFinal failed: 0x%x", rv);
803 return -1;
804 }
805
806 UniquePtr<uint8_t[]> finalSignature(new uint8_t[signatureLength]);
807 if (finalSignature.get() == NULL) {
808 ALOGE("Couldn't allocate memory to copy signature");
809 return -1;
810 }
811
812 memcpy(finalSignature.get(), signature, signatureLength);
813
814 *signedData = finalSignature.release();
815 *signedDataLength = static_cast<size_t>(signatureLength);
816
817 ALOGV("tee_sign_data(%p, %p, %llu, %p, %llu, %p, %p) => %p size %llu", dev, key_blob,
818 (unsigned long long) key_blob_length, data, (unsigned long long) dataLength, signedData,
819 signedDataLength, *signedData, (unsigned long long) *signedDataLength);
820
821 return 0;
822}
823
824static int tee_verify_data(const keymaster_device_t* dev,
825 const void* params,
826 const uint8_t* keyBlob, const size_t keyBlobLength,
827 const uint8_t* signedData, const size_t signedDataLength,
828 const uint8_t* signature, const size_t signatureLength) {
829 ALOGV("tee_verify_data(%p, %p, %llu, %p, %llu, %p, %llu)", dev, keyBlob,
830 (unsigned long long) keyBlobLength, signedData, (unsigned long long) signedDataLength,
831 signature, (unsigned long long) signatureLength);
832
833 if (params == NULL) {
834 ALOGW("Verification params were null");
835 return -1;
836 }
837
838 CryptoSession session(reinterpret_cast<CK_SESSION_HANDLE>(dev->context));
839
840 ObjectHandle publicKey(&session);
841 ObjectHandle privateKey(&session);
842
843 if (keyblob_restore(&session, keyBlob, keyBlobLength, &publicKey, &privateKey)) {
844 return -1;
845 }
846 ALOGV("public handle = 0x%x, private handle = 0x%x", publicKey.get(), privateKey.get());
847
848 keymaster_rsa_sign_params_t* sign_params = (keymaster_rsa_sign_params_t*) params;
849 if (sign_params->digest_type != DIGEST_NONE) {
850 ALOGW("Cannot handle digest type %d", sign_params->digest_type);
851 return -1;
852 } else if (sign_params->padding_type != PADDING_NONE) {
853 ALOGW("Cannot handle padding type %d", sign_params->padding_type);
854 return -1;
855 }
856
857 CK_MECHANISM rawRsaMechanism = {
858 CKM_RSA_X_509, NULL, 0
859 };
860
861 CK_RV rv = C_VerifyInit(session.get(), &rawRsaMechanism, publicKey.get());
862 if (rv != CKR_OK) {
863 ALOGV("C_VerifyInit failed: 0x%x", rv);
864 return -1;
865 }
866
867 // This is a bad prototype for this function. C_Verify should have only const args.
868 rv = C_Verify(session.get(), signedData, signedDataLength,
869 const_cast<unsigned char*>(signature), signatureLength);
870 if (rv != CKR_OK) {
871 ALOGV("C_Verify failed: 0x%x", rv);
872 return -1;
873 }
874
875 return 0;
876}
877
878/* Close an opened OpenSSL instance */
879static int tee_close(hw_device_t *dev) {
880 keymaster_device_t *keymaster_dev = (keymaster_device_t *) dev;
881 if (keymaster_dev != NULL) {
882 CK_SESSION_HANDLE handle = reinterpret_cast<CK_SESSION_HANDLE>(keymaster_dev->context);
883 if (handle != CK_INVALID_HANDLE) {
884 C_CloseSession(handle);
885 }
886 }
887
888 CK_RV finalizeRV = C_Finalize(NULL_PTR);
889 if (finalizeRV != CKR_OK) {
890 ALOGE("Error closing the TEE");
891 }
892 free(dev);
893
894 return 0;
895}
896
897/*
898 * Generic device handling
899 */
900static int tee_open(const hw_module_t* module, const char* name,
901 hw_device_t** device) {
902 if (strcmp(name, KEYSTORE_KEYMASTER) != 0)
903 return -EINVAL;
904
905 Unique_keymaster_device_t dev(new keymaster_device_t);
906 if (dev.get() == NULL)
907 return -ENOMEM;
908
909 dev->common.tag = HARDWARE_DEVICE_TAG;
910 dev->common.version = 1;
911 dev->common.module = (struct hw_module_t*) module;
912 dev->common.close = tee_close;
Brian Carlstrom71f5b432014-06-04 13:19:18 -0700913 dev->flags = 0;
Jean-Baptiste Queru711cb432013-02-13 11:20:54 -0800914
915 dev->generate_keypair = tee_generate_keypair;
916 dev->import_keypair = tee_import_keypair;
917 dev->get_keypair_public = tee_get_keypair_public;
918 dev->delete_keypair = tee_delete_keypair;
919 dev->sign_data = tee_sign_data;
920 dev->verify_data = tee_verify_data;
921 dev->delete_all = NULL;
922
923 CK_RV initializeRV = C_Initialize(NULL);
924 if (initializeRV != CKR_OK) {
925 ALOGE("Error initializing TEE: 0x%x", initializeRV);
926 return -ENODEV;
927 }
928
929 CK_INFO info;
930 CK_RV infoRV = C_GetInfo(&info);
931 if (infoRV != CKR_OK) {
932 (void) C_Finalize(NULL_PTR);
933 ALOGE("Error getting information about TEE during initialization: 0x%x", infoRV);
934 return -ENODEV;
935 }
936
937 ALOGI("C_GetInfo cryptokiVer=%d.%d manufID=%s flags=%d libDesc=%s libVer=%d.%d\n",
938 info.cryptokiVersion.major, info.cryptokiVersion.minor,
939 info.manufacturerID, info.flags, info.libraryDescription,
940 info.libraryVersion.major, info.libraryVersion.minor);
941
942 CK_SESSION_HANDLE sessionHandle = CK_INVALID_HANDLE;
943
944 CK_RV openSessionRV = C_OpenSession(CKV_TOKEN_USER,
945 CKF_SERIAL_SESSION | CKF_RW_SESSION,
946 NULL,
947 NULL,
948 &sessionHandle);
949
950 if (openSessionRV != CKR_OK || sessionHandle == CK_INVALID_HANDLE) {
951 (void) C_Finalize(NULL_PTR);
952 ALOGE("Error opening primary session with TEE: 0x%x", openSessionRV);
953 return -1;
954 }
955
956 ERR_load_crypto_strings();
957 ERR_load_BIO_strings();
958
959 dev->context = reinterpret_cast<void*>(sessionHandle);
960 *device = reinterpret_cast<hw_device_t*>(dev.release());
961
962 return 0;
963}
964
965static struct hw_module_methods_t keystore_module_methods = {
966 open: tee_open,
967};
968
969struct keystore_module HAL_MODULE_INFO_SYM
970__attribute__ ((visibility ("default"))) = {
971 common: {
972 tag: HARDWARE_MODULE_TAG,
Brian Carlstrom71f5b432014-06-04 13:19:18 -0700973 module_api_version: KEYMASTER_MODULE_API_VERSION_0_3,
974 hal_api_version: HARDWARE_HAL_API_VERSION,
Jean-Baptiste Queru711cb432013-02-13 11:20:54 -0800975 id: KEYSTORE_HARDWARE_MODULE_ID,
976 name: "Keymaster TEE HAL",
977 author: "The Android Open Source Project",
978 methods: &keystore_module_methods,
979 dso: 0,
980 reserved: {},
981 },
982};