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