HandshakeServer.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531
  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/Curves/Ed25519.h>
  13. #include <LibCrypto/Curves/EllipticCurve.h>
  14. #include <LibCrypto/Curves/SECPxxxr1.h>
  15. #include <LibCrypto/Curves/X25519.h>
  16. #include <LibCrypto/Curves/X448.h>
  17. #include <LibCrypto/PK/Code/EMSA_PKCS1_V1_5.h>
  18. #include <LibCrypto/PK/Code/EMSA_PSS.h>
  19. #include <LibTLS/TLSv12.h>
  20. namespace TLS {
  21. ssize_t TLSv12::handle_server_hello(ReadonlyBytes buffer, WritePacketStage& write_packets)
  22. {
  23. write_packets = WritePacketStage::Initial;
  24. if (m_context.connection_status != ConnectionStatus::Disconnected && m_context.connection_status != ConnectionStatus::Renegotiating) {
  25. dbgln("unexpected hello message");
  26. return (i8)Error::UnexpectedMessage;
  27. }
  28. ssize_t res = 0;
  29. size_t min_hello_size = 41;
  30. if (min_hello_size > buffer.size()) {
  31. dbgln("need more data");
  32. return (i8)Error::NeedMoreData;
  33. }
  34. size_t following_bytes = buffer[0] * 0x10000 + buffer[1] * 0x100 + buffer[2];
  35. res += 3;
  36. if (buffer.size() - res < following_bytes) {
  37. dbgln("not enough data after header: {} < {}", buffer.size() - res, following_bytes);
  38. return (i8)Error::NeedMoreData;
  39. }
  40. if (buffer.size() - res < 2) {
  41. dbgln("not enough data for version");
  42. return (i8)Error::NeedMoreData;
  43. }
  44. auto version = static_cast<ProtocolVersion>(AK::convert_between_host_and_network_endian(ByteReader::load16(buffer.offset_pointer(res))));
  45. res += 2;
  46. if (!supports_version(version))
  47. return (i8)Error::NotSafe;
  48. memcpy(m_context.remote_random, buffer.offset_pointer(res), sizeof(m_context.remote_random));
  49. res += sizeof(m_context.remote_random);
  50. u8 session_length = buffer[res++];
  51. if (buffer.size() - res < session_length) {
  52. dbgln("not enough data for session id");
  53. return (i8)Error::NeedMoreData;
  54. }
  55. if (session_length && session_length <= 32) {
  56. memcpy(m_context.session_id, buffer.offset_pointer(res), session_length);
  57. m_context.session_id_size = session_length;
  58. if constexpr (TLS_DEBUG) {
  59. dbgln("Remote session ID:");
  60. print_buffer(ReadonlyBytes { m_context.session_id, session_length });
  61. }
  62. } else {
  63. m_context.session_id_size = 0;
  64. }
  65. res += session_length;
  66. if (buffer.size() - res < 2) {
  67. dbgln("not enough data for cipher suite listing");
  68. return (i8)Error::NeedMoreData;
  69. }
  70. auto cipher = static_cast<CipherSuite>(AK::convert_between_host_and_network_endian(ByteReader::load16(buffer.offset_pointer(res))));
  71. res += 2;
  72. if (!supports_cipher(cipher)) {
  73. m_context.cipher = CipherSuite::TLS_NULL_WITH_NULL_NULL;
  74. dbgln("No supported cipher could be agreed upon");
  75. return (i8)Error::NoCommonCipher;
  76. }
  77. m_context.cipher = cipher;
  78. dbgln_if(TLS_DEBUG, "Cipher: {}", enum_to_string(cipher));
  79. // Simplification: We only support handshake hash functions via HMAC
  80. m_context.handshake_hash.initialize(hmac_hash());
  81. // Compression method
  82. if (buffer.size() - res < 1)
  83. return (i8)Error::NeedMoreData;
  84. u8 compression = buffer[res++];
  85. if (compression != 0)
  86. return (i8)Error::CompressionNotSupported;
  87. if (m_context.connection_status != ConnectionStatus::Renegotiating)
  88. m_context.connection_status = ConnectionStatus::Negotiating;
  89. if (m_context.is_server) {
  90. dbgln("unsupported: server mode");
  91. write_packets = WritePacketStage::ServerHandshake;
  92. }
  93. // Presence of extensions is determined by availability of bytes after compression_method
  94. if (buffer.size() - res >= 2) {
  95. auto extensions_bytes_total = AK::convert_between_host_and_network_endian(ByteReader::load16(buffer.offset_pointer(res += 2)));
  96. dbgln_if(TLS_DEBUG, "Extensions bytes total: {}", extensions_bytes_total);
  97. }
  98. while (buffer.size() - res >= 4) {
  99. auto extension_type = (ExtensionType)AK::convert_between_host_and_network_endian(ByteReader::load16(buffer.offset_pointer(res)));
  100. res += 2;
  101. u16 extension_length = AK::convert_between_host_and_network_endian(ByteReader::load16(buffer.offset_pointer(res)));
  102. res += 2;
  103. dbgln_if(TLS_DEBUG, "Extension {} with length {}", enum_to_string(extension_type), extension_length);
  104. if (buffer.size() - res < extension_length)
  105. return (i8)Error::NeedMoreData;
  106. if (extension_type == ExtensionType::SERVER_NAME) {
  107. // RFC6066 section 3: SNI extension_data can be empty in the server hello
  108. if (extension_length > 0) {
  109. // ServerNameList total size
  110. if (buffer.size() - res < 2)
  111. return (i8)Error::NeedMoreData;
  112. auto sni_name_list_bytes = AK::convert_between_host_and_network_endian(ByteReader::load16(buffer.offset_pointer(res += 2)));
  113. dbgln_if(TLS_DEBUG, "SNI: expecting ServerNameList of {} bytes", sni_name_list_bytes);
  114. // Exactly one ServerName should be present
  115. if (buffer.size() - res < 3)
  116. return (i8)Error::NeedMoreData;
  117. auto sni_name_type = (NameType)(*(u8 const*)buffer.offset_pointer(res++));
  118. auto sni_name_length = AK::convert_between_host_and_network_endian(ByteReader::load16(buffer.offset_pointer(res += 2)));
  119. if (sni_name_type != NameType::HOST_NAME)
  120. return (i8)Error::NotUnderstood;
  121. if (sizeof(sni_name_type) + sizeof(sni_name_length) + sni_name_length != sni_name_list_bytes)
  122. return (i8)Error::BrokenPacket;
  123. // Read out the host_name
  124. if (buffer.size() - res < sni_name_length)
  125. return (i8)Error::NeedMoreData;
  126. m_context.extensions.SNI = ByteString { (char const*)buffer.offset_pointer(res), sni_name_length };
  127. res += sni_name_length;
  128. dbgln("SNI host_name: {}", m_context.extensions.SNI);
  129. }
  130. } else if (extension_type == ExtensionType::APPLICATION_LAYER_PROTOCOL_NEGOTIATION && m_context.alpn.size()) {
  131. if (buffer.size() - res > 2) {
  132. auto alpn_length = AK::convert_between_host_and_network_endian(ByteReader::load16(buffer.offset_pointer(res)));
  133. if (alpn_length && alpn_length <= extension_length - 2) {
  134. u8 const* alpn = buffer.offset_pointer(res + 2);
  135. size_t alpn_position = 0;
  136. while (alpn_position < alpn_length) {
  137. u8 alpn_size = alpn[alpn_position++];
  138. if (alpn_size + alpn_position >= extension_length)
  139. break;
  140. ByteString alpn_str { (char const*)alpn + alpn_position, alpn_length };
  141. if (alpn_size && m_context.alpn.contains_slow(alpn_str)) {
  142. m_context.negotiated_alpn = alpn_str;
  143. dbgln("negotiated alpn: {}", alpn_str);
  144. break;
  145. }
  146. alpn_position += alpn_length;
  147. if (!m_context.is_server) // server hello must contain one ALPN
  148. break;
  149. }
  150. }
  151. }
  152. res += extension_length;
  153. } else if (extension_type == ExtensionType::SIGNATURE_ALGORITHMS) {
  154. dbgln("supported signatures: ");
  155. print_buffer(buffer.slice(res, extension_length));
  156. res += extension_length;
  157. // FIXME: what are we supposed to do here?
  158. } else if (extension_type == ExtensionType::EC_POINT_FORMATS) {
  159. // RFC8422 section 5.2: A server that selects an ECC cipher suite in response to a ClientHello message
  160. // including a Supported Point Formats Extension appends this extension (along with others) to its
  161. // ServerHello message, enumerating the point formats it can parse. The Supported Point Formats Extension,
  162. // when used, MUST contain the value 0 (uncompressed) as one of the items in the list of point formats.
  163. //
  164. // The current implementation only supports uncompressed points, and the server is required to support
  165. // uncompressed points. Therefore, this extension can be safely ignored as it should always inform us
  166. // that the server supports uncompressed points.
  167. res += extension_length;
  168. } else if (extension_type == ExtensionType::EXTENDED_MASTER_SECRET) {
  169. m_context.extensions.extended_master_secret = true;
  170. res += extension_length;
  171. } else {
  172. dbgln("Encountered unknown extension {} with length {}", enum_to_string(extension_type), extension_length);
  173. res += extension_length;
  174. }
  175. }
  176. return res;
  177. }
  178. ssize_t TLSv12::handle_server_hello_done(ReadonlyBytes buffer)
  179. {
  180. if (buffer.size() < 3)
  181. return (i8)Error::NeedMoreData;
  182. size_t size = buffer[0] * 0x10000 + buffer[1] * 0x100 + buffer[2];
  183. if (buffer.size() - 3 < size)
  184. return (i8)Error::NeedMoreData;
  185. return size + 3;
  186. }
  187. ByteBuffer TLSv12::build_server_key_exchange()
  188. {
  189. dbgln("FIXME: build_server_key_exchange");
  190. return {};
  191. }
  192. ssize_t TLSv12::handle_server_key_exchange(ReadonlyBytes buffer)
  193. {
  194. switch (get_key_exchange_algorithm(m_context.cipher)) {
  195. case KeyExchangeAlgorithm::RSA:
  196. case KeyExchangeAlgorithm::DH_DSS:
  197. case KeyExchangeAlgorithm::DH_RSA:
  198. // RFC 5246 section 7.4.3. Server Key Exchange Message
  199. // It is not legal to send the server key exchange message for RSA, DH_DSS, DH_RSA
  200. dbgln("Server key exchange received for RSA, DH_DSS or DH_RSA is not legal");
  201. return (i8)Error::UnexpectedMessage;
  202. case KeyExchangeAlgorithm::DHE_DSS:
  203. dbgln("Server key exchange for DHE_DSS is not implemented");
  204. TODO();
  205. break;
  206. case KeyExchangeAlgorithm::DHE_RSA:
  207. return handle_dhe_rsa_server_key_exchange(buffer);
  208. case KeyExchangeAlgorithm::DH_anon:
  209. dbgln("Server key exchange for DH_anon is not implemented");
  210. TODO();
  211. break;
  212. case KeyExchangeAlgorithm::ECDHE_RSA:
  213. return handle_ecdhe_rsa_server_key_exchange(buffer);
  214. case KeyExchangeAlgorithm::ECDHE_ECDSA:
  215. return handle_ecdhe_ecdsa_server_key_exchange(buffer);
  216. case KeyExchangeAlgorithm::ECDH_ECDSA:
  217. case KeyExchangeAlgorithm::ECDH_RSA:
  218. case KeyExchangeAlgorithm::ECDH_anon:
  219. dbgln("Server key exchange for ECDHE algorithms is not implemented");
  220. TODO();
  221. break;
  222. default:
  223. dbgln("Unknown server key exchange algorithm");
  224. VERIFY_NOT_REACHED();
  225. break;
  226. }
  227. return 0;
  228. }
  229. ssize_t TLSv12::handle_dhe_rsa_server_key_exchange(ReadonlyBytes buffer)
  230. {
  231. auto dh_p_length = AK::convert_between_host_and_network_endian(ByteReader::load16(buffer.offset_pointer(3)));
  232. auto dh_p = buffer.slice(5, dh_p_length);
  233. auto p_result = ByteBuffer::copy(dh_p);
  234. if (p_result.is_error()) {
  235. dbgln("dhe_rsa_server_key_exchange failed: Not enough memory");
  236. return (i8)Error::OutOfMemory;
  237. }
  238. m_context.server_diffie_hellman_params.p = p_result.release_value();
  239. auto dh_g_length = AK::convert_between_host_and_network_endian(ByteReader::load16(buffer.offset_pointer(5 + dh_p_length)));
  240. auto dh_g = buffer.slice(7 + dh_p_length, dh_g_length);
  241. auto g_result = ByteBuffer::copy(dh_g);
  242. if (g_result.is_error()) {
  243. dbgln("dhe_rsa_server_key_exchange failed: Not enough memory");
  244. return (i8)Error::OutOfMemory;
  245. }
  246. m_context.server_diffie_hellman_params.g = g_result.release_value();
  247. auto dh_Ys_length = AK::convert_between_host_and_network_endian(ByteReader::load16(buffer.offset_pointer(7 + dh_p_length + dh_g_length)));
  248. auto dh_Ys = buffer.slice(9 + dh_p_length + dh_g_length, dh_Ys_length);
  249. auto Ys_result = ByteBuffer::copy(dh_Ys);
  250. if (Ys_result.is_error()) {
  251. dbgln("dhe_rsa_server_key_exchange failed: Not enough memory");
  252. return (i8)Error::OutOfMemory;
  253. }
  254. m_context.server_diffie_hellman_params.Ys = Ys_result.release_value();
  255. if constexpr (TLS_DEBUG) {
  256. dbgln("dh_p: {:hex-dump}", dh_p);
  257. dbgln("dh_g: {:hex-dump}", dh_g);
  258. dbgln("dh_Ys: {:hex-dump}", dh_Ys);
  259. }
  260. auto server_key_info = buffer.slice(3, 6 + dh_p_length + dh_g_length + dh_Ys_length);
  261. auto signature = buffer.slice(9 + dh_p_length + dh_g_length + dh_Ys_length);
  262. return verify_rsa_server_key_exchange(server_key_info, signature);
  263. }
  264. ssize_t TLSv12::handle_ecdhe_server_key_exchange(ReadonlyBytes buffer, u8& server_public_key_length)
  265. {
  266. if (buffer.size() < 7)
  267. return (i8)Error::NeedMoreData;
  268. auto curve_type = buffer[3];
  269. if (curve_type != (u8)ECCurveType::NAMED_CURVE)
  270. return (i8)Error::NotUnderstood;
  271. auto curve = static_cast<SupportedGroup>(AK::convert_between_host_and_network_endian(ByteReader::load16(buffer.offset_pointer(4))));
  272. if (!m_context.options.elliptic_curves.contains_slow(curve))
  273. return (i8)Error::NotUnderstood;
  274. switch ((SupportedGroup)curve) {
  275. case SupportedGroup::X25519:
  276. m_context.server_key_exchange_curve = make<Crypto::Curves::X25519>();
  277. break;
  278. case SupportedGroup::X448:
  279. m_context.server_key_exchange_curve = make<Crypto::Curves::X448>();
  280. break;
  281. case SupportedGroup::SECP256R1:
  282. m_context.server_key_exchange_curve = make<Crypto::Curves::SECP256r1>();
  283. break;
  284. case SupportedGroup::SECP384R1:
  285. m_context.server_key_exchange_curve = make<Crypto::Curves::SECP384r1>();
  286. break;
  287. default:
  288. return (i8)Error::NotUnderstood;
  289. }
  290. server_public_key_length = buffer[6];
  291. if (server_public_key_length != m_context.server_key_exchange_curve->key_size())
  292. return (i8)Error::NotUnderstood;
  293. if (buffer.size() < 7u + server_public_key_length)
  294. return (i8)Error::NeedMoreData;
  295. auto server_public_key = buffer.slice(7, server_public_key_length);
  296. auto server_public_key_copy_result = ByteBuffer::copy(server_public_key);
  297. if (server_public_key_copy_result.is_error()) {
  298. dbgln("ecdhe_rsa_server_key_exchange failed: Not enough memory");
  299. return (i8)Error::OutOfMemory;
  300. }
  301. m_context.server_diffie_hellman_params.p = server_public_key_copy_result.release_value();
  302. if constexpr (TLS_DEBUG) {
  303. dbgln("ECDHE server public key: {:hex-dump}", server_public_key);
  304. }
  305. return 0;
  306. }
  307. ssize_t TLSv12::handle_ecdhe_rsa_server_key_exchange(ReadonlyBytes buffer)
  308. {
  309. u8 server_public_key_length;
  310. if (auto result = handle_ecdhe_server_key_exchange(buffer, server_public_key_length)) {
  311. return result;
  312. }
  313. auto server_key_info = buffer.slice(3, 4 + server_public_key_length);
  314. auto signature = buffer.slice(7 + server_public_key_length);
  315. return verify_rsa_server_key_exchange(server_key_info, signature);
  316. }
  317. ssize_t TLSv12::verify_rsa_server_key_exchange(ReadonlyBytes server_key_info_buffer, ReadonlyBytes signature_buffer)
  318. {
  319. auto signature_hash = signature_buffer[0];
  320. auto signature_algorithm = static_cast<SignatureAlgorithm>(signature_buffer[1]);
  321. if (signature_algorithm != SignatureAlgorithm::RSA) {
  322. dbgln("verify_rsa_server_key_exchange failed: Signature algorithm is not RSA, instead {}", enum_to_string(signature_algorithm));
  323. return (i8)Error::NotUnderstood;
  324. }
  325. auto signature_length = AK::convert_between_host_and_network_endian(ByteReader::load16(signature_buffer.offset_pointer(2)));
  326. auto signature = signature_buffer.slice(4, signature_length);
  327. if (m_context.certificates.is_empty()) {
  328. dbgln("verify_rsa_server_key_exchange failed: Attempting to verify signature without certificates");
  329. return (i8)Error::NotSafe;
  330. }
  331. // RFC5246 section 7.4.2: The sender's certificate MUST come first in the list.
  332. auto certificate_public_key = m_context.certificates.first().public_key;
  333. Crypto::PK::RSAPrivateKey dummy_private_key;
  334. auto rsa = Crypto::PK::RSA(certificate_public_key.rsa, dummy_private_key);
  335. auto signature_verify_buffer_result = ByteBuffer::create_uninitialized(signature_length);
  336. if (signature_verify_buffer_result.is_error()) {
  337. dbgln("verify_rsa_server_key_exchange failed: Not enough memory");
  338. return (i8)Error::OutOfMemory;
  339. }
  340. auto signature_verify_buffer = signature_verify_buffer_result.release_value();
  341. auto signature_verify_bytes = signature_verify_buffer.bytes();
  342. rsa.verify(signature, signature_verify_bytes);
  343. auto message_result = ByteBuffer::create_uninitialized(64 + server_key_info_buffer.size());
  344. if (message_result.is_error()) {
  345. dbgln("verify_rsa_server_key_exchange failed: Not enough memory");
  346. return (i8)Error::OutOfMemory;
  347. }
  348. auto message = message_result.release_value();
  349. message.overwrite(0, m_context.local_random, 32);
  350. message.overwrite(32, m_context.remote_random, 32);
  351. message.overwrite(64, server_key_info_buffer.data(), server_key_info_buffer.size());
  352. Crypto::Hash::HashKind hash_kind;
  353. switch ((HashAlgorithm)signature_hash) {
  354. case HashAlgorithm::SHA1:
  355. hash_kind = Crypto::Hash::HashKind::SHA1;
  356. break;
  357. case HashAlgorithm::SHA256:
  358. hash_kind = Crypto::Hash::HashKind::SHA256;
  359. break;
  360. case HashAlgorithm::SHA384:
  361. hash_kind = Crypto::Hash::HashKind::SHA384;
  362. break;
  363. case HashAlgorithm::SHA512:
  364. hash_kind = Crypto::Hash::HashKind::SHA512;
  365. break;
  366. default:
  367. dbgln("verify_rsa_server_key_exchange failed: Hash algorithm is not SHA1/256/384/512, instead {}", signature_hash);
  368. return (i8)Error::NotUnderstood;
  369. }
  370. auto pkcs1 = Crypto::PK::EMSA_PKCS1_V1_5<Crypto::Hash::Manager>(hash_kind);
  371. auto verification = pkcs1.verify(message, signature_verify_bytes, signature_length * 8);
  372. if (verification == Crypto::VerificationConsistency::Inconsistent) {
  373. dbgln("verify_rsa_server_key_exchange failed: Verification of signature inconsistent");
  374. return (i8)Error::NotSafe;
  375. }
  376. return 0;
  377. }
  378. ssize_t TLSv12::handle_ecdhe_ecdsa_server_key_exchange(ReadonlyBytes buffer)
  379. {
  380. u8 server_public_key_length;
  381. if (auto result = handle_ecdhe_server_key_exchange(buffer, server_public_key_length)) {
  382. return result;
  383. }
  384. auto server_key_info = buffer.slice(3, 4 + server_public_key_length);
  385. auto signature = buffer.slice(7 + server_public_key_length);
  386. return verify_ecdsa_server_key_exchange(server_key_info, signature);
  387. }
  388. ssize_t TLSv12::verify_ecdsa_server_key_exchange(ReadonlyBytes server_key_info_buffer, ReadonlyBytes signature_buffer)
  389. {
  390. auto signature_hash = signature_buffer[0];
  391. auto signature_algorithm = signature_buffer[1];
  392. if (signature_algorithm != (u8)SignatureAlgorithm::ECDSA) {
  393. dbgln("verify_ecdsa_server_key_exchange failed: Signature algorithm is not ECDSA, instead {}", signature_algorithm);
  394. return (i8)Error::NotUnderstood;
  395. }
  396. auto signature_length = AK::convert_between_host_and_network_endian(ByteReader::load16(signature_buffer.offset_pointer(2)));
  397. auto signature = signature_buffer.slice(4, signature_length);
  398. if (m_context.certificates.is_empty()) {
  399. dbgln("verify_ecdsa_server_key_exchange failed: Attempting to verify signature without certificates");
  400. return (i8)Error::NotSafe;
  401. }
  402. ReadonlyBytes server_point = m_context.certificates.first().public_key.raw_key;
  403. auto message_result = ByteBuffer::create_uninitialized(64 + server_key_info_buffer.size());
  404. if (message_result.is_error()) {
  405. dbgln("verify_ecdsa_server_key_exchange failed: Not enough memory");
  406. return (i8)Error::OutOfMemory;
  407. }
  408. auto message = message_result.release_value();
  409. message.overwrite(0, m_context.local_random, 32);
  410. message.overwrite(32, m_context.remote_random, 32);
  411. message.overwrite(64, server_key_info_buffer.data(), server_key_info_buffer.size());
  412. Crypto::Hash::HashKind hash_kind;
  413. switch ((HashAlgorithm)signature_hash) {
  414. case HashAlgorithm::SHA256:
  415. hash_kind = Crypto::Hash::HashKind::SHA256;
  416. break;
  417. case HashAlgorithm::SHA384:
  418. hash_kind = Crypto::Hash::HashKind::SHA384;
  419. break;
  420. case HashAlgorithm::SHA512:
  421. hash_kind = Crypto::Hash::HashKind::SHA512;
  422. break;
  423. default:
  424. dbgln("verify_ecdsa_server_key_exchange failed: Hash algorithm is not SHA256/384/512, instead {}", signature_hash);
  425. return (i8)Error::NotUnderstood;
  426. }
  427. ErrorOr<bool> res = AK::Error::from_errno(ENOTSUP);
  428. auto& public_key = m_context.certificates.first().public_key;
  429. switch (public_key.algorithm.ec_parameters) {
  430. case SupportedGroup::SECP256R1: {
  431. Crypto::Hash::Manager manager(hash_kind);
  432. manager.update(message);
  433. auto digest = manager.digest();
  434. Crypto::Curves::SECP256r1 curve;
  435. res = curve.verify(digest.bytes(), server_point, signature);
  436. break;
  437. }
  438. case SupportedGroup::SECP384R1: {
  439. Crypto::Hash::Manager manager(hash_kind);
  440. manager.update(message);
  441. auto digest = manager.digest();
  442. Crypto::Curves::SECP384r1 curve;
  443. res = curve.verify(digest.bytes(), server_point, signature);
  444. break;
  445. }
  446. default: {
  447. dbgln("verify_ecdsa_server_key_exchange failed: Server certificate public key algorithm is not supported: {}", to_underlying(public_key.algorithm.ec_parameters));
  448. break;
  449. }
  450. }
  451. if (res.is_error()) {
  452. dbgln("verify_ecdsa_server_key_exchange failed: {}", res.error());
  453. return (i8)Error::NotUnderstood;
  454. }
  455. bool verification_ok = res.release_value();
  456. if (!verification_ok) {
  457. dbgln("verify_ecdsa_server_key_exchange failed: Verification of signature failed");
  458. return (i8)Error::NotSafe;
  459. }
  460. return 0;
  461. }
  462. }