| Manuel Pégourié-Gonnard | 232edd4 | 2014-07-23 16:56:27 +0200 | [diff] [blame] | 1 | /* | 
|  | 2 | *  DTLS cookie callbacks implementation | 
|  | 3 | * | 
| Bence Szépkúti | 1e14827 | 2020-08-07 13:07:28 +0200 | [diff] [blame] | 4 | *  Copyright The Mbed TLS Contributors | 
| Dave Rodgman | 16799db | 2023-11-02 19:47:20 +0000 | [diff] [blame] | 5 | *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later | 
| Manuel Pégourié-Gonnard | 232edd4 | 2014-07-23 16:56:27 +0200 | [diff] [blame] | 6 | */ | 
|  | 7 | /* | 
|  | 8 | * These session callbacks use a simple chained list | 
|  | 9 | * to store and retrieve the session information. | 
|  | 10 | */ | 
|  | 11 |  | 
| Harry Ramsey | 0f6bc41 | 2024-10-04 10:36:54 +0100 | [diff] [blame] | 12 | #include "ssl_misc.h" | 
| Manuel Pégourié-Gonnard | 232edd4 | 2014-07-23 16:56:27 +0200 | [diff] [blame] | 13 |  | 
| Manuel Pégourié-Gonnard | 2cf5a7c | 2015-04-08 12:49:31 +0200 | [diff] [blame] | 14 | #if defined(MBEDTLS_SSL_COOKIE_C) | 
| Manuel Pégourié-Gonnard | 232edd4 | 2014-07-23 16:56:27 +0200 | [diff] [blame] | 15 |  | 
| Manuel Pégourié-Gonnard | 7f80997 | 2015-03-09 17:05:11 +0000 | [diff] [blame] | 16 | #include "mbedtls/platform.h" | 
| Manuel Pégourié-Gonnard | 232edd4 | 2014-07-23 16:56:27 +0200 | [diff] [blame] | 17 |  | 
| SimonB | d5800b7 | 2016-04-26 07:43:27 +0100 | [diff] [blame] | 18 | #include "mbedtls/ssl_cookie.h" | 
| Janos Follath | 73c616b | 2019-12-18 15:07:04 +0000 | [diff] [blame] | 19 | #include "mbedtls/error.h" | 
| Andres Amaya Garcia | 1f6301b | 2018-04-17 09:51:09 -0500 | [diff] [blame] | 20 | #include "mbedtls/platform_util.h" | 
| Gabor Mezei | 765862c | 2021-10-19 12:22:25 +0200 | [diff] [blame] | 21 | #include "mbedtls/constant_time.h" | 
| SimonB | d5800b7 | 2016-04-26 07:43:27 +0100 | [diff] [blame] | 22 |  | 
| Manuel Pégourié-Gonnard | d901d17 | 2015-02-16 18:37:53 +0000 | [diff] [blame] | 23 | #include <string.h> | 
|  | 24 |  | 
| Valerio Setti | 384fbde | 2024-01-02 13:26:40 +0100 | [diff] [blame] | 25 | #include "mbedtls/psa_util.h" | 
| Andrzej Kurek | 0064484 | 2023-05-30 05:45:00 -0400 | [diff] [blame] | 26 | /* Define a local translating function to save code size by not using too many | 
|  | 27 | * arguments in each translating place. */ | 
|  | 28 | static int local_err_translation(psa_status_t status) | 
|  | 29 | { | 
|  | 30 | return psa_status_to_mbedtls(status, psa_to_ssl_errors, | 
| Andrzej Kurek | 1e4a030 | 2023-05-30 09:45:17 -0400 | [diff] [blame] | 31 | ARRAY_LENGTH(psa_to_ssl_errors), | 
| Andrzej Kurek | 0064484 | 2023-05-30 05:45:00 -0400 | [diff] [blame] | 32 | psa_generic_status_to_mbedtls); | 
|  | 33 | } | 
|  | 34 | #define PSA_TO_MBEDTLS_ERR(status) local_err_translation(status) | 
| Andrzej Kurek | 8a045ce | 2022-12-23 11:00:06 -0500 | [diff] [blame] | 35 |  | 
| Manuel Pégourié-Gonnard | 232edd4 | 2014-07-23 16:56:27 +0200 | [diff] [blame] | 36 | /* | 
| Valerio Setti | 543d00e | 2022-12-22 14:27:34 +0100 | [diff] [blame] | 37 | * If DTLS is in use, then at least one of SHA-256 or SHA-384 is | 
|  | 38 | * available. Try SHA-256 first as 384 wastes resources | 
| Manuel Pégourié-Gonnard | 232edd4 | 2014-07-23 16:56:27 +0200 | [diff] [blame] | 39 | */ | 
| Elena Uziunaite | 0916cd7 | 2024-05-23 17:01:07 +0100 | [diff] [blame] | 40 | #if defined(PSA_WANT_ALG_SHA_256) | 
| Valerio Setti | 543d00e | 2022-12-22 14:27:34 +0100 | [diff] [blame] | 41 | #define COOKIE_MD           MBEDTLS_MD_SHA256 | 
| Manuel Pégourié-Gonnard | e903081 | 2014-07-23 21:29:11 +0200 | [diff] [blame] | 42 | #define COOKIE_MD_OUTLEN    32 | 
|  | 43 | #define COOKIE_HMAC_LEN     28 | 
| Elena Uziunaite | b476d4b | 2024-05-23 15:33:41 +0100 | [diff] [blame] | 44 | #elif defined(PSA_WANT_ALG_SHA_384) | 
| Manuel Pégourié-Gonnard | 2cf5a7c | 2015-04-08 12:49:31 +0200 | [diff] [blame] | 45 | #define COOKIE_MD           MBEDTLS_MD_SHA384 | 
| Manuel Pégourié-Gonnard | e903081 | 2014-07-23 21:29:11 +0200 | [diff] [blame] | 46 | #define COOKIE_MD_OUTLEN    48 | 
|  | 47 | #define COOKIE_HMAC_LEN     28 | 
| Manuel Pégourié-Gonnard | 232edd4 | 2014-07-23 16:56:27 +0200 | [diff] [blame] | 48 | #else | 
| Valerio Setti | 543d00e | 2022-12-22 14:27:34 +0100 | [diff] [blame] | 49 | #error "DTLS hello verify needs SHA-256 or SHA-384" | 
| Manuel Pégourié-Gonnard | 232edd4 | 2014-07-23 16:56:27 +0200 | [diff] [blame] | 50 | #endif | 
|  | 51 |  | 
| Manuel Pégourié-Gonnard | e903081 | 2014-07-23 21:29:11 +0200 | [diff] [blame] | 52 | /* | 
|  | 53 | * Cookies are formed of a 4-bytes timestamp (or serial number) and | 
| Shaun Case | 8b0ecbc | 2021-12-20 21:14:10 -0800 | [diff] [blame] | 54 | * an HMAC of timestamp and client ID. | 
| Manuel Pégourié-Gonnard | e903081 | 2014-07-23 21:29:11 +0200 | [diff] [blame] | 55 | */ | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 56 | #define COOKIE_LEN      (4 + COOKIE_HMAC_LEN) | 
| Manuel Pégourié-Gonnard | e903081 | 2014-07-23 21:29:11 +0200 | [diff] [blame] | 57 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 58 | void mbedtls_ssl_cookie_init(mbedtls_ssl_cookie_ctx *ctx) | 
| Manuel Pégourié-Gonnard | 232edd4 | 2014-07-23 16:56:27 +0200 | [diff] [blame] | 59 | { | 
| Neil Armstrong | 488a40e | 2022-03-22 10:41:38 +0100 | [diff] [blame] | 60 | ctx->psa_hmac_key = MBEDTLS_SVC_KEY_ID_INIT; | 
| Manuel Pégourié-Gonnard | 2cf5a7c | 2015-04-08 12:49:31 +0200 | [diff] [blame] | 61 | #if !defined(MBEDTLS_HAVE_TIME) | 
| Manuel Pégourié-Gonnard | e903081 | 2014-07-23 21:29:11 +0200 | [diff] [blame] | 62 | ctx->serial = 0; | 
|  | 63 | #endif | 
| Manuel Pégourié-Gonnard | 2cf5a7c | 2015-04-08 12:49:31 +0200 | [diff] [blame] | 64 | ctx->timeout = MBEDTLS_SSL_COOKIE_TIMEOUT; | 
| Manuel Pégourié-Gonnard | 2a84dfd | 2015-05-28 15:48:09 +0200 | [diff] [blame] | 65 |  | 
| Manuel Pégourié-Gonnard | bef8f09 | 2014-07-23 23:40:29 +0200 | [diff] [blame] | 66 | } | 
|  | 67 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 68 | void mbedtls_ssl_cookie_set_timeout(mbedtls_ssl_cookie_ctx *ctx, unsigned long delay) | 
| Manuel Pégourié-Gonnard | bef8f09 | 2014-07-23 23:40:29 +0200 | [diff] [blame] | 69 | { | 
|  | 70 | ctx->timeout = delay; | 
| Manuel Pégourié-Gonnard | 232edd4 | 2014-07-23 16:56:27 +0200 | [diff] [blame] | 71 | } | 
|  | 72 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 73 | void mbedtls_ssl_cookie_free(mbedtls_ssl_cookie_ctx *ctx) | 
| Manuel Pégourié-Gonnard | 232edd4 | 2014-07-23 16:56:27 +0200 | [diff] [blame] | 74 | { | 
| Troy-Butler | 9ac3e23 | 2024-03-22 14:46:04 -0400 | [diff] [blame] | 75 | if (ctx == NULL) { | 
|  | 76 | return; | 
|  | 77 | } | 
|  | 78 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 79 | psa_destroy_key(ctx->psa_hmac_key); | 
| Manuel Pégourié-Gonnard | 2a84dfd | 2015-05-28 15:48:09 +0200 | [diff] [blame] | 80 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 81 | mbedtls_platform_zeroize(ctx, sizeof(mbedtls_ssl_cookie_ctx)); | 
| Manuel Pégourié-Gonnard | 232edd4 | 2014-07-23 16:56:27 +0200 | [diff] [blame] | 82 | } | 
|  | 83 |  | 
| Ben Taylor | 0cfe54e | 2025-03-05 15:49:08 +0000 | [diff] [blame] | 84 | int mbedtls_ssl_cookie_setup(mbedtls_ssl_cookie_ctx *ctx) | 
| Manuel Pégourié-Gonnard | 232edd4 | 2014-07-23 16:56:27 +0200 | [diff] [blame] | 85 | { | 
| Neil Armstrong | d633201 | 2022-03-04 10:26:16 +0100 | [diff] [blame] | 86 | psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT; | 
|  | 87 | psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; | 
|  | 88 | psa_algorithm_t alg; | 
| Manuel Pégourié-Gonnard | 232edd4 | 2014-07-23 16:56:27 +0200 | [diff] [blame] | 89 |  | 
| Manuel Pégourié-Gonnard | 232edd4 | 2014-07-23 16:56:27 +0200 | [diff] [blame] | 90 |  | 
| Manuel Pégourié-Gonnard | 2d6d993 | 2023-03-28 11:38:08 +0200 | [diff] [blame] | 91 | alg = mbedtls_md_psa_alg_from_type(COOKIE_MD); | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 92 | if (alg == 0) { | 
|  | 93 | return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; | 
|  | 94 | } | 
| Neil Armstrong | d633201 | 2022-03-04 10:26:16 +0100 | [diff] [blame] | 95 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 96 | ctx->psa_hmac_alg = PSA_ALG_TRUNCATED_MAC(PSA_ALG_HMAC(alg), | 
|  | 97 | COOKIE_HMAC_LEN); | 
| Neil Armstrong | d633201 | 2022-03-04 10:26:16 +0100 | [diff] [blame] | 98 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 99 | psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_VERIFY_MESSAGE | | 
|  | 100 | PSA_KEY_USAGE_SIGN_MESSAGE); | 
|  | 101 | psa_set_key_algorithm(&attributes, ctx->psa_hmac_alg); | 
|  | 102 | psa_set_key_type(&attributes, PSA_KEY_TYPE_HMAC); | 
|  | 103 | psa_set_key_bits(&attributes, PSA_BYTES_TO_BITS(COOKIE_MD_OUTLEN)); | 
| Neil Armstrong | d633201 | 2022-03-04 10:26:16 +0100 | [diff] [blame] | 104 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 105 | if ((status = psa_generate_key(&attributes, | 
|  | 106 | &ctx->psa_hmac_key)) != PSA_SUCCESS) { | 
| Andrzej Kurek | 8a045ce | 2022-12-23 11:00:06 -0500 | [diff] [blame] | 107 | return PSA_TO_MBEDTLS_ERR(status); | 
| Neil Armstrong | d633201 | 2022-03-04 10:26:16 +0100 | [diff] [blame] | 108 | } | 
| Manuel Pégourié-Gonnard | 232edd4 | 2014-07-23 16:56:27 +0200 | [diff] [blame] | 109 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 110 | return 0; | 
| Manuel Pégourié-Gonnard | 232edd4 | 2014-07-23 16:56:27 +0200 | [diff] [blame] | 111 | } | 
|  | 112 |  | 
| Manuel Pégourié-Gonnard | e903081 | 2014-07-23 21:29:11 +0200 | [diff] [blame] | 113 |  | 
|  | 114 | /* | 
| Manuel Pégourié-Gonnard | 232edd4 | 2014-07-23 16:56:27 +0200 | [diff] [blame] | 115 | * Generate cookie for DTLS ClientHello verification | 
|  | 116 | */ | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 117 | int mbedtls_ssl_cookie_write(void *p_ctx, | 
|  | 118 | unsigned char **p, unsigned char *end, | 
|  | 119 | const unsigned char *cli_id, size_t cli_id_len) | 
| Manuel Pégourié-Gonnard | 232edd4 | 2014-07-23 16:56:27 +0200 | [diff] [blame] | 120 | { | 
| Neil Armstrong | 2d5e343 | 2022-03-21 11:39:52 +0100 | [diff] [blame] | 121 | psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT; | 
| Neil Armstrong | 79daea2 | 2022-03-21 12:05:51 +0100 | [diff] [blame] | 122 | psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; | 
| Neil Armstrong | 2d5e343 | 2022-03-21 11:39:52 +0100 | [diff] [blame] | 123 | size_t sign_mac_length = 0; | 
| Janos Follath | 865b3eb | 2019-12-16 11:46:15 +0000 | [diff] [blame] | 124 | int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; | 
| Manuel Pégourié-Gonnard | 2cf5a7c | 2015-04-08 12:49:31 +0200 | [diff] [blame] | 125 | mbedtls_ssl_cookie_ctx *ctx = (mbedtls_ssl_cookie_ctx *) p_ctx; | 
| Manuel Pégourié-Gonnard | e903081 | 2014-07-23 21:29:11 +0200 | [diff] [blame] | 126 | unsigned long t; | 
| Manuel Pégourié-Gonnard | e4de061 | 2014-07-23 17:26:48 +0200 | [diff] [blame] | 127 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 128 | if (ctx == NULL || cli_id == NULL) { | 
|  | 129 | return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; | 
|  | 130 | } | 
| Manuel Pégourié-Gonnard | 232edd4 | 2014-07-23 16:56:27 +0200 | [diff] [blame] | 131 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 132 | MBEDTLS_SSL_CHK_BUF_PTR(*p, end, COOKIE_LEN); | 
| Manuel Pégourié-Gonnard | 232edd4 | 2014-07-23 16:56:27 +0200 | [diff] [blame] | 133 |  | 
| Manuel Pégourié-Gonnard | 2cf5a7c | 2015-04-08 12:49:31 +0200 | [diff] [blame] | 134 | #if defined(MBEDTLS_HAVE_TIME) | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 135 | t = (unsigned long) mbedtls_time(NULL); | 
| Manuel Pégourié-Gonnard | e903081 | 2014-07-23 21:29:11 +0200 | [diff] [blame] | 136 | #else | 
|  | 137 | t = ctx->serial++; | 
|  | 138 | #endif | 
| Manuel Pégourié-Gonnard | 232edd4 | 2014-07-23 16:56:27 +0200 | [diff] [blame] | 139 |  | 
| Joe Subbiani | b6511b0 | 2021-07-16 15:02:55 +0100 | [diff] [blame] | 140 | MBEDTLS_PUT_UINT32_BE(t, *p, 0); | 
| Manuel Pégourié-Gonnard | e903081 | 2014-07-23 21:29:11 +0200 | [diff] [blame] | 141 | *p += 4; | 
| Manuel Pégourié-Gonnard | 232edd4 | 2014-07-23 16:56:27 +0200 | [diff] [blame] | 142 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 143 | status = psa_mac_sign_setup(&operation, ctx->psa_hmac_key, | 
|  | 144 | ctx->psa_hmac_alg); | 
|  | 145 | if (status != PSA_SUCCESS) { | 
| Andrzej Kurek | 8a045ce | 2022-12-23 11:00:06 -0500 | [diff] [blame] | 146 | ret = PSA_TO_MBEDTLS_ERR(status); | 
| Neil Armstrong | 2d5e343 | 2022-03-21 11:39:52 +0100 | [diff] [blame] | 147 | goto exit; | 
|  | 148 | } | 
|  | 149 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 150 | status = psa_mac_update(&operation, *p - 4, 4); | 
|  | 151 | if (status != PSA_SUCCESS) { | 
| Andrzej Kurek | 8a045ce | 2022-12-23 11:00:06 -0500 | [diff] [blame] | 152 | ret = PSA_TO_MBEDTLS_ERR(status); | 
| Neil Armstrong | 2d5e343 | 2022-03-21 11:39:52 +0100 | [diff] [blame] | 153 | goto exit; | 
|  | 154 | } | 
|  | 155 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 156 | status = psa_mac_update(&operation, cli_id, cli_id_len); | 
|  | 157 | if (status != PSA_SUCCESS) { | 
| Andrzej Kurek | 8a045ce | 2022-12-23 11:00:06 -0500 | [diff] [blame] | 158 | ret = PSA_TO_MBEDTLS_ERR(status); | 
| Neil Armstrong | 2d5e343 | 2022-03-21 11:39:52 +0100 | [diff] [blame] | 159 | goto exit; | 
|  | 160 | } | 
|  | 161 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 162 | status = psa_mac_sign_finish(&operation, *p, COOKIE_MD_OUTLEN, | 
|  | 163 | &sign_mac_length); | 
|  | 164 | if (status != PSA_SUCCESS) { | 
| Andrzej Kurek | 8a045ce | 2022-12-23 11:00:06 -0500 | [diff] [blame] | 165 | ret = PSA_TO_MBEDTLS_ERR(status); | 
| Neil Armstrong | 2d5e343 | 2022-03-21 11:39:52 +0100 | [diff] [blame] | 166 | goto exit; | 
|  | 167 | } | 
|  | 168 |  | 
|  | 169 | *p += COOKIE_HMAC_LEN; | 
|  | 170 |  | 
|  | 171 | ret = 0; | 
| Manuel Pégourié-Gonnard | 2a84dfd | 2015-05-28 15:48:09 +0200 | [diff] [blame] | 172 |  | 
| Neil Armstrong | 2d5e343 | 2022-03-21 11:39:52 +0100 | [diff] [blame] | 173 | exit: | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 174 | status = psa_mac_abort(&operation); | 
|  | 175 | if (status != PSA_SUCCESS) { | 
| Andrzej Kurek | 8a045ce | 2022-12-23 11:00:06 -0500 | [diff] [blame] | 176 | ret = PSA_TO_MBEDTLS_ERR(status); | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 177 | } | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 178 | return ret; | 
| Manuel Pégourié-Gonnard | 232edd4 | 2014-07-23 16:56:27 +0200 | [diff] [blame] | 179 | } | 
|  | 180 |  | 
|  | 181 | /* | 
|  | 182 | * Check a cookie | 
|  | 183 | */ | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 184 | int mbedtls_ssl_cookie_check(void *p_ctx, | 
|  | 185 | const unsigned char *cookie, size_t cookie_len, | 
|  | 186 | const unsigned char *cli_id, size_t cli_id_len) | 
| Manuel Pégourié-Gonnard | 232edd4 | 2014-07-23 16:56:27 +0200 | [diff] [blame] | 187 | { | 
| Neil Armstrong | 6d5baf5 | 2022-03-07 14:25:18 +0100 | [diff] [blame] | 188 | psa_mac_operation_t operation = PSA_MAC_OPERATION_INIT; | 
| Neil Armstrong | 79daea2 | 2022-03-21 12:05:51 +0100 | [diff] [blame] | 189 | psa_status_t status = PSA_ERROR_CORRUPTION_DETECTED; | 
| Neil Armstrong | 6d5baf5 | 2022-03-07 14:25:18 +0100 | [diff] [blame] | 190 | int ret = 0; | 
| Manuel Pégourié-Gonnard | 2cf5a7c | 2015-04-08 12:49:31 +0200 | [diff] [blame] | 191 | mbedtls_ssl_cookie_ctx *ctx = (mbedtls_ssl_cookie_ctx *) p_ctx; | 
| Manuel Pégourié-Gonnard | e903081 | 2014-07-23 21:29:11 +0200 | [diff] [blame] | 192 | unsigned long cur_time, cookie_time; | 
| Manuel Pégourié-Gonnard | 232edd4 | 2014-07-23 16:56:27 +0200 | [diff] [blame] | 193 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 194 | if (ctx == NULL || cli_id == NULL) { | 
|  | 195 | return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; | 
|  | 196 | } | 
| Manuel Pégourié-Gonnard | e903081 | 2014-07-23 21:29:11 +0200 | [diff] [blame] | 197 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 198 | if (cookie_len != COOKIE_LEN) { | 
|  | 199 | return -1; | 
|  | 200 | } | 
| Manuel Pégourié-Gonnard | 232edd4 | 2014-07-23 16:56:27 +0200 | [diff] [blame] | 201 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 202 | status = psa_mac_verify_setup(&operation, ctx->psa_hmac_key, | 
|  | 203 | ctx->psa_hmac_alg); | 
|  | 204 | if (status != PSA_SUCCESS) { | 
| Andrzej Kurek | 8a045ce | 2022-12-23 11:00:06 -0500 | [diff] [blame] | 205 | ret = PSA_TO_MBEDTLS_ERR(status); | 
| Neil Armstrong | 6d5baf5 | 2022-03-07 14:25:18 +0100 | [diff] [blame] | 206 | goto exit; | 
|  | 207 | } | 
| Neil Armstrong | 7cd0270 | 2022-03-04 15:08:43 +0100 | [diff] [blame] | 208 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 209 | status = psa_mac_update(&operation, cookie, 4); | 
|  | 210 | if (status != PSA_SUCCESS) { | 
| Andrzej Kurek | 8a045ce | 2022-12-23 11:00:06 -0500 | [diff] [blame] | 211 | ret = PSA_TO_MBEDTLS_ERR(status); | 
| Neil Armstrong | 6d5baf5 | 2022-03-07 14:25:18 +0100 | [diff] [blame] | 212 | goto exit; | 
|  | 213 | } | 
|  | 214 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 215 | status = psa_mac_update(&operation, cli_id, | 
|  | 216 | cli_id_len); | 
|  | 217 | if (status != PSA_SUCCESS) { | 
| Andrzej Kurek | 8a045ce | 2022-12-23 11:00:06 -0500 | [diff] [blame] | 218 | ret = PSA_TO_MBEDTLS_ERR(status); | 
| Neil Armstrong | 6d5baf5 | 2022-03-07 14:25:18 +0100 | [diff] [blame] | 219 | goto exit; | 
|  | 220 | } | 
|  | 221 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 222 | status = psa_mac_verify_finish(&operation, cookie + 4, | 
|  | 223 | COOKIE_HMAC_LEN); | 
|  | 224 | if (status != PSA_SUCCESS) { | 
| Andrzej Kurek | 8a045ce | 2022-12-23 11:00:06 -0500 | [diff] [blame] | 225 | ret = PSA_TO_MBEDTLS_ERR(status); | 
| Neil Armstrong | 6d5baf5 | 2022-03-07 14:25:18 +0100 | [diff] [blame] | 226 | goto exit; | 
|  | 227 | } | 
| Neil Armstrong | 79daea2 | 2022-03-21 12:05:51 +0100 | [diff] [blame] | 228 |  | 
|  | 229 | ret = 0; | 
| Manuel Pégourié-Gonnard | e903081 | 2014-07-23 21:29:11 +0200 | [diff] [blame] | 230 |  | 
| Manuel Pégourié-Gonnard | 2cf5a7c | 2015-04-08 12:49:31 +0200 | [diff] [blame] | 231 | #if defined(MBEDTLS_HAVE_TIME) | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 232 | cur_time = (unsigned long) mbedtls_time(NULL); | 
| Manuel Pégourié-Gonnard | e903081 | 2014-07-23 21:29:11 +0200 | [diff] [blame] | 233 | #else | 
|  | 234 | cur_time = ctx->serial; | 
|  | 235 | #endif | 
|  | 236 |  | 
| Thomas Daubney | f9f0ba8 | 2023-05-23 17:34:33 +0100 | [diff] [blame] | 237 | cookie_time = (unsigned long) MBEDTLS_GET_UINT32_BE(cookie, 0); | 
| Manuel Pégourié-Gonnard | e903081 | 2014-07-23 21:29:11 +0200 | [diff] [blame] | 238 |  | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 239 | if (ctx->timeout != 0 && cur_time - cookie_time > ctx->timeout) { | 
| Gilles Peskine | c2f7b75 | 2021-12-13 12:35:08 +0100 | [diff] [blame] | 240 | ret = -1; | 
|  | 241 | goto exit; | 
|  | 242 | } | 
| Manuel Pégourié-Gonnard | 232edd4 | 2014-07-23 16:56:27 +0200 | [diff] [blame] | 243 |  | 
| Gilles Peskine | c2f7b75 | 2021-12-13 12:35:08 +0100 | [diff] [blame] | 244 | exit: | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 245 | status = psa_mac_abort(&operation); | 
|  | 246 | if (status != PSA_SUCCESS) { | 
| Andrzej Kurek | 8a045ce | 2022-12-23 11:00:06 -0500 | [diff] [blame] | 247 | ret = PSA_TO_MBEDTLS_ERR(status); | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 248 | } | 
| Gilles Peskine | 449bd83 | 2023-01-11 14:50:10 +0100 | [diff] [blame] | 249 | return ret; | 
| Manuel Pégourié-Gonnard | 232edd4 | 2014-07-23 16:56:27 +0200 | [diff] [blame] | 250 | } | 
| Manuel Pégourié-Gonnard | 2cf5a7c | 2015-04-08 12:49:31 +0200 | [diff] [blame] | 251 | #endif /* MBEDTLS_SSL_COOKIE_C */ |