src/event/quic/ngx_event_quic_protection.h - nginx

Data types defined

Macros defined

Source code


  1. /*
  2. * Copyright (C) Nginx, Inc.
  3. */


  4. #ifndef _NGX_EVENT_QUIC_PROTECTION_H_INCLUDED_
  5. #define _NGX_EVENT_QUIC_PROTECTION_H_INCLUDED_


  6. #include <ngx_config.h>
  7. #include <ngx_core.h>

  8. #include <ngx_event_quic_transport.h>


  9. /* RFC 5116, 5.1/5.3 and RFC 8439, 2.3/2.5 for all supported ciphers */
  10. #define NGX_QUIC_IV_LEN               12
  11. #define NGX_QUIC_TAG_LEN              16

  12. /* largest hash used in TLS is SHA-384 */
  13. #define NGX_QUIC_MAX_MD_SIZE          48


  14. #if (defined OPENSSL_IS_BORINGSSL || defined OPENSSL_IS_AWSLC)
  15. #define NGX_QUIC_BORINGSSL_EVP_API    1
  16. #define ngx_quic_cipher_t             EVP_AEAD
  17. #define ngx_quic_crypto_ctx_t         EVP_AEAD_CTX
  18. #else
  19. #define NGX_QUIC_BORINGSSL_EVP_API    0
  20. #define ngx_quic_cipher_t             EVP_CIPHER
  21. #define ngx_quic_crypto_ctx_t         EVP_CIPHER_CTX
  22. #endif


  23. typedef struct {
  24.     size_t                    len;
  25.     u_char                    data[NGX_QUIC_MAX_MD_SIZE];
  26. } ngx_quic_md_t;


  27. typedef struct {
  28.     size_t                    len;
  29.     u_char                    data[NGX_QUIC_IV_LEN];
  30. } ngx_quic_iv_t;


  31. typedef struct {
  32.     ngx_quic_md_t             secret;
  33.     ngx_quic_iv_t             iv;
  34.     ngx_quic_md_t             hp;
  35.     ngx_quic_crypto_ctx_t    *ctx;
  36.     EVP_CIPHER_CTX           *hp_ctx;
  37. } ngx_quic_secret_t;


  38. typedef struct {
  39.     ngx_quic_secret_t         client;
  40.     ngx_quic_secret_t         server;
  41. } ngx_quic_secrets_t;


  42. struct ngx_quic_keys_s {
  43.     ngx_quic_secrets_t        secrets[NGX_QUIC_ENCRYPTION_LAST];
  44.     ngx_quic_secrets_t        next_key;
  45.     ngx_uint_t                cipher;
  46. };


  47. typedef struct {
  48.     const ngx_quic_cipher_t  *c;
  49.     const EVP_CIPHER         *hp;
  50.     const EVP_MD             *d;
  51. } ngx_quic_ciphers_t;


  52. typedef struct {
  53.     size_t                    out_len;
  54.     u_char                   *out;

  55.     size_t                    prk_len;
  56.     const uint8_t            *prk;

  57.     size_t                    label_len;
  58.     const u_char             *label;
  59. } ngx_quic_hkdf_t;

  60. #define ngx_quic_hkdf_set(seq, _label, _out, _prk)                            \
  61.     (seq)->out_len = (_out)->len; (seq)->out = (_out)->data;                  \
  62.     (seq)->prk_len = (_prk)->len, (seq)->prk = (_prk)->data,                  \
  63.     (seq)->label_len = (sizeof(_label) - 1); (seq)->label = (u_char *)(_label);


  64. ngx_int_t ngx_quic_keys_set_initial_secret(ngx_quic_keys_t *keys,
  65.     ngx_str_t *secret, ngx_log_t *log);
  66. ngx_int_t ngx_quic_keys_set_encryption_secret(ngx_log_t *log,
  67.     ngx_uint_t is_write, ngx_quic_keys_t *keys, ngx_uint_t level,
  68.     const SSL_CIPHER *cipher, const uint8_t *secret, size_t secret_len);
  69. ngx_uint_t ngx_quic_keys_available(ngx_quic_keys_t *keys, ngx_uint_t level,
  70.     ngx_uint_t is_write);
  71. void ngx_quic_keys_discard(ngx_quic_keys_t *keys, ngx_uint_t level);
  72. void ngx_quic_keys_switch(ngx_connection_t *c, ngx_quic_keys_t *keys);
  73. void ngx_quic_keys_update(ngx_event_t *ev);
  74. void ngx_quic_keys_cleanup(ngx_quic_keys_t *keys);
  75. ngx_int_t ngx_quic_encrypt(ngx_quic_header_t *pkt, ngx_str_t *res);
  76. ngx_int_t ngx_quic_decrypt(ngx_quic_header_t *pkt, uint64_t *largest_pn);
  77. void ngx_quic_compute_nonce(u_char *nonce, size_t len, uint64_t pn);
  78. ngx_int_t ngx_quic_ciphers(ngx_uint_t id, ngx_quic_ciphers_t *ciphers);
  79. ngx_int_t ngx_quic_crypto_init(const ngx_quic_cipher_t *cipher,
  80.     ngx_quic_secret_t *s, ngx_quic_md_t *key, ngx_int_t enc, ngx_log_t *log);
  81. ngx_int_t ngx_quic_crypto_seal(ngx_quic_secret_t *s, ngx_str_t *out,
  82.     const u_char *nonce, ngx_str_t *in, ngx_str_t *ad, ngx_log_t *log);
  83. void ngx_quic_crypto_cleanup(ngx_quic_secret_t *s);
  84. ngx_int_t ngx_quic_hkdf_expand(ngx_quic_hkdf_t *hkdf, const EVP_MD *digest,
  85.     ngx_log_t *log);


  86. #endif /* _NGX_EVENT_QUIC_PROTECTION_H_INCLUDED_ */