CipherSuite.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  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. // Secure cipher suites, but not recommended
  20. // RFC 5288 - DH, DHE and RSA for AES-GCM
  21. DHE_RSA_WITH_AES_128_GCM_SHA256 = 0x009E,
  22. DHE_RSA_WITH_AES_256_GCM_SHA384 = 0x009F,
  23. // All recommended cipher suites (according to https://ciphersuite.info/cs/)
  24. // RFC 5288 - DH, DHE and RSA for AES-GCM
  25. DHE_DSS_WITH_AES_128_GCM_SHA256 = 0x00A2,
  26. DHE_DSS_WITH_AES_256_GCM_SHA384 = 0x00A3,
  27. // RFC 5289 - ECDHE for AES-GCM
  28. ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02B,
  29. ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02C,
  30. // RFC 5487 - Pre-shared keys
  31. DHE_PSK_WITH_AES_128_GCM_SHA256 = 0x00AA,
  32. DHE_PSK_WITH_AES_256_GCM_SHA384 = 0x00AB,
  33. // RFC 6209 - ARIA suites
  34. DHE_DSS_WITH_ARIA_128_GCM_SHA256 = 0xC056,
  35. DHE_DSS_WITH_ARIA_256_GCM_SHA384 = 0xC057,
  36. ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 = 0xC05C,
  37. ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 = 0xC05D,
  38. DHE_PSK_WITH_ARIA_128_GCM_SHA256 = 0xC06C,
  39. DHE_PSK_WITH_ARIA_256_GCM_SHA384 = 0xC06D,
  40. // RFC 6367 - Camellia Cipher Suites
  41. DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256 = 0xC080,
  42. DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384 = 0xC081,
  43. ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 = 0xC086,
  44. ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 = 0xC087,
  45. DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 = 0xC090,
  46. DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 = 0xC091,
  47. // RFC 6655 - DHE, PSK and RSA with AES-CCM
  48. DHE_PSK_WITH_AES_128_CCM = 0xC0A6,
  49. DHE_PSK_WITH_AES_256_CCM = 0xC0A7,
  50. // RFC 7251 - ECDHE with AES-CCM
  51. ECDHE_ECDSA_WITH_AES_128_CCM = 0xC0AC,
  52. ECDHE_ECDSA_WITH_AES_256_CCM = 0xC0AD,
  53. ECDHE_ECDSA_WITH_AES_128_CCM_8 = 0xC0AE,
  54. ECDHE_ECDSA_WITH_AES_256_CCM_8 = 0xC0AF,
  55. // RFC 7905 - ChaCha20-Poly1305 Cipher Suites
  56. ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 = 0xCCA9,
  57. ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 = 0xCCAC,
  58. DHE_PSK_WITH_CHACHA20_POLY1305 = 0xCCAD,
  59. // RFC 8442 - ECDHE_PSK with AES-GCM and AES-CCM
  60. ECDHE_PSK_WITH_AES_128_GCM_SHA256 = 0xD001,
  61. ECDHE_PSK_WITH_AES_256_GCM_SHA384 = 0xD002,
  62. ECDHE_PSK_WITH_AES_128_CCM_8_SHA256 = 0xD003,
  63. ECDHE_PSK_WITH_AES_128_CCM_SHA256 = 0xD005,
  64. // RFC 8446 - TLS v1.3
  65. AES_128_GCM_SHA256 = 0x1301,
  66. AES_256_GCM_SHA384 = 0x1302,
  67. CHACHA20_POLY1305_SHA256 = 0x1303,
  68. AES_128_CCM_SHA256 = 0x1304,
  69. AES_128_CCM_8_SHA256 = 0x1305,
  70. };
  71. // Defined in RFC 5246 section 7.4.1.4.1
  72. enum class HashAlgorithm : u8 {
  73. None = 0,
  74. MD5 = 1,
  75. SHA1 = 2,
  76. SHA224 = 3,
  77. SHA256 = 4,
  78. SHA384 = 5,
  79. SHA512 = 6,
  80. };
  81. // Defined in RFC 5246 section 7.4.1.4.1
  82. enum class SignatureAlgorithm : u8 {
  83. Anonymous = 0,
  84. RSA = 1,
  85. DSA = 2,
  86. ECDSA = 3,
  87. };
  88. // Defined in RFC 5246 section 7.4.1.4.1
  89. struct SignatureAndHashAlgorithm {
  90. HashAlgorithm hash;
  91. SignatureAlgorithm signature;
  92. };
  93. enum class KeyExchangeAlgorithm {
  94. Invalid,
  95. // Defined in RFC 5246 section 7.4.2 / RFC 4279 section 4
  96. RSA_PSK,
  97. // Defined in RFC 5246 section 7.4.3
  98. DHE_DSS,
  99. DHE_RSA,
  100. DH_anon,
  101. RSA,
  102. DH_DSS,
  103. DH_RSA,
  104. // Defined in RFC 4492 section 2
  105. ECDHE_RSA,
  106. ECDH_ECDSA,
  107. ECDH_RSA,
  108. ECDHE_ECDSA,
  109. ECDH_anon,
  110. };
  111. // Defined in RFC 5246 section 7.4.1.4.1
  112. constexpr SignatureAlgorithm signature_for_key_exchange_algorithm(KeyExchangeAlgorithm algorithm)
  113. {
  114. switch (algorithm) {
  115. case KeyExchangeAlgorithm::RSA:
  116. case KeyExchangeAlgorithm::DHE_RSA:
  117. case KeyExchangeAlgorithm::DH_RSA:
  118. case KeyExchangeAlgorithm::RSA_PSK:
  119. case KeyExchangeAlgorithm::ECDH_RSA:
  120. case KeyExchangeAlgorithm::ECDHE_RSA:
  121. return SignatureAlgorithm::RSA;
  122. case KeyExchangeAlgorithm::DHE_DSS:
  123. case KeyExchangeAlgorithm::DH_DSS:
  124. return SignatureAlgorithm::DSA;
  125. case KeyExchangeAlgorithm::ECDH_ECDSA:
  126. case KeyExchangeAlgorithm::ECDHE_ECDSA:
  127. return SignatureAlgorithm::ECDSA;
  128. case KeyExchangeAlgorithm::DH_anon:
  129. case KeyExchangeAlgorithm::ECDH_anon:
  130. default:
  131. return SignatureAlgorithm::Anonymous;
  132. }
  133. }
  134. enum class CipherAlgorithm {
  135. Invalid,
  136. AES_128_CBC,
  137. AES_128_GCM,
  138. AES_128_CCM,
  139. AES_128_CCM_8,
  140. AES_256_CBC,
  141. AES_256_GCM,
  142. };
  143. constexpr size_t cipher_key_size(CipherAlgorithm algorithm)
  144. {
  145. switch (algorithm) {
  146. case CipherAlgorithm::AES_128_CBC:
  147. case CipherAlgorithm::AES_128_GCM:
  148. case CipherAlgorithm::AES_128_CCM:
  149. case CipherAlgorithm::AES_128_CCM_8:
  150. return 128;
  151. case CipherAlgorithm::AES_256_CBC:
  152. case CipherAlgorithm::AES_256_GCM:
  153. return 256;
  154. case CipherAlgorithm::Invalid:
  155. default:
  156. return 0;
  157. }
  158. }
  159. }