summaryrefslogtreecommitdiff
path: root/src/lib/libssl/d1_pkt.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libssl/d1_pkt.c')
-rw-r--r--src/lib/libssl/d1_pkt.c134
1 files changed, 22 insertions, 112 deletions
diff --git a/src/lib/libssl/d1_pkt.c b/src/lib/libssl/d1_pkt.c
index 859043a3ce..30ce78414d 100644
--- a/src/lib/libssl/d1_pkt.c
+++ b/src/lib/libssl/d1_pkt.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: d1_pkt.c,v 1.84 2020/10/03 17:11:28 jsing Exp $ */ 1/* $OpenBSD: d1_pkt.c,v 1.85 2020/10/03 17:35:16 jsing Exp $ */
2/* 2/*
3 * DTLS implementation written by Nagendra Modadugu 3 * DTLS implementation written by Nagendra Modadugu
4 * (nagendra@cs.stanford.edu) for the OpenSSL project 2005. 4 * (nagendra@cs.stanford.edu) for the OpenSSL project 2005.
@@ -310,130 +310,40 @@ dtls1_process_buffered_records(SSL *s)
310static int 310static int
311dtls1_process_record(SSL *s) 311dtls1_process_record(SSL *s)
312{ 312{
313 int i, al; 313 SSL3_RECORD_INTERNAL *rr = &(S3I(s)->rrec);
314 int enc_err; 314 uint8_t alert_desc;
315 SSL_SESSION *sess; 315 uint8_t *out;
316 SSL3_RECORD_INTERNAL *rr; 316 size_t out_len;
317 unsigned int mac_size, orig_len;
318 unsigned char md[EVP_MAX_MD_SIZE];
319
320 rr = &(S3I(s)->rrec);
321 sess = s->session;
322
323 /* At this point, s->internal->packet_length == SSL3_RT_HEADER_LNGTH + rr->length,
324 * and we have that many bytes in s->internal->packet
325 */
326 rr->input = &(s->internal->packet[DTLS1_RT_HEADER_LENGTH]);
327
328 /* ok, we can now read from 's->internal->packet' data into 'rr'
329 * rr->input points at rr->length bytes, which
330 * need to be copied into rr->data by either
331 * the decryption or by the decompression
332 * When the data is 'copied' into the rr->data buffer,
333 * rr->input will be pointed at the new buffer */
334
335 /* We now have - encrypted [ MAC [ compressed [ plain ] ] ]
336 * rr->length bytes of encrypted compressed stuff. */
337
338 /* check is not needed I believe */
339 if (rr->length > SSL3_RT_MAX_ENCRYPTED_LENGTH) {
340 al = SSL_AD_RECORD_OVERFLOW;
341 SSLerror(s, SSL_R_ENCRYPTED_LENGTH_TOO_LONG);
342 goto f_err;
343 }
344
345 /* decrypt in place in 'rr->input' */
346 rr->data = rr->input;
347
348 /* enc_err is:
349 * 0: (in non-constant time) if the record is publically invalid.
350 * 1: if the padding is valid
351 * -1: if the padding is invalid */
352 if ((enc_err = tls1_enc(s, 0)) == 0) {
353 /* For DTLS we simply ignore bad packets. */
354 rr->length = 0;
355 s->internal->packet_length = 0;
356 goto err;
357 }
358 317
359 /* r->length is now the compressed data plus mac */ 318 tls12_record_layer_set_version(s->internal->rl, s->version);
360 if ((sess != NULL) && (s->enc_read_ctx != NULL) && 319 tls12_record_layer_set_read_epoch(s->internal->rl, rr->epoch);
361 (EVP_MD_CTX_md(s->read_hash) != NULL)) {
362 /* s->read_hash != NULL => mac_size != -1 */
363 unsigned char *mac = NULL;
364 unsigned char mac_tmp[EVP_MAX_MD_SIZE];
365 mac_size = EVP_MD_CTX_size(s->read_hash);
366 OPENSSL_assert(mac_size <= EVP_MAX_MD_SIZE);
367
368 orig_len = rr->length + rr->padding_length;
369
370 /* orig_len is the length of the record before any padding was
371 * removed. This is public information, as is the MAC in use,
372 * therefore we can safely process the record in a different
373 * amount of time if it's too short to possibly contain a MAC.
374 */
375 if (orig_len < mac_size ||
376 /* CBC records must have a padding length byte too. */
377 (EVP_CIPHER_CTX_mode(s->enc_read_ctx) == EVP_CIPH_CBC_MODE &&
378 orig_len < mac_size + 1)) {
379 al = SSL_AD_DECODE_ERROR;
380 SSLerror(s, SSL_R_LENGTH_TOO_SHORT);
381 goto f_err;
382 }
383 320
384 if (EVP_CIPHER_CTX_mode(s->enc_read_ctx) == EVP_CIPH_CBC_MODE) { 321 if (!tls12_record_layer_open_record(s->internal->rl, s->internal->packet,
385 /* We update the length so that the TLS header bytes 322 s->internal->packet_length, &out, &out_len)) {
386 * can be constructed correctly but we need to extract 323 tls12_record_layer_alert(s->internal->rl, &alert_desc);
387 * the MAC in constant time from within the record,
388 * without leaking the contents of the padding bytes.
389 * */
390 mac = mac_tmp;
391 ssl3_cbc_copy_mac(mac_tmp, rr, mac_size, orig_len);
392 rr->length -= mac_size;
393 } else {
394 /* In this case there's no padding, so |orig_len|
395 * equals |rec->length| and we checked that there's
396 * enough bytes for |mac_size| above. */
397 rr->length -= mac_size;
398 mac = &rr->data[rr->length];
399 }
400 324
401 i = tls1_mac(s, md, 0 /* not send */); 325 if (alert_desc == 0)
402 if (i < 0 || mac == NULL || timingsafe_memcmp(md, mac, (size_t)mac_size) != 0) 326 goto err;
403 enc_err = -1;
404 if (rr->length > SSL3_RT_MAX_COMPRESSED_LENGTH + mac_size)
405 enc_err = -1;
406 }
407 327
408 if (enc_err < 0) { 328 if (alert_desc == SSL_AD_RECORD_OVERFLOW)
409 /* decryption failed, silently discard message */ 329 SSLerror(s, SSL_R_ENCRYPTED_LENGTH_TOO_LONG);
410 rr->length = 0; 330 else if (alert_desc == SSL_AD_BAD_RECORD_MAC)
411 s->internal->packet_length = 0; 331 SSLerror(s, SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC);
412 goto err;
413 }
414 332
415 if (rr->length > SSL3_RT_MAX_PLAIN_LENGTH) {
416 al = SSL_AD_RECORD_OVERFLOW;
417 SSLerror(s, SSL_R_DATA_LENGTH_TOO_LONG);
418 goto f_err; 333 goto f_err;
419 } 334 }
420 335
336 rr->data = out;
337 rr->length = out_len;
421 rr->off = 0; 338 rr->off = 0;
422 /* So at this point the following is true
423 * ssl->s3->internal->rrec.type is the type of record
424 * ssl->s3->internal->rrec.length == number of bytes in record
425 * ssl->s3->internal->rrec.off == offset to first valid byte
426 * ssl->s3->internal->rrec.data == where to take bytes from, increment
427 * after use :-).
428 */
429 339
430 /* we have pulled in a full packet so zero things */
431 s->internal->packet_length = 0; 340 s->internal->packet_length = 0;
341
432 return (1); 342 return (1);
433 343
434f_err: 344 f_err:
435 ssl3_send_alert(s, SSL3_AL_FATAL, al); 345 ssl3_send_alert(s, SSL3_AL_FATAL, alert_desc);
436err: 346 err:
437 return (0); 347 return (0);
438} 348}
439 349