diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libssl/ssl_both.c | 148 |
1 files changed, 1 insertions, 147 deletions
diff --git a/src/lib/libssl/ssl_both.c b/src/lib/libssl/ssl_both.c index cfd32387d6..801b5bea29 100644 --- a/src/lib/libssl/ssl_both.c +++ b/src/lib/libssl/ssl_both.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ssl_both.c,v 1.42 2022/02/05 14:54:10 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_both.c,v 1.43 2022/10/01 16:23:15 jsing Exp $ */ |
| 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
| 3 | * All rights reserved. | 3 | * All rights reserved. |
| 4 | * | 4 | * |
| @@ -161,152 +161,6 @@ ssl3_do_write(SSL *s, int type) | |||
| 161 | return (0); | 161 | return (0); |
| 162 | } | 162 | } |
| 163 | 163 | ||
| 164 | int | ||
| 165 | ssl3_send_finished(SSL *s, int state_a, int state_b) | ||
| 166 | { | ||
| 167 | CBB cbb, finished; | ||
| 168 | |||
| 169 | memset(&cbb, 0, sizeof(cbb)); | ||
| 170 | |||
| 171 | if (s->s3->hs.state == state_a) { | ||
| 172 | if (!tls12_derive_finished(s)) | ||
| 173 | goto err; | ||
| 174 | |||
| 175 | /* Copy finished so we can use it for renegotiation checks. */ | ||
| 176 | if (!s->server) { | ||
| 177 | memcpy(s->s3->previous_client_finished, | ||
| 178 | s->s3->hs.finished, s->s3->hs.finished_len); | ||
| 179 | s->s3->previous_client_finished_len = | ||
| 180 | s->s3->hs.finished_len; | ||
| 181 | } else { | ||
| 182 | memcpy(s->s3->previous_server_finished, | ||
| 183 | s->s3->hs.finished, s->s3->hs.finished_len); | ||
| 184 | s->s3->previous_server_finished_len = | ||
| 185 | s->s3->hs.finished_len; | ||
| 186 | } | ||
| 187 | |||
| 188 | if (!ssl3_handshake_msg_start(s, &cbb, &finished, | ||
| 189 | SSL3_MT_FINISHED)) | ||
| 190 | goto err; | ||
| 191 | if (!CBB_add_bytes(&finished, s->s3->hs.finished, | ||
| 192 | s->s3->hs.finished_len)) | ||
| 193 | goto err; | ||
| 194 | if (!ssl3_handshake_msg_finish(s, &cbb)) | ||
| 195 | goto err; | ||
| 196 | |||
| 197 | s->s3->hs.state = state_b; | ||
| 198 | } | ||
| 199 | |||
| 200 | return (ssl3_handshake_write(s)); | ||
| 201 | |||
| 202 | err: | ||
| 203 | CBB_cleanup(&cbb); | ||
| 204 | |||
| 205 | return (-1); | ||
| 206 | } | ||
| 207 | |||
| 208 | int | ||
| 209 | ssl3_get_finished(SSL *s, int a, int b) | ||
| 210 | { | ||
| 211 | int al, md_len, ret; | ||
| 212 | CBS cbs; | ||
| 213 | |||
| 214 | /* should actually be 36+4 :-) */ | ||
| 215 | if ((ret = ssl3_get_message(s, a, b, SSL3_MT_FINISHED, 64)) <= 0) | ||
| 216 | return ret; | ||
| 217 | |||
| 218 | /* If this occurs, we have missed a message */ | ||
| 219 | if (!s->s3->change_cipher_spec) { | ||
| 220 | al = SSL_AD_UNEXPECTED_MESSAGE; | ||
| 221 | SSLerror(s, SSL_R_GOT_A_FIN_BEFORE_A_CCS); | ||
| 222 | goto fatal_err; | ||
| 223 | } | ||
| 224 | s->s3->change_cipher_spec = 0; | ||
| 225 | |||
| 226 | md_len = TLS1_FINISH_MAC_LENGTH; | ||
| 227 | |||
| 228 | if (s->internal->init_num < 0) { | ||
| 229 | al = SSL_AD_DECODE_ERROR; | ||
| 230 | SSLerror(s, SSL_R_BAD_DIGEST_LENGTH); | ||
| 231 | goto fatal_err; | ||
| 232 | } | ||
| 233 | |||
| 234 | CBS_init(&cbs, s->internal->init_msg, s->internal->init_num); | ||
| 235 | |||
| 236 | if (s->s3->hs.peer_finished_len != md_len || | ||
| 237 | CBS_len(&cbs) != md_len) { | ||
| 238 | al = SSL_AD_DECODE_ERROR; | ||
| 239 | SSLerror(s, SSL_R_BAD_DIGEST_LENGTH); | ||
| 240 | goto fatal_err; | ||
| 241 | } | ||
| 242 | |||
| 243 | if (!CBS_mem_equal(&cbs, s->s3->hs.peer_finished, CBS_len(&cbs))) { | ||
| 244 | al = SSL_AD_DECRYPT_ERROR; | ||
| 245 | SSLerror(s, SSL_R_DIGEST_CHECK_FAILED); | ||
| 246 | goto fatal_err; | ||
| 247 | } | ||
| 248 | |||
| 249 | /* Copy finished so we can use it for renegotiation checks. */ | ||
| 250 | OPENSSL_assert(md_len <= EVP_MAX_MD_SIZE); | ||
| 251 | if (s->server) { | ||
| 252 | memcpy(s->s3->previous_client_finished, | ||
| 253 | s->s3->hs.peer_finished, md_len); | ||
| 254 | s->s3->previous_client_finished_len = md_len; | ||
| 255 | } else { | ||
| 256 | memcpy(s->s3->previous_server_finished, | ||
| 257 | s->s3->hs.peer_finished, md_len); | ||
| 258 | s->s3->previous_server_finished_len = md_len; | ||
| 259 | } | ||
| 260 | |||
| 261 | return (1); | ||
| 262 | fatal_err: | ||
| 263 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | ||
| 264 | return (0); | ||
| 265 | } | ||
| 266 | |||
| 267 | int | ||
| 268 | ssl3_send_change_cipher_spec(SSL *s, int a, int b) | ||
| 269 | { | ||
| 270 | size_t outlen; | ||
| 271 | CBB cbb; | ||
| 272 | |||
| 273 | memset(&cbb, 0, sizeof(cbb)); | ||
| 274 | |||
| 275 | if (s->s3->hs.state == a) { | ||
| 276 | if (!CBB_init_fixed(&cbb, s->internal->init_buf->data, | ||
| 277 | s->internal->init_buf->length)) | ||
| 278 | goto err; | ||
| 279 | if (!CBB_add_u8(&cbb, SSL3_MT_CCS)) | ||
| 280 | goto err; | ||
| 281 | if (!CBB_finish(&cbb, NULL, &outlen)) | ||
| 282 | goto err; | ||
| 283 | |||
| 284 | if (outlen > INT_MAX) | ||
| 285 | goto err; | ||
| 286 | |||
| 287 | s->internal->init_num = (int)outlen; | ||
| 288 | s->internal->init_off = 0; | ||
| 289 | |||
| 290 | if (SSL_is_dtls(s)) { | ||
| 291 | s->d1->handshake_write_seq = | ||
| 292 | s->d1->next_handshake_write_seq; | ||
| 293 | dtls1_set_message_header_int(s, SSL3_MT_CCS, 0, | ||
| 294 | s->d1->handshake_write_seq, 0, 0); | ||
| 295 | dtls1_buffer_message(s, 1); | ||
| 296 | } | ||
| 297 | |||
| 298 | s->s3->hs.state = b; | ||
| 299 | } | ||
| 300 | |||
| 301 | /* SSL3_ST_CW_CHANGE_B */ | ||
| 302 | return ssl3_record_write(s, SSL3_RT_CHANGE_CIPHER_SPEC); | ||
| 303 | |||
| 304 | err: | ||
| 305 | CBB_cleanup(&cbb); | ||
| 306 | |||
| 307 | return -1; | ||
| 308 | } | ||
| 309 | |||
| 310 | static int | 164 | static int |
| 311 | ssl3_add_cert(CBB *cbb, X509 *x) | 165 | ssl3_add_cert(CBB *cbb, X509 *x) |
| 312 | { | 166 | { |
