CipherSuite.h 5.1 KB

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