Home | History | Annotate | Download | only in keymaster
      1 /*
      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 
     17 #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>
     23 
     24 #include <fstream>
     25 #include <iostream>
     26 
     27 #include <gtest/gtest.h>
     28 
     29 #include <openssl/bn.h>
     30 #include <openssl/evp.h>
     31 #include <openssl/x509.h>
     32 
     33 #define LOG_TAG "keymaster_test"
     34 #include <utils/Log.h>
     35 #include <utils/UniquePtr.h>
     36 
     37 #include <hardware/keymaster.h>
     38 
     39 namespace android {
     40 
     41 class UniqueBlob : public UniquePtr<uint8_t[]> {
     42 public:
     43     UniqueBlob(size_t length) :
     44             mLength(length) {
     45     }
     46 
     47     UniqueBlob(uint8_t* bytes, size_t length) :
     48             UniquePtr<uint8_t[]>(bytes), mLength(length) {
     49     }
     50 
     51     bool operator==(const UniqueBlob &other) const {
     52         if (other.length() != mLength) {
     53             return false;
     54         }
     55 
     56         const uint8_t* mine = get();
     57         const uint8_t* theirs = other.get();
     58 
     59         for (size_t i = 0; i < mLength; i++) {
     60             if (mine[i] != theirs[i]) {
     61                 return false;
     62             }
     63         }
     64 
     65         return true;
     66     }
     67 
     68     size_t length() const {
     69         return mLength;
     70     }
     71 
     72     friend std::ostream &operator<<(std::ostream &stream, const UniqueBlob& blob);
     73 
     74 private:
     75     size_t mLength;
     76 };
     77 
     78 std::ostream &operator<<(std::ostream &stream, const UniqueBlob& blob) {
     79     const size_t length = blob.mLength;
     80     stream << "Blob length=" << length << " < ";
     81 
     82     const uint8_t* data = blob.get();
     83     for (size_t i = 0; i < length; i++) {
     84         stream << std::hex << std::setw(2) << std::setfill('0')
     85                 << static_cast<unsigned int>(data[i]) << ' ';
     86     }
     87     stream << '>' << std::endl;
     88 
     89     return stream;
     90 }
     91 
     92 class UniqueKey : public UniqueBlob {
     93 public:
     94     UniqueKey(keymaster_device_t** dev, uint8_t* bytes, size_t length) :
     95             UniqueBlob(bytes, length), mDevice(dev) {
     96     }
     97 
     98     ~UniqueKey() {
     99         if (mDevice != NULL && *mDevice != NULL) {
    100             keymaster_device_t* dev = *mDevice;
    101             if (dev->delete_keypair != NULL) {
    102                 dev->delete_keypair(dev, get(), length());
    103             }
    104         }
    105     }
    106 
    107 private:
    108     keymaster_device_t** mDevice;
    109 };
    110 
    111 class UniqueReadOnlyBlob {
    112 public:
    113     UniqueReadOnlyBlob(uint8_t* data, size_t dataSize) :
    114             mDataSize(dataSize) {
    115         int pageSize = sysconf(_SC_PAGE_SIZE);
    116         if (pageSize == -1) {
    117             return;
    118         }
    119 
    120         int fd = open("/dev/zero", O_RDONLY);
    121         if (fd == -1) {
    122             return;
    123         }
    124 
    125         mBufferSize = (dataSize + pageSize - 1) & ~(pageSize - 1);
    126         uint8_t* buffer = (uint8_t*) mmap(NULL, mBufferSize, PROT_READ | PROT_WRITE,
    127                                           MAP_PRIVATE, fd, 0);
    128         close(fd);
    129 
    130         if (buffer == NULL) {
    131             return;
    132         }
    133 
    134         memcpy(buffer, data, dataSize);
    135         if (mprotect(buffer, mBufferSize, PROT_READ) == -1) {
    136             munmap(buffer, mBufferSize);
    137             return;
    138         }
    139 
    140         mBuffer = buffer;
    141     }
    142 
    143     ~UniqueReadOnlyBlob() {
    144         munmap(mBuffer, mBufferSize);
    145     }
    146 
    147     uint8_t* get() const {
    148         return mBuffer;
    149     }
    150 
    151     size_t length() const {
    152         return mDataSize;
    153     }
    154 
    155 private:
    156     uint8_t* mBuffer;
    157     size_t mBufferSize;
    158     size_t mDataSize;
    159 };
    160 
    161 struct BIGNUM_Delete {
    162     void operator()(BIGNUM* p) const {
    163         BN_free(p);
    164     }
    165 };
    166 typedef UniquePtr<BIGNUM, BIGNUM_Delete> Unique_BIGNUM;
    167 
    168 struct EVP_PKEY_Delete {
    169     void operator()(EVP_PKEY* p) const {
    170         EVP_PKEY_free(p);
    171     }
    172 };
    173 typedef UniquePtr<EVP_PKEY, EVP_PKEY_Delete> Unique_EVP_PKEY;
    174 
    175 struct PKCS8_PRIV_KEY_INFO_Delete {
    176     void operator()(PKCS8_PRIV_KEY_INFO* p) const {
    177         PKCS8_PRIV_KEY_INFO_free(p);
    178     }
    179 };
    180 typedef UniquePtr<PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO_Delete> Unique_PKCS8_PRIV_KEY_INFO;
    181 
    182 struct RSA_Delete {
    183     void operator()(RSA* p) const {
    184         RSA_free(p);
    185     }
    186 };
    187 typedef UniquePtr<RSA, RSA_Delete> Unique_RSA;
    188 
    189 struct EC_KEY_Delete {
    190     void operator()(EC_KEY* p) const {
    191         EC_KEY_free(p);
    192     }
    193 };
    194 typedef UniquePtr<EC_KEY, EC_KEY_Delete> Unique_EC_KEY;
    195 
    196 
    197 /*
    198  * DER-encoded PKCS#8 format RSA key. Generated using:
    199  *
    200  * openssl genrsa 2048 | openssl pkcs8 -topk8 -nocrypt -outform der | recode ../x1
    201  */
    202 static uint8_t TEST_RSA_KEY_1[] = {
    203         0x30, 0x82, 0x04, 0xBE, 0x02, 0x01, 0x00, 0x30, 0x0D, 0x06, 0x09, 0x2A,
    204         0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82,
    205         0x04, 0xA8, 0x30, 0x82, 0x04, 0xA4, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01,
    206         0x01, 0x00, 0xD8, 0x58, 0xD4, 0x9F, 0xC0, 0xE8, 0xF0, 0xFF, 0x87, 0x27,
    207         0x43, 0xE6, 0x2E, 0xE6, 0x9A, 0x42, 0x3B, 0x39, 0x94, 0x84, 0x43, 0x55,
    208         0x8D, 0x20, 0x5B, 0x71, 0x88, 0xE6, 0xD1, 0x62, 0xC8, 0xF2, 0x20, 0xD0,
    209         0x75, 0x13, 0x83, 0xA3, 0x5D, 0x19, 0xA8, 0x62, 0xD0, 0x5F, 0x3E, 0x8A,
    210         0x7C, 0x0E, 0x26, 0xA9, 0xFF, 0xB2, 0x5E, 0x63, 0xAA, 0x3C, 0x8D, 0x13,
    211         0x41, 0xAA, 0xD5, 0x03, 0x01, 0x01, 0x53, 0xC9, 0x02, 0x1C, 0xEC, 0xE8,
    212         0xC4, 0x70, 0x3F, 0x43, 0xE5, 0x51, 0xD0, 0x6E, 0x52, 0x0B, 0xC4, 0x0A,
    213         0xA3, 0x61, 0xDE, 0xE3, 0x72, 0x0C, 0x94, 0xF1, 0x1C, 0x2D, 0x36, 0x77,
    214         0xBB, 0x16, 0xA8, 0x63, 0x4B, 0xD1, 0x07, 0x00, 0x42, 0x2D, 0x2B, 0x10,
    215         0x80, 0x45, 0xF3, 0x0C, 0xF9, 0xC5, 0xAC, 0xCC, 0x64, 0x87, 0xFD, 0x5D,
    216         0xC8, 0x51, 0xD4, 0x1C, 0x9E, 0x6E, 0x9B, 0xC4, 0x27, 0x5E, 0x73, 0xA7,
    217         0x2A, 0xF6, 0x90, 0x42, 0x0C, 0x34, 0x93, 0xB7, 0x02, 0x19, 0xA9, 0x64,
    218         0x6C, 0x46, 0x3B, 0x40, 0x02, 0x2F, 0x54, 0x69, 0x79, 0x26, 0x7D, 0xF6,
    219         0x85, 0x90, 0x01, 0xD0, 0x21, 0x07, 0xD0, 0x14, 0x00, 0x65, 0x9C, 0xAC,
    220         0x24, 0xE8, 0x78, 0x42, 0x3B, 0x90, 0x75, 0x19, 0x55, 0x11, 0x4E, 0xD9,
    221         0xE6, 0x97, 0x87, 0xBC, 0x8D, 0x2C, 0x9B, 0xF0, 0x1F, 0x14, 0xEB, 0x6A,
    222         0x57, 0xCE, 0x78, 0xAD, 0xCE, 0xD9, 0xFB, 0xB9, 0xA1, 0xEF, 0x0C, 0x1F,
    223         0xDD, 0xE3, 0x5B, 0x73, 0xA0, 0xEC, 0x37, 0x9C, 0xE1, 0xFD, 0x86, 0x28,
    224         0xC3, 0x4A, 0x42, 0xD0, 0xA3, 0xFE, 0x57, 0x09, 0x29, 0xD8, 0xF6, 0xEC,
    225         0xE3, 0xC0, 0x71, 0x7C, 0x29, 0x27, 0xC2, 0xD1, 0x3E, 0x22, 0xBC, 0xBD,
    226         0x5A, 0x85, 0x41, 0xF6, 0x15, 0xDA, 0x0C, 0x58, 0x5A, 0x61, 0x5B, 0x78,
    227         0xB8, 0xAA, 0xEC, 0x5C, 0x1C, 0x79, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02,
    228         0x82, 0x01, 0x00, 0x1D, 0x10, 0x31, 0xE0, 0x14, 0x26, 0x36, 0xD9, 0xDC,
    229         0xEA, 0x25, 0x70, 0xF2, 0xB3, 0xFF, 0xDD, 0x0D, 0xDF, 0xBA, 0x57, 0xDA,
    230         0x43, 0xCF, 0xE5, 0x9C, 0xE3, 0x2F, 0xA4, 0xF2, 0x53, 0xF6, 0xF2, 0xAF,
    231         0xFD, 0xD0, 0xFC, 0x82, 0x1E, 0x9C, 0x0F, 0x2A, 0x53, 0xBB, 0xF2, 0x4F,
    232         0x90, 0x83, 0x01, 0xD3, 0xA7, 0xDA, 0xB5, 0xB7, 0x80, 0x64, 0x0A, 0x26,
    233         0x59, 0x83, 0xE4, 0xD3, 0x20, 0xC8, 0x2D, 0xC9, 0x77, 0xA3, 0x55, 0x07,
    234         0x6E, 0x6D, 0x95, 0x36, 0xAA, 0x84, 0x4F, 0xED, 0x54, 0x24, 0xA9, 0x77,
    235         0xF8, 0x85, 0xE2, 0x4B, 0xF2, 0xFA, 0x0B, 0x3E, 0xA6, 0xF5, 0x46, 0x0D,
    236         0x9F, 0x1F, 0xFE, 0xF7, 0x37, 0xFF, 0xA3, 0x60, 0xF1, 0x63, 0xF2, 0x75,
    237         0x6A, 0x8E, 0x10, 0xD7, 0x89, 0xD2, 0xB3, 0xFF, 0x76, 0xA5, 0xBA, 0xAF,
    238         0x0A, 0xBE, 0x32, 0x5F, 0xF0, 0x48, 0x48, 0x4B, 0x9C, 0x9A, 0x3D, 0x12,
    239         0xA7, 0xD2, 0x07, 0xC7, 0x59, 0x32, 0x94, 0x95, 0x65, 0x2F, 0x87, 0x34,
    240         0x76, 0xBA, 0x7C, 0x08, 0x4B, 0xAB, 0xA6, 0x24, 0xDF, 0x64, 0xDB, 0x48,
    241         0x63, 0x42, 0x06, 0xE2, 0x2C, 0x3D, 0xFB, 0xE5, 0x47, 0x81, 0x94, 0x98,
    242         0xF7, 0x32, 0x4B, 0x28, 0xEB, 0x42, 0xB8, 0xE9, 0x8E, 0xFC, 0xC9, 0x43,
    243         0xC9, 0x47, 0xE6, 0xE7, 0x1C, 0xDC, 0x71, 0xEF, 0x4D, 0x8A, 0xB1, 0xFC,
    244         0x45, 0x37, 0xEC, 0xB3, 0x16, 0x88, 0x5B, 0xE2, 0xEC, 0x8B, 0x6B, 0x75,
    245         0x16, 0xBE, 0x6B, 0xF8, 0x2C, 0xF8, 0xC9, 0xD1, 0xF7, 0x55, 0x87, 0x57,
    246         0x5F, 0xDE, 0xF4, 0x7E, 0x72, 0x13, 0x06, 0x2A, 0x21, 0xB7, 0x78, 0x21,
    247         0x05, 0xFD, 0xE2, 0x5F, 0x7B, 0x7C, 0xF0, 0x26, 0x2B, 0x75, 0x7F, 0x68,
    248         0xF9, 0xA6, 0x98, 0xFD, 0x54, 0x0E, 0xCC, 0x22, 0x41, 0x7F, 0x29, 0x81,
    249         0x2F, 0xA3, 0x3C, 0x3D, 0x64, 0xC8, 0x41, 0x02, 0x81, 0x81, 0x00, 0xFA,
    250         0xFA, 0xE4, 0x2E, 0x30, 0xF0, 0x7A, 0x8D, 0x95, 0xB8, 0x39, 0x58, 0x27,
    251         0x0F, 0x89, 0x0C, 0xDF, 0xFE, 0x2F, 0x55, 0x3B, 0x6F, 0xDD, 0x5F, 0x12,
    252         0xB3, 0xD1, 0xCF, 0x5B, 0x8D, 0xB6, 0x10, 0x1C, 0x87, 0x0C, 0x30, 0x89,
    253         0x2D, 0xBB, 0xB8, 0xA1, 0x78, 0x0F, 0x54, 0xA6, 0x36, 0x46, 0x05, 0x8B,
    254         0x5A, 0xFF, 0x48, 0x03, 0x13, 0xAE, 0x95, 0x96, 0x5D, 0x6C, 0xDA, 0x5D,
    255         0xF7, 0xAD, 0x1D, 0x33, 0xED, 0x23, 0xF5, 0x4B, 0x03, 0x78, 0xE7, 0x50,
    256         0xD1, 0x2D, 0x95, 0x22, 0x35, 0x02, 0x5B, 0x4A, 0x4E, 0x73, 0xC9, 0xB7,
    257         0x05, 0xC4, 0x21, 0x86, 0x1F, 0x1E, 0x40, 0x83, 0xBC, 0x8A, 0x3A, 0x95,
    258         0x24, 0x62, 0xF4, 0x58, 0x38, 0x64, 0x4A, 0x89, 0x8A, 0x27, 0x59, 0x12,
    259         0x9D, 0x21, 0xC3, 0xA6, 0x42, 0x1E, 0x2A, 0x3F, 0xD8, 0x65, 0x1F, 0x6E,
    260         0x3E, 0x4D, 0x5C, 0xCC, 0xEA, 0x8E, 0x15, 0x02, 0x81, 0x81, 0x00, 0xDC,
    261         0xAC, 0x9B, 0x00, 0xDB, 0xF9, 0xB2, 0xBF, 0xC4, 0x5E, 0xB6, 0xB7, 0x63,
    262         0xEB, 0x13, 0x4B, 0xE2, 0xA6, 0xC8, 0x72, 0x90, 0xD8, 0xC2, 0x33, 0x33,
    263         0xF0, 0x66, 0x75, 0xBD, 0x50, 0x7C, 0xA4, 0x8F, 0x82, 0xFB, 0xFF, 0x44,
    264         0x3B, 0xE7, 0x15, 0x3A, 0x0C, 0x7A, 0xF8, 0x92, 0x86, 0x4A, 0x79, 0x32,
    265         0x08, 0x82, 0x1D, 0x6A, 0xBA, 0xAD, 0x8A, 0xB3, 0x3D, 0x7F, 0xA5, 0xB4,
    266         0x6F, 0x67, 0x86, 0x7E, 0xB2, 0x9C, 0x2A, 0xF6, 0x7C, 0x49, 0x21, 0xC5,
    267         0x3F, 0x00, 0x3F, 0x9B, 0xF7, 0x0F, 0x6C, 0x35, 0x80, 0x75, 0x73, 0xC0,
    268         0xF8, 0x3E, 0x30, 0x5F, 0x74, 0x2F, 0x15, 0x41, 0xEA, 0x0F, 0xCE, 0x0E,
    269         0x18, 0x17, 0x68, 0xBA, 0xC4, 0x29, 0xF2, 0xE2, 0x2C, 0x1D, 0x55, 0x83,
    270         0xB6, 0x64, 0x2E, 0x03, 0x12, 0xA4, 0x0D, 0xBF, 0x4F, 0x2E, 0xBE, 0x7C,
    271         0x41, 0xD9, 0xCD, 0xD0, 0x52, 0x91, 0xD5, 0x02, 0x81, 0x81, 0x00, 0xD4,
    272         0x55, 0xEB, 0x32, 0xC1, 0x28, 0xD3, 0x26, 0x72, 0x22, 0xB8, 0x31, 0x42,
    273         0x6A, 0xBC, 0x52, 0x6E, 0x37, 0x48, 0xA8, 0x5D, 0x6E, 0xD8, 0xE5, 0x14,
    274         0x97, 0x99, 0xCC, 0x4A, 0xF2, 0xEB, 0xB3, 0x59, 0xCF, 0x4F, 0x9A, 0xC8,
    275         0x94, 0x2E, 0x9B, 0x97, 0xD0, 0x51, 0x78, 0x16, 0x5F, 0x18, 0x82, 0x9C,
    276         0x51, 0xD2, 0x64, 0x84, 0x65, 0xE4, 0x70, 0x9E, 0x14, 0x50, 0x81, 0xB6,
    277         0xBA, 0x52, 0x75, 0xC0, 0x76, 0xC2, 0xD3, 0x46, 0x31, 0x9B, 0xDA, 0x67,
    278         0xDF, 0x71, 0x27, 0x19, 0x17, 0xAB, 0xF4, 0xBC, 0x3A, 0xFF, 0x6F, 0x0B,
    279         0x2F, 0x0F, 0xAE, 0x25, 0x20, 0xB2, 0xA1, 0x76, 0x52, 0xCE, 0xC7, 0x9D,
    280         0x62, 0x79, 0x6D, 0xAC, 0x2D, 0x99, 0x7C, 0x0E, 0x3D, 0x19, 0xE9, 0x1B,
    281         0xFC, 0x60, 0x92, 0x7C, 0x58, 0xB7, 0xD8, 0x9A, 0xC7, 0x63, 0x56, 0x62,
    282         0x18, 0xC7, 0xAE, 0xD9, 0x97, 0x1F, 0xB9, 0x02, 0x81, 0x81, 0x00, 0x91,
    283         0x40, 0xC4, 0x1E, 0x82, 0xAD, 0x0F, 0x6D, 0x8E, 0xD2, 0x51, 0x2E, 0xD1,
    284         0x84, 0x30, 0x85, 0x68, 0xC1, 0x23, 0x7B, 0xD5, 0xBF, 0xF7, 0xC4, 0x40,
    285         0x51, 0xE2, 0xFF, 0x69, 0x07, 0x8B, 0xA3, 0xBE, 0x1B, 0x17, 0xC8, 0x64,
    286         0x9F, 0x91, 0x71, 0xB5, 0x6D, 0xF5, 0x9B, 0x9C, 0xC6, 0xEC, 0x4A, 0x6E,
    287         0x16, 0x8F, 0x9E, 0xD1, 0x5B, 0xE3, 0x53, 0x42, 0xBC, 0x1E, 0x43, 0x72,
    288         0x4B, 0x4A, 0x37, 0x8B, 0x3A, 0x01, 0xF5, 0x7D, 0x9D, 0x3D, 0x7E, 0x0F,
    289         0x19, 0x73, 0x0E, 0x6B, 0x98, 0xE9, 0xFB, 0xEE, 0x13, 0x8A, 0x3C, 0x11,
    290         0x2E, 0xD5, 0xB0, 0x7D, 0x84, 0x3A, 0x61, 0xA1, 0xAB, 0x71, 0x8F, 0xCE,
    291         0x53, 0x29, 0x45, 0x74, 0x7A, 0x1E, 0xAA, 0x93, 0x19, 0x3A, 0x8D, 0xC9,
    292         0x4E, 0xCB, 0x0E, 0x46, 0x53, 0x84, 0xCC, 0xCF, 0xBA, 0x4D, 0x28, 0x71,
    293         0x1D, 0xDF, 0x41, 0xCB, 0xF8, 0x2D, 0xA9, 0x02, 0x81, 0x80, 0x04, 0x8B,
    294         0x4A, 0xEA, 0xBD, 0x39, 0x0B, 0x96, 0xC5, 0x1D, 0xA4, 0x47, 0xFD, 0x46,
    295         0xD2, 0x8A, 0xEA, 0x2A, 0xF3, 0x9D, 0x3A, 0x7E, 0x16, 0x74, 0xFC, 0x13,
    296         0xDE, 0x4D, 0xA9, 0x85, 0x42, 0x33, 0x02, 0x92, 0x0B, 0xB6, 0xDB, 0x7E,
    297         0xEA, 0x85, 0xC2, 0x94, 0x43, 0x52, 0x37, 0x5A, 0x77, 0xAB, 0xCB, 0x61,
    298         0x88, 0xDE, 0xF8, 0xFA, 0xDB, 0xE8, 0x0B, 0x95, 0x7D, 0x39, 0x19, 0xA2,
    299         0x89, 0xB9, 0x32, 0xB2, 0x50, 0x38, 0xF7, 0x88, 0x69, 0xFD, 0xA4, 0x63,
    300         0x1F, 0x9B, 0x03, 0xD8, 0xA6, 0x7A, 0x05, 0x76, 0x02, 0x28, 0x93, 0x82,
    301         0x73, 0x7F, 0x14, 0xCC, 0xBE, 0x29, 0x10, 0xAD, 0x8A, 0x2E, 0xAC, 0xED,
    302         0x11, 0xA7, 0x72, 0x7C, 0x60, 0x78, 0x72, 0xFB, 0x78, 0x20, 0x18, 0xC9,
    303         0x7E, 0x63, 0xAD, 0x55, 0x54, 0x51, 0xDB, 0x9F, 0x7B, 0xD4, 0x8F, 0xB2,
    304         0xDE, 0x3B, 0xF1, 0x70, 0x23, 0xE5,
    305 };
    306 
    307 /*
    308  * DER-encoded PKCS#8 format EC key. Generated using:
    309  *
    310  * openssl ecparam -name prime256v1 -genkey -noout | openssl pkcs8 -topk8 -nocrypt -outform der | recode ../x1
    311  */
    312 static uint8_t TEST_EC_KEY_1[] = {
    313         0x30, 0x81, 0x87, 0x02, 0x01, 0x00, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86,
    314         0x48, 0xCE, 0x3D, 0x02, 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D,
    315         0x03, 0x01, 0x07, 0x04, 0x6D, 0x30, 0x6B, 0x02, 0x01, 0x01, 0x04, 0x20,
    316         0x25, 0xAC, 0x77, 0x2B, 0x04, 0x33, 0xC8, 0x16, 0x59, 0xA3, 0xC7, 0xE7,
    317         0x11, 0x42, 0xD0, 0x11, 0x71, 0x30, 0x7B, 0xB8, 0xD2, 0x67, 0xFF, 0x9C,
    318         0x5F, 0x50, 0x2E, 0xAB, 0x67, 0xD4, 0x17, 0x51, 0xA1, 0x44, 0x03, 0x42,
    319         0x00, 0x04, 0xCF, 0xCE, 0xB8, 0x7F, 0x88, 0x36, 0xC4, 0xF8, 0x51, 0x29,
    320         0xE2, 0xA7, 0x21, 0xC3, 0x3B, 0xFF, 0x88, 0xE3, 0x87, 0x98, 0xD1, 0xA6,
    321         0x4B, 0xB3, 0x4B, 0xD5, 0x44, 0xF8, 0xE0, 0x43, 0x6B, 0x50, 0x74, 0xFB,
    322         0xB0, 0xAD, 0x41, 0x1C, 0x11, 0x9D, 0xC6, 0x1E, 0x83, 0x8C, 0x49, 0xCA,
    323         0xBE, 0xC6, 0xCE, 0xB6, 0xC9, 0xA1, 0xBF, 0x69, 0xA9, 0xA0, 0xA3, 0x80,
    324         0x14, 0x39, 0x57, 0x94, 0xDA, 0x5D
    325 };
    326 
    327 
    328 /*
    329  * Generated using keys on the keyboard and lack of imagination.
    330  */
    331 static unsigned char BOGUS_KEY_1[] = { 0xFF, 0xFF, 0xFF, 0xFF };
    332 
    333 
    334 class KeymasterBaseTest : public ::testing::Test {
    335 public:
    336     static void SetUpTestCase() {
    337         const hw_module_t* mod;
    338         ASSERT_EQ(0, hw_get_module_by_class(KEYSTORE_HARDWARE_MODULE_ID, NULL, &mod))
    339                 << "Should be able to find a keymaster hardware module";
    340 
    341         std::cout << "Using keymaster module: " << mod->name << std::endl;
    342 
    343         ASSERT_EQ(0, keymaster_open(mod, &sDevice))
    344                 << "Should be able to open the keymaster device";
    345 
    346         ASSERT_EQ(KEYMASTER_MODULE_API_VERSION_0_2, mod->module_api_version)
    347                 << "Keymaster should implement API version 2";
    348 
    349         ASSERT_TRUE(sDevice->generate_keypair != NULL)
    350                 << "Should implement generate_keypair";
    351 
    352         ASSERT_TRUE(sDevice->import_keypair != NULL)
    353                 << "Should implement import_keypair";
    354 
    355         ASSERT_TRUE(sDevice->get_keypair_public != NULL)
    356                 << "Should implement get_keypair_public";
    357 
    358         ASSERT_TRUE(sDevice->sign_data != NULL)
    359                 << "Should implement sign_data";
    360 
    361         ASSERT_TRUE(sDevice->verify_data != NULL)
    362                 << "Should implement verify_data";
    363     }
    364 
    365     static void TearDownTestCase() {
    366         ASSERT_EQ(0, keymaster_close(sDevice));
    367     }
    368 
    369 protected:
    370     static keymaster_device_t* sDevice;
    371 };
    372 
    373 keymaster_device_t* KeymasterBaseTest::sDevice = NULL;
    374 
    375 class KeymasterTest : public KeymasterBaseTest {
    376 };
    377 
    378 class KeymasterAllTypesTest : public KeymasterBaseTest,
    379                               public ::testing::WithParamInterface<keymaster_keypair_t> {
    380 };
    381 
    382 class KeymasterGenerateRSATest : public KeymasterBaseTest,
    383                               public ::testing::WithParamInterface<uint32_t> {
    384 };
    385 
    386 class KeymasterGenerateDSATest : public KeymasterBaseTest,
    387                               public ::testing::WithParamInterface<uint32_t> {
    388 };
    389 
    390 class KeymasterGenerateECTest : public KeymasterBaseTest,
    391                               public ::testing::WithParamInterface<uint32_t> {
    392 };
    393 
    394 TEST_P(KeymasterGenerateRSATest, GenerateKeyPair_RSA_Success) {
    395     keymaster_keypair_t key_type = TYPE_RSA;
    396     keymaster_rsa_keygen_params_t params = {
    397             modulus_size: GetParam(),
    398             public_exponent: RSA_F4,
    399     };
    400 
    401     uint8_t* key_blob;
    402     size_t key_blob_length;
    403 
    404     ASSERT_EQ(0,
    405             sDevice->generate_keypair(sDevice, key_type, &params, &key_blob, &key_blob_length))
    406             << "Should generate an RSA key with " << GetParam() << " bit modulus size";
    407     UniqueKey key(&sDevice, key_blob, key_blob_length);
    408 
    409     uint8_t* x509_data = NULL;
    410     size_t x509_data_length;
    411     ASSERT_EQ(0,
    412             sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
    413                     &x509_data, &x509_data_length))
    414             << "Should be able to retrieve RSA public key successfully";
    415     UniqueBlob x509_blob(x509_data, x509_data_length);
    416     ASSERT_FALSE(x509_blob.get() == NULL)
    417             << "X509 data should be allocated";
    418 
    419     const unsigned char *tmp = static_cast<const unsigned char*>(x509_blob.get());
    420     Unique_EVP_PKEY actual(d2i_PUBKEY((EVP_PKEY**) NULL, &tmp,
    421             static_cast<long>(x509_blob.length())));
    422 
    423     ASSERT_EQ(EVP_PKEY_RSA, EVP_PKEY_type(actual.get()->type))
    424             << "Generated key type should be of type RSA";
    425 
    426     Unique_RSA rsa(EVP_PKEY_get1_RSA(actual.get()));
    427     ASSERT_FALSE(rsa.get() == NULL)
    428             << "Should be able to extract RSA key from EVP_PKEY";
    429 
    430     ASSERT_EQ(static_cast<unsigned long>(RSA_F4), BN_get_word(rsa.get()->e))
    431             << "Exponent should be RSA_F4";
    432 
    433     ASSERT_EQ((GetParam() + 7) / 8, static_cast<uint32_t>(RSA_size(rsa.get())))
    434             << "Modulus size should be the specified parameter";
    435 }
    436 
    437 INSTANTIATE_TEST_CASE_P(RSA,
    438                         KeymasterGenerateRSATest,
    439                         ::testing::Values(512U, 1024U, 2048U, 3072U, 4096U));
    440 
    441 
    442 TEST_P(KeymasterGenerateECTest, GenerateKeyPair_EC_Success) {
    443     keymaster_keypair_t key_type = TYPE_EC;
    444     keymaster_ec_keygen_params_t params = {
    445             field_size: GetParam(),
    446     };
    447 
    448     uint8_t* key_blob;
    449     size_t key_blob_length;
    450 
    451     ASSERT_EQ(0,
    452             sDevice->generate_keypair(sDevice, key_type, &params, &key_blob, &key_blob_length))
    453             << "Should generate an EC key with " << GetParam() << " field size";
    454     UniqueKey key(&sDevice, key_blob, key_blob_length);
    455 
    456     uint8_t* x509_data = NULL;
    457     size_t x509_data_length;
    458     ASSERT_EQ(0,
    459             sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
    460                     &x509_data, &x509_data_length))
    461             << "Should be able to retrieve EC public key successfully";
    462     UniqueBlob x509_blob(x509_data, x509_data_length);
    463     ASSERT_FALSE(x509_blob.get() == NULL)
    464             << "X509 data should be allocated";
    465 
    466     const unsigned char *tmp = static_cast<const unsigned char*>(x509_blob.get());
    467     Unique_EVP_PKEY actual(d2i_PUBKEY((EVP_PKEY**) NULL, &tmp,
    468             static_cast<long>(x509_blob.length())));
    469 
    470     ASSERT_EQ(EVP_PKEY_EC, EVP_PKEY_type(actual.get()->type))
    471             << "Generated key type should be of type EC";
    472 
    473     Unique_EC_KEY ecKey(EVP_PKEY_get1_EC_KEY(actual.get()));
    474     ASSERT_FALSE(ecKey.get() == NULL)
    475             << "Should be able to extract EC key from EVP_PKEY";
    476 
    477     ASSERT_FALSE(EC_KEY_get0_group(ecKey.get()) == NULL)
    478             << "EC key should have a EC_GROUP";
    479 
    480     ASSERT_TRUE(EC_KEY_check_key(ecKey.get()))
    481             << "EC key should check correctly";
    482 }
    483 
    484 INSTANTIATE_TEST_CASE_P(EC,
    485                         KeymasterGenerateECTest,
    486                         ::testing::Values(192U, 224U, 256U, 384U, 521U));
    487 
    488 
    489 TEST_P(KeymasterAllTypesTest, GenerateKeyPair_NullParams_Failure) {
    490     keymaster_keypair_t key_type = GetParam();
    491 
    492     uint8_t* key_blob;
    493     size_t key_blob_length;
    494 
    495     ASSERT_EQ(-1,
    496             sDevice->generate_keypair(sDevice, key_type, NULL, &key_blob, &key_blob_length))
    497             << "Should not be able to generate a key with null params";
    498 }
    499 
    500 INSTANTIATE_TEST_CASE_P(Types,
    501                         KeymasterAllTypesTest,
    502                         ::testing::Values(TYPE_RSA, TYPE_DSA, TYPE_EC));
    503 
    504 TEST_F(KeymasterTest, GenerateKeyPair_UnknownType_Failure) {
    505     keymaster_keypair_t key_type = static_cast<keymaster_keypair_t>(0xFFFF);
    506 
    507     uint8_t* key_blob;
    508     size_t key_blob_length;
    509 
    510     ASSERT_EQ(-1,
    511             sDevice->generate_keypair(sDevice, key_type, NULL, &key_blob, &key_blob_length))
    512             << "Should not generate an unknown key type";
    513 }
    514 
    515 TEST_F(KeymasterTest, ImportKeyPair_RSA_Success) {
    516     uint8_t* key_blob;
    517     size_t key_blob_length;
    518 
    519     ASSERT_EQ(0,
    520             sDevice->import_keypair(sDevice, TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1),
    521                     &key_blob, &key_blob_length))
    522             << "Should successfully import an RSA key";
    523     UniqueKey key(&sDevice, key_blob, key_blob_length);
    524 
    525     uint8_t* x509_data;
    526     size_t x509_data_length;
    527     ASSERT_EQ(0,
    528             sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
    529                     &x509_data, &x509_data_length))
    530             << "Should be able to retrieve RSA public key successfully";
    531     UniqueBlob x509_blob(x509_data, x509_data_length);
    532 
    533     const unsigned char *tmp = static_cast<const unsigned char*>(x509_blob.get());
    534     Unique_EVP_PKEY actual(d2i_PUBKEY((EVP_PKEY**) NULL, &tmp,
    535             static_cast<long>(x509_blob.length())));
    536 
    537     ASSERT_EQ(EVP_PKEY_type(actual.get()->type), EVP_PKEY_RSA)
    538             << "Generated key type should be of type RSA";
    539 
    540     const unsigned char *expectedTmp = static_cast<const unsigned char*>(TEST_RSA_KEY_1);
    541     Unique_PKCS8_PRIV_KEY_INFO expectedPkcs8(
    542             d2i_PKCS8_PRIV_KEY_INFO((PKCS8_PRIV_KEY_INFO**) NULL, &expectedTmp,
    543                     sizeof(TEST_RSA_KEY_1)));
    544 
    545     Unique_EVP_PKEY expected(EVP_PKCS82PKEY(expectedPkcs8.get()));
    546 
    547     ASSERT_EQ(1, EVP_PKEY_cmp(expected.get(), actual.get()))
    548             << "Expected and actual keys should match";
    549 }
    550 
    551 TEST_F(KeymasterTest, ImportKeyPair_EC_Success) {
    552     uint8_t* key_blob;
    553     size_t key_blob_length;
    554 
    555     ASSERT_EQ(0,
    556             sDevice->import_keypair(sDevice, TEST_EC_KEY_1, sizeof(TEST_EC_KEY_1),
    557                     &key_blob, &key_blob_length))
    558             << "Should successfully import an EC key";
    559     UniqueKey key(&sDevice, key_blob, key_blob_length);
    560 
    561     uint8_t* x509_data;
    562     size_t x509_data_length;
    563     ASSERT_EQ(0,
    564             sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
    565                     &x509_data, &x509_data_length))
    566             << "Should be able to retrieve EC public key successfully";
    567     UniqueBlob x509_blob(x509_data, x509_data_length);
    568 
    569     const unsigned char *tmp = static_cast<const unsigned char*>(x509_blob.get());
    570     Unique_EVP_PKEY actual(d2i_PUBKEY((EVP_PKEY**) NULL, &tmp,
    571             static_cast<long>(x509_blob.length())));
    572 
    573     ASSERT_EQ(EVP_PKEY_type(actual.get()->type), EVP_PKEY_EC)
    574             << "Generated key type should be of type EC";
    575 
    576     const unsigned char *expectedTmp = static_cast<const unsigned char*>(TEST_EC_KEY_1);
    577     Unique_PKCS8_PRIV_KEY_INFO expectedPkcs8(
    578             d2i_PKCS8_PRIV_KEY_INFO((PKCS8_PRIV_KEY_INFO**) NULL, &expectedTmp,
    579                     sizeof(TEST_EC_KEY_1)));
    580 
    581     Unique_EVP_PKEY expected(EVP_PKCS82PKEY(expectedPkcs8.get()));
    582 
    583     ASSERT_EQ(1, EVP_PKEY_cmp(expected.get(), actual.get()))
    584             << "Expected and actual keys should match";
    585 }
    586 
    587 TEST_F(KeymasterTest, ImportKeyPair_BogusKey_Failure) {
    588     uint8_t* key_blob;
    589     size_t key_blob_length;
    590 
    591     ASSERT_EQ(-1,
    592             sDevice->import_keypair(sDevice, BOGUS_KEY_1, sizeof(BOGUS_KEY_1),
    593                     &key_blob, &key_blob_length))
    594             << "Should not import an unknown key type";
    595 }
    596 
    597 TEST_F(KeymasterTest, ImportKeyPair_NullKey_Failure) {
    598     uint8_t* key_blob;
    599     size_t key_blob_length;
    600 
    601     ASSERT_EQ(-1,
    602             sDevice->import_keypair(sDevice, NULL, 0,
    603                     &key_blob, &key_blob_length))
    604             << "Should not import a null key";
    605 }
    606 
    607 TEST_F(KeymasterTest, GetKeypairPublic_RSA_Success) {
    608     uint8_t* key_blob;
    609     size_t key_blob_length;
    610 
    611     UniqueReadOnlyBlob testKey(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
    612     ASSERT_TRUE(testKey.get() != NULL);
    613 
    614     ASSERT_EQ(0,
    615             sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
    616                     &key_blob, &key_blob_length))
    617             << "Should successfully import an RSA key";
    618     UniqueKey key(&sDevice, key_blob, key_blob_length);
    619 
    620     uint8_t* x509_data;
    621     size_t x509_data_length;
    622     ASSERT_EQ(0,
    623             sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
    624                     &x509_data, &x509_data_length))
    625             << "Should be able to retrieve RSA public key successfully";
    626     UniqueBlob x509_blob(x509_data, x509_data_length);
    627 }
    628 
    629 TEST_F(KeymasterTest, GetKeypairPublic_EC_Success) {
    630     uint8_t* key_blob;
    631     size_t key_blob_length;
    632 
    633     UniqueReadOnlyBlob testKey(TEST_EC_KEY_1, sizeof(TEST_EC_KEY_1));
    634     ASSERT_TRUE(testKey.get() != NULL);
    635 
    636     ASSERT_EQ(0,
    637             sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
    638                     &key_blob, &key_blob_length))
    639             << "Should successfully import an EC key";
    640     UniqueKey key(&sDevice, key_blob, key_blob_length);
    641 
    642     uint8_t* x509_data;
    643     size_t x509_data_length;
    644     ASSERT_EQ(0,
    645             sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
    646                     &x509_data, &x509_data_length))
    647             << "Should be able to retrieve EC public key successfully";
    648     UniqueBlob x509_blob(x509_data, x509_data_length);
    649 }
    650 
    651 TEST_F(KeymasterTest, GetKeypairPublic_NullKey_Failure) {
    652     uint8_t* key_blob;
    653     size_t key_blob_length;
    654 
    655     uint8_t* x509_data = NULL;
    656     size_t x509_data_length;
    657     ASSERT_EQ(-1,
    658             sDevice->get_keypair_public(sDevice, NULL, 0,
    659                     &x509_data, &x509_data_length))
    660             << "Should not be able to retrieve public key from null key";
    661     UniqueBlob x509_blob(x509_data, x509_data_length);
    662 }
    663 
    664 TEST_F(KeymasterTest, GetKeypairPublic_RSA_NullDestination_Failure) {
    665     uint8_t* key_blob;
    666     size_t key_blob_length;
    667 
    668     UniqueReadOnlyBlob testKey(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
    669     ASSERT_TRUE(testKey.get() != NULL);
    670 
    671     ASSERT_EQ(0,
    672             sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
    673                     &key_blob, &key_blob_length))
    674             << "Should successfully import an RSA key";
    675     UniqueKey key(&sDevice, key_blob, key_blob_length);
    676 
    677     ASSERT_EQ(-1,
    678             sDevice->get_keypair_public(sDevice, key.get(), key.length(),
    679                     NULL, NULL))
    680             << "Should not be able to succeed with NULL destination blob";
    681 }
    682 
    683 TEST_F(KeymasterTest, GetKeypairPublic_EC_NullDestination_Failure) {
    684     uint8_t* key_blob;
    685     size_t key_blob_length;
    686 
    687     UniqueReadOnlyBlob testKey(TEST_EC_KEY_1, sizeof(TEST_EC_KEY_1));
    688     ASSERT_TRUE(testKey.get() != NULL);
    689 
    690     ASSERT_EQ(0,
    691             sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
    692                     &key_blob, &key_blob_length))
    693             << "Should successfully import an RSA key";
    694     UniqueKey key(&sDevice, key_blob, key_blob_length);
    695 
    696     ASSERT_EQ(-1,
    697             sDevice->get_keypair_public(sDevice, key.get(), key.length(),
    698                     NULL, NULL))
    699             << "Should not be able to succeed with NULL destination blob";
    700 }
    701 
    702 TEST_F(KeymasterTest, DeleteKeyPair_RSA_Success) {
    703     uint8_t* key_blob;
    704     size_t key_blob_length;
    705 
    706     UniqueReadOnlyBlob testKey(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
    707     ASSERT_TRUE(testKey.get() != NULL);
    708 
    709     ASSERT_EQ(0,
    710             sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
    711                     &key_blob, &key_blob_length))
    712             << "Should successfully import an RSA key";
    713     UniqueKey key(&sDevice, key_blob, key_blob_length);
    714 }
    715 
    716 TEST_F(KeymasterTest, DeleteKeyPair_RSA_DoubleDelete_Failure) {
    717     uint8_t* key_blob;
    718     size_t key_blob_length;
    719 
    720     UniqueReadOnlyBlob testKey(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
    721     ASSERT_TRUE(testKey.get() != NULL);
    722 
    723     /*
    724      * This is only run if the module indicates it implements key deletion
    725      * by implementing delete_keypair.
    726      */
    727     if (sDevice->delete_keypair != NULL) {
    728         ASSERT_EQ(0,
    729                 sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
    730                         &key_blob, &key_blob_length))
    731                 << "Should successfully import an RSA key";
    732         UniqueBlob blob(key_blob, key_blob_length);
    733 
    734         ASSERT_EQ(0, sDevice->delete_keypair(sDevice, key_blob, key_blob_length))
    735                 << "Should delete key after import";
    736 
    737         ASSERT_EQ(-1, sDevice->delete_keypair(sDevice, key_blob, key_blob_length))
    738                 << "Should not be able to delete key twice";
    739     }
    740 }
    741 
    742 TEST_F(KeymasterTest, DeleteKeyPair_RSA_NullKey_Failure) {
    743     /*
    744      * This is only run if the module indicates it implements key deletion
    745      * by implementing delete_keypair.
    746      */
    747     if (sDevice->delete_keypair != NULL) {
    748         ASSERT_EQ(-1, sDevice->delete_keypair(sDevice, NULL, 0))
    749                 << "Should not be able to delete null key";
    750     }
    751 }
    752 
    753 /*
    754  * DER-encoded PKCS#8 format RSA key. Generated using:
    755  *
    756  * openssl genrsa 512 | openssl pkcs8 -topk8 -nocrypt -outform der | recode ../x1
    757  */
    758 static uint8_t TEST_SIGN_RSA_KEY_1[] = {
    759         0x30, 0x82, 0x01, 0x56, 0x02, 0x01, 0x00, 0x30, 0x0D, 0x06, 0x09, 0x2A,
    760         0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82,
    761         0x01, 0x40, 0x30, 0x82, 0x01, 0x3C, 0x02, 0x01, 0x00, 0x02, 0x41, 0x00,
    762         0xBD, 0xC0, 0x7F, 0xEF, 0x75, 0x1D, 0x63, 0x2A, 0xD0, 0x9A, 0x26, 0xE5,
    763         0x5B, 0xB9, 0x84, 0x7C, 0xE5, 0xC7, 0xE7, 0xDE, 0xFE, 0xB6, 0x54, 0xD9,
    764         0xF0, 0x9B, 0xC2, 0xCF, 0x36, 0xDA, 0xE5, 0x4D, 0xC5, 0xD9, 0x25, 0x78,
    765         0xBD, 0x55, 0x05, 0xBD, 0x86, 0xFB, 0x37, 0x15, 0x33, 0x42, 0x52, 0xED,
    766         0xE5, 0xCD, 0xCB, 0xB7, 0xA2, 0x51, 0xFA, 0x36, 0xE9, 0x9C, 0x2E, 0x5D,
    767         0xE3, 0xA5, 0x1F, 0x01, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x41, 0x00,
    768         0x96, 0x71, 0xDE, 0xBD, 0x83, 0x94, 0x96, 0x40, 0xA6, 0xFD, 0xE1, 0xA2,
    769         0xED, 0xD3, 0xAC, 0x28, 0xBE, 0xA2, 0x7D, 0xC3, 0xFF, 0x1D, 0x9F, 0x2E,
    770         0xE0, 0xA7, 0x0E, 0x90, 0xEE, 0x44, 0x25, 0x92, 0xE3, 0x54, 0xDD, 0x55,
    771         0xA3, 0xEF, 0x42, 0xF5, 0x52, 0x55, 0x41, 0x47, 0x5E, 0x00, 0xFB, 0x8B,
    772         0x47, 0x5E, 0x45, 0x49, 0xEA, 0x3D, 0x2C, 0xFD, 0x9F, 0xEC, 0xC8, 0x4E,
    773         0x4E, 0x86, 0x90, 0x31, 0x02, 0x21, 0x00, 0xE6, 0xA5, 0x55, 0xB3, 0x64,
    774         0xAB, 0x90, 0x5E, 0xA2, 0xF5, 0x6B, 0x21, 0x4B, 0x15, 0xD6, 0x4A, 0xB6,
    775         0x60, 0x24, 0x95, 0x65, 0xA2, 0xBE, 0xBA, 0x2A, 0x73, 0xFB, 0xFF, 0x2C,
    776         0x61, 0x88, 0x9D, 0x02, 0x21, 0x00, 0xD2, 0x9C, 0x5B, 0xFE, 0x82, 0xA5,
    777         0xFC, 0x52, 0x6A, 0x29, 0x38, 0xDB, 0x22, 0x3B, 0xEB, 0x74, 0x3B, 0xCA,
    778         0xB4, 0xDD, 0x1D, 0xE4, 0x48, 0x60, 0x70, 0x19, 0x9B, 0x81, 0xC1, 0x83,
    779         0x28, 0xB5, 0x02, 0x21, 0x00, 0x89, 0x2D, 0xFE, 0xF9, 0xF2, 0xBF, 0x43,
    780         0xDF, 0xB5, 0xA6, 0xA8, 0x30, 0x26, 0x1B, 0x77, 0xD7, 0xF9, 0xFE, 0xD6,
    781         0xE3, 0x70, 0x8E, 0xCA, 0x47, 0xA9, 0xA6, 0x50, 0x54, 0x25, 0xCE, 0x60,
    782         0xD5, 0x02, 0x21, 0x00, 0xBE, 0x5A, 0xF8, 0x82, 0xE6, 0xCE, 0xE3, 0x6A,
    783         0x11, 0xED, 0xC4, 0x27, 0xBB, 0x9F, 0x70, 0xC6, 0x93, 0xAC, 0x39, 0x20,
    784         0x89, 0x7D, 0xE5, 0x34, 0xD4, 0xDD, 0x30, 0x42, 0x6D, 0x07, 0x00, 0xE9,
    785         0x02, 0x20, 0x05, 0x91, 0xEF, 0x12, 0xD2, 0xD3, 0x6A, 0xD2, 0x96, 0x6B,
    786         0x10, 0x62, 0xF9, 0xBA, 0xA4, 0x91, 0x48, 0x84, 0x40, 0x61, 0x67, 0x80,
    787         0x68, 0x68, 0xC8, 0x60, 0xB3, 0x66, 0xC8, 0xF9, 0x08, 0x9A,
    788 };
    789 
    790 /*
    791  * DER-encoded PKCS#8 format EC key. Generated using:
    792  *
    793  * openssl ecparam -name prime256v1 -genkey -noout | openssl pkcs8 -topk8 -nocrypt -outform der | recode ../x1
    794  */
    795 static uint8_t TEST_SIGN_EC_KEY_1[] = {
    796         0x30, 0x81, 0x87, 0x02, 0x01, 0x00, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86,
    797         0x48, 0xCE, 0x3D, 0x02, 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D,
    798         0x03, 0x01, 0x07, 0x04, 0x6D, 0x30, 0x6B, 0x02, 0x01, 0x01, 0x04, 0x20,
    799         0x9E, 0x66, 0x11, 0x6A, 0x89, 0xF5, 0x78, 0x57, 0xF3, 0x35, 0xA2, 0x46,
    800         0x09, 0x06, 0x4B, 0x4D, 0x81, 0xEC, 0xD3, 0x9B, 0x0A, 0xC4, 0x68, 0x06,
    801         0xB8, 0x42, 0x24, 0x5E, 0x74, 0x2C, 0x62, 0x79, 0xA1, 0x44, 0x03, 0x42,
    802         0x00, 0x04, 0x35, 0xB5, 0x9A, 0x5C, 0xE5, 0x52, 0x35, 0xF2, 0x10, 0x6C,
    803         0xD9, 0x98, 0x67, 0xED, 0x5E, 0xCB, 0x6B, 0xB8, 0x96, 0x5E, 0x54, 0x7C,
    804         0x34, 0x2A, 0xA3, 0x3B, 0xF3, 0xD1, 0x39, 0x48, 0x36, 0x7A, 0xEA, 0xD8,
    805         0xCA, 0xDD, 0x40, 0x8F, 0xE9, 0xE0, 0x95, 0x2E, 0x3F, 0x95, 0x0F, 0x14,
    806         0xD6, 0x14, 0x78, 0xB5, 0xAD, 0x17, 0xD2, 0x5A, 0x41, 0x96, 0x99, 0x20,
    807         0xC7, 0x5B, 0x0F, 0x60, 0xFD, 0xBA
    808 };
    809 
    810 /*
    811  * PKCS#1 v1.5 padded raw "Hello, world"  Can be generated be generated by verifying
    812  * the signature below in no padding mode:
    813  *
    814  * openssl rsautl -keyform der -inkey rsa.der -raw -verify -in test.sig
    815  */
    816 static uint8_t TEST_SIGN_DATA_1[] = {
    817         0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    818         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    819         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    820         0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
    821         0xFF, 0xFF, 0xFF, 0x00, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x2C, 0x20, 0x77,
    822         0x6F, 0x72, 0x6C, 0x64,
    823 };
    824 
    825 /*
    826  * Signature of TEST_SIGN_DATA_1 using TEST_SIGN_RSA_KEY_1. Generated using:
    827  *
    828  * echo 'Hello, world' | openssl rsautl -keyform der -inkey rsa.der -sign | recode ../x1
    829  */
    830 static uint8_t TEST_SIGN_RSA_SIGNATURE_1[] = {
    831         0xA4, 0xBB, 0x76, 0x87, 0xFE, 0x61, 0x0C, 0x9D, 0xD6, 0xFF, 0x4B, 0x76,
    832         0x96, 0x08, 0x36, 0x23, 0x11, 0xC6, 0x44, 0x3F, 0x88, 0x77, 0x97, 0xB2,
    833         0xA8, 0x3B, 0xFB, 0x9C, 0x3C, 0xD3, 0x20, 0x65, 0xFD, 0x26, 0x3B, 0x2A,
    834         0xB8, 0xB6, 0xD4, 0xDC, 0x91, 0xF7, 0xE2, 0xDE, 0x4D, 0xF7, 0x0E, 0xB9,
    835         0x72, 0xA7, 0x29, 0x72, 0x82, 0x12, 0x7C, 0x53, 0x23, 0x21, 0xC4, 0xFF,
    836         0x79, 0xE4, 0x91, 0x40,
    837 };
    838 
    839 /*
    840  * Identical to TEST_SIGN_RSA_SIGNATURE_1 except the last octet is '1' instead of '0'
    841  * This should fail any test.
    842  */
    843 static uint8_t TEST_SIGN_SIGNATURE_BOGUS_1[] = {
    844         0xA4, 0xBB, 0x76, 0x87, 0xFE, 0x61, 0x0C, 0x9D, 0xD6, 0xFF, 0x4B, 0x76,
    845         0x96, 0x08, 0x36, 0x23, 0x11, 0xC6, 0x44, 0x3F, 0x88, 0x77, 0x97, 0xB2,
    846         0xA8, 0x3B, 0xFB, 0x9C, 0x3C, 0xD3, 0x20, 0x65, 0xFD, 0x26, 0x3B, 0x2A,
    847         0xB8, 0xB6, 0xD4, 0xDC, 0x91, 0xF7, 0xE2, 0xDE, 0x4D, 0xF7, 0x0E, 0xB9,
    848         0x72, 0xA7, 0x29, 0x72, 0x82, 0x12, 0x7C, 0x53, 0x23, 0x21, 0xC4, 0xFF,
    849         0x79, 0xE4, 0x91, 0x41,
    850 };
    851 
    852 TEST_F(KeymasterTest, SignData_RSA_Raw_Success) {
    853     uint8_t* key_blob;
    854     size_t key_blob_length;
    855 
    856     UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
    857     ASSERT_TRUE(testKey.get() != NULL);
    858 
    859     ASSERT_EQ(0,
    860             sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
    861                     &key_blob, &key_blob_length))
    862             << "Should successfully import an RSA key";
    863     UniqueKey key(&sDevice, key_blob, key_blob_length);
    864 
    865     keymaster_rsa_sign_params_t params = {
    866             digest_type: DIGEST_NONE,
    867             padding_type: PADDING_NONE,
    868     };
    869 
    870     uint8_t* sig;
    871     size_t sig_length;
    872 
    873     UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
    874     ASSERT_TRUE(testData.get() != NULL);
    875 
    876     ASSERT_EQ(0,
    877             sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
    878                     testData.get(), testData.length(),
    879                     &sig, &sig_length))
    880             << "Should sign data successfully";
    881     UniqueBlob sig_blob(sig, sig_length);
    882 
    883     UniqueBlob expected_sig(TEST_SIGN_RSA_SIGNATURE_1, sizeof(TEST_SIGN_RSA_SIGNATURE_1));
    884 
    885     ASSERT_EQ(expected_sig, sig_blob)
    886             << "Generated signature should match expected signature";
    887 
    888     // The expected signature is actually stack data, so don't let it try to free.
    889     uint8_t* unused __attribute__((unused)) = expected_sig.release();
    890 }
    891 
    892 TEST_F(KeymasterTest, SignData_EC_Success) {
    893     uint8_t* key_blob;
    894     size_t key_blob_length;
    895 
    896     UniqueReadOnlyBlob testKey(TEST_SIGN_EC_KEY_1, sizeof(TEST_SIGN_EC_KEY_1));
    897     ASSERT_TRUE(testKey.get() != NULL);
    898 
    899     ASSERT_EQ(0,
    900             sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
    901                     &key_blob, &key_blob_length))
    902             << "Should successfully import an EC key";
    903     UniqueKey key(&sDevice, key_blob, key_blob_length);
    904 
    905     keymaster_ec_sign_params_t params = {
    906             digest_type: DIGEST_NONE,
    907     };
    908 
    909     uint8_t* sig;
    910     size_t sig_length;
    911 
    912     UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
    913     ASSERT_TRUE(testData.get() != NULL);
    914 
    915     ASSERT_EQ(0,
    916             sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
    917                     testData.get(), testData.length(),
    918                     &sig, &sig_length))
    919             << "Should sign data successfully";
    920     UniqueBlob sig_blob(sig, sig_length);
    921 
    922     uint8_t* x509_data;
    923     size_t x509_data_length;
    924     ASSERT_EQ(0,
    925             sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
    926                     &x509_data, &x509_data_length))
    927             << "Should be able to retrieve RSA public key successfully";
    928     UniqueBlob x509_blob(x509_data, x509_data_length);
    929 
    930     const unsigned char *tmp = static_cast<const unsigned char*>(x509_blob.get());
    931     Unique_EVP_PKEY expected(d2i_PUBKEY((EVP_PKEY**) NULL, &tmp,
    932             static_cast<long>(x509_blob.length())));
    933 
    934     Unique_EC_KEY ecKey(EVP_PKEY_get1_EC_KEY(expected.get()));
    935 
    936     ASSERT_EQ(1, ECDSA_verify(0, testData.get(), testData.length(), sig_blob.get(), sig_blob.length(), ecKey.get()))
    937             << "Signature should verify";
    938 }
    939 
    940 TEST_F(KeymasterTest, SignData_RSA_Raw_InvalidSizeInput_Failure) {
    941     uint8_t* key_blob;
    942     size_t key_blob_length;
    943 
    944     UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
    945     ASSERT_TRUE(testKey.get() != NULL);
    946 
    947     ASSERT_EQ(0,
    948             sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
    949                     &key_blob, &key_blob_length))
    950             << "Should successfully import an RSA key";
    951     UniqueKey key(&sDevice, key_blob, key_blob_length);
    952 
    953     keymaster_rsa_sign_params_t params = {
    954             digest_type: DIGEST_NONE,
    955             padding_type: PADDING_NONE,
    956     };
    957 
    958     uint8_t* sig;
    959     size_t sig_length;
    960 
    961     UniqueReadOnlyBlob testData(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
    962     ASSERT_TRUE(testData.get() != NULL);
    963 
    964     ASSERT_EQ(-1,
    965             sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
    966                     testData.get(), testData.length(),
    967                     &sig, &sig_length))
    968             << "Should not be able to do raw signature on incorrect size data";
    969 }
    970 
    971 TEST_F(KeymasterTest, SignData_RSA_Raw_NullKey_Failure) {
    972     keymaster_rsa_sign_params_t params = {
    973             digest_type: DIGEST_NONE,
    974             padding_type: PADDING_NONE,
    975     };
    976 
    977     uint8_t* sig;
    978     size_t sig_length;
    979 
    980     UniqueReadOnlyBlob testData(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
    981     ASSERT_TRUE(testData.get() != NULL);
    982 
    983     ASSERT_EQ(-1,
    984             sDevice->sign_data(sDevice, &params, NULL, 0,
    985                     testData.get(), testData.length(),
    986                     &sig, &sig_length))
    987             << "Should not be able to do raw signature on incorrect size data";
    988 }
    989 
    990 TEST_F(KeymasterTest, SignData_RSA_Raw_NullInput_Failure) {
    991     uint8_t* key_blob;
    992     size_t key_blob_length;
    993 
    994     UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
    995     ASSERT_TRUE(testKey.get() != NULL);
    996 
    997     ASSERT_EQ(0,
    998             sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
    999                     &key_blob, &key_blob_length))
   1000             << "Should successfully import an RSA key";
   1001     UniqueKey key(&sDevice, key_blob, key_blob_length);
   1002 
   1003     keymaster_rsa_sign_params_t params = {
   1004             digest_type: DIGEST_NONE,
   1005             padding_type: PADDING_NONE,
   1006     };
   1007 
   1008     uint8_t* sig;
   1009     size_t sig_length;
   1010 
   1011     ASSERT_EQ(-1,
   1012             sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
   1013                     NULL, 0,
   1014                     &sig, &sig_length))
   1015             << "Should error when input data is null";
   1016 }
   1017 
   1018 TEST_F(KeymasterTest, SignData_RSA_Raw_NullOutput_Failure) {
   1019     uint8_t* key_blob;
   1020     size_t key_blob_length;
   1021 
   1022     UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
   1023     ASSERT_TRUE(testKey.get() != NULL);
   1024 
   1025     ASSERT_EQ(0,
   1026             sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
   1027                     &key_blob, &key_blob_length))
   1028             << "Should successfully import an RSA key";
   1029     UniqueKey key(&sDevice, key_blob, key_blob_length);
   1030 
   1031     keymaster_rsa_sign_params_t params = {
   1032             digest_type: DIGEST_NONE,
   1033             padding_type: PADDING_NONE,
   1034     };
   1035 
   1036     uint8_t* sig;
   1037     size_t sig_length;
   1038 
   1039     UniqueReadOnlyBlob testData(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
   1040     ASSERT_TRUE(testData.get() != NULL);
   1041 
   1042     ASSERT_EQ(-1,
   1043             sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
   1044                     testData.get(), testData.length(),
   1045                     NULL, NULL))
   1046             << "Should error when output is null";
   1047 }
   1048 
   1049 TEST_F(KeymasterTest, VerifyData_RSA_Raw_Success) {
   1050     uint8_t* key_blob;
   1051     size_t key_blob_length;
   1052 
   1053     UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
   1054     ASSERT_TRUE(testKey.get() != NULL);
   1055 
   1056     ASSERT_EQ(0,
   1057             sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
   1058                     &key_blob, &key_blob_length))
   1059             << "Should successfully import an RSA key";
   1060     UniqueKey key(&sDevice, key_blob, key_blob_length);
   1061 
   1062     keymaster_rsa_sign_params_t params = {
   1063             digest_type: DIGEST_NONE,
   1064             padding_type: PADDING_NONE,
   1065     };
   1066 
   1067     UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
   1068     ASSERT_TRUE(testData.get() != NULL);
   1069 
   1070     UniqueReadOnlyBlob testSig(TEST_SIGN_RSA_SIGNATURE_1, sizeof(TEST_SIGN_RSA_SIGNATURE_1));
   1071     ASSERT_TRUE(testSig.get() != NULL);
   1072 
   1073     ASSERT_EQ(0,
   1074             sDevice->verify_data(sDevice, &params, key_blob, key_blob_length,
   1075                     testData.get(), testData.length(),
   1076                     testSig.get(), testSig.length()))
   1077             << "Should verify data successfully";
   1078 }
   1079 
   1080 TEST_F(KeymasterTest, VerifyData_EC_Raw_Success) {
   1081     uint8_t* key_blob;
   1082     size_t key_blob_length;
   1083 
   1084     UniqueReadOnlyBlob testKey(TEST_SIGN_EC_KEY_1, sizeof(TEST_SIGN_EC_KEY_1));
   1085     ASSERT_TRUE(testKey.get() != NULL);
   1086 
   1087     ASSERT_EQ(0,
   1088             sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
   1089                     &key_blob, &key_blob_length))
   1090             << "Should successfully import an RSA key";
   1091     UniqueKey key(&sDevice, key_blob, key_blob_length);
   1092 
   1093     keymaster_ec_sign_params_t params = {
   1094             digest_type: DIGEST_NONE,
   1095     };
   1096 
   1097     uint8_t* sig;
   1098     size_t sig_length;
   1099 
   1100     UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
   1101     ASSERT_TRUE(testData.get() != NULL);
   1102 
   1103     ASSERT_EQ(0,
   1104             sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
   1105                     testData.get(), testData.length(),
   1106                     &sig, &sig_length))
   1107             << "Should sign data successfully";
   1108     UniqueBlob sig_blob(sig, sig_length);
   1109 
   1110     ASSERT_EQ(0,
   1111             sDevice->verify_data(sDevice, &params, key_blob, key_blob_length,
   1112                     testData.get(), testData.length(),
   1113                     sig_blob.get(), sig_blob.length()))
   1114             << "Should verify data successfully";
   1115 }
   1116 
   1117 TEST_F(KeymasterTest, VerifyData_RSA_Raw_BadSignature_Failure) {
   1118     uint8_t* key_blob;
   1119     size_t key_blob_length;
   1120 
   1121     UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
   1122     ASSERT_TRUE(testKey.get() != NULL);
   1123 
   1124     ASSERT_EQ(0,
   1125             sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
   1126                     &key_blob, &key_blob_length))
   1127             << "Should successfully import an RSA key";
   1128     UniqueKey key(&sDevice, key_blob, key_blob_length);
   1129 
   1130     keymaster_rsa_sign_params_t params = {
   1131             digest_type: DIGEST_NONE,
   1132             padding_type: PADDING_NONE,
   1133     };
   1134 
   1135     ASSERT_EQ(-1,
   1136             sDevice->verify_data(sDevice, &params, key_blob, key_blob_length,
   1137                     TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1),
   1138                     TEST_SIGN_SIGNATURE_BOGUS_1, sizeof(TEST_SIGN_SIGNATURE_BOGUS_1)))
   1139             << "Should sign data successfully";
   1140 }
   1141 
   1142 TEST_F(KeymasterTest, VerifyData_EC_Raw_BadSignature_Failure) {
   1143     uint8_t* key_blob;
   1144     size_t key_blob_length;
   1145 
   1146     UniqueReadOnlyBlob testKey(TEST_SIGN_EC_KEY_1, sizeof(TEST_SIGN_EC_KEY_1));
   1147     ASSERT_TRUE(testKey.get() != NULL);
   1148 
   1149     ASSERT_EQ(0,
   1150             sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
   1151                     &key_blob, &key_blob_length))
   1152             << "Should successfully import an RSA key";
   1153     UniqueKey key(&sDevice, key_blob, key_blob_length);
   1154 
   1155     keymaster_ec_sign_params_t params = {
   1156             digest_type: DIGEST_NONE,
   1157     };
   1158 
   1159     ASSERT_EQ(-1,
   1160             sDevice->verify_data(sDevice, &params, key_blob, key_blob_length,
   1161                     TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1),
   1162                     TEST_SIGN_SIGNATURE_BOGUS_1, sizeof(TEST_SIGN_SIGNATURE_BOGUS_1)))
   1163             << "Should sign data successfully";
   1164 }
   1165 
   1166 TEST_F(KeymasterTest, VerifyData_RSA_Raw_NullKey_Failure) {
   1167     keymaster_rsa_sign_params_t params = {
   1168             digest_type: DIGEST_NONE,
   1169             padding_type: PADDING_NONE,
   1170     };
   1171 
   1172     UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
   1173     ASSERT_TRUE(testData.get() != NULL);
   1174 
   1175     UniqueReadOnlyBlob testSig(TEST_SIGN_SIGNATURE_BOGUS_1, sizeof(TEST_SIGN_SIGNATURE_BOGUS_1));
   1176     ASSERT_TRUE(testSig.get() != NULL);
   1177 
   1178     ASSERT_EQ(-1,
   1179             sDevice->verify_data(sDevice, &params, NULL, 0,
   1180                     testData.get(), testData.length(),
   1181                     testSig.get(), testSig.length()))
   1182             << "Should fail when key is null";
   1183 }
   1184 
   1185 TEST_F(KeymasterTest, VerifyData_RSA_NullInput_Failure) {
   1186     uint8_t* key_blob;
   1187     size_t key_blob_length;
   1188 
   1189     ASSERT_EQ(0,
   1190             sDevice->import_keypair(sDevice, TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1),
   1191                     &key_blob, &key_blob_length))
   1192             << "Should successfully import an RSA key";
   1193     UniqueKey key(&sDevice, key_blob, key_blob_length);
   1194 
   1195     keymaster_rsa_sign_params_t params = {
   1196             digest_type: DIGEST_NONE,
   1197             padding_type: PADDING_NONE,
   1198     };
   1199 
   1200     UniqueReadOnlyBlob testSig(TEST_SIGN_RSA_SIGNATURE_1, sizeof(TEST_SIGN_RSA_SIGNATURE_1));
   1201     ASSERT_TRUE(testSig.get() != NULL);
   1202 
   1203     ASSERT_EQ(-1,
   1204             sDevice->verify_data(sDevice, &params, key_blob, key_blob_length,
   1205                     NULL, 0,
   1206                     testSig.get(), testSig.length()))
   1207             << "Should fail on null input";
   1208 }
   1209 
   1210 TEST_F(KeymasterTest, VerifyData_RSA_NullSignature_Failure) {
   1211     uint8_t* key_blob;
   1212     size_t key_blob_length;
   1213 
   1214     UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
   1215     ASSERT_TRUE(testKey.get() != NULL);
   1216 
   1217     ASSERT_EQ(0,
   1218             sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
   1219                     &key_blob, &key_blob_length))
   1220             << "Should successfully import an RSA key";
   1221     UniqueKey key(&sDevice, key_blob, key_blob_length);
   1222 
   1223     keymaster_rsa_sign_params_t params = {
   1224             digest_type: DIGEST_NONE,
   1225             padding_type: PADDING_NONE,
   1226     };
   1227 
   1228     UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
   1229     ASSERT_TRUE(testData.get() != NULL);
   1230 
   1231     ASSERT_EQ(-1,
   1232             sDevice->verify_data(sDevice, &params, key.get(), key.length(),
   1233                     testData.get(), testData.length(),
   1234                     NULL, 0))
   1235             << "Should fail on null signature";
   1236 }
   1237 
   1238 TEST_F(KeymasterTest, EraseAll_Success) {
   1239     uint8_t *key1_blob, *key2_blob;
   1240     size_t key1_blob_length, key2_blob_length;
   1241 
   1242     // Only test this if the device says it supports delete_all
   1243     if (sDevice->delete_all == NULL) {
   1244         return;
   1245     }
   1246 
   1247     UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
   1248     ASSERT_TRUE(testKey.get() != NULL);
   1249 
   1250     ASSERT_EQ(0,
   1251             sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
   1252                     &key1_blob, &key1_blob_length))
   1253             << "Should successfully import an RSA key";
   1254     UniqueKey key1(&sDevice, key1_blob, key1_blob_length);
   1255 
   1256     UniqueReadOnlyBlob testKey2(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
   1257     ASSERT_TRUE(testKey2.get() != NULL);
   1258 
   1259     ASSERT_EQ(0,
   1260             sDevice->import_keypair(sDevice, testKey2.get(), testKey2.length(),
   1261                     &key2_blob, &key2_blob_length))
   1262             << "Should successfully import an RSA key";
   1263     UniqueKey key2(&sDevice, key2_blob, key2_blob_length);
   1264 
   1265     ASSERT_EQ(0, sDevice->delete_all(sDevice))
   1266             << "Should erase all keys";
   1267 
   1268     key1.reset();
   1269 
   1270     uint8_t* x509_data;
   1271     size_t x509_data_length;
   1272     ASSERT_EQ(-1,
   1273             sDevice->get_keypair_public(sDevice, key1_blob, key1_blob_length,
   1274                     &x509_data, &x509_data_length))
   1275             << "Should be able to retrieve RSA public key 1 successfully";
   1276 
   1277     ASSERT_EQ(-1,
   1278             sDevice->get_keypair_public(sDevice, key2_blob, key2_blob_length,
   1279                     &x509_data, &x509_data_length))
   1280             << "Should be able to retrieve RSA public key 2 successfully";
   1281 }
   1282 
   1283 }
   1284