ssl_tls13_generic.c 59 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754
  1. /*
  2. * TLS 1.3 functionality shared between client and server
  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_TLS_C) && defined(MBEDTLS_SSL_PROTO_TLS1_3)
  9. #include <string.h>
  10. #include "mbedtls/error.h"
  11. #include "debug_internal.h"
  12. #include "mbedtls/oid.h"
  13. #include "mbedtls/platform.h"
  14. #include "mbedtls/constant_time.h"
  15. #include "psa/crypto.h"
  16. #include "mbedtls/psa_util.h"
  17. #include "ssl_misc.h"
  18. #include "ssl_tls13_invasive.h"
  19. #include "ssl_tls13_keys.h"
  20. #include "ssl_debug_helpers.h"
  21. #include "psa/crypto.h"
  22. #include "psa_util_internal.h"
  23. /* Define a local translating function to save code size by not using too many
  24. * arguments in each translating place. */
  25. static int local_err_translation(psa_status_t status)
  26. {
  27. return psa_status_to_mbedtls(status, psa_to_ssl_errors,
  28. ARRAY_LENGTH(psa_to_ssl_errors),
  29. psa_generic_status_to_mbedtls);
  30. }
  31. #define PSA_TO_MBEDTLS_ERR(status) local_err_translation(status)
  32. int mbedtls_ssl_tls13_crypto_init(mbedtls_ssl_context *ssl)
  33. {
  34. psa_status_t status = psa_crypto_init();
  35. if (status != PSA_SUCCESS) {
  36. (void) ssl; // unused when debugging is disabled
  37. MBEDTLS_SSL_DEBUG_RET(1, "psa_crypto_init", status);
  38. }
  39. return PSA_TO_MBEDTLS_ERR(status);
  40. }
  41. const uint8_t mbedtls_ssl_tls13_hello_retry_request_magic[
  42. MBEDTLS_SERVER_HELLO_RANDOM_LEN] =
  43. { 0xCF, 0x21, 0xAD, 0x74, 0xE5, 0x9A, 0x61, 0x11,
  44. 0xBE, 0x1D, 0x8C, 0x02, 0x1E, 0x65, 0xB8, 0x91,
  45. 0xC2, 0xA2, 0x11, 0x16, 0x7A, 0xBB, 0x8C, 0x5E,
  46. 0x07, 0x9E, 0x09, 0xE2, 0xC8, 0xA8, 0x33, 0x9C };
  47. int mbedtls_ssl_tls13_fetch_handshake_msg(mbedtls_ssl_context *ssl,
  48. unsigned hs_type,
  49. unsigned char **buf,
  50. size_t *buf_len)
  51. {
  52. int ret;
  53. if ((ret = mbedtls_ssl_read_record(ssl, 0)) != 0) {
  54. MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_read_record", ret);
  55. goto cleanup;
  56. }
  57. if (ssl->in_msgtype != MBEDTLS_SSL_MSG_HANDSHAKE ||
  58. ssl->in_msg[0] != hs_type) {
  59. MBEDTLS_SSL_DEBUG_MSG(1, ("Receive unexpected handshake message."));
  60. MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE,
  61. MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE);
  62. ret = MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
  63. goto cleanup;
  64. }
  65. /*
  66. * Jump handshake header (4 bytes, see Section 4 of RFC 8446).
  67. * ...
  68. * HandshakeType msg_type;
  69. * uint24 length;
  70. * ...
  71. */
  72. *buf = ssl->in_msg + 4;
  73. *buf_len = ssl->in_hslen - 4;
  74. cleanup:
  75. return ret;
  76. }
  77. int mbedtls_ssl_tls13_is_supported_versions_ext_present_in_exts(
  78. mbedtls_ssl_context *ssl,
  79. const unsigned char *buf, const unsigned char *end,
  80. const unsigned char **supported_versions_data,
  81. const unsigned char **supported_versions_data_end)
  82. {
  83. const unsigned char *p = buf;
  84. size_t extensions_len;
  85. const unsigned char *extensions_end;
  86. *supported_versions_data = NULL;
  87. *supported_versions_data_end = NULL;
  88. /* Case of no extension */
  89. if (p == end) {
  90. return 0;
  91. }
  92. /* ...
  93. * Extension extensions<x..2^16-1>;
  94. * ...
  95. * struct {
  96. * ExtensionType extension_type; (2 bytes)
  97. * opaque extension_data<0..2^16-1>;
  98. * } Extension;
  99. */
  100. MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
  101. extensions_len = MBEDTLS_GET_UINT16_BE(p, 0);
  102. p += 2;
  103. /* Check extensions do not go beyond the buffer of data. */
  104. MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, extensions_len);
  105. extensions_end = p + extensions_len;
  106. while (p < extensions_end) {
  107. unsigned int extension_type;
  108. size_t extension_data_len;
  109. MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, 4);
  110. extension_type = MBEDTLS_GET_UINT16_BE(p, 0);
  111. extension_data_len = MBEDTLS_GET_UINT16_BE(p, 2);
  112. p += 4;
  113. MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, extension_data_len);
  114. if (extension_type == MBEDTLS_TLS_EXT_SUPPORTED_VERSIONS) {
  115. *supported_versions_data = p;
  116. *supported_versions_data_end = p + extension_data_len;
  117. return 1;
  118. }
  119. p += extension_data_len;
  120. }
  121. return 0;
  122. }
  123. #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
  124. /*
  125. * STATE HANDLING: Read CertificateVerify
  126. */
  127. /* Macro to express the maximum length of the verify structure.
  128. *
  129. * The structure is computed per TLS 1.3 specification as:
  130. * - 64 bytes of octet 32,
  131. * - 33 bytes for the context string
  132. * (which is either "TLS 1.3, client CertificateVerify"
  133. * or "TLS 1.3, server CertificateVerify"),
  134. * - 1 byte for the octet 0x0, which serves as a separator,
  135. * - 32 or 48 bytes for the Transcript-Hash(Handshake Context, Certificate)
  136. * (depending on the size of the transcript_hash)
  137. *
  138. * This results in a total size of
  139. * - 130 bytes for a SHA256-based transcript hash, or
  140. * (64 + 33 + 1 + 32 bytes)
  141. * - 146 bytes for a SHA384-based transcript hash.
  142. * (64 + 33 + 1 + 48 bytes)
  143. *
  144. */
  145. #define SSL_VERIFY_STRUCT_MAX_SIZE (64 + \
  146. 33 + \
  147. 1 + \
  148. MBEDTLS_TLS1_3_MD_MAX_SIZE \
  149. )
  150. /*
  151. * The ssl_tls13_create_verify_structure() creates the verify structure.
  152. * As input, it requires the transcript hash.
  153. *
  154. * The caller has to ensure that the buffer has size at least
  155. * SSL_VERIFY_STRUCT_MAX_SIZE bytes.
  156. */
  157. static void ssl_tls13_create_verify_structure(const unsigned char *transcript_hash,
  158. size_t transcript_hash_len,
  159. unsigned char *verify_buffer,
  160. size_t *verify_buffer_len,
  161. int from)
  162. {
  163. size_t idx;
  164. /* RFC 8446, Section 4.4.3:
  165. *
  166. * The digital signature [in the CertificateVerify message] is then
  167. * computed over the concatenation of:
  168. * - A string that consists of octet 32 (0x20) repeated 64 times
  169. * - The context string
  170. * - A single 0 byte which serves as the separator
  171. * - The content to be signed
  172. */
  173. memset(verify_buffer, 0x20, 64);
  174. idx = 64;
  175. if (from == MBEDTLS_SSL_IS_CLIENT) {
  176. memcpy(verify_buffer + idx, mbedtls_ssl_tls13_labels.client_cv,
  177. MBEDTLS_SSL_TLS1_3_LBL_LEN(client_cv));
  178. idx += MBEDTLS_SSL_TLS1_3_LBL_LEN(client_cv);
  179. } else { /* from == MBEDTLS_SSL_IS_SERVER */
  180. memcpy(verify_buffer + idx, mbedtls_ssl_tls13_labels.server_cv,
  181. MBEDTLS_SSL_TLS1_3_LBL_LEN(server_cv));
  182. idx += MBEDTLS_SSL_TLS1_3_LBL_LEN(server_cv);
  183. }
  184. verify_buffer[idx++] = 0x0;
  185. memcpy(verify_buffer + idx, transcript_hash, transcript_hash_len);
  186. idx += transcript_hash_len;
  187. *verify_buffer_len = idx;
  188. }
  189. MBEDTLS_CHECK_RETURN_CRITICAL
  190. static int ssl_tls13_parse_certificate_verify(mbedtls_ssl_context *ssl,
  191. const unsigned char *buf,
  192. const unsigned char *end,
  193. const unsigned char *verify_buffer,
  194. size_t verify_buffer_len)
  195. {
  196. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  197. psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
  198. const unsigned char *p = buf;
  199. uint16_t algorithm;
  200. size_t signature_len;
  201. mbedtls_pk_type_t sig_alg;
  202. mbedtls_md_type_t md_alg;
  203. psa_algorithm_t hash_alg = PSA_ALG_NONE;
  204. unsigned char verify_hash[PSA_HASH_MAX_SIZE];
  205. size_t verify_hash_len;
  206. void const *options = NULL;
  207. #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)
  208. mbedtls_pk_rsassa_pss_options rsassa_pss_options;
  209. #endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */
  210. /*
  211. * struct {
  212. * SignatureScheme algorithm;
  213. * opaque signature<0..2^16-1>;
  214. * } CertificateVerify;
  215. */
  216. MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
  217. algorithm = MBEDTLS_GET_UINT16_BE(p, 0);
  218. p += 2;
  219. /* RFC 8446 section 4.4.3
  220. *
  221. * If the CertificateVerify message is sent by a server, the signature
  222. * algorithm MUST be one offered in the client's "signature_algorithms"
  223. * extension unless no valid certificate chain can be produced without
  224. * unsupported algorithms
  225. *
  226. * RFC 8446 section 4.4.2.2
  227. *
  228. * If the client cannot construct an acceptable chain using the provided
  229. * certificates and decides to abort the handshake, then it MUST abort the
  230. * handshake with an appropriate certificate-related alert
  231. * (by default, "unsupported_certificate").
  232. *
  233. * Check if algorithm is an offered signature algorithm.
  234. */
  235. if (!mbedtls_ssl_sig_alg_is_offered(ssl, algorithm)) {
  236. /* algorithm not in offered signature algorithms list */
  237. MBEDTLS_SSL_DEBUG_MSG(1, ("Received signature algorithm(%04x) is not "
  238. "offered.",
  239. (unsigned int) algorithm));
  240. goto error;
  241. }
  242. if (mbedtls_ssl_get_pk_type_and_md_alg_from_sig_alg(
  243. algorithm, &sig_alg, &md_alg) != 0) {
  244. goto error;
  245. }
  246. hash_alg = mbedtls_md_psa_alg_from_type(md_alg);
  247. if (hash_alg == 0) {
  248. goto error;
  249. }
  250. MBEDTLS_SSL_DEBUG_MSG(3, ("Certificate Verify: Signature algorithm ( %04x )",
  251. (unsigned int) algorithm));
  252. /*
  253. * Check the certificate's key type matches the signature alg
  254. */
  255. if (!mbedtls_pk_can_do(&ssl->session_negotiate->peer_cert->pk, sig_alg)) {
  256. MBEDTLS_SSL_DEBUG_MSG(1, ("signature algorithm doesn't match cert key"));
  257. goto error;
  258. }
  259. MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
  260. signature_len = MBEDTLS_GET_UINT16_BE(p, 0);
  261. p += 2;
  262. MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, signature_len);
  263. status = psa_hash_compute(hash_alg,
  264. verify_buffer,
  265. verify_buffer_len,
  266. verify_hash,
  267. sizeof(verify_hash),
  268. &verify_hash_len);
  269. if (status != PSA_SUCCESS) {
  270. MBEDTLS_SSL_DEBUG_RET(1, "hash computation PSA error", status);
  271. goto error;
  272. }
  273. MBEDTLS_SSL_DEBUG_BUF(3, "verify hash", verify_hash, verify_hash_len);
  274. #if defined(MBEDTLS_X509_RSASSA_PSS_SUPPORT)
  275. if (sig_alg == MBEDTLS_PK_RSASSA_PSS) {
  276. rsassa_pss_options.mgf1_hash_id = md_alg;
  277. rsassa_pss_options.expected_salt_len = PSA_HASH_LENGTH(hash_alg);
  278. options = (const void *) &rsassa_pss_options;
  279. }
  280. #endif /* MBEDTLS_X509_RSASSA_PSS_SUPPORT */
  281. if ((ret = mbedtls_pk_verify_ext(sig_alg, options,
  282. &ssl->session_negotiate->peer_cert->pk,
  283. md_alg, verify_hash, verify_hash_len,
  284. p, signature_len)) == 0) {
  285. return 0;
  286. }
  287. MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_pk_verify_ext", ret);
  288. error:
  289. /* RFC 8446 section 4.4.3
  290. *
  291. * If the verification fails, the receiver MUST terminate the handshake
  292. * with a "decrypt_error" alert.
  293. */
  294. MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR,
  295. MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
  296. return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
  297. }
  298. #endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
  299. int mbedtls_ssl_tls13_process_certificate_verify(mbedtls_ssl_context *ssl)
  300. {
  301. #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
  302. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  303. unsigned char verify_buffer[SSL_VERIFY_STRUCT_MAX_SIZE];
  304. size_t verify_buffer_len;
  305. unsigned char transcript[MBEDTLS_TLS1_3_MD_MAX_SIZE];
  306. size_t transcript_len;
  307. unsigned char *buf;
  308. size_t buf_len;
  309. MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate verify"));
  310. MBEDTLS_SSL_PROC_CHK(
  311. mbedtls_ssl_tls13_fetch_handshake_msg(
  312. ssl, MBEDTLS_SSL_HS_CERTIFICATE_VERIFY, &buf, &buf_len));
  313. /* Need to calculate the hash of the transcript first
  314. * before reading the message since otherwise it gets
  315. * included in the transcript
  316. */
  317. ret = mbedtls_ssl_get_handshake_transcript(
  318. ssl,
  319. (mbedtls_md_type_t) ssl->handshake->ciphersuite_info->mac,
  320. transcript, sizeof(transcript),
  321. &transcript_len);
  322. if (ret != 0) {
  323. MBEDTLS_SSL_PEND_FATAL_ALERT(
  324. MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR,
  325. MBEDTLS_ERR_SSL_INTERNAL_ERROR);
  326. return ret;
  327. }
  328. MBEDTLS_SSL_DEBUG_BUF(3, "handshake hash", transcript, transcript_len);
  329. /* Create verify structure */
  330. ssl_tls13_create_verify_structure(transcript,
  331. transcript_len,
  332. verify_buffer,
  333. &verify_buffer_len,
  334. (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT) ?
  335. MBEDTLS_SSL_IS_SERVER :
  336. MBEDTLS_SSL_IS_CLIENT);
  337. /* Process the message contents */
  338. MBEDTLS_SSL_PROC_CHK(ssl_tls13_parse_certificate_verify(
  339. ssl, buf, buf + buf_len,
  340. verify_buffer, verify_buffer_len));
  341. MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
  342. ssl, MBEDTLS_SSL_HS_CERTIFICATE_VERIFY,
  343. buf, buf_len));
  344. cleanup:
  345. MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate verify"));
  346. MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_process_certificate_verify", ret);
  347. return ret;
  348. #else
  349. ((void) ssl);
  350. MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
  351. return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
  352. #endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
  353. }
  354. /*
  355. *
  356. * STATE HANDLING: Incoming Certificate.
  357. *
  358. */
  359. #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
  360. #if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
  361. /*
  362. * Structure of Certificate message:
  363. *
  364. * enum {
  365. * X509(0),
  366. * RawPublicKey(2),
  367. * (255)
  368. * } CertificateType;
  369. *
  370. * struct {
  371. * select (certificate_type) {
  372. * case RawPublicKey:
  373. * * From RFC 7250 ASN.1_subjectPublicKeyInfo *
  374. * opaque ASN1_subjectPublicKeyInfo<1..2^24-1>;
  375. * case X509:
  376. * opaque cert_data<1..2^24-1>;
  377. * };
  378. * Extension extensions<0..2^16-1>;
  379. * } CertificateEntry;
  380. *
  381. * struct {
  382. * opaque certificate_request_context<0..2^8-1>;
  383. * CertificateEntry certificate_list<0..2^24-1>;
  384. * } Certificate;
  385. *
  386. */
  387. /* Parse certificate chain send by the server. */
  388. MBEDTLS_CHECK_RETURN_CRITICAL
  389. MBEDTLS_STATIC_TESTABLE
  390. int mbedtls_ssl_tls13_parse_certificate(mbedtls_ssl_context *ssl,
  391. const unsigned char *buf,
  392. const unsigned char *end)
  393. {
  394. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  395. size_t certificate_request_context_len = 0;
  396. size_t certificate_list_len = 0;
  397. const unsigned char *p = buf;
  398. const unsigned char *certificate_list_end;
  399. mbedtls_ssl_handshake_params *handshake = ssl->handshake;
  400. MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 4);
  401. certificate_request_context_len = p[0];
  402. certificate_list_len = MBEDTLS_GET_UINT24_BE(p, 1);
  403. p += 4;
  404. /* In theory, the certificate list can be up to 2^24 Bytes, but we don't
  405. * support anything beyond 2^16 = 64K.
  406. */
  407. if ((certificate_request_context_len != 0) ||
  408. (certificate_list_len >= 0x10000)) {
  409. MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate message"));
  410. MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
  411. MBEDTLS_ERR_SSL_DECODE_ERROR);
  412. return MBEDTLS_ERR_SSL_DECODE_ERROR;
  413. }
  414. /* In case we tried to reuse a session but it failed */
  415. if (ssl->session_negotiate->peer_cert != NULL) {
  416. mbedtls_x509_crt_free(ssl->session_negotiate->peer_cert);
  417. mbedtls_free(ssl->session_negotiate->peer_cert);
  418. }
  419. /* This is used by ssl_tls13_validate_certificate() */
  420. if (certificate_list_len == 0) {
  421. ssl->session_negotiate->peer_cert = NULL;
  422. ret = 0;
  423. goto exit;
  424. }
  425. if ((ssl->session_negotiate->peer_cert =
  426. mbedtls_calloc(1, sizeof(mbedtls_x509_crt))) == NULL) {
  427. MBEDTLS_SSL_DEBUG_MSG(1, ("alloc( %" MBEDTLS_PRINTF_SIZET " bytes ) failed",
  428. sizeof(mbedtls_x509_crt)));
  429. MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR,
  430. MBEDTLS_ERR_SSL_ALLOC_FAILED);
  431. return MBEDTLS_ERR_SSL_ALLOC_FAILED;
  432. }
  433. mbedtls_x509_crt_init(ssl->session_negotiate->peer_cert);
  434. MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, certificate_list_len);
  435. certificate_list_end = p + certificate_list_len;
  436. while (p < certificate_list_end) {
  437. size_t cert_data_len, extensions_len;
  438. const unsigned char *extensions_end;
  439. MBEDTLS_SSL_CHK_BUF_READ_PTR(p, certificate_list_end, 3);
  440. cert_data_len = MBEDTLS_GET_UINT24_BE(p, 0);
  441. p += 3;
  442. /* In theory, the CRT can be up to 2^24 Bytes, but we don't support
  443. * anything beyond 2^16 = 64K. Otherwise as in the TLS 1.2 code,
  444. * check that we have a minimum of 128 bytes of data, this is not
  445. * clear why we need that though.
  446. */
  447. if ((cert_data_len < 128) || (cert_data_len >= 0x10000)) {
  448. MBEDTLS_SSL_DEBUG_MSG(1, ("bad Certificate message"));
  449. MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
  450. MBEDTLS_ERR_SSL_DECODE_ERROR);
  451. return MBEDTLS_ERR_SSL_DECODE_ERROR;
  452. }
  453. MBEDTLS_SSL_CHK_BUF_READ_PTR(p, certificate_list_end, cert_data_len);
  454. ret = mbedtls_x509_crt_parse_der(ssl->session_negotiate->peer_cert,
  455. p, cert_data_len);
  456. switch (ret) {
  457. case 0: /*ok*/
  458. break;
  459. case MBEDTLS_ERR_X509_UNKNOWN_SIG_ALG + MBEDTLS_ERR_OID_NOT_FOUND:
  460. /* Ignore certificate with an unknown algorithm: maybe a
  461. prior certificate was already trusted. */
  462. break;
  463. case MBEDTLS_ERR_X509_ALLOC_FAILED:
  464. MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_INTERNAL_ERROR,
  465. MBEDTLS_ERR_X509_ALLOC_FAILED);
  466. MBEDTLS_SSL_DEBUG_RET(1, " mbedtls_x509_crt_parse_der", ret);
  467. return ret;
  468. case MBEDTLS_ERR_X509_UNKNOWN_VERSION:
  469. MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_CERT,
  470. MBEDTLS_ERR_X509_UNKNOWN_VERSION);
  471. MBEDTLS_SSL_DEBUG_RET(1, " mbedtls_x509_crt_parse_der", ret);
  472. return ret;
  473. default:
  474. MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_BAD_CERT,
  475. ret);
  476. MBEDTLS_SSL_DEBUG_RET(1, " mbedtls_x509_crt_parse_der", ret);
  477. return ret;
  478. }
  479. p += cert_data_len;
  480. /* Certificate extensions length */
  481. MBEDTLS_SSL_CHK_BUF_READ_PTR(p, certificate_list_end, 2);
  482. extensions_len = MBEDTLS_GET_UINT16_BE(p, 0);
  483. p += 2;
  484. MBEDTLS_SSL_CHK_BUF_READ_PTR(p, certificate_list_end, extensions_len);
  485. extensions_end = p + extensions_len;
  486. handshake->received_extensions = MBEDTLS_SSL_EXT_MASK_NONE;
  487. while (p < extensions_end) {
  488. unsigned int extension_type;
  489. size_t extension_data_len;
  490. /*
  491. * struct {
  492. * ExtensionType extension_type; (2 bytes)
  493. * opaque extension_data<0..2^16-1>;
  494. * } Extension;
  495. */
  496. MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, 4);
  497. extension_type = MBEDTLS_GET_UINT16_BE(p, 0);
  498. extension_data_len = MBEDTLS_GET_UINT16_BE(p, 2);
  499. p += 4;
  500. MBEDTLS_SSL_CHK_BUF_READ_PTR(p, extensions_end, extension_data_len);
  501. ret = mbedtls_ssl_tls13_check_received_extension(
  502. ssl, MBEDTLS_SSL_HS_CERTIFICATE, extension_type,
  503. MBEDTLS_SSL_TLS1_3_ALLOWED_EXTS_OF_CT);
  504. if (ret != 0) {
  505. return ret;
  506. }
  507. switch (extension_type) {
  508. default:
  509. MBEDTLS_SSL_PRINT_EXT(
  510. 3, MBEDTLS_SSL_HS_CERTIFICATE,
  511. extension_type, "( ignored )");
  512. break;
  513. }
  514. p += extension_data_len;
  515. }
  516. MBEDTLS_SSL_PRINT_EXTS(3, MBEDTLS_SSL_HS_CERTIFICATE,
  517. handshake->received_extensions);
  518. }
  519. exit:
  520. /* Check that all the message is consumed. */
  521. if (p != end) {
  522. MBEDTLS_SSL_DEBUG_MSG(1, ("bad Certificate message"));
  523. MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
  524. MBEDTLS_ERR_SSL_DECODE_ERROR);
  525. return MBEDTLS_ERR_SSL_DECODE_ERROR;
  526. }
  527. MBEDTLS_SSL_DEBUG_CRT(3, "peer certificate",
  528. ssl->session_negotiate->peer_cert);
  529. return ret;
  530. }
  531. #else
  532. MBEDTLS_CHECK_RETURN_CRITICAL
  533. MBEDTLS_STATIC_TESTABLE
  534. int mbedtls_ssl_tls13_parse_certificate(mbedtls_ssl_context *ssl,
  535. const unsigned char *buf,
  536. const unsigned char *end)
  537. {
  538. ((void) ssl);
  539. ((void) buf);
  540. ((void) end);
  541. return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
  542. }
  543. #endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
  544. #endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
  545. #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
  546. #if defined(MBEDTLS_SSL_KEEP_PEER_CERTIFICATE)
  547. /* Validate certificate chain sent by the server. */
  548. MBEDTLS_CHECK_RETURN_CRITICAL
  549. static int ssl_tls13_validate_certificate(mbedtls_ssl_context *ssl)
  550. {
  551. /* Authmode: precedence order is SNI if used else configuration */
  552. #if defined(MBEDTLS_SSL_SRV_C) && defined(MBEDTLS_SSL_SERVER_NAME_INDICATION)
  553. const int authmode = ssl->handshake->sni_authmode != MBEDTLS_SSL_VERIFY_UNSET
  554. ? ssl->handshake->sni_authmode
  555. : ssl->conf->authmode;
  556. #else
  557. const int authmode = ssl->conf->authmode;
  558. #endif
  559. /*
  560. * If the peer hasn't sent a certificate ( i.e. it sent
  561. * an empty certificate chain ), this is reflected in the peer CRT
  562. * structure being unset.
  563. * Check for that and handle it depending on the
  564. * authentication mode.
  565. */
  566. if (ssl->session_negotiate->peer_cert == NULL) {
  567. MBEDTLS_SSL_DEBUG_MSG(1, ("peer has no certificate"));
  568. #if defined(MBEDTLS_SSL_SRV_C)
  569. if (ssl->conf->endpoint == MBEDTLS_SSL_IS_SERVER) {
  570. /* The client was asked for a certificate but didn't send
  571. * one. The client should know what's going on, so we
  572. * don't send an alert.
  573. */
  574. ssl->session_negotiate->verify_result = MBEDTLS_X509_BADCERT_MISSING;
  575. if (authmode == MBEDTLS_SSL_VERIFY_OPTIONAL) {
  576. return 0;
  577. } else {
  578. MBEDTLS_SSL_PEND_FATAL_ALERT(
  579. MBEDTLS_SSL_ALERT_MSG_NO_CERT,
  580. MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE);
  581. return MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE;
  582. }
  583. }
  584. #endif /* MBEDTLS_SSL_SRV_C */
  585. #if defined(MBEDTLS_SSL_CLI_C)
  586. /* Regardless of authmode, the server is not allowed to send an empty
  587. * certificate chain. (Last paragraph before 4.4.2.1 in RFC 8446: "The
  588. * server's certificate_list MUST always be non-empty.") With authmode
  589. * optional/none, we continue the handshake if we can't validate the
  590. * server's cert, but we still break it if no certificate was sent. */
  591. if (ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT) {
  592. MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_NO_CERT,
  593. MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE);
  594. return MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE;
  595. }
  596. #endif /* MBEDTLS_SSL_CLI_C */
  597. }
  598. return mbedtls_ssl_verify_certificate(ssl, authmode,
  599. ssl->session_negotiate->peer_cert,
  600. NULL, NULL);
  601. }
  602. #else /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
  603. MBEDTLS_CHECK_RETURN_CRITICAL
  604. static int ssl_tls13_validate_certificate(mbedtls_ssl_context *ssl)
  605. {
  606. ((void) ssl);
  607. return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
  608. }
  609. #endif /* MBEDTLS_SSL_KEEP_PEER_CERTIFICATE */
  610. #endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
  611. int mbedtls_ssl_tls13_process_certificate(mbedtls_ssl_context *ssl)
  612. {
  613. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  614. MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse certificate"));
  615. #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
  616. unsigned char *buf;
  617. size_t buf_len;
  618. MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_tls13_fetch_handshake_msg(
  619. ssl, MBEDTLS_SSL_HS_CERTIFICATE,
  620. &buf, &buf_len));
  621. /* Parse the certificate chain sent by the peer. */
  622. MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_tls13_parse_certificate(ssl, buf,
  623. buf + buf_len));
  624. /* Validate the certificate chain and set the verification results. */
  625. MBEDTLS_SSL_PROC_CHK(ssl_tls13_validate_certificate(ssl));
  626. MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
  627. ssl, MBEDTLS_SSL_HS_CERTIFICATE, buf, buf_len));
  628. cleanup:
  629. #else /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
  630. (void) ssl;
  631. #endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
  632. MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse certificate"));
  633. return ret;
  634. }
  635. #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED)
  636. /*
  637. * enum {
  638. * X509(0),
  639. * RawPublicKey(2),
  640. * (255)
  641. * } CertificateType;
  642. *
  643. * struct {
  644. * select (certificate_type) {
  645. * case RawPublicKey:
  646. * // From RFC 7250 ASN.1_subjectPublicKeyInfo
  647. * opaque ASN1_subjectPublicKeyInfo<1..2^24-1>;
  648. *
  649. * case X509:
  650. * opaque cert_data<1..2^24-1>;
  651. * };
  652. * Extension extensions<0..2^16-1>;
  653. * } CertificateEntry;
  654. *
  655. * struct {
  656. * opaque certificate_request_context<0..2^8-1>;
  657. * CertificateEntry certificate_list<0..2^24-1>;
  658. * } Certificate;
  659. */
  660. MBEDTLS_CHECK_RETURN_CRITICAL
  661. static int ssl_tls13_write_certificate_body(mbedtls_ssl_context *ssl,
  662. unsigned char *buf,
  663. unsigned char *end,
  664. size_t *out_len)
  665. {
  666. const mbedtls_x509_crt *crt = mbedtls_ssl_own_cert(ssl);
  667. unsigned char *p = buf;
  668. unsigned char *certificate_request_context =
  669. ssl->handshake->certificate_request_context;
  670. unsigned char certificate_request_context_len =
  671. ssl->handshake->certificate_request_context_len;
  672. unsigned char *p_certificate_list_len;
  673. /* ...
  674. * opaque certificate_request_context<0..2^8-1>;
  675. * ...
  676. */
  677. MBEDTLS_SSL_CHK_BUF_PTR(p, end, certificate_request_context_len + 1);
  678. *p++ = certificate_request_context_len;
  679. if (certificate_request_context_len > 0) {
  680. memcpy(p, certificate_request_context, certificate_request_context_len);
  681. p += certificate_request_context_len;
  682. }
  683. /* ...
  684. * CertificateEntry certificate_list<0..2^24-1>;
  685. * ...
  686. */
  687. MBEDTLS_SSL_CHK_BUF_PTR(p, end, 3);
  688. p_certificate_list_len = p;
  689. p += 3;
  690. MBEDTLS_SSL_DEBUG_CRT(3, "own certificate", crt);
  691. while (crt != NULL) {
  692. size_t cert_data_len = crt->raw.len;
  693. MBEDTLS_SSL_CHK_BUF_PTR(p, end, cert_data_len + 3 + 2);
  694. MBEDTLS_PUT_UINT24_BE(cert_data_len, p, 0);
  695. p += 3;
  696. memcpy(p, crt->raw.p, cert_data_len);
  697. p += cert_data_len;
  698. crt = crt->next;
  699. /* Currently, we don't have any certificate extensions defined.
  700. * Hence, we are sending an empty extension with length zero.
  701. */
  702. MBEDTLS_PUT_UINT16_BE(0, p, 0);
  703. p += 2;
  704. }
  705. MBEDTLS_PUT_UINT24_BE(p - p_certificate_list_len - 3,
  706. p_certificate_list_len, 0);
  707. *out_len = p - buf;
  708. MBEDTLS_SSL_PRINT_EXTS(
  709. 3, MBEDTLS_SSL_HS_CERTIFICATE, ssl->handshake->sent_extensions);
  710. return 0;
  711. }
  712. int mbedtls_ssl_tls13_write_certificate(mbedtls_ssl_context *ssl)
  713. {
  714. int ret;
  715. unsigned char *buf;
  716. size_t buf_len, msg_len;
  717. MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate"));
  718. MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_start_handshake_msg(
  719. ssl, MBEDTLS_SSL_HS_CERTIFICATE, &buf, &buf_len));
  720. MBEDTLS_SSL_PROC_CHK(ssl_tls13_write_certificate_body(ssl,
  721. buf,
  722. buf + buf_len,
  723. &msg_len));
  724. MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
  725. ssl, MBEDTLS_SSL_HS_CERTIFICATE, buf, msg_len));
  726. MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_finish_handshake_msg(
  727. ssl, buf_len, msg_len));
  728. cleanup:
  729. MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate"));
  730. return ret;
  731. }
  732. /*
  733. * STATE HANDLING: Output Certificate Verify
  734. */
  735. int mbedtls_ssl_tls13_check_sig_alg_cert_key_match(uint16_t sig_alg,
  736. mbedtls_pk_context *key)
  737. {
  738. mbedtls_pk_type_t pk_type = (mbedtls_pk_type_t) mbedtls_ssl_sig_from_pk(key);
  739. size_t key_size = mbedtls_pk_get_bitlen(key);
  740. switch (pk_type) {
  741. case MBEDTLS_SSL_SIG_ECDSA:
  742. switch (key_size) {
  743. case 256:
  744. return
  745. sig_alg == MBEDTLS_TLS1_3_SIG_ECDSA_SECP256R1_SHA256;
  746. case 384:
  747. return
  748. sig_alg == MBEDTLS_TLS1_3_SIG_ECDSA_SECP384R1_SHA384;
  749. case 521:
  750. return
  751. sig_alg == MBEDTLS_TLS1_3_SIG_ECDSA_SECP521R1_SHA512;
  752. default:
  753. break;
  754. }
  755. break;
  756. case MBEDTLS_SSL_SIG_RSA:
  757. switch (sig_alg) {
  758. case MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA256: /* Intentional fallthrough */
  759. case MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA384: /* Intentional fallthrough */
  760. case MBEDTLS_TLS1_3_SIG_RSA_PSS_RSAE_SHA512:
  761. return 1;
  762. default:
  763. break;
  764. }
  765. break;
  766. default:
  767. break;
  768. }
  769. return 0;
  770. }
  771. MBEDTLS_CHECK_RETURN_CRITICAL
  772. static int ssl_tls13_write_certificate_verify_body(mbedtls_ssl_context *ssl,
  773. unsigned char *buf,
  774. unsigned char *end,
  775. size_t *out_len)
  776. {
  777. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  778. unsigned char *p = buf;
  779. mbedtls_pk_context *own_key;
  780. unsigned char handshake_hash[MBEDTLS_TLS1_3_MD_MAX_SIZE];
  781. size_t handshake_hash_len;
  782. unsigned char verify_buffer[SSL_VERIFY_STRUCT_MAX_SIZE];
  783. size_t verify_buffer_len;
  784. uint16_t *sig_alg = ssl->handshake->received_sig_algs;
  785. size_t signature_len = 0;
  786. *out_len = 0;
  787. own_key = mbedtls_ssl_own_key(ssl);
  788. if (own_key == NULL) {
  789. MBEDTLS_SSL_DEBUG_MSG(1, ("should never happen"));
  790. return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
  791. }
  792. ret = mbedtls_ssl_get_handshake_transcript(
  793. ssl, (mbedtls_md_type_t) ssl->handshake->ciphersuite_info->mac,
  794. handshake_hash, sizeof(handshake_hash), &handshake_hash_len);
  795. if (ret != 0) {
  796. return ret;
  797. }
  798. MBEDTLS_SSL_DEBUG_BUF(3, "handshake hash",
  799. handshake_hash,
  800. handshake_hash_len);
  801. ssl_tls13_create_verify_structure(handshake_hash, handshake_hash_len,
  802. verify_buffer, &verify_buffer_len,
  803. ssl->conf->endpoint);
  804. /*
  805. * struct {
  806. * SignatureScheme algorithm;
  807. * opaque signature<0..2^16-1>;
  808. * } CertificateVerify;
  809. */
  810. /* Check there is space for the algorithm identifier (2 bytes) and the
  811. * signature length (2 bytes).
  812. */
  813. MBEDTLS_SSL_CHK_BUF_PTR(p, end, 4);
  814. for (; *sig_alg != MBEDTLS_TLS1_3_SIG_NONE; sig_alg++) {
  815. psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED;
  816. mbedtls_pk_type_t pk_type = MBEDTLS_PK_NONE;
  817. mbedtls_md_type_t md_alg = MBEDTLS_MD_NONE;
  818. psa_algorithm_t psa_algorithm = PSA_ALG_NONE;
  819. unsigned char verify_hash[PSA_HASH_MAX_SIZE];
  820. size_t verify_hash_len;
  821. if (!mbedtls_ssl_sig_alg_is_offered(ssl, *sig_alg)) {
  822. continue;
  823. }
  824. if (!mbedtls_ssl_tls13_sig_alg_for_cert_verify_is_supported(*sig_alg)) {
  825. continue;
  826. }
  827. if (!mbedtls_ssl_tls13_check_sig_alg_cert_key_match(*sig_alg, own_key)) {
  828. continue;
  829. }
  830. if (mbedtls_ssl_get_pk_type_and_md_alg_from_sig_alg(
  831. *sig_alg, &pk_type, &md_alg) != 0) {
  832. return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
  833. }
  834. /* Hash verify buffer with indicated hash function */
  835. psa_algorithm = mbedtls_md_psa_alg_from_type(md_alg);
  836. status = psa_hash_compute(psa_algorithm,
  837. verify_buffer,
  838. verify_buffer_len,
  839. verify_hash, sizeof(verify_hash),
  840. &verify_hash_len);
  841. if (status != PSA_SUCCESS) {
  842. return PSA_TO_MBEDTLS_ERR(status);
  843. }
  844. MBEDTLS_SSL_DEBUG_BUF(3, "verify hash", verify_hash, verify_hash_len);
  845. if ((ret = mbedtls_pk_sign_ext(pk_type, own_key,
  846. md_alg, verify_hash, verify_hash_len,
  847. p + 4, (size_t) (end - (p + 4)), &signature_len,
  848. ssl->conf->f_rng, ssl->conf->p_rng)) != 0) {
  849. MBEDTLS_SSL_DEBUG_MSG(2, ("CertificateVerify signature failed with %s",
  850. mbedtls_ssl_sig_alg_to_str(*sig_alg)));
  851. MBEDTLS_SSL_DEBUG_RET(2, "mbedtls_pk_sign_ext", ret);
  852. /* The signature failed. This is possible if the private key
  853. * was not suitable for the signature operation as purposely we
  854. * did not check its suitability completely. Let's try with
  855. * another signature algorithm.
  856. */
  857. continue;
  858. }
  859. MBEDTLS_SSL_DEBUG_MSG(2, ("CertificateVerify signature with %s",
  860. mbedtls_ssl_sig_alg_to_str(*sig_alg)));
  861. break;
  862. }
  863. if (*sig_alg == MBEDTLS_TLS1_3_SIG_NONE) {
  864. MBEDTLS_SSL_DEBUG_MSG(1, ("no suitable signature algorithm"));
  865. MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE,
  866. MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
  867. return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
  868. }
  869. MBEDTLS_PUT_UINT16_BE(*sig_alg, p, 0);
  870. MBEDTLS_PUT_UINT16_BE(signature_len, p, 2);
  871. *out_len = 4 + signature_len;
  872. return 0;
  873. }
  874. int mbedtls_ssl_tls13_write_certificate_verify(mbedtls_ssl_context *ssl)
  875. {
  876. int ret = 0;
  877. unsigned char *buf;
  878. size_t buf_len, msg_len;
  879. MBEDTLS_SSL_DEBUG_MSG(2, ("=> write certificate verify"));
  880. MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_start_handshake_msg(
  881. ssl, MBEDTLS_SSL_HS_CERTIFICATE_VERIFY,
  882. &buf, &buf_len));
  883. MBEDTLS_SSL_PROC_CHK(ssl_tls13_write_certificate_verify_body(
  884. ssl, buf, buf + buf_len, &msg_len));
  885. MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
  886. ssl, MBEDTLS_SSL_HS_CERTIFICATE_VERIFY,
  887. buf, msg_len));
  888. MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_finish_handshake_msg(
  889. ssl, buf_len, msg_len));
  890. cleanup:
  891. MBEDTLS_SSL_DEBUG_MSG(2, ("<= write certificate verify"));
  892. return ret;
  893. }
  894. #endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED */
  895. /*
  896. *
  897. * STATE HANDLING: Incoming Finished message.
  898. */
  899. /*
  900. * Implementation
  901. */
  902. MBEDTLS_CHECK_RETURN_CRITICAL
  903. static int ssl_tls13_preprocess_finished_message(mbedtls_ssl_context *ssl)
  904. {
  905. int ret;
  906. ret = mbedtls_ssl_tls13_calculate_verify_data(
  907. ssl,
  908. ssl->handshake->state_local.finished_in.digest,
  909. sizeof(ssl->handshake->state_local.finished_in.digest),
  910. &ssl->handshake->state_local.finished_in.digest_len,
  911. ssl->conf->endpoint == MBEDTLS_SSL_IS_CLIENT ?
  912. MBEDTLS_SSL_IS_SERVER : MBEDTLS_SSL_IS_CLIENT);
  913. if (ret != 0) {
  914. MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_tls13_calculate_verify_data", ret);
  915. return ret;
  916. }
  917. return 0;
  918. }
  919. MBEDTLS_CHECK_RETURN_CRITICAL
  920. static int ssl_tls13_parse_finished_message(mbedtls_ssl_context *ssl,
  921. const unsigned char *buf,
  922. const unsigned char *end)
  923. {
  924. /*
  925. * struct {
  926. * opaque verify_data[Hash.length];
  927. * } Finished;
  928. */
  929. const unsigned char *expected_verify_data =
  930. ssl->handshake->state_local.finished_in.digest;
  931. size_t expected_verify_data_len =
  932. ssl->handshake->state_local.finished_in.digest_len;
  933. /* Structural validation */
  934. if ((size_t) (end - buf) != expected_verify_data_len) {
  935. MBEDTLS_SSL_DEBUG_MSG(1, ("bad finished message"));
  936. MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECODE_ERROR,
  937. MBEDTLS_ERR_SSL_DECODE_ERROR);
  938. return MBEDTLS_ERR_SSL_DECODE_ERROR;
  939. }
  940. MBEDTLS_SSL_DEBUG_BUF(4, "verify_data (self-computed):",
  941. expected_verify_data,
  942. expected_verify_data_len);
  943. MBEDTLS_SSL_DEBUG_BUF(4, "verify_data (received message):", buf,
  944. expected_verify_data_len);
  945. /* Semantic validation */
  946. if (mbedtls_ct_memcmp(buf,
  947. expected_verify_data,
  948. expected_verify_data_len) != 0) {
  949. MBEDTLS_SSL_DEBUG_MSG(1, ("bad finished message"));
  950. MBEDTLS_SSL_PEND_FATAL_ALERT(MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR,
  951. MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE);
  952. return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
  953. }
  954. return 0;
  955. }
  956. int mbedtls_ssl_tls13_process_finished_message(mbedtls_ssl_context *ssl)
  957. {
  958. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  959. unsigned char *buf;
  960. size_t buf_len;
  961. MBEDTLS_SSL_DEBUG_MSG(2, ("=> parse finished message"));
  962. MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_tls13_fetch_handshake_msg(
  963. ssl, MBEDTLS_SSL_HS_FINISHED, &buf, &buf_len));
  964. /* Preprocessing step: Compute handshake digest */
  965. MBEDTLS_SSL_PROC_CHK(ssl_tls13_preprocess_finished_message(ssl));
  966. MBEDTLS_SSL_PROC_CHK(ssl_tls13_parse_finished_message(
  967. ssl, buf, buf + buf_len));
  968. MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(
  969. ssl, MBEDTLS_SSL_HS_FINISHED, buf, buf_len));
  970. cleanup:
  971. MBEDTLS_SSL_DEBUG_MSG(2, ("<= parse finished message"));
  972. return ret;
  973. }
  974. /*
  975. *
  976. * STATE HANDLING: Write and send Finished message.
  977. *
  978. */
  979. /*
  980. * Implement
  981. */
  982. MBEDTLS_CHECK_RETURN_CRITICAL
  983. static int ssl_tls13_prepare_finished_message(mbedtls_ssl_context *ssl)
  984. {
  985. int ret;
  986. /* Compute transcript of handshake up to now. */
  987. ret = mbedtls_ssl_tls13_calculate_verify_data(ssl,
  988. ssl->handshake->state_local.finished_out.digest,
  989. sizeof(ssl->handshake->state_local.finished_out.
  990. digest),
  991. &ssl->handshake->state_local.finished_out.digest_len,
  992. ssl->conf->endpoint);
  993. if (ret != 0) {
  994. MBEDTLS_SSL_DEBUG_RET(1, "calculate_verify_data failed", ret);
  995. return ret;
  996. }
  997. return 0;
  998. }
  999. MBEDTLS_CHECK_RETURN_CRITICAL
  1000. static int ssl_tls13_write_finished_message_body(mbedtls_ssl_context *ssl,
  1001. unsigned char *buf,
  1002. unsigned char *end,
  1003. size_t *out_len)
  1004. {
  1005. size_t verify_data_len = ssl->handshake->state_local.finished_out.digest_len;
  1006. /*
  1007. * struct {
  1008. * opaque verify_data[Hash.length];
  1009. * } Finished;
  1010. */
  1011. MBEDTLS_SSL_CHK_BUF_PTR(buf, end, verify_data_len);
  1012. memcpy(buf, ssl->handshake->state_local.finished_out.digest,
  1013. verify_data_len);
  1014. *out_len = verify_data_len;
  1015. return 0;
  1016. }
  1017. /* Main entry point: orchestrates the other functions */
  1018. int mbedtls_ssl_tls13_write_finished_message(mbedtls_ssl_context *ssl)
  1019. {
  1020. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  1021. unsigned char *buf;
  1022. size_t buf_len, msg_len;
  1023. MBEDTLS_SSL_DEBUG_MSG(2, ("=> write finished message"));
  1024. MBEDTLS_SSL_PROC_CHK(ssl_tls13_prepare_finished_message(ssl));
  1025. MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_start_handshake_msg(ssl,
  1026. MBEDTLS_SSL_HS_FINISHED, &buf, &buf_len));
  1027. MBEDTLS_SSL_PROC_CHK(ssl_tls13_write_finished_message_body(
  1028. ssl, buf, buf + buf_len, &msg_len));
  1029. MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_add_hs_msg_to_checksum(ssl,
  1030. MBEDTLS_SSL_HS_FINISHED, buf, msg_len));
  1031. MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_finish_handshake_msg(
  1032. ssl, buf_len, msg_len));
  1033. cleanup:
  1034. MBEDTLS_SSL_DEBUG_MSG(2, ("<= write finished message"));
  1035. return ret;
  1036. }
  1037. void mbedtls_ssl_tls13_handshake_wrapup(mbedtls_ssl_context *ssl)
  1038. {
  1039. MBEDTLS_SSL_DEBUG_MSG(3, ("=> handshake wrapup"));
  1040. MBEDTLS_SSL_DEBUG_MSG(1, ("Switch to application keys for inbound traffic"));
  1041. mbedtls_ssl_set_inbound_transform(ssl, ssl->transform_application);
  1042. MBEDTLS_SSL_DEBUG_MSG(1, ("Switch to application keys for outbound traffic"));
  1043. mbedtls_ssl_set_outbound_transform(ssl, ssl->transform_application);
  1044. /*
  1045. * Free the previous session and switch to the current one.
  1046. */
  1047. if (ssl->session) {
  1048. mbedtls_ssl_session_free(ssl->session);
  1049. mbedtls_free(ssl->session);
  1050. }
  1051. ssl->session = ssl->session_negotiate;
  1052. ssl->session_negotiate = NULL;
  1053. MBEDTLS_SSL_DEBUG_MSG(3, ("<= handshake wrapup"));
  1054. }
  1055. /*
  1056. *
  1057. * STATE HANDLING: Write ChangeCipherSpec
  1058. *
  1059. */
  1060. #if defined(MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE)
  1061. MBEDTLS_CHECK_RETURN_CRITICAL
  1062. static int ssl_tls13_write_change_cipher_spec_body(mbedtls_ssl_context *ssl,
  1063. unsigned char *buf,
  1064. unsigned char *end,
  1065. size_t *olen)
  1066. {
  1067. ((void) ssl);
  1068. MBEDTLS_SSL_CHK_BUF_PTR(buf, end, 1);
  1069. buf[0] = 1;
  1070. *olen = 1;
  1071. return 0;
  1072. }
  1073. int mbedtls_ssl_tls13_write_change_cipher_spec(mbedtls_ssl_context *ssl)
  1074. {
  1075. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  1076. MBEDTLS_SSL_DEBUG_MSG(2, ("=> write change cipher spec"));
  1077. /* Only one CCS to send. */
  1078. if (ssl->handshake->ccs_sent) {
  1079. ret = 0;
  1080. goto cleanup;
  1081. }
  1082. /* Write CCS message */
  1083. MBEDTLS_SSL_PROC_CHK(ssl_tls13_write_change_cipher_spec_body(
  1084. ssl, ssl->out_msg,
  1085. ssl->out_msg + MBEDTLS_SSL_OUT_CONTENT_LEN,
  1086. &ssl->out_msglen));
  1087. ssl->out_msgtype = MBEDTLS_SSL_MSG_CHANGE_CIPHER_SPEC;
  1088. /* Dispatch message */
  1089. MBEDTLS_SSL_PROC_CHK(mbedtls_ssl_write_record(ssl, 0));
  1090. ssl->handshake->ccs_sent = 1;
  1091. cleanup:
  1092. MBEDTLS_SSL_DEBUG_MSG(2, ("<= write change cipher spec"));
  1093. return ret;
  1094. }
  1095. #endif /* MBEDTLS_SSL_TLS1_3_COMPATIBILITY_MODE */
  1096. /* Early Data Indication Extension
  1097. *
  1098. * struct {
  1099. * select ( Handshake.msg_type ) {
  1100. * case new_session_ticket: uint32 max_early_data_size;
  1101. * case client_hello: Empty;
  1102. * case encrypted_extensions: Empty;
  1103. * };
  1104. * } EarlyDataIndication;
  1105. */
  1106. #if defined(MBEDTLS_SSL_EARLY_DATA)
  1107. int mbedtls_ssl_tls13_write_early_data_ext(mbedtls_ssl_context *ssl,
  1108. int in_new_session_ticket,
  1109. unsigned char *buf,
  1110. const unsigned char *end,
  1111. size_t *out_len)
  1112. {
  1113. unsigned char *p = buf;
  1114. #if defined(MBEDTLS_SSL_SRV_C)
  1115. const size_t needed = in_new_session_ticket ? 8 : 4;
  1116. #else
  1117. const size_t needed = 4;
  1118. ((void) in_new_session_ticket);
  1119. #endif
  1120. *out_len = 0;
  1121. MBEDTLS_SSL_CHK_BUF_PTR(p, end, needed);
  1122. MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_EARLY_DATA, p, 0);
  1123. MBEDTLS_PUT_UINT16_BE(needed - 4, p, 2);
  1124. #if defined(MBEDTLS_SSL_SRV_C)
  1125. if (in_new_session_ticket) {
  1126. MBEDTLS_PUT_UINT32_BE(ssl->conf->max_early_data_size, p, 4);
  1127. MBEDTLS_SSL_DEBUG_MSG(
  1128. 4, ("Sent max_early_data_size=%u",
  1129. (unsigned int) ssl->conf->max_early_data_size));
  1130. }
  1131. #endif
  1132. *out_len = needed;
  1133. mbedtls_ssl_tls13_set_hs_sent_ext_mask(ssl, MBEDTLS_TLS_EXT_EARLY_DATA);
  1134. return 0;
  1135. }
  1136. #if defined(MBEDTLS_SSL_SRV_C)
  1137. int mbedtls_ssl_tls13_check_early_data_len(mbedtls_ssl_context *ssl,
  1138. size_t early_data_len)
  1139. {
  1140. /*
  1141. * This function should be called only while an handshake is in progress
  1142. * and thus a session under negotiation. Add a sanity check to detect a
  1143. * misuse.
  1144. */
  1145. if (ssl->session_negotiate == NULL) {
  1146. return MBEDTLS_ERR_SSL_INTERNAL_ERROR;
  1147. }
  1148. /* RFC 8446 section 4.6.1
  1149. *
  1150. * A server receiving more than max_early_data_size bytes of 0-RTT data
  1151. * SHOULD terminate the connection with an "unexpected_message" alert.
  1152. * Note that if it is still possible to send early_data_len bytes of early
  1153. * data, it means that early_data_len is smaller than max_early_data_size
  1154. * (type uint32_t) and can fit in an uint32_t. We use this further
  1155. * down.
  1156. */
  1157. if (early_data_len >
  1158. (ssl->session_negotiate->max_early_data_size -
  1159. ssl->total_early_data_size)) {
  1160. MBEDTLS_SSL_DEBUG_MSG(
  1161. 2, ("EarlyData: Too much early data received, "
  1162. "%lu + %" MBEDTLS_PRINTF_SIZET " > %lu",
  1163. (unsigned long) ssl->total_early_data_size,
  1164. early_data_len,
  1165. (unsigned long) ssl->session_negotiate->max_early_data_size));
  1166. MBEDTLS_SSL_PEND_FATAL_ALERT(
  1167. MBEDTLS_SSL_ALERT_MSG_UNEXPECTED_MESSAGE,
  1168. MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE);
  1169. return MBEDTLS_ERR_SSL_UNEXPECTED_MESSAGE;
  1170. }
  1171. /*
  1172. * early_data_len has been checked to be less than max_early_data_size
  1173. * that is uint32_t. Its cast to an uint32_t below is thus safe. We need
  1174. * the cast to appease some compilers.
  1175. */
  1176. ssl->total_early_data_size += (uint32_t) early_data_len;
  1177. return 0;
  1178. }
  1179. #endif /* MBEDTLS_SSL_SRV_C */
  1180. #endif /* MBEDTLS_SSL_EARLY_DATA */
  1181. /* Reset SSL context and update hash for handling HRR.
  1182. *
  1183. * Replace Transcript-Hash(X) by
  1184. * Transcript-Hash( message_hash ||
  1185. * 00 00 Hash.length ||
  1186. * X )
  1187. * A few states of the handshake are preserved, including:
  1188. * - session ID
  1189. * - session ticket
  1190. * - negotiated ciphersuite
  1191. */
  1192. int mbedtls_ssl_reset_transcript_for_hrr(mbedtls_ssl_context *ssl)
  1193. {
  1194. int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
  1195. unsigned char hash_transcript[PSA_HASH_MAX_SIZE + 4];
  1196. size_t hash_len;
  1197. const mbedtls_ssl_ciphersuite_t *ciphersuite_info =
  1198. ssl->handshake->ciphersuite_info;
  1199. MBEDTLS_SSL_DEBUG_MSG(3, ("Reset SSL session for HRR"));
  1200. ret = mbedtls_ssl_get_handshake_transcript(ssl, (mbedtls_md_type_t) ciphersuite_info->mac,
  1201. hash_transcript + 4,
  1202. PSA_HASH_MAX_SIZE,
  1203. &hash_len);
  1204. if (ret != 0) {
  1205. MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_get_handshake_transcript", ret);
  1206. return ret;
  1207. }
  1208. hash_transcript[0] = MBEDTLS_SSL_HS_MESSAGE_HASH;
  1209. hash_transcript[1] = 0;
  1210. hash_transcript[2] = 0;
  1211. hash_transcript[3] = (unsigned char) hash_len;
  1212. hash_len += 4;
  1213. MBEDTLS_SSL_DEBUG_BUF(4, "Truncated handshake transcript",
  1214. hash_transcript, hash_len);
  1215. /* Reset running hash and replace it with a hash of the transcript */
  1216. ret = mbedtls_ssl_reset_checksum(ssl);
  1217. if (ret != 0) {
  1218. MBEDTLS_SSL_DEBUG_RET(1, "mbedtls_ssl_reset_checksum", ret);
  1219. return ret;
  1220. }
  1221. ret = ssl->handshake->update_checksum(ssl, hash_transcript, hash_len);
  1222. if (ret != 0) {
  1223. MBEDTLS_SSL_DEBUG_RET(1, "update_checksum", ret);
  1224. return ret;
  1225. }
  1226. return ret;
  1227. }
  1228. #if defined(MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED)
  1229. int mbedtls_ssl_tls13_read_public_xxdhe_share(mbedtls_ssl_context *ssl,
  1230. const unsigned char *buf,
  1231. size_t buf_len)
  1232. {
  1233. uint8_t *p = (uint8_t *) buf;
  1234. const uint8_t *end = buf + buf_len;
  1235. mbedtls_ssl_handshake_params *handshake = ssl->handshake;
  1236. /* Get size of the TLS opaque key_exchange field of the KeyShareEntry struct. */
  1237. MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
  1238. uint16_t peerkey_len = MBEDTLS_GET_UINT16_BE(p, 0);
  1239. p += 2;
  1240. /* Check if key size is consistent with given buffer length. */
  1241. MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, peerkey_len);
  1242. /* Store peer's ECDH/FFDH public key. */
  1243. if (peerkey_len > sizeof(handshake->xxdh_psa_peerkey)) {
  1244. MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid public key length: %u > %" MBEDTLS_PRINTF_SIZET,
  1245. (unsigned) peerkey_len,
  1246. sizeof(handshake->xxdh_psa_peerkey)));
  1247. return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
  1248. }
  1249. memcpy(handshake->xxdh_psa_peerkey, p, peerkey_len);
  1250. handshake->xxdh_psa_peerkey_len = peerkey_len;
  1251. return 0;
  1252. }
  1253. #if defined(PSA_WANT_ALG_FFDH)
  1254. static psa_status_t mbedtls_ssl_get_psa_ffdh_info_from_tls_id(
  1255. uint16_t tls_id, size_t *bits, psa_key_type_t *key_type)
  1256. {
  1257. switch (tls_id) {
  1258. #if defined(PSA_WANT_DH_RFC7919_2048)
  1259. case MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE2048:
  1260. *bits = 2048;
  1261. *key_type = PSA_KEY_TYPE_DH_KEY_PAIR(PSA_DH_FAMILY_RFC7919);
  1262. return PSA_SUCCESS;
  1263. #endif /* PSA_WANT_DH_RFC7919_2048 */
  1264. #if defined(PSA_WANT_DH_RFC7919_3072)
  1265. case MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE3072:
  1266. *bits = 3072;
  1267. *key_type = PSA_KEY_TYPE_DH_KEY_PAIR(PSA_DH_FAMILY_RFC7919);
  1268. return PSA_SUCCESS;
  1269. #endif /* PSA_WANT_DH_RFC7919_3072 */
  1270. #if defined(PSA_WANT_DH_RFC7919_4096)
  1271. case MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE4096:
  1272. *bits = 4096;
  1273. *key_type = PSA_KEY_TYPE_DH_KEY_PAIR(PSA_DH_FAMILY_RFC7919);
  1274. return PSA_SUCCESS;
  1275. #endif /* PSA_WANT_DH_RFC7919_4096 */
  1276. #if defined(PSA_WANT_DH_RFC7919_6144)
  1277. case MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE6144:
  1278. *bits = 6144;
  1279. *key_type = PSA_KEY_TYPE_DH_KEY_PAIR(PSA_DH_FAMILY_RFC7919);
  1280. return PSA_SUCCESS;
  1281. #endif /* PSA_WANT_DH_RFC7919_6144 */
  1282. #if defined(PSA_WANT_DH_RFC7919_8192)
  1283. case MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE8192:
  1284. *bits = 8192;
  1285. *key_type = PSA_KEY_TYPE_DH_KEY_PAIR(PSA_DH_FAMILY_RFC7919);
  1286. return PSA_SUCCESS;
  1287. #endif /* PSA_WANT_DH_RFC7919_8192 */
  1288. default:
  1289. return PSA_ERROR_NOT_SUPPORTED;
  1290. }
  1291. }
  1292. #endif /* PSA_WANT_ALG_FFDH */
  1293. int mbedtls_ssl_tls13_generate_and_write_xxdh_key_exchange(
  1294. mbedtls_ssl_context *ssl,
  1295. uint16_t named_group,
  1296. unsigned char *buf,
  1297. unsigned char *end,
  1298. size_t *out_len)
  1299. {
  1300. psa_status_t status = PSA_ERROR_GENERIC_ERROR;
  1301. int ret = MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
  1302. psa_key_attributes_t key_attributes;
  1303. size_t own_pubkey_len;
  1304. mbedtls_ssl_handshake_params *handshake = ssl->handshake;
  1305. size_t bits = 0;
  1306. psa_key_type_t key_type = PSA_KEY_TYPE_NONE;
  1307. psa_algorithm_t alg = PSA_ALG_NONE;
  1308. size_t buf_size = (size_t) (end - buf);
  1309. MBEDTLS_SSL_DEBUG_MSG(1, ("Perform PSA-based ECDH/FFDH computation."));
  1310. /* Convert EC's TLS ID to PSA key type. */
  1311. #if defined(PSA_WANT_ALG_ECDH)
  1312. if (mbedtls_ssl_get_psa_curve_info_from_tls_id(
  1313. named_group, &key_type, &bits) == PSA_SUCCESS) {
  1314. alg = PSA_ALG_ECDH;
  1315. }
  1316. #endif
  1317. #if defined(PSA_WANT_ALG_FFDH)
  1318. if (mbedtls_ssl_get_psa_ffdh_info_from_tls_id(named_group, &bits,
  1319. &key_type) == PSA_SUCCESS) {
  1320. alg = PSA_ALG_FFDH;
  1321. }
  1322. #endif
  1323. if (key_type == PSA_KEY_TYPE_NONE) {
  1324. return MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE;
  1325. }
  1326. if (buf_size < PSA_BITS_TO_BYTES(bits)) {
  1327. return MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL;
  1328. }
  1329. handshake->xxdh_psa_type = key_type;
  1330. ssl->handshake->xxdh_psa_bits = bits;
  1331. key_attributes = psa_key_attributes_init();
  1332. psa_set_key_usage_flags(&key_attributes, PSA_KEY_USAGE_DERIVE);
  1333. psa_set_key_algorithm(&key_attributes, alg);
  1334. psa_set_key_type(&key_attributes, handshake->xxdh_psa_type);
  1335. psa_set_key_bits(&key_attributes, handshake->xxdh_psa_bits);
  1336. /* Generate ECDH/FFDH private key. */
  1337. status = psa_generate_key(&key_attributes,
  1338. &handshake->xxdh_psa_privkey);
  1339. if (status != PSA_SUCCESS) {
  1340. ret = PSA_TO_MBEDTLS_ERR(status);
  1341. MBEDTLS_SSL_DEBUG_RET(1, "psa_generate_key", ret);
  1342. return ret;
  1343. }
  1344. /* Export the public part of the ECDH/FFDH private key from PSA. */
  1345. status = psa_export_public_key(handshake->xxdh_psa_privkey,
  1346. buf, buf_size,
  1347. &own_pubkey_len);
  1348. if (status != PSA_SUCCESS) {
  1349. ret = PSA_TO_MBEDTLS_ERR(status);
  1350. MBEDTLS_SSL_DEBUG_RET(1, "psa_export_public_key", ret);
  1351. return ret;
  1352. }
  1353. *out_len = own_pubkey_len;
  1354. return 0;
  1355. }
  1356. #endif /* MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_SOME_EPHEMERAL_ENABLED */
  1357. /* RFC 8446 section 4.2
  1358. *
  1359. * If an implementation receives an extension which it recognizes and which is
  1360. * not specified for the message in which it appears, it MUST abort the handshake
  1361. * with an "illegal_parameter" alert.
  1362. *
  1363. */
  1364. int mbedtls_ssl_tls13_check_received_extension(
  1365. mbedtls_ssl_context *ssl,
  1366. int hs_msg_type,
  1367. unsigned int received_extension_type,
  1368. uint32_t hs_msg_allowed_extensions_mask)
  1369. {
  1370. uint32_t extension_mask = mbedtls_ssl_get_extension_mask(
  1371. received_extension_type);
  1372. MBEDTLS_SSL_PRINT_EXT(
  1373. 3, hs_msg_type, received_extension_type, "received");
  1374. if ((extension_mask & hs_msg_allowed_extensions_mask) == 0) {
  1375. MBEDTLS_SSL_PRINT_EXT(
  1376. 3, hs_msg_type, received_extension_type, "is illegal");
  1377. MBEDTLS_SSL_PEND_FATAL_ALERT(
  1378. MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
  1379. MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
  1380. return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
  1381. }
  1382. ssl->handshake->received_extensions |= extension_mask;
  1383. /*
  1384. * If it is a message containing extension responses, check that we
  1385. * previously sent the extension.
  1386. */
  1387. switch (hs_msg_type) {
  1388. case MBEDTLS_SSL_HS_SERVER_HELLO:
  1389. case MBEDTLS_SSL_TLS1_3_HS_HELLO_RETRY_REQUEST:
  1390. case MBEDTLS_SSL_HS_ENCRYPTED_EXTENSIONS:
  1391. case MBEDTLS_SSL_HS_CERTIFICATE:
  1392. /* Check if the received extension is sent by peer message.*/
  1393. if ((ssl->handshake->sent_extensions & extension_mask) != 0) {
  1394. return 0;
  1395. }
  1396. break;
  1397. default:
  1398. return 0;
  1399. }
  1400. MBEDTLS_SSL_PRINT_EXT(
  1401. 3, hs_msg_type, received_extension_type, "is unsupported");
  1402. MBEDTLS_SSL_PEND_FATAL_ALERT(
  1403. MBEDTLS_SSL_ALERT_MSG_UNSUPPORTED_EXT,
  1404. MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION);
  1405. return MBEDTLS_ERR_SSL_UNSUPPORTED_EXTENSION;
  1406. }
  1407. #if defined(MBEDTLS_SSL_RECORD_SIZE_LIMIT)
  1408. /* RFC 8449, section 4:
  1409. *
  1410. * The ExtensionData of the "record_size_limit" extension is
  1411. * RecordSizeLimit:
  1412. * uint16 RecordSizeLimit;
  1413. */
  1414. MBEDTLS_CHECK_RETURN_CRITICAL
  1415. int mbedtls_ssl_tls13_parse_record_size_limit_ext(mbedtls_ssl_context *ssl,
  1416. const unsigned char *buf,
  1417. const unsigned char *end)
  1418. {
  1419. const unsigned char *p = buf;
  1420. uint16_t record_size_limit;
  1421. const size_t extension_data_len = end - buf;
  1422. if (extension_data_len !=
  1423. MBEDTLS_SSL_RECORD_SIZE_LIMIT_EXTENSION_DATA_LENGTH) {
  1424. MBEDTLS_SSL_DEBUG_MSG(2,
  1425. ("record_size_limit extension has invalid length: %"
  1426. MBEDTLS_PRINTF_SIZET " Bytes",
  1427. extension_data_len));
  1428. MBEDTLS_SSL_PEND_FATAL_ALERT(
  1429. MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
  1430. MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
  1431. return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
  1432. }
  1433. MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 2);
  1434. record_size_limit = MBEDTLS_GET_UINT16_BE(p, 0);
  1435. MBEDTLS_SSL_DEBUG_MSG(2, ("RecordSizeLimit: %u Bytes", record_size_limit));
  1436. /* RFC 8449, section 4:
  1437. *
  1438. * Endpoints MUST NOT send a "record_size_limit" extension with a value
  1439. * smaller than 64. An endpoint MUST treat receipt of a smaller value
  1440. * as a fatal error and generate an "illegal_parameter" alert.
  1441. */
  1442. if (record_size_limit < MBEDTLS_SSL_RECORD_SIZE_LIMIT_MIN) {
  1443. MBEDTLS_SSL_DEBUG_MSG(1, ("Invalid record size limit : %u Bytes",
  1444. record_size_limit));
  1445. MBEDTLS_SSL_PEND_FATAL_ALERT(
  1446. MBEDTLS_SSL_ALERT_MSG_ILLEGAL_PARAMETER,
  1447. MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER);
  1448. return MBEDTLS_ERR_SSL_ILLEGAL_PARAMETER;
  1449. }
  1450. ssl->session_negotiate->record_size_limit = record_size_limit;
  1451. return 0;
  1452. }
  1453. MBEDTLS_CHECK_RETURN_CRITICAL
  1454. int mbedtls_ssl_tls13_write_record_size_limit_ext(mbedtls_ssl_context *ssl,
  1455. unsigned char *buf,
  1456. const unsigned char *end,
  1457. size_t *out_len)
  1458. {
  1459. unsigned char *p = buf;
  1460. *out_len = 0;
  1461. MBEDTLS_STATIC_ASSERT(MBEDTLS_SSL_IN_CONTENT_LEN >= MBEDTLS_SSL_RECORD_SIZE_LIMIT_MIN,
  1462. "MBEDTLS_SSL_IN_CONTENT_LEN is less than the "
  1463. "minimum record size limit");
  1464. MBEDTLS_SSL_CHK_BUF_PTR(p, end, 6);
  1465. MBEDTLS_PUT_UINT16_BE(MBEDTLS_TLS_EXT_RECORD_SIZE_LIMIT, p, 0);
  1466. MBEDTLS_PUT_UINT16_BE(MBEDTLS_SSL_RECORD_SIZE_LIMIT_EXTENSION_DATA_LENGTH,
  1467. p, 2);
  1468. MBEDTLS_PUT_UINT16_BE(MBEDTLS_SSL_IN_CONTENT_LEN, p, 4);
  1469. *out_len = 6;
  1470. MBEDTLS_SSL_DEBUG_MSG(2, ("Sent RecordSizeLimit: %d Bytes",
  1471. MBEDTLS_SSL_IN_CONTENT_LEN));
  1472. mbedtls_ssl_tls13_set_hs_sent_ext_mask(ssl, MBEDTLS_TLS_EXT_RECORD_SIZE_LIMIT);
  1473. return 0;
  1474. }
  1475. #endif /* MBEDTLS_SSL_RECORD_SIZE_LIMIT */
  1476. #endif /* MBEDTLS_SSL_TLS_C && MBEDTLS_SSL_PROTO_TLS1_3 */