blob: 7ed880e6d50a286d4824e5ee46f22b4e816bc7c6 [file] [log] [blame]
Andres Moralesb33c9b82015-09-08 17:56:07 -07001/*
2 * Copyright 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <stdio.h>
18
19#include <openssl/evp.h>
20#include <openssl/x509.h>
21
22#include "trusty_keymaster_device.h"
23
24using keymaster::TrustyKeymasterDevice;
25
26unsigned char rsa_privkey_pk8_der[] = {
27 0x30, 0x82, 0x02, 0x75, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
28 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x02, 0x5f, 0x30, 0x82, 0x02, 0x5b, 0x02, 0x01,
29 0x00, 0x02, 0x81, 0x81, 0x00, 0xc6, 0x09, 0x54, 0x09, 0x04, 0x7d, 0x86, 0x34, 0x81, 0x2d, 0x5a,
30 0x21, 0x81, 0x76, 0xe4, 0x5c, 0x41, 0xd6, 0x0a, 0x75, 0xb1, 0x39, 0x01, 0xf2, 0x34, 0x22, 0x6c,
31 0xff, 0xe7, 0x76, 0x52, 0x1c, 0x5a, 0x77, 0xb9, 0xe3, 0x89, 0x41, 0x7b, 0x71, 0xc0, 0xb6, 0xa4,
32 0x4d, 0x13, 0xaf, 0xe4, 0xe4, 0xa2, 0x80, 0x5d, 0x46, 0xc9, 0xda, 0x29, 0x35, 0xad, 0xb1, 0xff,
33 0x0c, 0x1f, 0x24, 0xea, 0x06, 0xe6, 0x2b, 0x20, 0xd7, 0x76, 0x43, 0x0a, 0x4d, 0x43, 0x51, 0x57,
34 0x23, 0x3c, 0x6f, 0x91, 0x67, 0x83, 0xc3, 0x0e, 0x31, 0x0f, 0xcb, 0xd8, 0x9b, 0x85, 0xc2, 0xd5,
35 0x67, 0x71, 0x16, 0x97, 0x85, 0xac, 0x12, 0xbc, 0xa2, 0x44, 0xab, 0xda, 0x72, 0xbf, 0xb1, 0x9f,
36 0xc4, 0x4d, 0x27, 0xc8, 0x1e, 0x1d, 0x92, 0xde, 0x28, 0x4f, 0x40, 0x61, 0xed, 0xfd, 0x99, 0x28,
37 0x07, 0x45, 0xea, 0x6d, 0x25, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02, 0x81, 0x80, 0x1b, 0xe0, 0xf0,
38 0x4d, 0x9c, 0xae, 0x37, 0x18, 0x69, 0x1f, 0x03, 0x53, 0x38, 0x30, 0x8e, 0x91, 0x56, 0x4b, 0x55,
39 0x89, 0x9f, 0xfb, 0x50, 0x84, 0xd2, 0x46, 0x0e, 0x66, 0x30, 0x25, 0x7e, 0x05, 0xb3, 0xce, 0xab,
40 0x02, 0x97, 0x2d, 0xfa, 0xbc, 0xd6, 0xce, 0x5f, 0x6e, 0xe2, 0x58, 0x9e, 0xb6, 0x79, 0x11, 0xed,
41 0x0f, 0xac, 0x16, 0xe4, 0x3a, 0x44, 0x4b, 0x8c, 0x86, 0x1e, 0x54, 0x4a, 0x05, 0x93, 0x36, 0x57,
42 0x72, 0xf8, 0xba, 0xf6, 0xb2, 0x2f, 0xc9, 0xe3, 0xc5, 0xf1, 0x02, 0x4b, 0x06, 0x3a, 0xc0, 0x80,
43 0xa7, 0xb2, 0x23, 0x4c, 0xf8, 0xae, 0xe8, 0xf6, 0xc4, 0x7b, 0xbf, 0x4f, 0xd3, 0xac, 0xe7, 0x24,
44 0x02, 0x90, 0xbe, 0xf1, 0x6c, 0x0b, 0x3f, 0x7f, 0x3c, 0xdd, 0x64, 0xce, 0x3a, 0xb5, 0x91, 0x2c,
45 0xf6, 0xe3, 0x2f, 0x39, 0xab, 0x18, 0x83, 0x58, 0xaf, 0xcc, 0xcd, 0x80, 0x81, 0x02, 0x41, 0x00,
46 0xe4, 0xb4, 0x9e, 0xf5, 0x0f, 0x76, 0x5d, 0x3b, 0x24, 0xdd, 0xe0, 0x1a, 0xce, 0xaa, 0xf1, 0x30,
47 0xf2, 0xc7, 0x66, 0x70, 0xa9, 0x1a, 0x61, 0xae, 0x08, 0xaf, 0x49, 0x7b, 0x4a, 0x82, 0xbe, 0x6d,
48 0xee, 0x8f, 0xcd, 0xd5, 0xe3, 0xf7, 0xba, 0x1c, 0xfb, 0x1f, 0x0c, 0x92, 0x6b, 0x88, 0xf8, 0x8c,
49 0x92, 0xbf, 0xab, 0x13, 0x7f, 0xba, 0x22, 0x85, 0x22, 0x7b, 0x83, 0xc3, 0x42, 0xff, 0x7c, 0x55,
50 0x02, 0x41, 0x00, 0xdd, 0xab, 0xb5, 0x83, 0x9c, 0x4c, 0x7f, 0x6b, 0xf3, 0xd4, 0x18, 0x32, 0x31,
51 0xf0, 0x05, 0xb3, 0x1a, 0xa5, 0x8a, 0xff, 0xdd, 0xa5, 0xc7, 0x9e, 0x4c, 0xce, 0x21, 0x7f, 0x6b,
52 0xc9, 0x30, 0xdb, 0xe5, 0x63, 0xd4, 0x80, 0x70, 0x6c, 0x24, 0xe9, 0xeb, 0xfc, 0xab, 0x28, 0xa6,
53 0xcd, 0xef, 0xd3, 0x24, 0xb7, 0x7e, 0x1b, 0xf7, 0x25, 0x1b, 0x70, 0x90, 0x92, 0xc2, 0x4f, 0xf5,
54 0x01, 0xfd, 0x91, 0x02, 0x40, 0x23, 0xd4, 0x34, 0x0e, 0xda, 0x34, 0x45, 0xd8, 0xcd, 0x26, 0xc1,
55 0x44, 0x11, 0xda, 0x6f, 0xdc, 0xa6, 0x3c, 0x1c, 0xcd, 0x4b, 0x80, 0xa9, 0x8a, 0xd5, 0x2b, 0x78,
56 0xcc, 0x8a, 0xd8, 0xbe, 0xb2, 0x84, 0x2c, 0x1d, 0x28, 0x04, 0x05, 0xbc, 0x2f, 0x6c, 0x1b, 0xea,
57 0x21, 0x4a, 0x1d, 0x74, 0x2a, 0xb9, 0x96, 0xb3, 0x5b, 0x63, 0xa8, 0x2a, 0x5e, 0x47, 0x0f, 0xa8,
58 0x8d, 0xbf, 0x82, 0x3c, 0xdd, 0x02, 0x40, 0x1b, 0x7b, 0x57, 0x44, 0x9a, 0xd3, 0x0d, 0x15, 0x18,
59 0x24, 0x9a, 0x5f, 0x56, 0xbb, 0x98, 0x29, 0x4d, 0x4b, 0x6a, 0xc1, 0x2f, 0xfc, 0x86, 0x94, 0x04,
60 0x97, 0xa5, 0xa5, 0x83, 0x7a, 0x6c, 0xf9, 0x46, 0x26, 0x2b, 0x49, 0x45, 0x26, 0xd3, 0x28, 0xc1,
61 0x1e, 0x11, 0x26, 0x38, 0x0f, 0xde, 0x04, 0xc2, 0x4f, 0x91, 0x6d, 0xec, 0x25, 0x08, 0x92, 0xdb,
62 0x09, 0xa6, 0xd7, 0x7c, 0xdb, 0xa3, 0x51, 0x02, 0x40, 0x77, 0x62, 0xcd, 0x8f, 0x4d, 0x05, 0x0d,
63 0xa5, 0x6b, 0xd5, 0x91, 0xad, 0xb5, 0x15, 0xd2, 0x4d, 0x7c, 0xcd, 0x32, 0xcc, 0xa0, 0xd0, 0x5f,
64 0x86, 0x6d, 0x58, 0x35, 0x14, 0xbd, 0x73, 0x24, 0xd5, 0xf3, 0x36, 0x45, 0xe8, 0xed, 0x8b, 0x4a,
65 0x1c, 0xb3, 0xcc, 0x4a, 0x1d, 0x67, 0x98, 0x73, 0x99, 0xf2, 0xa0, 0x9f, 0x5b, 0x3f, 0xb6, 0x8c,
66 0x88, 0xd5, 0xe5, 0xd9, 0x0a, 0xc3, 0x34, 0x92, 0xd6};
67unsigned int rsa_privkey_pk8_der_len = 633;
68
69unsigned char dsa_privkey_pk8_der[] = {
70 0x30, 0x82, 0x01, 0x4b, 0x02, 0x01, 0x00, 0x30, 0x82, 0x01, 0x2b, 0x06, 0x07, 0x2a, 0x86, 0x48,
71 0xce, 0x38, 0x04, 0x01, 0x30, 0x82, 0x01, 0x1e, 0x02, 0x81, 0x81, 0x00, 0xa3, 0xf3, 0xe9, 0xb6,
72 0x7e, 0x7d, 0x88, 0xf6, 0xb7, 0xe5, 0xf5, 0x1f, 0x3b, 0xee, 0xac, 0xd7, 0xad, 0xbc, 0xc9, 0xd1,
73 0x5a, 0xf8, 0x88, 0xc4, 0xef, 0x6e, 0x3d, 0x74, 0x19, 0x74, 0xe7, 0xd8, 0xe0, 0x26, 0x44, 0x19,
74 0x86, 0xaf, 0x19, 0xdb, 0x05, 0xe9, 0x3b, 0x8b, 0x58, 0x58, 0xde, 0xe5, 0x4f, 0x48, 0x15, 0x01,
75 0xea, 0xe6, 0x83, 0x52, 0xd7, 0xc1, 0x21, 0xdf, 0xb9, 0xb8, 0x07, 0x66, 0x50, 0xfb, 0x3a, 0x0c,
76 0xb3, 0x85, 0xee, 0xbb, 0x04, 0x5f, 0xc2, 0x6d, 0x6d, 0x95, 0xfa, 0x11, 0x93, 0x1e, 0x59, 0x5b,
77 0xb1, 0x45, 0x8d, 0xe0, 0x3d, 0x73, 0xaa, 0xf2, 0x41, 0x14, 0x51, 0x07, 0x72, 0x3d, 0xa2, 0xf7,
78 0x58, 0xcd, 0x11, 0xa1, 0x32, 0xcf, 0xda, 0x42, 0xb7, 0xcc, 0x32, 0x80, 0xdb, 0x87, 0x82, 0xec,
79 0x42, 0xdb, 0x5a, 0x55, 0x24, 0x24, 0xa2, 0xd1, 0x55, 0x29, 0xad, 0xeb, 0x02, 0x15, 0x00, 0xeb,
80 0xea, 0x17, 0xd2, 0x09, 0xb3, 0xd7, 0x21, 0x9a, 0x21, 0x07, 0x82, 0x8f, 0xab, 0xfe, 0x88, 0x71,
81 0x68, 0xf7, 0xe3, 0x02, 0x81, 0x80, 0x19, 0x1c, 0x71, 0xfd, 0xe0, 0x03, 0x0c, 0x43, 0xd9, 0x0b,
82 0xf6, 0xcd, 0xd6, 0xa9, 0x70, 0xe7, 0x37, 0x86, 0x3a, 0x78, 0xe9, 0xa7, 0x47, 0xa7, 0x47, 0x06,
83 0x88, 0xb1, 0xaf, 0xd7, 0xf3, 0xf1, 0xa1, 0xd7, 0x00, 0x61, 0x28, 0x88, 0x31, 0x48, 0x60, 0xd8,
84 0x11, 0xef, 0xa5, 0x24, 0x1a, 0x81, 0xc4, 0x2a, 0xe2, 0xea, 0x0e, 0x36, 0xd2, 0xd2, 0x05, 0x84,
85 0x37, 0xcf, 0x32, 0x7d, 0x09, 0xe6, 0x0f, 0x8b, 0x0c, 0xc8, 0xc2, 0xa4, 0xb1, 0xdc, 0x80, 0xca,
86 0x68, 0xdf, 0xaf, 0xd2, 0x90, 0xc0, 0x37, 0x58, 0x54, 0x36, 0x8f, 0x49, 0xb8, 0x62, 0x75, 0x8b,
87 0x48, 0x47, 0xc0, 0xbe, 0xf7, 0x9a, 0x92, 0xa6, 0x68, 0x05, 0xda, 0x9d, 0xaf, 0x72, 0x9a, 0x67,
88 0xb3, 0xb4, 0x14, 0x03, 0xae, 0x4f, 0x4c, 0x76, 0xb9, 0xd8, 0x64, 0x0a, 0xba, 0x3b, 0xa8, 0x00,
89 0x60, 0x4d, 0xae, 0x81, 0xc3, 0xc5, 0x04, 0x17, 0x02, 0x15, 0x00, 0x81, 0x9d, 0xfd, 0x53, 0x0c,
90 0xc1, 0x8f, 0xbe, 0x8b, 0xea, 0x00, 0x26, 0x19, 0x29, 0x33, 0x91, 0x84, 0xbe, 0xad, 0x81};
91unsigned int dsa_privkey_pk8_der_len = 335;
92
93unsigned char ec_privkey_pk8_der[] = {
94 0x30, 0x81, 0x87, 0x02, 0x01, 0x00, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,
95 0x01, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x04, 0x6d, 0x30, 0x6b, 0x02,
96 0x01, 0x01, 0x04, 0x20, 0x73, 0x7c, 0x2e, 0xcd, 0x7b, 0x8d, 0x19, 0x40, 0xbf, 0x29, 0x30, 0xaa,
97 0x9b, 0x4e, 0xd3, 0xff, 0x94, 0x1e, 0xed, 0x09, 0x36, 0x6b, 0xc0, 0x32, 0x99, 0x98, 0x64, 0x81,
98 0xf3, 0xa4, 0xd8, 0x59, 0xa1, 0x44, 0x03, 0x42, 0x00, 0x04, 0xbf, 0x85, 0xd7, 0x72, 0x0d, 0x07,
99 0xc2, 0x54, 0x61, 0x68, 0x3b, 0xc6, 0x48, 0xb4, 0x77, 0x8a, 0x9a, 0x14, 0xdd, 0x8a, 0x02, 0x4e,
100 0x3b, 0xdd, 0x8c, 0x7d, 0xdd, 0x9a, 0xb2, 0xb5, 0x28, 0xbb, 0xc7, 0xaa, 0x1b, 0x51, 0xf1, 0x4e,
101 0xbb, 0xbb, 0x0b, 0xd0, 0xce, 0x21, 0xbc, 0xc4, 0x1c, 0x6e, 0xb0, 0x00, 0x83, 0xcf, 0x33, 0x76,
102 0xd1, 0x1f, 0xd4, 0x49, 0x49, 0xe0, 0xb2, 0x18, 0x3b, 0xfe};
103unsigned int ec_privkey_pk8_der_len = 138;
104
105struct EVP_PKEY_Delete {
106 void operator()(EVP_PKEY* p) const { EVP_PKEY_free(p); }
107};
108
109struct EVP_PKEY_CTX_Delete {
110 void operator()(EVP_PKEY_CTX* p) { EVP_PKEY_CTX_free(p); }
111};
112
113static bool test_import_rsa(TrustyKeymasterDevice* device) {
114 printf("===================\n");
115 printf("= RSA Import Test =\n");
116 printf("===================\n\n");
117
118 printf("=== Importing RSA keypair === \n");
119 uint8_t* key;
120 size_t size;
121 int error = device->import_keypair(rsa_privkey_pk8_der, rsa_privkey_pk8_der_len, &key, &size);
122 if (error != KM_ERROR_OK) {
123 printf("Error importing key pair: %d\n\n", error);
124 return false;
125 }
126 UniquePtr<uint8_t[]> key_deleter(key);
127
128 printf("=== Signing with imported RSA key ===\n");
129 keymaster_rsa_sign_params_t sign_params = {DIGEST_NONE, PADDING_NONE};
130 size_t message_len = 1024 / 8;
131 UniquePtr<uint8_t[]> message(new uint8_t[message_len]);
132 memset(message.get(), 'a', message_len);
133 uint8_t* signature;
134 size_t signature_len;
135 error = device->sign_data(&sign_params, key, size, message.get(), message_len, &signature,
136 &signature_len);
137 if (error != KM_ERROR_OK) {
138 printf("Error signing data with imported RSA key: %d\n\n", error);
139 return false;
140 }
141 UniquePtr<uint8_t[]> signature_deleter(signature);
142
143 printf("=== Verifying with imported RSA key === \n");
144 error = device->verify_data(&sign_params, key, size, message.get(), message_len, signature,
145 signature_len);
146 if (error != KM_ERROR_OK) {
147 printf("Error verifying data with imported RSA key: %d\n\n", error);
148 return false;
149 }
150
151 printf("\n");
152 return true;
153}
154
155static bool test_rsa(TrustyKeymasterDevice* device) {
156 printf("============\n");
157 printf("= RSA Test =\n");
158 printf("============\n\n");
159
160 printf("=== Generating RSA key pair ===\n");
161 keymaster_rsa_keygen_params_t params;
162 params.public_exponent = 65537;
163 params.modulus_size = 2048;
164
165 uint8_t* key;
166 size_t size;
167 int error = device->generate_keypair(TYPE_RSA, &params, &key, &size);
168 if (error != KM_ERROR_OK) {
169 printf("Error generating RSA key pair: %d\n\n", error);
170 return false;
171 }
172 UniquePtr<uint8_t[]> deleter(key);
173
174 printf("=== Signing with RSA key === \n");
175 keymaster_rsa_sign_params_t sign_params = {DIGEST_NONE, PADDING_NONE};
176 size_t message_len = params.modulus_size / 8;
177 UniquePtr<uint8_t[]> message(new uint8_t[message_len]);
178 memset(message.get(), 'a', message_len);
179 uint8_t* signature;
180 size_t signature_len;
181 error = device->sign_data(&sign_params, key, size, message.get(), message_len, &signature,
182 &signature_len);
183 if (error != KM_ERROR_OK) {
184 printf("Error signing data with RSA key: %d\n\n", error);
185 return false;
186 }
187 UniquePtr<uint8_t[]> signature_deleter(signature);
188
189 printf("=== Verifying with RSA key === \n");
190 error = device->verify_data(&sign_params, key, size, message.get(), message_len, signature,
191 signature_len);
192 if (error != KM_ERROR_OK) {
193 printf("Error verifying data with RSA key: %d\n\n", error);
194 return false;
195 }
196
197 printf("=== Exporting RSA public key ===\n");
198 uint8_t* exported_key;
199 size_t exported_size;
200 error = device->get_keypair_public(key, size, &exported_key, &exported_size);
201 if (error != KM_ERROR_OK) {
202 printf("Error exporting RSA public key: %d\n\n", error);
203 return false;
204 }
205
206 printf("=== Verifying with exported key ===\n");
207 const uint8_t* tmp = exported_key;
208 UniquePtr<EVP_PKEY, EVP_PKEY_Delete> pkey(d2i_PUBKEY(NULL, &tmp, exported_size));
209 UniquePtr<EVP_PKEY_CTX, EVP_PKEY_CTX_Delete> ctx(EVP_PKEY_CTX_new(pkey.get(), NULL));
210 if (EVP_PKEY_verify_init(ctx.get()) != 1) {
211 printf("Error initializing openss EVP context\n");
212 return false;
213 }
214 if (EVP_PKEY_type(pkey->type) != EVP_PKEY_RSA) {
215 printf("Exported key was the wrong type?!?\n");
216 return false;
217 }
218
219 EVP_PKEY_CTX_set_rsa_padding(ctx.get(), RSA_NO_PADDING);
220 if (EVP_PKEY_verify(ctx.get(), signature, signature_len, message.get(), message_len) != 1) {
221 printf("Verification with exported pubkey failed.\n");
222 return false;
223 } else {
224 printf("Verification succeeded\n");
225 }
226
227 printf("\n");
228 return true;
229}
230
231static bool test_import_ecdsa(TrustyKeymasterDevice* device) {
232 printf("=====================\n");
233 printf("= ECDSA Import Test =\n");
234 printf("=====================\n\n");
235
236 printf("=== Importing ECDSA keypair === \n");
237 uint8_t* key;
238 size_t size;
239 int error = device->import_keypair(ec_privkey_pk8_der, ec_privkey_pk8_der_len, &key, &size);
240 if (error != KM_ERROR_OK) {
241 printf("Error importing key pair: %d\n\n", error);
242 return false;
243 }
244 UniquePtr<uint8_t[]> deleter(key);
245
246 printf("=== Signing with imported ECDSA key ===\n");
247 keymaster_ec_sign_params_t sign_params = {DIGEST_NONE};
248 size_t message_len = 30 /* arbitrary */;
249 UniquePtr<uint8_t[]> message(new uint8_t[message_len]);
250 memset(message.get(), 'a', message_len);
251 uint8_t* signature;
252 size_t signature_len;
253 error = device->sign_data(&sign_params, key, size, message.get(), message_len, &signature,
254 &signature_len);
255 if (error != KM_ERROR_OK) {
256 printf("Error signing data with imported ECDSA key: %d\n\n", error);
257 return false;
258 }
259 UniquePtr<uint8_t[]> signature_deleter(signature);
260
261 printf("=== Verifying with imported ECDSA key === \n");
262 error = device->verify_data(&sign_params, key, size, message.get(), message_len, signature,
263 signature_len);
264 if (error != KM_ERROR_OK) {
265 printf("Error verifying data with imported ECDSA key: %d\n\n", error);
266 return false;
267 }
268
269 printf("\n");
270 return true;
271}
272
273static bool test_ecdsa(TrustyKeymasterDevice* device) {
274 printf("==============\n");
275 printf("= ECDSA Test =\n");
276 printf("==============\n\n");
277
278 printf("=== Generating ECDSA key pair ===\n");
279 keymaster_ec_keygen_params_t params;
280 params.field_size = 521;
281 uint8_t* key;
282 size_t size;
283 int error = device->generate_keypair(TYPE_EC, &params, &key, &size);
284 if (error != 0) {
285 printf("Error generating ECDSA key pair: %d\n\n", error);
286 return false;
287 }
288 UniquePtr<uint8_t[]> deleter(key);
289
290 printf("=== Signing with ECDSA key === \n");
291 keymaster_ec_sign_params_t sign_params = {DIGEST_NONE};
292 size_t message_len = 30 /* arbitrary */;
293 UniquePtr<uint8_t[]> message(new uint8_t[message_len]);
294 memset(message.get(), 'a', message_len);
295 uint8_t* signature;
296 size_t signature_len;
297 error = device->sign_data(&sign_params, key, size, message.get(), message_len, &signature,
298 &signature_len);
299 if (error != KM_ERROR_OK) {
300 printf("Error signing data with ECDSA key: %d\n\n", error);
301 return false;
302 }
303 UniquePtr<uint8_t[]> signature_deleter(signature);
304
305 printf("=== Verifying with ECDSA key === \n");
306 error = device->verify_data(&sign_params, key, size, message.get(), message_len, signature,
307 signature_len);
308 if (error != KM_ERROR_OK) {
309 printf("Error verifying data with ECDSA key: %d\n\n", error);
310 return false;
311 }
312
313 printf("=== Exporting ECDSA public key ===\n");
314 uint8_t* exported_key;
315 size_t exported_size;
316 error = device->get_keypair_public(key, size, &exported_key, &exported_size);
317 if (error != KM_ERROR_OK) {
318 printf("Error exporting ECDSA public key: %d\n\n", error);
319 return false;
320 }
321
322 printf("=== Verifying with exported key ===\n");
323 const uint8_t* tmp = exported_key;
324 UniquePtr<EVP_PKEY, EVP_PKEY_Delete> pkey(d2i_PUBKEY(NULL, &tmp, exported_size));
325 UniquePtr<EVP_PKEY_CTX, EVP_PKEY_CTX_Delete> ctx(EVP_PKEY_CTX_new(pkey.get(), NULL));
326 if (EVP_PKEY_verify_init(ctx.get()) != 1) {
327 printf("Error initializing openss EVP context\n");
328 return false;
329 }
330 if (EVP_PKEY_type(pkey->type) != EVP_PKEY_EC) {
331 printf("Exported key was the wrong type?!?\n");
332 return false;
333 }
334
335 if (EVP_PKEY_verify(ctx.get(), signature, signature_len, message.get(), message_len) != 1) {
336 printf("Verification with exported pubkey failed.\n");
337 return false;
338 } else {
339 printf("Verification succeeded\n");
340 }
341
342 printf("\n");
343 return true;
344}
345
346int main(void) {
347
348 TrustyKeymasterDevice device(NULL);
349 if (device.session_error() != KM_ERROR_OK) {
350 printf("Failed to initialize Trusty session: %d\n", device.session_error());
351 return 1;
352 }
353 printf("Trusty session initialized\n");
354
355 bool success = true;
356 success &= test_rsa(&device);
357 success &= test_import_rsa(&device);
358 success &= test_ecdsa(&device);
359 success &= test_import_ecdsa(&device);
360
361 if (success) {
362 printf("\nTESTS PASSED!\n");
363 } else {
364 printf("\n!!!!TESTS FAILED!!!\n");
365 }
366
367 return success ? 0 : 1;
368}