CipherSuite.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. /*
  2. * Copyright (c) 2020, Ali Mohammad Pur <mpfard@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. namespace TLS {
  8. enum class CipherSuite {
  9. Invalid = 0,
  10. // Weak cipher suites, but we support them
  11. // RFC 5246 - Original TLS v1.2 ciphers
  12. RSA_WITH_AES_128_CBC_SHA = 0x002F,
  13. RSA_WITH_AES_256_CBC_SHA = 0x0035,
  14. RSA_WITH_AES_128_CBC_SHA256 = 0x003C,
  15. RSA_WITH_AES_256_CBC_SHA256 = 0x003D,
  16. // RFC 5288 - DH, DHE and RSA for AES-GCM
  17. RSA_WITH_AES_128_GCM_SHA256 = 0x009C,
  18. RSA_WITH_AES_256_GCM_SHA384 = 0x009D,
  19. // All recommended cipher suites (according to https://ciphersuite.info/cs/)
  20. // RFC 5288 - DH, DHE and RSA for AES-GCM
  21. DHE_DSS_WITH_AES_128_GCM_SHA256 = 0x00A2,
  22. DHE_DSS_WITH_AES_256_GCM_SHA384 = 0x00A3,
  23. // RFC 5289 - ECDHE for AES-GCM
  24. ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02B,
  25. ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02C,
  26. // RFC 5487 - Pre-shared keys
  27. DHE_PSK_WITH_AES_128_GCM_SHA256 = 0x00AA,
  28. DHE_PSK_WITH_AES_256_GCM_SHA384 = 0x00AB,
  29. // RFC 6209 - ARIA suites
  30. DHE_DSS_WITH_ARIA_128_GCM_SHA256 = 0xC056,
  31. DHE_DSS_WITH_ARIA_256_GCM_SHA384 = 0xC057,
  32. ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 = 0xC05C,
  33. ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 = 0xC05D,
  34. DHE_PSK_WITH_ARIA_128_GCM_SHA256 = 0xC06C,
  35. DHE_PSK_WITH_ARIA_256_GCM_SHA384 = 0xC06D,
  36. // RFC 6367 - Camellia Cipher Suites
  37. DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256 = 0xC080,
  38. DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384 = 0xC081,
  39. ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 = 0xC086,
  40. ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 = 0xC087,
  41. DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 = 0xC090,
  42. DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 = 0xC091,
  43. // RFC 6655 - DHE, PSK and RSA with AES-CCM
  44. DHE_PSK_WITH_AES_128_CCM = 0xC0A6,
  45. DHE_PSK_WITH_AES_256_CCM = 0xC0A7,
  46. // RFC 7251 - ECDHE with AES-CCM
  47. ECDHE_ECDSA_WITH_AES_128_CCM = 0xC0AC,
  48. ECDHE_ECDSA_WITH_AES_256_CCM = 0xC0AD,
  49. ECDHE_ECDSA_WITH_AES_128_CCM_8 = 0xC0AE,
  50. ECDHE_ECDSA_WITH_AES_256_CCM_8 = 0xC0AF,
  51. // RFC 7905 - ChaCha20-Poly1305 Cipher Suites
  52. ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 = 0xCCA9,
  53. ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 = 0xCCAC,
  54. DHE_PSK_WITH_CHACHA20_POLY1305 = 0xCCAD,
  55. // RFC 8442 - ECDHE_PSK with AES-GCM and AES-CCM
  56. ECDHE_PSK_WITH_AES_128_GCM_SHA256 = 0xD001,
  57. ECDHE_PSK_WITH_AES_256_GCM_SHA384 = 0xD002,
  58. ECDHE_PSK_WITH_AES_128_CCM_8_SHA256 = 0xD003,
  59. ECDHE_PSK_WITH_AES_128_CCM_SHA256 = 0xD005,
  60. // RFC 8446 - TLS v1.3
  61. AES_128_GCM_SHA256 = 0x1301,
  62. AES_256_GCM_SHA384 = 0x1302,
  63. CHACHA20_POLY1305_SHA256 = 0x1303,
  64. AES_128_CCM_SHA256 = 0x1304,
  65. AES_128_CCM_8_SHA256 = 0x1305,
  66. };
  67. // Defined in RFC 5246 section 7.4.1.4.1
  68. enum class HashAlgorithm : u8 {
  69. None = 0,
  70. MD5 = 1,
  71. SHA1 = 2,
  72. SHA224 = 3,
  73. SHA256 = 4,
  74. SHA384 = 5,
  75. SHA512 = 6,
  76. };
  77. // Defined in RFC 5246 section 7.4.1.4.1
  78. enum class SignatureAlgorithm : u8 {
  79. Anonymous = 0,
  80. RSA = 1,
  81. DSA = 2,
  82. ECDSA = 3,
  83. };
  84. // Defined in RFC 5246 section 7.4.1.4.1
  85. struct SignatureAndHashAlgorithm {
  86. HashAlgorithm hash;
  87. SignatureAlgorithm signature;
  88. };
  89. enum class CipherAlgorithm {
  90. Invalid,
  91. AES_128_CBC,
  92. AES_128_GCM,
  93. AES_128_CCM,
  94. AES_128_CCM_8,
  95. AES_256_CBC,
  96. AES_256_GCM,
  97. };
  98. constexpr size_t cipher_key_size(CipherAlgorithm algorithm)
  99. {
  100. switch (algorithm) {
  101. case CipherAlgorithm::AES_128_CBC:
  102. case CipherAlgorithm::AES_128_GCM:
  103. case CipherAlgorithm::AES_128_CCM:
  104. case CipherAlgorithm::AES_128_CCM_8:
  105. return 128;
  106. case CipherAlgorithm::AES_256_CBC:
  107. case CipherAlgorithm::AES_256_GCM:
  108. return 256;
  109. case CipherAlgorithm::Invalid:
  110. default:
  111. return 0;
  112. }
  113. }
  114. }