CipherSuite.h 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  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 KeyExchangeAlgorithm {
  90. Invalid,
  91. // Defined in RFC 5246 section 7.4.2 / RFC 4279 section 4
  92. RSA_PSK,
  93. // Defined in RFC 5246 section 7.4.3
  94. DHE_DSS,
  95. DHE_RSA,
  96. DH_anon,
  97. RSA,
  98. DH_DSS,
  99. DH_RSA,
  100. // Defined in RFC 4492 section 2
  101. ECDHE_RSA,
  102. ECDH_ECDSA,
  103. ECDH_RSA,
  104. ECDHE_ECDSA,
  105. ECDH_anon,
  106. };
  107. // Defined in RFC 5246 section 7.4.1.4.1
  108. constexpr SignatureAlgorithm signature_for_key_exchange_algorithm(KeyExchangeAlgorithm algorithm)
  109. {
  110. switch (algorithm) {
  111. case KeyExchangeAlgorithm::RSA:
  112. case KeyExchangeAlgorithm::DHE_RSA:
  113. case KeyExchangeAlgorithm::DH_RSA:
  114. case KeyExchangeAlgorithm::RSA_PSK:
  115. case KeyExchangeAlgorithm::ECDH_RSA:
  116. case KeyExchangeAlgorithm::ECDHE_RSA:
  117. return SignatureAlgorithm::RSA;
  118. case KeyExchangeAlgorithm::DHE_DSS:
  119. case KeyExchangeAlgorithm::DH_DSS:
  120. return SignatureAlgorithm::DSA;
  121. case KeyExchangeAlgorithm::ECDH_ECDSA:
  122. case KeyExchangeAlgorithm::ECDHE_ECDSA:
  123. return SignatureAlgorithm::ECDSA;
  124. case KeyExchangeAlgorithm::DH_anon:
  125. case KeyExchangeAlgorithm::ECDH_anon:
  126. default:
  127. return SignatureAlgorithm::Anonymous;
  128. }
  129. }
  130. enum class CipherAlgorithm {
  131. Invalid,
  132. AES_128_CBC,
  133. AES_128_GCM,
  134. AES_128_CCM,
  135. AES_128_CCM_8,
  136. AES_256_CBC,
  137. AES_256_GCM,
  138. };
  139. constexpr size_t cipher_key_size(CipherAlgorithm algorithm)
  140. {
  141. switch (algorithm) {
  142. case CipherAlgorithm::AES_128_CBC:
  143. case CipherAlgorithm::AES_128_GCM:
  144. case CipherAlgorithm::AES_128_CCM:
  145. case CipherAlgorithm::AES_128_CCM_8:
  146. return 128;
  147. case CipherAlgorithm::AES_256_CBC:
  148. case CipherAlgorithm::AES_256_GCM:
  149. return 256;
  150. case CipherAlgorithm::Invalid:
  151. default:
  152. return 0;
  153. }
  154. }
  155. }