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>
35eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root#include <utils/UniquePtr.h>
36eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
37eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root#include <hardware/keymaster.h>
384fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
394fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Rootnamespace android {
404fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
414fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Rootclass UniqueBlob : public UniquePtr<uint8_t[]> {
424fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Rootpublic:
43eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    UniqueBlob(size_t length) :
44eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            mLength(length) {
45eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    }
46eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
474fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueBlob(uint8_t* bytes, size_t length) :
484fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            UniquePtr<uint8_t[]>(bytes), mLength(length) {
494fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    }
504fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
514fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    bool operator==(const UniqueBlob &other) const {
524fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        if (other.length() != mLength) {
534fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            return false;
544fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        }
554fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
564fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        const uint8_t* mine = get();
574fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        const uint8_t* theirs = other.get();
584fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
594fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        for (size_t i = 0; i < mLength; i++) {
604fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            if (mine[i] != theirs[i]) {
614fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                return false;
624fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            }
634fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        }
644fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
654fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        return true;
664fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    }
674fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
684fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t length() const {
694fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        return mLength;
704fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    }
714fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
724fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    friend std::ostream &operator<<(std::ostream &stream, const UniqueBlob& blob);
734fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
744fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Rootprivate:
754fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t mLength;
764fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root};
774fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
784fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Rootstd::ostream &operator<<(std::ostream &stream, const UniqueBlob& blob) {
794fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    const size_t length = blob.mLength;
804fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    stream << "Blob length=" << length << " < ";
814fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
824fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    const uint8_t* data = blob.get();
834fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    for (size_t i = 0; i < length; i++) {
844fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        stream << std::hex << std::setw(2) << std::setfill('0')
854fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                << static_cast<unsigned int>(data[i]) << ' ';
864fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    }
874fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    stream << '>' << std::endl;
884fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
894fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    return stream;
904fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
914fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
924fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Rootclass UniqueKey : public UniqueBlob {
934fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Rootpublic:
944fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueKey(keymaster_device_t** dev, uint8_t* bytes, size_t length) :
954fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            UniqueBlob(bytes, length), mDevice(dev) {
964fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    }
974fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
984fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    ~UniqueKey() {
994fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        if (mDevice != NULL && *mDevice != NULL) {
1004fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            keymaster_device_t* dev = *mDevice;
1014fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            if (dev->delete_keypair != NULL) {
1024fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                dev->delete_keypair(dev, get(), length());
1034fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            }
1044fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        }
1054fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    }
1064fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
1074fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Rootprivate:
1084fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    keymaster_device_t** mDevice;
1094fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root};
1104fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
111eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Rootclass UniqueReadOnlyBlob {
112eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Rootpublic:
113eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    UniqueReadOnlyBlob(uint8_t* data, size_t dataSize) :
114eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            mDataSize(dataSize) {
115eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        int pageSize = sysconf(_SC_PAGE_SIZE);
116eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        if (pageSize == -1) {
117eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            return;
118eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        }
119eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
120eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        int fd = open("/dev/zero", O_RDONLY);
121eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        if (fd == -1) {
122eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            return;
123eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        }
124eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
125eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        mBufferSize = (dataSize + pageSize - 1) & ~(pageSize - 1);
126eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        uint8_t* buffer = (uint8_t*) mmap(NULL, mBufferSize, PROT_READ | PROT_WRITE,
127eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root                                          MAP_PRIVATE, fd, 0);
128eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        close(fd);
129eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
130eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        if (buffer == NULL) {
131eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            return;
132eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        }
133eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
134eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        memcpy(buffer, data, dataSize);
135eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        if (mprotect(buffer, mBufferSize, PROT_READ) == -1) {
136eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            munmap(buffer, mBufferSize);
137eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            return;
138eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        }
139eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
140eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        mBuffer = buffer;
141eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    }
142eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
143eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ~UniqueReadOnlyBlob() {
144eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        munmap(mBuffer, mBufferSize);
145eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    }
146eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
147eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    uint8_t* get() const {
148eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        return mBuffer;
149eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    }
150eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
151eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    size_t length() const {
152eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root        return mDataSize;
153eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    }
154eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
155eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Rootprivate:
156eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    uint8_t* mBuffer;
157eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    size_t mBufferSize;
158eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    size_t mDataSize;
159eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root};
160eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
1618467a6d2918274295212d07fc6e3894f6bc5d623Kenny Rootstruct BIGNUM_Delete {
1628467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    void operator()(BIGNUM* p) const {
1638467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root        BN_free(p);
1648467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    }
1658467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root};
1668467a6d2918274295212d07fc6e3894f6bc5d623Kenny Roottypedef UniquePtr<BIGNUM, BIGNUM_Delete> Unique_BIGNUM;
1678467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root
1688467a6d2918274295212d07fc6e3894f6bc5d623Kenny Rootstruct EVP_PKEY_Delete {
1698467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    void operator()(EVP_PKEY* p) const {
1708467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root        EVP_PKEY_free(p);
1718467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    }
1728467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root};
1738467a6d2918274295212d07fc6e3894f6bc5d623Kenny Roottypedef UniquePtr<EVP_PKEY, EVP_PKEY_Delete> Unique_EVP_PKEY;
1748467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root
1758467a6d2918274295212d07fc6e3894f6bc5d623Kenny Rootstruct PKCS8_PRIV_KEY_INFO_Delete {
1768467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    void operator()(PKCS8_PRIV_KEY_INFO* p) const {
1778467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root        PKCS8_PRIV_KEY_INFO_free(p);
1788467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    }
1798467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root};
1808467a6d2918274295212d07fc6e3894f6bc5d623Kenny Roottypedef UniquePtr<PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO_Delete> Unique_PKCS8_PRIV_KEY_INFO;
1818467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root
1828467a6d2918274295212d07fc6e3894f6bc5d623Kenny Rootstruct RSA_Delete {
1838467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    void operator()(RSA* p) const {
1848467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root        RSA_free(p);
1858467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    }
1868467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root};
1878467a6d2918274295212d07fc6e3894f6bc5d623Kenny Roottypedef UniquePtr<RSA, RSA_Delete> Unique_RSA;
1888467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root
1892541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Rootstruct EC_KEY_Delete {
1902541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    void operator()(EC_KEY* p) const {
1912541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root        EC_KEY_free(p);
1922541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    }
1932541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root};
1942541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Roottypedef UniquePtr<EC_KEY, EC_KEY_Delete> Unique_EC_KEY;
1952541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
1962541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
1974fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root/*
1984fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root * DER-encoded PKCS#8 format RSA key. Generated using:
1994fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root *
2004fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root * openssl genrsa 2048 | openssl pkcs8 -topk8 -nocrypt -outform der | recode ../x1
2014fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root */
2022541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Rootstatic uint8_t TEST_RSA_KEY_1[] = {
2034fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x30, 0x82, 0x04, 0xBE, 0x02, 0x01, 0x00, 0x30, 0x0D, 0x06, 0x09, 0x2A,
2044fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82,
2054fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x04, 0xA8, 0x30, 0x82, 0x04, 0xA4, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01,
2064fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x01, 0x00, 0xD8, 0x58, 0xD4, 0x9F, 0xC0, 0xE8, 0xF0, 0xFF, 0x87, 0x27,
2074fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x43, 0xE6, 0x2E, 0xE6, 0x9A, 0x42, 0x3B, 0x39, 0x94, 0x84, 0x43, 0x55,
2084fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x8D, 0x20, 0x5B, 0x71, 0x88, 0xE6, 0xD1, 0x62, 0xC8, 0xF2, 0x20, 0xD0,
2094fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x75, 0x13, 0x83, 0xA3, 0x5D, 0x19, 0xA8, 0x62, 0xD0, 0x5F, 0x3E, 0x8A,
2104fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x7C, 0x0E, 0x26, 0xA9, 0xFF, 0xB2, 0x5E, 0x63, 0xAA, 0x3C, 0x8D, 0x13,
2114fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x41, 0xAA, 0xD5, 0x03, 0x01, 0x01, 0x53, 0xC9, 0x02, 0x1C, 0xEC, 0xE8,
2124fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xC4, 0x70, 0x3F, 0x43, 0xE5, 0x51, 0xD0, 0x6E, 0x52, 0x0B, 0xC4, 0x0A,
2134fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xA3, 0x61, 0xDE, 0xE3, 0x72, 0x0C, 0x94, 0xF1, 0x1C, 0x2D, 0x36, 0x77,
2144fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xBB, 0x16, 0xA8, 0x63, 0x4B, 0xD1, 0x07, 0x00, 0x42, 0x2D, 0x2B, 0x10,
2154fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x80, 0x45, 0xF3, 0x0C, 0xF9, 0xC5, 0xAC, 0xCC, 0x64, 0x87, 0xFD, 0x5D,
2164fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xC8, 0x51, 0xD4, 0x1C, 0x9E, 0x6E, 0x9B, 0xC4, 0x27, 0x5E, 0x73, 0xA7,
2174fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x2A, 0xF6, 0x90, 0x42, 0x0C, 0x34, 0x93, 0xB7, 0x02, 0x19, 0xA9, 0x64,
2184fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x6C, 0x46, 0x3B, 0x40, 0x02, 0x2F, 0x54, 0x69, 0x79, 0x26, 0x7D, 0xF6,
2194fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x85, 0x90, 0x01, 0xD0, 0x21, 0x07, 0xD0, 0x14, 0x00, 0x65, 0x9C, 0xAC,
2204fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x24, 0xE8, 0x78, 0x42, 0x3B, 0x90, 0x75, 0x19, 0x55, 0x11, 0x4E, 0xD9,
2214fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xE6, 0x97, 0x87, 0xBC, 0x8D, 0x2C, 0x9B, 0xF0, 0x1F, 0x14, 0xEB, 0x6A,
2224fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x57, 0xCE, 0x78, 0xAD, 0xCE, 0xD9, 0xFB, 0xB9, 0xA1, 0xEF, 0x0C, 0x1F,
2234fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xDD, 0xE3, 0x5B, 0x73, 0xA0, 0xEC, 0x37, 0x9C, 0xE1, 0xFD, 0x86, 0x28,
2244fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xC3, 0x4A, 0x42, 0xD0, 0xA3, 0xFE, 0x57, 0x09, 0x29, 0xD8, 0xF6, 0xEC,
2254fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xE3, 0xC0, 0x71, 0x7C, 0x29, 0x27, 0xC2, 0xD1, 0x3E, 0x22, 0xBC, 0xBD,
2264fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x5A, 0x85, 0x41, 0xF6, 0x15, 0xDA, 0x0C, 0x58, 0x5A, 0x61, 0x5B, 0x78,
2274fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xB8, 0xAA, 0xEC, 0x5C, 0x1C, 0x79, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02,
2284fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x82, 0x01, 0x00, 0x1D, 0x10, 0x31, 0xE0, 0x14, 0x26, 0x36, 0xD9, 0xDC,
2294fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xEA, 0x25, 0x70, 0xF2, 0xB3, 0xFF, 0xDD, 0x0D, 0xDF, 0xBA, 0x57, 0xDA,
2304fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x43, 0xCF, 0xE5, 0x9C, 0xE3, 0x2F, 0xA4, 0xF2, 0x53, 0xF6, 0xF2, 0xAF,
2314fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xFD, 0xD0, 0xFC, 0x82, 0x1E, 0x9C, 0x0F, 0x2A, 0x53, 0xBB, 0xF2, 0x4F,
2324fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x90, 0x83, 0x01, 0xD3, 0xA7, 0xDA, 0xB5, 0xB7, 0x80, 0x64, 0x0A, 0x26,
2334fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x59, 0x83, 0xE4, 0xD3, 0x20, 0xC8, 0x2D, 0xC9, 0x77, 0xA3, 0x55, 0x07,
2344fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x6E, 0x6D, 0x95, 0x36, 0xAA, 0x84, 0x4F, 0xED, 0x54, 0x24, 0xA9, 0x77,
2354fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xF8, 0x85, 0xE2, 0x4B, 0xF2, 0xFA, 0x0B, 0x3E, 0xA6, 0xF5, 0x46, 0x0D,
2364fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x9F, 0x1F, 0xFE, 0xF7, 0x37, 0xFF, 0xA3, 0x60, 0xF1, 0x63, 0xF2, 0x75,
2374fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x6A, 0x8E, 0x10, 0xD7, 0x89, 0xD2, 0xB3, 0xFF, 0x76, 0xA5, 0xBA, 0xAF,
2384fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x0A, 0xBE, 0x32, 0x5F, 0xF0, 0x48, 0x48, 0x4B, 0x9C, 0x9A, 0x3D, 0x12,
2394fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xA7, 0xD2, 0x07, 0xC7, 0x59, 0x32, 0x94, 0x95, 0x65, 0x2F, 0x87, 0x34,
2404fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x76, 0xBA, 0x7C, 0x08, 0x4B, 0xAB, 0xA6, 0x24, 0xDF, 0x64, 0xDB, 0x48,
2414fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x63, 0x42, 0x06, 0xE2, 0x2C, 0x3D, 0xFB, 0xE5, 0x47, 0x81, 0x94, 0x98,
2424fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xF7, 0x32, 0x4B, 0x28, 0xEB, 0x42, 0xB8, 0xE9, 0x8E, 0xFC, 0xC9, 0x43,
2434fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xC9, 0x47, 0xE6, 0xE7, 0x1C, 0xDC, 0x71, 0xEF, 0x4D, 0x8A, 0xB1, 0xFC,
2444fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x45, 0x37, 0xEC, 0xB3, 0x16, 0x88, 0x5B, 0xE2, 0xEC, 0x8B, 0x6B, 0x75,
2454fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x16, 0xBE, 0x6B, 0xF8, 0x2C, 0xF8, 0xC9, 0xD1, 0xF7, 0x55, 0x87, 0x57,
2464fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x5F, 0xDE, 0xF4, 0x7E, 0x72, 0x13, 0x06, 0x2A, 0x21, 0xB7, 0x78, 0x21,
2474fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x05, 0xFD, 0xE2, 0x5F, 0x7B, 0x7C, 0xF0, 0x26, 0x2B, 0x75, 0x7F, 0x68,
2484fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xF9, 0xA6, 0x98, 0xFD, 0x54, 0x0E, 0xCC, 0x22, 0x41, 0x7F, 0x29, 0x81,
2494fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x2F, 0xA3, 0x3C, 0x3D, 0x64, 0xC8, 0x41, 0x02, 0x81, 0x81, 0x00, 0xFA,
2504fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xFA, 0xE4, 0x2E, 0x30, 0xF0, 0x7A, 0x8D, 0x95, 0xB8, 0x39, 0x58, 0x27,
2514fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x0F, 0x89, 0x0C, 0xDF, 0xFE, 0x2F, 0x55, 0x3B, 0x6F, 0xDD, 0x5F, 0x12,
2524fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xB3, 0xD1, 0xCF, 0x5B, 0x8D, 0xB6, 0x10, 0x1C, 0x87, 0x0C, 0x30, 0x89,
2534fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x2D, 0xBB, 0xB8, 0xA1, 0x78, 0x0F, 0x54, 0xA6, 0x36, 0x46, 0x05, 0x8B,
2544fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x5A, 0xFF, 0x48, 0x03, 0x13, 0xAE, 0x95, 0x96, 0x5D, 0x6C, 0xDA, 0x5D,
2554fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xF7, 0xAD, 0x1D, 0x33, 0xED, 0x23, 0xF5, 0x4B, 0x03, 0x78, 0xE7, 0x50,
2564fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xD1, 0x2D, 0x95, 0x22, 0x35, 0x02, 0x5B, 0x4A, 0x4E, 0x73, 0xC9, 0xB7,
2574fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x05, 0xC4, 0x21, 0x86, 0x1F, 0x1E, 0x40, 0x83, 0xBC, 0x8A, 0x3A, 0x95,
2584fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x24, 0x62, 0xF4, 0x58, 0x38, 0x64, 0x4A, 0x89, 0x8A, 0x27, 0x59, 0x12,
2594fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x9D, 0x21, 0xC3, 0xA6, 0x42, 0x1E, 0x2A, 0x3F, 0xD8, 0x65, 0x1F, 0x6E,
2604fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x3E, 0x4D, 0x5C, 0xCC, 0xEA, 0x8E, 0x15, 0x02, 0x81, 0x81, 0x00, 0xDC,
2614fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xAC, 0x9B, 0x00, 0xDB, 0xF9, 0xB2, 0xBF, 0xC4, 0x5E, 0xB6, 0xB7, 0x63,
2624fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xEB, 0x13, 0x4B, 0xE2, 0xA6, 0xC8, 0x72, 0x90, 0xD8, 0xC2, 0x33, 0x33,
2634fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xF0, 0x66, 0x75, 0xBD, 0x50, 0x7C, 0xA4, 0x8F, 0x82, 0xFB, 0xFF, 0x44,
2644fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x3B, 0xE7, 0x15, 0x3A, 0x0C, 0x7A, 0xF8, 0x92, 0x86, 0x4A, 0x79, 0x32,
2654fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x08, 0x82, 0x1D, 0x6A, 0xBA, 0xAD, 0x8A, 0xB3, 0x3D, 0x7F, 0xA5, 0xB4,
2664fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x6F, 0x67, 0x86, 0x7E, 0xB2, 0x9C, 0x2A, 0xF6, 0x7C, 0x49, 0x21, 0xC5,
2674fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x3F, 0x00, 0x3F, 0x9B, 0xF7, 0x0F, 0x6C, 0x35, 0x80, 0x75, 0x73, 0xC0,
2684fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xF8, 0x3E, 0x30, 0x5F, 0x74, 0x2F, 0x15, 0x41, 0xEA, 0x0F, 0xCE, 0x0E,
2694fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x18, 0x17, 0x68, 0xBA, 0xC4, 0x29, 0xF2, 0xE2, 0x2C, 0x1D, 0x55, 0x83,
2704fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xB6, 0x64, 0x2E, 0x03, 0x12, 0xA4, 0x0D, 0xBF, 0x4F, 0x2E, 0xBE, 0x7C,
2714fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x41, 0xD9, 0xCD, 0xD0, 0x52, 0x91, 0xD5, 0x02, 0x81, 0x81, 0x00, 0xD4,
2724fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x55, 0xEB, 0x32, 0xC1, 0x28, 0xD3, 0x26, 0x72, 0x22, 0xB8, 0x31, 0x42,
2734fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x6A, 0xBC, 0x52, 0x6E, 0x37, 0x48, 0xA8, 0x5D, 0x6E, 0xD8, 0xE5, 0x14,
2744fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x97, 0x99, 0xCC, 0x4A, 0xF2, 0xEB, 0xB3, 0x59, 0xCF, 0x4F, 0x9A, 0xC8,
2754fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x94, 0x2E, 0x9B, 0x97, 0xD0, 0x51, 0x78, 0x16, 0x5F, 0x18, 0x82, 0x9C,
2764fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x51, 0xD2, 0x64, 0x84, 0x65, 0xE4, 0x70, 0x9E, 0x14, 0x50, 0x81, 0xB6,
2774fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xBA, 0x52, 0x75, 0xC0, 0x76, 0xC2, 0xD3, 0x46, 0x31, 0x9B, 0xDA, 0x67,
2784fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xDF, 0x71, 0x27, 0x19, 0x17, 0xAB, 0xF4, 0xBC, 0x3A, 0xFF, 0x6F, 0x0B,
2794fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x2F, 0x0F, 0xAE, 0x25, 0x20, 0xB2, 0xA1, 0x76, 0x52, 0xCE, 0xC7, 0x9D,
2804fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x62, 0x79, 0x6D, 0xAC, 0x2D, 0x99, 0x7C, 0x0E, 0x3D, 0x19, 0xE9, 0x1B,
2814fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xFC, 0x60, 0x92, 0x7C, 0x58, 0xB7, 0xD8, 0x9A, 0xC7, 0x63, 0x56, 0x62,
2824fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x18, 0xC7, 0xAE, 0xD9, 0x97, 0x1F, 0xB9, 0x02, 0x81, 0x81, 0x00, 0x91,
2834fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x40, 0xC4, 0x1E, 0x82, 0xAD, 0x0F, 0x6D, 0x8E, 0xD2, 0x51, 0x2E, 0xD1,
2844fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x84, 0x30, 0x85, 0x68, 0xC1, 0x23, 0x7B, 0xD5, 0xBF, 0xF7, 0xC4, 0x40,
2854fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x51, 0xE2, 0xFF, 0x69, 0x07, 0x8B, 0xA3, 0xBE, 0x1B, 0x17, 0xC8, 0x64,
2864fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x9F, 0x91, 0x71, 0xB5, 0x6D, 0xF5, 0x9B, 0x9C, 0xC6, 0xEC, 0x4A, 0x6E,
2874fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x16, 0x8F, 0x9E, 0xD1, 0x5B, 0xE3, 0x53, 0x42, 0xBC, 0x1E, 0x43, 0x72,
2884fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x4B, 0x4A, 0x37, 0x8B, 0x3A, 0x01, 0xF5, 0x7D, 0x9D, 0x3D, 0x7E, 0x0F,
2894fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x19, 0x73, 0x0E, 0x6B, 0x98, 0xE9, 0xFB, 0xEE, 0x13, 0x8A, 0x3C, 0x11,
2904fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x2E, 0xD5, 0xB0, 0x7D, 0x84, 0x3A, 0x61, 0xA1, 0xAB, 0x71, 0x8F, 0xCE,
2914fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x53, 0x29, 0x45, 0x74, 0x7A, 0x1E, 0xAA, 0x93, 0x19, 0x3A, 0x8D, 0xC9,
2924fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x4E, 0xCB, 0x0E, 0x46, 0x53, 0x84, 0xCC, 0xCF, 0xBA, 0x4D, 0x28, 0x71,
2934fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x1D, 0xDF, 0x41, 0xCB, 0xF8, 0x2D, 0xA9, 0x02, 0x81, 0x80, 0x04, 0x8B,
2944fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x4A, 0xEA, 0xBD, 0x39, 0x0B, 0x96, 0xC5, 0x1D, 0xA4, 0x47, 0xFD, 0x46,
2954fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xD2, 0x8A, 0xEA, 0x2A, 0xF3, 0x9D, 0x3A, 0x7E, 0x16, 0x74, 0xFC, 0x13,
2964fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xDE, 0x4D, 0xA9, 0x85, 0x42, 0x33, 0x02, 0x92, 0x0B, 0xB6, 0xDB, 0x7E,
2974fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xEA, 0x85, 0xC2, 0x94, 0x43, 0x52, 0x37, 0x5A, 0x77, 0xAB, 0xCB, 0x61,
2984fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x88, 0xDE, 0xF8, 0xFA, 0xDB, 0xE8, 0x0B, 0x95, 0x7D, 0x39, 0x19, 0xA2,
2994fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x89, 0xB9, 0x32, 0xB2, 0x50, 0x38, 0xF7, 0x88, 0x69, 0xFD, 0xA4, 0x63,
3004fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x1F, 0x9B, 0x03, 0xD8, 0xA6, 0x7A, 0x05, 0x76, 0x02, 0x28, 0x93, 0x82,
3014fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x73, 0x7F, 0x14, 0xCC, 0xBE, 0x29, 0x10, 0xAD, 0x8A, 0x2E, 0xAC, 0xED,
3024fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x11, 0xA7, 0x72, 0x7C, 0x60, 0x78, 0x72, 0xFB, 0x78, 0x20, 0x18, 0xC9,
3034fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x7E, 0x63, 0xAD, 0x55, 0x54, 0x51, 0xDB, 0x9F, 0x7B, 0xD4, 0x8F, 0xB2,
3044fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xDE, 0x3B, 0xF1, 0x70, 0x23, 0xE5,
3054fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root};
3064fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
3074fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root/*
3082541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root * DER-encoded PKCS#8 format EC key. Generated using:
3092541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root *
3102541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root * openssl ecparam -name prime256v1 -genkey -noout | openssl pkcs8 -topk8 -nocrypt -outform der | recode ../x1
3112541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root */
3122541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Rootstatic uint8_t TEST_EC_KEY_1[] = {
3132541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root        0x30, 0x81, 0x87, 0x02, 0x01, 0x00, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86,
3142541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root        0x48, 0xCE, 0x3D, 0x02, 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D,
3152541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root        0x03, 0x01, 0x07, 0x04, 0x6D, 0x30, 0x6B, 0x02, 0x01, 0x01, 0x04, 0x20,
3162541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root        0x25, 0xAC, 0x77, 0x2B, 0x04, 0x33, 0xC8, 0x16, 0x59, 0xA3, 0xC7, 0xE7,
3172541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root        0x11, 0x42, 0xD0, 0x11, 0x71, 0x30, 0x7B, 0xB8, 0xD2, 0x67, 0xFF, 0x9C,
3182541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root        0x5F, 0x50, 0x2E, 0xAB, 0x67, 0xD4, 0x17, 0x51, 0xA1, 0x44, 0x03, 0x42,
3192541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root        0x00, 0x04, 0xCF, 0xCE, 0xB8, 0x7F, 0x88, 0x36, 0xC4, 0xF8, 0x51, 0x29,
3202541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root        0xE2, 0xA7, 0x21, 0xC3, 0x3B, 0xFF, 0x88, 0xE3, 0x87, 0x98, 0xD1, 0xA6,
3212541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root        0x4B, 0xB3, 0x4B, 0xD5, 0x44, 0xF8, 0xE0, 0x43, 0x6B, 0x50, 0x74, 0xFB,
3222541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root        0xB0, 0xAD, 0x41, 0x1C, 0x11, 0x9D, 0xC6, 0x1E, 0x83, 0x8C, 0x49, 0xCA,
3232541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root        0xBE, 0xC6, 0xCE, 0xB6, 0xC9, 0xA1, 0xBF, 0x69, 0xA9, 0xA0, 0xA3, 0x80,
3242541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root        0x14, 0x39, 0x57, 0x94, 0xDA, 0x5D
3252541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root};
3262541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
3272541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
3282541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root/*
3294fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root * Generated using keys on the keyboard and lack of imagination.
3304fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root */
3314fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Rootstatic unsigned char BOGUS_KEY_1[] = { 0xFF, 0xFF, 0xFF, 0xFF };
3324fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
3334fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
3348467a6d2918274295212d07fc6e3894f6bc5d623Kenny Rootclass KeymasterBaseTest : public ::testing::Test {
3358467a6d2918274295212d07fc6e3894f6bc5d623Kenny Rootpublic:
3364fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    static void SetUpTestCase() {
3374fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        const hw_module_t* mod;
3384fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        ASSERT_EQ(0, hw_get_module_by_class(KEYSTORE_HARDWARE_MODULE_ID, NULL, &mod))
3394fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                << "Should be able to find a keymaster hardware module";
3404fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
3414fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        std::cout << "Using keymaster module: " << mod->name << std::endl;
3424fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
3434fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        ASSERT_EQ(0, keymaster_open(mod, &sDevice))
3444fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                << "Should be able to open the keymaster device";
3454fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
346c124b23f94a0a88e872253720c0e27594a9a9938Kenny Root        ASSERT_EQ(KEYMASTER_MODULE_API_VERSION_0_2, mod->module_api_version)
3472541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root                << "Keymaster should implement API version 2";
3482541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
3494fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        ASSERT_TRUE(sDevice->generate_keypair != NULL)
3504fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                << "Should implement generate_keypair";
3514fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
3524fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        ASSERT_TRUE(sDevice->import_keypair != NULL)
3534fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                << "Should implement import_keypair";
3544fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
3554fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        ASSERT_TRUE(sDevice->get_keypair_public != NULL)
3564fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                << "Should implement get_keypair_public";
3574fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
3584fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        ASSERT_TRUE(sDevice->sign_data != NULL)
3594fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                << "Should implement sign_data";
3604fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
3614fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        ASSERT_TRUE(sDevice->verify_data != NULL)
3624fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                << "Should implement verify_data";
3634fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    }
3644fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
3654fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    static void TearDownTestCase() {
3664fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        ASSERT_EQ(0, keymaster_close(sDevice));
3674fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    }
3684fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
3698467a6d2918274295212d07fc6e3894f6bc5d623Kenny Rootprotected:
3708467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    static keymaster_device_t* sDevice;
3718467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root};
3724fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
3738467a6d2918274295212d07fc6e3894f6bc5d623Kenny Rootkeymaster_device_t* KeymasterBaseTest::sDevice = NULL;
3744fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
3758467a6d2918274295212d07fc6e3894f6bc5d623Kenny Rootclass KeymasterTest : public KeymasterBaseTest {
3764fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root};
3774fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
3782541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Rootclass KeymasterAllTypesTest : public KeymasterBaseTest,
3792541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root                              public ::testing::WithParamInterface<keymaster_keypair_t> {
3802541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root};
3812541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
3822541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Rootclass KeymasterGenerateRSATest : public KeymasterBaseTest,
3838467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root                              public ::testing::WithParamInterface<uint32_t> {
3848467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root};
3854fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
3862541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Rootclass KeymasterGenerateDSATest : public KeymasterBaseTest,
3872541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root                              public ::testing::WithParamInterface<uint32_t> {
3882541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root};
3892541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
3902541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Rootclass KeymasterGenerateECTest : public KeymasterBaseTest,
3912541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root                              public ::testing::WithParamInterface<uint32_t> {
3922541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root};
3932541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
3942541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny RootTEST_P(KeymasterGenerateRSATest, GenerateKeyPair_RSA_Success) {
3954fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    keymaster_keypair_t key_type = TYPE_RSA;
3964fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    keymaster_rsa_keygen_params_t params = {
3978467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root            modulus_size: GetParam(),
3988467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root            public_exponent: RSA_F4,
3994fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    };
4004fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
4014fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
4024fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
4034fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
404139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(0,
4054fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->generate_keypair(sDevice, key_type, &params, &key_blob, &key_blob_length))
4062541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            << "Should generate an RSA key with " << GetParam() << " bit modulus size";
4074fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
4084fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
4098467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    uint8_t* x509_data = NULL;
4108467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    size_t x509_data_length;
411139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(0,
4128467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root            sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
4138467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root                    &x509_data, &x509_data_length))
4148467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root            << "Should be able to retrieve RSA public key successfully";
4158467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    UniqueBlob x509_blob(x509_data, x509_data_length);
4168467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    ASSERT_FALSE(x509_blob.get() == NULL)
4178467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root            << "X509 data should be allocated";
4184fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
4198467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    const unsigned char *tmp = static_cast<const unsigned char*>(x509_blob.get());
4208467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    Unique_EVP_PKEY actual(d2i_PUBKEY((EVP_PKEY**) NULL, &tmp,
4218467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root            static_cast<long>(x509_blob.length())));
4224fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
4238467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    ASSERT_EQ(EVP_PKEY_RSA, EVP_PKEY_type(actual.get()->type))
4248467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root            << "Generated key type should be of type RSA";
4254fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
4268467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    Unique_RSA rsa(EVP_PKEY_get1_RSA(actual.get()));
4278467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    ASSERT_FALSE(rsa.get() == NULL)
4288467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root            << "Should be able to extract RSA key from EVP_PKEY";
4294fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
430139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(static_cast<unsigned long>(RSA_F4), BN_get_word(rsa.get()->e))
4318467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root            << "Exponent should be RSA_F4";
4324fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
4332541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    ASSERT_EQ((GetParam() + 7) / 8, static_cast<uint32_t>(RSA_size(rsa.get())))
4348467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root            << "Modulus size should be the specified parameter";
4354fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
4364fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
4378467a6d2918274295212d07fc6e3894f6bc5d623Kenny RootINSTANTIATE_TEST_CASE_P(RSA,
4382541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root                        KeymasterGenerateRSATest,
43963b64337fbaa10b282f85a7e887b40ced6d6d632Brian Carlstrom                        ::testing::Values(512U, 1024U, 2048U, 3072U, 4096U));
4408467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root
4412541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
4422541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny RootTEST_P(KeymasterGenerateECTest, GenerateKeyPair_EC_Success) {
4432541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    keymaster_keypair_t key_type = TYPE_EC;
4442541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    keymaster_ec_keygen_params_t params = {
4452541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            field_size: GetParam(),
4462541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    };
4472541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
4482541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    uint8_t* key_blob;
4492541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    size_t key_blob_length;
4502541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
4512541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    ASSERT_EQ(0,
4522541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            sDevice->generate_keypair(sDevice, key_type, &params, &key_blob, &key_blob_length))
4532541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            << "Should generate an EC key with " << GetParam() << " field size";
4542541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
4552541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
4562541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    uint8_t* x509_data = NULL;
4572541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    size_t x509_data_length;
4582541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    ASSERT_EQ(0,
4592541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
4602541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root                    &x509_data, &x509_data_length))
4612541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            << "Should be able to retrieve EC public key successfully";
4622541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueBlob x509_blob(x509_data, x509_data_length);
4632541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    ASSERT_FALSE(x509_blob.get() == NULL)
4642541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            << "X509 data should be allocated";
4652541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
4662541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    const unsigned char *tmp = static_cast<const unsigned char*>(x509_blob.get());
4672541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    Unique_EVP_PKEY actual(d2i_PUBKEY((EVP_PKEY**) NULL, &tmp,
4682541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            static_cast<long>(x509_blob.length())));
4692541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
4702541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    ASSERT_EQ(EVP_PKEY_EC, EVP_PKEY_type(actual.get()->type))
4712541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            << "Generated key type should be of type EC";
4722541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
4732541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    Unique_EC_KEY ecKey(EVP_PKEY_get1_EC_KEY(actual.get()));
4742541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    ASSERT_FALSE(ecKey.get() == NULL)
4752541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            << "Should be able to extract EC key from EVP_PKEY";
4762541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
4772541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    ASSERT_FALSE(EC_KEY_get0_group(ecKey.get()) == NULL)
4782541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            << "EC key should have a EC_GROUP";
4792541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
4802541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    ASSERT_TRUE(EC_KEY_check_key(ecKey.get()))
4812541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            << "EC key should check correctly";
4822541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root}
4832541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
4842541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny RootINSTANTIATE_TEST_CASE_P(EC,
4852541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root                        KeymasterGenerateECTest,
4862541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root                        ::testing::Values(192U, 224U, 256U, 384U, 521U));
4872541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
4882541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
4892541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny RootTEST_P(KeymasterAllTypesTest, GenerateKeyPair_NullParams_Failure) {
4902541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    keymaster_keypair_t key_type = GetParam();
4914fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
4924fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
4934fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
4944fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
495139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(-1,
4964fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->generate_keypair(sDevice, key_type, NULL, &key_blob, &key_blob_length))
4972541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            << "Should not be able to generate a key with null params";
4984fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
4994fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
5002541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny RootINSTANTIATE_TEST_CASE_P(Types,
5012541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root                        KeymasterAllTypesTest,
5022541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root                        ::testing::Values(TYPE_RSA, TYPE_DSA, TYPE_EC));
5032541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
5044fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, GenerateKeyPair_UnknownType_Failure) {
5054fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    keymaster_keypair_t key_type = static_cast<keymaster_keypair_t>(0xFFFF);
5064fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
5074fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
5084fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
5094fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
510139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(-1,
5114fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->generate_keypair(sDevice, key_type, NULL, &key_blob, &key_blob_length))
5124fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should not generate an unknown key type";
5134fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
5144fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
5154fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, ImportKeyPair_RSA_Success) {
5164fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
5174fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
5184fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
519139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(0,
5202541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            sDevice->import_keypair(sDevice, TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1),
5214fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &key_blob, &key_blob_length))
5224fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should successfully import an RSA key";
5234fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
5248467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root
5258467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    uint8_t* x509_data;
5268467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    size_t x509_data_length;
527139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(0,
5288467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root            sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
5298467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root                    &x509_data, &x509_data_length))
5308467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root            << "Should be able to retrieve RSA public key successfully";
5318467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    UniqueBlob x509_blob(x509_data, x509_data_length);
5328467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root
5338467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    const unsigned char *tmp = static_cast<const unsigned char*>(x509_blob.get());
5348467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    Unique_EVP_PKEY actual(d2i_PUBKEY((EVP_PKEY**) NULL, &tmp,
5358467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root            static_cast<long>(x509_blob.length())));
5368467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root
537139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(EVP_PKEY_type(actual.get()->type), EVP_PKEY_RSA)
5388467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root            << "Generated key type should be of type RSA";
5398467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root
5402541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    const unsigned char *expectedTmp = static_cast<const unsigned char*>(TEST_RSA_KEY_1);
5418467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    Unique_PKCS8_PRIV_KEY_INFO expectedPkcs8(
5428467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root            d2i_PKCS8_PRIV_KEY_INFO((PKCS8_PRIV_KEY_INFO**) NULL, &expectedTmp,
5432541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root                    sizeof(TEST_RSA_KEY_1)));
5442541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
5452541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    Unique_EVP_PKEY expected(EVP_PKCS82PKEY(expectedPkcs8.get()));
5462541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
5472541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    ASSERT_EQ(1, EVP_PKEY_cmp(expected.get(), actual.get()))
5482541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            << "Expected and actual keys should match";
5492541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root}
5502541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
5512541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny RootTEST_F(KeymasterTest, ImportKeyPair_EC_Success) {
5522541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    uint8_t* key_blob;
5532541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    size_t key_blob_length;
5542541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
5552541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    ASSERT_EQ(0,
5562541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            sDevice->import_keypair(sDevice, TEST_EC_KEY_1, sizeof(TEST_EC_KEY_1),
5572541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root                    &key_blob, &key_blob_length))
5582541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            << "Should successfully import an EC key";
5592541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
5602541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
5612541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    uint8_t* x509_data;
5622541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    size_t x509_data_length;
5632541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    ASSERT_EQ(0,
5642541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
5652541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root                    &x509_data, &x509_data_length))
5662541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            << "Should be able to retrieve EC public key successfully";
5672541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueBlob x509_blob(x509_data, x509_data_length);
5682541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
5692541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    const unsigned char *tmp = static_cast<const unsigned char*>(x509_blob.get());
5702541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    Unique_EVP_PKEY actual(d2i_PUBKEY((EVP_PKEY**) NULL, &tmp,
5712541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            static_cast<long>(x509_blob.length())));
5722541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
5732541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    ASSERT_EQ(EVP_PKEY_type(actual.get()->type), EVP_PKEY_EC)
5742541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            << "Generated key type should be of type EC";
5752541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
5762541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    const unsigned char *expectedTmp = static_cast<const unsigned char*>(TEST_EC_KEY_1);
5772541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    Unique_PKCS8_PRIV_KEY_INFO expectedPkcs8(
5782541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            d2i_PKCS8_PRIV_KEY_INFO((PKCS8_PRIV_KEY_INFO**) NULL, &expectedTmp,
5792541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root                    sizeof(TEST_EC_KEY_1)));
5808467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root
5818467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root    Unique_EVP_PKEY expected(EVP_PKCS82PKEY(expectedPkcs8.get()));
5828467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root
583139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(1, EVP_PKEY_cmp(expected.get(), actual.get()))
5848467a6d2918274295212d07fc6e3894f6bc5d623Kenny Root            << "Expected and actual keys should match";
5854fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
5864fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
5874fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, ImportKeyPair_BogusKey_Failure) {
5884fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
5894fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
5904fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
591139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(-1,
5924fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->import_keypair(sDevice, BOGUS_KEY_1, sizeof(BOGUS_KEY_1),
5934fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &key_blob, &key_blob_length))
5944fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should not import an unknown key type";
5954fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
5964fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
5974fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, ImportKeyPair_NullKey_Failure) {
5984fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
5994fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
6004fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
601139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(-1,
6024fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->import_keypair(sDevice, NULL, 0,
6034fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &key_blob, &key_blob_length))
6044fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should not import a null key";
6054fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
6064fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
6074fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, GetKeypairPublic_RSA_Success) {
6084fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
6094fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
6104fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
6112541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueReadOnlyBlob testKey(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
612eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
613eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
6144fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    ASSERT_EQ(0,
615eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
6164fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &key_blob, &key_blob_length))
6174fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should successfully import an RSA key";
6184fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
6194fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
6204fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* x509_data;
6214fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t x509_data_length;
622139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(0,
6234fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
6244fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &x509_data, &x509_data_length))
6254fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should be able to retrieve RSA public key successfully";
6264fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueBlob x509_blob(x509_data, x509_data_length);
6274fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
6284fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
6292541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny RootTEST_F(KeymasterTest, GetKeypairPublic_EC_Success) {
6302541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    uint8_t* key_blob;
6312541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    size_t key_blob_length;
6322541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
6332541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueReadOnlyBlob testKey(TEST_EC_KEY_1, sizeof(TEST_EC_KEY_1));
6342541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
6352541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
6362541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    ASSERT_EQ(0,
6372541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
6382541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root                    &key_blob, &key_blob_length))
6392541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            << "Should successfully import an EC key";
6402541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
6412541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
6422541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    uint8_t* x509_data;
6432541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    size_t x509_data_length;
6442541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    ASSERT_EQ(0,
6452541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
6462541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root                    &x509_data, &x509_data_length))
6472541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            << "Should be able to retrieve EC public key successfully";
6482541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueBlob x509_blob(x509_data, x509_data_length);
6492541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root}
6502541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
6512541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny RootTEST_F(KeymasterTest, GetKeypairPublic_NullKey_Failure) {
6524fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
6534fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
6544fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
6554fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* x509_data = NULL;
6564fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t x509_data_length;
657139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(-1,
6584fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->get_keypair_public(sDevice, NULL, 0,
6594fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &x509_data, &x509_data_length))
6602541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            << "Should not be able to retrieve public key from null key";
6614fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueBlob x509_blob(x509_data, x509_data_length);
6624fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
6634fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
6644fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, GetKeypairPublic_RSA_NullDestination_Failure) {
6654fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
6664fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
6674fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
6682541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueReadOnlyBlob testKey(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
6692541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
6702541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
6712541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    ASSERT_EQ(0,
6722541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
6732541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root                    &key_blob, &key_blob_length))
6742541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            << "Should successfully import an RSA key";
6752541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
6762541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
6772541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    ASSERT_EQ(-1,
6782541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            sDevice->get_keypair_public(sDevice, key.get(), key.length(),
6792541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root                    NULL, NULL))
6802541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            << "Should not be able to succeed with NULL destination blob";
6812541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root}
6822541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
6832541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny RootTEST_F(KeymasterTest, GetKeypairPublic_EC_NullDestination_Failure) {
6842541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    uint8_t* key_blob;
6852541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    size_t key_blob_length;
6862541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
6872541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueReadOnlyBlob testKey(TEST_EC_KEY_1, sizeof(TEST_EC_KEY_1));
688eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
689eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
6904fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    ASSERT_EQ(0,
691eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
6924fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &key_blob, &key_blob_length))
6934fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should successfully import an RSA key";
6944fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
6954fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
696139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(-1,
6974fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->get_keypair_public(sDevice, key.get(), key.length(),
6984fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    NULL, NULL))
6994fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should not be able to succeed with NULL destination blob";
7004fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
7014fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
7024fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, DeleteKeyPair_RSA_Success) {
7034fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
7044fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
7054fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
7062541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueReadOnlyBlob testKey(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
707eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
708eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
709139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(0,
710eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
7114fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &key_blob, &key_blob_length))
7124fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should successfully import an RSA key";
7134fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
7144fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
7154fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
7164fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, DeleteKeyPair_RSA_DoubleDelete_Failure) {
7174fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
7184fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
7194fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
7202541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueReadOnlyBlob testKey(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
721eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
722eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
7234fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    /*
7244fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root     * This is only run if the module indicates it implements key deletion
7254fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root     * by implementing delete_keypair.
7264fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root     */
7274fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    if (sDevice->delete_keypair != NULL) {
7284fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        ASSERT_EQ(0,
729eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root                sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
7304fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                        &key_blob, &key_blob_length))
7314fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                << "Should successfully import an RSA key";
7324fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        UniqueBlob blob(key_blob, key_blob_length);
7334fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
734139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root        ASSERT_EQ(0, sDevice->delete_keypair(sDevice, key_blob, key_blob_length))
7354fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                << "Should delete key after import";
7364fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
737139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root        ASSERT_EQ(-1, sDevice->delete_keypair(sDevice, key_blob, key_blob_length))
7384fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                << "Should not be able to delete key twice";
7394fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    }
7404fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
7414fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
7424fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, DeleteKeyPair_RSA_NullKey_Failure) {
7434fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    /*
7444fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root     * This is only run if the module indicates it implements key deletion
7454fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root     * by implementing delete_keypair.
7464fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root     */
7474fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    if (sDevice->delete_keypair != NULL) {
748139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root        ASSERT_EQ(-1, sDevice->delete_keypair(sDevice, NULL, 0))
7494fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                << "Should not be able to delete null key";
7504fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    }
7514fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
7524fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
7534fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root/*
7544fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root * DER-encoded PKCS#8 format RSA key. Generated using:
7554fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root *
7564fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root * openssl genrsa 512 | openssl pkcs8 -topk8 -nocrypt -outform der | recode ../x1
7574fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root */
7582541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Rootstatic uint8_t TEST_SIGN_RSA_KEY_1[] = {
7594fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x30, 0x82, 0x01, 0x56, 0x02, 0x01, 0x00, 0x30, 0x0D, 0x06, 0x09, 0x2A,
7604fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82,
7614fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x01, 0x40, 0x30, 0x82, 0x01, 0x3C, 0x02, 0x01, 0x00, 0x02, 0x41, 0x00,
7624fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xBD, 0xC0, 0x7F, 0xEF, 0x75, 0x1D, 0x63, 0x2A, 0xD0, 0x9A, 0x26, 0xE5,
7634fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x5B, 0xB9, 0x84, 0x7C, 0xE5, 0xC7, 0xE7, 0xDE, 0xFE, 0xB6, 0x54, 0xD9,
7644fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xF0, 0x9B, 0xC2, 0xCF, 0x36, 0xDA, 0xE5, 0x4D, 0xC5, 0xD9, 0x25, 0x78,
7654fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xBD, 0x55, 0x05, 0xBD, 0x86, 0xFB, 0x37, 0x15, 0x33, 0x42, 0x52, 0xED,
7664fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xE5, 0xCD, 0xCB, 0xB7, 0xA2, 0x51, 0xFA, 0x36, 0xE9, 0x9C, 0x2E, 0x5D,
7674fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xE3, 0xA5, 0x1F, 0x01, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x41, 0x00,
7684fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x96, 0x71, 0xDE, 0xBD, 0x83, 0x94, 0x96, 0x40, 0xA6, 0xFD, 0xE1, 0xA2,
7694fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xED, 0xD3, 0xAC, 0x28, 0xBE, 0xA2, 0x7D, 0xC3, 0xFF, 0x1D, 0x9F, 0x2E,
7704fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xE0, 0xA7, 0x0E, 0x90, 0xEE, 0x44, 0x25, 0x92, 0xE3, 0x54, 0xDD, 0x55,
7714fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xA3, 0xEF, 0x42, 0xF5, 0x52, 0x55, 0x41, 0x47, 0x5E, 0x00, 0xFB, 0x8B,
7724fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x47, 0x5E, 0x45, 0x49, 0xEA, 0x3D, 0x2C, 0xFD, 0x9F, 0xEC, 0xC8, 0x4E,
7734fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x4E, 0x86, 0x90, 0x31, 0x02, 0x21, 0x00, 0xE6, 0xA5, 0x55, 0xB3, 0x64,
7744fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xAB, 0x90, 0x5E, 0xA2, 0xF5, 0x6B, 0x21, 0x4B, 0x15, 0xD6, 0x4A, 0xB6,
7754fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x60, 0x24, 0x95, 0x65, 0xA2, 0xBE, 0xBA, 0x2A, 0x73, 0xFB, 0xFF, 0x2C,
7764fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x61, 0x88, 0x9D, 0x02, 0x21, 0x00, 0xD2, 0x9C, 0x5B, 0xFE, 0x82, 0xA5,
7774fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xFC, 0x52, 0x6A, 0x29, 0x38, 0xDB, 0x22, 0x3B, 0xEB, 0x74, 0x3B, 0xCA,
7784fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xB4, 0xDD, 0x1D, 0xE4, 0x48, 0x60, 0x70, 0x19, 0x9B, 0x81, 0xC1, 0x83,
7794fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x28, 0xB5, 0x02, 0x21, 0x00, 0x89, 0x2D, 0xFE, 0xF9, 0xF2, 0xBF, 0x43,
7804fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xDF, 0xB5, 0xA6, 0xA8, 0x30, 0x26, 0x1B, 0x77, 0xD7, 0xF9, 0xFE, 0xD6,
7814fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xE3, 0x70, 0x8E, 0xCA, 0x47, 0xA9, 0xA6, 0x50, 0x54, 0x25, 0xCE, 0x60,
7824fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xD5, 0x02, 0x21, 0x00, 0xBE, 0x5A, 0xF8, 0x82, 0xE6, 0xCE, 0xE3, 0x6A,
7834fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x11, 0xED, 0xC4, 0x27, 0xBB, 0x9F, 0x70, 0xC6, 0x93, 0xAC, 0x39, 0x20,
7844fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x89, 0x7D, 0xE5, 0x34, 0xD4, 0xDD, 0x30, 0x42, 0x6D, 0x07, 0x00, 0xE9,
7854fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x02, 0x20, 0x05, 0x91, 0xEF, 0x12, 0xD2, 0xD3, 0x6A, 0xD2, 0x96, 0x6B,
7864fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x10, 0x62, 0xF9, 0xBA, 0xA4, 0x91, 0x48, 0x84, 0x40, 0x61, 0x67, 0x80,
7874fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x68, 0x68, 0xC8, 0x60, 0xB3, 0x66, 0xC8, 0xF9, 0x08, 0x9A,
7884fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root};
7894fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
7904fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root/*
7912541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root * DER-encoded PKCS#8 format EC key. Generated using:
7922541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root *
7932541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root * openssl ecparam -name prime256v1 -genkey -noout | openssl pkcs8 -topk8 -nocrypt -outform der | recode ../x1
7942541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root */
7952541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Rootstatic uint8_t TEST_SIGN_EC_KEY_1[] = {
7962541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root        0x30, 0x81, 0x87, 0x02, 0x01, 0x00, 0x30, 0x13, 0x06, 0x07, 0x2A, 0x86,
7972541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root        0x48, 0xCE, 0x3D, 0x02, 0x01, 0x06, 0x08, 0x2A, 0x86, 0x48, 0xCE, 0x3D,
7982541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root        0x03, 0x01, 0x07, 0x04, 0x6D, 0x30, 0x6B, 0x02, 0x01, 0x01, 0x04, 0x20,
7992541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root        0x9E, 0x66, 0x11, 0x6A, 0x89, 0xF5, 0x78, 0x57, 0xF3, 0x35, 0xA2, 0x46,
8002541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root        0x09, 0x06, 0x4B, 0x4D, 0x81, 0xEC, 0xD3, 0x9B, 0x0A, 0xC4, 0x68, 0x06,
8012541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root        0xB8, 0x42, 0x24, 0x5E, 0x74, 0x2C, 0x62, 0x79, 0xA1, 0x44, 0x03, 0x42,
8022541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root        0x00, 0x04, 0x35, 0xB5, 0x9A, 0x5C, 0xE5, 0x52, 0x35, 0xF2, 0x10, 0x6C,
8032541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root        0xD9, 0x98, 0x67, 0xED, 0x5E, 0xCB, 0x6B, 0xB8, 0x96, 0x5E, 0x54, 0x7C,
8042541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root        0x34, 0x2A, 0xA3, 0x3B, 0xF3, 0xD1, 0x39, 0x48, 0x36, 0x7A, 0xEA, 0xD8,
8052541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root        0xCA, 0xDD, 0x40, 0x8F, 0xE9, 0xE0, 0x95, 0x2E, 0x3F, 0x95, 0x0F, 0x14,
8062541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root        0xD6, 0x14, 0x78, 0xB5, 0xAD, 0x17, 0xD2, 0x5A, 0x41, 0x96, 0x99, 0x20,
8072541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root        0xC7, 0x5B, 0x0F, 0x60, 0xFD, 0xBA
8082541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root};
8092541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
8102541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root/*
8114fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root * PKCS#1 v1.5 padded raw "Hello, world"  Can be generated be generated by verifying
8124fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root * the signature below in no padding mode:
8134fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root *
8144fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root * openssl rsautl -keyform der -inkey rsa.der -raw -verify -in test.sig
8154fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root */
8164fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Rootstatic uint8_t TEST_SIGN_DATA_1[] = {
8174fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
8184fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xFF, 0xFF, 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, 0x00, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x2C, 0x20, 0x77,
8224fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x6F, 0x72, 0x6C, 0x64,
8234fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root};
8244fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
8254fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root/*
8262541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root * Signature of TEST_SIGN_DATA_1 using TEST_SIGN_RSA_KEY_1. Generated using:
8274fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root *
8284fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root * echo 'Hello, world' | openssl rsautl -keyform der -inkey rsa.der -sign | recode ../x1
8294fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root */
8302541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Rootstatic uint8_t TEST_SIGN_RSA_SIGNATURE_1[] = {
8314fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xA4, 0xBB, 0x76, 0x87, 0xFE, 0x61, 0x0C, 0x9D, 0xD6, 0xFF, 0x4B, 0x76,
8324fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x96, 0x08, 0x36, 0x23, 0x11, 0xC6, 0x44, 0x3F, 0x88, 0x77, 0x97, 0xB2,
8334fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xA8, 0x3B, 0xFB, 0x9C, 0x3C, 0xD3, 0x20, 0x65, 0xFD, 0x26, 0x3B, 0x2A,
8344fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xB8, 0xB6, 0xD4, 0xDC, 0x91, 0xF7, 0xE2, 0xDE, 0x4D, 0xF7, 0x0E, 0xB9,
8354fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x72, 0xA7, 0x29, 0x72, 0x82, 0x12, 0x7C, 0x53, 0x23, 0x21, 0xC4, 0xFF,
8364fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x79, 0xE4, 0x91, 0x40,
8374fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root};
8384fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
8394fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root/*
8402541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root * Identical to TEST_SIGN_RSA_SIGNATURE_1 except the last octet is '1' instead of '0'
8414fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root * This should fail any test.
8424fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root */
8434fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Rootstatic uint8_t TEST_SIGN_SIGNATURE_BOGUS_1[] = {
8444fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xA4, 0xBB, 0x76, 0x87, 0xFE, 0x61, 0x0C, 0x9D, 0xD6, 0xFF, 0x4B, 0x76,
8454fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x96, 0x08, 0x36, 0x23, 0x11, 0xC6, 0x44, 0x3F, 0x88, 0x77, 0x97, 0xB2,
8464fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xA8, 0x3B, 0xFB, 0x9C, 0x3C, 0xD3, 0x20, 0x65, 0xFD, 0x26, 0x3B, 0x2A,
8474fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0xB8, 0xB6, 0xD4, 0xDC, 0x91, 0xF7, 0xE2, 0xDE, 0x4D, 0xF7, 0x0E, 0xB9,
8484fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x72, 0xA7, 0x29, 0x72, 0x82, 0x12, 0x7C, 0x53, 0x23, 0x21, 0xC4, 0xFF,
8494fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root        0x79, 0xE4, 0x91, 0x41,
8504fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root};
8514fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
8524fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, SignData_RSA_Raw_Success) {
8534fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
8544fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
8554fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
8562541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
857eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
858eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
8594fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    ASSERT_EQ(0,
860eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
8614fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &key_blob, &key_blob_length))
8624fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should successfully import an RSA key";
8634fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
8644fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
8654fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    keymaster_rsa_sign_params_t params = {
8664fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            digest_type: DIGEST_NONE,
8674fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            padding_type: PADDING_NONE,
8684fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    };
8694fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
8704fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* sig;
8714fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t sig_length;
8724fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
873eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
874eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testData.get() != NULL);
875eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
876139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(0,
8774fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
878eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root                    testData.get(), testData.length(),
8794fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &sig, &sig_length))
8804fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should sign data successfully";
8814fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueBlob sig_blob(sig, sig_length);
8824fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
8832541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueBlob expected_sig(TEST_SIGN_RSA_SIGNATURE_1, sizeof(TEST_SIGN_RSA_SIGNATURE_1));
8844fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
885139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(expected_sig, sig_blob)
8864fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Generated signature should match expected signature";
8874fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
8884fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    // The expected signature is actually stack data, so don't let it try to free.
8894fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* unused __attribute__((unused)) = expected_sig.release();
8904fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
8914fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
8922541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny RootTEST_F(KeymasterTest, SignData_EC_Success) {
8932541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    uint8_t* key_blob;
8942541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    size_t key_blob_length;
8952541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
8962541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueReadOnlyBlob testKey(TEST_SIGN_EC_KEY_1, sizeof(TEST_SIGN_EC_KEY_1));
8972541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
8982541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
8992541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    ASSERT_EQ(0,
9002541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
9012541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root                    &key_blob, &key_blob_length))
9022541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            << "Should successfully import an EC key";
9032541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
9042541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
9052541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    keymaster_ec_sign_params_t params = {
9062541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            digest_type: DIGEST_NONE,
9072541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    };
9082541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
9092541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    uint8_t* sig;
9102541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    size_t sig_length;
9112541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
9122541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
9132541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    ASSERT_TRUE(testData.get() != NULL);
9142541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
9152541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    ASSERT_EQ(0,
9162541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
9172541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root                    testData.get(), testData.length(),
9182541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root                    &sig, &sig_length))
9192541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            << "Should sign data successfully";
9202541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueBlob sig_blob(sig, sig_length);
9212541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
9222541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    uint8_t* x509_data;
9232541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    size_t x509_data_length;
9242541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    ASSERT_EQ(0,
9252541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            sDevice->get_keypair_public(sDevice, key_blob, key_blob_length,
9262541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root                    &x509_data, &x509_data_length))
9272541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            << "Should be able to retrieve RSA public key successfully";
9282541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueBlob x509_blob(x509_data, x509_data_length);
9292541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
9302541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    const unsigned char *tmp = static_cast<const unsigned char*>(x509_blob.get());
9312541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    Unique_EVP_PKEY expected(d2i_PUBKEY((EVP_PKEY**) NULL, &tmp,
9322541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            static_cast<long>(x509_blob.length())));
9332541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
9342541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    Unique_EC_KEY ecKey(EVP_PKEY_get1_EC_KEY(expected.get()));
9352541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
9362541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    ASSERT_EQ(1, ECDSA_verify(0, testData.get(), testData.length(), sig_blob.get(), sig_blob.length(), ecKey.get()))
9372541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            << "Signature should verify";
9382541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root}
9392541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
9404fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, SignData_RSA_Raw_InvalidSizeInput_Failure) {
9414fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
9424fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
9434fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
9442541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
945eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
946eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
9474fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    ASSERT_EQ(0,
948eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
9494fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &key_blob, &key_blob_length))
9504fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should successfully import an RSA key";
9514fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
9524fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
9534fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    keymaster_rsa_sign_params_t params = {
9544fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            digest_type: DIGEST_NONE,
9554fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            padding_type: PADDING_NONE,
9564fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    };
9574fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
9584fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* sig;
9594fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t sig_length;
9604fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
9612541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueReadOnlyBlob testData(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
962eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testData.get() != NULL);
963eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
964139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(-1,
9654fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
966eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root                    testData.get(), testData.length(),
9674fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &sig, &sig_length))
9684fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should not be able to do raw signature on incorrect size data";
9694fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
9704fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
9714fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, SignData_RSA_Raw_NullKey_Failure) {
9724fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    keymaster_rsa_sign_params_t params = {
9734fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            digest_type: DIGEST_NONE,
9744fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            padding_type: PADDING_NONE,
9754fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    };
9764fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
9774fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* sig;
9784fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t sig_length;
9794fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
9802541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueReadOnlyBlob testData(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
981eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testData.get() != NULL);
982eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
983139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(-1,
9844fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->sign_data(sDevice, &params, NULL, 0,
985eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root                    testData.get(), testData.length(),
9864fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &sig, &sig_length))
9874fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should not be able to do raw signature on incorrect size data";
9884fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
9894fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
9904fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, SignData_RSA_Raw_NullInput_Failure) {
9914fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
9924fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
9934fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
9942541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
995eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
996eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
9974fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    ASSERT_EQ(0,
998eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
9994fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &key_blob, &key_blob_length))
10004fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should successfully import an RSA key";
10014fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
10024fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
10034fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    keymaster_rsa_sign_params_t params = {
10044fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            digest_type: DIGEST_NONE,
10054fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            padding_type: PADDING_NONE,
10064fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    };
10074fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
10084fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* sig;
10094fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t sig_length;
10104fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
1011139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(-1,
10124fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
10134fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    NULL, 0,
10144fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &sig, &sig_length))
10154fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should error when input data is null";
10164fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
10174fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
10184fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, SignData_RSA_Raw_NullOutput_Failure) {
10194fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
10204fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
10214fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
10222541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
1023eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
1024eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
10254fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    ASSERT_EQ(0,
1026eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
10274fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &key_blob, &key_blob_length))
10284fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should successfully import an RSA key";
10294fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
10304fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
10314fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    keymaster_rsa_sign_params_t params = {
10324fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            digest_type: DIGEST_NONE,
10334fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            padding_type: PADDING_NONE,
10344fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    };
10354fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
10364fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* sig;
10374fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t sig_length;
10384fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
10392541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueReadOnlyBlob testData(TEST_RSA_KEY_1, sizeof(TEST_RSA_KEY_1));
1040eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testData.get() != NULL);
1041eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
1042139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(-1,
10434fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
1044eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root                    testData.get(), testData.length(),
10454fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    NULL, NULL))
10464fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should error when output is null";
10474fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
10484fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
10494fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, VerifyData_RSA_Raw_Success) {
10504fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
10514fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
10524fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
10532541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
1054eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
1055eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
10564fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    ASSERT_EQ(0,
1057eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
10584fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &key_blob, &key_blob_length))
10594fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should successfully import an RSA key";
10604fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
10614fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
10624fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    keymaster_rsa_sign_params_t params = {
10634fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            digest_type: DIGEST_NONE,
10644fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            padding_type: PADDING_NONE,
10654fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    };
10664fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
1067eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
1068eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testData.get() != NULL);
1069eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
10702541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueReadOnlyBlob testSig(TEST_SIGN_RSA_SIGNATURE_1, sizeof(TEST_SIGN_RSA_SIGNATURE_1));
1071eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testSig.get() != NULL);
1072eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
1073139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(0,
10744fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->verify_data(sDevice, &params, key_blob, key_blob_length,
1075eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root                    testData.get(), testData.length(),
1076eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root                    testSig.get(), testSig.length()))
10774fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should verify data successfully";
10784fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
10794fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
10802541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny RootTEST_F(KeymasterTest, VerifyData_EC_Raw_Success) {
10812541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    uint8_t* key_blob;
10822541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    size_t key_blob_length;
10832541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
10842541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueReadOnlyBlob testKey(TEST_SIGN_EC_KEY_1, sizeof(TEST_SIGN_EC_KEY_1));
10852541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
10862541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
10872541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    ASSERT_EQ(0,
10882541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
10892541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root                    &key_blob, &key_blob_length))
10902541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            << "Should successfully import an RSA key";
10912541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
10922541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
10932541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    keymaster_ec_sign_params_t params = {
10942541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            digest_type: DIGEST_NONE,
10952541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    };
10962541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
10972541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    uint8_t* sig;
10982541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    size_t sig_length;
10992541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
11002541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
11012541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    ASSERT_TRUE(testData.get() != NULL);
11022541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
11032541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    ASSERT_EQ(0,
11042541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            sDevice->sign_data(sDevice, &params, key_blob, key_blob_length,
11052541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root                    testData.get(), testData.length(),
11062541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root                    &sig, &sig_length))
11072541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            << "Should sign data successfully";
11082541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueBlob sig_blob(sig, sig_length);
11092541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
11102541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    ASSERT_EQ(0,
11112541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            sDevice->verify_data(sDevice, &params, key_blob, key_blob_length,
11122541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root                    testData.get(), testData.length(),
11132541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root                    sig_blob.get(), sig_blob.length()))
11142541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            << "Should verify data successfully";
11152541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root}
11162541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
11174fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, VerifyData_RSA_Raw_BadSignature_Failure) {
11184fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
11194fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
11204fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
11212541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
1122eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
1123eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
11244fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    ASSERT_EQ(0,
1125eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
11264fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &key_blob, &key_blob_length))
11274fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should successfully import an RSA key";
11284fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
11294fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
11304fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    keymaster_rsa_sign_params_t params = {
11314fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            digest_type: DIGEST_NONE,
11324fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            padding_type: PADDING_NONE,
11334fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    };
11344fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
1135139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(-1,
11364fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->verify_data(sDevice, &params, key_blob, key_blob_length,
11374fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1),
11384fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    TEST_SIGN_SIGNATURE_BOGUS_1, sizeof(TEST_SIGN_SIGNATURE_BOGUS_1)))
11394fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should sign data successfully";
11404fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
11414fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
11422541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny RootTEST_F(KeymasterTest, VerifyData_EC_Raw_BadSignature_Failure) {
11432541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    uint8_t* key_blob;
11442541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    size_t key_blob_length;
11452541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
11462541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueReadOnlyBlob testKey(TEST_SIGN_EC_KEY_1, sizeof(TEST_SIGN_EC_KEY_1));
11472541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
11482541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
11492541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    ASSERT_EQ(0,
11502541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
11512541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root                    &key_blob, &key_blob_length))
11522541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            << "Should successfully import an RSA key";
11532541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
11542541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
11552541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    keymaster_ec_sign_params_t params = {
11562541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            digest_type: DIGEST_NONE,
11572541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    };
11582541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
11592541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    ASSERT_EQ(-1,
11602541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            sDevice->verify_data(sDevice, &params, key_blob, key_blob_length,
11612541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root                    TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1),
11622541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root                    TEST_SIGN_SIGNATURE_BOGUS_1, sizeof(TEST_SIGN_SIGNATURE_BOGUS_1)))
11632541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            << "Should sign data successfully";
11642541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root}
11652541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root
11664fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, VerifyData_RSA_Raw_NullKey_Failure) {
11674fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    keymaster_rsa_sign_params_t params = {
11684fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            digest_type: DIGEST_NONE,
11694fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            padding_type: PADDING_NONE,
11704fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    };
11714fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
1172eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
1173eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testData.get() != NULL);
1174eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
1175eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    UniqueReadOnlyBlob testSig(TEST_SIGN_SIGNATURE_BOGUS_1, sizeof(TEST_SIGN_SIGNATURE_BOGUS_1));
1176eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testSig.get() != NULL);
1177eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
1178139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(-1,
11794fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->verify_data(sDevice, &params, NULL, 0,
1180eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root                    testData.get(), testData.length(),
1181eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root                    testSig.get(), testSig.length()))
11824fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should fail when key is null";
11834fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
11844fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
11854fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, VerifyData_RSA_NullInput_Failure) {
11864fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
11874fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
11884fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
11894fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    ASSERT_EQ(0,
11902541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root            sDevice->import_keypair(sDevice, TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1),
11914fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &key_blob, &key_blob_length))
11924fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should successfully import an RSA key";
11934fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
11944fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
11954fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    keymaster_rsa_sign_params_t params = {
11964fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            digest_type: DIGEST_NONE,
11974fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            padding_type: PADDING_NONE,
11984fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    };
11994fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
12002541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueReadOnlyBlob testSig(TEST_SIGN_RSA_SIGNATURE_1, sizeof(TEST_SIGN_RSA_SIGNATURE_1));
1201eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testSig.get() != NULL);
1202eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
1203139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(-1,
12044fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->verify_data(sDevice, &params, key_blob, key_blob_length,
12054fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    NULL, 0,
1206eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root                    testSig.get(), testSig.length()))
12074fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should fail on null input";
12084fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
12094fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
12104fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny RootTEST_F(KeymasterTest, VerifyData_RSA_NullSignature_Failure) {
12114fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    uint8_t* key_blob;
12124fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    size_t key_blob_length;
12134fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
12142541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
1215eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
1216eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
12174fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    ASSERT_EQ(0,
1218eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
12194fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    &key_blob, &key_blob_length))
12204fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should successfully import an RSA key";
12214fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    UniqueKey key(&sDevice, key_blob, key_blob_length);
12224fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
12234fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    keymaster_rsa_sign_params_t params = {
12244fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            digest_type: DIGEST_NONE,
12254fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            padding_type: PADDING_NONE,
12264fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root    };
12274fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
1228eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    UniqueReadOnlyBlob testData(TEST_SIGN_DATA_1, sizeof(TEST_SIGN_DATA_1));
1229eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testData.get() != NULL);
1230eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
1231139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(-1,
12324fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            sDevice->verify_data(sDevice, &params, key.get(), key.length(),
1233eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root                    testData.get(), testData.length(),
12344fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root                    NULL, 0))
12354fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root            << "Should fail on null signature";
12364fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
12374fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root
12388ae65e71996ce871cda97cc9114cb5211cb273bfKenny RootTEST_F(KeymasterTest, EraseAll_Success) {
12398ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root    uint8_t *key1_blob, *key2_blob;
12408ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root    size_t key1_blob_length, key2_blob_length;
12418ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root
12428ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root    // Only test this if the device says it supports delete_all
12438ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root    if (sDevice->delete_all == NULL) {
12448ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root        return;
12458ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root    }
12468ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root
12472541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueReadOnlyBlob testKey(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
1248eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testKey.get() != NULL);
1249eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
12508ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root    ASSERT_EQ(0,
1251eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            sDevice->import_keypair(sDevice, testKey.get(), testKey.length(),
12528ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root                    &key1_blob, &key1_blob_length))
12538ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root            << "Should successfully import an RSA key";
12548ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root    UniqueKey key1(&sDevice, key1_blob, key1_blob_length);
12558ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root
12562541a0a8f7a2c86658d435efb49843a88b4d97e0Kenny Root    UniqueReadOnlyBlob testKey2(TEST_SIGN_RSA_KEY_1, sizeof(TEST_SIGN_RSA_KEY_1));
1257eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root    ASSERT_TRUE(testKey2.get() != NULL);
1258eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root
12598ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root    ASSERT_EQ(0,
1260eca8b3cdf0f906062285d03a0d08e3104625df94Kenny Root            sDevice->import_keypair(sDevice, testKey2.get(), testKey2.length(),
12618ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root                    &key2_blob, &key2_blob_length))
12628ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root            << "Should successfully import an RSA key";
12638ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root    UniqueKey key2(&sDevice, key2_blob, key2_blob_length);
12648ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root
1265139d44f26d21f9943c473aa1391ce419c5bd442aKenny Root    ASSERT_EQ(0, sDevice->delete_all(sDevice))
12668ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root            << "Should erase all keys";
12678ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root
12688ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root    key1.reset();
12698ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root
12708ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root    uint8_t* x509_data;
12718ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root    size_t x509_data_length;
12728ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root    ASSERT_EQ(-1,
12738ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root            sDevice->get_keypair_public(sDevice, key1_blob, key1_blob_length,
12748ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root                    &x509_data, &x509_data_length))
12758ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root            << "Should be able to retrieve RSA public key 1 successfully";
12768ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root
12778ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root    ASSERT_EQ(-1,
12788ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root            sDevice->get_keypair_public(sDevice, key2_blob, key2_blob_length,
12798ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root                    &x509_data, &x509_data_length))
12808ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root            << "Should be able to retrieve RSA public key 2 successfully";
12818ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root}
12828ae65e71996ce871cda97cc9114cb5211cb273bfKenny Root
12834fd0db7cd15dc01d27d928feb5c7122c908fc70cKenny Root}
1284