HandshakeServer.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. /*
  2. * Copyright (c) 2020, Ali Mohammad Pur <mpfard@serenityos.org>
  3. * Copyright (c) 2022, Michiel Visser <opensource@webmichiel.nl>
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #include <AK/Debug.h>
  8. #include <AK/Endian.h>
  9. #include <AK/Random.h>
  10. #include <LibCore/Timer.h>
  11. #include <LibCrypto/ASN1/DER.h>
  12. #include <LibCrypto/PK/Code/EMSA_PKCS1_V1_5.h>
  13. #include <LibCrypto/PK/Code/EMSA_PSS.h>
  14. #include <LibTLS/TLSv12.h>
  15. namespace TLS {
  16. ssize_t TLSv12::handle_server_hello(ReadonlyBytes buffer, WritePacketStage& write_packets)
  17. {
  18. write_packets = WritePacketStage::Initial;
  19. if (m_context.connection_status != ConnectionStatus::Disconnected && m_context.connection_status != ConnectionStatus::Renegotiating) {
  20. dbgln("unexpected hello message");
  21. return (i8)Error::UnexpectedMessage;
  22. }
  23. ssize_t res = 0;
  24. size_t min_hello_size = 41;
  25. if (min_hello_size > buffer.size()) {
  26. dbgln("need more data");
  27. return (i8)Error::NeedMoreData;
  28. }
  29. size_t following_bytes = buffer[0] * 0x10000 + buffer[1] * 0x100 + buffer[2];
  30. res += 3;
  31. if (buffer.size() - res < following_bytes) {
  32. dbgln("not enough data after header: {} < {}", buffer.size() - res, following_bytes);
  33. return (i8)Error::NeedMoreData;
  34. }
  35. if (buffer.size() - res < 2) {
  36. dbgln("not enough data for version");
  37. return (i8)Error::NeedMoreData;
  38. }
  39. auto version = static_cast<Version>(AK::convert_between_host_and_network_endian(ByteReader::load16(buffer.offset_pointer(res))));
  40. res += 2;
  41. if (!supports_version(version))
  42. return (i8)Error::NotSafe;
  43. memcpy(m_context.remote_random, buffer.offset_pointer(res), sizeof(m_context.remote_random));
  44. res += sizeof(m_context.remote_random);
  45. u8 session_length = buffer[res++];
  46. if (buffer.size() - res < session_length) {
  47. dbgln("not enough data for session id");
  48. return (i8)Error::NeedMoreData;
  49. }
  50. if (session_length && session_length <= 32) {
  51. memcpy(m_context.session_id, buffer.offset_pointer(res), session_length);
  52. m_context.session_id_size = session_length;
  53. if constexpr (TLS_DEBUG) {
  54. dbgln("Remote session ID:");
  55. print_buffer(ReadonlyBytes { m_context.session_id, session_length });
  56. }
  57. } else {
  58. m_context.session_id_size = 0;
  59. }
  60. res += session_length;
  61. if (buffer.size() - res < 2) {
  62. dbgln("not enough data for cipher suite listing");
  63. return (i8)Error::NeedMoreData;
  64. }
  65. auto cipher = static_cast<CipherSuite>(AK::convert_between_host_and_network_endian(ByteReader::load16(buffer.offset_pointer(res))));
  66. res += 2;
  67. if (!supports_cipher(cipher)) {
  68. m_context.cipher = CipherSuite::Invalid;
  69. dbgln("No supported cipher could be agreed upon");
  70. return (i8)Error::NoCommonCipher;
  71. }
  72. m_context.cipher = cipher;
  73. dbgln_if(TLS_DEBUG, "Cipher: {}", (u16)cipher);
  74. // Simplification: We only support handshake hash functions via HMAC
  75. m_context.handshake_hash.initialize(hmac_hash());
  76. // Compression method
  77. if (buffer.size() - res < 1)
  78. return (i8)Error::NeedMoreData;
  79. u8 compression = buffer[res++];
  80. if (compression != 0)
  81. return (i8)Error::CompressionNotSupported;
  82. if (m_context.connection_status != ConnectionStatus::Renegotiating)
  83. m_context.connection_status = ConnectionStatus::Negotiating;
  84. if (m_context.is_server) {
  85. dbgln("unsupported: server mode");
  86. write_packets = WritePacketStage::ServerHandshake;
  87. }
  88. // Presence of extensions is determined by availability of bytes after compression_method
  89. if (buffer.size() - res >= 2) {
  90. auto extensions_bytes_total = AK::convert_between_host_and_network_endian(ByteReader::load16(buffer.offset_pointer(res += 2)));
  91. dbgln_if(TLS_DEBUG, "Extensions bytes total: {}", extensions_bytes_total);
  92. }
  93. while (buffer.size() - res >= 4) {
  94. auto extension_type = (HandshakeExtension)AK::convert_between_host_and_network_endian(ByteReader::load16(buffer.offset_pointer(res)));
  95. res += 2;
  96. u16 extension_length = AK::convert_between_host_and_network_endian(ByteReader::load16(buffer.offset_pointer(res)));
  97. res += 2;
  98. dbgln_if(TLS_DEBUG, "Extension {} with length {}", (u16)extension_type, extension_length);
  99. if (buffer.size() - res < extension_length)
  100. return (i8)Error::NeedMoreData;
  101. if (extension_type == HandshakeExtension::ServerName) {
  102. // RFC6066 section 3: SNI extension_data can be empty in the server hello
  103. if (extension_length > 0) {
  104. // ServerNameList total size
  105. if (buffer.size() - res < 2)
  106. return (i8)Error::NeedMoreData;
  107. auto sni_name_list_bytes = AK::convert_between_host_and_network_endian(ByteReader::load16(buffer.offset_pointer(res += 2)));
  108. dbgln_if(TLS_DEBUG, "SNI: expecting ServerNameList of {} bytes", sni_name_list_bytes);
  109. // Exactly one ServerName should be present
  110. if (buffer.size() - res < 3)
  111. return (i8)Error::NeedMoreData;
  112. auto sni_name_type = (NameType)(*(const u8*)buffer.offset_pointer(res++));
  113. auto sni_name_length = AK::convert_between_host_and_network_endian(ByteReader::load16(buffer.offset_pointer(res += 2)));
  114. if (sni_name_type != NameType::HostName)
  115. return (i8)Error::NotUnderstood;
  116. if (sizeof(sni_name_type) + sizeof(sni_name_length) + sni_name_length != sni_name_list_bytes)
  117. return (i8)Error::BrokenPacket;
  118. // Read out the host_name
  119. if (buffer.size() - res < sni_name_length)
  120. return (i8)Error::NeedMoreData;
  121. m_context.extensions.SNI = String { (const char*)buffer.offset_pointer(res), sni_name_length };
  122. res += sni_name_length;
  123. dbgln("SNI host_name: {}", m_context.extensions.SNI);
  124. }
  125. } else if (extension_type == HandshakeExtension::ApplicationLayerProtocolNegotiation && m_context.alpn.size()) {
  126. if (buffer.size() - res > 2) {
  127. auto alpn_length = AK::convert_between_host_and_network_endian(ByteReader::load16(buffer.offset_pointer(res)));
  128. if (alpn_length && alpn_length <= extension_length - 2) {
  129. const u8* alpn = buffer.offset_pointer(res + 2);
  130. size_t alpn_position = 0;
  131. while (alpn_position < alpn_length) {
  132. u8 alpn_size = alpn[alpn_position++];
  133. if (alpn_size + alpn_position >= extension_length)
  134. break;
  135. String alpn_str { (const char*)alpn + alpn_position, alpn_length };
  136. if (alpn_size && m_context.alpn.contains_slow(alpn_str)) {
  137. m_context.negotiated_alpn = alpn_str;
  138. dbgln("negotiated alpn: {}", alpn_str);
  139. break;
  140. }
  141. alpn_position += alpn_length;
  142. if (!m_context.is_server) // server hello must contain one ALPN
  143. break;
  144. }
  145. }
  146. }
  147. res += extension_length;
  148. } else if (extension_type == HandshakeExtension::SignatureAlgorithms) {
  149. dbgln("supported signatures: ");
  150. print_buffer(buffer.slice(res, extension_length));
  151. res += extension_length;
  152. // FIXME: what are we supposed to do here?
  153. } else if (extension_type == HandshakeExtension::ECPointFormats) {
  154. // RFC8422 section 5.2: A server that selects an ECC cipher suite in response to a ClientHello message
  155. // including a Supported Point Formats Extension appends this extension (along with others) to its
  156. // ServerHello message, enumerating the point formats it can parse. The Supported Point Formats Extension,
  157. // when used, MUST contain the value 0 (uncompressed) as one of the items in the list of point formats.
  158. //
  159. // The current implementation only supports uncompressed points, and the server is required to support
  160. // uncompressed points. Therefore, this extension can be safely ignored as it should always inform us
  161. // that the server supports uncompressed points.
  162. res += extension_length;
  163. } else {
  164. dbgln("Encountered unknown extension {} with length {}", (u16)extension_type, extension_length);
  165. res += extension_length;
  166. }
  167. }
  168. return res;
  169. }
  170. ssize_t TLSv12::handle_server_hello_done(ReadonlyBytes buffer)
  171. {
  172. if (buffer.size() < 3)
  173. return (i8)Error::NeedMoreData;
  174. size_t size = buffer[0] * 0x10000 + buffer[1] * 0x100 + buffer[2];
  175. if (buffer.size() - 3 < size)
  176. return (i8)Error::NeedMoreData;
  177. return size + 3;
  178. }
  179. ByteBuffer TLSv12::build_server_key_exchange()
  180. {
  181. dbgln("FIXME: build_server_key_exchange");
  182. return {};
  183. }
  184. ssize_t TLSv12::handle_server_key_exchange(ReadonlyBytes buffer)
  185. {
  186. switch (get_key_exchange_algorithm(m_context.cipher)) {
  187. case KeyExchangeAlgorithm::RSA:
  188. case KeyExchangeAlgorithm::DH_DSS:
  189. case KeyExchangeAlgorithm::DH_RSA:
  190. // RFC 5246 section 7.4.3. Server Key Exchange Message
  191. // It is not legal to send the server key exchange message for RSA, DH_DSS, DH_RSA
  192. dbgln("Server key exchange received for RSA, DH_DSS or DH_RSA is not legal");
  193. return (i8)Error::UnexpectedMessage;
  194. case KeyExchangeAlgorithm::DHE_DSS:
  195. dbgln("Server key exchange for DHE_DSS is not implemented");
  196. TODO();
  197. break;
  198. case KeyExchangeAlgorithm::DHE_RSA:
  199. return handle_dhe_rsa_server_key_exchange(buffer);
  200. case KeyExchangeAlgorithm::DH_anon:
  201. dbgln("Server key exchange for DH_anon is not implemented");
  202. TODO();
  203. break;
  204. case KeyExchangeAlgorithm::ECDHE_RSA:
  205. return handle_ecdhe_rsa_server_key_exchange(buffer);
  206. case KeyExchangeAlgorithm::ECDH_ECDSA:
  207. case KeyExchangeAlgorithm::ECDH_RSA:
  208. case KeyExchangeAlgorithm::ECDHE_ECDSA:
  209. case KeyExchangeAlgorithm::ECDH_anon:
  210. dbgln("Server key exchange for ECDHE algorithms is not implemented");
  211. TODO();
  212. break;
  213. default:
  214. dbgln("Unknown server key exchange algorithm");
  215. VERIFY_NOT_REACHED();
  216. break;
  217. }
  218. return 0;
  219. }
  220. ssize_t TLSv12::handle_dhe_rsa_server_key_exchange(ReadonlyBytes buffer)
  221. {
  222. auto dh_p_length = AK::convert_between_host_and_network_endian(ByteReader::load16(buffer.offset_pointer(3)));
  223. auto dh_p = buffer.slice(5, dh_p_length);
  224. auto p_result = ByteBuffer::copy(dh_p);
  225. if (p_result.is_error()) {
  226. dbgln("dhe_rsa_server_key_exchange failed: Not enough memory");
  227. return (i8)Error::OutOfMemory;
  228. }
  229. m_context.server_diffie_hellman_params.p = p_result.release_value();
  230. auto dh_g_length = AK::convert_between_host_and_network_endian(ByteReader::load16(buffer.offset_pointer(5 + dh_p_length)));
  231. auto dh_g = buffer.slice(7 + dh_p_length, dh_g_length);
  232. auto g_result = ByteBuffer::copy(dh_g);
  233. if (g_result.is_error()) {
  234. dbgln("dhe_rsa_server_key_exchange failed: Not enough memory");
  235. return (i8)Error::OutOfMemory;
  236. }
  237. m_context.server_diffie_hellman_params.g = g_result.release_value();
  238. auto dh_Ys_length = AK::convert_between_host_and_network_endian(ByteReader::load16(buffer.offset_pointer(7 + dh_p_length + dh_g_length)));
  239. auto dh_Ys = buffer.slice(9 + dh_p_length + dh_g_length, dh_Ys_length);
  240. auto Ys_result = ByteBuffer::copy(dh_Ys);
  241. if (Ys_result.is_error()) {
  242. dbgln("dhe_rsa_server_key_exchange failed: Not enough memory");
  243. return (i8)Error::OutOfMemory;
  244. }
  245. m_context.server_diffie_hellman_params.Ys = Ys_result.release_value();
  246. if constexpr (TLS_DEBUG) {
  247. dbgln("dh_p: {:hex-dump}", dh_p);
  248. dbgln("dh_g: {:hex-dump}", dh_g);
  249. dbgln("dh_Ys: {:hex-dump}", dh_Ys);
  250. }
  251. auto server_key_info = buffer.slice(3, 6 + dh_p_length + dh_g_length + dh_Ys_length);
  252. auto signature = buffer.slice(9 + dh_p_length + dh_g_length + dh_Ys_length);
  253. return verify_rsa_server_key_exchange(server_key_info, signature);
  254. }
  255. ssize_t TLSv12::handle_ecdhe_rsa_server_key_exchange(ReadonlyBytes buffer)
  256. {
  257. size_t size_required_for_curve_name = 6;
  258. if (buffer.size() < size_required_for_curve_name)
  259. return (i8)Error::NeedMoreData;
  260. auto curve_type = buffer[3];
  261. if (curve_type != (u8)ECCurveType::NamedCurve)
  262. return (i8)Error::NotUnderstood;
  263. auto curve = static_cast<NamedCurve>(AK::convert_between_host_and_network_endian(ByteReader::load16(buffer.offset_pointer(4))));
  264. if (!m_context.options.elliptic_curves.contains_slow(curve))
  265. return (i8)Error::NotUnderstood;
  266. m_context.server_curve_choice = curve;
  267. auto curve_key_size_bytes = named_curve_key_size(curve) / 8;
  268. if (buffer.size() < curve_key_size_bytes + 1)
  269. return (i8)Error::NeedMoreData;
  270. auto server_public_key_length = buffer[6];
  271. if (server_public_key_length != curve_key_size_bytes)
  272. return (i8)Error::FeatureNotSupported;
  273. auto server_public_key = buffer.slice(7, server_public_key_length);
  274. auto server_public_key_copy_result = ByteBuffer::copy(server_public_key);
  275. if (server_public_key_copy_result.is_error()) {
  276. dbgln("ecdhe_rsa_server_key_exchange failed: Not enough memory");
  277. return (i8)Error::OutOfMemory;
  278. }
  279. m_context.server_diffie_hellman_params.p = server_public_key_copy_result.release_value();
  280. if constexpr (TLS_DEBUG) {
  281. dbgln("ECDHE server public key: {:hex-dump}", server_public_key);
  282. }
  283. auto server_key_info = buffer.slice(3, 4 + server_public_key_length);
  284. auto signature = buffer.slice(7 + server_public_key_length);
  285. return verify_rsa_server_key_exchange(server_key_info, signature);
  286. }
  287. ssize_t TLSv12::verify_rsa_server_key_exchange(ReadonlyBytes server_key_info_buffer, ReadonlyBytes signature_buffer)
  288. {
  289. auto signature_hash = signature_buffer[0];
  290. auto signature_algorithm = signature_buffer[1];
  291. if (signature_algorithm != (u8)SignatureAlgorithm::RSA) {
  292. dbgln("verify_rsa_server_key_exchange failed: Signature algorithm is not RSA, instead {}", signature_algorithm);
  293. return (i8)Error::NotUnderstood;
  294. }
  295. auto signature_length = AK::convert_between_host_and_network_endian(ByteReader::load16(signature_buffer.offset_pointer(2)));
  296. auto signature = signature_buffer.slice(4, signature_length);
  297. if (m_context.certificates.is_empty()) {
  298. dbgln("verify_rsa_server_key_exchange failed: Attempting to verify signature without certificates");
  299. return (i8)Error::NotSafe;
  300. }
  301. auto certificate_public_key = m_context.certificates.first().public_key;
  302. Crypto::PK::RSAPrivateKey dummy_private_key;
  303. auto rsa = Crypto::PK::RSA(certificate_public_key, dummy_private_key);
  304. auto signature_verify_buffer_result = ByteBuffer::create_uninitialized(signature_length);
  305. if (signature_verify_buffer_result.is_error()) {
  306. dbgln("verify_rsa_server_key_exchange failed: Not enough memory");
  307. return (i8)Error::OutOfMemory;
  308. }
  309. auto signature_verify_buffer = signature_verify_buffer_result.release_value();
  310. auto signature_verify_bytes = signature_verify_buffer.bytes();
  311. rsa.verify(signature, signature_verify_bytes);
  312. auto message_result = ByteBuffer::create_uninitialized(64 + server_key_info_buffer.size());
  313. if (message_result.is_error()) {
  314. dbgln("verify_rsa_server_key_exchange failed: Not enough memory");
  315. return (i8)Error::OutOfMemory;
  316. }
  317. auto message = message_result.release_value();
  318. message.overwrite(0, m_context.local_random, 32);
  319. message.overwrite(32, m_context.remote_random, 32);
  320. message.overwrite(64, server_key_info_buffer.data(), server_key_info_buffer.size());
  321. Crypto::Hash::HashKind hash_kind;
  322. switch ((HashAlgorithm)signature_hash) {
  323. case HashAlgorithm::SHA1:
  324. hash_kind = Crypto::Hash::HashKind::SHA1;
  325. break;
  326. case HashAlgorithm::SHA256:
  327. hash_kind = Crypto::Hash::HashKind::SHA256;
  328. break;
  329. case HashAlgorithm::SHA384:
  330. hash_kind = Crypto::Hash::HashKind::SHA384;
  331. break;
  332. case HashAlgorithm::SHA512:
  333. hash_kind = Crypto::Hash::HashKind::SHA512;
  334. break;
  335. default:
  336. dbgln("verify_rsa_server_key_exchange failed: Hash algorithm is not SHA1/256/384/512, instead {}", signature_hash);
  337. return (i8)Error::NotUnderstood;
  338. }
  339. auto pkcs1 = Crypto::PK::EMSA_PKCS1_V1_5<Crypto::Hash::Manager>(hash_kind);
  340. auto verification = pkcs1.verify(message, signature_verify_bytes, signature_length * 8);
  341. if (verification == Crypto::VerificationConsistency::Inconsistent) {
  342. dbgln("verify_rsa_server_key_exchange failed: Verification of signature inconsistent");
  343. return (i8)Error::NotSafe;
  344. }
  345. return 0;
  346. }
  347. }