CipherSuite.h 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. /*
  2. * Copyright (c) 2020, Ali Mohammad Pur <mpfard@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Types.h>
  8. namespace TLS {
  9. enum class CipherSuite {
  10. Invalid = 0,
  11. // Weak cipher suites, but we support them
  12. // RFC 5246 - Original TLS v1.2 ciphers
  13. RSA_WITH_AES_128_CBC_SHA = 0x002F,
  14. RSA_WITH_AES_256_CBC_SHA = 0x0035,
  15. RSA_WITH_AES_128_CBC_SHA256 = 0x003C,
  16. RSA_WITH_AES_256_CBC_SHA256 = 0x003D,
  17. // RFC 5288 - DH, DHE and RSA for AES-GCM
  18. RSA_WITH_AES_128_GCM_SHA256 = 0x009C,
  19. RSA_WITH_AES_256_GCM_SHA384 = 0x009D,
  20. // Secure cipher suites, but not recommended
  21. // RFC 5288 - DH, DHE and RSA for AES-GCM
  22. DHE_RSA_WITH_AES_128_GCM_SHA256 = 0x009E,
  23. DHE_RSA_WITH_AES_256_GCM_SHA384 = 0x009F,
  24. // RFC 5289 - ECDHE for AES-GCM
  25. ECDHE_RSA_WITH_AES_128_GCM_SHA256 = 0xC02F,
  26. ECDHE_RSA_WITH_AES_256_GCM_SHA384 = 0xC030,
  27. // All recommended cipher suites (according to https://ciphersuite.info/cs/)
  28. // RFC 5288 - DH, DHE and RSA for AES-GCM
  29. DHE_DSS_WITH_AES_128_GCM_SHA256 = 0x00A2,
  30. DHE_DSS_WITH_AES_256_GCM_SHA384 = 0x00A3,
  31. // RFC 5289 - ECDHE for AES-GCM
  32. ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02B,
  33. ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02C,
  34. // RFC 5487 - Pre-shared keys
  35. DHE_PSK_WITH_AES_128_GCM_SHA256 = 0x00AA,
  36. DHE_PSK_WITH_AES_256_GCM_SHA384 = 0x00AB,
  37. // RFC 6209 - ARIA suites
  38. DHE_DSS_WITH_ARIA_128_GCM_SHA256 = 0xC056,
  39. DHE_DSS_WITH_ARIA_256_GCM_SHA384 = 0xC057,
  40. ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 = 0xC05C,
  41. ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 = 0xC05D,
  42. DHE_PSK_WITH_ARIA_128_GCM_SHA256 = 0xC06C,
  43. DHE_PSK_WITH_ARIA_256_GCM_SHA384 = 0xC06D,
  44. // RFC 6367 - Camellia Cipher Suites
  45. DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256 = 0xC080,
  46. DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384 = 0xC081,
  47. ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 = 0xC086,
  48. ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 = 0xC087,
  49. DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 = 0xC090,
  50. DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 = 0xC091,
  51. // RFC 6655 - DHE, PSK and RSA with AES-CCM
  52. DHE_PSK_WITH_AES_128_CCM = 0xC0A6,
  53. DHE_PSK_WITH_AES_256_CCM = 0xC0A7,
  54. // RFC 7251 - ECDHE with AES-CCM
  55. ECDHE_ECDSA_WITH_AES_128_CCM = 0xC0AC,
  56. ECDHE_ECDSA_WITH_AES_256_CCM = 0xC0AD,
  57. ECDHE_ECDSA_WITH_AES_128_CCM_8 = 0xC0AE,
  58. ECDHE_ECDSA_WITH_AES_256_CCM_8 = 0xC0AF,
  59. // RFC 7905 - ChaCha20-Poly1305 Cipher Suites
  60. ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 = 0xCCA9,
  61. ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 = 0xCCAC,
  62. DHE_PSK_WITH_CHACHA20_POLY1305 = 0xCCAD,
  63. // RFC 8442 - ECDHE_PSK with AES-GCM and AES-CCM
  64. ECDHE_PSK_WITH_AES_128_GCM_SHA256 = 0xD001,
  65. ECDHE_PSK_WITH_AES_256_GCM_SHA384 = 0xD002,
  66. ECDHE_PSK_WITH_AES_128_CCM_8_SHA256 = 0xD003,
  67. ECDHE_PSK_WITH_AES_128_CCM_SHA256 = 0xD005,
  68. // RFC 8446 - TLS v1.3
  69. AES_128_GCM_SHA256 = 0x1301,
  70. AES_256_GCM_SHA384 = 0x1302,
  71. CHACHA20_POLY1305_SHA256 = 0x1303,
  72. AES_128_CCM_SHA256 = 0x1304,
  73. AES_128_CCM_8_SHA256 = 0x1305,
  74. };
  75. // Defined in RFC 5246 section 7.4.1.4.1
  76. enum class HashAlgorithm : u8 {
  77. None = 0,
  78. MD5 = 1,
  79. SHA1 = 2,
  80. SHA224 = 3,
  81. SHA256 = 4,
  82. SHA384 = 5,
  83. SHA512 = 6,
  84. };
  85. // Defined in RFC 5246 section 7.4.1.4.1
  86. enum class SignatureAlgorithm : u8 {
  87. Anonymous = 0,
  88. RSA = 1,
  89. DSA = 2,
  90. ECDSA = 3,
  91. };
  92. // Defined in RFC 5246 section 7.4.1.4.1
  93. struct SignatureAndHashAlgorithm {
  94. HashAlgorithm hash;
  95. SignatureAlgorithm signature;
  96. };
  97. enum class KeyExchangeAlgorithm {
  98. Invalid,
  99. // Defined in RFC 5246 section 7.4.2 / RFC 4279 section 4
  100. RSA_PSK,
  101. // Defined in RFC 5246 section 7.4.3
  102. DHE_DSS,
  103. DHE_RSA,
  104. DH_anon,
  105. RSA,
  106. DH_DSS,
  107. DH_RSA,
  108. // Defined in RFC 4492 section 2
  109. ECDHE_RSA,
  110. ECDH_ECDSA,
  111. ECDH_RSA,
  112. ECDHE_ECDSA,
  113. ECDH_anon,
  114. };
  115. // Defined in RFC 5246 section 7.4.1.4.1
  116. constexpr SignatureAlgorithm signature_for_key_exchange_algorithm(KeyExchangeAlgorithm algorithm)
  117. {
  118. switch (algorithm) {
  119. case KeyExchangeAlgorithm::RSA:
  120. case KeyExchangeAlgorithm::DHE_RSA:
  121. case KeyExchangeAlgorithm::DH_RSA:
  122. case KeyExchangeAlgorithm::RSA_PSK:
  123. case KeyExchangeAlgorithm::ECDH_RSA:
  124. case KeyExchangeAlgorithm::ECDHE_RSA:
  125. return SignatureAlgorithm::RSA;
  126. case KeyExchangeAlgorithm::DHE_DSS:
  127. case KeyExchangeAlgorithm::DH_DSS:
  128. return SignatureAlgorithm::DSA;
  129. case KeyExchangeAlgorithm::ECDH_ECDSA:
  130. case KeyExchangeAlgorithm::ECDHE_ECDSA:
  131. return SignatureAlgorithm::ECDSA;
  132. case KeyExchangeAlgorithm::DH_anon:
  133. case KeyExchangeAlgorithm::ECDH_anon:
  134. default:
  135. return SignatureAlgorithm::Anonymous;
  136. }
  137. }
  138. enum class CipherAlgorithm {
  139. Invalid,
  140. AES_128_CBC,
  141. AES_128_GCM,
  142. AES_128_CCM,
  143. AES_128_CCM_8,
  144. AES_256_CBC,
  145. AES_256_GCM,
  146. };
  147. constexpr size_t cipher_key_size(CipherAlgorithm algorithm)
  148. {
  149. switch (algorithm) {
  150. case CipherAlgorithm::AES_128_CBC:
  151. case CipherAlgorithm::AES_128_GCM:
  152. case CipherAlgorithm::AES_128_CCM:
  153. case CipherAlgorithm::AES_128_CCM_8:
  154. return 128;
  155. case CipherAlgorithm::AES_256_CBC:
  156. case CipherAlgorithm::AES_256_GCM:
  157. return 256;
  158. case CipherAlgorithm::Invalid:
  159. default:
  160. return 0;
  161. }
  162. }
  163. enum class NamedCurve : u16 {
  164. secp256r1 = 23,
  165. secp384r1 = 24,
  166. secp521r1 = 25,
  167. x25519 = 29,
  168. x448 = 30,
  169. };
  170. enum class ECPointFormat : u8 {
  171. Uncompressed = 0,
  172. };
  173. }