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, ¶ms, &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, ¶ms, &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, ¶ms, 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, ¶ms, 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, ¶ms, 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, ¶ms, 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, ¶ms, 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, ¶ms, 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, ¶ms, 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, ¶ms, 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, ¶ms, 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, ¶ms, 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, ¶ms, 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, ¶ms, 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, ¶ms, 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, ¶ms, 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