2021-05-17 21:01:26 +02:00
|
|
|
/*
|
|
|
|
|
* Copyright (c) 2020, Ali Mohammad Pur <mpfard@serenityos.org>
|
|
|
|
|
*
|
|
|
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
namespace TLS {
|
|
|
|
|
|
|
|
|
|
enum class CipherSuite {
|
|
|
|
|
Invalid = 0,
|
|
|
|
|
|
2021-05-29 00:36:00 +02:00
|
|
|
// Weak cipher suites, but we support them
|
|
|
|
|
// RFC 5246 - Original TLS v1.2 ciphers
|
2021-05-17 21:01:26 +02:00
|
|
|
RSA_WITH_AES_128_CBC_SHA = 0x002F,
|
|
|
|
|
RSA_WITH_AES_256_CBC_SHA = 0x0035,
|
|
|
|
|
RSA_WITH_AES_128_CBC_SHA256 = 0x003C,
|
|
|
|
|
RSA_WITH_AES_256_CBC_SHA256 = 0x003D,
|
2021-05-29 00:36:00 +02:00
|
|
|
|
|
|
|
|
// RFC 5288 - DH, DHE and RSA for AES-GCM
|
2021-05-17 21:01:26 +02:00
|
|
|
RSA_WITH_AES_128_GCM_SHA256 = 0x009C,
|
|
|
|
|
RSA_WITH_AES_256_GCM_SHA384 = 0x009D,
|
2021-05-29 00:36:00 +02:00
|
|
|
|
|
|
|
|
// All recommended cipher suites (according to https://ciphersuite.info/cs/)
|
|
|
|
|
// RFC 5288 - DH, DHE and RSA for AES-GCM
|
|
|
|
|
DHE_DSS_WITH_AES_128_GCM_SHA256 = 0x00A2,
|
|
|
|
|
DHE_DSS_WITH_AES_256_GCM_SHA384 = 0x00A3,
|
|
|
|
|
|
|
|
|
|
// RFC 5289 - ECDHE for AES-GCM
|
|
|
|
|
ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 = 0xC02B,
|
|
|
|
|
ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 = 0xC02C,
|
|
|
|
|
|
|
|
|
|
// RFC 5487 - Pre-shared keys
|
|
|
|
|
DHE_PSK_WITH_AES_128_GCM_SHA256 = 0x00AA,
|
|
|
|
|
DHE_PSK_WITH_AES_256_GCM_SHA384 = 0x00AB,
|
|
|
|
|
|
|
|
|
|
// RFC 6209 - ARIA suites
|
|
|
|
|
DHE_DSS_WITH_ARIA_128_GCM_SHA256 = 0xC056,
|
|
|
|
|
DHE_DSS_WITH_ARIA_256_GCM_SHA384 = 0xC057,
|
|
|
|
|
ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256 = 0xC05C,
|
|
|
|
|
ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384 = 0xC05D,
|
|
|
|
|
DHE_PSK_WITH_ARIA_128_GCM_SHA256 = 0xC06C,
|
|
|
|
|
DHE_PSK_WITH_ARIA_256_GCM_SHA384 = 0xC06D,
|
|
|
|
|
|
|
|
|
|
// RFC 6367 - Camellia Cipher Suites
|
|
|
|
|
DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256 = 0xC080,
|
|
|
|
|
DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384 = 0xC081,
|
|
|
|
|
ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 = 0xC086,
|
|
|
|
|
ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 = 0xC087,
|
|
|
|
|
DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 = 0xC090,
|
|
|
|
|
DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 = 0xC091,
|
|
|
|
|
|
|
|
|
|
// RFC 6655 - DHE, PSK and RSA with AES-CCM
|
|
|
|
|
DHE_PSK_WITH_AES_128_CCM = 0xC0A6,
|
|
|
|
|
DHE_PSK_WITH_AES_256_CCM = 0xC0A7,
|
|
|
|
|
|
|
|
|
|
// RFC 7251 - ECDHE with AES-CCM
|
|
|
|
|
ECDHE_ECDSA_WITH_AES_128_CCM = 0xC0AC,
|
|
|
|
|
ECDHE_ECDSA_WITH_AES_256_CCM = 0xC0AD,
|
|
|
|
|
ECDHE_ECDSA_WITH_AES_128_CCM_8 = 0xC0AE,
|
|
|
|
|
ECDHE_ECDSA_WITH_AES_256_CCM_8 = 0xC0AF,
|
|
|
|
|
|
|
|
|
|
// RFC 7905 - ChaCha20-Poly1305 Cipher Suites
|
|
|
|
|
ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 = 0xCCA9,
|
|
|
|
|
ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 = 0xCCAC,
|
|
|
|
|
DHE_PSK_WITH_CHACHA20_POLY1305 = 0xCCAD,
|
|
|
|
|
|
|
|
|
|
// RFC 8442 - ECDHE_PSK with AES-GCM and AES-CCM
|
|
|
|
|
ECDHE_PSK_WITH_AES_128_GCM_SHA256 = 0xD001,
|
|
|
|
|
ECDHE_PSK_WITH_AES_256_GCM_SHA384 = 0xD002,
|
|
|
|
|
ECDHE_PSK_WITH_AES_128_CCM_8_SHA256 = 0xD003,
|
|
|
|
|
ECDHE_PSK_WITH_AES_128_CCM_SHA256 = 0xD005,
|
|
|
|
|
|
|
|
|
|
// RFC 8446 - TLS v1.3
|
|
|
|
|
AES_128_GCM_SHA256 = 0x1301,
|
|
|
|
|
AES_256_GCM_SHA384 = 0x1302,
|
|
|
|
|
CHACHA20_POLY1305_SHA256 = 0x1303,
|
|
|
|
|
AES_128_CCM_SHA256 = 0x1304,
|
|
|
|
|
AES_128_CCM_8_SHA256 = 0x1305,
|
2021-05-17 21:01:26 +02:00
|
|
|
};
|
|
|
|
|
|
2021-05-29 00:36:00 +02:00
|
|
|
// Defined in RFC 5246 section 7.4.1.4.1
|
2021-05-17 21:01:26 +02:00
|
|
|
enum class HashAlgorithm : u8 {
|
|
|
|
|
None = 0,
|
|
|
|
|
MD5 = 1,
|
|
|
|
|
SHA1 = 2,
|
|
|
|
|
SHA224 = 3,
|
|
|
|
|
SHA256 = 4,
|
|
|
|
|
SHA384 = 5,
|
|
|
|
|
SHA512 = 6,
|
|
|
|
|
};
|
|
|
|
|
|
2021-05-29 00:36:00 +02:00
|
|
|
// Defined in RFC 5246 section 7.4.1.4.1
|
2021-05-17 21:01:26 +02:00
|
|
|
enum class SignatureAlgorithm : u8 {
|
|
|
|
|
Anonymous = 0,
|
|
|
|
|
RSA = 1,
|
|
|
|
|
DSA = 2,
|
|
|
|
|
ECDSA = 3,
|
|
|
|
|
};
|
|
|
|
|
|
2021-05-29 00:36:00 +02:00
|
|
|
// Defined in RFC 5246 section 7.4.1.4.1
|
|
|
|
|
struct SignatureAndHashAlgorithm {
|
|
|
|
|
HashAlgorithm hash;
|
|
|
|
|
SignatureAlgorithm signature;
|
|
|
|
|
};
|
|
|
|
|
|
2021-05-17 22:34:03 +02:00
|
|
|
enum class CipherAlgorithm {
|
2021-05-18 23:26:23 +02:00
|
|
|
Invalid,
|
2021-05-17 22:34:03 +02:00
|
|
|
AES_128_CBC,
|
|
|
|
|
AES_128_GCM,
|
|
|
|
|
AES_128_CCM,
|
|
|
|
|
AES_128_CCM_8,
|
|
|
|
|
AES_256_CBC,
|
|
|
|
|
AES_256_GCM,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
constexpr size_t cipher_key_size(CipherAlgorithm algorithm)
|
|
|
|
|
{
|
|
|
|
|
switch (algorithm) {
|
|
|
|
|
case CipherAlgorithm::AES_128_CBC:
|
|
|
|
|
case CipherAlgorithm::AES_128_GCM:
|
|
|
|
|
case CipherAlgorithm::AES_128_CCM:
|
|
|
|
|
case CipherAlgorithm::AES_128_CCM_8:
|
|
|
|
|
return 128;
|
|
|
|
|
case CipherAlgorithm::AES_256_CBC:
|
|
|
|
|
case CipherAlgorithm::AES_256_GCM:
|
|
|
|
|
return 256;
|
2021-05-18 23:26:23 +02:00
|
|
|
case CipherAlgorithm::Invalid:
|
2021-05-17 22:34:03 +02:00
|
|
|
default:
|
2021-05-18 23:26:23 +02:00
|
|
|
return 0;
|
2021-05-17 22:34:03 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-17 21:01:26 +02:00
|
|
|
}
|