14fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root/*
24fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root * Copyright (C) 2012 The Android Open Source Project
34fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root *
44fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root * Licensed under the Apache License, Version 2.0 (the "License");
54fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root * you may not use this file except in compliance with the License.
64fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root * You may obtain a copy of the License at
74fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root *
84fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root *      http://www.apache.org/licenses/LICENSE-2.0
94fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root *
104fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root * Unless required by applicable law or agreed to in writing, software
114fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root * distributed under the License is distributed on an "AS IS" BASIS,
124fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root * See the License for the specific language governing permissions and
144fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root * limitations under the License.
154fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root */
164fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
17eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root#include <fcntl.h>
18eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root#include <stdlib.h>
19eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root#include <unistd.h>
20eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root#include <sys/mman.h>
21eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root#include <sys/stat.h>
22eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root#include <sys/types.h>
234fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
24eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root#include <fstream>
25eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root#include <iostream>
264fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
274fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root#include <gtest/gtest.h>
284fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
298467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root#include <openssl/bn.h>
308467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root#include <openssl/evp.h>
318467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root#include <openssl/x509.h>
328467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root
33eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root#define LOG_TAG "keymaster_test"
34eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root#include <utils/Log.h>
35a4cef693679293528bcca4084709e0b62c7a2ac0Kenny Root
36a4cef693679293528bcca4084709e0b62c7a2ac0Kenny Root#include <UniquePtr.h>
37eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
38302d252f2c655b50a8d1223105a0742d456ce206Shawn Willden#include <hardware/keymaster0.h>
394fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
404fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Rootnamespace android {
414fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
424fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Rootclass UniqueBlob : public UniquePtr<uint8_t[]> {
434fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Rootpublic:
44bcfe2933caf28bcbda052914d81a5c0bc2d4c44eChih-Hung Hsieh    explicit UniqueBlob(size_t length) :
45eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            mLength(length) {
46eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    }
47eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
484fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueBlob(uint8_t* bytes, size_t length) :
494fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            UniquePtr<uint8_t[]>(bytes), mLength(length) {
504fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    }
514fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
524fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    bool operator==(const UniqueBlob &other) const {
534fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        if (other.length() != mLength) {
544fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            return false;
554fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        }
564fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
574fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        const uint8_t* mine = get();
584fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        const uint8_t* theirs = other.get();
594fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
604fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        for (size_t i = 0; i < mLength; i++) {
614fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            if (mine[i] != theirs[i]) {
624fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                return false;
634fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            }
644fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        }
654fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
664fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        return true;
674fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    }
684fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
694fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t length() const {
704fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        return mLength;
714fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    }
724fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
734fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    friend std::ostream &operator<<(std::ostream &stream, const UniqueBlob& blob);
744fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
754fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Rootprivate:
764fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t mLength;
774fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root};
784fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
794fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Rootstd::ostream &operator<<(std::ostream &stream, const UniqueBlob& blob) {
804fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    const size_t length = blob.mLength;
814fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    stream << "Blob length=" << length << " < ";
824fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
834fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    const uint8_t* data = blob.get();
844fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    for (size_t i = 0; i < length; i++) {
854fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        stream << std::hex << std::setw(2) << std::setfill('0')
864fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                << static_cast<unsigned int>(data[i]) << ' ';
874fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    }
884fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    stream << '>' << std::endl;
894fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
904fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    return stream;
914fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
924fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
934fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Rootclass UniqueKey : public UniqueBlob {
944fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Rootpublic:
95302d252f2c655b50a8d1223105a0742d456ce206Shawn Willden    UniqueKey(keymaster0_device_t** dev, uint8_t* bytes, size_t length) :
964fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            UniqueBlob(bytes, length), mDevice(dev) {
974fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    }
984fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
994fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    ~UniqueKey() {
1004fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        if (mDevice != NULL && *mDevice != NULL) {
101302d252f2c655b50a8d1223105a0742d456ce206Shawn Willden            keymaster0_device_t* dev = *mDevice;
1024fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            if (dev->delete_keypair != NULL) {
1034fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                dev->delete_keypair(dev, get(), length());
1044fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            }
1054fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        }
1064fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    }
1074fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
1084fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Rootprivate:
109302d252f2c655b50a8d1223105a0742d456ce206Shawn Willden    keymaster0_device_t** mDevice;
1104fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root};
1114fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
112eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Rootclass UniqueReadOnlyBlob {
113eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Rootpublic:
114eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    UniqueReadOnlyBlob(uint8_t* data, size_t dataSize) :
115eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            mDataSize(dataSize) {
116eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        int pageSize = sysconf(_SC_PAGE_SIZE);
117eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        if (pageSize == -1) {
118eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            return;
119eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        }
120eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
121eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        int fd = open("/dev/zero", O_RDONLY);
122eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        if (fd == -1) {
123eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            return;
124eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        }
125eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
126eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        mBufferSize = (dataSize + pageSize - 1) & ~(pageSize - 1);
127eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        uint8_t* buffer = (uint8_t*) mmap(NULL, mBufferSize, PROT_READ | PROT_WRITE,
128eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root                                          MAP_PRIVATE, fd, 0);
129eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        close(fd);
130eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
131eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        if (buffer == NULL) {
132eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            return;
133eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        }
134eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
135eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        memcpy(buffer, data, dataSize);
136eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        if (mprotect(buffer, mBufferSize, PROT_READ) == -1) {
137eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            munmap(buffer, mBufferSize);
138eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            return;
139eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        }
140eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
141eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        mBuffer = buffer;
142eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    }
143eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
144eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ~UniqueReadOnlyBlob() {
145eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        munmap(mBuffer, mBufferSize);
146eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    }
147eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
148eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    uint8_t* get() const {
149eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        return mBuffer;
150eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    }
151eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
152eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    size_t length() const {
153eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        return mDataSize;
154eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    }
155eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
156eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Rootprivate:
157eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    uint8_t* mBuffer;
158eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    size_t mBufferSize;
159eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    size_t mDataSize;
160eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root};
161eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
1628467a6d2918274295212d07fc6e3894f6bc5d623Kenny Rootstruct BIGNUM_Delete {
1638467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    void operator()(BIGNUM* p) const {
1648467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root        BN_free(p);
1658467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    }
1668467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root};
1678467a6d2918274295212d07fc6e3894f6bc5d623Kenny Roottypedef UniquePtr<BIGNUM, BIGNUM_Delete> Unique_BIGNUM;
1688467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root
1698467a6d2918274295212d07fc6e3894f6bc5d623Kenny Rootstruct EVP_PKEY_Delete {
1708467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    void operator()(EVP_PKEY* p) const {
1718467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root        EVP_PKEY_free(p);
1728467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    }
1738467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root};
1748467a6d2918274295212d07fc6e3894f6bc5d623Kenny Roottypedef UniquePtr<EVP_PKEY, EVP_PKEY_Delete> Unique_EVP_PKEY;
1758467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root
1768467a6d2918274295212d07fc6e3894f6bc5d623Kenny Rootstruct PKCS8_PRIV_KEY_INFO_Delete {
1778467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    void operator()(PKCS8_PRIV_KEY_INFO* p) const {
1788467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root        PKCS8_PRIV_KEY_INFO_free(p);
1798467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    }
1808467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root};
1818467a6d2918274295212d07fc6e3894f6bc5d623Kenny Roottypedef UniquePtr<PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO_Delete> Unique_PKCS8_PRIV_KEY_INFO;
1828467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root
1838467a6d2918274295212d07fc6e3894f6bc5d623Kenny Rootstruct RSA_Delete {
1848467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    void operator()(RSA* p) const {
1858467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root        RSA_free(p);
1868467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    }
1878467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root};
1888467a6d2918274295212d07fc6e3894f6bc5d623Kenny Roottypedef UniquePtr<RSA, RSA_Delete> Unique_RSA;
1898467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root
1906e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Rootstruct EC_KEY_Delete {
1916e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    void operator()(EC_KEY* p) const {
1926e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root        EC_KEY_free(p);
1936e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    }
1946e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root};
1956e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Roottypedef UniquePtr<EC_KEY, EC_KEY_Delete> Unique_EC_KEY;
1966e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
1976e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
1984fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root/*
1994fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root * DER-encoded PKCS#8 format RSA key. Generated using:
2004fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root *
2014fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root * openssl genrsa 2048 | openssl pkcs8 -topk8 -nocrypt -outform der | recode ../x1
2024fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root */
2036e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Rootstatic uint8_t TEST_RSA_KEY_1[] = {
2044fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x30, 0x82, 0x04, 0xBE, 0x02, 0x01, 0x00, 0x30, 0x0D, 0x06, 0x09, 0x2A,
2054fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82,
2064fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x04, 0xA8, 0x30, 0x82, 0x04, 0xA4, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01,
2074fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x01, 0x00, 0xD8, 0x58, 0xD4, 0x9F, 0xC0, 0xE8, 0xF0, 0xFF, 0x87, 0x27,
2084fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x43, 0xE6, 0x2E, 0xE6, 0x9A, 0x42, 0x3B, 0x39, 0x94, 0x84, 0x43, 0x55,
2094fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x8D, 0x20, 0x5B, 0x71, 0x88, 0xE6, 0xD1, 0x62, 0xC8, 0xF2, 0x20, 0xD0,
2104fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x75, 0x13, 0x83, 0xA3, 0x5D, 0x19, 0xA8, 0x62, 0xD0, 0x5F, 0x3E, 0x8A,
2114fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x7C, 0x0E, 0x26, 0xA9, 0xFF, 0xB2, 0x5E, 0x63, 0xAA, 0x3C, 0x8D, 0x13,
2124fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x41, 0xAA, 0xD5, 0x03, 0x01, 0x01, 0x53, 0xC9, 0x02, 0x1C, 0xEC, 0xE8,
2134fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xC4, 0x70, 0x3F, 0x43, 0xE5, 0x51, 0xD0, 0x6E, 0x52, 0x0B, 0xC4, 0x0A,
2144fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xA3, 0x61, 0xDE, 0xE3, 0x72, 0x0C, 0x94, 0xF1, 0x1C, 0x2D, 0x36, 0x77,
2154fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xBB, 0x16, 0xA8, 0x63, 0x4B, 0xD1, 0x07, 0x00, 0x42, 0x2D, 0x2B, 0x10,
2164fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x80, 0x45, 0xF3, 0x0C, 0xF9, 0xC5, 0xAC, 0xCC, 0x64, 0x87, 0xFD, 0x5D,
2174fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xC8, 0x51, 0xD4, 0x1C, 0x9E, 0x6E, 0x9B, 0xC4, 0x27, 0x5E, 0x73, 0xA7,
2184fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x2A, 0xF6, 0x90, 0x42, 0x0C, 0x34, 0x93, 0xB7, 0x02, 0x19, 0xA9, 0x64,
2194fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x6C, 0x46, 0x3B, 0x40, 0x02, 0x2F, 0x54, 0x69, 0x79, 0x26, 0x7D, 0xF6,
2204fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x85, 0x90, 0x01, 0xD0, 0x21, 0x07, 0xD0, 0x14, 0x00, 0x65, 0x9C, 0xAC,
2214fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x24, 0xE8, 0x78, 0x42, 0x3B, 0x90, 0x75, 0x19, 0x55, 0x11, 0x4E, 0xD9,
2224fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xE6, 0x97, 0x87, 0xBC, 0x8D, 0x2C, 0x9B, 0xF0, 0x1F, 0x14, 0xEB, 0x6A,
2234fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x57, 0xCE, 0x78, 0xAD, 0xCE, 0xD9, 0xFB, 0xB9, 0xA1, 0xEF, 0x0C, 0x1F,
2244fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xDD, 0xE3, 0x5B, 0x73, 0xA0, 0xEC, 0x37, 0x9C, 0xE1, 0xFD, 0x86, 0x28,
2254fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xC3, 0x4A, 0x42, 0xD0, 0xA3, 0xFE, 0x57, 0x09, 0x29, 0xD8, 0xF6, 0xEC,
2264fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xE3, 0xC0, 0x71, 0x7C, 0x29, 0x27, 0xC2, 0xD1, 0x3E, 0x22, 0xBC, 0xBD,
2274fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x5A, 0x85, 0x41, 0xF6, 0x15, 0xDA, 0x0C, 0x58, 0x5A, 0x61, 0x5B, 0x78,
2284fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xB8, 0xAA, 0xEC, 0x5C, 0x1C, 0x79, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02,
2294fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x82, 0x01, 0x00, 0x1D, 0x10, 0x31, 0xE0, 0x14, 0x26, 0x36, 0xD9, 0xDC,
2304fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xEA, 0x25, 0x70, 0xF2, 0xB3, 0xFF, 0xDD, 0x0D, 0xDF, 0xBA, 0x57, 0xDA,
2314fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x43, 0xCF, 0xE5, 0x9C, 0xE3, 0x2F, 0xA4, 0xF2, 0x53, 0xF6, 0xF2, 0xAF,
2324fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xFD, 0xD0, 0xFC, 0x82, 0x1E, 0x9C, 0x0F, 0x2A, 0x53, 0xBB, 0xF2, 0x4F,
2334fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x90, 0x83, 0x01, 0xD3, 0xA7, 0xDA, 0xB5, 0xB7, 0x80, 0x64, 0x0A, 0x26,
2344fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x59, 0x83, 0xE4, 0xD3, 0x20, 0xC8, 0x2D, 0xC9, 0x77, 0xA3, 0x55, 0x07,
2354fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x6E, 0x6D, 0x95, 0x36, 0xAA, 0x84, 0x4F, 0xED, 0x54, 0x24, 0xA9, 0x77,
2364fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xF8, 0x85, 0xE2, 0x4B, 0xF2, 0xFA, 0x0B, 0x3E, 0xA6, 0xF5, 0x46, 0x0D,
2374fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x9F, 0x1F, 0xFE, 0xF7, 0x37, 0xFF, 0xA3, 0x60, 0xF1, 0x63, 0xF2, 0x75,
2384fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x6A, 0x8E, 0x10, 0xD7, 0x89, 0xD2, 0xB3, 0xFF, 0x76, 0xA5, 0xBA, 0xAF,
2394fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x0A, 0xBE, 0x32, 0x5F, 0xF0, 0x48, 0x48, 0x4B, 0x9C, 0x9A, 0x3D, 0x12,
2404fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xA7, 0xD2, 0x07, 0xC7, 0x59, 0x32, 0x94, 0x95, 0x65, 0x2F, 0x87, 0x34,
2414fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x76, 0xBA, 0x7C, 0x08, 0x4B, 0xAB, 0xA6, 0x24, 0xDF, 0x64, 0xDB, 0x48,
2424fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x63, 0x42, 0x06, 0xE2, 0x2C, 0x3D, 0xFB, 0xE5, 0x47, 0x81, 0x94, 0x98,
2434fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xF7, 0x32, 0x4B, 0x28, 0xEB, 0x42, 0xB8, 0xE9, 0x8E, 0xFC, 0xC9, 0x43,
2444fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xC9, 0x47, 0xE6, 0xE7, 0x1C, 0xDC, 0x71, 0xEF, 0x4D, 0x8A, 0xB1, 0xFC,
2454fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x45, 0x37, 0xEC, 0xB3, 0x16, 0x88, 0x5B, 0xE2, 0xEC, 0x8B, 0x6B, 0x75,
2464fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x16, 0xBE, 0x6B, 0xF8, 0x2C, 0xF8, 0xC9, 0xD1, 0xF7, 0x55, 0x87, 0x57,
2474fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x5F, 0xDE, 0xF4, 0x7E, 0x72, 0x13, 0x06, 0x2A, 0x21, 0xB7, 0x78, 0x21,
2484fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x05, 0xFD, 0xE2, 0x5F, 0x7B, 0x7C, 0xF0, 0x26, 0x2B, 0x75, 0x7F, 0x68,
2494fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xF9, 0xA6, 0x98, 0xFD, 0x54, 0x0E, 0xCC, 0x22, 0x41, 0x7F, 0x29, 0x81,
2504fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x2F, 0xA3, 0x3C, 0x3D, 0x64, 0xC8, 0x41, 0x02, 0x81, 0x81, 0x00, 0xFA,
2514fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xFA, 0xE4, 0x2E, 0x30, 0xF0, 0x7A, 0x8D, 0x95, 0xB8, 0x39, 0x58, 0x27,
2524fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x0F, 0x89, 0x0C, 0xDF, 0xFE, 0x2F, 0x55, 0x3B, 0x6F, 0xDD, 0x5F, 0x12,
2534fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xB3, 0xD1, 0xCF, 0x5B, 0x8D, 0xB6, 0x10, 0x1C, 0x87, 0x0C, 0x30, 0x89,
2544fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x2D, 0xBB, 0xB8, 0xA1, 0x78, 0x0F, 0x54, 0xA6, 0x36, 0x46, 0x05, 0x8B,
2554fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x5A, 0xFF, 0x48, 0x03, 0x13, 0xAE, 0x95, 0x96, 0x5D, 0x6C, 0xDA, 0x5D,
2564fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xF7, 0xAD, 0x1D, 0x33, 0xED, 0x23, 0xF5, 0x4B, 0x03, 0x78, 0xE7, 0x50,
2574fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xD1, 0x2D, 0x95, 0x22, 0x35, 0x02, 0x5B, 0x4A, 0x4E, 0x73, 0xC9, 0xB7,
2584fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x05, 0xC4, 0x21, 0x86, 0x1F, 0x1E, 0x40, 0x83, 0xBC, 0x8A, 0x3A, 0x95,
2594fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x24, 0x62, 0xF4, 0x58, 0x38, 0x64, 0x4A, 0x89, 0x8A, 0x27, 0x59, 0x12,
2604fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x9D, 0x21, 0xC3, 0xA6, 0x42, 0x1E, 0x2A, 0x3F, 0xD8, 0x65, 0x1F, 0x6E,
2614fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x3E, 0x4D, 0x5C, 0xCC, 0xEA, 0x8E, 0x15, 0x02, 0x81, 0x81, 0x00, 0xDC,
2624fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xAC, 0x9B, 0x00, 0xDB, 0xF9, 0xB2, 0xBF, 0xC4, 0x5E, 0xB6, 0xB7, 0x63,
2634fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xEB, 0x13, 0x4B, 0xE2, 0xA6, 0xC8, 0x72, 0x90, 0xD8, 0xC2, 0x33, 0x33,
2644fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xF0, 0x66, 0x75, 0xBD, 0x50, 0x7C, 0xA4, 0x8F, 0x82, 0xFB, 0xFF, 0x44,
2654fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x3B, 0xE7, 0x15, 0x3A, 0x0C, 0x7A, 0xF8, 0x92, 0x86, 0x4A, 0x79, 0x32,
2664fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x08, 0x82, 0x1D, 0x6A, 0xBA, 0xAD, 0x8A, 0xB3, 0x3D, 0x7F, 0xA5, 0xB4,
2674fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x6F, 0x67, 0x86, 0x7E, 0xB2, 0x9C, 0x2A, 0xF6, 0x7C, 0x49, 0x21, 0xC5,
2684fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x3F, 0x00, 0x3F, 0x9B, 0xF7, 0x0F, 0x6C, 0x35, 0x80, 0x75, 0x73, 0xC0,
2694fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xF8, 0x3E, 0x30, 0x5F, 0x74, 0x2F, 0x15, 0x41, 0xEA, 0x0F, 0xCE, 0x0E,
2704fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x18, 0x17, 0x68, 0xBA, 0xC4, 0x29, 0xF2, 0xE2, 0x2C, 0x1D, 0x55, 0x83,
2714fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xB6, 0x64, 0x2E, 0x03, 0x12, 0xA4, 0x0D, 0xBF, 0x4F, 0x2E, 0xBE, 0x7C,
2724fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x41, 0xD9, 0xCD, 0xD0, 0x52, 0x91, 0xD5, 0x02, 0x81, 0x81, 0x00, 0xD4,
2734fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x55, 0xEB, 0x32, 0xC1, 0x28, 0xD3, 0x26, 0x72, 0x22, 0xB8, 0x31, 0x42,
2744fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x6A, 0xBC, 0x52, 0x6E, 0x37, 0x48, 0xA8, 0x5D, 0x6E, 0xD8, 0xE5, 0x14,
2754fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x97, 0x99, 0xCC, 0x4A, 0xF2, 0xEB, 0xB3, 0x59, 0xCF, 0x4F, 0x9A, 0xC8,
2764fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x94, 0x2E, 0x9B, 0x97, 0xD0, 0x51, 0x78, 0x16, 0x5F, 0x18, 0x82, 0x9C,
2774fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x51, 0xD2, 0x64, 0x84, 0x65, 0xE4, 0x70, 0x9E, 0x14, 0x50, 0x81, 0xB6,
2784fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xBA, 0x52, 0x75, 0xC0, 0x76, 0xC2, 0xD3, 0x46, 0x31, 0x9B, 0xDA, 0x67,
2794fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xDF, 0x71, 0x27, 0x19, 0x17, 0xAB, 0xF4, 0xBC, 0x3A, 0xFF, 0x6F, 0x0B,
2804fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x2F, 0x0F, 0xAE, 0x25, 0x20, 0xB2, 0xA1, 0x76, 0x52, 0xCE, 0xC7, 0x9D,
2814fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x62, 0x79, 0x6D, 0xAC, 0x2D, 0x99, 0x7C, 0x0E, 0x3D, 0x19, 0xE9, 0x1B,
2824fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xFC, 0x60, 0x92, 0x7C, 0x58, 0xB7, 0xD8, 0x9A, 0xC7, 0x63, 0x56, 0x62,
2834fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x18, 0xC7, 0xAE, 0xD9, 0x97, 0x1F, 0xB9, 0x02, 0x81, 0x81, 0x00, 0x91,
2844fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x40, 0xC4, 0x1E, 0x82, 0xAD, 0x0F, 0x6D, 0x8E, 0xD2, 0x51, 0x2E, 0xD1,
2854fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x84, 0x30, 0x85, 0x68, 0xC1, 0x23, 0x7B, 0xD5, 0xBF, 0xF7, 0xC4, 0x40,
2864fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x51, 0xE2, 0xFF, 0x69, 0x07, 0x8B, 0xA3, 0xBE, 0x1B, 0x17, 0xC8, 0x64,
2874fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x9F, 0x91, 0x71, 0xB5, 0x6D, 0xF5, 0x9B, 0x9C, 0xC6, 0xEC, 0x4A, 0x6E,
2884fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x16, 0x8F, 0x9E, 0xD1, 0x5B, 0xE3, 0x53, 0x42, 0xBC, 0x1E, 0x43, 0x72,
2894fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x4B, 0x4A, 0x37, 0x8B, 0x3A, 0x01, 0xF5, 0x7D, 0x9D, 0x3D, 0x7E, 0x0F,
2904fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x19, 0x73, 0x0E, 0x6B, 0x98, 0xE9, 0xFB, 0xEE, 0x13, 0x8A, 0x3C, 0x11,
2914fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x2E, 0xD5, 0xB0, 0x7D, 0x84, 0x3A, 0x61, 0xA1, 0xAB, 0x71, 0x8F, 0xCE,
2924fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x53, 0x29, 0x45, 0x74, 0x7A, 0x1E, 0xAA, 0x93, 0x19, 0x3A, 0x8D, 0xC9,
2934fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x4E, 0xCB, 0x0E, 0x46, 0x53, 0x84, 0xCC, 0xCF, 0xBA, 0x4D, 0x28, 0x71,
2944fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x1D, 0xDF, 0x41, 0xCB, 0xF8, 0x2D, 0xA9, 0x02, 0x81, 0x80, 0x04, 0x8B,
2954fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x4A, 0xEA, 0xBD, 0x39, 0x0B, 0x96, 0xC5, 0x1D, 0xA4, 0x47, 0xFD, 0x46,
2964fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xD2, 0x8A, 0xEA, 0x2A, 0xF3, 0x9D, 0x3A, 0x7E, 0x16, 0x74, 0xFC, 0x13,
2974fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xDE, 0x4D, 0xA9, 0x85, 0x42, 0x33, 0x02, 0x92, 0x0B, 0xB6, 0xDB, 0x7E,
2984fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xEA, 0x85, 0xC2, 0x94, 0x43, 0x52, 0x37, 0x5A, 0x77, 0xAB, 0xCB, 0x61,
2994fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x88, 0xDE, 0xF8, 0xFA, 0xDB, 0xE8, 0x0B, 0x95, 0x7D, 0x39, 0x19, 0xA2,
3004fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x89, 0xB9, 0x32, 0xB2, 0x50, 0x38, 0xF7, 0x88, 0x69, 0xFD, 0xA4, 0x63,
3014fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x1F, 0x9B, 0x03, 0xD8, 0xA6, 0x7A, 0x05, 0x76, 0x02, 0x28, 0x93, 0x82,
3024fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x73, 0x7F, 0x14, 0xCC, 0xBE, 0x29, 0x10, 0xAD, 0x8A, 0x2E, 0xAC, 0xED,
3034fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x11, 0xA7, 0x72, 0x7C, 0x60, 0x78, 0x72, 0xFB, 0x78, 0x20, 0x18, 0xC9,
3044fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x7E, 0x63, 0xAD, 0x55, 0x54, 0x51, 0xDB, 0x9F, 0x7B, 0xD4, 0x8F, 0xB2,
3054fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xDE, 0x3B, 0xF1, 0x70, 0x23, 0xE5,
3064fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root};
3074fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
3084fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root/*
3096e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root * DER-encoded PKCS#8 format EC key. Generated using:
3106e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root *
3116e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root * openssl ecparam -name prime256v1 -genkey -noout | openssl pkcs8 -topk8 -nocrypt -outform der | recode ../x1
3126e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root */
3136e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Rootstatic uint8_t TEST_EC_KEY_1[] = {
3146e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root        0x30, 0x81, 0x87, 0x02, 0x01, 0x00, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86,
3156e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root        0x48, 0xCE, 0x3D, 0x02, 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D,
3166e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root        0x03, 0x01, 0x07, 0x04, 0x6D, 0x30, 0x6B, 0x02, 0x01, 0x01, 0x04, 0x20,
3176e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root        0x25, 0xAC, 0x77, 0x2B, 0x04, 0x33, 0xC8, 0x16, 0x59, 0xA3, 0xC7, 0xE7,
3186e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root        0x11, 0x42, 0xD0, 0x11, 0x71, 0x30, 0x7B, 0xB8, 0xD2, 0x67, 0xFF, 0x9C,
3196e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root        0x5F, 0x50, 0x2E, 0xAB, 0x67, 0xD4, 0x17, 0x51, 0xA1, 0x44, 0x03, 0x42,
3206e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root        0x00, 0x04, 0xCF, 0xCE, 0xB8, 0x7F, 0x88, 0x36, 0xC4, 0xF8, 0x51, 0x29,
3216e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root        0xE2, 0xA7, 0x21, 0xC3, 0x3B, 0xFF, 0x88, 0xE3, 0x87, 0x98, 0xD1, 0xA6,
3226e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root        0x4B, 0xB3, 0x4B, 0xD5, 0x44, 0xF8, 0xE0, 0x43, 0x6B, 0x50, 0x74, 0xFB,
3236e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root        0xB0, 0xAD, 0x41, 0x1C, 0x11, 0x9D, 0xC6, 0x1E, 0x83, 0x8C, 0x49, 0xCA,
3246e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root        0xBE, 0xC6, 0xCE, 0xB6, 0xC9, 0xA1, 0xBF, 0x69, 0xA9, 0xA0, 0xA3, 0x80,
3256e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root        0x14, 0x39, 0x57, 0x94, 0xDA, 0x5D
3266e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root};
3276e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
3286e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
3296e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root/*
3304fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root * Generated using keys on the keyboard and lack of imagination.
3314fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root */
3324fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Rootstatic unsigned char BOGUS_KEY_1[] = { 0xFF, 0xFF, 0xFF, 0xFF };
3334fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
3344fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
3358467a6d2918274295212d07fc6e3894f6bc5d623Kenny Rootclass KeymasterBaseTest : public ::testing::Test {
3368467a6d2918274295212d07fc6e3894f6bc5d623Kenny Rootpublic:
3374fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    static void SetUpTestCase() {
3384fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        const hw_module_t* mod;
3394fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        ASSERT_EQ(0, hw_get_module_by_class(KEYSTORE_HARDWARE_MODULE_ID, NULL, &mod))
3404fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                << "Should be able to find a keymaster hardware module";
3414fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
3424fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        std::cout << "Using keymaster module: " << mod->name << std::endl;
3434fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
344302d252f2c655b50a8d1223105a0742d456ce206Shawn Willden        ASSERT_EQ(0, keymaster0_open(mod, &sDevice))
3454fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                << "Should be able to open the keymaster device";
3464fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
34736ab8ed76fb751d8570d0323e6ece4c60f730703Kenny Root        ASSERT_EQ(KEYMASTER_MODULE_API_VERSION_0_2, mod->module_api_version)
3486e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root                << "Keymaster should implement API version 2";
3496e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
3504fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        ASSERT_TRUE(sDevice->generate_keypair != NULL)
3514fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                << "Should implement generate_keypair";
3524fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
3534fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        ASSERT_TRUE(sDevice->import_keypair != NULL)
3544fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                << "Should implement import_keypair";
3554fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
3564fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        ASSERT_TRUE(sDevice->get_keypair_public != NULL)
3574fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                << "Should implement get_keypair_public";
3584fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
3594fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        ASSERT_TRUE(sDevice->sign_data != NULL)
3604fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                << "Should implement sign_data";
3614fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
3624fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        ASSERT_TRUE(sDevice->verify_data != NULL)
3634fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                << "Should implement verify_data";
3644fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    }
3654fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
3664fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    static void TearDownTestCase() {
367302d252f2c655b50a8d1223105a0742d456ce206Shawn Willden        ASSERT_EQ(0, keymaster0_close(sDevice));
3684fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    }
3694fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
3708467a6d2918274295212d07fc6e3894f6bc5d623Kenny Rootprotected:
371302d252f2c655b50a8d1223105a0742d456ce206Shawn Willden    static keymaster0_device_t* sDevice;
3728467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root};
3734fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
374302d252f2c655b50a8d1223105a0742d456ce206Shawn Willdenkeymaster0_device_t* KeymasterBaseTest::sDevice = NULL;
3754fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
3768467a6d2918274295212d07fc6e3894f6bc5d623Kenny Rootclass KeymasterTest : public KeymasterBaseTest {
3774fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root};
3784fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
3796e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Rootclass KeymasterAllTypesTest : public KeymasterBaseTest,
3806e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root                              public ::testing::WithParamInterface<keymaster_keypair_t> {
3816e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root};
3826e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
3836e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Rootclass KeymasterGenerateRSATest : public KeymasterBaseTest,
3848467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root                              public ::testing::WithParamInterface<uint32_t> {
3858467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root};
3864fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
3876e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Rootclass KeymasterGenerateDSATest : public KeymasterBaseTest,
3886e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root                              public ::testing::WithParamInterface<uint32_t> {
3896e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root};
3906e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
3916e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Rootclass KeymasterGenerateECTest : public KeymasterBaseTest,
3926e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root                              public ::testing::WithParamInterface<uint32_t> {
3936e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root};
3946e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
3956e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny RootTEST_P(KeymasterGenerateRSATest, GenerateKeyPair_RSA_Success) {
3964fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    keymaster_keypair_t key_type = TYPE_RSA;
3974fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    keymaster_rsa_keygen_params_t params = {
3981aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe            .modulus_size = GetParam(),
3991aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe            .public_exponent = RSA_F4,
4004fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    };
4014fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
4024fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
4034fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
4044fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
405139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(0,
4064fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->generate_keypair(sDevice, key_type, &params, &key_blob, &key_blob_length))
4076e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            << "Should generate an RSA key with " << GetParam() << " bit modulus size";
4084fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
4094fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
4108467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    uint8_t* x509_data = NULL;
4118467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    size_t x509_data_length;
412139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(0,
4138467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root            sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
4148467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root                    &x509_data, &x509_data_length))
4158467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root            << "Should be able to retrieve RSA public key successfully";
4168467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    UniqueBlob x509_blob(x509_data, x509_data_length);
4178467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    ASSERT_FALSE(x509_blob.get() == NULL)
4188467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root            << "X509 data should be allocated";
4194fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
4208467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    const unsigned char *tmp = static_cast<const unsigned char*>(x509_blob.get());
4218467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    Unique_EVP_PKEY actual(d2i_PUBKEY((EVP_PKEY**) NULL, &tmp,
4228467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root            static_cast<long>(x509_blob.length())));
4234fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
4248467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    ASSERT_EQ(EVP_PKEY_RSA, EVP_PKEY_type(actual.get()->type))
4258467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root            << "Generated key type should be of type RSA";
4264fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
4278467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    Unique_RSA rsa(EVP_PKEY_get1_RSA(actual.get()));
4288467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    ASSERT_FALSE(rsa.get() == NULL)
4298467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root            << "Should be able to extract RSA key from EVP_PKEY";
4304fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
431139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(static_cast<unsigned long>(RSA_F4), BN_get_word(rsa.get()->e))
4328467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root            << "Exponent should be RSA_F4";
4334fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
4346e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    ASSERT_EQ((GetParam() + 7) / 8, static_cast<uint32_t>(RSA_size(rsa.get())))
4358467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root            << "Modulus size should be the specified parameter";
4364fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
4374fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
4388467a6d2918274295212d07fc6e3894f6bc5d623Kenny RootINSTANTIATE_TEST_CASE_P(RSA,
4396e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root                        KeymasterGenerateRSATest,
44063b64337fbaa10b282f85a7e887b40ced6d6d632Brian Carlstrom                        ::testing::Values(512U, 1024U, 2048U, 3072U, 4096U));
4418467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root
4426e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
4436e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny RootTEST_P(KeymasterGenerateECTest, GenerateKeyPair_EC_Success) {
4446e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    keymaster_keypair_t key_type = TYPE_EC;
4456e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    keymaster_ec_keygen_params_t params = {
4461aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe            .field_size = GetParam(),
4476e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    };
4486e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
4496e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    uint8_t* key_blob;
4506e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    size_t key_blob_length;
4516e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
4526e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    ASSERT_EQ(0,
4536e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            sDevice->generate_keypair(sDevice, key_type, &params, &key_blob, &key_blob_length))
4546e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            << "Should generate an EC key with " << GetParam() << " field size";
4556e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
4566e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
4576e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    uint8_t* x509_data = NULL;
4586e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    size_t x509_data_length;
4596e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    ASSERT_EQ(0,
4606e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
4616e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root                    &x509_data, &x509_data_length))
4626e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            << "Should be able to retrieve EC public key successfully";
4636e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueBlob x509_blob(x509_data, x509_data_length);
4646e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    ASSERT_FALSE(x509_blob.get() == NULL)
4656e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            << "X509 data should be allocated";
4666e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
4676e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    const unsigned char *tmp = static_cast<const unsigned char*>(x509_blob.get());
4686e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    Unique_EVP_PKEY actual(d2i_PUBKEY((EVP_PKEY**) NULL, &tmp,
4696e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            static_cast<long>(x509_blob.length())));
4706e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
4716e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    ASSERT_EQ(EVP_PKEY_EC, EVP_PKEY_type(actual.get()->type))
4726e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            << "Generated key type should be of type EC";
4736e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
4746e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    Unique_EC_KEY ecKey(EVP_PKEY_get1_EC_KEY(actual.get()));
4756e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    ASSERT_FALSE(ecKey.get() == NULL)
4766e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            << "Should be able to extract EC key from EVP_PKEY";
4776e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
4786e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    ASSERT_FALSE(EC_KEY_get0_group(ecKey.get()) == NULL)
4796e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            << "EC key should have a EC_GROUP";
4806e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
4816e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    ASSERT_TRUE(EC_KEY_check_key(ecKey.get()))
4826e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            << "EC key should check correctly";
4836e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root}
4846e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
4856e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny RootINSTANTIATE_TEST_CASE_P(EC,
4866e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root                        KeymasterGenerateECTest,
4876e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root                        ::testing::Values(192U, 224U, 256U, 384U, 521U));
4886e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
4896e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
4906e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny RootTEST_P(KeymasterAllTypesTest, GenerateKeyPair_NullParams_Failure) {
4916e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    keymaster_keypair_t key_type = GetParam();
4924fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
4934fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
4944fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
4954fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
496139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(-1,
4974fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->generate_keypair(sDevice, key_type, NULL, &key_blob, &key_blob_length))
4986e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            << "Should not be able to generate a key with null params";
4994fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
5004fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
5016e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny RootINSTANTIATE_TEST_CASE_P(Types,
5026e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root                        KeymasterAllTypesTest,
5036e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root                        ::testing::Values(TYPE_RSA, TYPE_DSA, TYPE_EC));
5046e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
5054fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, GenerateKeyPair_UnknownType_Failure) {
5064fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    keymaster_keypair_t key_type = static_cast<keymaster_keypair_t>(0xFFFF);
5074fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
5084fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
5094fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
5104fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
511139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(-1,
5124fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->generate_keypair(sDevice, key_type, NULL, &key_blob, &key_blob_length))
5134fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should not generate an unknown key type";
5144fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
5154fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
5164fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, ImportKeyPair_RSA_Success) {
5174fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
5184fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
5194fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
520139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(0,
5216e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            sDevice->import_keypair(sDevice, TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1),
5224fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &key_blob, &key_blob_length))
5234fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should successfully import an RSA key";
5244fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
5258467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root
5268467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    uint8_t* x509_data;
5278467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    size_t x509_data_length;
528139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(0,
5298467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root            sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
5308467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root                    &x509_data, &x509_data_length))
5318467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root            << "Should be able to retrieve RSA public key successfully";
5328467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    UniqueBlob x509_blob(x509_data, x509_data_length);
5338467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root
5348467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    const unsigned char *tmp = static_cast<const unsigned char*>(x509_blob.get());
5358467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    Unique_EVP_PKEY actual(d2i_PUBKEY((EVP_PKEY**) NULL, &tmp,
5368467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root            static_cast<long>(x509_blob.length())));
5378467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root
538139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(EVP_PKEY_type(actual.get()->type), EVP_PKEY_RSA)
5398467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root            << "Generated key type should be of type RSA";
5408467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root
5416e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    const unsigned char *expectedTmp = static_cast<const unsigned char*>(TEST_RSA_KEY_1);
5428467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    Unique_PKCS8_PRIV_KEY_INFO expectedPkcs8(
5438467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root            d2i_PKCS8_PRIV_KEY_INFO((PKCS8_PRIV_KEY_INFO**) NULL, &expectedTmp,
5446e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root                    sizeof(TEST_RSA_KEY_1)));
5456e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
5466e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    Unique_EVP_PKEY expected(EVP_PKCS82PKEY(expectedPkcs8.get()));
5476e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
5486e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    ASSERT_EQ(1, EVP_PKEY_cmp(expected.get(), actual.get()))
5496e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            << "Expected and actual keys should match";
5506e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root}
5516e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
5526e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny RootTEST_F(KeymasterTest, ImportKeyPair_EC_Success) {
5536e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    uint8_t* key_blob;
5546e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    size_t key_blob_length;
5556e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
5566e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    ASSERT_EQ(0,
5576e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            sDevice->import_keypair(sDevice, TEST_EC_KEY_1, sizeof(TEST_EC_KEY_1),
5586e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root                    &key_blob, &key_blob_length))
5596e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            << "Should successfully import an EC key";
5606e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
5616e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
5626e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    uint8_t* x509_data;
5636e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    size_t x509_data_length;
5646e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    ASSERT_EQ(0,
5656e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
5666e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root                    &x509_data, &x509_data_length))
5676e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            << "Should be able to retrieve EC public key successfully";
5686e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueBlob x509_blob(x509_data, x509_data_length);
5696e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
5706e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    const unsigned char *tmp = static_cast<const unsigned char*>(x509_blob.get());
5716e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    Unique_EVP_PKEY actual(d2i_PUBKEY((EVP_PKEY**) NULL, &tmp,
5726e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            static_cast<long>(x509_blob.length())));
5736e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
5746e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    ASSERT_EQ(EVP_PKEY_type(actual.get()->type), EVP_PKEY_EC)
5756e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            << "Generated key type should be of type EC";
5766e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
5776e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    const unsigned char *expectedTmp = static_cast<const unsigned char*>(TEST_EC_KEY_1);
5786e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    Unique_PKCS8_PRIV_KEY_INFO expectedPkcs8(
5796e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            d2i_PKCS8_PRIV_KEY_INFO((PKCS8_PRIV_KEY_INFO**) NULL, &expectedTmp,
5806e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root                    sizeof(TEST_EC_KEY_1)));
5818467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root
5828467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    Unique_EVP_PKEY expected(EVP_PKCS82PKEY(expectedPkcs8.get()));
5838467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root
584139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(1, EVP_PKEY_cmp(expected.get(), actual.get()))
5858467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root            << "Expected and actual keys should match";
5864fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
5874fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
5884fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, ImportKeyPair_BogusKey_Failure) {
5894fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
5904fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
5914fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
592139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(-1,
5934fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->import_keypair(sDevice, BOGUS_KEY_1, sizeof(BOGUS_KEY_1),
5944fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &key_blob, &key_blob_length))
5954fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should not import an unknown key type";
5964fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
5974fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
5984fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, ImportKeyPair_NullKey_Failure) {
5994fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
6004fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
6014fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
602139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(-1,
6034fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->import_keypair(sDevice, NULL, 0,
6044fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &key_blob, &key_blob_length))
6054fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should not import a null key";
6064fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
6074fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
6084fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, GetKeypairPublic_RSA_Success) {
6094fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
6104fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
6114fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
6126e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueReadOnlyBlob testKey(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
613eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
614eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
6154fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    ASSERT_EQ(0,
616eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
6174fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &key_blob, &key_blob_length))
6184fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should successfully import an RSA key";
6194fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
6204fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
6214fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* x509_data;
6224fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t x509_data_length;
623139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(0,
6244fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
6254fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &x509_data, &x509_data_length))
6264fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should be able to retrieve RSA public key successfully";
6274fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueBlob x509_blob(x509_data, x509_data_length);
6284fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
6294fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
6306e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny RootTEST_F(KeymasterTest, GetKeypairPublic_EC_Success) {
6316e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    uint8_t* key_blob;
6326e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    size_t key_blob_length;
6336e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
6346e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueReadOnlyBlob testKey(TEST_EC_KEY_1, sizeof(TEST_EC_KEY_1));
6356e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
6366e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
6376e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    ASSERT_EQ(0,
6386e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
6396e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root                    &key_blob, &key_blob_length))
6406e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            << "Should successfully import an EC key";
6416e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
6426e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
6436e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    uint8_t* x509_data;
6446e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    size_t x509_data_length;
6456e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    ASSERT_EQ(0,
6466e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
6476e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root                    &x509_data, &x509_data_length))
6486e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            << "Should be able to retrieve EC public key successfully";
6496e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueBlob x509_blob(x509_data, x509_data_length);
6506e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root}
6516e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
6526e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny RootTEST_F(KeymasterTest, GetKeypairPublic_NullKey_Failure) {
6534fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
6544fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
6554fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
6564fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* x509_data = NULL;
6574fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t x509_data_length;
658139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(-1,
6594fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->get_keypair_public(sDevice, NULL, 0,
6604fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &x509_data, &x509_data_length))
6616e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            << "Should not be able to retrieve public key from null key";
6624fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueBlob x509_blob(x509_data, x509_data_length);
6634fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
6644fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
6654fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, GetKeypairPublic_RSA_NullDestination_Failure) {
6664fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
6674fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
6684fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
6696e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueReadOnlyBlob testKey(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
6706e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
6716e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
6726e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    ASSERT_EQ(0,
6736e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
6746e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root                    &key_blob, &key_blob_length))
6756e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            << "Should successfully import an RSA key";
6766e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
6776e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
6786e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    ASSERT_EQ(-1,
6796e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            sDevice->get_keypair_public(sDevice, key.get(), key.length(),
6806e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root                    NULL, NULL))
6816e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            << "Should not be able to succeed with NULL destination blob";
6826e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root}
6836e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
6846e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny RootTEST_F(KeymasterTest, GetKeypairPublic_EC_NullDestination_Failure) {
6856e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    uint8_t* key_blob;
6866e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    size_t key_blob_length;
6876e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
6886e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueReadOnlyBlob testKey(TEST_EC_KEY_1, sizeof(TEST_EC_KEY_1));
689eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
690eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
6914fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    ASSERT_EQ(0,
692eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
6934fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &key_blob, &key_blob_length))
6944fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should successfully import an RSA key";
6954fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
6964fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
697139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(-1,
6984fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->get_keypair_public(sDevice, key.get(), key.length(),
6994fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    NULL, NULL))
7004fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should not be able to succeed with NULL destination blob";
7014fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
7024fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
7034fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, DeleteKeyPair_RSA_Success) {
7044fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
7054fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
7064fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
7076e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueReadOnlyBlob testKey(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
708eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
709eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
710139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(0,
711eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
7124fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &key_blob, &key_blob_length))
7134fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should successfully import an RSA key";
7144fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
7154fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
7164fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
7174fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, DeleteKeyPair_RSA_DoubleDelete_Failure) {
7184fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
7194fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
7204fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
7216e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueReadOnlyBlob testKey(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
722eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
723eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
7244fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    /*
7254fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root     * This is only run if the module indicates it implements key deletion
7264fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root     * by implementing delete_keypair.
7274fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root     */
7284fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    if (sDevice->delete_keypair != NULL) {
7294fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        ASSERT_EQ(0,
730eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root                sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
7314fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                        &key_blob, &key_blob_length))
7324fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                << "Should successfully import an RSA key";
7334fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        UniqueBlob blob(key_blob, key_blob_length);
7344fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
735139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root        ASSERT_EQ(0, sDevice->delete_keypair(sDevice, key_blob, key_blob_length))
7364fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                << "Should delete key after import";
7374fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
738139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root        ASSERT_EQ(-1, sDevice->delete_keypair(sDevice, key_blob, key_blob_length))
7394fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                << "Should not be able to delete key twice";
7404fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    }
7414fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
7424fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
7434fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, DeleteKeyPair_RSA_NullKey_Failure) {
7444fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    /*
7454fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root     * This is only run if the module indicates it implements key deletion
7464fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root     * by implementing delete_keypair.
7474fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root     */
7484fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    if (sDevice->delete_keypair != NULL) {
749139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root        ASSERT_EQ(-1, sDevice->delete_keypair(sDevice, NULL, 0))
7504fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                << "Should not be able to delete null key";
7514fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    }
7524fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
7534fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
7544fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root/*
7554fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root * DER-encoded PKCS#8 format RSA key. Generated using:
7564fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root *
7574fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root * openssl genrsa 512 | openssl pkcs8 -topk8 -nocrypt -outform der | recode ../x1
7584fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root */
7596e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Rootstatic uint8_t TEST_SIGN_RSA_KEY_1[] = {
7604fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x30, 0x82, 0x01, 0x56, 0x02, 0x01, 0x00, 0x30, 0x0D, 0x06, 0x09, 0x2A,
7614fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82,
7624fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x01, 0x40, 0x30, 0x82, 0x01, 0x3C, 0x02, 0x01, 0x00, 0x02, 0x41, 0x00,
7634fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xBD, 0xC0, 0x7F, 0xEF, 0x75, 0x1D, 0x63, 0x2A, 0xD0, 0x9A, 0x26, 0xE5,
7644fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x5B, 0xB9, 0x84, 0x7C, 0xE5, 0xC7, 0xE7, 0xDE, 0xFE, 0xB6, 0x54, 0xD9,
7654fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xF0, 0x9B, 0xC2, 0xCF, 0x36, 0xDA, 0xE5, 0x4D, 0xC5, 0xD9, 0x25, 0x78,
7664fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xBD, 0x55, 0x05, 0xBD, 0x86, 0xFB, 0x37, 0x15, 0x33, 0x42, 0x52, 0xED,
7674fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xE5, 0xCD, 0xCB, 0xB7, 0xA2, 0x51, 0xFA, 0x36, 0xE9, 0x9C, 0x2E, 0x5D,
7684fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xE3, 0xA5, 0x1F, 0x01, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x41, 0x00,
7694fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x96, 0x71, 0xDE, 0xBD, 0x83, 0x94, 0x96, 0x40, 0xA6, 0xFD, 0xE1, 0xA2,
7704fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xED, 0xD3, 0xAC, 0x28, 0xBE, 0xA2, 0x7D, 0xC3, 0xFF, 0x1D, 0x9F, 0x2E,
7714fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xE0, 0xA7, 0x0E, 0x90, 0xEE, 0x44, 0x25, 0x92, 0xE3, 0x54, 0xDD, 0x55,
7724fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xA3, 0xEF, 0x42, 0xF5, 0x52, 0x55, 0x41, 0x47, 0x5E, 0x00, 0xFB, 0x8B,
7734fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x47, 0x5E, 0x45, 0x49, 0xEA, 0x3D, 0x2C, 0xFD, 0x9F, 0xEC, 0xC8, 0x4E,
7744fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x4E, 0x86, 0x90, 0x31, 0x02, 0x21, 0x00, 0xE6, 0xA5, 0x55, 0xB3, 0x64,
7754fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xAB, 0x90, 0x5E, 0xA2, 0xF5, 0x6B, 0x21, 0x4B, 0x15, 0xD6, 0x4A, 0xB6,
7764fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x60, 0x24, 0x95, 0x65, 0xA2, 0xBE, 0xBA, 0x2A, 0x73, 0xFB, 0xFF, 0x2C,
7774fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x61, 0x88, 0x9D, 0x02, 0x21, 0x00, 0xD2, 0x9C, 0x5B, 0xFE, 0x82, 0xA5,
7784fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xFC, 0x52, 0x6A, 0x29, 0x38, 0xDB, 0x22, 0x3B, 0xEB, 0x74, 0x3B, 0xCA,
7794fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xB4, 0xDD, 0x1D, 0xE4, 0x48, 0x60, 0x70, 0x19, 0x9B, 0x81, 0xC1, 0x83,
7804fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x28, 0xB5, 0x02, 0x21, 0x00, 0x89, 0x2D, 0xFE, 0xF9, 0xF2, 0xBF, 0x43,
7814fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xDF, 0xB5, 0xA6, 0xA8, 0x30, 0x26, 0x1B, 0x77, 0xD7, 0xF9, 0xFE, 0xD6,
7824fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xE3, 0x70, 0x8E, 0xCA, 0x47, 0xA9, 0xA6, 0x50, 0x54, 0x25, 0xCE, 0x60,
7834fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xD5, 0x02, 0x21, 0x00, 0xBE, 0x5A, 0xF8, 0x82, 0xE6, 0xCE, 0xE3, 0x6A,
7844fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x11, 0xED, 0xC4, 0x27, 0xBB, 0x9F, 0x70, 0xC6, 0x93, 0xAC, 0x39, 0x20,
7854fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x89, 0x7D, 0xE5, 0x34, 0xD4, 0xDD, 0x30, 0x42, 0x6D, 0x07, 0x00, 0xE9,
7864fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x02, 0x20, 0x05, 0x91, 0xEF, 0x12, 0xD2, 0xD3, 0x6A, 0xD2, 0x96, 0x6B,
7874fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x10, 0x62, 0xF9, 0xBA, 0xA4, 0x91, 0x48, 0x84, 0x40, 0x61, 0x67, 0x80,
7884fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x68, 0x68, 0xC8, 0x60, 0xB3, 0x66, 0xC8, 0xF9, 0x08, 0x9A,
7894fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root};
7904fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
7914fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root/*
7926e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root * DER-encoded PKCS#8 format EC key. Generated using:
7936e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root *
7946e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root * openssl ecparam -name prime256v1 -genkey -noout | openssl pkcs8 -topk8 -nocrypt -outform der | recode ../x1
7956e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root */
7966e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Rootstatic uint8_t TEST_SIGN_EC_KEY_1[] = {
7976e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root        0x30, 0x81, 0x87, 0x02, 0x01, 0x00, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86,
7986e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root        0x48, 0xCE, 0x3D, 0x02, 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D,
7996e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root        0x03, 0x01, 0x07, 0x04, 0x6D, 0x30, 0x6B, 0x02, 0x01, 0x01, 0x04, 0x20,
8006e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root        0x9E, 0x66, 0x11, 0x6A, 0x89, 0xF5, 0x78, 0x57, 0xF3, 0x35, 0xA2, 0x46,
8016e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root        0x09, 0x06, 0x4B, 0x4D, 0x81, 0xEC, 0xD3, 0x9B, 0x0A, 0xC4, 0x68, 0x06,
8026e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root        0xB8, 0x42, 0x24, 0x5E, 0x74, 0x2C, 0x62, 0x79, 0xA1, 0x44, 0x03, 0x42,
8036e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root        0x00, 0x04, 0x35, 0xB5, 0x9A, 0x5C, 0xE5, 0x52, 0x35, 0xF2, 0x10, 0x6C,
8046e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root        0xD9, 0x98, 0x67, 0xED, 0x5E, 0xCB, 0x6B, 0xB8, 0x96, 0x5E, 0x54, 0x7C,
8056e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root        0x34, 0x2A, 0xA3, 0x3B, 0xF3, 0xD1, 0x39, 0x48, 0x36, 0x7A, 0xEA, 0xD8,
8066e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root        0xCA, 0xDD, 0x40, 0x8F, 0xE9, 0xE0, 0x95, 0x2E, 0x3F, 0x95, 0x0F, 0x14,
8076e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root        0xD6, 0x14, 0x78, 0xB5, 0xAD, 0x17, 0xD2, 0x5A, 0x41, 0x96, 0x99, 0x20,
8086e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root        0xC7, 0x5B, 0x0F, 0x60, 0xFD, 0xBA
8096e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root};
8106e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
8116e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root/*
8124fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root * PKCS#1 v1.5 padded raw "Hello, world"  Can be generated be generated by verifying
8134fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root * the signature below in no padding mode:
8144fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root *
8154fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root * openssl rsautl -keyform der -inkey rsa.der -raw -verify -in test.sig
8164fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root */
8174fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Rootstatic uint8_t TEST_SIGN_DATA_1[] = {
8184fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
8194fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
8204fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
8214fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
8224fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xFF, 0xFF, 0xFF, 0x00, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x2C, 0x20, 0x77,
8234fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x6F, 0x72, 0x6C, 0x64,
8244fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root};
8254fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
8264fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root/*
8276e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root * Signature of TEST_SIGN_DATA_1 using TEST_SIGN_RSA_KEY_1. Generated using:
8284fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root *
8294fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root * echo 'Hello, world' | openssl rsautl -keyform der -inkey rsa.der -sign | recode ../x1
8304fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root */
8316e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Rootstatic uint8_t TEST_SIGN_RSA_SIGNATURE_1[] = {
8324fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xA4, 0xBB, 0x76, 0x87, 0xFE, 0x61, 0x0C, 0x9D, 0xD6, 0xFF, 0x4B, 0x76,
8334fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x96, 0x08, 0x36, 0x23, 0x11, 0xC6, 0x44, 0x3F, 0x88, 0x77, 0x97, 0xB2,
8344fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xA8, 0x3B, 0xFB, 0x9C, 0x3C, 0xD3, 0x20, 0x65, 0xFD, 0x26, 0x3B, 0x2A,
8354fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xB8, 0xB6, 0xD4, 0xDC, 0x91, 0xF7, 0xE2, 0xDE, 0x4D, 0xF7, 0x0E, 0xB9,
8364fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x72, 0xA7, 0x29, 0x72, 0x82, 0x12, 0x7C, 0x53, 0x23, 0x21, 0xC4, 0xFF,
8374fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x79, 0xE4, 0x91, 0x40,
8384fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root};
8394fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
8404fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root/*
8416e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root * Identical to TEST_SIGN_RSA_SIGNATURE_1 except the last octet is '1' instead of '0'
8424fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root * This should fail any test.
8434fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root */
8444fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Rootstatic uint8_t TEST_SIGN_SIGNATURE_BOGUS_1[] = {
8454fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xA4, 0xBB, 0x76, 0x87, 0xFE, 0x61, 0x0C, 0x9D, 0xD6, 0xFF, 0x4B, 0x76,
8464fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x96, 0x08, 0x36, 0x23, 0x11, 0xC6, 0x44, 0x3F, 0x88, 0x77, 0x97, 0xB2,
8474fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xA8, 0x3B, 0xFB, 0x9C, 0x3C, 0xD3, 0x20, 0x65, 0xFD, 0x26, 0x3B, 0x2A,
8484fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xB8, 0xB6, 0xD4, 0xDC, 0x91, 0xF7, 0xE2, 0xDE, 0x4D, 0xF7, 0x0E, 0xB9,
8494fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x72, 0xA7, 0x29, 0x72, 0x82, 0x12, 0x7C, 0x53, 0x23, 0x21, 0xC4, 0xFF,
8504fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x79, 0xE4, 0x91, 0x41,
8514fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root};
8524fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
8534fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, SignData_RSA_Raw_Success) {
8544fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
8554fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
8564fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
8576e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
858eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
859eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
8604fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    ASSERT_EQ(0,
861eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
8624fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &key_blob, &key_blob_length))
8634fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should successfully import an RSA key";
8644fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
8654fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
8664fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    keymaster_rsa_sign_params_t params = {
8671aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe            .digest_type = DIGEST_NONE,
8681aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe            .padding_type = PADDING_NONE,
8694fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    };
8704fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
8714fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* sig;
8724fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t sig_length;
8734fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
874eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
875eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testData.get() != NULL);
876eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
877139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(0,
8784fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
879eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root                    testData.get(), testData.length(),
8804fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &sig, &sig_length))
8814fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should sign data successfully";
8824fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueBlob sig_blob(sig, sig_length);
8834fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
8846e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueBlob expected_sig(TEST_SIGN_RSA_SIGNATURE_1, sizeof(TEST_SIGN_RSA_SIGNATURE_1));
8854fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
886139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(expected_sig, sig_blob)
8874fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Generated signature should match expected signature";
8884fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
8894fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    // The expected signature is actually stack data, so don't let it try to free.
8904fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* unused __attribute__((unused)) = expected_sig.release();
8914fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
8924fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
8936e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny RootTEST_F(KeymasterTest, SignData_EC_Success) {
8946e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    uint8_t* key_blob;
8956e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    size_t key_blob_length;
8966e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
8976e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueReadOnlyBlob testKey(TEST_SIGN_EC_KEY_1, sizeof(TEST_SIGN_EC_KEY_1));
8986e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
8996e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
9006e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    ASSERT_EQ(0,
9016e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
9026e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root                    &key_blob, &key_blob_length))
9036e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            << "Should successfully import an EC key";
9046e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
9056e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
9066e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    keymaster_ec_sign_params_t params = {
9071aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe            .digest_type = DIGEST_NONE,
9086e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    };
9096e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
9106e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    uint8_t* sig;
9116e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    size_t sig_length;
9126e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
9136e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
9146e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    ASSERT_TRUE(testData.get() != NULL);
9156e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
9166e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    ASSERT_EQ(0,
9176e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
9186e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root                    testData.get(), testData.length(),
9196e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root                    &sig, &sig_length))
9206e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            << "Should sign data successfully";
9216e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueBlob sig_blob(sig, sig_length);
9226e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
9236e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    uint8_t* x509_data;
9246e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    size_t x509_data_length;
9256e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    ASSERT_EQ(0,
9266e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
9276e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root                    &x509_data, &x509_data_length))
9286e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            << "Should be able to retrieve RSA public key successfully";
9296e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueBlob x509_blob(x509_data, x509_data_length);
9306e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
9316e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    const unsigned char *tmp = static_cast<const unsigned char*>(x509_blob.get());
9326e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    Unique_EVP_PKEY expected(d2i_PUBKEY((EVP_PKEY**) NULL, &tmp,
9336e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            static_cast<long>(x509_blob.length())));
9346e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
9356e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    Unique_EC_KEY ecKey(EVP_PKEY_get1_EC_KEY(expected.get()));
9366e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
9376e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    ASSERT_EQ(1, ECDSA_verify(0, testData.get(), testData.length(), sig_blob.get(), sig_blob.length(), ecKey.get()))
9386e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            << "Signature should verify";
9396e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root}
9406e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
9414fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, SignData_RSA_Raw_InvalidSizeInput_Failure) {
9424fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
9434fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
9444fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
9456e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
946eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
947eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
9484fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    ASSERT_EQ(0,
949eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
9504fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &key_blob, &key_blob_length))
9514fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should successfully import an RSA key";
9524fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
9534fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
9544fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    keymaster_rsa_sign_params_t params = {
9551aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe            .digest_type = DIGEST_NONE,
9561aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe            .padding_type = PADDING_NONE,
9574fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    };
9584fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
9594fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* sig;
9604fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t sig_length;
9614fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
9626e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueReadOnlyBlob testData(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
963eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testData.get() != NULL);
964eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
965139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(-1,
9664fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
967eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root                    testData.get(), testData.length(),
9684fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &sig, &sig_length))
9694fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should not be able to do raw signature on incorrect size data";
9704fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
9714fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
9724fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, SignData_RSA_Raw_NullKey_Failure) {
9734fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    keymaster_rsa_sign_params_t params = {
9741aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe            .digest_type = DIGEST_NONE,
9751aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe            .padding_type = PADDING_NONE,
9764fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    };
9774fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
9784fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* sig;
9794fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t sig_length;
9804fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
9816e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueReadOnlyBlob testData(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
982eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testData.get() != NULL);
983eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
984139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(-1,
9854fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->sign_data(sDevice, &params, NULL, 0,
986eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root                    testData.get(), testData.length(),
9874fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &sig, &sig_length))
9884fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should not be able to do raw signature on incorrect size data";
9894fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
9904fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
9914fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, SignData_RSA_Raw_NullInput_Failure) {
9924fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
9934fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
9944fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
9956e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
996eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
997eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
9984fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    ASSERT_EQ(0,
999eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
10004fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &key_blob, &key_blob_length))
10014fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should successfully import an RSA key";
10024fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
10034fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
10044fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    keymaster_rsa_sign_params_t params = {
10051aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe            .digest_type = DIGEST_NONE,
10061aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe            .padding_type = PADDING_NONE,
10074fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    };
10084fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
10094fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* sig;
10104fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t sig_length;
10114fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
1012139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(-1,
10134fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
10144fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    NULL, 0,
10154fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &sig, &sig_length))
10164fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should error when input data is null";
10174fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
10184fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
10194fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, SignData_RSA_Raw_NullOutput_Failure) {
10204fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
10214fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
10224fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
10236e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
1024eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
1025eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
10264fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    ASSERT_EQ(0,
1027eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
10284fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &key_blob, &key_blob_length))
10294fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should successfully import an RSA key";
10304fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
10314fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
10324fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    keymaster_rsa_sign_params_t params = {
10331aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe            .digest_type = DIGEST_NONE,
10341aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe            .padding_type = PADDING_NONE,
10354fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    };
10364fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
10374fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* sig;
10384fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t sig_length;
10394fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
10406e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueReadOnlyBlob testData(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
1041eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testData.get() != NULL);
1042eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
1043139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(-1,
10444fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
1045eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root                    testData.get(), testData.length(),
10464fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    NULL, NULL))
10474fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should error when output is null";
10484fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
10494fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
10504fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, VerifyData_RSA_Raw_Success) {
10514fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
10524fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
10534fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
10546e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
1055eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
1056eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
10574fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    ASSERT_EQ(0,
1058eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
10594fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &key_blob, &key_blob_length))
10604fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should successfully import an RSA key";
10614fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
10624fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
10634fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    keymaster_rsa_sign_params_t params = {
10641aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe            .digest_type = DIGEST_NONE,
10651aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe            .padding_type = PADDING_NONE,
10664fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    };
10674fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
1068eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
1069eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testData.get() != NULL);
1070eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
10716e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueReadOnlyBlob testSig(TEST_SIGN_RSA_SIGNATURE_1, sizeof(TEST_SIGN_RSA_SIGNATURE_1));
1072eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testSig.get() != NULL);
1073eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
1074139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(0,
10754fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->verify_data(sDevice, &params, key_blob, key_blob_length,
1076eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root                    testData.get(), testData.length(),
1077eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root                    testSig.get(), testSig.length()))
10784fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should verify data successfully";
10794fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
10804fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
10816e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny RootTEST_F(KeymasterTest, VerifyData_EC_Raw_Success) {
10826e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    uint8_t* key_blob;
10836e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    size_t key_blob_length;
10846e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
10856e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueReadOnlyBlob testKey(TEST_SIGN_EC_KEY_1, sizeof(TEST_SIGN_EC_KEY_1));
10866e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
10876e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
10886e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    ASSERT_EQ(0,
10896e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
10906e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root                    &key_blob, &key_blob_length))
10916e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            << "Should successfully import an RSA key";
10926e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
10936e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
10946e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    keymaster_ec_sign_params_t params = {
10951aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe            .digest_type = DIGEST_NONE,
10966e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    };
10976e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
10986e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    uint8_t* sig;
10996e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    size_t sig_length;
11006e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
11016e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
11026e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    ASSERT_TRUE(testData.get() != NULL);
11036e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
11046e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    ASSERT_EQ(0,
11056e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
11066e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root                    testData.get(), testData.length(),
11076e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root                    &sig, &sig_length))
11086e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            << "Should sign data successfully";
11096e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueBlob sig_blob(sig, sig_length);
11106e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
11116e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    ASSERT_EQ(0,
11126e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            sDevice->verify_data(sDevice, &params, key_blob, key_blob_length,
11136e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root                    testData.get(), testData.length(),
11146e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root                    sig_blob.get(), sig_blob.length()))
11156e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            << "Should verify data successfully";
11166e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root}
11176e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
11184fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, VerifyData_RSA_Raw_BadSignature_Failure) {
11194fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
11204fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
11214fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
11226e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
1123eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
1124eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
11254fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    ASSERT_EQ(0,
1126eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
11274fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &key_blob, &key_blob_length))
11284fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should successfully import an RSA key";
11294fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
11304fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
11314fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    keymaster_rsa_sign_params_t params = {
11321aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe            .digest_type = DIGEST_NONE,
11331aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe            .padding_type = PADDING_NONE,
11344fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    };
11354fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
1136139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(-1,
11374fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->verify_data(sDevice, &params, key_blob, key_blob_length,
11384fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1),
11394fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    TEST_SIGN_SIGNATURE_BOGUS_1, sizeof(TEST_SIGN_SIGNATURE_BOGUS_1)))
11404fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should sign data successfully";
11414fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
11424fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
11436e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny RootTEST_F(KeymasterTest, VerifyData_EC_Raw_BadSignature_Failure) {
11446e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    uint8_t* key_blob;
11456e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    size_t key_blob_length;
11466e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
11476e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueReadOnlyBlob testKey(TEST_SIGN_EC_KEY_1, sizeof(TEST_SIGN_EC_KEY_1));
11486e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
11496e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
11506e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    ASSERT_EQ(0,
11516e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
11526e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root                    &key_blob, &key_blob_length))
11536e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            << "Should successfully import an RSA key";
11546e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
11556e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
11566e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    keymaster_ec_sign_params_t params = {
11571aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe            .digest_type = DIGEST_NONE,
11586e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    };
11596e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
11606e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    ASSERT_EQ(-1,
11616e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            sDevice->verify_data(sDevice, &params, key_blob, key_blob_length,
11626e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root                    TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1),
11636e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root                    TEST_SIGN_SIGNATURE_BOGUS_1, sizeof(TEST_SIGN_SIGNATURE_BOGUS_1)))
11646e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            << "Should sign data successfully";
11656e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root}
11666e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root
11674fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, VerifyData_RSA_Raw_NullKey_Failure) {
11684fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    keymaster_rsa_sign_params_t params = {
11691aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe            .digest_type = DIGEST_NONE,
11701aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe            .padding_type = PADDING_NONE,
11714fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    };
11724fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
1173eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
1174eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testData.get() != NULL);
1175eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
1176eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    UniqueReadOnlyBlob testSig(TEST_SIGN_SIGNATURE_BOGUS_1, sizeof(TEST_SIGN_SIGNATURE_BOGUS_1));
1177eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testSig.get() != NULL);
1178eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
1179139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(-1,
11804fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->verify_data(sDevice, &params, NULL, 0,
1181eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root                    testData.get(), testData.length(),
1182eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root                    testSig.get(), testSig.length()))
11834fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should fail when key is null";
11844fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
11854fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
11864fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, VerifyData_RSA_NullInput_Failure) {
11874fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
11884fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
11894fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
11904fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    ASSERT_EQ(0,
11916e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root            sDevice->import_keypair(sDevice, TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1),
11924fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &key_blob, &key_blob_length))
11934fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should successfully import an RSA key";
11944fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
11954fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
11964fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    keymaster_rsa_sign_params_t params = {
11971aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe            .digest_type = DIGEST_NONE,
11981aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe            .padding_type = PADDING_NONE,
11994fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    };
12004fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
12016e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueReadOnlyBlob testSig(TEST_SIGN_RSA_SIGNATURE_1, sizeof(TEST_SIGN_RSA_SIGNATURE_1));
1202eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testSig.get() != NULL);
1203eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
1204139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(-1,
12054fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->verify_data(sDevice, &params, key_blob, key_blob_length,
12064fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    NULL, 0,
1207eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root                    testSig.get(), testSig.length()))
12084fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should fail on null input";
12094fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
12104fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
12114fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, VerifyData_RSA_NullSignature_Failure) {
12124fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
12134fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
12144fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
12156e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
1216eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
1217eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
12184fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    ASSERT_EQ(0,
1219eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
12204fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &key_blob, &key_blob_length))
12214fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should successfully import an RSA key";
12224fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
12234fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
12244fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    keymaster_rsa_sign_params_t params = {
12251aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe            .digest_type = DIGEST_NONE,
12261aa58f9ef95e0c15bd3e41bb987dd6d8f48aa978Andreas Gampe            .padding_type = PADDING_NONE,
12274fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    };
12284fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
1229eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
1230eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testData.get() != NULL);
1231eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
1232139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(-1,
12334fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->verify_data(sDevice, &params, key.get(), key.length(),
1234eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root                    testData.get(), testData.length(),
12354fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    NULL, 0))
12364fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should fail on null signature";
12374fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
12384fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
12398ae65e71996ce871cda97cc9114cb5211cb273bfKenny RootTEST_F(KeymasterTest, EraseAll_Success) {
12408ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root    uint8_t *key1_blob, *key2_blob;
12418ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root    size_t key1_blob_length, key2_blob_length;
12428ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root
12438ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root    // Only test this if the device says it supports delete_all
12448ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root    if (sDevice->delete_all == NULL) {
12458ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root        return;
12468ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root    }
12478ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root
12486e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
1249eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
1250eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
12518ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root    ASSERT_EQ(0,
1252eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
12538ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root                    &key1_blob, &key1_blob_length))
12548ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root            << "Should successfully import an RSA key";
12558ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root    UniqueKey key1(&sDevice, key1_blob, key1_blob_length);
12568ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root
12576e1683f5d508a4c1ff761a9a3508619ac5ac6ed7Kenny Root    UniqueReadOnlyBlob testKey2(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
1258eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testKey2.get() != NULL);
1259eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
12608ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root    ASSERT_EQ(0,
1261eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            sDevice->import_keypair(sDevice, testKey2.get(), testKey2.length(),
12628ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root                    &key2_blob, &key2_blob_length))
12638ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root            << "Should successfully import an RSA key";
12648ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root    UniqueKey key2(&sDevice, key2_blob, key2_blob_length);
12658ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root
1266139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(0, sDevice->delete_all(sDevice))
12678ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root            << "Should erase all keys";
12688ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root
12698ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root    key1.reset();
12708ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root
12718ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root    uint8_t* x509_data;
12728ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root    size_t x509_data_length;
12738ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root    ASSERT_EQ(-1,
12748ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root            sDevice->get_keypair_public(sDevice, key1_blob, key1_blob_length,
12758ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root                    &x509_data, &x509_data_length))
12768ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root            << "Should be able to retrieve RSA public key 1 successfully";
12778ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root
12788ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root    ASSERT_EQ(-1,
12798ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root            sDevice->get_keypair_public(sDevice, key2_blob, key2_blob_length,
12808ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root                    &x509_data, &x509_data_length))
12818ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root            << "Should be able to retrieve RSA public key 2 successfully";
12828ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root}
12838ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root
12844fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
1285