sys-util.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745
  1. /* SPDX-License-Identifier: BSD-2-Clause */
  2. /***********************************************************************
  3. * Copyright (c) 2017-2018, Intel Corporation
  4. *
  5. * All rights reserved.
  6. ***********************************************************************/
  7. #ifdef HAVE_CONFIG_H
  8. #include <config.h>
  9. #endif
  10. #include <inttypes.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include <assert.h>
  14. #include <openssl/evp.h>
  15. #include <openssl/sha.h>
  16. #if OPENSSL_VERSION_NUMBER < 0x30000000L
  17. #include <openssl/hmac.h>
  18. #else
  19. #include <openssl/core_names.h>
  20. #endif
  21. #define LOGMODULE testintegration
  22. #include "util/log.h"
  23. #include "sys-util.h"
  24. #include "test.h"
  25. /*
  26. * Use te provide SYS context to create & load a primary key. The key will
  27. * be a 2048 bit (restricted decryption) RSA key. The associated symmetric
  28. * key is a 128 bit AES (CFB mode) key.
  29. */
  30. TSS2_RC
  31. create_primary_rsa_2048_aes_128_cfb (
  32. TSS2_SYS_CONTEXT *sys_context,
  33. TPM2_HANDLE *handle)
  34. {
  35. TSS2_RC rc = TSS2_RC_SUCCESS;
  36. TPM2B_SENSITIVE_CREATE in_sensitive = { 0 };
  37. TPM2B_PUBLIC in_public = { 0 };
  38. TPM2B_DATA outside_info = { 0 };
  39. TPML_PCR_SELECTION creation_pcr = { 0 };
  40. TPM2B_PUBLIC out_public = { 0 };
  41. TPM2B_CREATION_DATA creation_data = { 0 };
  42. TPM2B_DIGEST creation_hash = TPM2B_DIGEST_INIT;
  43. TPMT_TK_CREATION creation_ticket = { 0 };
  44. TPM2B_NAME name = TPM2B_NAME_INIT;
  45. /* session parameters */
  46. /* command session info */
  47. TSS2L_SYS_AUTH_COMMAND sessions_cmd = {
  48. .auths = {{ .sessionHandle = TPM2_RH_PW }},
  49. .count = 1
  50. };
  51. /* response session info */
  52. TSS2L_SYS_AUTH_RESPONSE sessions_rsp = {
  53. .auths = { 0 },
  54. .count = 0
  55. };
  56. if (sys_context == NULL || handle == NULL) {
  57. return TSS2_RC_LAYER_MASK | TSS2_BASE_RC_BAD_REFERENCE;
  58. }
  59. in_public.publicArea.type = TPM2_ALG_RSA;
  60. in_public.publicArea.nameAlg = TPM2_ALG_SHA256;
  61. in_public.publicArea.objectAttributes |= TPMA_OBJECT_RESTRICTED;
  62. in_public.publicArea.objectAttributes |= TPMA_OBJECT_USERWITHAUTH;
  63. in_public.publicArea.objectAttributes |= TPMA_OBJECT_DECRYPT;
  64. in_public.publicArea.objectAttributes |= TPMA_OBJECT_FIXEDTPM;
  65. in_public.publicArea.objectAttributes |= TPMA_OBJECT_FIXEDPARENT;
  66. in_public.publicArea.objectAttributes |= TPMA_OBJECT_SENSITIVEDATAORIGIN;
  67. in_public.publicArea.parameters.rsaDetail.symmetric.algorithm = TPM2_ALG_AES;
  68. in_public.publicArea.parameters.rsaDetail.symmetric.keyBits.aes = 128;
  69. in_public.publicArea.parameters.rsaDetail.symmetric.mode.aes = TPM2_ALG_CFB;
  70. in_public.publicArea.parameters.rsaDetail.scheme.scheme = TPM2_ALG_NULL;
  71. in_public.publicArea.parameters.rsaDetail.keyBits = 2048;
  72. LOG_INFO("CreatePrimary RSA 2048, AES 128 CFB");
  73. rc = Tss2_Sys_CreatePrimary (sys_context,
  74. TPM2_RH_OWNER,
  75. &sessions_cmd,
  76. &in_sensitive,
  77. &in_public,
  78. &outside_info,
  79. &creation_pcr,
  80. handle,
  81. &out_public,
  82. &creation_data,
  83. &creation_hash,
  84. &creation_ticket,
  85. &name,
  86. &sessions_rsp);
  87. if (rc == TPM2_RC_SUCCESS) {
  88. LOG_INFO("success");
  89. } else {
  90. LOG_ERROR("CreatePrimary FAILED! Response Code : 0x%x", rc);
  91. exit(1);
  92. }
  93. return rc;
  94. }
  95. TSS2_RC
  96. create_aes_128_cfb (
  97. TSS2_SYS_CONTEXT *sys_context,
  98. TPM2_HANDLE handle_parent,
  99. TPM2_HANDLE *handle)
  100. {
  101. TSS2_RC rc = TSS2_RC_SUCCESS;
  102. TPM2B_SENSITIVE_CREATE in_sensitive = { 0 };
  103. /* template defining key type */
  104. TPM2B_PUBLIC in_public = {
  105. .size = 0,
  106. .publicArea.type = TPM2_ALG_SYMCIPHER,
  107. .publicArea.nameAlg = TPM2_ALG_SHA256,
  108. .publicArea.objectAttributes = TPMA_OBJECT_DECRYPT |
  109. TPMA_OBJECT_FIXEDTPM |
  110. TPMA_OBJECT_FIXEDPARENT |
  111. TPMA_OBJECT_SENSITIVEDATAORIGIN |
  112. TPMA_OBJECT_SIGN_ENCRYPT |
  113. TPMA_OBJECT_USERWITHAUTH,
  114. .publicArea.parameters.symDetail.sym = {
  115. .algorithm = TPM2_ALG_AES,
  116. .keyBits.sym = 128,
  117. .mode.sym = TPM2_ALG_CFB,
  118. },
  119. };
  120. TPM2B_DATA outside_info = { 0 };
  121. TPML_PCR_SELECTION creation_pcr = { 0 };
  122. TPM2B_PRIVATE out_private = TPM2B_PRIVATE_INIT;
  123. TPM2B_PUBLIC out_public = { 0 };
  124. TPM2B_CREATION_DATA creation_data = { 0 };
  125. TPM2B_DIGEST creation_hash = TPM2B_DIGEST_INIT;
  126. TPMT_TK_CREATION creation_ticket = { 0 };
  127. TPM2B_NAME name = TPM2B_NAME_INIT;
  128. /* session parameters */
  129. /* command session info */
  130. TSS2L_SYS_AUTH_COMMAND sessions_cmd = {
  131. .auths = {{ .sessionHandle = TPM2_RH_PW }},
  132. .count = 1
  133. };
  134. /* response session info */
  135. TSS2L_SYS_AUTH_RESPONSE sessions_rsp = {
  136. .auths = { 0 },
  137. .count = 0
  138. };
  139. rc = TSS2_RETRY_EXP (Tss2_Sys_Create (sys_context,
  140. handle_parent,
  141. &sessions_cmd,
  142. &in_sensitive,
  143. &in_public,
  144. &outside_info,
  145. &creation_pcr,
  146. &out_private,
  147. &out_public,
  148. &creation_data,
  149. &creation_hash,
  150. &creation_ticket,
  151. &sessions_rsp));
  152. if (rc != TPM2_RC_SUCCESS) {
  153. return rc;
  154. }
  155. return Tss2_Sys_Load (sys_context,
  156. handle_parent,
  157. &sessions_cmd,
  158. &out_private,
  159. &out_public,
  160. handle,
  161. &name,
  162. &sessions_rsp);
  163. }
  164. TSS2_RC
  165. create_keyedhash_key (
  166. TSS2_SYS_CONTEXT *sys_context,
  167. TPM2_HANDLE handle_parent,
  168. TPM2_HANDLE *handle)
  169. {
  170. TSS2_RC rc = TSS2_RC_SUCCESS;
  171. TPM2B_SENSITIVE_CREATE in_sensitive = { 0 };
  172. /* template defining key type */
  173. TPM2B_PUBLIC in_public = {
  174. .size = 0,
  175. .publicArea.type = TPM2_ALG_KEYEDHASH,
  176. .publicArea.nameAlg = TPM2_ALG_SHA256,
  177. .publicArea.objectAttributes = TPMA_OBJECT_RESTRICTED |
  178. TPMA_OBJECT_SIGN_ENCRYPT |
  179. TPMA_OBJECT_FIXEDTPM |
  180. TPMA_OBJECT_FIXEDPARENT |
  181. TPMA_OBJECT_SENSITIVEDATAORIGIN |
  182. TPMA_OBJECT_USERWITHAUTH,
  183. .publicArea.parameters.keyedHashDetail.scheme.scheme = TPM2_ALG_HMAC,
  184. .publicArea.parameters.keyedHashDetail.scheme.details.hmac.hashAlg = TPM2_ALG_SHA1,
  185. .publicArea.unique.keyedHash.size = 0,
  186. };
  187. TPM2B_DATA outside_info = { 0 };
  188. TPML_PCR_SELECTION creation_pcr = { 0 };
  189. TPM2B_PRIVATE out_private = TPM2B_PRIVATE_INIT;
  190. TPM2B_PUBLIC out_public = { 0 };
  191. TPM2B_CREATION_DATA creation_data = { 0 };
  192. TPM2B_DIGEST creation_hash = TPM2B_DIGEST_INIT;
  193. TPMT_TK_CREATION creation_ticket = { 0 };
  194. TPM2B_NAME name = TPM2B_NAME_INIT;
  195. /* session parameters */
  196. /* command session info */
  197. TSS2L_SYS_AUTH_COMMAND sessions_cmd = {
  198. .auths = {{ .sessionHandle = TPM2_RH_PW }},
  199. .count = 1
  200. };
  201. /* response session info */
  202. TSS2L_SYS_AUTH_RESPONSE sessions_rsp = {
  203. .auths = { 0 },
  204. .count = 0
  205. };
  206. rc = TSS2_RETRY_EXP (Tss2_Sys_Create (sys_context,
  207. handle_parent,
  208. &sessions_cmd,
  209. &in_sensitive,
  210. &in_public,
  211. &outside_info,
  212. &creation_pcr,
  213. &out_private,
  214. &out_public,
  215. &creation_data,
  216. &creation_hash,
  217. &creation_ticket,
  218. &sessions_rsp));
  219. if (rc != TPM2_RC_SUCCESS) {
  220. return rc;
  221. }
  222. return Tss2_Sys_Load (sys_context,
  223. handle_parent,
  224. &sessions_cmd,
  225. &out_private,
  226. &out_public,
  227. handle,
  228. &name,
  229. &sessions_rsp);
  230. }
  231. TSS2_RC
  232. tpm_encrypt_decrypt_cfb (
  233. TSS2_SYS_CONTEXT *sys_context,
  234. TPMI_DH_OBJECT handle,
  235. TPMI_YES_NO decrypt,
  236. TPM2B_MAX_BUFFER *data_in,
  237. TPM2B_MAX_BUFFER *data_out)
  238. {
  239. TPMI_ALG_CIPHER_MODE mode = TPM2_ALG_NULL;
  240. TPM2B_IV iv_in = TPM2B_IV_INIT;
  241. TPM2B_IV iv_out = TPM2B_IV_INIT;
  242. /* session parameters */
  243. /* command session info */
  244. /* command session info */
  245. TSS2L_SYS_AUTH_COMMAND sessions_cmd = {
  246. .auths = {{ .sessionHandle = TPM2_RH_PW }},
  247. .count = 1
  248. };
  249. /* response session info */
  250. TSS2L_SYS_AUTH_RESPONSE sessions_rsp = {
  251. .auths = { 0 },
  252. .count = 0
  253. };
  254. return Tss2_Sys_EncryptDecrypt (sys_context,
  255. handle,
  256. &sessions_cmd,
  257. decrypt,
  258. mode,
  259. &iv_in,
  260. data_in,
  261. data_out,
  262. &iv_out,
  263. &sessions_rsp);
  264. }
  265. TSS2_RC
  266. tpm_decrypt_cfb (
  267. TSS2_SYS_CONTEXT *sys_context,
  268. TPMI_DH_OBJECT handle,
  269. TPM2B_MAX_BUFFER *data_in,
  270. TPM2B_MAX_BUFFER *data_out)
  271. {
  272. return tpm_encrypt_decrypt_cfb (sys_context, handle, YES, data_in, data_out);
  273. }
  274. TSS2_RC
  275. tpm_encrypt_cfb (
  276. TSS2_SYS_CONTEXT *sys_context,
  277. TPMI_DH_OBJECT handle,
  278. TPM2B_MAX_BUFFER *data_in,
  279. TPM2B_MAX_BUFFER *data_out)
  280. {
  281. return tpm_encrypt_decrypt_cfb (sys_context, handle, NO, data_in, data_out);
  282. }
  283. TSS2_RC
  284. tpm_encrypt_decrypt_2_cfb (
  285. TSS2_SYS_CONTEXT *sys_context,
  286. TPMI_DH_OBJECT handle,
  287. TPMI_YES_NO decrypt,
  288. TPM2B_MAX_BUFFER *data_in,
  289. TPM2B_MAX_BUFFER *data_out)
  290. {
  291. TPMI_ALG_CIPHER_MODE mode = TPM2_ALG_NULL;
  292. TPM2B_IV iv_in = TPM2B_IV_INIT;
  293. TPM2B_IV iv_out = TPM2B_IV_INIT;
  294. /* session parameters */
  295. /* command session info */
  296. /* command session info */
  297. TSS2L_SYS_AUTH_COMMAND sessions_cmd = {
  298. .auths = {{ .sessionHandle = TPM2_RH_PW }},
  299. .count = 1
  300. };
  301. /* response session info */
  302. TSS2L_SYS_AUTH_RESPONSE sessions_rsp = {
  303. .auths = { 0 },
  304. .count = 0
  305. };
  306. return Tss2_Sys_EncryptDecrypt2 (sys_context,
  307. handle,
  308. &sessions_cmd,
  309. data_in,
  310. decrypt,
  311. mode,
  312. &iv_in,
  313. data_out,
  314. &iv_out,
  315. &sessions_rsp);
  316. }
  317. TSS2_RC
  318. tpm_decrypt_2_cfb (
  319. TSS2_SYS_CONTEXT *sys_context,
  320. TPMI_DH_OBJECT handle,
  321. TPM2B_MAX_BUFFER *data_in,
  322. TPM2B_MAX_BUFFER *data_out)
  323. {
  324. return tpm_encrypt_decrypt_2_cfb (sys_context, handle, YES, data_in, data_out);
  325. }
  326. TSS2_RC
  327. tpm_encrypt_2_cfb (
  328. TSS2_SYS_CONTEXT *sys_context,
  329. TPMI_DH_OBJECT handle,
  330. TPM2B_MAX_BUFFER *data_in,
  331. TPM2B_MAX_BUFFER *data_out)
  332. {
  333. return tpm_encrypt_decrypt_2_cfb (sys_context, handle, NO, data_in, data_out);
  334. }
  335. static TSS2_RC
  336. encrypt_decrypt_cfb (
  337. TPM2B_MAX_BUFFER *data_out,
  338. TPM2B_MAX_BUFFER *data_in,
  339. TPMI_YES_NO decrypt,
  340. TPM2B_MAX_BUFFER *key,
  341. TPM2B_IV *iv)
  342. {
  343. EVP_CIPHER_CTX *ctx;
  344. const EVP_CIPHER *type;
  345. TSS2_RC rc = TSS2_SYS_RC_BAD_VALUE;
  346. int len = 0, sll_rc;
  347. ctx = EVP_CIPHER_CTX_new();
  348. if (!ctx)
  349. return TSS2_SYS_RC_GENERAL_FAILURE;
  350. switch (key->size) {
  351. case 16:
  352. type = EVP_aes_128_cfb();
  353. break;
  354. case 24:
  355. type = EVP_aes_192_cfb();
  356. break;
  357. case 32:
  358. type = EVP_aes_256_cfb();
  359. break;
  360. default:
  361. goto clean;
  362. }
  363. rc = TSS2_SYS_RC_GENERAL_FAILURE;
  364. if (decrypt) {
  365. sll_rc = EVP_DecryptInit_ex(ctx, type, NULL, key->buffer, iv->buffer);
  366. if (sll_rc != 1)
  367. goto clean;
  368. sll_rc = EVP_DecryptUpdate(ctx, data_out->buffer, &len,
  369. data_in->buffer, data_in->size);
  370. if (sll_rc != 1)
  371. goto clean;
  372. data_out->size = len;
  373. sll_rc = EVP_DecryptFinal_ex(ctx, data_out->buffer + len, &len);
  374. if (sll_rc != 1)
  375. goto clean;
  376. } else {
  377. sll_rc = EVP_EncryptInit_ex(ctx, type, NULL, key->buffer, iv->buffer);
  378. if (sll_rc != 1)
  379. goto clean;
  380. sll_rc = EVP_EncryptUpdate(ctx, data_out->buffer, &len,
  381. data_in->buffer, data_in->size);
  382. if (sll_rc != 1)
  383. goto clean;
  384. data_out->size = len;
  385. sll_rc = EVP_EncryptFinal_ex(ctx, data_out->buffer + len, &len);
  386. if (sll_rc != 1)
  387. goto clean;
  388. }
  389. data_out->size += len;
  390. rc = TPM2_RC_SUCCESS;
  391. clean:
  392. EVP_CIPHER_CTX_free(ctx);
  393. return rc;
  394. }
  395. TSS2_RC
  396. decrypt_cfb (
  397. TPM2B_MAX_BUFFER *data_out,
  398. TPM2B_MAX_BUFFER *data_in,
  399. TPM2B_MAX_BUFFER *key,
  400. TPM2B_IV *iv)
  401. {
  402. return encrypt_decrypt_cfb(data_out, data_in, YES, key, iv);
  403. }
  404. TSS2_RC
  405. encrypt_cfb (
  406. TPM2B_MAX_BUFFER *data_out,
  407. TPM2B_MAX_BUFFER *data_in,
  408. TPM2B_MAX_BUFFER *key,
  409. TPM2B_IV *iv)
  410. {
  411. return encrypt_decrypt_cfb(data_out, data_in, NO, key, iv);
  412. }
  413. #if HAVE_EVP_SM3 && !defined(OPENSSL_NO_SM3)
  414. static unsigned char *SM3(const unsigned char *d, size_t n, unsigned char *md)
  415. {
  416. EVP_MD_CTX *ctx;
  417. static unsigned char m[TPM2_SM3_256_DIGEST_SIZE] = { 0 };
  418. uint32_t mdLen = TPM2_SM3_256_DIGEST_SIZE;
  419. if (md == NULL) {
  420. md = m;
  421. }
  422. ctx = EVP_MD_CTX_new();
  423. EVP_DigestInit_ex(ctx, EVP_sm3(), NULL);
  424. EVP_DigestUpdate(ctx, d, n);
  425. EVP_DigestFinal_ex(ctx, md, &mdLen);
  426. if (mdLen != TPM2_SM3_256_DIGEST_SIZE) {
  427. EVP_MD_CTX_free(ctx);
  428. return NULL;
  429. }
  430. EVP_MD_CTX_free(ctx);
  431. return md;
  432. }
  433. #endif
  434. TSS2_RC
  435. hash (
  436. TPM2_ALG_ID alg,
  437. const void *data,
  438. int size,
  439. TPM2B_DIGEST *out)
  440. {
  441. switch (alg) {
  442. case TPM2_ALG_SHA1:
  443. SHA1(data, size, out->buffer);
  444. out->size = TPM2_SHA1_DIGEST_SIZE;
  445. break;
  446. case TPM2_ALG_SHA256:
  447. SHA256(data, size, out->buffer);
  448. out->size = TPM2_SHA256_DIGEST_SIZE;
  449. break;
  450. case TPM2_ALG_SHA384:
  451. SHA384(data, size, out->buffer);
  452. out->size = TPM2_SHA384_DIGEST_SIZE;
  453. break;
  454. case TPM2_ALG_SHA512:
  455. SHA512(data, size, out->buffer);
  456. out->size = TPM2_SHA512_DIGEST_SIZE;
  457. break;
  458. #if HAVE_EVP_SM3 && !defined(OPENSSL_NO_SM3)
  459. case TPM2_ALG_SM3_256:
  460. SM3(data, size, out->buffer);
  461. out->size = TPM2_SM3_256_DIGEST_SIZE;
  462. break;
  463. #endif
  464. default:
  465. return TSS2_SYS_RC_BAD_VALUE;
  466. }
  467. return TPM2_RC_SUCCESS;
  468. }
  469. TSS2_RC
  470. hmac(
  471. TPM2_ALG_ID alg,
  472. const void *key,
  473. int key_len,
  474. TPM2B_DIGEST **buffer_list,
  475. TPM2B_DIGEST *out)
  476. {
  477. int rc = 1, i;
  478. unsigned int *buf = NULL;
  479. uint8_t *buf_ptr;
  480. EVP_MD *evp;
  481. #if OPENSSL_VERSION_NUMBER < 0x30000000L
  482. unsigned int size;
  483. HMAC_CTX *ctx = HMAC_CTX_new();
  484. #else
  485. size_t size;
  486. EVP_MAC *hmac = EVP_MAC_fetch(NULL, "HMAC", NULL);
  487. EVP_MAC_CTX *ctx = EVP_MAC_CTX_new(hmac);
  488. #endif
  489. if (!ctx)
  490. return TSS2_SYS_RC_GENERAL_FAILURE;
  491. switch (alg) {
  492. case TPM2_ALG_SHA1:
  493. evp = (EVP_MD *) EVP_sha1();
  494. out->size = TPM2_SHA1_DIGEST_SIZE;
  495. break;
  496. case TPM2_ALG_SHA256:
  497. evp = (EVP_MD *) EVP_sha256();
  498. out->size = TPM2_SHA256_DIGEST_SIZE;
  499. break;
  500. case TPM2_ALG_SHA384:
  501. evp = (EVP_MD *) EVP_sha384();
  502. out->size = TPM2_SHA384_DIGEST_SIZE;
  503. break;
  504. case TPM2_ALG_SHA512:
  505. evp = (EVP_MD *) EVP_sha512();
  506. out->size = TPM2_SHA512_DIGEST_SIZE;
  507. break;
  508. #if HAVE_EVP_SM3 && !defined(OPENSSL_NO_SM3)
  509. case TPM2_ALG_SM3_256:
  510. evp = (EVP_MD *) EVP_sm3();
  511. out->size = TPM2_SM3_256_DIGEST_SIZE;
  512. break;
  513. #endif
  514. default:
  515. rc = TSS2_SYS_RC_BAD_VALUE;
  516. goto out;
  517. }
  518. rc = 0;
  519. buf = calloc(1, out->size);
  520. if (!buf)
  521. goto out;
  522. buf_ptr = (uint8_t *)buf;
  523. #if OPENSSL_VERSION_NUMBER < 0x30000000L
  524. rc = HMAC_Init_ex(ctx, key, key_len, evp, NULL);
  525. #else
  526. OSSL_PARAM params[2];
  527. params[0] = OSSL_PARAM_construct_utf8_string(OSSL_ALG_PARAM_DIGEST,
  528. (char *)EVP_MD_get0_name(evp), 0);
  529. params[1] = OSSL_PARAM_construct_end();
  530. rc = EVP_MAC_init(ctx, key, key_len, params);
  531. #endif
  532. if (rc != 1)
  533. goto out;
  534. for (i = 0; buffer_list[i] != 0; i++) {
  535. #if OPENSSL_VERSION_NUMBER < 0x30000000L
  536. rc = HMAC_Update(ctx, buffer_list[i]->buffer, buffer_list[i]->size);
  537. #else
  538. rc = EVP_MAC_update(ctx, buffer_list[i]->buffer, buffer_list[i]->size);
  539. #endif
  540. if (rc != 1)
  541. goto out;
  542. }
  543. /* buf_ptr has to be 4 bytes alligned for whatever reason */
  544. #if OPENSSL_VERSION_NUMBER < 0x30000000L
  545. rc = HMAC_Final(ctx, buf_ptr, &size);
  546. #else
  547. rc = EVP_MAC_final(ctx, buf_ptr, &size, out->size);
  548. #endif
  549. if (rc != 1)
  550. goto out;
  551. assert(size == out->size);
  552. memcpy(out->buffer, buf, out->size);
  553. out:
  554. #if OPENSSL_VERSION_NUMBER < 0x30000000L
  555. HMAC_CTX_free(ctx);
  556. #else
  557. EVP_MAC_CTX_free(ctx);
  558. EVP_MAC_free(hmac);
  559. #endif
  560. if (buf)
  561. free(buf);
  562. /* In openSSL 1 means success 0 error */
  563. return rc == 1 ? TPM2_RC_SUCCESS : TSS2_SYS_RC_GENERAL_FAILURE;
  564. }
  565. TSS2_RC
  566. ConcatSizedByteBuffer(
  567. TPM2B_MAX_BUFFER *result,
  568. TPM2B *buf)
  569. {
  570. if (result->size + buf->size > TPM2_MAX_DIGEST_BUFFER)
  571. return TSS2_SYS_RC_BAD_VALUE;
  572. memmove(result->buffer + result->size,
  573. buf->buffer, buf->size);
  574. result->size += buf->size;
  575. return TPM2_RC_SUCCESS;
  576. }
  577. TSS2_RC
  578. CompareSizedByteBuffer(
  579. TPM2B *buffer1,
  580. TPM2B *buffer2)
  581. {
  582. if (buffer1->size != buffer2->size)
  583. return TPM2_RC_FAILURE;
  584. if (memcmp(buffer1->buffer, buffer2->buffer, buffer1->size))
  585. return TPM2_RC_FAILURE;
  586. return TPM2_RC_SUCCESS;
  587. }
  588. void
  589. CatSizedByteBuffer(
  590. TPM2B *dest,
  591. TPM2B *src)
  592. {
  593. if (!dest || !src)
  594. return;
  595. memcpy(dest->buffer + dest->size, src->buffer, src->size);
  596. dest->size += src->size;
  597. }
  598. UINT16
  599. CopySizedByteBuffer(
  600. TPM2B *dest,
  601. const TPM2B *src)
  602. {
  603. if (!dest)
  604. return 0;
  605. if (!src) {
  606. dest->size = 0;
  607. return 0;
  608. }
  609. memcpy(dest->buffer, src->buffer, src->size);
  610. dest->size = src->size;
  611. return src->size + 2;
  612. }
  613. UINT16
  614. GetDigestSize(TPM2_ALG_ID hash)
  615. {
  616. switch (hash) {
  617. case TPM2_ALG_SHA1:
  618. return TPM2_SHA1_DIGEST_SIZE;
  619. case TPM2_ALG_SHA256:
  620. return TPM2_SHA256_DIGEST_SIZE;
  621. case TPM2_ALG_SHA384:
  622. return TPM2_SHA384_DIGEST_SIZE;
  623. case TPM2_ALG_SHA512:
  624. return TPM2_SHA512_DIGEST_SIZE;
  625. case TPM2_ALG_SM3_256:
  626. return TPM2_SM3_256_DIGEST_SIZE;
  627. default:
  628. return 0;
  629. }
  630. }
  631. TSS2_RC
  632. DefineNvIndex (
  633. TSS2_SYS_CONTEXT *sys_ctx,
  634. TPMI_RH_PROVISION authHandle,
  635. TPM2B_AUTH *auth,
  636. const TPM2B_DIGEST *authPolicy,
  637. TPMI_RH_NV_INDEX nvIndex,
  638. TPMI_ALG_HASH nameAlg,
  639. TPMA_NV attributes,
  640. UINT16 size)
  641. {
  642. TPM2B_NV_PUBLIC publicInfo = {
  643. .nvPublic = {
  644. .attributes = attributes | TPMA_NV_ORDERLY,
  645. .dataSize = size,
  646. .nameAlg = nameAlg,
  647. .nvIndex = nvIndex,
  648. },
  649. .size = sizeof (TPMI_RH_NV_INDEX) + sizeof (TPMI_ALG_HASH) +
  650. sizeof (TPMA_NV) + sizeof (UINT16) + sizeof (UINT16),
  651. };
  652. CopySizedByteBuffer ((TPM2B*)&publicInfo.nvPublic.authPolicy,
  653. (TPM2B*)authPolicy);
  654. TSS2L_SYS_AUTH_RESPONSE sessionsDataOut;
  655. TSS2L_SYS_AUTH_COMMAND sessionsData = {
  656. .count = 1,
  657. .auths = {
  658. {
  659. .sessionHandle = TPM2_RH_PW,
  660. .sessionAttributes = 0,
  661. .nonce = { .size = 0 },
  662. .hmac = { .size = 0 },
  663. },
  664. },
  665. };
  666. return Tss2_Sys_NV_DefineSpace (sys_ctx,
  667. authHandle,
  668. &sessionsData,
  669. auth,
  670. &publicInfo,
  671. &sessionsDataOut);
  672. }