diff options
| author | jsing <> | 2020-07-14 18:55:59 +0000 |
|---|---|---|
| committer | jsing <> | 2020-07-14 18:55:59 +0000 |
| commit | 6de583a99c05f208ade69050ae30965949dbbd12 (patch) | |
| tree | 65e973057ef4ce9586b745049601ef82ecca264e /src | |
| parent | c242f42af360cb5d8fca8cd7d2f33c64df19adf5 (diff) | |
| download | openbsd-6de583a99c05f208ade69050ae30965949dbbd12.tar.gz openbsd-6de583a99c05f208ade69050ae30965949dbbd12.tar.bz2 openbsd-6de583a99c05f208ade69050ae30965949dbbd12.zip | |
Dedup the use legacy stack code.
ok inoguchi@ tb@
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/libssl/tls13_legacy.c | 81 |
1 files changed, 25 insertions, 56 deletions
diff --git a/src/lib/libssl/tls13_legacy.c b/src/lib/libssl/tls13_legacy.c index 39e34ab93c..23f9c5f664 100644 --- a/src/lib/libssl/tls13_legacy.c +++ b/src/lib/libssl/tls13_legacy.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: tls13_legacy.c,v 1.9 2020/06/24 18:04:33 jsing Exp $ */ | 1 | /* $OpenBSD: tls13_legacy.c,v 1.10 2020/07/14 18:55:59 jsing Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org> |
| 4 | * | 4 | * |
| @@ -282,22 +282,18 @@ tls13_legacy_write_bytes(SSL *ssl, int type, const void *vbuf, int len) | |||
| 282 | } | 282 | } |
| 283 | } | 283 | } |
| 284 | 284 | ||
| 285 | int | 285 | static int |
| 286 | tls13_use_legacy_client(struct tls13_ctx *ctx) | 286 | tls13_use_legacy_stack(struct tls13_ctx *ctx) |
| 287 | { | 287 | { |
| 288 | SSL *s = ctx->ssl; | 288 | SSL *s = ctx->ssl; |
| 289 | CBS cbs; | 289 | CBS cbs; |
| 290 | 290 | ||
| 291 | s->method = tls_legacy_client_method(); | ||
| 292 | s->internal->handshake_func = s->method->internal->ssl_connect; | ||
| 293 | s->client_version = s->version = s->method->internal->max_version; | ||
| 294 | |||
| 295 | if (!ssl3_setup_init_buffer(s)) | 291 | if (!ssl3_setup_init_buffer(s)) |
| 296 | goto err; | 292 | return 0; |
| 297 | if (!ssl3_setup_buffers(s)) | 293 | if (!ssl3_setup_buffers(s)) |
| 298 | goto err; | 294 | return 0; |
| 299 | if (!ssl_init_wbio_buffer(s, 0)) | 295 | if (!ssl_init_wbio_buffer(s, 0)) |
| 300 | goto err; | 296 | return 0; |
| 301 | 297 | ||
| 302 | if (s->bbio != s->wbio) | 298 | if (s->bbio != s->wbio) |
| 303 | s->wbio = BIO_push(s->bbio, s->wbio); | 299 | s->wbio = BIO_push(s->bbio, s->wbio); |
| @@ -308,7 +304,7 @@ tls13_use_legacy_client(struct tls13_ctx *ctx) | |||
| 308 | if (!CBS_write_bytes(&cbs, | 304 | if (!CBS_write_bytes(&cbs, |
| 309 | S3I(s)->rbuf.buf + SSL3_RT_HEADER_LENGTH, | 305 | S3I(s)->rbuf.buf + SSL3_RT_HEADER_LENGTH, |
| 310 | S3I(s)->rbuf.len - SSL3_RT_HEADER_LENGTH, NULL)) | 306 | S3I(s)->rbuf.len - SSL3_RT_HEADER_LENGTH, NULL)) |
| 311 | goto err; | 307 | return 0; |
| 312 | 308 | ||
| 313 | S3I(s)->rbuf.offset = SSL3_RT_HEADER_LENGTH; | 309 | S3I(s)->rbuf.offset = SSL3_RT_HEADER_LENGTH; |
| 314 | S3I(s)->rbuf.left = CBS_len(&cbs); | 310 | S3I(s)->rbuf.left = CBS_len(&cbs); |
| @@ -324,75 +320,48 @@ tls13_use_legacy_client(struct tls13_ctx *ctx) | |||
| 324 | tls13_handshake_msg_data(ctx->hs_msg, &cbs); | 320 | tls13_handshake_msg_data(ctx->hs_msg, &cbs); |
| 325 | if (!CBS_write_bytes(&cbs, s->internal->init_buf->data, | 321 | if (!CBS_write_bytes(&cbs, s->internal->init_buf->data, |
| 326 | s->internal->init_buf->length, NULL)) | 322 | s->internal->init_buf->length, NULL)) |
| 327 | goto err; | 323 | return 0; |
| 328 | 324 | ||
| 329 | S3I(s)->tmp.reuse_message = 1; | 325 | S3I(s)->tmp.reuse_message = 1; |
| 330 | S3I(s)->tmp.message_type = tls13_handshake_msg_type(ctx->hs_msg); | 326 | S3I(s)->tmp.message_type = tls13_handshake_msg_type(ctx->hs_msg); |
| 331 | S3I(s)->tmp.message_size = CBS_len(&cbs); | 327 | S3I(s)->tmp.message_size = CBS_len(&cbs); |
| 332 | 328 | ||
| 329 | return 1; | ||
| 330 | } | ||
| 331 | |||
| 332 | int | ||
| 333 | tls13_use_legacy_client(struct tls13_ctx *ctx) | ||
| 334 | { | ||
| 335 | SSL *s = ctx->ssl; | ||
| 336 | |||
| 337 | s->method = tls_legacy_client_method(); | ||
| 338 | s->internal->handshake_func = s->method->internal->ssl_connect; | ||
| 339 | s->client_version = s->version = s->method->internal->max_version; | ||
| 340 | |||
| 341 | if (!tls13_use_legacy_stack(ctx)) | ||
| 342 | return 0; | ||
| 343 | |||
| 333 | S3I(s)->hs.state = SSL3_ST_CR_SRVR_HELLO_A; | 344 | S3I(s)->hs.state = SSL3_ST_CR_SRVR_HELLO_A; |
| 334 | 345 | ||
| 335 | return 1; | 346 | return 1; |
| 336 | |||
| 337 | err: | ||
| 338 | return 0; | ||
| 339 | } | 347 | } |
| 340 | 348 | ||
| 341 | int | 349 | int |
| 342 | tls13_use_legacy_server(struct tls13_ctx *ctx) | 350 | tls13_use_legacy_server(struct tls13_ctx *ctx) |
| 343 | { | 351 | { |
| 344 | SSL *s = ctx->ssl; | 352 | SSL *s = ctx->ssl; |
| 345 | CBS cbs; | ||
| 346 | 353 | ||
| 347 | s->method = tls_legacy_server_method(); | 354 | s->method = tls_legacy_server_method(); |
| 348 | s->internal->handshake_func = s->method->internal->ssl_accept; | 355 | s->internal->handshake_func = s->method->internal->ssl_accept; |
| 349 | s->client_version = s->version = s->method->internal->max_version; | 356 | s->client_version = s->version = s->method->internal->max_version; |
| 350 | s->server = 1; | 357 | s->server = 1; |
| 351 | 358 | ||
| 352 | if (!ssl3_setup_init_buffer(s)) | 359 | if (!tls13_use_legacy_stack(ctx)) |
| 353 | goto err; | 360 | return 0; |
| 354 | if (!ssl3_setup_buffers(s)) | ||
| 355 | goto err; | ||
| 356 | if (!ssl_init_wbio_buffer(s, 0)) | ||
| 357 | goto err; | ||
| 358 | |||
| 359 | if (s->bbio != s->wbio) | ||
| 360 | s->wbio = BIO_push(s->bbio, s->wbio); | ||
| 361 | |||
| 362 | /* Stash any unprocessed data from the last record. */ | ||
| 363 | tls13_record_layer_rbuf(ctx->rl, &cbs); | ||
| 364 | if (CBS_len(&cbs) > 0) { | ||
| 365 | if (!CBS_write_bytes(&cbs, | ||
| 366 | S3I(s)->rbuf.buf + SSL3_RT_HEADER_LENGTH, | ||
| 367 | S3I(s)->rbuf.len - SSL3_RT_HEADER_LENGTH, NULL)) | ||
| 368 | goto err; | ||
| 369 | |||
| 370 | S3I(s)->rbuf.offset = SSL3_RT_HEADER_LENGTH; | ||
| 371 | S3I(s)->rbuf.left = CBS_len(&cbs); | ||
| 372 | S3I(s)->rrec.type = SSL3_RT_HANDSHAKE; | ||
| 373 | S3I(s)->rrec.length = CBS_len(&cbs); | ||
| 374 | s->internal->rstate = SSL_ST_READ_BODY; | ||
| 375 | s->internal->packet = S3I(s)->rbuf.buf; | ||
| 376 | s->internal->packet_length = SSL3_RT_HEADER_LENGTH; | ||
| 377 | s->internal->mac_packet = 1; | ||
| 378 | } | ||
| 379 | |||
| 380 | /* Stash the current handshake message. */ | ||
| 381 | tls13_handshake_msg_data(ctx->hs_msg, &cbs); | ||
| 382 | if (!CBS_write_bytes(&cbs, s->internal->init_buf->data, | ||
| 383 | s->internal->init_buf->length, NULL)) | ||
| 384 | goto err; | ||
| 385 | |||
| 386 | S3I(s)->tmp.reuse_message = 1; | ||
| 387 | S3I(s)->tmp.message_type = tls13_handshake_msg_type(ctx->hs_msg); | ||
| 388 | S3I(s)->tmp.message_size = CBS_len(&cbs); | ||
| 389 | 361 | ||
| 390 | S3I(s)->hs.state = SSL3_ST_SR_CLNT_HELLO_A; | 362 | S3I(s)->hs.state = SSL3_ST_SR_CLNT_HELLO_A; |
| 391 | 363 | ||
| 392 | return 1; | 364 | return 1; |
| 393 | |||
| 394 | err: | ||
| 395 | return 0; | ||
| 396 | } | 365 | } |
| 397 | 366 | ||
| 398 | int | 367 | int |
