TLSv12.cpp 63 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852
  1. /*
  2. * Copyright (c) 2020, Ali Mohammad Pur <ali.mpfard@gmail.com>
  3. * All rights reserved.
  4. *
  5. * Redistribution and use in source and binary forms, with or without
  6. * modification, are permitted provided that the following conditions are met:
  7. *
  8. * 1. Redistributions of source code must retain the above copyright notice, this
  9. * list of conditions and the following disclaimer.
  10. *
  11. * 2. Redistributions in binary form must reproduce the above copyright notice,
  12. * this list of conditions and the following disclaimer in the documentation
  13. * and/or other materials provided with the distribution.
  14. *
  15. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  16. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  17. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  18. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  19. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  20. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  21. * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  22. * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  23. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  24. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  25. */
  26. #include <LibCore/Timer.h>
  27. #include <LibCrypto/ASN1/DER.h>
  28. #include <LibCrypto/PK/Code/EMSA_PSS.h>
  29. #include <LibTLS/TLSv12.h>
  30. //#define TLS_DEBUG
  31. namespace {
  32. inline static void print_buffer(const ByteBuffer& buffer)
  33. {
  34. for (size_t i { 0 }; i < buffer.size(); ++i)
  35. dbgprintf("%02x ", buffer[i]);
  36. dbgprintf("\n");
  37. }
  38. inline static void print_buffer(const u8* buffer, size_t size)
  39. {
  40. for (size_t i { 0 }; i < size; ++i)
  41. dbgprintf("%02x ", buffer[i]);
  42. dbgprintf("\n");
  43. }
  44. }
  45. using namespace Crypto;
  46. namespace {
  47. struct OIDChain {
  48. void* root;
  49. u8* oid;
  50. };
  51. }
  52. namespace TLS {
  53. // "for now" q&d implementation of ASN1
  54. namespace {
  55. static bool _asn1_is_field_present(const u32* fields, const u32* prefix)
  56. {
  57. size_t i = 0;
  58. while (prefix[i]) {
  59. if (fields[i] != prefix[i])
  60. return false;
  61. ++i;
  62. }
  63. return true;
  64. }
  65. static bool _asn1_is_oid(const u8* oid, const u8* compare, size_t length = 3)
  66. {
  67. size_t i = 0;
  68. while (oid[i] && i < length) {
  69. if (oid[i] != compare[i])
  70. return false;
  71. ++i;
  72. }
  73. return true;
  74. }
  75. static void _set_algorithm(u32&, const u8* value, size_t length)
  76. {
  77. if (length != 9) {
  78. dbg() << "unsupported algorithm " << value;
  79. }
  80. dbg() << "FIXME: Set algorithm";
  81. }
  82. static size_t _get_asn1_length(const u8* buffer, size_t length, size_t& octets)
  83. {
  84. octets = 0;
  85. if (length < 1)
  86. return 0;
  87. u8 size = buffer[0];
  88. if (size & 0x80) {
  89. octets = size & 0x7f;
  90. if (octets > length - 1) {
  91. return 0;
  92. }
  93. auto reference_octets = octets;
  94. if (octets > 4)
  95. reference_octets = 4;
  96. size_t long_size = 0, coeff = 1;
  97. for (auto i = reference_octets; i > 0; --i) {
  98. long_size += buffer[i] * coeff;
  99. coeff *= 0x100;
  100. }
  101. ++octets;
  102. return long_size;
  103. }
  104. ++octets;
  105. return size;
  106. }
  107. static ssize_t _parse_asn1(Context& context, Certificate& cert, const u8* buffer, size_t size, int level, u32* fields, u8* has_key, int client_cert, u8* root_oid, OIDChain* chain)
  108. {
  109. OIDChain local_chain;
  110. local_chain.root = chain;
  111. size_t position = 0;
  112. // parse DER...again
  113. size_t index = 0;
  114. u8 oid[16] { 0 };
  115. local_chain.oid = oid;
  116. if (has_key)
  117. *has_key = 0;
  118. u8 local_has_key = 0;
  119. const u8* cert_data = nullptr;
  120. size_t cert_length = 0;
  121. while (position < size) {
  122. size_t start_position = position;
  123. if (size - position < 2) {
  124. dbg() << "not enough data for certificate size";
  125. return (i8)Error::NeedMoreData;
  126. }
  127. u8 first = buffer[position++];
  128. u8 type = first & 0x1f;
  129. u8 constructed = first & 0x20;
  130. size_t octets = 0;
  131. u32 temp;
  132. index++;
  133. if (level <= 0xff)
  134. fields[level - 1] = index;
  135. size_t length = _get_asn1_length((const u8*)&buffer[position], size - position, octets);
  136. if (octets > 4 || octets > size - position) {
  137. dbg() << "could not read the certificate";
  138. return position;
  139. }
  140. position += octets;
  141. if (size - position < length) {
  142. dbg() << "not enough data for sequence";
  143. return (i8)Error::NeedMoreData;
  144. }
  145. if (length && constructed) {
  146. switch (type) {
  147. case 0x03:
  148. break;
  149. case 0x10:
  150. if (level == 2 && index == 1) {
  151. cert_length = length + position - start_position;
  152. cert_data = buffer + start_position;
  153. }
  154. // public key data
  155. if (!cert.version && _asn1_is_field_present(fields, Constants::priv_der_id)) {
  156. temp = length + position - start_position;
  157. if (cert.der.size() < temp) {
  158. cert.der.grow(temp);
  159. } else {
  160. cert.der.trim(temp);
  161. }
  162. cert.der.overwrite(0, buffer + start_position, temp);
  163. }
  164. break;
  165. default:
  166. break;
  167. }
  168. local_has_key = false;
  169. _parse_asn1(context, cert, buffer + position, length, level + 1, fields, &local_has_key, client_cert, root_oid, &local_chain);
  170. if ((local_has_key && (!context.is_server || client_cert)) || (client_cert || _asn1_is_field_present(fields, Constants::pk_id))) {
  171. temp = length + position - start_position;
  172. if (cert.der.size() < temp) {
  173. cert.der.grow(temp);
  174. } else {
  175. cert.der.trim(temp);
  176. }
  177. cert.der.overwrite(0, buffer + start_position, temp);
  178. }
  179. } else {
  180. switch (type) {
  181. case 0x00:
  182. return position;
  183. break;
  184. case 0x01:
  185. temp = buffer[position];
  186. break;
  187. case 0x02:
  188. if (_asn1_is_field_present(fields, Constants::pk_id)) {
  189. if (has_key)
  190. *has_key = true;
  191. if (index == 1)
  192. cert.public_key.set(
  193. Crypto::UnsignedBigInteger::import_data(buffer + position, length),
  194. cert.public_key.public_exponent());
  195. else if (index == 2)
  196. cert.public_key.set(
  197. cert.public_key.modulus(),
  198. Crypto::UnsignedBigInteger::import_data(buffer + position, length));
  199. } else if (_asn1_is_field_present(fields, Constants::serial_id)) {
  200. cert.serial_number = Crypto::UnsignedBigInteger::import_data(buffer + position, length);
  201. }
  202. if (_asn1_is_field_present(fields, Constants::version_id)) {
  203. if (length == 1)
  204. cert.version = buffer[position];
  205. }
  206. // print_buffer(ByteBuffer::wrap(buffer + position, length));
  207. break;
  208. case 0x03:
  209. if (_asn1_is_field_present(fields, Constants::pk_id)) {
  210. if (has_key)
  211. *has_key = true;
  212. }
  213. if (_asn1_is_field_present(fields, Constants::sign_id)) {
  214. auto* value = buffer + position;
  215. auto len = length;
  216. if (!value[0] && len % 2) {
  217. ++value;
  218. --len;
  219. }
  220. cert.sign_key = ByteBuffer::copy(value, len);
  221. } else {
  222. if (buffer[position] == 0 && length > 256) {
  223. _parse_asn1(context, cert, buffer + position + 1, length - 1, level + 1, fields, &local_has_key, client_cert, root_oid, &local_chain);
  224. } else {
  225. _parse_asn1(context, cert, buffer + position, length, level + 1, fields, &local_has_key, client_cert, root_oid, &local_chain);
  226. }
  227. }
  228. break;
  229. case 0x04:
  230. _parse_asn1(context, cert, buffer + position, length, level + 1, fields, &local_has_key, client_cert, root_oid, &local_chain);
  231. break;
  232. case 0x05:
  233. break;
  234. case 0x06:
  235. if (_asn1_is_field_present(fields, Constants::pk_id)) {
  236. _set_algorithm(cert.key_algorithm, buffer + position, length);
  237. }
  238. if (_asn1_is_field_present(fields, Constants::algorithm_id)) {
  239. _set_algorithm(cert.algorithm, buffer + position, length);
  240. }
  241. if (length < 16)
  242. memcpy(oid, buffer + position, length);
  243. else
  244. memcpy(oid, buffer + position, 16);
  245. if (root_oid)
  246. memcpy(root_oid, oid, 16);
  247. break;
  248. case 0x09:
  249. break;
  250. case 0x17:
  251. case 0x018:
  252. // time
  253. // ignore
  254. break;
  255. case 0x013:
  256. case 0x0c:
  257. case 0x14:
  258. case 0x15:
  259. case 0x16:
  260. case 0x19:
  261. case 0x1a:
  262. case 0x1b:
  263. case 0x1c:
  264. case 0x1d:
  265. case 0x1e:
  266. // printable string and such
  267. if (_asn1_is_field_present(fields, Constants::issurer_id)) {
  268. if (_asn1_is_oid(oid, Constants::country_oid)) {
  269. cert.issuer_country = String { (const char*)buffer + position, length };
  270. } else if (_asn1_is_oid(oid, Constants::state_oid)) {
  271. cert.issuer_state = String { (const char*)buffer + position, length };
  272. } else if (_asn1_is_oid(oid, Constants::location_oid)) {
  273. cert.issuer_location = String { (const char*)buffer + position, length };
  274. } else if (_asn1_is_oid(oid, Constants::entity_oid)) {
  275. cert.issuer_entity = String { (const char*)buffer + position, length };
  276. } else if (_asn1_is_oid(oid, Constants::subject_oid)) {
  277. cert.issuer_subject = String { (const char*)buffer + position, length };
  278. }
  279. } else if (_asn1_is_field_present(fields, Constants::owner_id)) {
  280. if (_asn1_is_oid(oid, Constants::country_oid)) {
  281. cert.country = String { (const char*)buffer + position, length };
  282. } else if (_asn1_is_oid(oid, Constants::state_oid)) {
  283. cert.state = String { (const char*)buffer + position, length };
  284. } else if (_asn1_is_oid(oid, Constants::location_oid)) {
  285. cert.location = String { (const char*)buffer + position, length };
  286. } else if (_asn1_is_oid(oid, Constants::entity_oid)) {
  287. cert.entity = String { (const char*)buffer + position, length };
  288. } else if (_asn1_is_oid(oid, Constants::subject_oid)) {
  289. cert.subject = String { (const char*)buffer + position, length };
  290. }
  291. }
  292. break;
  293. default:
  294. // dbg() << "unused field " << type;
  295. break;
  296. }
  297. }
  298. position += length;
  299. }
  300. if (level == 2 && cert.sign_key.size() && cert_length && cert_data) {
  301. dbg() << "FIXME: Cert.fingerprint";
  302. }
  303. return position;
  304. }
  305. }
  306. Optional<Certificate> TLSv12::parse_asn1(const ByteBuffer& buffer, bool)
  307. {
  308. // FIXME: Our ASN.1 parser is not quite up to the task of
  309. // parsing this X.509 certificate, so for the
  310. // time being, we will "parse" the certificate
  311. // manually right here.
  312. Certificate cert;
  313. u32 fields[0xff];
  314. _parse_asn1(m_context, cert, buffer.data(), buffer.size(), 1, fields, nullptr, 0, nullptr, nullptr);
  315. #ifdef TLS_DEBUG
  316. dbg() << "Certificate issued for " << cert.subject << " by " << cert.issuer_subject;
  317. #endif
  318. return cert;
  319. }
  320. ByteBuffer TLSv12::build_hello()
  321. {
  322. // arc4random_buf(&m_context.local_random, 32);
  323. auto packet_version = (u16)m_context.version;
  324. auto version = (u16)m_context.version;
  325. PacketBuilder builder { MessageType::Handshake, packet_version };
  326. // client hello
  327. builder.append((u8)0x1);
  328. // hello length (for later)
  329. u8 dummy[3];
  330. builder.append(dummy, 3);
  331. auto start_length = builder.length();
  332. builder.append(version);
  333. builder.append(m_context.local_random, sizeof(m_context.local_random));
  334. builder.append(m_context.session_id_size);
  335. if (m_context.session_id_size)
  336. builder.append(m_context.session_id, m_context.session_id_size);
  337. size_t extension_length = 0;
  338. size_t alpn_length = 0;
  339. size_t alpn_negotiated_length = 0;
  340. // ALPN
  341. if (!m_context.negotiated_alpn.is_null()) {
  342. alpn_negotiated_length = m_context.negotiated_alpn.length();
  343. alpn_length = alpn_negotiated_length + 1;
  344. extension_length += alpn_length + 6;
  345. } else if (m_context.alpn.size()) {
  346. for (auto& alpn : m_context.alpn) {
  347. size_t length = alpn.length();
  348. alpn_length += length + 1;
  349. }
  350. if (alpn_length)
  351. extension_length += alpn_length + 6;
  352. }
  353. // Ciphers
  354. builder.append((u16)(4 * sizeof(u16)));
  355. builder.append((u16)CipherSuite::RSA_WITH_AES_128_CBC_SHA256);
  356. builder.append((u16)CipherSuite::RSA_WITH_AES_256_CBC_SHA256);
  357. builder.append((u16)CipherSuite::RSA_WITH_AES_128_CBC_SHA);
  358. builder.append((u16)CipherSuite::RSA_WITH_AES_256_CBC_SHA);
  359. // we don't like compression
  360. builder.append((u8)1);
  361. builder.append((u8)0);
  362. // set SNI if we have one
  363. auto sni_length = 0;
  364. if (!m_context.SNI.is_null())
  365. sni_length = m_context.SNI.length();
  366. if (sni_length)
  367. extension_length += sni_length + 9;
  368. builder.append((u16)extension_length);
  369. if (sni_length) {
  370. // SNI extension
  371. builder.append((u16)0x00);
  372. // extension length
  373. builder.append((u16)(sni_length + 5));
  374. // SNI length
  375. builder.append((u16)(sni_length + 3));
  376. // SNI type
  377. builder.append((u8)0);
  378. // SNI host length + value
  379. builder.append((u16)sni_length);
  380. builder.append((const u8*)m_context.SNI.characters(), sni_length);
  381. }
  382. if (alpn_length) {
  383. // TODO
  384. ASSERT_NOT_REACHED();
  385. }
  386. // set the "length" field of the packet
  387. size_t remaining = builder.length() - start_length;
  388. size_t payload_position = 6;
  389. builder.set(payload_position, remaining / 0x10000);
  390. remaining %= 0x10000;
  391. builder.set(payload_position + 1, remaining / 0x100);
  392. remaining %= 0x100;
  393. builder.set(payload_position + 2, remaining);
  394. auto packet = builder.build();
  395. update_packet(packet);
  396. return packet;
  397. }
  398. ByteBuffer TLSv12::build_alert(bool critical, u8 code)
  399. {
  400. dbg() << "FIXME: build_alert";
  401. (void)critical;
  402. (void)code;
  403. return {};
  404. }
  405. ByteBuffer TLSv12::build_finished()
  406. {
  407. PacketBuilder builder { MessageType::Handshake, m_context.version, 12 + 64 };
  408. builder.append((u8)0x14);
  409. builder.append_u24(12);
  410. size_t out_size = 12;
  411. u8 out[out_size];
  412. auto outbuffer = ByteBuffer::wrap(out, out_size);
  413. auto dummy = ByteBuffer::create_zeroed(0);
  414. auto digest = m_context.handshake_hash.digest();
  415. auto hashbuf = ByteBuffer::wrap(digest.immutable_data(), m_context.handshake_hash.digest_size());
  416. pseudorandom_function(outbuffer, m_context.master_key, (const u8*)"client finished", 15, hashbuf, dummy);
  417. builder.append(outbuffer);
  418. auto packet = builder.build();
  419. update_packet(packet);
  420. return packet;
  421. }
  422. ByteBuffer TLSv12::build_certificate()
  423. {
  424. dbg() << "FIXME: build_certificate";
  425. return {};
  426. }
  427. ByteBuffer TLSv12::build_change_cipher_spec()
  428. {
  429. PacketBuilder builder { MessageType::ChangeCipher, m_context.version, 64 };
  430. builder.append((u8)1);
  431. auto packet = builder.build();
  432. update_packet(packet);
  433. m_context.local_sequence_number = 0;
  434. return packet;
  435. }
  436. ByteBuffer TLSv12::build_server_key_exchange()
  437. {
  438. dbg() << "FIXME: build_server_key_exchange";
  439. return {};
  440. }
  441. ByteBuffer TLSv12::build_client_key_exchange()
  442. {
  443. PacketBuilder builder { MessageType::Handshake, m_context.version };
  444. builder.append((u8)0x10);
  445. build_random(builder);
  446. m_context.connection_status = 2;
  447. auto packet = builder.build();
  448. update_packet(packet);
  449. return packet;
  450. }
  451. bool TLSv12::expand_key()
  452. {
  453. u8 key[192]; // soooooooo many constants
  454. auto key_buffer = ByteBuffer::wrap(key, 192);
  455. if (m_context.master_key.size() == 0) {
  456. dbg() << "expand_key() with empty master key";
  457. return false;
  458. }
  459. auto key_size = key_length();
  460. auto mac_size = mac_length();
  461. auto iv_size = iv_length();
  462. pseudorandom_function(
  463. key_buffer,
  464. m_context.master_key,
  465. (const u8*)"key expansion", 13,
  466. ByteBuffer::wrap(m_context.remote_random, 32),
  467. ByteBuffer::wrap(m_context.local_random, 32));
  468. size_t offset = 0;
  469. memcpy(m_context.crypto.local_mac, key + offset, mac_size);
  470. offset += mac_size;
  471. memcpy(m_context.crypto.remote_mac, key + offset, mac_size);
  472. offset += mac_size;
  473. auto client_key = key + offset;
  474. offset += key_size;
  475. auto server_key = key + offset;
  476. offset += key_size;
  477. auto client_iv = key + offset;
  478. offset += iv_size;
  479. auto server_iv = key + offset;
  480. offset += iv_size;
  481. #ifdef TLS_DEBUG
  482. dbg() << "client key";
  483. print_buffer(client_key, key_size);
  484. dbg() << "server key";
  485. print_buffer(server_key, key_size);
  486. dbg() << "client iv";
  487. print_buffer(client_iv, iv_size);
  488. dbg() << "server iv";
  489. print_buffer(server_iv, iv_size);
  490. dbg() << "client mac key";
  491. print_buffer(m_context.crypto.local_mac, mac_size);
  492. dbg() << "server mac key";
  493. print_buffer(m_context.crypto.remote_mac, mac_size);
  494. #endif
  495. memcpy(m_context.crypto.local_iv, client_iv, iv_size);
  496. memcpy(m_context.crypto.remote_iv, server_iv, iv_size);
  497. m_aes_local = make<Crypto::Cipher::AESCipher::CBCMode>(ByteBuffer::wrap(client_key, key_size), key_size * 8, Crypto::Cipher::Intent::Encryption, Crypto::Cipher::PaddingMode::RFC5246);
  498. m_aes_remote = make<Crypto::Cipher::AESCipher::CBCMode>(ByteBuffer::wrap(server_key, key_size), key_size * 8, Crypto::Cipher::Intent::Decryption, Crypto::Cipher::PaddingMode::RFC5246);
  499. m_context.crypto.created = 1;
  500. return true;
  501. }
  502. void TLSv12::pseudorandom_function(ByteBuffer& output, const ByteBuffer& secret, const u8* label, size_t label_length, const ByteBuffer& seed, const ByteBuffer& seed_b)
  503. {
  504. if (!secret.size()) {
  505. dbg() << "null secret";
  506. return;
  507. }
  508. // RFC 5246: "In this section, we define one PRF, based on HMAC. This PRF with the
  509. // SHA-256 hash function is used for all cipher suites defined in this
  510. // document and in TLS documents published prior to this document when
  511. // TLS 1.2 is negotiated."
  512. // Apparently this PRF _always_ uses SHA256
  513. Crypto::Authentication::HMAC<Crypto::Hash::SHA256> hmac(secret);
  514. auto l_seed_size = label_length + seed.size() + seed_b.size();
  515. u8 l_seed[l_seed_size];
  516. auto label_seed_buffer = ByteBuffer::wrap(l_seed, l_seed_size);
  517. label_seed_buffer.overwrite(0, label, label_length);
  518. label_seed_buffer.overwrite(label_length, seed.data(), seed.size());
  519. label_seed_buffer.overwrite(label_length + seed.size(), seed_b.data(), seed_b.size());
  520. auto digest_size = hmac.digest_size();
  521. u8 digest[digest_size];
  522. auto digest_0 = ByteBuffer::wrap(digest, digest_size);
  523. digest_0.overwrite(0, hmac.process(label_seed_buffer).immutable_data(), digest_size);
  524. size_t index = 0;
  525. while (index < output.size()) {
  526. hmac.update(digest_0);
  527. hmac.update(label_seed_buffer);
  528. auto digest_1 = hmac.digest();
  529. auto copy_size = min(digest_size, output.size() - index);
  530. output.overwrite(index, digest_1.immutable_data(), copy_size);
  531. index += copy_size;
  532. digest_0.overwrite(0, hmac.process(digest_0).immutable_data(), digest_size);
  533. }
  534. }
  535. bool TLSv12::compute_master_secret(size_t length)
  536. {
  537. if (m_context.premaster_key.size() == 0 || length < 48) {
  538. dbg() << "there's no way I can make a master secret like this";
  539. dbg() << "I'd like to talk to your manager about this length of " << length;
  540. return false;
  541. }
  542. m_context.master_key.clear();
  543. m_context.master_key.grow(length);
  544. pseudorandom_function(
  545. m_context.master_key,
  546. m_context.premaster_key,
  547. (const u8*)"master secret", 13,
  548. ByteBuffer::wrap(m_context.local_random, 32),
  549. ByteBuffer::wrap(m_context.remote_random, 32));
  550. m_context.premaster_key.clear();
  551. #ifdef TLS_DEBUG
  552. dbg() << "master key:";
  553. print_buffer(m_context.master_key);
  554. #endif
  555. expand_key();
  556. return true;
  557. }
  558. void TLSv12::build_random(PacketBuilder& builder)
  559. {
  560. u8 random_bytes[48] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48 };
  561. size_t bytes = 48;
  562. // arc4random_buf(random_bytes, bytes);
  563. if (m_context.is_server) {
  564. dbg() << "Server mode not supported";
  565. return;
  566. } else {
  567. *(u16*)random_bytes = convert_between_host_and_network((u16)Version::V12);
  568. }
  569. m_context.premaster_key = ByteBuffer::copy(random_bytes, bytes);
  570. const auto& certificate = m_context.certificates[0];
  571. #ifdef TLS_DEBUG
  572. dbg() << "PreMaster secret";
  573. print_buffer(m_context.premaster_key);
  574. #endif
  575. Crypto::PK::RSA_PKCS1_EME rsa(certificate.public_key.modulus(), 0, certificate.public_key.public_exponent());
  576. u8 out[rsa.output_size()];
  577. auto outbuf = ByteBuffer::wrap(out, rsa.output_size());
  578. rsa.encrypt(m_context.premaster_key, outbuf);
  579. #ifdef TLS_DEBUG
  580. dbg() << "Encrypted: ";
  581. print_buffer(outbuf);
  582. #endif
  583. if (!compute_master_secret(bytes)) {
  584. dbg() << "oh noes we could not derive a master key :(";
  585. return;
  586. }
  587. builder.append_u24(outbuf.size() + 2);
  588. builder.append((u16)outbuf.size());
  589. builder.append(outbuf);
  590. }
  591. Optional<ByteBuffer> TLSv12::read()
  592. {
  593. if (m_context.application_buffer.size()) {
  594. auto buf = m_context.application_buffer.slice(0, m_context.application_buffer.size());
  595. m_context.application_buffer.clear();
  596. return buf;
  597. } else
  598. return {};
  599. }
  600. ByteBuffer TLSv12::read(size_t max_size)
  601. {
  602. if (m_context.application_buffer.size()) {
  603. auto length = min(m_context.application_buffer.size(), max_size);
  604. auto buf = m_context.application_buffer.slice(0, length);
  605. m_context.application_buffer = m_context.application_buffer.slice(length, m_context.application_buffer.size() - length);
  606. return buf;
  607. } else
  608. return {};
  609. }
  610. ByteBuffer TLSv12::read_line(size_t max_size)
  611. {
  612. if (!can_read_line())
  613. return {};
  614. auto* start = m_context.application_buffer.data();
  615. auto* newline = (u8*)memchr(m_context.application_buffer.data(), '\n', m_context.application_buffer.size());
  616. ASSERT(newline);
  617. size_t offset = newline - start;
  618. if (offset > max_size)
  619. return {};
  620. auto buffer = ByteBuffer::copy(start, offset);
  621. m_context.application_buffer = m_context.application_buffer.slice(offset + 1, m_context.application_buffer.size() - offset - 1);
  622. return buffer;
  623. }
  624. bool TLSv12::write(const ByteBuffer& buffer)
  625. {
  626. if (m_context.connection_status != 0xff) {
  627. dbg() << "write request while not connected";
  628. return false;
  629. }
  630. PacketBuilder builder { MessageType::ApplicationData, m_context.version, buffer.size() };
  631. builder.append(buffer);
  632. auto packet = builder.build();
  633. update_packet(packet);
  634. write_packet(packet);
  635. return true;
  636. }
  637. void TLSv12::write_packet(ByteBuffer& packet)
  638. {
  639. m_context.tls_buffer.append(packet.data(), packet.size());
  640. }
  641. void TLSv12::update_packet(ByteBuffer& packet)
  642. {
  643. u32 header_size = 5;
  644. *(u16*)packet.offset_pointer(3) = convert_between_host_and_network((u16)(packet.size() - header_size));
  645. if (packet[0] != (u8)MessageType::ChangeCipher) {
  646. if (packet[0] == (u8)MessageType::Handshake && packet.size() > header_size) {
  647. u8 handshake_type = packet[header_size];
  648. if (handshake_type != 0x00 && handshake_type != 0x03) {
  649. update_hash(packet.slice_view(header_size, packet.size() - header_size));
  650. }
  651. }
  652. if (m_context.cipher_spec_set && m_context.crypto.created) {
  653. size_t length = packet.size() - header_size + mac_length();
  654. auto block_size = m_aes_local->cipher().block_size();
  655. // if length is a multiple of block size, pad it up again
  656. // since it seems no one handles aligned unpadded blocks
  657. size_t padding = 0;
  658. if (length % block_size == 0) {
  659. padding = block_size;
  660. length += padding;
  661. }
  662. size_t mac_size = mac_length();
  663. if (m_context.crypto.created == 1) {
  664. // `buffer' will continue to be encrypted
  665. auto buffer = ByteBuffer::create_zeroed(length);
  666. size_t buffer_position = 0;
  667. u16 aligned_length = length + block_size - length % block_size;
  668. auto iv_size = iv_length();
  669. // we need enough space for a header, iv_length bytes of IV and whatever the packet contains
  670. auto ct = ByteBuffer::create_zeroed(aligned_length + header_size + iv_size);
  671. // copy the header over
  672. ct.overwrite(0, packet.data(), header_size - 2);
  673. // copy the packet, sans the header
  674. buffer.overwrite(buffer_position, packet.offset_pointer(header_size), packet.size() - header_size);
  675. buffer_position += packet.size() - header_size;
  676. // get the appropricate HMAC value for the entire packet
  677. auto mac = hmac_message(packet, {}, mac_size, true);
  678. // write the MAC
  679. buffer.overwrite(buffer_position, mac.data(), mac.size());
  680. buffer_position += mac.size();
  681. // if there's some padding to be done (since a packet MUST always be padded)
  682. // apply it manually
  683. if (padding) {
  684. memset(buffer.offset_pointer(buffer_position), padding - 1, padding);
  685. buffer_position += padding;
  686. }
  687. // should be the same value, but the manual padding
  688. // throws a wrench into our plans
  689. buffer.trim(buffer_position);
  690. // FIXME: REALLY Should be filled with random bytes
  691. auto iv = ByteBuffer::create_zeroed(iv_size);
  692. // write it into the ciphertext portion of the message
  693. ct.overwrite(header_size, iv.data(), iv.size());
  694. ct.trim(length + block_size - length % block_size + header_size + block_size - padding);
  695. // get a block to encrypt into
  696. auto view = ct.slice_view(header_size + iv_size, length + block_size - length % block_size + block_size - padding - iv_size);
  697. // encrypt the message
  698. m_aes_local->encrypt(buffer, view, iv);
  699. // store the correct ciphertext length into the packet
  700. u16 ct_length = (u16)ct.size() - header_size;
  701. *(u16*)ct.offset_pointer(header_size - 2) = convert_between_host_and_network(ct_length);
  702. // replace the packet with the ciphertext
  703. packet = ct;
  704. }
  705. }
  706. }
  707. ++m_context.local_sequence_number;
  708. }
  709. ssize_t TLSv12::handle_hello(const ByteBuffer& buffer, size_t& write_packets)
  710. {
  711. write_packets = 0;
  712. if (m_context.connection_status != 0 && m_context.connection_status != 4) {
  713. dbg() << "unexpected hello message";
  714. return (i8)Error::UnexpectedMessage;
  715. }
  716. ssize_t res = 0;
  717. size_t min_hello_size = 41;
  718. if (min_hello_size > buffer.size()) {
  719. dbg() << "need more data";
  720. return (i8)Error::NeedMoreData;
  721. }
  722. size_t following_bytes = buffer[0] * 0x10000 + buffer[1] * 0x100 + buffer[2];
  723. res += 3;
  724. if (buffer.size() - res < following_bytes) {
  725. dbg() << "not enough data after header: " << buffer.size() - res << " < " << following_bytes;
  726. return (i8)Error::NeedMoreData;
  727. }
  728. if (buffer.size() - res < 2) {
  729. dbg() << "not enough data for version";
  730. return (i8)Error::NeedMoreData;
  731. }
  732. auto version = (Version)convert_between_host_and_network(*(const u16*)buffer.offset_pointer(res));
  733. res += 2;
  734. if (!version_supported(version))
  735. return (i8)Error::NotSafe;
  736. memcpy(m_context.remote_random, buffer.offset_pointer(res), sizeof(m_context.remote_random));
  737. res += sizeof(m_context.remote_random);
  738. u8 session_length = buffer[res++];
  739. if (buffer.size() - res < session_length) {
  740. dbg() << "not enough data for session id";
  741. return (i8)Error::NeedMoreData;
  742. }
  743. if (session_length && session_length <= 32) {
  744. memcpy(m_context.session_id, buffer.offset_pointer(res), session_length);
  745. m_context.session_id_size = session_length;
  746. dbg() << "Remote session ID:";
  747. print_buffer(ByteBuffer::wrap(m_context.session_id, session_length));
  748. } else {
  749. m_context.session_id_size = 0;
  750. }
  751. res += session_length;
  752. if (buffer.size() - res < 2) {
  753. dbg() << "not enough data for cipher suite listing";
  754. return (i8)Error::NeedMoreData;
  755. }
  756. auto cipher = (CipherSuite)convert_between_host_and_network(*(const u16*)buffer.offset_pointer(res));
  757. res += 2;
  758. if (!cipher_supported(cipher)) {
  759. m_context.cipher = CipherSuite::Invalid;
  760. dbg() << "No supported cipher could be agreed upon";
  761. return (i8)Error::NoCommonCipher;
  762. }
  763. m_context.cipher = cipher;
  764. dbg() << "Cipher: " << (u16)cipher;
  765. // The handshake hash function is _always_ SHA256
  766. m_context.handshake_hash.initialize(Crypto::Hash::HashKind::SHA256);
  767. if (buffer.size() - res < 1) {
  768. dbg() << "not enough data for compression spec";
  769. return (i8)Error::NeedMoreData;
  770. }
  771. u8 compression = buffer[res++];
  772. if (compression != 0) {
  773. dbg() << "Server told us to compress, we will not!";
  774. return (i8)Error::CompressionNotSupported;
  775. }
  776. if (res > 0) {
  777. if (m_context.connection_status != 4)
  778. m_context.connection_status = 1;
  779. if (m_context.is_server) {
  780. dbg() << "unsupported: server mode";
  781. write_packets = 2;
  782. }
  783. }
  784. if (res > 2) {
  785. res += 2;
  786. }
  787. while ((ssize_t)buffer.size() - res >= 4) {
  788. u16 extension_type = convert_between_host_and_network(*(const u16*)buffer.offset_pointer(res));
  789. res += 2;
  790. u16 extension_length = convert_between_host_and_network(*(const u16*)buffer.offset_pointer(res));
  791. res += 2;
  792. dbg() << "extension " << extension_type << " with length " << extension_length;
  793. if (extension_length) {
  794. if (buffer.size() - res < extension_length) {
  795. dbg() << "not enough data for extension";
  796. return (i8)Error::NeedMoreData;
  797. }
  798. // SNI
  799. if (extension_type == 0x00) {
  800. u16 sni_host_length = convert_between_host_and_network(*(const u16*)buffer.offset_pointer(res + 3));
  801. if (buffer.size() - res - 5 < sni_host_length) {
  802. dbg() << "Not enough data for sni " << (buffer.size() - res - 5) << " < " << sni_host_length;
  803. return (i8)Error::NeedMoreData;
  804. }
  805. if (sni_host_length) {
  806. m_context.SNI = String { (const char*)buffer.offset_pointer(res + 5), sni_host_length };
  807. dbg() << "server name indicator: " << m_context.SNI;
  808. }
  809. } else if (extension_type == 0x10 && m_context.alpn.size()) {
  810. if (buffer.size() - res > 2) {
  811. auto alpn_length = convert_between_host_and_network(*(const u16*)buffer.offset_pointer(res));
  812. if (alpn_length && alpn_length <= extension_length - 2) {
  813. const u8* alpn = buffer.offset_pointer(res + 2);
  814. size_t alpn_position = 0;
  815. while (alpn_position < alpn_length) {
  816. u8 alpn_size = alpn[alpn_position++];
  817. if (alpn_size + alpn_position >= extension_length)
  818. break;
  819. String alpn_str { (const char*)alpn + alpn_position, alpn_length };
  820. if (alpn_size && m_context.alpn.contains_slow(alpn_str)) {
  821. m_context.negotiated_alpn = alpn_str;
  822. dbg() << "negotiated alpn: " << alpn_str;
  823. break;
  824. }
  825. alpn_position += alpn_length;
  826. if (!m_context.is_server) // server hello must contain one ALPN
  827. break;
  828. }
  829. }
  830. }
  831. } else if (extension_type == 0x0d) {
  832. dbg() << "supported signatures: ";
  833. print_buffer(buffer.slice_view(res, extension_length));
  834. // FIXME: what are we supposed to do here?
  835. }
  836. res += extension_length;
  837. }
  838. }
  839. return res;
  840. }
  841. ssize_t TLSv12::handle_finished(const ByteBuffer& buffer, size_t& write_packets)
  842. {
  843. if (m_context.connection_status < 2 || m_context.connection_status == 0xff) {
  844. dbg() << "unexpected finished message";
  845. return (i8)Error::UnexpectedMessage;
  846. }
  847. write_packets = 0;
  848. if (buffer.size() < 3) {
  849. return (i8)Error::NeedMoreData;
  850. }
  851. size_t index = 3;
  852. u32 size = buffer[0] * 0x10000 + buffer[1] * 0x100 + buffer[2];
  853. index += 3;
  854. if (size < 12) {
  855. dbg() << "finished packet smaller than minimum size: " << size;
  856. return (i8)Error::BrokenPacket;
  857. }
  858. if (size < buffer.size() - index) {
  859. dbg() << "not enough data after length: " << size << " > " << buffer.size() - index;
  860. return (i8)Error::NeedMoreData;
  861. }
  862. // TODO: Compare Hashes
  863. dbg() << "FIXME: handle_finished :: Check message validity";
  864. m_context.connection_status = 0xff;
  865. return handle_message(buffer);
  866. }
  867. ssize_t TLSv12::handle_certificate(const ByteBuffer& buffer)
  868. {
  869. ssize_t res = 0;
  870. if (buffer.size() < 3) {
  871. dbg() << "not enough certificate header data";
  872. return (i8)Error::NeedMoreData;
  873. }
  874. u32 certificate_total_length = buffer[0] * 0x10000 + buffer[1] * 0x100 + buffer[2];
  875. dbg() << "total length: " << certificate_total_length;
  876. if (certificate_total_length <= 4)
  877. return 3 * certificate_total_length;
  878. res += 3;
  879. if (certificate_total_length > buffer.size() - res) {
  880. dbg() << "not enough data for claimed total cert length";
  881. return (i8)Error::NeedMoreData;
  882. }
  883. size_t size = certificate_total_length;
  884. size_t index = 0;
  885. bool valid_certificate = false;
  886. while (size > 0) {
  887. ++index;
  888. if (buffer.size() - res < 3) {
  889. dbg() << "not enough data for certificate length";
  890. return (i8)Error::NeedMoreData;
  891. }
  892. size_t certificate_size = buffer[res] * 0x10000 + buffer[res + 1] * 0x100 + buffer[res + 2];
  893. res += 3;
  894. if (buffer.size() - res < certificate_size) {
  895. dbg() << "not enough data for certificate body";
  896. return (i8)Error::NeedMoreData;
  897. }
  898. auto res_cert = res;
  899. auto remaining = certificate_size;
  900. size_t certificates_in_chain = 0;
  901. do {
  902. if (remaining <= 3)
  903. break;
  904. ++certificates_in_chain;
  905. if (buffer.size() < (size_t)res_cert + 3)
  906. break;
  907. size_t certificate_size_specific = buffer[res_cert] * 0x10000 + buffer[res_cert + 1] * 0x100 + buffer[res_cert + 2];
  908. res_cert += 3;
  909. remaining -= 3;
  910. if (certificate_size_specific > remaining) {
  911. dbg() << "invalid certificate size (expected " << remaining << " but got " << certificate_size_specific << ")";
  912. break;
  913. }
  914. remaining -= certificate_size_specific;
  915. auto certificate = parse_asn1(buffer.slice_view(res_cert, certificate_size_specific), false);
  916. if (certificate.has_value()) {
  917. m_context.certificates.append(certificate.value());
  918. valid_certificate = true;
  919. }
  920. res_cert += certificate_size;
  921. } while (remaining > 0);
  922. if (remaining) {
  923. dbg() << "extraneous " << remaining << " bytes left over after parsing certificates";
  924. }
  925. size -= certificate_size + 3;
  926. res += certificate_size;
  927. }
  928. if (!valid_certificate)
  929. return (i8)Error::UnsupportedCertificate;
  930. if ((size_t)res != buffer.size())
  931. dbg() << "some data left unread: " << (size_t)res << " bytes out of " << buffer.size();
  932. return res;
  933. }
  934. ssize_t TLSv12::handle_server_key_exchange(const ByteBuffer&)
  935. {
  936. dbg() << "FIXME: parse_server_key_exchange";
  937. return 0;
  938. }
  939. ssize_t TLSv12::handle_server_hello_done(const ByteBuffer& buffer)
  940. {
  941. if (buffer.size() < 3)
  942. return (i8)Error::NeedMoreData;
  943. size_t size = buffer[0] * 0x10000 + buffer[1] * 0x100 + buffer[2];
  944. if (buffer.size() - 3 < size)
  945. return (i8)Error::NeedMoreData;
  946. return size + 3;
  947. }
  948. ssize_t TLSv12::handle_verify(const ByteBuffer&)
  949. {
  950. dbg() << "FIXME: parse_verify";
  951. return 0;
  952. }
  953. void TLSv12::update_hash(const ByteBuffer& message)
  954. {
  955. m_context.handshake_hash.update(message);
  956. }
  957. bool TLSv12::connect(const String& hostname, int port)
  958. {
  959. set_sni(hostname);
  960. return Core::Socket::connect(hostname, port);
  961. }
  962. bool TLSv12::common_connect(const struct sockaddr* saddr, socklen_t length)
  963. {
  964. if (m_context.critical_error)
  965. return false;
  966. if (Core::Socket::is_connected()) {
  967. if (established()) {
  968. ASSERT_NOT_REACHED();
  969. } else {
  970. Core::Socket::close(); // reuse?
  971. }
  972. }
  973. auto packet = build_hello();
  974. write_packet(packet);
  975. Core::Socket::on_connected = [this] {
  976. Core::Socket::on_ready_to_read = [this] {
  977. if (!Core::Socket::is_open()) {
  978. // an abrupt closure (the server is a jerk)
  979. dbg() << "Socket not open, assuming abrupt closure";
  980. m_context.connection_finished = true;
  981. }
  982. if (m_context.critical_error) {
  983. dbg() << "READ CRITICAL ERROR " << m_context.critical_error << " :(";
  984. if (on_tls_error)
  985. on_tls_error((AlertDescription)m_context.critical_error);
  986. return;
  987. }
  988. if (m_context.connection_finished) {
  989. if (on_tls_finished)
  990. on_tls_finished();
  991. if (m_context.tls_buffer.size()) {
  992. dbg() << "connection closed without finishing data transfer, " << m_context.tls_buffer.size() << " bytes still in buffer";
  993. } else {
  994. m_context.connection_finished = false;
  995. }
  996. if (!m_context.application_buffer.size())
  997. m_context.connection_status = 0;
  998. return;
  999. }
  1000. flush();
  1001. consume(Core::Socket::read(4096)); // FIXME: how much is proper?
  1002. if (established() && m_context.application_buffer.size())
  1003. if (on_tls_ready_to_read)
  1004. on_tls_ready_to_read(*this);
  1005. };
  1006. Core::Socket::on_ready_to_write = [this] {
  1007. if (!Core::Socket::is_open()) {
  1008. // an abrupt closure (the server is a jerk)
  1009. dbg() << "Socket not open, assuming abrupt closure";
  1010. m_context.connection_finished = true;
  1011. }
  1012. if (m_context.critical_error) {
  1013. dbg() << "WRITE CRITICAL ERROR " << m_context.critical_error << " :(";
  1014. if (on_tls_error)
  1015. on_tls_error((AlertDescription)m_context.critical_error);
  1016. return;
  1017. }
  1018. if (m_context.connection_finished) {
  1019. if (on_tls_finished)
  1020. on_tls_finished();
  1021. if (m_context.tls_buffer.size()) {
  1022. dbg() << "connection closed without finishing data transfer, " << m_context.tls_buffer.size() << " bytes still in buffer";
  1023. } else {
  1024. m_context.connection_finished = false;
  1025. dbg() << "FINISHED";
  1026. }
  1027. if (!m_context.application_buffer.size()) {
  1028. m_context.connection_status = 0;
  1029. return;
  1030. }
  1031. }
  1032. flush();
  1033. if (established() && !m_context.application_buffer.size()) // hey client, you still have stuff to read...
  1034. if (on_tls_ready_to_write)
  1035. on_tls_ready_to_write(*this);
  1036. };
  1037. if (on_tls_connected)
  1038. on_tls_connected();
  1039. };
  1040. bool success = Core::Socket::common_connect(saddr, length);
  1041. if (!success)
  1042. return false;
  1043. return true;
  1044. }
  1045. bool TLSv12::flush()
  1046. {
  1047. auto out_buffer = write_buffer().data();
  1048. size_t out_buffer_index { 0 };
  1049. size_t out_buffer_length = write_buffer().size();
  1050. if (out_buffer_length == 0)
  1051. return true;
  1052. #ifdef TLS_DEBUG
  1053. dbg() << "SENDING...";
  1054. print_buffer(out_buffer, out_buffer_length);
  1055. #endif
  1056. if (Core::Socket::write(&out_buffer[out_buffer_index], out_buffer_length)) {
  1057. write_buffer().clear();
  1058. return true;
  1059. } else
  1060. return false;
  1061. }
  1062. void TLSv12::consume(const ByteBuffer& record)
  1063. {
  1064. if (m_context.critical_error) {
  1065. dbg() << "There has been a critical error (" << (i8)m_context.critical_error << "), refusing to continue";
  1066. return;
  1067. }
  1068. if (record.size() == 0) {
  1069. return;
  1070. }
  1071. #ifdef TLS_DEBUG
  1072. dbg() << "Consuming " << record.size() << " bytes";
  1073. #endif
  1074. m_context.message_buffer.append(record.data(), record.size());
  1075. size_t index { 0 };
  1076. size_t buffer_length = m_context.message_buffer.size();
  1077. size_t size_offset { 3 }; // read the common record header
  1078. size_t header_size { 5 };
  1079. #ifdef TLS_DEBUG
  1080. dbg() << "message buffer length " << buffer_length;
  1081. #endif
  1082. while (buffer_length >= 5) {
  1083. auto length = convert_between_host_and_network(*(u16*)m_context.message_buffer.offset_pointer(index + size_offset)) + header_size;
  1084. if (length > buffer_length) {
  1085. dbg() << "Need more data: " << length << " | " << buffer_length;
  1086. break;
  1087. }
  1088. auto consumed = handle_message(m_context.message_buffer.slice_view(index, length));
  1089. if (consumed > 0)
  1090. dbg() << "consumed " << (size_t)consumed << " bytes";
  1091. else
  1092. dbg() << "error: " << (int)consumed;
  1093. if (consumed != (i8)Error::NeedMoreData) {
  1094. if (consumed < 0) {
  1095. dbg() << "Consumed an error: " << (int)consumed;
  1096. if (!m_context.critical_error)
  1097. m_context.critical_error = (i8)consumed;
  1098. m_context.error_code = (Error)consumed;
  1099. break;
  1100. }
  1101. } else {
  1102. continue;
  1103. }
  1104. index += length;
  1105. buffer_length -= length;
  1106. if (m_context.critical_error) {
  1107. dbg() << "Broken connection";
  1108. m_context.error_code = Error::BrokenConnection;
  1109. break;
  1110. }
  1111. }
  1112. if (m_context.error_code != Error::NoError && m_context.error_code != Error::NeedMoreData) {
  1113. dbg() << "consume error: " << (i8)m_context.error_code;
  1114. m_context.message_buffer.clear();
  1115. return;
  1116. }
  1117. if (index) {
  1118. m_context.message_buffer = m_context.message_buffer.slice(index, m_context.message_buffer.size() - index);
  1119. }
  1120. }
  1121. ssize_t TLSv12::handle_message(const ByteBuffer& buffer)
  1122. {
  1123. auto res { 5ll };
  1124. size_t header_size = res;
  1125. ssize_t payload_res = 0;
  1126. #ifdef TLS_DEBUG
  1127. dbg() << "buffer size: " << buffer.size();
  1128. #endif
  1129. if (buffer.size() < 5) {
  1130. return (i8)Error::NeedMoreData;
  1131. }
  1132. auto type = (MessageType)buffer[0];
  1133. size_t buffer_position { 1 };
  1134. // FIXME: Read the version and verify it
  1135. #ifdef TLS_DEBUG
  1136. auto version = (Version) * (const u16*)buffer.offset_pointer(buffer_position);
  1137. dbg() << "type: " << (u8)type << " version: " << (u16)version;
  1138. #endif
  1139. buffer_position += 2;
  1140. auto length = convert_between_host_and_network(*(const u16*)buffer.offset_pointer(buffer_position));
  1141. dbg() << "record length: " << length << " at offset: " << buffer_position;
  1142. buffer_position += 2;
  1143. if (buffer_position + length > buffer.size()) {
  1144. dbg() << "record length more than what we have: " << buffer.size();
  1145. return (i8)Error::NeedMoreData;
  1146. }
  1147. #ifdef TLS_DEBUG
  1148. dbg() << "message type: " << (u8)type << ", length: " << length;
  1149. #endif
  1150. ByteBuffer plain = buffer.slice_view(buffer_position, buffer.size() - buffer_position);
  1151. if (m_context.cipher_spec_set && type != MessageType::ChangeCipher) {
  1152. #ifdef TLS_DEBUG
  1153. dbg() << "Encrypted: ";
  1154. print_buffer(buffer.slice_view(header_size, length));
  1155. #endif
  1156. ASSERT(m_aes_remote);
  1157. auto iv_size = iv_length();
  1158. auto decrypted = m_aes_remote->create_aligned_buffer(length - iv_size);
  1159. auto iv = buffer.slice_view(header_size, iv_size);
  1160. m_aes_remote->decrypt(buffer.slice_view(header_size + iv_size, length - iv_size), decrypted, iv);
  1161. length = decrypted.size();
  1162. #ifdef TLS_DEBUG
  1163. dbg() << "Decrypted: ";
  1164. print_buffer(decrypted);
  1165. #endif
  1166. auto mac_size = mac_length();
  1167. if (length < mac_size) {
  1168. dbg() << "broken packet";
  1169. auto packet = build_alert(true, (u8)AlertDescription::DecryptError);
  1170. write_packet(packet);
  1171. return (i8)Error::BrokenPacket;
  1172. }
  1173. const u8* message_hmac = decrypted.offset_pointer(length - mac_size);
  1174. u8 temp_buf[5];
  1175. memcpy(temp_buf, buffer.offset_pointer(0), 3);
  1176. *(u16*)(temp_buf + 3) = convert_between_host_and_network(length);
  1177. auto hmac = hmac_message(ByteBuffer::wrap(temp_buf, 5), decrypted, mac_size);
  1178. auto message_mac = ByteBuffer::wrap(message_hmac, mac_size);
  1179. if (hmac != message_mac) {
  1180. dbg() << "integrity check failed (mac length " << length << ")";
  1181. dbg() << "mac received:";
  1182. print_buffer(message_mac);
  1183. dbg() << "mac computed:";
  1184. print_buffer(hmac);
  1185. auto packet = build_alert(true, (u8)AlertDescription::BadRecordMAC);
  1186. write_packet(packet);
  1187. return (i8)Error::IntegrityCheckFailed;
  1188. }
  1189. plain = decrypted.slice(0, length - mac_size);
  1190. }
  1191. m_context.remote_sequence_number++;
  1192. switch (type) {
  1193. case MessageType::ApplicationData:
  1194. if (m_context.connection_status != 0xff) {
  1195. dbg() << "unexpected application data";
  1196. payload_res = (i8)Error::UnexpectedMessage;
  1197. auto packet = build_alert(true, (u8)AlertDescription::UnexpectedMessage);
  1198. write_packet(packet);
  1199. } else {
  1200. #ifdef TLS_DEBUG
  1201. dbg() << "application data message of size " << plain.size();
  1202. #endif
  1203. m_context.application_buffer.append(plain.data(), plain.size());
  1204. }
  1205. break;
  1206. case MessageType::Handshake:
  1207. #ifdef TLS_DEBUG
  1208. dbg() << "tls handshake message";
  1209. #endif
  1210. payload_res = handle_payload(plain);
  1211. break;
  1212. case MessageType::ChangeCipher:
  1213. if (m_context.connection_status != 2) {
  1214. dbg() << "unexpected change cipher message";
  1215. auto packet = build_alert(true, (u8)AlertDescription::UnexpectedMessage);
  1216. payload_res = (i8)Error::UnexpectedMessage;
  1217. } else {
  1218. #ifdef TLS_DEBUG
  1219. dbg() << "change cipher spec message";
  1220. #endif
  1221. m_context.cipher_spec_set = true;
  1222. m_context.remote_sequence_number = 0;
  1223. }
  1224. break;
  1225. case MessageType::Alert:
  1226. dbg() << "alert message of length " << length;
  1227. if (length >= 2) {
  1228. print_buffer(plain);
  1229. auto level = plain[0];
  1230. auto code = plain[1];
  1231. if (level == (u8)AlertLevel::Critical) {
  1232. dbg() << "We were alerted of a critical error: " << code;
  1233. m_context.critical_error = code;
  1234. res = (i8)Error::UnknownError;
  1235. } else {
  1236. dbg() << "Alert: " << code;
  1237. }
  1238. if (code == 0) {
  1239. // close notify
  1240. res += 2;
  1241. auto closure_alert = build_alert(true, (u8)AlertDescription::CloseNotify);
  1242. write_packet(closure_alert);
  1243. flush();
  1244. m_context.connection_finished = true;
  1245. }
  1246. m_context.error_code = (Error)code;
  1247. }
  1248. break;
  1249. default:
  1250. dbg() << "message not understood";
  1251. return (i8)Error::NotUnderstood;
  1252. }
  1253. if (payload_res < 0)
  1254. return payload_res;
  1255. if (res > 0)
  1256. return header_size + length;
  1257. return res;
  1258. }
  1259. ByteBuffer TLSv12::hmac_message(const ByteBuffer& buf, const Optional<ByteBuffer> buf2, size_t mac_length, bool local)
  1260. {
  1261. u64 sequence_number = convert_between_host_and_network(local ? m_context.local_sequence_number : m_context.remote_sequence_number);
  1262. auto digest = [&](auto& hmac) {
  1263. #ifdef TLS_DEBUG
  1264. dbg() << "========================= PACKET DATA ==========================";
  1265. print_buffer((const u8*)&sequence_number, sizeof(u64));
  1266. print_buffer(buf);
  1267. if (buf2.has_value())
  1268. print_buffer(buf2.value());
  1269. dbg() << "========================= PACKET DATA ==========================";
  1270. #endif
  1271. hmac.update((const u8*)&sequence_number, sizeof(u64));
  1272. hmac.update(buf);
  1273. if (buf2.has_value() && buf2.value().size()) {
  1274. hmac.update(buf2.value());
  1275. }
  1276. auto digest = hmac.digest();
  1277. auto mac = ByteBuffer::copy(digest.immutable_data(), digest.data_length());
  1278. #ifdef TLS_DEBUG
  1279. dbg() << "HMAC of the block for sequence number " << m_context.local_sequence_number;
  1280. print_buffer(mac);
  1281. #endif
  1282. return mac;
  1283. };
  1284. switch (mac_length) {
  1285. case Crypto::Hash::SHA1::DigestSize: {
  1286. Crypto::Authentication::HMAC<Crypto::Hash::SHA1> hmac(ByteBuffer::wrap(local ? m_context.crypto.local_mac : m_context.crypto.remote_mac, mac_length));
  1287. return digest(hmac);
  1288. }
  1289. case Crypto::Hash::SHA256::DigestSize: {
  1290. Crypto::Authentication::HMAC<Crypto::Hash::SHA256> hmac(ByteBuffer::wrap(local ? m_context.crypto.local_mac : m_context.crypto.remote_mac, mac_length));
  1291. return digest(hmac);
  1292. }
  1293. case Crypto::Hash::SHA512::DigestSize: {
  1294. Crypto::Authentication::HMAC<Crypto::Hash::SHA512> hmac(ByteBuffer::wrap(local ? m_context.crypto.local_mac : m_context.crypto.remote_mac, mac_length));
  1295. return digest(hmac);
  1296. }
  1297. default:
  1298. return {};
  1299. }
  1300. }
  1301. ssize_t TLSv12::handle_payload(const ByteBuffer& vbuffer)
  1302. {
  1303. if (m_context.connection_status == 0xff) {
  1304. auto packet = build_alert(false, (u8)AlertDescription::NoRenegotiation);
  1305. write_packet(packet);
  1306. return 1;
  1307. }
  1308. auto buffer = vbuffer;
  1309. auto buffer_length = buffer.size();
  1310. auto original_length = buffer_length;
  1311. while (buffer_length >= 4 && !m_context.critical_error) {
  1312. ssize_t payload_res = 0;
  1313. if (buffer_length < 1)
  1314. return (i8)Error::NeedMoreData;
  1315. auto type = buffer[0];
  1316. size_t write_packets = 0;
  1317. size_t payload_size = buffer[1] * 0x10000 + buffer[2] * 0x100 + buffer[3] + 3;
  1318. #ifdef TLS_DEBUG
  1319. dbg() << "payload size: " << payload_size << " buffer length: " << buffer_length;
  1320. #endif
  1321. if (payload_size + 1 > buffer_length)
  1322. return (i8)Error::NeedMoreData;
  1323. switch (type) {
  1324. // hello request
  1325. case 0x00:
  1326. if (m_context.handshake_messages[0] >= 1) {
  1327. dbg() << "unexpected hello request message";
  1328. payload_res = (i8)Error::UnexpectedMessage;
  1329. break;
  1330. }
  1331. ++m_context.handshake_messages[0];
  1332. dbg() << "hello request (renegotiation?)";
  1333. if (m_context.connection_status == 0xff) {
  1334. // renegotiation
  1335. payload_res = (i8)Error::NoRenegotiation;
  1336. } else {
  1337. // :shrug:
  1338. payload_res = (i8)Error::UnexpectedMessage;
  1339. }
  1340. break;
  1341. // client hello
  1342. case 0x01:
  1343. // FIXME: We only support client mode right now
  1344. if (m_context.is_server) {
  1345. ASSERT_NOT_REACHED();
  1346. }
  1347. payload_res = (i8)Error::UnexpectedMessage;
  1348. break;
  1349. // server hello
  1350. case 0x02:
  1351. if (m_context.handshake_messages[2] >= 1) {
  1352. dbg() << "unexpected server hello message";
  1353. payload_res = (i8)Error::UnexpectedMessage;
  1354. break;
  1355. }
  1356. ++m_context.handshake_messages[2];
  1357. #ifdef TLS_DEBUG
  1358. dbg() << "server hello";
  1359. #endif
  1360. if (m_context.is_server) {
  1361. dbg() << "unsupported: server mode";
  1362. ASSERT_NOT_REACHED();
  1363. } else {
  1364. payload_res = handle_hello(buffer.slice_view(1, payload_size), write_packets);
  1365. }
  1366. break;
  1367. // hello verify request
  1368. case 0x03:
  1369. dbg() << "unsupported: DTLS";
  1370. payload_res = (i8)Error::UnexpectedMessage;
  1371. break;
  1372. // certificate
  1373. case 0x0b:
  1374. if (m_context.handshake_messages[4] >= 1) {
  1375. dbg() << "unexpected certificate message";
  1376. payload_res = (i8)Error::UnexpectedMessage;
  1377. break;
  1378. }
  1379. ++m_context.handshake_messages[4];
  1380. #ifdef TLS_DEBUG
  1381. dbg() << "certificate";
  1382. #endif
  1383. if (m_context.connection_status == 1) {
  1384. if (m_context.is_server) {
  1385. dbg() << "unsupported: server mode";
  1386. ASSERT_NOT_REACHED();
  1387. }
  1388. payload_res = handle_certificate(buffer.slice_view(1, payload_size));
  1389. } else {
  1390. payload_res = (i8)Error::UnexpectedMessage;
  1391. }
  1392. break;
  1393. // server key exchange
  1394. case 0x0c:
  1395. if (m_context.handshake_messages[5] >= 1) {
  1396. dbg() << "unexpected server key exchange message";
  1397. payload_res = (i8)Error::UnexpectedMessage;
  1398. break;
  1399. }
  1400. ++m_context.handshake_messages[5];
  1401. #ifdef TLS_DEBUG
  1402. dbg() << "server key exchange";
  1403. #endif
  1404. if (m_context.is_server) {
  1405. dbg() << "unsupported: server mode";
  1406. ASSERT_NOT_REACHED();
  1407. } else {
  1408. payload_res = handle_server_key_exchange(buffer.slice_view(1, payload_size));
  1409. }
  1410. break;
  1411. // certificate request
  1412. case 0x0d:
  1413. if (m_context.handshake_messages[6] >= 1) {
  1414. dbg() << "unexpected certificate request message";
  1415. payload_res = (i8)Error::UnexpectedMessage;
  1416. break;
  1417. }
  1418. ++m_context.handshake_messages[6];
  1419. if (m_context.is_server) {
  1420. dbg() << "invalid request";
  1421. dbg() << "unsupported: server mode";
  1422. ASSERT_NOT_REACHED();
  1423. } else {
  1424. // we do not support "certificate request"
  1425. dbg() << "certificate request";
  1426. ASSERT_NOT_REACHED();
  1427. }
  1428. break;
  1429. // server hello done
  1430. case 0x0e:
  1431. if (m_context.handshake_messages[7] >= 1) {
  1432. dbg() << "unexpected server hello done message";
  1433. payload_res = (i8)Error::UnexpectedMessage;
  1434. break;
  1435. }
  1436. ++m_context.handshake_messages[7];
  1437. #ifdef TLS_DEBUG
  1438. dbg() << "server hello done";
  1439. #endif
  1440. if (m_context.is_server) {
  1441. dbg() << "unsupported: server mode";
  1442. ASSERT_NOT_REACHED();
  1443. } else {
  1444. payload_res = handle_server_hello_done(buffer.slice_view(1, payload_size));
  1445. if (payload_res > 0)
  1446. write_packets = 1;
  1447. }
  1448. break;
  1449. // certificate verify
  1450. case 0x0f:
  1451. if (m_context.handshake_messages[8] >= 1) {
  1452. dbg() << "unexpected certificate verify message";
  1453. payload_res = (i8)Error::UnexpectedMessage;
  1454. break;
  1455. }
  1456. ++m_context.handshake_messages[8];
  1457. #ifdef TLS_DEBUG
  1458. dbg() << "certificate verify";
  1459. #endif
  1460. if (m_context.connection_status == 2) {
  1461. payload_res = handle_verify(buffer.slice_view(1, payload_size));
  1462. } else {
  1463. payload_res = (i8)Error::UnexpectedMessage;
  1464. }
  1465. break;
  1466. // client key exchange
  1467. case 0x10:
  1468. if (m_context.handshake_messages[9] >= 1) {
  1469. dbg() << "unexpected client key exchange message";
  1470. payload_res = (i8)Error::UnexpectedMessage;
  1471. break;
  1472. }
  1473. ++m_context.handshake_messages[9];
  1474. #ifdef TLS_DEBUG
  1475. dbg() << "client key exchange";
  1476. #endif
  1477. if (m_context.is_server) {
  1478. dbg() << "unsupported: server mode";
  1479. ASSERT_NOT_REACHED();
  1480. } else {
  1481. payload_res = (i8)Error::UnexpectedMessage;
  1482. }
  1483. break;
  1484. // finished
  1485. case 0x14:
  1486. if (m_context.cached_handshake) {
  1487. m_context.cached_handshake.clear();
  1488. }
  1489. if (m_context.handshake_messages[10] >= 1) {
  1490. dbg() << "unexpected finished message";
  1491. payload_res = (i8)Error::UnexpectedMessage;
  1492. break;
  1493. }
  1494. ++m_context.handshake_messages[10];
  1495. #ifdef TLS_DEBUG
  1496. dbg() << "finished";
  1497. #endif
  1498. payload_res = handle_finished(buffer.slice_view(1, payload_size), write_packets);
  1499. if (payload_res > 0) {
  1500. memset(m_context.handshake_messages, 0, sizeof(m_context.handshake_messages));
  1501. }
  1502. break;
  1503. default:
  1504. dbg() << "message type not understood: " << type;
  1505. return (i8)Error::NotUnderstood;
  1506. }
  1507. if (type != 0x00) {
  1508. update_hash(buffer.slice_view(0, payload_size + 1));
  1509. }
  1510. // if something went wrong, send an alert about it
  1511. if (payload_res < 0) {
  1512. switch ((Error)payload_res) {
  1513. case Error::UnexpectedMessage: {
  1514. auto packet = build_alert(true, (u8)AlertDescription::UnexpectedMessage);
  1515. write_packet(packet);
  1516. break;
  1517. }
  1518. case Error::CompressionNotSupported: {
  1519. auto packet = build_alert(true, (u8)AlertDescription::DecompressionFailure);
  1520. write_packet(packet);
  1521. break;
  1522. }
  1523. case Error::BrokenPacket: {
  1524. auto packet = build_alert(true, (u8)AlertDescription::DecodeError);
  1525. write_packet(packet);
  1526. break;
  1527. }
  1528. case Error::NotVerified: {
  1529. auto packet = build_alert(true, (u8)AlertDescription::BadRecordMAC);
  1530. write_packet(packet);
  1531. break;
  1532. }
  1533. case Error::BadCertificate: {
  1534. auto packet = build_alert(true, (u8)AlertDescription::BadCertificate);
  1535. write_packet(packet);
  1536. break;
  1537. }
  1538. case Error::UnsupportedCertificate: {
  1539. auto packet = build_alert(true, (u8)AlertDescription::UnsupportedCertificate);
  1540. write_packet(packet);
  1541. break;
  1542. }
  1543. case Error::NoCommonCipher: {
  1544. auto packet = build_alert(true, (u8)AlertDescription::InsufficientSecurity);
  1545. write_packet(packet);
  1546. break;
  1547. }
  1548. case Error::NotUnderstood: {
  1549. auto packet = build_alert(true, (u8)AlertDescription::InternalError);
  1550. write_packet(packet);
  1551. break;
  1552. }
  1553. case Error::NoRenegotiation: {
  1554. auto packet = build_alert(true, (u8)AlertDescription::NoRenegotiation);
  1555. write_packet(packet);
  1556. break;
  1557. }
  1558. case Error::DecryptionFailed: {
  1559. auto packet = build_alert(true, (u8)AlertDescription::DecryptionFailed);
  1560. write_packet(packet);
  1561. break;
  1562. }
  1563. default:
  1564. break;
  1565. }
  1566. if (payload_res < 0)
  1567. return payload_res;
  1568. }
  1569. switch (write_packets) {
  1570. case 1:
  1571. if (m_context.client_verified == 2) {
  1572. auto packet = build_certificate();
  1573. write_packet(packet);
  1574. m_context.client_verified = 0;
  1575. }
  1576. // client handshake
  1577. {
  1578. #ifdef TLS_DEBUG
  1579. dbg() << "> Key exchange";
  1580. #endif
  1581. auto packet = build_client_key_exchange();
  1582. write_packet(packet);
  1583. }
  1584. {
  1585. #ifdef TLS_DEBUG
  1586. dbg() << "> change cipher spec";
  1587. #endif
  1588. auto packet = build_change_cipher_spec();
  1589. write_packet(packet);
  1590. }
  1591. m_context.cipher_spec_set = 1;
  1592. m_context.local_sequence_number = 0;
  1593. {
  1594. #ifdef TLS_DEBUG
  1595. dbg() << "> client finished";
  1596. #endif
  1597. auto packet = build_finished();
  1598. write_packet(packet);
  1599. }
  1600. m_context.cipher_spec_set = 0;
  1601. break;
  1602. case 2:
  1603. // server handshake
  1604. dbg() << "UNSUPPORTED: Server mode";
  1605. ASSERT_NOT_REACHED();
  1606. break;
  1607. case 3:
  1608. // finished
  1609. {
  1610. #ifdef TLS_DEBUG
  1611. dbg() << "> change cipher spec";
  1612. #endif
  1613. auto packet = build_change_cipher_spec();
  1614. write_packet(packet);
  1615. }
  1616. {
  1617. #ifdef TLS_DEBUG
  1618. dbg() << "> client finished";
  1619. #endif
  1620. auto packet = build_finished();
  1621. write_packet(packet);
  1622. }
  1623. m_context.connection_status = 0xff;
  1624. break;
  1625. }
  1626. payload_size++;
  1627. buffer_length -= payload_size;
  1628. buffer = buffer.slice(payload_size, buffer_length);
  1629. }
  1630. return original_length;
  1631. }
  1632. }