comparison src/event/ngx_event_quic.c @ 7655:80a07843c711 quic

Using SSL cipher suite id to obtain cipher/digest, part 1. While here, log the negotiated cipher just once, - after handshake.
author Sergey Kandaurov <pluknet@nginx.com>
date Thu, 05 Mar 2020 13:00:59 +0300
parents bf555b94e387
children 2bc1f97c1c2d
comparison
equal deleted inserted replaced
7654:bf555b94e387 7655:80a07843c711
7 #include <ngx_config.h> 7 #include <ngx_config.h>
8 #include <ngx_core.h> 8 #include <ngx_core.h>
9 9
10 10
11 #define quic_version 0xff000018 11 #define quic_version 0xff000018
12
13 #define NGX_AES_128_GCM_SHA256 0x1301
14 #define NGX_AES_256_GCM_SHA384 0x1302
12 15
13 16
14 #if (NGX_HAVE_NONALIGNED) 17 #if (NGX_HAVE_NONALIGNED)
15 18
16 #define ngx_quic_parse_uint16(p) ntohs(*(uint16_t *) (p)) 19 #define ngx_quic_parse_uint16(p) ntohs(*(uint16_t *) (p))
483 static int 486 static int
484 ngx_quic_set_encryption_secrets(ngx_ssl_conn_t *ssl_conn, 487 ngx_quic_set_encryption_secrets(ngx_ssl_conn_t *ssl_conn,
485 enum ssl_encryption_level_t level, const uint8_t *read_secret, 488 enum ssl_encryption_level_t level, const uint8_t *read_secret,
486 const uint8_t *write_secret, size_t secret_len) 489 const uint8_t *write_secret, size_t secret_len)
487 { 490 {
488 u_char *name;
489 ngx_uint_t i; 491 ngx_uint_t i;
490 const EVP_MD *digest; 492 const EVP_MD *digest;
491 const EVP_CIPHER *cipher; 493 const EVP_CIPHER *cipher;
492 ngx_connection_t *c; 494 ngx_connection_t *c;
493 ngx_quic_secret_t *client, *server; 495 ngx_quic_secret_t *client, *server;
494 496
495 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn); 497 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);
496 498
497 //ngx_ssl_handshake_log(c); // TODO: enable again
498
499 ngx_quic_hexdump(c->log, "level:%d read", read_secret, secret_len, level); 499 ngx_quic_hexdump(c->log, "level:%d read", read_secret, secret_len, level);
500 ngx_quic_hexdump(c->log, "level:%d read", write_secret, secret_len, level); 500 ngx_quic_hexdump(c->log, "level:%d read", write_secret, secret_len, level);
501 501
502 name = (u_char *) SSL_get_cipher(ssl_conn); 502 switch (SSL_CIPHER_get_id(SSL_get_current_cipher(ssl_conn)) & 0xffff) {
503 503
504 if (ngx_strcasecmp(name, (u_char *) "TLS_AES_128_GCM_SHA256") == 0 504 case NGX_AES_128_GCM_SHA256:
505 || ngx_strcasecmp(name, (u_char *) "(NONE)") == 0)
506 {
507 cipher = EVP_aes_128_gcm(); 505 cipher = EVP_aes_128_gcm();
508 digest = EVP_sha256(); 506 digest = EVP_sha256();
509 507 break;
510 } else if (ngx_strcasecmp(name, (u_char *) "TLS_AES_256_GCM_SHA384") == 0) { 508
509 case NGX_AES_256_GCM_SHA384:
511 cipher = EVP_aes_256_gcm(); 510 cipher = EVP_aes_256_gcm();
512 digest = EVP_sha384(); 511 digest = EVP_sha384();
513 512 break;
514 } else { 513
514 default:
515 ngx_ssl_error(NGX_LOG_INFO, c->log, 0, "unexpected cipher"); 515 ngx_ssl_error(NGX_LOG_INFO, c->log, 0, "unexpected cipher");
516 return 0; 516 return 0;
517 } 517 }
518 518
519 switch (level) { 519 switch (level) {
572 572
573 static ngx_int_t 573 static ngx_int_t
574 ngx_quic_create_long_packet(ngx_connection_t *c, ngx_ssl_conn_t *ssl_conn, 574 ngx_quic_create_long_packet(ngx_connection_t *c, ngx_ssl_conn_t *ssl_conn,
575 ngx_quic_header_t *pkt, ngx_str_t *payload, ngx_str_t *res) 575 ngx_quic_header_t *pkt, ngx_str_t *payload, ngx_str_t *res)
576 { 576 {
577 u_char *p, *pnp, *name, *nonce, *sample, *packet; 577 u_char *p, *pnp, *nonce, *sample, *packet;
578 ngx_str_t ad, out; 578 ngx_str_t ad, out;
579 const EVP_CIPHER *cipher; 579 const EVP_CIPHER *cipher;
580 ngx_quic_connection_t *qc; 580 ngx_quic_connection_t *qc;
581 581
582 u_char mask[16]; 582 u_char mask[16];
613 613
614 ad.len = p - ad.data; 614 ad.len = p - ad.data;
615 615
616 ngx_quic_hexdump0(c->log, "ad", ad.data, ad.len); 616 ngx_quic_hexdump0(c->log, "ad", ad.data, ad.len);
617 617
618 name = (u_char *) SSL_get_cipher(ssl_conn); 618 switch (SSL_CIPHER_get_id(SSL_get_current_cipher(ssl_conn)) & 0xffff) {
619 619
620 if (ngx_strcasecmp(name, (u_char *) "TLS_AES_128_GCM_SHA256") == 0 620 case NGX_AES_128_GCM_SHA256:
621 || ngx_strcasecmp(name, (u_char *) "(NONE)") == 0)
622 {
623 cipher = EVP_aes_128_gcm(); 621 cipher = EVP_aes_128_gcm();
624 622 break;
625 } else if (ngx_strcasecmp(name, (u_char *) "TLS_AES_256_GCM_SHA384") == 0) { 623
624 case NGX_AES_256_GCM_SHA384:
626 cipher = EVP_aes_256_gcm(); 625 cipher = EVP_aes_256_gcm();
627 626 break;
628 } else { 627
628 default:
629 return NGX_ERROR; 629 return NGX_ERROR;
630 } 630 }
631 631
632 nonce = ngx_pstrdup(c->pool, &pkt->secret->iv); 632 nonce = ngx_pstrdup(c->pool, &pkt->secret->iv);
633 if (pkt->level == ssl_encryption_handshake) { 633 if (pkt->level == ssl_encryption_handshake) {
671 671
672 static ngx_int_t 672 static ngx_int_t
673 ngx_quic_create_short_packet(ngx_connection_t *c, ngx_ssl_conn_t *ssl_conn, 673 ngx_quic_create_short_packet(ngx_connection_t *c, ngx_ssl_conn_t *ssl_conn,
674 ngx_quic_header_t *pkt, ngx_str_t *payload, ngx_str_t *res) 674 ngx_quic_header_t *pkt, ngx_str_t *payload, ngx_str_t *res)
675 { 675 {
676 u_char *p, *pnp, *name, *nonce, *sample, *packet; 676 u_char *p, *pnp, *nonce, *sample, *packet;
677 ngx_str_t ad, out; 677 ngx_str_t ad, out;
678 const EVP_CIPHER *cipher; 678 const EVP_CIPHER *cipher;
679 ngx_quic_connection_t *qc; 679 ngx_quic_connection_t *qc;
680 680
681 u_char mask[16]; 681 u_char mask[16];
701 701
702 ad.len = p - ad.data; 702 ad.len = p - ad.data;
703 703
704 ngx_quic_hexdump0(c->log, "ad", ad.data, ad.len); 704 ngx_quic_hexdump0(c->log, "ad", ad.data, ad.len);
705 705
706 name = (u_char *) SSL_get_cipher(ssl_conn); 706 switch (SSL_CIPHER_get_id(SSL_get_current_cipher(ssl_conn)) & 0xffff) {
707 707
708 if (ngx_strcasecmp(name, (u_char *) "TLS_AES_128_GCM_SHA256") == 0 708 case NGX_AES_128_GCM_SHA256:
709 || ngx_strcasecmp(name, (u_char *) "(NONE)") == 0)
710 {
711 cipher = EVP_aes_128_gcm(); 709 cipher = EVP_aes_128_gcm();
712 710 break;
713 } else if (ngx_strcasecmp(name, (u_char *) "TLS_AES_256_GCM_SHA384") == 0) { 711
712 case NGX_AES_256_GCM_SHA384:
714 cipher = EVP_aes_256_gcm(); 713 cipher = EVP_aes_256_gcm();
715 714 break;
716 } else { 715
716 default:
717 return NGX_ERROR; 717 return NGX_ERROR;
718 } 718 }
719 719
720 nonce = ngx_pstrdup(c->pool, &pkt->secret->iv); 720 nonce = ngx_pstrdup(c->pool, &pkt->secret->iv);
721 if (pkt->level == ssl_encryption_handshake) { 721 if (pkt->level == ssl_encryption_handshake) {
790 ngx_connection_t *c; 790 ngx_connection_t *c;
791 ngx_quic_connection_t *qc; 791 ngx_quic_connection_t *qc;
792 792
793 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn); 793 c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);
794 qc = c->quic; 794 qc = c->quic;
795
796 //ngx_ssl_handshake_log(c); // TODO: enable again
797 795
798 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, 796 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
799 "ngx_quic_add_handshake_data"); 797 "ngx_quic_add_handshake_data");
800 798
801 frame = ngx_pcalloc(c->pool, sizeof(ngx_quic_frame_t)); 799 frame = ngx_pcalloc(c->pool, sizeof(ngx_quic_frame_t));
1302 nonce[11] ^= pn; 1300 nonce[11] ^= pn;
1303 1301
1304 ngx_quic_hexdump0(c->log, "nonce", nonce, 12); 1302 ngx_quic_hexdump0(c->log, "nonce", nonce, 12);
1305 ngx_quic_hexdump0(c->log, "ad", ad.data, ad.len); 1303 ngx_quic_hexdump0(c->log, "ad", ad.data, ad.len);
1306 1304
1307 u_char *name = (u_char *) SSL_get_cipher(ssl_conn); 1305 switch (SSL_CIPHER_get_id(SSL_get_current_cipher(ssl_conn)) & 0xffff) {
1308 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, 1306
1309 "quic ssl cipher: %s", name); 1307 case NGX_AES_128_GCM_SHA256:
1310
1311 if (ngx_strcasecmp(name, (u_char *) "TLS_AES_128_GCM_SHA256") == 0
1312 || ngx_strcasecmp(name, (u_char *) "(NONE)") == 0)
1313 {
1314 cipher = EVP_aes_128_gcm(); 1308 cipher = EVP_aes_128_gcm();
1315 1309 break;
1316 } else if (ngx_strcasecmp(name, (u_char *) "TLS_AES_256_GCM_SHA384") == 0) { 1310
1311 case NGX_AES_256_GCM_SHA384:
1317 cipher = EVP_aes_256_gcm(); 1312 cipher = EVP_aes_256_gcm();
1318 1313 break;
1319 } else { 1314
1315 default:
1320 ngx_ssl_error(NGX_LOG_INFO, c->log, 0, "unexpected cipher"); 1316 ngx_ssl_error(NGX_LOG_INFO, c->log, 0, "unexpected cipher");
1321 return NGX_ERROR; 1317 return NGX_ERROR;
1322 } 1318 }
1323 1319
1324 if (ngx_quic_tls_open(c, cipher, &qc->client_hs, &out, nonce, &in, &ad) 1320 if (ngx_quic_tls_open(c, cipher, &qc->client_hs, &out, nonce, &in, &ad)
1378 1374
1379 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0, 1375 ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
1380 "SSL_quic_read_level: %d, SSL_quic_write_level: %d", 1376 "SSL_quic_read_level: %d, SSL_quic_write_level: %d",
1381 (int) SSL_quic_read_level(ssl_conn), 1377 (int) SSL_quic_read_level(ssl_conn),
1382 (int) SSL_quic_write_level(ssl_conn)); 1378 (int) SSL_quic_write_level(ssl_conn));
1379
1380 ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
1381 "quic ssl cipher: %s", SSL_get_cipher(ssl_conn));
1383 1382
1384 // ACK Client Finished 1383 // ACK Client Finished
1385 1384
1386 ngx_quic_frame_t *frame; 1385 ngx_quic_frame_t *frame;
1387 1386