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