ssl_tls13_generic.c 57 KB

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