xref: /aosp_15_r20/external/tpm2-tss/test/helper/tpm_getek_ecc.c (revision 758e9fba6fc9adbf15340f70c73baee7b168b1c9)
1*758e9fbaSOystein Eftevaag #ifdef HAVE_CONFIG_H
2*758e9fbaSOystein Eftevaag #include <config.h>
3*758e9fbaSOystein Eftevaag #endif
4*758e9fbaSOystein Eftevaag 
5*758e9fbaSOystein Eftevaag #include <stdbool.h>
6*758e9fbaSOystein Eftevaag #include <stdlib.h>
7*758e9fbaSOystein Eftevaag #include <stdio.h>
8*758e9fbaSOystein Eftevaag #include <inttypes.h>
9*758e9fbaSOystein Eftevaag #include <openssl/evp.h>
10*758e9fbaSOystein Eftevaag #include <openssl/rsa.h>
11*758e9fbaSOystein Eftevaag #include <openssl/pem.h>
12*758e9fbaSOystein Eftevaag #include <openssl/err.h>
13*758e9fbaSOystein Eftevaag #include <string.h>
14*758e9fbaSOystein Eftevaag 
15*758e9fbaSOystein Eftevaag #include "tss2_sys.h"
16*758e9fbaSOystein Eftevaag #include "tss2_mu.h"
17*758e9fbaSOystein Eftevaag 
18*758e9fbaSOystein Eftevaag #define LOGMODULE test
19*758e9fbaSOystein Eftevaag #include "util/log.h"
20*758e9fbaSOystein Eftevaag #include "test-options.h"
21*758e9fbaSOystein Eftevaag #include "context-util.h"
22*758e9fbaSOystein Eftevaag 
handleErrors(void)23*758e9fbaSOystein Eftevaag void handleErrors(void)
24*758e9fbaSOystein Eftevaag {
25*758e9fbaSOystein Eftevaag     unsigned long errCode;
26*758e9fbaSOystein Eftevaag 
27*758e9fbaSOystein Eftevaag     printf("An error occurred\n");
28*758e9fbaSOystein Eftevaag     while((errCode = ERR_get_error()))
29*758e9fbaSOystein Eftevaag     {
30*758e9fbaSOystein Eftevaag         char *err = ERR_error_string(errCode, NULL);
31*758e9fbaSOystein Eftevaag         printf("%s\n", err);
32*758e9fbaSOystein Eftevaag     }
33*758e9fbaSOystein Eftevaag     abort();
34*758e9fbaSOystein Eftevaag }
35*758e9fbaSOystein Eftevaag 
36*758e9fbaSOystein Eftevaag int
main(int argc,char * argv[])37*758e9fbaSOystein Eftevaag main (int argc, char *argv[])
38*758e9fbaSOystein Eftevaag {
39*758e9fbaSOystein Eftevaag     TSS2_RC rc;
40*758e9fbaSOystein Eftevaag     TSS2_SYS_CONTEXT *sapi_context;
41*758e9fbaSOystein Eftevaag     TSS2L_SYS_AUTH_COMMAND auth_cmd = {
42*758e9fbaSOystein Eftevaag         .auths = {{ .sessionHandle = TPM2_RS_PW }},
43*758e9fbaSOystein Eftevaag         .count = 1
44*758e9fbaSOystein Eftevaag     };
45*758e9fbaSOystein Eftevaag     TPM2B_SENSITIVE_CREATE in_sensitive = { 0 };
46*758e9fbaSOystein Eftevaag     TPM2B_PUBLIC in_public = {
47*758e9fbaSOystein Eftevaag         .publicArea = {
48*758e9fbaSOystein Eftevaag             .type = TPM2_ALG_ECC,
49*758e9fbaSOystein Eftevaag             .nameAlg = TPM2_ALG_SHA256,
50*758e9fbaSOystein Eftevaag             .objectAttributes = (
51*758e9fbaSOystein Eftevaag                                  TPMA_OBJECT_FIXEDTPM |
52*758e9fbaSOystein Eftevaag                                  TPMA_OBJECT_FIXEDPARENT |
53*758e9fbaSOystein Eftevaag                                  TPMA_OBJECT_SENSITIVEDATAORIGIN |
54*758e9fbaSOystein Eftevaag                                  TPMA_OBJECT_ADMINWITHPOLICY |
55*758e9fbaSOystein Eftevaag                                  TPMA_OBJECT_RESTRICTED |
56*758e9fbaSOystein Eftevaag                                  TPMA_OBJECT_DECRYPT
57*758e9fbaSOystein Eftevaag                                  ),
58*758e9fbaSOystein Eftevaag             .authPolicy = {
59*758e9fbaSOystein Eftevaag                 .size = 32,
60*758e9fbaSOystein Eftevaag                 .buffer = 0x83, 0x71, 0x97, 0x67, 0x44, 0x84,
61*758e9fbaSOystein Eftevaag                 0xB3, 0xF8, 0x1A, 0x90, 0xCC, 0x8D,
62*758e9fbaSOystein Eftevaag                 0x46, 0xA5, 0xD7, 0x24, 0xFD, 0x52,
63*758e9fbaSOystein Eftevaag                 0xD7, 0x6E, 0x06, 0x52, 0x0B, 0x64,
64*758e9fbaSOystein Eftevaag                 0xF2, 0xA1, 0xDA, 0x1B, 0x33, 0x14,
65*758e9fbaSOystein Eftevaag                 0x69, 0xAA,
66*758e9fbaSOystein Eftevaag             },
67*758e9fbaSOystein Eftevaag             .parameters.eccDetail = {
68*758e9fbaSOystein Eftevaag                 .symmetric = {
69*758e9fbaSOystein Eftevaag                     .algorithm = TPM2_ALG_AES,
70*758e9fbaSOystein Eftevaag                     .keyBits.aes = 128,
71*758e9fbaSOystein Eftevaag                     .mode.aes = TPM2_ALG_CFB,
72*758e9fbaSOystein Eftevaag                 },
73*758e9fbaSOystein Eftevaag                 .scheme = {
74*758e9fbaSOystein Eftevaag                     .scheme = TPM2_ALG_NULL,
75*758e9fbaSOystein Eftevaag                     .details = { 0 }
76*758e9fbaSOystein Eftevaag                 },
77*758e9fbaSOystein Eftevaag                 .curveID = TPM2_ECC_NIST_P256,
78*758e9fbaSOystein Eftevaag                 .kdf = {.scheme = TPM2_ALG_NULL,
79*758e9fbaSOystein Eftevaag                         .details = { 0 }
80*758e9fbaSOystein Eftevaag                 }
81*758e9fbaSOystein Eftevaag             },
82*758e9fbaSOystein Eftevaag             .unique.ecc = {
83*758e9fbaSOystein Eftevaag                 .x = {.size = 32,.buffer = { 0 }},
84*758e9fbaSOystein Eftevaag                 .y = {.size = 32,.buffer = { 0 }}
85*758e9fbaSOystein Eftevaag             }
86*758e9fbaSOystein Eftevaag         }
87*758e9fbaSOystein Eftevaag     };
88*758e9fbaSOystein Eftevaag     TPML_PCR_SELECTION creation_pcr = { 0 };
89*758e9fbaSOystein Eftevaag     TPM2_HANDLE handle;
90*758e9fbaSOystein Eftevaag     TPM2B_PUBLIC out_public = { 0 };
91*758e9fbaSOystein Eftevaag     TSS2L_SYS_AUTH_RESPONSE auth_rsp = {
92*758e9fbaSOystein Eftevaag         .count = 0
93*758e9fbaSOystein Eftevaag     };
94*758e9fbaSOystein Eftevaag 
95*758e9fbaSOystein Eftevaag     test_opts_t opts = {
96*758e9fbaSOystein Eftevaag         .tcti_type      = TCTI_DEFAULT,
97*758e9fbaSOystein Eftevaag         .device_file    = DEVICE_PATH_DEFAULT,
98*758e9fbaSOystein Eftevaag         .socket_address = HOSTNAME_DEFAULT,
99*758e9fbaSOystein Eftevaag         .socket_port    = PORT_DEFAULT,
100*758e9fbaSOystein Eftevaag     };
101*758e9fbaSOystein Eftevaag 
102*758e9fbaSOystein Eftevaag     get_test_opts_from_env (&opts);
103*758e9fbaSOystein Eftevaag     if (sanity_check_test_opts (&opts) != 0)
104*758e9fbaSOystein Eftevaag         exit (1);
105*758e9fbaSOystein Eftevaag 
106*758e9fbaSOystein Eftevaag     sapi_context = sapi_init_from_opts (&opts);
107*758e9fbaSOystein Eftevaag     if (sapi_context == NULL)
108*758e9fbaSOystein Eftevaag         exit (1);
109*758e9fbaSOystein Eftevaag 
110*758e9fbaSOystein Eftevaag     /* Generate the EK key */
111*758e9fbaSOystein Eftevaag 
112*758e9fbaSOystein Eftevaag     rc = Tss2_Sys_CreatePrimary(sapi_context, TPM2_RH_ENDORSEMENT, &auth_cmd,
113*758e9fbaSOystein Eftevaag                                 &in_sensitive, &in_public, NULL, &creation_pcr,
114*758e9fbaSOystein Eftevaag                                 &handle, &out_public, NULL, NULL, NULL, NULL, &auth_rsp);
115*758e9fbaSOystein Eftevaag     if (rc != TSS2_RC_SUCCESS) {
116*758e9fbaSOystein Eftevaag         LOG_ERROR("TPM CreatePrimary FAILED: 0x%"PRIx32, rc);
117*758e9fbaSOystein Eftevaag         exit(1);
118*758e9fbaSOystein Eftevaag     }
119*758e9fbaSOystein Eftevaag 
120*758e9fbaSOystein Eftevaag     rc = Tss2_Sys_FlushContext(sapi_context, handle);
121*758e9fbaSOystein Eftevaag     if (rc != TSS2_RC_SUCCESS) {
122*758e9fbaSOystein Eftevaag         LOG_ERROR("TPM FlushContext FAILED: 0x%"PRIx32, rc);
123*758e9fbaSOystein Eftevaag         exit(1);
124*758e9fbaSOystein Eftevaag     }
125*758e9fbaSOystein Eftevaag 
126*758e9fbaSOystein Eftevaag     sapi_teardown_full (sapi_context);
127*758e9fbaSOystein Eftevaag 
128*758e9fbaSOystein Eftevaag     /* Convert the key from out_public to PEM */
129*758e9fbaSOystein Eftevaag 
130*758e9fbaSOystein Eftevaag     EVP_PKEY *evp = EVP_PKEY_new();
131*758e9fbaSOystein Eftevaag 
132*758e9fbaSOystein Eftevaag     OpenSSL_add_all_algorithms();
133*758e9fbaSOystein Eftevaag 
134*758e9fbaSOystein Eftevaag     OpenSSL_add_all_algorithms();
135*758e9fbaSOystein Eftevaag 
136*758e9fbaSOystein Eftevaag     ERR_load_crypto_strings();
137*758e9fbaSOystein Eftevaag 
138*758e9fbaSOystein Eftevaag 
139*758e9fbaSOystein Eftevaag     EC_KEY *ecc_key = EC_KEY_new();
140*758e9fbaSOystein Eftevaag     BIGNUM *x = NULL, *y = NULL;
141*758e9fbaSOystein Eftevaag     BIO *bio = BIO_new_fp(stdout, BIO_NOCLOSE);
142*758e9fbaSOystein Eftevaag     int nid;
143*758e9fbaSOystein Eftevaag 
144*758e9fbaSOystein Eftevaag     nid = EC_curve_nist2nid("P-256");
145*758e9fbaSOystein Eftevaag     EC_GROUP *ecgroup = EC_GROUP_new_by_curve_name(nid);
146*758e9fbaSOystein Eftevaag 
147*758e9fbaSOystein Eftevaag     if (!EC_KEY_set_group(ecc_key, ecgroup))
148*758e9fbaSOystein Eftevaag         exit(1);
149*758e9fbaSOystein Eftevaag 
150*758e9fbaSOystein Eftevaag     EC_KEY_set_asn1_flag(ecc_key, OPENSSL_EC_NAMED_CURVE);
151*758e9fbaSOystein Eftevaag     EC_GROUP_free(ecgroup);
152*758e9fbaSOystein Eftevaag 
153*758e9fbaSOystein Eftevaag     /* Set the ECC parameters in the OpenSSL key */
154*758e9fbaSOystein Eftevaag     x = BN_bin2bn(out_public.publicArea.unique.ecc.x.buffer,
155*758e9fbaSOystein Eftevaag                   out_public.publicArea.unique.ecc.x.size, NULL);
156*758e9fbaSOystein Eftevaag 
157*758e9fbaSOystein Eftevaag     y = BN_bin2bn(out_public.publicArea.unique.ecc.y.buffer,
158*758e9fbaSOystein Eftevaag                   out_public.publicArea.unique.ecc.y.size, NULL);
159*758e9fbaSOystein Eftevaag 
160*758e9fbaSOystein Eftevaag     if (!x || !y) {
161*758e9fbaSOystein Eftevaag         exit(1);
162*758e9fbaSOystein Eftevaag     }
163*758e9fbaSOystein Eftevaag 
164*758e9fbaSOystein Eftevaag     if (!EC_KEY_set_public_key_affine_coordinates(ecc_key, x, y)) {
165*758e9fbaSOystein Eftevaag         exit(1);
166*758e9fbaSOystein Eftevaag     }
167*758e9fbaSOystein Eftevaag 
168*758e9fbaSOystein Eftevaag     if (!EVP_PKEY_assign_EC_KEY(evp, ecc_key)) {
169*758e9fbaSOystein Eftevaag         handleErrors();
170*758e9fbaSOystein Eftevaag         LOG_ERROR("PEM_write failed");
171*758e9fbaSOystein Eftevaag         exit(1);
172*758e9fbaSOystein Eftevaag     }
173*758e9fbaSOystein Eftevaag 
174*758e9fbaSOystein Eftevaag     if (!PEM_write_bio_PUBKEY(bio, evp)) {
175*758e9fbaSOystein Eftevaag         handleErrors();
176*758e9fbaSOystein Eftevaag         LOG_ERROR("PEM_write failed");
177*758e9fbaSOystein Eftevaag         exit(1);
178*758e9fbaSOystein Eftevaag     }
179*758e9fbaSOystein Eftevaag 
180*758e9fbaSOystein Eftevaag     BN_free(y);
181*758e9fbaSOystein Eftevaag     BN_free(x);
182*758e9fbaSOystein Eftevaag     EVP_PKEY_free(evp);
183*758e9fbaSOystein Eftevaag     BIO_free(bio);
184*758e9fbaSOystein Eftevaag 
185*758e9fbaSOystein Eftevaag     return 0;
186*758e9fbaSOystein Eftevaag }
187