xref: /aosp_15_r20/external/tpm2-tss/test/helper/tpm_getek.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 
13*758e9fbaSOystein Eftevaag #include "tss2_sys.h"
14*758e9fbaSOystein Eftevaag #include "tss2_mu.h"
15*758e9fbaSOystein Eftevaag 
16*758e9fbaSOystein Eftevaag #define LOGMODULE test
17*758e9fbaSOystein Eftevaag #include "util/log.h"
18*758e9fbaSOystein Eftevaag #include "test-options.h"
19*758e9fbaSOystein Eftevaag #include "context-util.h"
20*758e9fbaSOystein Eftevaag 
21*758e9fbaSOystein Eftevaag int
main(int argc,char * argv[])22*758e9fbaSOystein Eftevaag main (int argc, char *argv[])
23*758e9fbaSOystein Eftevaag {
24*758e9fbaSOystein Eftevaag     TSS2_RC rc;
25*758e9fbaSOystein Eftevaag     TSS2_SYS_CONTEXT *sapi_context;
26*758e9fbaSOystein Eftevaag     TSS2L_SYS_AUTH_COMMAND auth_cmd = {
27*758e9fbaSOystein Eftevaag         .auths = {{ .sessionHandle = TPM2_RS_PW }},
28*758e9fbaSOystein Eftevaag         .count = 1
29*758e9fbaSOystein Eftevaag     };
30*758e9fbaSOystein Eftevaag     TPM2B_SENSITIVE_CREATE in_sensitive = { 0 };
31*758e9fbaSOystein Eftevaag     TPM2B_PUBLIC in_public = {
32*758e9fbaSOystein Eftevaag         .publicArea = {
33*758e9fbaSOystein Eftevaag             .type = TPM2_ALG_RSA,
34*758e9fbaSOystein Eftevaag             .nameAlg = TPM2_ALG_SHA256,
35*758e9fbaSOystein Eftevaag             .objectAttributes = (
36*758e9fbaSOystein Eftevaag                 TPMA_OBJECT_FIXEDTPM |
37*758e9fbaSOystein Eftevaag                 TPMA_OBJECT_FIXEDPARENT |
38*758e9fbaSOystein Eftevaag                 TPMA_OBJECT_SENSITIVEDATAORIGIN |
39*758e9fbaSOystein Eftevaag                 TPMA_OBJECT_ADMINWITHPOLICY |
40*758e9fbaSOystein Eftevaag                 TPMA_OBJECT_RESTRICTED |
41*758e9fbaSOystein Eftevaag                 TPMA_OBJECT_DECRYPT
42*758e9fbaSOystein Eftevaag              ),
43*758e9fbaSOystein Eftevaag             .authPolicy = {
44*758e9fbaSOystein Eftevaag                  .size = 32,
45*758e9fbaSOystein Eftevaag                  .buffer = 0x83, 0x71, 0x97, 0x67, 0x44, 0x84,
46*758e9fbaSOystein Eftevaag                            0xB3, 0xF8, 0x1A, 0x90, 0xCC, 0x8D,
47*758e9fbaSOystein Eftevaag                            0x46, 0xA5, 0xD7, 0x24, 0xFD, 0x52,
48*758e9fbaSOystein Eftevaag                            0xD7, 0x6E, 0x06, 0x52, 0x0B, 0x64,
49*758e9fbaSOystein Eftevaag                            0xF2, 0xA1, 0xDA, 0x1B, 0x33, 0x14,
50*758e9fbaSOystein Eftevaag                            0x69, 0xAA,
51*758e9fbaSOystein Eftevaag              },
52*758e9fbaSOystein Eftevaag             .parameters.rsaDetail = {
53*758e9fbaSOystein Eftevaag                 .symmetric = {
54*758e9fbaSOystein Eftevaag                     .algorithm = TPM2_ALG_AES,
55*758e9fbaSOystein Eftevaag                     .keyBits.aes = 128,
56*758e9fbaSOystein Eftevaag                     .mode.aes = TPM2_ALG_CFB,
57*758e9fbaSOystein Eftevaag                 },
58*758e9fbaSOystein Eftevaag                 .scheme = {
59*758e9fbaSOystein Eftevaag                     .scheme = TPM2_ALG_NULL,
60*758e9fbaSOystein Eftevaag                 },
61*758e9fbaSOystein Eftevaag                 .keyBits = 2048,
62*758e9fbaSOystein Eftevaag                 .exponent = 0,
63*758e9fbaSOystein Eftevaag             },
64*758e9fbaSOystein Eftevaag             .unique.rsa = {
65*758e9fbaSOystein Eftevaag                 .size = 256,
66*758e9fbaSOystein Eftevaag                 .buffer = {0},
67*758e9fbaSOystein Eftevaag             }
68*758e9fbaSOystein Eftevaag         }
69*758e9fbaSOystein Eftevaag     };
70*758e9fbaSOystein Eftevaag     TPML_PCR_SELECTION creation_pcr = { 0 };
71*758e9fbaSOystein Eftevaag     TPM2_HANDLE handle;
72*758e9fbaSOystein Eftevaag     TPM2B_PUBLIC out_public = { 0 };
73*758e9fbaSOystein Eftevaag     TSS2L_SYS_AUTH_RESPONSE auth_rsp = {
74*758e9fbaSOystein Eftevaag         .count = 0
75*758e9fbaSOystein Eftevaag     };
76*758e9fbaSOystein Eftevaag 
77*758e9fbaSOystein Eftevaag     test_opts_t opts = {
78*758e9fbaSOystein Eftevaag         .tcti_type      = TCTI_DEFAULT,
79*758e9fbaSOystein Eftevaag         .device_file    = DEVICE_PATH_DEFAULT,
80*758e9fbaSOystein Eftevaag         .socket_address = HOSTNAME_DEFAULT,
81*758e9fbaSOystein Eftevaag         .socket_port    = PORT_DEFAULT,
82*758e9fbaSOystein Eftevaag     };
83*758e9fbaSOystein Eftevaag 
84*758e9fbaSOystein Eftevaag     get_test_opts_from_env (&opts);
85*758e9fbaSOystein Eftevaag     if (sanity_check_test_opts (&opts) != 0)
86*758e9fbaSOystein Eftevaag         exit (1);
87*758e9fbaSOystein Eftevaag 
88*758e9fbaSOystein Eftevaag     sapi_context = sapi_init_from_opts (&opts);
89*758e9fbaSOystein Eftevaag     if (sapi_context == NULL)
90*758e9fbaSOystein Eftevaag         exit (1);
91*758e9fbaSOystein Eftevaag 
92*758e9fbaSOystein Eftevaag     /* Generate the EK key */
93*758e9fbaSOystein Eftevaag 
94*758e9fbaSOystein Eftevaag     rc = Tss2_Sys_CreatePrimary(sapi_context, TPM2_RH_ENDORSEMENT, &auth_cmd,
95*758e9fbaSOystein Eftevaag                                 &in_sensitive, &in_public, NULL, &creation_pcr,
96*758e9fbaSOystein Eftevaag                                 &handle, &out_public, NULL, NULL, NULL, NULL, &auth_rsp);
97*758e9fbaSOystein Eftevaag     if (rc != TSS2_RC_SUCCESS) {
98*758e9fbaSOystein Eftevaag         LOG_ERROR("TPM CreatePrimary FAILED: 0x%"PRIx32, rc);
99*758e9fbaSOystein Eftevaag         exit(1);
100*758e9fbaSOystein Eftevaag     }
101*758e9fbaSOystein Eftevaag 
102*758e9fbaSOystein Eftevaag     rc = Tss2_Sys_FlushContext(sapi_context, handle);
103*758e9fbaSOystein Eftevaag     if (rc != TSS2_RC_SUCCESS) {
104*758e9fbaSOystein Eftevaag         LOG_ERROR("TPM FlushContext FAILED: 0x%"PRIx32, rc);
105*758e9fbaSOystein Eftevaag         exit(1);
106*758e9fbaSOystein Eftevaag     }
107*758e9fbaSOystein Eftevaag 
108*758e9fbaSOystein Eftevaag     sapi_teardown_full (sapi_context);
109*758e9fbaSOystein Eftevaag 
110*758e9fbaSOystein Eftevaag     /* Convert the key from out_public to PEM */
111*758e9fbaSOystein Eftevaag 
112*758e9fbaSOystein Eftevaag     EVP_PKEY *evp = EVP_PKEY_new();
113*758e9fbaSOystein Eftevaag     BIO *bio = BIO_new_fp(stdout, BIO_NOCLOSE);
114*758e9fbaSOystein Eftevaag     RSA *rsa = RSA_new();
115*758e9fbaSOystein Eftevaag     BIGNUM *e = BN_new();
116*758e9fbaSOystein Eftevaag     BIGNUM *d = BN_new();
117*758e9fbaSOystein Eftevaag     BIGNUM *p = BN_new();
118*758e9fbaSOystein Eftevaag     BIGNUM *q = BN_new();
119*758e9fbaSOystein Eftevaag     BIGNUM *dmp1 = BN_new();
120*758e9fbaSOystein Eftevaag     BIGNUM *dmq1 = BN_new();
121*758e9fbaSOystein Eftevaag     BIGNUM *iqmp = BN_new();
122*758e9fbaSOystein Eftevaag     BIGNUM *n = BN_bin2bn(out_public.publicArea.unique.rsa.buffer,
123*758e9fbaSOystein Eftevaag                           out_public.publicArea.unique.rsa.size, NULL);
124*758e9fbaSOystein Eftevaag     BN_set_word(d, 0);
125*758e9fbaSOystein Eftevaag     BN_set_word(p, 0);
126*758e9fbaSOystein Eftevaag     BN_set_word(q, 0);
127*758e9fbaSOystein Eftevaag     BN_set_word(dmp1, 0);
128*758e9fbaSOystein Eftevaag     BN_set_word(dmq1, 0);
129*758e9fbaSOystein Eftevaag     BN_set_word(iqmp, 0);
130*758e9fbaSOystein Eftevaag     uint32_t exp;
131*758e9fbaSOystein Eftevaag     if (out_public.publicArea.parameters.rsaDetail.exponent == 0)
132*758e9fbaSOystein Eftevaag         exp = 65537;
133*758e9fbaSOystein Eftevaag     else
134*758e9fbaSOystein Eftevaag         exp = out_public.publicArea.parameters.rsaDetail.exponent;
135*758e9fbaSOystein Eftevaag     BN_set_word(e, exp);
136*758e9fbaSOystein Eftevaag 
137*758e9fbaSOystein Eftevaag #if OPENSSL_VERSION_NUMBER < 0x10100000
138*758e9fbaSOystein Eftevaag     rsa->e = e;
139*758e9fbaSOystein Eftevaag     rsa->n = n;
140*758e9fbaSOystein Eftevaag     rsa->d = d;
141*758e9fbaSOystein Eftevaag     rsa->p = p;
142*758e9fbaSOystein Eftevaag     rsa->q = q;
143*758e9fbaSOystein Eftevaag     rsa->dmp1 = dmp1;
144*758e9fbaSOystein Eftevaag     rsa->dmq1 = dmq1;
145*758e9fbaSOystein Eftevaag     rsa->iqmp = iqmp;
146*758e9fbaSOystein Eftevaag #else /* OPENSSL_VERSION_NUMBER < 0x10100000 */
147*758e9fbaSOystein Eftevaag     RSA_set0_key(rsa, n, e, d);
148*758e9fbaSOystein Eftevaag     RSA_set0_factors(rsa, p, q);
149*758e9fbaSOystein Eftevaag     RSA_set0_crt_params(rsa, dmp1, dmq1, iqmp);
150*758e9fbaSOystein Eftevaag #endif /* OPENSSL_VERSION_NUMBER < 0x10100000 */
151*758e9fbaSOystein Eftevaag 
152*758e9fbaSOystein Eftevaag     EVP_PKEY_assign_RSA(evp, rsa);
153*758e9fbaSOystein Eftevaag 
154*758e9fbaSOystein Eftevaag     if (!PEM_write_bio_PUBKEY(bio, evp)) {
155*758e9fbaSOystein Eftevaag         LOG_ERROR("PEM_write failed");
156*758e9fbaSOystein Eftevaag         exit(1);
157*758e9fbaSOystein Eftevaag     }
158*758e9fbaSOystein Eftevaag 
159*758e9fbaSOystein Eftevaag     EVP_PKEY_free(evp);
160*758e9fbaSOystein Eftevaag     BIO_free(bio);
161*758e9fbaSOystein Eftevaag 
162*758e9fbaSOystein Eftevaag     return 0;
163*758e9fbaSOystein Eftevaag }
164