ssl_tls13_keys.c 63 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885
  1. /*
  2. * TLS 1.3 key schedule
  3. *
  4. * Copyright The Mbed TLS Contributors
  5. * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
  6. */
  7. #include "common.h"
  8. #if defined(MBEDTLS_SSL_PROTO_TLS1_3)
  9. #include <stdint.h>
  10. #include <string.h>
  11. #include "mbedtls/hkdf.h"
  12. #include "debug_internal.h"
  13. #include "mbedtls/error.h"
  14. #include "mbedtls/platform.h"
  15. #include "ssl_misc.h"
  16. #include "ssl_tls13_keys.h"
  17. #include "ssl_tls13_invasive.h"
  18. #include "psa/crypto.h"
  19. #include "mbedtls/psa_util.h"
  20. /* Define a local translating function to save code size by not using too many
  21. * arguments in each translating place. */
  22. static int local_err_translation(psa_status_t status)
  23. {
  24. return psa_status_to_mbedtls(status, psa_to_ssl_errors,
  25. ARRAY_LENGTH(psa_to_ssl_errors),
  26. psa_generic_status_to_mbedtls);
  27. }
  28. #define PSA_TO_MBEDTLS_ERR(status) local_err_translation(status)
  29. #define MBEDTLS_SSL_TLS1_3_LABEL(name, string) \
  30. .name = string,
  31. struct mbedtls_ssl_tls13_labels_struct const mbedtls_ssl_tls13_labels =
  32. {
  33. /* This seems to work in C, despite the string literal being one
  34. * character too long due to the 0-termination. */
  35. MBEDTLS_SSL_TLS1_3_LABEL_LIST
  36. };
  37. #undef MBEDTLS_SSL_TLS1_3_LABEL
  38. /*
  39. * This function creates a HkdfLabel structure used in the TLS 1.3 key schedule.
  40. *
  41. * The HkdfLabel is specified in RFC 8446 as follows:
  42. *
  43. * struct HkdfLabel {
  44. * uint16 length; // Length of expanded key material
  45. * opaque label<7..255>; // Always prefixed by "tls13 "
  46. * opaque context<0..255>; // Usually a communication transcript hash
  47. * };
  48. *
  49. * Parameters:
  50. * - desired_length: Length of expanded key material
  51. * Even though the standard allows expansion to up to
  52. * 2**16 Bytes, TLS 1.3 never uses expansion to more than
  53. * 255 Bytes, so we require `desired_length` to be at most
  54. * 255. This allows us to save a few Bytes of code by
  55. * hardcoding the writing of the high bytes.
  56. * - (label, label_len): label + label length, without "tls13 " prefix
  57. * The label length MUST be less than or equal to
  58. * MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_LABEL_LEN
  59. * It is the caller's responsibility to ensure this.
  60. * All (label, label length) pairs used in TLS 1.3
  61. * can be obtained via MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN().
  62. * - (ctx, ctx_len): context + context length
  63. * The context length MUST be less than or equal to
  64. * MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_CONTEXT_LEN
  65. * It is the caller's responsibility to ensure this.
  66. * - dst: Target buffer for HkdfLabel structure,
  67. * This MUST be a writable buffer of size
  68. * at least SSL_TLS1_3_KEY_SCHEDULE_MAX_HKDF_LABEL_LEN Bytes.
  69. * - dst_len: Pointer at which to store the actual length of
  70. * the HkdfLabel structure on success.
  71. */
  72. static const char tls13_label_prefix[6] = "tls13 ";
  73. #define SSL_TLS1_3_KEY_SCHEDULE_HKDF_LABEL_LEN(label_len, context_len) \
  74. (2 /* expansion length */ \
  75. + 1 /* label length */ \
  76. + label_len \
  77. + 1 /* context length */ \
  78. + context_len)
  79. #define SSL_TLS1_3_KEY_SCHEDULE_MAX_HKDF_LABEL_LEN \
  80. SSL_TLS1_3_KEY_SCHEDULE_HKDF_LABEL_LEN( \
  81. sizeof(tls13_label_prefix) + \
  82. MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_LABEL_LEN, \
  83. MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_CONTEXT_LEN)
  84. static void ssl_tls13_hkdf_encode_label(
  85. size_t desired_length,
  86. const unsigned char *label, size_t label_len,
  87. const unsigned char *ctx, size_t ctx_len,
  88. unsigned char *dst, size_t *dst_len)
  89. {
  90. size_t total_label_len =
  91. sizeof(tls13_label_prefix) + label_len;
  92. size_t total_hkdf_lbl_len =
  93. SSL_TLS1_3_KEY_SCHEDULE_HKDF_LABEL_LEN(total_label_len, ctx_len);
  94. unsigned char *p = dst;
  95. /* Add the size of the expanded key material.
  96. * We're hardcoding the high byte to 0 here assuming that we never use
  97. * TLS 1.3 HKDF key expansion to more than 255 Bytes. */
  98. #if MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_EXPANSION_LEN > 255
  99. #error "The implementation of ssl_tls13_hkdf_encode_label() is not fit for the \
  100. value of MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_EXPANSION_LEN"
  101. #endif
  102. *p++ = 0;
  103. *p++ = MBEDTLS_BYTE_0(desired_length);
  104. /* Add label incl. prefix */
  105. *p++ = MBEDTLS_BYTE_0(total_label_len);
  106. memcpy(p, tls13_label_prefix, sizeof(tls13_label_prefix));
  107. p += sizeof(tls13_label_prefix);
  108. memcpy(p, label, label_len);
  109. p += label_len;
  110. /* Add context value */
  111. *p++ = MBEDTLS_BYTE_0(ctx_len);
  112. if (ctx_len != 0) {
  113. memcpy(p, ctx, ctx_len);
  114. }
  115. /* Return total length to the caller. */
  116. *dst_len = total_hkdf_lbl_len;
  117. }
  118. int mbedtls_ssl_tls13_hkdf_expand_label(
  119. psa_algorithm_t hash_alg,
  120. const unsigned char *secret, size_t secret_len,
  121. const unsigned char *label, size_t label_len,
  122. const unsigned char *ctx, size_t ctx_len,
  123. unsigned char *buf, size_t buf_len)
  124. {
  125. unsigned char hkdf_label[SSL_TLS1_3_KEY_SCHEDULE_MAX_HKDF_LABEL_LEN];
  126. size_t hkdf_label_len = 0;
  127. psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
  128. psa_status_t abort_status = PSA_ERROR_CORRUPTION_DETECTED;
  129. psa_key_derivation_operation_t operation =
  130. PSA_KEY_DERIVATION_OPERATION_INIT;
  131. if (label_len > MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_LABEL_LEN) {
  132. /* Should never happen since this is an internal
  133. * function, and we know statically which labels
  134. * are allowed. */
  135. return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
  136. }
  137. if (ctx_len > MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_CONTEXT_LEN) {
  138. /* Should not happen, as above. */
  139. return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
  140. }
  141. if (buf_len > MBEDTLS_SSL_TLS1_3_KEY_SCHEDULE_MAX_EXPANSION_LEN) {
  142. /* Should not happen, as above. */
  143. return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
  144. }
  145. if (!PSA_ALG_IS_HASH(hash_alg)) {
  146. return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
  147. }
  148. ssl_tls13_hkdf_encode_label(buf_len,
  149. label, label_len,
  150. ctx, ctx_len,
  151. hkdf_label,
  152. &hkdf_label_len);
  153. status = psa_key_derivation_setup(&operation, PSA_ALG_HKDF_EXPAND(hash_alg));
  154. if (status != PSA_SUCCESS) {
  155. goto cleanup;
  156. }
  157. status = psa_key_derivation_input_bytes(&operation,
  158. PSA_KEY_DERIVATION_INPUT_SECRET,
  159. secret,
  160. secret_len);
  161. if (status != PSA_SUCCESS) {
  162. goto cleanup;
  163. }
  164. status = psa_key_derivation_input_bytes(&operation,
  165. PSA_KEY_DERIVATION_INPUT_INFO,
  166. hkdf_label,
  167. hkdf_label_len);
  168. if (status != PSA_SUCCESS) {
  169. goto cleanup;
  170. }
  171. status = psa_key_derivation_output_bytes(&operation,
  172. buf,
  173. buf_len);
  174. if (status != PSA_SUCCESS) {
  175. goto cleanup;
  176. }
  177. cleanup:
  178. abort_status = psa_key_derivation_abort(&operation);
  179. status = (status == PSA_SUCCESS ? abort_status : status);
  180. mbedtls_platform_zeroize(hkdf_label, hkdf_label_len);
  181. return PSA_TO_MBEDTLS_ERR(status);
  182. }
  183. MBEDTLS_CHECK_RETURN_CRITICAL
  184. static int ssl_tls13_make_traffic_key(
  185. psa_algorithm_t hash_alg,
  186. const unsigned char *secret, size_t secret_len,
  187. unsigned char *key, size_t key_len,
  188. unsigned char *iv, size_t iv_len)
  189. {
  190. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  191. ret = mbedtls_ssl_tls13_hkdf_expand_label(
  192. hash_alg,
  193. secret, secret_len,
  194. MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(key),
  195. NULL, 0,
  196. key, key_len);
  197. if (ret != 0) {
  198. return ret;
  199. }
  200. ret = mbedtls_ssl_tls13_hkdf_expand_label(
  201. hash_alg,
  202. secret, secret_len,
  203. MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(iv),
  204. NULL, 0,
  205. iv, iv_len);
  206. return ret;
  207. }
  208. /*
  209. * The traffic keying material is generated from the following inputs:
  210. *
  211. * - One secret value per sender.
  212. * - A purpose value indicating the specific value being generated
  213. * - The desired lengths of key and IV.
  214. *
  215. * The expansion itself is based on HKDF:
  216. *
  217. * [sender]_write_key = HKDF-Expand-Label( Secret, "key", "", key_length )
  218. * [sender]_write_iv = HKDF-Expand-Label( Secret, "iv" , "", iv_length )
  219. *
  220. * [sender] denotes the sending side and the Secret value is provided
  221. * by the function caller. Note that we generate server and client side
  222. * keys in a single function call.
  223. */
  224. int mbedtls_ssl_tls13_make_traffic_keys(
  225. psa_algorithm_t hash_alg,
  226. const unsigned char *client_secret,
  227. const unsigned char *server_secret, size_t secret_len,
  228. size_t key_len, size_t iv_len,
  229. mbedtls_ssl_key_set *keys)
  230. {
  231. int ret = 0;
  232. ret = ssl_tls13_make_traffic_key(
  233. hash_alg, client_secret, secret_len,
  234. keys->client_write_key, key_len,
  235. keys->client_write_iv, iv_len);
  236. if (ret != 0) {
  237. return ret;
  238. }
  239. ret = ssl_tls13_make_traffic_key(
  240. hash_alg, server_secret, secret_len,
  241. keys->server_write_key, key_len,
  242. keys->server_write_iv, iv_len);
  243. if (ret != 0) {
  244. return ret;
  245. }
  246. keys->key_len = key_len;
  247. keys->iv_len = iv_len;
  248. return 0;
  249. }
  250. int mbedtls_ssl_tls13_derive_secret(
  251. psa_algorithm_t hash_alg,
  252. const unsigned char *secret, size_t secret_len,
  253. const unsigned char *label, size_t label_len,
  254. const unsigned char *ctx, size_t ctx_len,
  255. int ctx_hashed,
  256. unsigned char *dstbuf, size_t dstbuf_len)
  257. {
  258. int ret;
  259. unsigned char hashed_context[PSA_HASH_MAX_SIZE];
  260. if (ctx_hashed == MBEDTLS_SSL_TLS1_3_CONTEXT_UNHASHED) {
  261. psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
  262. status = psa_hash_compute(hash_alg, ctx, ctx_len, hashed_context,
  263. PSA_HASH_LENGTH(hash_alg), &ctx_len);
  264. if (status != PSA_SUCCESS) {
  265. ret = PSA_TO_MBEDTLS_ERR(status);
  266. return ret;
  267. }
  268. } else {
  269. if (ctx_len > sizeof(hashed_context)) {
  270. /* This should never happen since this function is internal
  271. * and the code sets `ctx_hashed` correctly.
  272. * Let's double-check nonetheless to not run at the risk
  273. * of getting a stack overflow. */
  274. return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
  275. }
  276. memcpy(hashed_context, ctx, ctx_len);
  277. }
  278. return mbedtls_ssl_tls13_hkdf_expand_label(hash_alg,
  279. secret, secret_len,
  280. label, label_len,
  281. hashed_context, ctx_len,
  282. dstbuf, dstbuf_len);
  283. }
  284. int mbedtls_ssl_tls13_evolve_secret(
  285. psa_algorithm_t hash_alg,
  286. const unsigned char *secret_old,
  287. const unsigned char *input, size_t input_len,
  288. unsigned char *secret_new)
  289. {
  290. int ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR;
  291. psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
  292. psa_status_t abort_status = PSA_ERROR_CORRUPTION_DETECTED;
  293. size_t hlen;
  294. unsigned char tmp_secret[PSA_MAC_MAX_SIZE] = { 0 };
  295. const unsigned char all_zeroes_input[MBEDTLS_TLS1_3_MD_MAX_SIZE] = { 0 };
  296. const unsigned char *l_input = NULL;
  297. size_t l_input_len;
  298. psa_key_derivation_operation_t operation =
  299. PSA_KEY_DERIVATION_OPERATION_INIT;
  300. if (!PSA_ALG_IS_HASH(hash_alg)) {
  301. return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
  302. }
  303. hlen = PSA_HASH_LENGTH(hash_alg);
  304. /* For non-initial runs, call Derive-Secret( ., "derived", "")
  305. * on the old secret. */
  306. if (secret_old != NULL) {
  307. ret = mbedtls_ssl_tls13_derive_secret(
  308. hash_alg,
  309. secret_old, hlen,
  310. MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(derived),
  311. NULL, 0, /* context */
  312. MBEDTLS_SSL_TLS1_3_CONTEXT_UNHASHED,
  313. tmp_secret, hlen);
  314. if (ret != 0) {
  315. goto cleanup;
  316. }
  317. }
  318. ret = 0;
  319. if (input != NULL && input_len != 0) {
  320. l_input = input;
  321. l_input_len = input_len;
  322. } else {
  323. l_input = all_zeroes_input;
  324. l_input_len = hlen;
  325. }
  326. status = psa_key_derivation_setup(&operation,
  327. PSA_ALG_HKDF_EXTRACT(hash_alg));
  328. if (status != PSA_SUCCESS) {
  329. goto cleanup;
  330. }
  331. status = psa_key_derivation_input_bytes(&operation,
  332. PSA_KEY_DERIVATION_INPUT_SALT,
  333. tmp_secret,
  334. hlen);
  335. if (status != PSA_SUCCESS) {
  336. goto cleanup;
  337. }
  338. status = psa_key_derivation_input_bytes(&operation,
  339. PSA_KEY_DERIVATION_INPUT_SECRET,
  340. l_input, l_input_len);
  341. if (status != PSA_SUCCESS) {
  342. goto cleanup;
  343. }
  344. status = psa_key_derivation_output_bytes(&operation,
  345. secret_new,
  346. PSA_HASH_LENGTH(hash_alg));
  347. if (status != PSA_SUCCESS) {
  348. goto cleanup;
  349. }
  350. cleanup:
  351. abort_status = psa_key_derivation_abort(&operation);
  352. status = (status == PSA_SUCCESS ? abort_status : status);
  353. ret = (ret == 0 ? PSA_TO_MBEDTLS_ERR(status) : ret);
  354. mbedtls_platform_zeroize(tmp_secret, sizeof(tmp_secret));
  355. return ret;
  356. }
  357. int mbedtls_ssl_tls13_derive_early_secrets(
  358. psa_algorithm_t hash_alg,
  359. unsigned char const *early_secret,
  360. unsigned char const *transcript, size_t transcript_len,
  361. mbedtls_ssl_tls13_early_secrets *derived)
  362. {
  363. int ret;
  364. size_t const hash_len = PSA_HASH_LENGTH(hash_alg);
  365. /* We should never call this function with an unknown hash,
  366. * but add an assertion anyway. */
  367. if (!PSA_ALG_IS_HASH(hash_alg)) {
  368. return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
  369. }
  370. /*
  371. * 0
  372. * |
  373. * v
  374. * PSK -> HKDF-Extract = Early Secret
  375. * |
  376. * +-----> Derive-Secret(., "c e traffic", ClientHello)
  377. * | = client_early_traffic_secret
  378. * |
  379. * +-----> Derive-Secret(., "e exp master", ClientHello)
  380. * | = early_exporter_master_secret
  381. * v
  382. */
  383. /* Create client_early_traffic_secret */
  384. ret = mbedtls_ssl_tls13_derive_secret(
  385. hash_alg,
  386. early_secret, hash_len,
  387. MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(c_e_traffic),
  388. transcript, transcript_len,
  389. MBEDTLS_SSL_TLS1_3_CONTEXT_HASHED,
  390. derived->client_early_traffic_secret,
  391. hash_len);
  392. if (ret != 0) {
  393. return ret;
  394. }
  395. /* Create early exporter */
  396. ret = mbedtls_ssl_tls13_derive_secret(
  397. hash_alg,
  398. early_secret, hash_len,
  399. MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(e_exp_master),
  400. transcript, transcript_len,
  401. MBEDTLS_SSL_TLS1_3_CONTEXT_HASHED,
  402. derived->early_exporter_master_secret,
  403. hash_len);
  404. if (ret != 0) {
  405. return ret;
  406. }
  407. return 0;
  408. }
  409. int mbedtls_ssl_tls13_derive_handshake_secrets(
  410. psa_algorithm_t hash_alg,
  411. unsigned char const *handshake_secret,
  412. unsigned char const *transcript, size_t transcript_len,
  413. mbedtls_ssl_tls13_handshake_secrets *derived)
  414. {
  415. int ret;
  416. size_t const hash_len = PSA_HASH_LENGTH(hash_alg);
  417. /* We should never call this function with an unknown hash,
  418. * but add an assertion anyway. */
  419. if (!PSA_ALG_IS_HASH(hash_alg)) {
  420. return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
  421. }
  422. /*
  423. *
  424. * Handshake Secret
  425. * |
  426. * +-----> Derive-Secret( ., "c hs traffic",
  427. * | ClientHello...ServerHello )
  428. * | = client_handshake_traffic_secret
  429. * |
  430. * +-----> Derive-Secret( ., "s hs traffic",
  431. * | ClientHello...ServerHello )
  432. * | = server_handshake_traffic_secret
  433. *
  434. */
  435. /*
  436. * Compute client_handshake_traffic_secret with
  437. * Derive-Secret( ., "c hs traffic", ClientHello...ServerHello )
  438. */
  439. ret = mbedtls_ssl_tls13_derive_secret(
  440. hash_alg,
  441. handshake_secret, hash_len,
  442. MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(c_hs_traffic),
  443. transcript, transcript_len,
  444. MBEDTLS_SSL_TLS1_3_CONTEXT_HASHED,
  445. derived->client_handshake_traffic_secret,
  446. hash_len);
  447. if (ret != 0) {
  448. return ret;
  449. }
  450. /*
  451. * Compute server_handshake_traffic_secret with
  452. * Derive-Secret( ., "s hs traffic", ClientHello...ServerHello )
  453. */
  454. ret = mbedtls_ssl_tls13_derive_secret(
  455. hash_alg,
  456. handshake_secret, hash_len,
  457. MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(s_hs_traffic),
  458. transcript, transcript_len,
  459. MBEDTLS_SSL_TLS1_3_CONTEXT_HASHED,
  460. derived->server_handshake_traffic_secret,
  461. hash_len);
  462. if (ret != 0) {
  463. return ret;
  464. }
  465. return 0;
  466. }
  467. int mbedtls_ssl_tls13_derive_application_secrets(
  468. psa_algorithm_t hash_alg,
  469. unsigned char const *application_secret,
  470. unsigned char const *transcript, size_t transcript_len,
  471. mbedtls_ssl_tls13_application_secrets *derived)
  472. {
  473. int ret;
  474. size_t const hash_len = PSA_HASH_LENGTH(hash_alg);
  475. /* We should never call this function with an unknown hash,
  476. * but add an assertion anyway. */
  477. if (!PSA_ALG_IS_HASH(hash_alg)) {
  478. return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
  479. }
  480. /* Generate {client,server}_application_traffic_secret_0
  481. *
  482. * Master Secret
  483. * |
  484. * +-----> Derive-Secret( ., "c ap traffic",
  485. * | ClientHello...server Finished )
  486. * | = client_application_traffic_secret_0
  487. * |
  488. * +-----> Derive-Secret( ., "s ap traffic",
  489. * | ClientHello...Server Finished )
  490. * | = server_application_traffic_secret_0
  491. * |
  492. * +-----> Derive-Secret( ., "exp master",
  493. * | ClientHello...server Finished)
  494. * | = exporter_master_secret
  495. *
  496. */
  497. ret = mbedtls_ssl_tls13_derive_secret(
  498. hash_alg,
  499. application_secret, hash_len,
  500. MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(c_ap_traffic),
  501. transcript, transcript_len,
  502. MBEDTLS_SSL_TLS1_3_CONTEXT_HASHED,
  503. derived->client_application_traffic_secret_N,
  504. hash_len);
  505. if (ret != 0) {
  506. return ret;
  507. }
  508. ret = mbedtls_ssl_tls13_derive_secret(
  509. hash_alg,
  510. application_secret, hash_len,
  511. MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(s_ap_traffic),
  512. transcript, transcript_len,
  513. MBEDTLS_SSL_TLS1_3_CONTEXT_HASHED,
  514. derived->server_application_traffic_secret_N,
  515. hash_len);
  516. if (ret != 0) {
  517. return ret;
  518. }
  519. ret = mbedtls_ssl_tls13_derive_secret(
  520. hash_alg,
  521. application_secret, hash_len,
  522. MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(exp_master),
  523. transcript, transcript_len,
  524. MBEDTLS_SSL_TLS1_3_CONTEXT_HASHED,
  525. derived->exporter_master_secret,
  526. hash_len);
  527. if (ret != 0) {
  528. return ret;
  529. }
  530. return 0;
  531. }
  532. /* Generate resumption_master_secret for use with the ticket exchange.
  533. *
  534. * This is not integrated with mbedtls_ssl_tls13_derive_application_secrets()
  535. * because it uses the transcript hash up to and including ClientFinished. */
  536. int mbedtls_ssl_tls13_derive_resumption_master_secret(
  537. psa_algorithm_t hash_alg,
  538. unsigned char const *application_secret,
  539. unsigned char const *transcript, size_t transcript_len,
  540. mbedtls_ssl_tls13_application_secrets *derived)
  541. {
  542. int ret;
  543. size_t const hash_len = PSA_HASH_LENGTH(hash_alg);
  544. /* We should never call this function with an unknown hash,
  545. * but add an assertion anyway. */
  546. if (!PSA_ALG_IS_HASH(hash_alg)) {
  547. return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
  548. }
  549. ret = mbedtls_ssl_tls13_derive_secret(
  550. hash_alg,
  551. application_secret, hash_len,
  552. MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(res_master),
  553. transcript, transcript_len,
  554. MBEDTLS_SSL_TLS1_3_CONTEXT_HASHED,
  555. derived->resumption_master_secret,
  556. hash_len);
  557. if (ret != 0) {
  558. return ret;
  559. }
  560. return 0;
  561. }
  562. /**
  563. * \brief Transition into application stage of TLS 1.3 key schedule.
  564. *
  565. * The TLS 1.3 key schedule can be viewed as a simple state machine
  566. * with states Initial -> Early -> Handshake -> Application, and
  567. * this function represents the Handshake -> Application transition.
  568. *
  569. * In the handshake stage, ssl_tls13_generate_application_keys()
  570. * can be used to derive the handshake traffic keys.
  571. *
  572. * \param ssl The SSL context to operate on. This must be in key schedule
  573. * stage \c Handshake.
  574. *
  575. * \returns \c 0 on success.
  576. * \returns A negative error code on failure.
  577. */
  578. MBEDTLS_CHECK_RETURN_CRITICAL
  579. static int ssl_tls13_key_schedule_stage_application(mbedtls_ssl_context *ssl)
  580. {
  581. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  582. mbedtls_ssl_handshake_params *handshake = ssl->handshake;
  583. psa_algorithm_t const hash_alg = mbedtls_md_psa_alg_from_type(
  584. (mbedtls_md_type_t) handshake->ciphersuite_info->mac);
  585. /*
  586. * Compute MasterSecret
  587. */
  588. ret = mbedtls_ssl_tls13_evolve_secret(
  589. hash_alg,
  590. handshake->tls13_master_secrets.handshake,
  591. NULL, 0,
  592. handshake->tls13_master_secrets.app);
  593. if (ret != 0) {
  594. MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_evolve_secret", ret);
  595. return ret;
  596. }
  597. MBEDTLS_SSL_DEBUG_BUF(
  598. 4, "Master secret",
  599. handshake->tls13_master_secrets.app, PSA_HASH_LENGTH(hash_alg));
  600. return 0;
  601. }
  602. MBEDTLS_CHECK_RETURN_CRITICAL
  603. static int ssl_tls13_calc_finished_core(psa_algorithm_t hash_alg,
  604. unsigned char const *base_key,
  605. unsigned char const *transcript,
  606. unsigned char *dst,
  607. size_t *dst_len)
  608. {
  609. mbedtls_svc_key_id_t key = MBEDTLS_SVC_KEY_ID_INIT;
  610. psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
  611. psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
  612. size_t hash_len = PSA_HASH_LENGTH(hash_alg);
  613. unsigned char finished_key[PSA_MAC_MAX_SIZE];
  614. int ret;
  615. psa_algorithm_t alg;
  616. /* We should never call this function with an unknown hash,
  617. * but add an assertion anyway. */
  618. if (!PSA_ALG_IS_HASH(hash_alg)) {
  619. return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
  620. }
  621. /* TLS 1.3 Finished message
  622. *
  623. * struct {
  624. * opaque verify_data[Hash.length];
  625. * } Finished;
  626. *
  627. * verify_data =
  628. * HMAC( finished_key,
  629. * Hash( Handshake Context +
  630. * Certificate* +
  631. * CertificateVerify* )
  632. * )
  633. *
  634. * finished_key =
  635. * HKDF-Expand-Label( BaseKey, "finished", "", Hash.length )
  636. */
  637. ret = mbedtls_ssl_tls13_hkdf_expand_label(
  638. hash_alg, base_key, hash_len,
  639. MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(finished),
  640. NULL, 0,
  641. finished_key, hash_len);
  642. if (ret != 0) {
  643. goto exit;
  644. }
  645. alg = PSA_ALG_HMAC(hash_alg);
  646. psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_SIGN_MESSAGE);
  647. psa_set_key_algorithm(&attributes, alg);
  648. psa_set_key_type(&attributes, PSA_KEY_TYPE_HMAC);
  649. status = psa_import_key(&attributes, finished_key, hash_len, &key);
  650. if (status != PSA_SUCCESS) {
  651. ret = PSA_TO_MBEDTLS_ERR(status);
  652. goto exit;
  653. }
  654. status = psa_mac_compute(key, alg, transcript, hash_len,
  655. dst, hash_len, dst_len);
  656. ret = PSA_TO_MBEDTLS_ERR(status);
  657. exit:
  658. status = psa_destroy_key(key);
  659. if (ret == 0) {
  660. ret = PSA_TO_MBEDTLS_ERR(status);
  661. }
  662. mbedtls_platform_zeroize(finished_key, sizeof(finished_key));
  663. return ret;
  664. }
  665. int mbedtls_ssl_tls13_calculate_verify_data(mbedtls_ssl_context *ssl,
  666. unsigned char *dst,
  667. size_t dst_len,
  668. size_t *actual_len,
  669. int from)
  670. {
  671. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  672. unsigned char transcript[MBEDTLS_TLS1_3_MD_MAX_SIZE];
  673. size_t transcript_len;
  674. unsigned char *base_key = NULL;
  675. size_t base_key_len = 0;
  676. mbedtls_ssl_tls13_handshake_secrets *tls13_hs_secrets =
  677. &ssl->handshake->tls13_hs_secrets;
  678. mbedtls_md_type_t const md_type = (mbedtls_md_type_t) ssl->handshake->ciphersuite_info->mac;
  679. psa_algorithm_t hash_alg = mbedtls_md_psa_alg_from_type(
  680. (mbedtls_md_type_t) ssl->handshake->ciphersuite_info->mac);
  681. size_t const hash_len = PSA_HASH_LENGTH(hash_alg);
  682. MBEDTLS_SSL_DEBUG_MSG(2, ("=> mbedtls_ssl_tls13_calculate_verify_data"));
  683. if (from == MBEDTLS_SSL_IS_CLIENT) {
  684. base_key = tls13_hs_secrets->client_handshake_traffic_secret;
  685. base_key_len = sizeof(tls13_hs_secrets->client_handshake_traffic_secret);
  686. } else {
  687. base_key = tls13_hs_secrets->server_handshake_traffic_secret;
  688. base_key_len = sizeof(tls13_hs_secrets->server_handshake_traffic_secret);
  689. }
  690. if (dst_len < hash_len) {
  691. ret = MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL;
  692. goto exit;
  693. }
  694. ret = mbedtls_ssl_get_handshake_transcript(ssl, md_type,
  695. transcript, sizeof(transcript),
  696. &transcript_len);
  697. if (ret != 0) {
  698. MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_get_handshake_transcript", ret);
  699. goto exit;
  700. }
  701. MBEDTLS_SSL_DEBUG_BUF(4, "handshake hash", transcript, transcript_len);
  702. ret = ssl_tls13_calc_finished_core(hash_alg, base_key,
  703. transcript, dst, actual_len);
  704. if (ret != 0) {
  705. goto exit;
  706. }
  707. MBEDTLS_SSL_DEBUG_BUF(3, "verify_data for finished message", dst, hash_len);
  708. MBEDTLS_SSL_DEBUG_MSG(2, ("<= mbedtls_ssl_tls13_calculate_verify_data"));
  709. exit:
  710. /* Erase handshake secrets */
  711. mbedtls_platform_zeroize(base_key, base_key_len);
  712. mbedtls_platform_zeroize(transcript, sizeof(transcript));
  713. return ret;
  714. }
  715. int mbedtls_ssl_tls13_create_psk_binder(mbedtls_ssl_context *ssl,
  716. const psa_algorithm_t hash_alg,
  717. unsigned char const *psk, size_t psk_len,
  718. int psk_type,
  719. unsigned char const *transcript,
  720. unsigned char *result)
  721. {
  722. int ret = 0;
  723. unsigned char binder_key[PSA_MAC_MAX_SIZE];
  724. unsigned char early_secret[PSA_MAC_MAX_SIZE];
  725. size_t const hash_len = PSA_HASH_LENGTH(hash_alg);
  726. size_t actual_len;
  727. #if !defined(MBEDTLS_DEBUG_C)
  728. ssl = NULL; /* make sure we don't use it except for debug */
  729. ((void) ssl);
  730. #endif
  731. /* We should never call this function with an unknown hash,
  732. * but add an assertion anyway. */
  733. if (!PSA_ALG_IS_HASH(hash_alg)) {
  734. return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
  735. }
  736. /*
  737. * 0
  738. * |
  739. * v
  740. * PSK -> HKDF-Extract = Early Secret
  741. * |
  742. * +-----> Derive-Secret(., "ext binder" | "res binder", "")
  743. * | = binder_key
  744. * v
  745. */
  746. ret = mbedtls_ssl_tls13_evolve_secret(hash_alg,
  747. NULL, /* Old secret */
  748. psk, psk_len, /* Input */
  749. early_secret);
  750. if (ret != 0) {
  751. MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_evolve_secret", ret);
  752. goto exit;
  753. }
  754. MBEDTLS_SSL_DEBUG_BUF(4, "mbedtls_ssl_tls13_create_psk_binder",
  755. early_secret, hash_len);
  756. if (psk_type == MBEDTLS_SSL_TLS1_3_PSK_RESUMPTION) {
  757. ret = mbedtls_ssl_tls13_derive_secret(
  758. hash_alg,
  759. early_secret, hash_len,
  760. MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(res_binder),
  761. NULL, 0, MBEDTLS_SSL_TLS1_3_CONTEXT_UNHASHED,
  762. binder_key, hash_len);
  763. MBEDTLS_SSL_DEBUG_MSG(4, ("Derive Early Secret with 'res binder'"));
  764. } else {
  765. ret = mbedtls_ssl_tls13_derive_secret(
  766. hash_alg,
  767. early_secret, hash_len,
  768. MBEDTLS_SSL_TLS1_3_LBL_WITH_LEN(ext_binder),
  769. NULL, 0, MBEDTLS_SSL_TLS1_3_CONTEXT_UNHASHED,
  770. binder_key, hash_len);
  771. MBEDTLS_SSL_DEBUG_MSG(4, ("Derive Early Secret with 'ext binder'"));
  772. }
  773. if (ret != 0) {
  774. MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_derive_secret", ret);
  775. goto exit;
  776. }
  777. /*
  778. * The binding_value is computed in the same way as the Finished message
  779. * but with the BaseKey being the binder_key.
  780. */
  781. ret = ssl_tls13_calc_finished_core(hash_alg, binder_key, transcript,
  782. result, &actual_len);
  783. if (ret != 0) {
  784. goto exit;
  785. }
  786. MBEDTLS_SSL_DEBUG_BUF(3, "psk binder", result, actual_len);
  787. exit:
  788. mbedtls_platform_zeroize(early_secret, sizeof(early_secret));
  789. mbedtls_platform_zeroize(binder_key, sizeof(binder_key));
  790. return ret;
  791. }
  792. int mbedtls_ssl_tls13_populate_transform(
  793. mbedtls_ssl_transform *transform,
  794. int endpoint, int ciphersuite,
  795. mbedtls_ssl_key_set const *traffic_keys,
  796. mbedtls_ssl_context *ssl /* DEBUG ONLY */)
  797. {
  798. #if !defined(MBEDTLS_USE_PSA_CRYPTO)
  799. int ret;
  800. mbedtls_cipher_info_t const *cipher_info;
  801. #endif /* MBEDTLS_USE_PSA_CRYPTO */
  802. const mbedtls_ssl_ciphersuite_t *ciphersuite_info;
  803. unsigned char const *key_enc;
  804. unsigned char const *iv_enc;
  805. unsigned char const *key_dec;
  806. unsigned char const *iv_dec;
  807. #if defined(MBEDTLS_USE_PSA_CRYPTO)
  808. psa_key_type_t key_type;
  809. psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
  810. psa_algorithm_t alg;
  811. size_t key_bits;
  812. psa_status_t status = PSA_SUCCESS;
  813. #endif
  814. #if !defined(MBEDTLS_DEBUG_C)
  815. ssl = NULL; /* make sure we don't use it except for those cases */
  816. (void) ssl;
  817. #endif
  818. ciphersuite_info = mbedtls_ssl_ciphersuite_from_id(ciphersuite);
  819. if (ciphersuite_info == NULL) {
  820. MBEDTLS_SSL_DEBUG_MSG(1, ("ciphersuite info for %d not found",
  821. ciphersuite));
  822. return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
  823. }
  824. #if !defined(MBEDTLS_USE_PSA_CRYPTO)
  825. cipher_info = mbedtls_cipher_info_from_type(ciphersuite_info->cipher);
  826. if (cipher_info == NULL) {
  827. MBEDTLS_SSL_DEBUG_MSG(1, ("cipher info for %u not found",
  828. ciphersuite_info->cipher));
  829. return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
  830. }
  831. /*
  832. * Setup cipher contexts in target transform
  833. */
  834. if ((ret = mbedtls_cipher_setup(&transform->cipher_ctx_enc,
  835. cipher_info)) != 0) {
  836. MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_setup", ret);
  837. return ret;
  838. }
  839. if ((ret = mbedtls_cipher_setup(&transform->cipher_ctx_dec,
  840. cipher_info)) != 0) {
  841. MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_setup", ret);
  842. return ret;
  843. }
  844. #endif /* MBEDTLS_USE_PSA_CRYPTO */
  845. #if defined(MBEDTLS_SSL_SRV_C)
  846. if (endpoint == MBEDTLS_SSL_IS_SERVER) {
  847. key_enc = traffic_keys->server_write_key;
  848. key_dec = traffic_keys->client_write_key;
  849. iv_enc = traffic_keys->server_write_iv;
  850. iv_dec = traffic_keys->client_write_iv;
  851. } else
  852. #endif /* MBEDTLS_SSL_SRV_C */
  853. #if defined(MBEDTLS_SSL_CLI_C)
  854. if (endpoint == MBEDTLS_SSL_IS_CLIENT) {
  855. key_enc = traffic_keys->client_write_key;
  856. key_dec = traffic_keys->server_write_key;
  857. iv_enc = traffic_keys->client_write_iv;
  858. iv_dec = traffic_keys->server_write_iv;
  859. } else
  860. #endif /* MBEDTLS_SSL_CLI_C */
  861. {
  862. /* should not happen */
  863. return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
  864. }
  865. memcpy(transform->iv_enc, iv_enc, traffic_keys->iv_len);
  866. memcpy(transform->iv_dec, iv_dec, traffic_keys->iv_len);
  867. #if !defined(MBEDTLS_USE_PSA_CRYPTO)
  868. if ((ret = mbedtls_cipher_setkey(&transform->cipher_ctx_enc,
  869. key_enc, (int) mbedtls_cipher_info_get_key_bitlen(cipher_info),
  870. MBEDTLS_ENCRYPT)) != 0) {
  871. MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_setkey", ret);
  872. return ret;
  873. }
  874. if ((ret = mbedtls_cipher_setkey(&transform->cipher_ctx_dec,
  875. key_dec, (int) mbedtls_cipher_info_get_key_bitlen(cipher_info),
  876. MBEDTLS_DECRYPT)) != 0) {
  877. MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_cipher_setkey", ret);
  878. return ret;
  879. }
  880. #endif /* MBEDTLS_USE_PSA_CRYPTO */
  881. /*
  882. * Setup other fields in SSL transform
  883. */
  884. if ((ciphersuite_info->flags & MBEDTLS_CIPHERSUITE_SHORT_TAG) != 0) {
  885. transform->taglen = 8;
  886. } else {
  887. transform->taglen = 16;
  888. }
  889. transform->ivlen = traffic_keys->iv_len;
  890. transform->maclen = 0;
  891. transform->fixed_ivlen = transform->ivlen;
  892. transform->tls_version = MBEDTLS_SSL_VERSION_TLS1_3;
  893. /* We add the true record content type (1 Byte) to the plaintext and
  894. * then pad to the configured granularity. The minimum length of the
  895. * type-extended and padded plaintext is therefore the padding
  896. * granularity. */
  897. transform->minlen =
  898. transform->taglen + MBEDTLS_SSL_CID_TLS1_3_PADDING_GRANULARITY;
  899. #if defined(MBEDTLS_USE_PSA_CRYPTO)
  900. /*
  901. * Setup psa keys and alg
  902. */
  903. if ((status = mbedtls_ssl_cipher_to_psa((mbedtls_cipher_type_t) ciphersuite_info->cipher,
  904. transform->taglen,
  905. &alg,
  906. &key_type,
  907. &key_bits)) != PSA_SUCCESS) {
  908. MBEDTLS_SSL_DEBUG_RET(
  909. 1, "mbedtls_ssl_cipher_to_psa", PSA_TO_MBEDTLS_ERR(status));
  910. return PSA_TO_MBEDTLS_ERR(status);
  911. }
  912. transform->psa_alg = alg;
  913. if (alg != MBEDTLS_SSL_NULL_CIPHER) {
  914. psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_ENCRYPT);
  915. psa_set_key_algorithm(&attributes, alg);
  916. psa_set_key_type(&attributes, key_type);
  917. if ((status = psa_import_key(&attributes,
  918. key_enc,
  919. PSA_BITS_TO_BYTES(key_bits),
  920. &transform->psa_key_enc)) != PSA_SUCCESS) {
  921. MBEDTLS_SSL_DEBUG_RET(
  922. 1, "psa_import_key", PSA_TO_MBEDTLS_ERR(status));
  923. return PSA_TO_MBEDTLS_ERR(status);
  924. }
  925. psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_DECRYPT);
  926. if ((status = psa_import_key(&attributes,
  927. key_dec,
  928. PSA_BITS_TO_BYTES(key_bits),
  929. &transform->psa_key_dec)) != PSA_SUCCESS) {
  930. MBEDTLS_SSL_DEBUG_RET(
  931. 1, "psa_import_key", PSA_TO_MBEDTLS_ERR(status));
  932. return PSA_TO_MBEDTLS_ERR(status);
  933. }
  934. }
  935. #endif /* MBEDTLS_USE_PSA_CRYPTO */
  936. return 0;
  937. }
  938. MBEDTLS_CHECK_RETURN_CRITICAL
  939. static int ssl_tls13_get_cipher_key_info(
  940. const mbedtls_ssl_ciphersuite_t *ciphersuite_info,
  941. size_t *key_len, size_t *iv_len)
  942. {
  943. psa_key_type_t key_type;
  944. psa_algorithm_t alg;
  945. size_t taglen;
  946. size_t key_bits;
  947. psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
  948. if (ciphersuite_info->flags & MBEDTLS_CIPHERSUITE_SHORT_TAG) {
  949. taglen = 8;
  950. } else {
  951. taglen = 16;
  952. }
  953. status = mbedtls_ssl_cipher_to_psa((mbedtls_cipher_type_t) ciphersuite_info->cipher, taglen,
  954. &alg, &key_type, &key_bits);
  955. if (status != PSA_SUCCESS) {
  956. return PSA_TO_MBEDTLS_ERR(status);
  957. }
  958. *key_len = PSA_BITS_TO_BYTES(key_bits);
  959. /* TLS 1.3 only have AEAD ciphers, IV length is unconditionally 12 bytes */
  960. *iv_len = 12;
  961. return 0;
  962. }
  963. #if defined(MBEDTLS_SSL_EARLY_DATA)
  964. /*
  965. * ssl_tls13_generate_early_key() generates the key necessary for protecting
  966. * the early application data and handshake messages as described in section 7
  967. * of RFC 8446.
  968. *
  969. * NOTE: Only one key is generated, the key for the traffic from the client to
  970. * the server. The TLS 1.3 specification does not define a secret and thus
  971. * a key for server early traffic.
  972. */
  973. MBEDTLS_CHECK_RETURN_CRITICAL
  974. static int ssl_tls13_generate_early_key(mbedtls_ssl_context *ssl,
  975. mbedtls_ssl_key_set *traffic_keys)
  976. {
  977. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  978. mbedtls_md_type_t md_type;
  979. psa_algorithm_t hash_alg;
  980. size_t hash_len;
  981. unsigned char transcript[MBEDTLS_TLS1_3_MD_MAX_SIZE];
  982. size_t transcript_len;
  983. size_t key_len = 0;
  984. size_t iv_len = 0;
  985. mbedtls_ssl_tls13_early_secrets tls13_early_secrets;
  986. mbedtls_ssl_handshake_params *handshake = ssl->handshake;
  987. const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
  988. handshake->ciphersuite_info;
  989. MBEDTLS_SSL_DEBUG_MSG(2, ("=> ssl_tls13_generate_early_key"));
  990. ret = ssl_tls13_get_cipher_key_info(ciphersuite_info, &key_len, &iv_len);
  991. if (ret != 0) {
  992. MBEDTLS_SSL_DEBUG_RET(1, "ssl_tls13_get_cipher_key_info", ret);
  993. goto cleanup;
  994. }
  995. md_type = (mbedtls_md_type_t) ciphersuite_info->mac;
  996. hash_alg = mbedtls_md_psa_alg_from_type((mbedtls_md_type_t) ciphersuite_info->mac);
  997. hash_len = PSA_HASH_LENGTH(hash_alg);
  998. ret = mbedtls_ssl_get_handshake_transcript(ssl, md_type,
  999. transcript,
  1000. sizeof(transcript),
  1001. &transcript_len);
  1002. if (ret != 0) {
  1003. MBEDTLS_SSL_DEBUG_RET(1,
  1004. "mbedtls_ssl_get_handshake_transcript",
  1005. ret);
  1006. goto cleanup;
  1007. }
  1008. ret = mbedtls_ssl_tls13_derive_early_secrets(
  1009. hash_alg, handshake->tls13_master_secrets.early,
  1010. transcript, transcript_len, &tls13_early_secrets);
  1011. if (ret != 0) {
  1012. MBEDTLS_SSL_DEBUG_RET(
  1013. 1, "mbedtls_ssl_tls13_derive_early_secrets", ret);
  1014. goto cleanup;
  1015. }
  1016. MBEDTLS_SSL_DEBUG_BUF(
  1017. 4, "Client early traffic secret",
  1018. tls13_early_secrets.client_early_traffic_secret, hash_len);
  1019. /*
  1020. * Export client handshake traffic secret
  1021. */
  1022. if (ssl->f_export_keys != NULL) {
  1023. ssl->f_export_keys(
  1024. ssl->p_export_keys,
  1025. MBEDTLS_SSL_KEY_EXPORT_TLS1_3_CLIENT_EARLY_SECRET,
  1026. tls13_early_secrets.client_early_traffic_secret,
  1027. hash_len,
  1028. handshake->randbytes,
  1029. handshake->randbytes + MBEDTLS_CLIENT_HELLO_RANDOM_LEN,
  1030. MBEDTLS_SSL_TLS_PRF_NONE /* TODO: FIX! */);
  1031. }
  1032. ret = ssl_tls13_make_traffic_key(
  1033. hash_alg,
  1034. tls13_early_secrets.client_early_traffic_secret,
  1035. hash_len, traffic_keys->client_write_key, key_len,
  1036. traffic_keys->client_write_iv, iv_len);
  1037. if (ret != 0) {
  1038. MBEDTLS_SSL_DEBUG_RET(1, "ssl_tls13_make_traffic_key", ret);
  1039. goto cleanup;
  1040. }
  1041. traffic_keys->key_len = key_len;
  1042. traffic_keys->iv_len = iv_len;
  1043. MBEDTLS_SSL_DEBUG_BUF(4, "client early write_key",
  1044. traffic_keys->client_write_key,
  1045. traffic_keys->key_len);
  1046. MBEDTLS_SSL_DEBUG_BUF(4, "client early write_iv",
  1047. traffic_keys->client_write_iv,
  1048. traffic_keys->iv_len);
  1049. MBEDTLS_SSL_DEBUG_MSG(2, ("<= ssl_tls13_generate_early_key"));
  1050. cleanup:
  1051. /* Erase early secrets and transcript */
  1052. mbedtls_platform_zeroize(
  1053. &tls13_early_secrets, sizeof(mbedtls_ssl_tls13_early_secrets));
  1054. mbedtls_platform_zeroize(transcript, sizeof(transcript));
  1055. return ret;
  1056. }
  1057. int mbedtls_ssl_tls13_compute_early_transform(mbedtls_ssl_context *ssl)
  1058. {
  1059. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  1060. mbedtls_ssl_key_set traffic_keys;
  1061. mbedtls_ssl_transform *transform_earlydata = NULL;
  1062. mbedtls_ssl_handshake_params *handshake = ssl->handshake;
  1063. /* Next evolution in key schedule: Establish early_data secret and
  1064. * key material. */
  1065. ret = ssl_tls13_generate_early_key(ssl, &traffic_keys);
  1066. if (ret != 0) {
  1067. MBEDTLS_SSL_DEBUG_RET(1, "ssl_tls13_generate_early_key",
  1068. ret);
  1069. goto cleanup;
  1070. }
  1071. transform_earlydata = mbedtls_calloc(1, sizeof(mbedtls_ssl_transform));
  1072. if (transform_earlydata == NULL) {
  1073. ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
  1074. goto cleanup;
  1075. }
  1076. ret = mbedtls_ssl_tls13_populate_transform(
  1077. transform_earlydata,
  1078. ssl->conf->endpoint,
  1079. handshake->ciphersuite_info->id,
  1080. &traffic_keys,
  1081. ssl);
  1082. if (ret != 0) {
  1083. MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_populate_transform", ret);
  1084. goto cleanup;
  1085. }
  1086. handshake->transform_earlydata = transform_earlydata;
  1087. cleanup:
  1088. mbedtls_platform_zeroize(&traffic_keys, sizeof(traffic_keys));
  1089. if (ret != 0) {
  1090. mbedtls_free(transform_earlydata);
  1091. }
  1092. return ret;
  1093. }
  1094. #endif /* MBEDTLS_SSL_EARLY_DATA */
  1095. int mbedtls_ssl_tls13_key_schedule_stage_early(mbedtls_ssl_context *ssl)
  1096. {
  1097. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  1098. psa_algorithm_t hash_alg;
  1099. mbedtls_ssl_handshake_params *handshake = ssl->handshake;
  1100. unsigned char *psk = NULL;
  1101. size_t psk_len = 0;
  1102. if (handshake->ciphersuite_info == NULL) {
  1103. MBEDTLS_SSL_DEBUG_MSG(1, ("cipher suite info not found"));
  1104. return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
  1105. }
  1106. hash_alg = mbedtls_md_psa_alg_from_type((mbedtls_md_type_t) handshake->ciphersuite_info->mac);
  1107. #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
  1108. if (mbedtls_ssl_tls13_key_exchange_mode_with_psk(ssl)) {
  1109. ret = mbedtls_ssl_tls13_export_handshake_psk(ssl, &psk, &psk_len);
  1110. if (ret != 0) {
  1111. MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_export_handshake_psk",
  1112. ret);
  1113. return ret;
  1114. }
  1115. }
  1116. #endif
  1117. ret = mbedtls_ssl_tls13_evolve_secret(hash_alg, NULL, psk, psk_len,
  1118. handshake->tls13_master_secrets.early);
  1119. #if defined(MBEDTLS_USE_PSA_CRYPTO) && \
  1120. defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
  1121. mbedtls_free((void *) psk);
  1122. #endif
  1123. if (ret != 0) {
  1124. MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_evolve_secret", ret);
  1125. return ret;
  1126. }
  1127. MBEDTLS_SSL_DEBUG_BUF(4, "mbedtls_ssl_tls13_key_schedule_stage_early",
  1128. handshake->tls13_master_secrets.early,
  1129. PSA_HASH_LENGTH(hash_alg));
  1130. return 0;
  1131. }
  1132. /**
  1133. * \brief Compute TLS 1.3 handshake traffic keys.
  1134. *
  1135. * ssl_tls13_generate_handshake_keys() generates keys necessary for
  1136. * protecting the handshake messages, as described in Section 7 of
  1137. * RFC 8446.
  1138. *
  1139. * \param ssl The SSL context to operate on. This must be in
  1140. * key schedule stage \c Handshake, see
  1141. * ssl_tls13_key_schedule_stage_handshake().
  1142. * \param traffic_keys The address at which to store the handshake traffic
  1143. * keys. This must be writable but may be uninitialized.
  1144. *
  1145. * \returns \c 0 on success.
  1146. * \returns A negative error code on failure.
  1147. */
  1148. MBEDTLS_CHECK_RETURN_CRITICAL
  1149. static int ssl_tls13_generate_handshake_keys(mbedtls_ssl_context *ssl,
  1150. mbedtls_ssl_key_set *traffic_keys)
  1151. {
  1152. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  1153. mbedtls_md_type_t md_type;
  1154. psa_algorithm_t hash_alg;
  1155. size_t hash_len;
  1156. unsigned char transcript[MBEDTLS_TLS1_3_MD_MAX_SIZE];
  1157. size_t transcript_len;
  1158. size_t key_len = 0;
  1159. size_t iv_len = 0;
  1160. mbedtls_ssl_handshake_params *handshake = ssl->handshake;
  1161. const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
  1162. handshake->ciphersuite_info;
  1163. mbedtls_ssl_tls13_handshake_secrets *tls13_hs_secrets =
  1164. &handshake->tls13_hs_secrets;
  1165. MBEDTLS_SSL_DEBUG_MSG(2, ("=> ssl_tls13_generate_handshake_keys"));
  1166. ret = ssl_tls13_get_cipher_key_info(ciphersuite_info, &key_len, &iv_len);
  1167. if (ret != 0) {
  1168. MBEDTLS_SSL_DEBUG_RET(1, "ssl_tls13_get_cipher_key_info", ret);
  1169. return ret;
  1170. }
  1171. md_type = (mbedtls_md_type_t) ciphersuite_info->mac;
  1172. hash_alg = mbedtls_md_psa_alg_from_type((mbedtls_md_type_t) ciphersuite_info->mac);
  1173. hash_len = PSA_HASH_LENGTH(hash_alg);
  1174. ret = mbedtls_ssl_get_handshake_transcript(ssl, md_type,
  1175. transcript,
  1176. sizeof(transcript),
  1177. &transcript_len);
  1178. if (ret != 0) {
  1179. MBEDTLS_SSL_DEBUG_RET(1,
  1180. "mbedtls_ssl_get_handshake_transcript",
  1181. ret);
  1182. return ret;
  1183. }
  1184. ret = mbedtls_ssl_tls13_derive_handshake_secrets(
  1185. hash_alg, handshake->tls13_master_secrets.handshake,
  1186. transcript, transcript_len, tls13_hs_secrets);
  1187. if (ret != 0) {
  1188. MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_derive_handshake_secrets",
  1189. ret);
  1190. return ret;
  1191. }
  1192. MBEDTLS_SSL_DEBUG_BUF(4, "Client handshake traffic secret",
  1193. tls13_hs_secrets->client_handshake_traffic_secret,
  1194. hash_len);
  1195. MBEDTLS_SSL_DEBUG_BUF(4, "Server handshake traffic secret",
  1196. tls13_hs_secrets->server_handshake_traffic_secret,
  1197. hash_len);
  1198. /*
  1199. * Export client handshake traffic secret
  1200. */
  1201. if (ssl->f_export_keys != NULL) {
  1202. ssl->f_export_keys(
  1203. ssl->p_export_keys,
  1204. MBEDTLS_SSL_KEY_EXPORT_TLS1_3_CLIENT_HANDSHAKE_TRAFFIC_SECRET,
  1205. tls13_hs_secrets->client_handshake_traffic_secret,
  1206. hash_len,
  1207. handshake->randbytes,
  1208. handshake->randbytes + MBEDTLS_CLIENT_HELLO_RANDOM_LEN,
  1209. MBEDTLS_SSL_TLS_PRF_NONE /* TODO: FIX! */);
  1210. ssl->f_export_keys(
  1211. ssl->p_export_keys,
  1212. MBEDTLS_SSL_KEY_EXPORT_TLS1_3_SERVER_HANDSHAKE_TRAFFIC_SECRET,
  1213. tls13_hs_secrets->server_handshake_traffic_secret,
  1214. hash_len,
  1215. handshake->randbytes,
  1216. handshake->randbytes + MBEDTLS_CLIENT_HELLO_RANDOM_LEN,
  1217. MBEDTLS_SSL_TLS_PRF_NONE /* TODO: FIX! */);
  1218. }
  1219. ret = mbedtls_ssl_tls13_make_traffic_keys(
  1220. hash_alg,
  1221. tls13_hs_secrets->client_handshake_traffic_secret,
  1222. tls13_hs_secrets->server_handshake_traffic_secret,
  1223. hash_len, key_len, iv_len, traffic_keys);
  1224. if (ret != 0) {
  1225. MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_make_traffic_keys", ret);
  1226. goto exit;
  1227. }
  1228. MBEDTLS_SSL_DEBUG_BUF(4, "client_handshake write_key",
  1229. traffic_keys->client_write_key,
  1230. traffic_keys->key_len);
  1231. MBEDTLS_SSL_DEBUG_BUF(4, "server_handshake write_key",
  1232. traffic_keys->server_write_key,
  1233. traffic_keys->key_len);
  1234. MBEDTLS_SSL_DEBUG_BUF(4, "client_handshake write_iv",
  1235. traffic_keys->client_write_iv,
  1236. traffic_keys->iv_len);
  1237. MBEDTLS_SSL_DEBUG_BUF(4, "server_handshake write_iv",
  1238. traffic_keys->server_write_iv,
  1239. traffic_keys->iv_len);
  1240. MBEDTLS_SSL_DEBUG_MSG(2, ("<= ssl_tls13_generate_handshake_keys"));
  1241. exit:
  1242. return ret;
  1243. }
  1244. /**
  1245. * \brief Transition into handshake stage of TLS 1.3 key schedule.
  1246. *
  1247. * The TLS 1.3 key schedule can be viewed as a simple state machine
  1248. * with states Initial -> Early -> Handshake -> Application, and
  1249. * this function represents the Early -> Handshake transition.
  1250. *
  1251. * In the handshake stage, ssl_tls13_generate_handshake_keys()
  1252. * can be used to derive the handshake traffic keys.
  1253. *
  1254. * \param ssl The SSL context to operate on. This must be in key schedule
  1255. * stage \c Early.
  1256. *
  1257. * \returns \c 0 on success.
  1258. * \returns A negative error code on failure.
  1259. */
  1260. MBEDTLS_CHECK_RETURN_CRITICAL
  1261. static int ssl_tls13_key_schedule_stage_handshake(mbedtls_ssl_context *ssl)
  1262. {
  1263. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  1264. mbedtls_ssl_handshake_params *handshake = ssl->handshake;
  1265. psa_algorithm_t const hash_alg = mbedtls_md_psa_alg_from_type(
  1266. (mbedtls_md_type_t) handshake->ciphersuite_info->mac);
  1267. unsigned char *shared_secret = NULL;
  1268. size_t shared_secret_len = 0;
  1269. #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED)
  1270. /*
  1271. * Compute ECDHE secret used to compute the handshake secret from which
  1272. * client_handshake_traffic_secret and server_handshake_traffic_secret
  1273. * are derived in the handshake secret derivation stage.
  1274. */
  1275. if (mbedtls_ssl_tls13_key_exchange_mode_with_ephemeral(ssl)) {
  1276. if (mbedtls_ssl_tls13_named_group_is_ecdhe(handshake->offered_group_id) ||
  1277. mbedtls_ssl_tls13_named_group_is_ffdh(handshake->offered_group_id)) {
  1278. #if defined(PSA_WANT_ALG_ECDH) || defined(PSA_WANT_ALG_FFDH)
  1279. psa_algorithm_t alg =
  1280. mbedtls_ssl_tls13_named_group_is_ecdhe(handshake->offered_group_id) ?
  1281. PSA_ALG_ECDH : PSA_ALG_FFDH;
  1282. /* Compute ECDH shared secret. */
  1283. psa_status_t status = PSA_ERROR_GENERIC_ERROR;
  1284. psa_key_attributes_t key_attributes = PSA_KEY_ATTRIBUTES_INIT;
  1285. status = psa_get_key_attributes(handshake->xxdh_psa_privkey,
  1286. &key_attributes);
  1287. if (status != PSA_SUCCESS) {
  1288. ret = PSA_TO_MBEDTLS_ERR(status);
  1289. }
  1290. shared_secret_len = PSA_BITS_TO_BYTES(
  1291. psa_get_key_bits(&key_attributes));
  1292. shared_secret = mbedtls_calloc(1, shared_secret_len);
  1293. if (shared_secret == NULL) {
  1294. return MBEDTLS_ERR_SSL_ALLOC_FAILED;
  1295. }
  1296. status = psa_raw_key_agreement(
  1297. alg, handshake->xxdh_psa_privkey,
  1298. handshake->xxdh_psa_peerkey, handshake->xxdh_psa_peerkey_len,
  1299. shared_secret, shared_secret_len, &shared_secret_len);
  1300. if (status != PSA_SUCCESS) {
  1301. ret = PSA_TO_MBEDTLS_ERR(status);
  1302. MBEDTLS_SSL_DEBUG_RET(1, "psa_raw_key_agreement", ret);
  1303. goto cleanup;
  1304. }
  1305. status = psa_destroy_key(handshake->xxdh_psa_privkey);
  1306. if (status != PSA_SUCCESS) {
  1307. ret = PSA_TO_MBEDTLS_ERR(status);
  1308. MBEDTLS_SSL_DEBUG_RET(1, "psa_destroy_key", ret);
  1309. goto cleanup;
  1310. }
  1311. handshake->xxdh_psa_privkey = MBEDTLS_SVC_KEY_ID_INIT;
  1312. #endif /* PSA_WANT_ALG_ECDH || PSA_WANT_ALG_FFDH */
  1313. } else {
  1314. MBEDTLS_SSL_DEBUG_MSG(1, ("Group not supported."));
  1315. return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
  1316. }
  1317. }
  1318. #endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED */
  1319. /*
  1320. * Compute the Handshake Secret
  1321. */
  1322. ret = mbedtls_ssl_tls13_evolve_secret(
  1323. hash_alg, handshake->tls13_master_secrets.early,
  1324. shared_secret, shared_secret_len,
  1325. handshake->tls13_master_secrets.handshake);
  1326. if (ret != 0) {
  1327. MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_evolve_secret", ret);
  1328. goto cleanup;
  1329. }
  1330. MBEDTLS_SSL_DEBUG_BUF(4, "Handshake secret",
  1331. handshake->tls13_master_secrets.handshake,
  1332. PSA_HASH_LENGTH(hash_alg));
  1333. cleanup:
  1334. if (shared_secret != NULL) {
  1335. mbedtls_zeroize_and_free(shared_secret, shared_secret_len);
  1336. }
  1337. return ret;
  1338. }
  1339. /**
  1340. * \brief Compute TLS 1.3 application traffic keys.
  1341. *
  1342. * ssl_tls13_generate_application_keys() generates application traffic
  1343. * keys, since any record following a 1-RTT Finished message MUST be
  1344. * encrypted under the application traffic key.
  1345. *
  1346. * \param ssl The SSL context to operate on. This must be in
  1347. * key schedule stage \c Application, see
  1348. * ssl_tls13_key_schedule_stage_application().
  1349. * \param traffic_keys The address at which to store the application traffic
  1350. * keys. This must be writable but may be uninitialized.
  1351. *
  1352. * \returns \c 0 on success.
  1353. * \returns A negative error code on failure.
  1354. */
  1355. MBEDTLS_CHECK_RETURN_CRITICAL
  1356. static int ssl_tls13_generate_application_keys(
  1357. mbedtls_ssl_context *ssl,
  1358. mbedtls_ssl_key_set *traffic_keys)
  1359. {
  1360. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  1361. mbedtls_ssl_handshake_params *handshake = ssl->handshake;
  1362. /* Address at which to store the application secrets */
  1363. mbedtls_ssl_tls13_application_secrets * const app_secrets =
  1364. &ssl->session_negotiate->app_secrets;
  1365. /* Holding the transcript up to and including the ServerFinished */
  1366. unsigned char transcript[MBEDTLS_TLS1_3_MD_MAX_SIZE];
  1367. size_t transcript_len;
  1368. /* Variables relating to the hash for the chosen ciphersuite. */
  1369. mbedtls_md_type_t md_type;
  1370. psa_algorithm_t hash_alg;
  1371. size_t hash_len;
  1372. /* Variables relating to the cipher for the chosen ciphersuite. */
  1373. size_t key_len = 0, iv_len = 0;
  1374. MBEDTLS_SSL_DEBUG_MSG(2, ("=> derive application traffic keys"));
  1375. /* Extract basic information about hash and ciphersuite */
  1376. ret = ssl_tls13_get_cipher_key_info(handshake->ciphersuite_info,
  1377. &key_len, &iv_len);
  1378. if (ret != 0) {
  1379. MBEDTLS_SSL_DEBUG_RET(1, "ssl_tls13_get_cipher_key_info", ret);
  1380. goto cleanup;
  1381. }
  1382. md_type = (mbedtls_md_type_t) handshake->ciphersuite_info->mac;
  1383. hash_alg = mbedtls_md_psa_alg_from_type((mbedtls_md_type_t) handshake->ciphersuite_info->mac);
  1384. hash_len = PSA_HASH_LENGTH(hash_alg);
  1385. /* Compute current handshake transcript. It's the caller's responsibility
  1386. * to call this at the right time, that is, after the ServerFinished. */
  1387. ret = mbedtls_ssl_get_handshake_transcript(ssl, md_type,
  1388. transcript, sizeof(transcript),
  1389. &transcript_len);
  1390. if (ret != 0) {
  1391. goto cleanup;
  1392. }
  1393. /* Compute application secrets from master secret and transcript hash. */
  1394. ret = mbedtls_ssl_tls13_derive_application_secrets(
  1395. hash_alg, handshake->tls13_master_secrets.app,
  1396. transcript, transcript_len, app_secrets);
  1397. if (ret != 0) {
  1398. MBEDTLS_SSL_DEBUG_RET(
  1399. 1, "mbedtls_ssl_tls13_derive_application_secrets", ret);
  1400. goto cleanup;
  1401. }
  1402. /* Derive first epoch of IV + Key for application traffic. */
  1403. ret = mbedtls_ssl_tls13_make_traffic_keys(
  1404. hash_alg,
  1405. app_secrets->client_application_traffic_secret_N,
  1406. app_secrets->server_application_traffic_secret_N,
  1407. hash_len, key_len, iv_len, traffic_keys);
  1408. if (ret != 0) {
  1409. MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_make_traffic_keys", ret);
  1410. goto cleanup;
  1411. }
  1412. MBEDTLS_SSL_DEBUG_BUF(4, "Client application traffic secret",
  1413. app_secrets->client_application_traffic_secret_N,
  1414. hash_len);
  1415. MBEDTLS_SSL_DEBUG_BUF(4, "Server application traffic secret",
  1416. app_secrets->server_application_traffic_secret_N,
  1417. hash_len);
  1418. /*
  1419. * Export client/server application traffic secret 0
  1420. */
  1421. if (ssl->f_export_keys != NULL) {
  1422. ssl->f_export_keys(
  1423. ssl->p_export_keys,
  1424. MBEDTLS_SSL_KEY_EXPORT_TLS1_3_CLIENT_APPLICATION_TRAFFIC_SECRET,
  1425. app_secrets->client_application_traffic_secret_N, hash_len,
  1426. handshake->randbytes,
  1427. handshake->randbytes + MBEDTLS_CLIENT_HELLO_RANDOM_LEN,
  1428. MBEDTLS_SSL_TLS_PRF_NONE /* TODO: this should be replaced by
  1429. a new constant for TLS 1.3! */);
  1430. ssl->f_export_keys(
  1431. ssl->p_export_keys,
  1432. MBEDTLS_SSL_KEY_EXPORT_TLS1_3_SERVER_APPLICATION_TRAFFIC_SECRET,
  1433. app_secrets->server_application_traffic_secret_N, hash_len,
  1434. handshake->randbytes,
  1435. handshake->randbytes + MBEDTLS_CLIENT_HELLO_RANDOM_LEN,
  1436. MBEDTLS_SSL_TLS_PRF_NONE /* TODO: this should be replaced by
  1437. a new constant for TLS 1.3! */);
  1438. }
  1439. MBEDTLS_SSL_DEBUG_BUF(4, "client application_write_key:",
  1440. traffic_keys->client_write_key, key_len);
  1441. MBEDTLS_SSL_DEBUG_BUF(4, "server application write key",
  1442. traffic_keys->server_write_key, key_len);
  1443. MBEDTLS_SSL_DEBUG_BUF(4, "client application write IV",
  1444. traffic_keys->client_write_iv, iv_len);
  1445. MBEDTLS_SSL_DEBUG_BUF(4, "server application write IV",
  1446. traffic_keys->server_write_iv, iv_len);
  1447. MBEDTLS_SSL_DEBUG_MSG(2, ("<= derive application traffic keys"));
  1448. cleanup:
  1449. /* randbytes is not used again */
  1450. mbedtls_platform_zeroize(ssl->handshake->randbytes,
  1451. sizeof(ssl->handshake->randbytes));
  1452. mbedtls_platform_zeroize(transcript, sizeof(transcript));
  1453. return ret;
  1454. }
  1455. int mbedtls_ssl_tls13_compute_handshake_transform(mbedtls_ssl_context *ssl)
  1456. {
  1457. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  1458. mbedtls_ssl_key_set traffic_keys;
  1459. mbedtls_ssl_transform *transform_handshake = NULL;
  1460. mbedtls_ssl_handshake_params *handshake = ssl->handshake;
  1461. /* Compute handshake secret */
  1462. ret = ssl_tls13_key_schedule_stage_handshake(ssl);
  1463. if (ret != 0) {
  1464. MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_derive_master_secret", ret);
  1465. goto cleanup;
  1466. }
  1467. /* Next evolution in key schedule: Establish handshake secret and
  1468. * key material. */
  1469. ret = ssl_tls13_generate_handshake_keys(ssl, &traffic_keys);
  1470. if (ret != 0) {
  1471. MBEDTLS_SSL_DEBUG_RET(1, "ssl_tls13_generate_handshake_keys",
  1472. ret);
  1473. goto cleanup;
  1474. }
  1475. transform_handshake = mbedtls_calloc(1, sizeof(mbedtls_ssl_transform));
  1476. if (transform_handshake == NULL) {
  1477. ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
  1478. goto cleanup;
  1479. }
  1480. ret = mbedtls_ssl_tls13_populate_transform(
  1481. transform_handshake,
  1482. ssl->conf->endpoint,
  1483. handshake->ciphersuite_info->id,
  1484. &traffic_keys,
  1485. ssl);
  1486. if (ret != 0) {
  1487. MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_populate_transform", ret);
  1488. goto cleanup;
  1489. }
  1490. handshake->transform_handshake = transform_handshake;
  1491. cleanup:
  1492. mbedtls_platform_zeroize(&traffic_keys, sizeof(traffic_keys));
  1493. if (ret != 0) {
  1494. mbedtls_free(transform_handshake);
  1495. }
  1496. return ret;
  1497. }
  1498. int mbedtls_ssl_tls13_compute_resumption_master_secret(mbedtls_ssl_context *ssl)
  1499. {
  1500. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  1501. mbedtls_md_type_t md_type;
  1502. mbedtls_ssl_handshake_params *handshake = ssl->handshake;
  1503. unsigned char transcript[MBEDTLS_TLS1_3_MD_MAX_SIZE];
  1504. size_t transcript_len;
  1505. MBEDTLS_SSL_DEBUG_MSG(
  1506. 2, ("=> mbedtls_ssl_tls13_compute_resumption_master_secret"));
  1507. md_type = (mbedtls_md_type_t) handshake->ciphersuite_info->mac;
  1508. ret = mbedtls_ssl_get_handshake_transcript(ssl, md_type,
  1509. transcript, sizeof(transcript),
  1510. &transcript_len);
  1511. if (ret != 0) {
  1512. return ret;
  1513. }
  1514. ret = mbedtls_ssl_tls13_derive_resumption_master_secret(
  1515. mbedtls_md_psa_alg_from_type(md_type),
  1516. handshake->tls13_master_secrets.app,
  1517. transcript, transcript_len,
  1518. &ssl->session_negotiate->app_secrets);
  1519. if (ret != 0) {
  1520. return ret;
  1521. }
  1522. /* Erase master secrets */
  1523. mbedtls_platform_zeroize(&handshake->tls13_master_secrets,
  1524. sizeof(handshake->tls13_master_secrets));
  1525. MBEDTLS_SSL_DEBUG_BUF(
  1526. 4, "Resumption master secret",
  1527. ssl->session_negotiate->app_secrets.resumption_master_secret,
  1528. PSA_HASH_LENGTH(mbedtls_md_psa_alg_from_type(md_type)));
  1529. MBEDTLS_SSL_DEBUG_MSG(
  1530. 2, ("<= mbedtls_ssl_tls13_compute_resumption_master_secret"));
  1531. return 0;
  1532. }
  1533. int mbedtls_ssl_tls13_compute_application_transform(mbedtls_ssl_context *ssl)
  1534. {
  1535. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  1536. mbedtls_ssl_key_set traffic_keys;
  1537. mbedtls_ssl_transform *transform_application = NULL;
  1538. ret = ssl_tls13_key_schedule_stage_application(ssl);
  1539. if (ret != 0) {
  1540. MBEDTLS_SSL_DEBUG_RET(1,
  1541. "ssl_tls13_key_schedule_stage_application", ret);
  1542. goto cleanup;
  1543. }
  1544. ret = ssl_tls13_generate_application_keys(ssl, &traffic_keys);
  1545. if (ret != 0) {
  1546. MBEDTLS_SSL_DEBUG_RET(1,
  1547. "ssl_tls13_generate_application_keys", ret);
  1548. goto cleanup;
  1549. }
  1550. transform_application =
  1551. mbedtls_calloc(1, sizeof(mbedtls_ssl_transform));
  1552. if (transform_application == NULL) {
  1553. ret = MBEDTLS_ERR_SSL_ALLOC_FAILED;
  1554. goto cleanup;
  1555. }
  1556. ret = mbedtls_ssl_tls13_populate_transform(
  1557. transform_application,
  1558. ssl->conf->endpoint,
  1559. ssl->handshake->ciphersuite_info->id,
  1560. &traffic_keys,
  1561. ssl);
  1562. if (ret != 0) {
  1563. MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_populate_transform", ret);
  1564. goto cleanup;
  1565. }
  1566. ssl->transform_application = transform_application;
  1567. cleanup:
  1568. mbedtls_platform_zeroize(&traffic_keys, sizeof(traffic_keys));
  1569. if (ret != 0) {
  1570. mbedtls_free(transform_application);
  1571. }
  1572. return ret;
  1573. }
  1574. #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED)
  1575. int mbedtls_ssl_tls13_export_handshake_psk(mbedtls_ssl_context *ssl,
  1576. unsigned char **psk,
  1577. size_t *psk_len)
  1578. {
  1579. #if defined(MBEDTLS_USE_PSA_CRYPTO)
  1580. psa_key_attributes_t key_attributes = PSA_KEY_ATTRIBUTES_INIT;
  1581. psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
  1582. *psk_len = 0;
  1583. *psk = NULL;
  1584. if (mbedtls_svc_key_id_is_null(ssl->handshake->psk_opaque)) {
  1585. return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
  1586. }
  1587. status = psa_get_key_attributes(ssl->handshake->psk_opaque, &key_attributes);
  1588. if (status != PSA_SUCCESS) {
  1589. return PSA_TO_MBEDTLS_ERR(status);
  1590. }
  1591. *psk_len = PSA_BITS_TO_BYTES(psa_get_key_bits(&key_attributes));
  1592. *psk = mbedtls_calloc(1, *psk_len);
  1593. if (*psk == NULL) {
  1594. return MBEDTLS_ERR_SSL_ALLOC_FAILED;
  1595. }
  1596. status = psa_export_key(ssl->handshake->psk_opaque,
  1597. (uint8_t *) *psk, *psk_len, psk_len);
  1598. if (status != PSA_SUCCESS) {
  1599. mbedtls_free((void *) *psk);
  1600. *psk = NULL;
  1601. return PSA_TO_MBEDTLS_ERR(status);
  1602. }
  1603. return 0;
  1604. #else
  1605. *psk = ssl->handshake->psk;
  1606. *psk_len = ssl->handshake->psk_len;
  1607. if (*psk == NULL) {
  1608. return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
  1609. }
  1610. return 0;
  1611. #endif /* !MBEDTLS_USE_PSA_CRYPTO */
  1612. }
  1613. #endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_PSK_ENABLED */
  1614. #endif /* MBEDTLS_SSL_PROTO_TLS1_3 */