Home | History | Annotate | Download | only in keymaster
      1 /*
      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 
     39 #include <UniquePtr.h>
     40 
     41 
     42 /** The size of a key ID in bytes */
     43 #define ID_LENGTH 32
     44 
     45 /** The current stored key version. */
     46 const static uint32_t KEY_VERSION = 1;
     47 
     48 
     49 struct EVP_PKEY_Delete {
     50     void operator()(EVP_PKEY* p) const {
     51         EVP_PKEY_free(p);
     52     }
     53 };
     54 typedef UniquePtr<EVP_PKEY, EVP_PKEY_Delete> Unique_EVP_PKEY;
     55 
     56 struct RSA_Delete {
     57     void operator()(RSA* p) const {
     58         RSA_free(p);
     59     }
     60 };
     61 typedef UniquePtr<RSA, RSA_Delete> Unique_RSA;
     62 
     63 struct PKCS8_PRIV_KEY_INFO_Delete {
     64     void operator()(PKCS8_PRIV_KEY_INFO* p) const {
     65         PKCS8_PRIV_KEY_INFO_free(p);
     66     }
     67 };
     68 typedef UniquePtr<PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO_Delete> Unique_PKCS8_PRIV_KEY_INFO;
     69 
     70 typedef UniquePtr<keymaster_device_t> Unique_keymaster_device_t;
     71 
     72 typedef UniquePtr<CK_BYTE[]> Unique_CK_BYTE;
     73 
     74 typedef UniquePtr<CK_ATTRIBUTE[]> Unique_CK_ATTRIBUTE;
     75 
     76 class ByteArray {
     77 public:
     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 
    111 private:
    112     CK_BYTE* mArray;
    113     size_t mLength;
    114 };
    115 typedef UniquePtr<ByteArray> Unique_ByteArray;
    116 
    117 class CryptoSession {
    118 public:
    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 
    153 private:
    154     CK_SESSION_HANDLE mHandle;
    155     CK_SESSION_HANDLE mSubsession;
    156 };
    157 
    158 class ObjectHandle {
    159 public:
    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 
    184 private:
    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  */
    203 static 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  */
    220 static 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 
    234 static 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 
    241 static 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 
    250 static 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 
    269 static 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 
    302 static 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 
    330 static 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 
    409 static 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 
    613 static 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 
    725 static 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 
    754 static 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 
    824 static 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 */
    879 static 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  */
    900 static 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;
    913 
    914     dev->generate_keypair = tee_generate_keypair;
    915     dev->import_keypair = tee_import_keypair;
    916     dev->get_keypair_public = tee_get_keypair_public;
    917     dev->delete_keypair = tee_delete_keypair;
    918     dev->sign_data = tee_sign_data;
    919     dev->verify_data = tee_verify_data;
    920     dev->delete_all = NULL;
    921 
    922     CK_RV initializeRV = C_Initialize(NULL);
    923     if (initializeRV != CKR_OK) {
    924         ALOGE("Error initializing TEE: 0x%x", initializeRV);
    925         return -ENODEV;
    926     }
    927 
    928     CK_INFO info;
    929     CK_RV infoRV = C_GetInfo(&info);
    930     if (infoRV != CKR_OK) {
    931         (void) C_Finalize(NULL_PTR);
    932         ALOGE("Error getting information about TEE during initialization: 0x%x", infoRV);
    933         return -ENODEV;
    934     }
    935 
    936     ALOGI("C_GetInfo cryptokiVer=%d.%d manufID=%s flags=%d libDesc=%s libVer=%d.%d\n",
    937            info.cryptokiVersion.major, info.cryptokiVersion.minor,
    938            info.manufacturerID, info.flags, info.libraryDescription,
    939            info.libraryVersion.major, info.libraryVersion.minor);
    940 
    941     CK_SESSION_HANDLE sessionHandle = CK_INVALID_HANDLE;
    942 
    943     CK_RV openSessionRV = C_OpenSession(CKV_TOKEN_USER,
    944             CKF_SERIAL_SESSION | CKF_RW_SESSION,
    945             NULL,
    946             NULL,
    947             &sessionHandle);
    948 
    949     if (openSessionRV != CKR_OK || sessionHandle == CK_INVALID_HANDLE) {
    950         (void) C_Finalize(NULL_PTR);
    951         ALOGE("Error opening primary session with TEE: 0x%x", openSessionRV);
    952         return -1;
    953     }
    954 
    955     ERR_load_crypto_strings();
    956     ERR_load_BIO_strings();
    957 
    958     dev->context = reinterpret_cast<void*>(sessionHandle);
    959     *device = reinterpret_cast<hw_device_t*>(dev.release());
    960 
    961     return 0;
    962 }
    963 
    964 static struct hw_module_methods_t keystore_module_methods = {
    965     open: tee_open,
    966 };
    967 
    968 struct keystore_module HAL_MODULE_INFO_SYM
    969 __attribute__ ((visibility ("default"))) = {
    970     common: {
    971         tag: HARDWARE_MODULE_TAG,
    972         version_major: 1,
    973         version_minor: 0,
    974         id: KEYSTORE_HARDWARE_MODULE_ID,
    975         name: "Keymaster TEE HAL",
    976         author: "The Android Open Source Project",
    977         methods: &keystore_module_methods,
    978         dso: 0,
    979         reserved: {},
    980     },
    981 };
    982