Brotli.cpp 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952
  1. /*
  2. * Copyright (c) 2022, Michiel Visser <opensource@webmichiel.nl>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/BinarySearch.h>
  7. #include <AK/QuickSort.h>
  8. #include <LibCompress/Brotli.h>
  9. #include <LibCompress/BrotliDictionary.h>
  10. namespace Compress {
  11. ErrorOr<size_t> BrotliDecompressionStream::CanonicalCode::read_symbol(LittleEndianInputBitStream& input_stream)
  12. {
  13. size_t code_bits = 1;
  14. while (code_bits < (1 << 16)) {
  15. // FIXME: This is very inefficient and could greatly be improved by implementing this
  16. // algorithm: https://www.hanshq.net/zip.html#huffdec
  17. size_t index;
  18. if (binary_search(m_symbol_codes.span(), code_bits, &index))
  19. return m_symbol_values[index];
  20. code_bits = (code_bits << 1) | TRY(input_stream.read_bit());
  21. }
  22. return Error::from_string_literal("no matching code found");
  23. }
  24. BrotliDecompressionStream::BrotliDecompressionStream(Stream& stream)
  25. : m_input_stream(MaybeOwned(stream))
  26. {
  27. }
  28. ErrorOr<size_t> BrotliDecompressionStream::read_window_length()
  29. {
  30. if (TRY(m_input_stream.read_bit())) {
  31. switch (TRY(m_input_stream.read_bits(3))) {
  32. case 0: {
  33. switch (TRY(m_input_stream.read_bits(3))) {
  34. case 0:
  35. return 17;
  36. case 1:
  37. return Error::from_string_literal("invalid window length");
  38. case 2:
  39. return 10;
  40. case 3:
  41. return 11;
  42. case 4:
  43. return 12;
  44. case 5:
  45. return 13;
  46. case 6:
  47. return 14;
  48. case 7:
  49. return 15;
  50. default:
  51. VERIFY_NOT_REACHED();
  52. }
  53. }
  54. case 1:
  55. return 18;
  56. case 2:
  57. return 19;
  58. case 3:
  59. return 20;
  60. case 4:
  61. return 21;
  62. case 5:
  63. return 22;
  64. case 6:
  65. return 23;
  66. case 7:
  67. return 24;
  68. default:
  69. VERIFY_NOT_REACHED();
  70. }
  71. } else {
  72. return 16;
  73. }
  74. }
  75. ErrorOr<size_t> BrotliDecompressionStream::read_size_number_of_nibbles()
  76. {
  77. switch (TRY(m_input_stream.read_bits(2))) {
  78. case 0:
  79. return 4;
  80. case 1:
  81. return 5;
  82. case 2:
  83. return 6;
  84. case 3:
  85. return 0;
  86. default:
  87. VERIFY_NOT_REACHED();
  88. }
  89. }
  90. ErrorOr<size_t> BrotliDecompressionStream::read_variable_length()
  91. {
  92. // Value Bit Pattern
  93. // ----- -----------
  94. // 1 0
  95. // 2 0001
  96. // 3..4 x0011
  97. // 5..8 xx0101
  98. // 9..16 xxx0111
  99. // 17..32 xxxx1001
  100. // 33..64 xxxxx1011
  101. // 65..128 xxxxxx1101
  102. // 129..256 xxxxxxx1111
  103. if (TRY(m_input_stream.read_bit())) {
  104. switch (TRY(m_input_stream.read_bits(3))) {
  105. case 0:
  106. return 2;
  107. case 1:
  108. return 3 + TRY(m_input_stream.read_bits(1));
  109. case 2:
  110. return 5 + TRY(m_input_stream.read_bits(2));
  111. case 3:
  112. return 9 + TRY(m_input_stream.read_bits(3));
  113. case 4:
  114. return 17 + TRY(m_input_stream.read_bits(4));
  115. case 5:
  116. return 33 + TRY(m_input_stream.read_bits(5));
  117. case 6:
  118. return 65 + TRY(m_input_stream.read_bits(6));
  119. case 7:
  120. return 129 + TRY(m_input_stream.read_bits(7));
  121. default:
  122. VERIFY_NOT_REACHED();
  123. }
  124. } else {
  125. return 1;
  126. }
  127. }
  128. ErrorOr<size_t> BrotliDecompressionStream::read_complex_prefix_code_length()
  129. {
  130. // Symbol Code
  131. // ------ ----
  132. // 0 00
  133. // 1 0111
  134. // 2 011
  135. // 3 10
  136. // 4 01
  137. // 5 1111
  138. switch (TRY(m_input_stream.read_bits(2))) {
  139. case 0:
  140. return 0;
  141. case 1:
  142. return 4;
  143. case 2:
  144. return 3;
  145. case 3: {
  146. if (TRY(m_input_stream.read_bit()) == 0) {
  147. return 2;
  148. } else {
  149. if (TRY(m_input_stream.read_bit()) == 0) {
  150. return 1;
  151. } else {
  152. return 5;
  153. }
  154. }
  155. }
  156. default:
  157. VERIFY_NOT_REACHED();
  158. }
  159. }
  160. ErrorOr<void> BrotliDecompressionStream::read_prefix_code(CanonicalCode& code, size_t alphabet_size)
  161. {
  162. size_t hskip = TRY(m_input_stream.read_bits(2));
  163. if (hskip == 1) {
  164. TRY(read_simple_prefix_code(code, alphabet_size));
  165. } else {
  166. TRY(read_complex_prefix_code(code, alphabet_size, hskip));
  167. }
  168. return {};
  169. }
  170. ErrorOr<void> BrotliDecompressionStream::read_simple_prefix_code(CanonicalCode& code, size_t alphabet_size)
  171. {
  172. VERIFY(code.m_symbol_codes.is_empty());
  173. VERIFY(code.m_symbol_values.is_empty());
  174. size_t number_of_symbols = 1 + TRY(m_input_stream.read_bits(2));
  175. size_t symbol_size = 0;
  176. while ((1u << symbol_size) < alphabet_size)
  177. symbol_size++;
  178. Vector<size_t> symbols;
  179. for (size_t i = 0; i < number_of_symbols; i++) {
  180. size_t symbol = TRY(m_input_stream.read_bits(symbol_size));
  181. symbols.append(symbol);
  182. if (symbol >= alphabet_size)
  183. return Error::from_string_literal("symbol larger than alphabet");
  184. }
  185. if (number_of_symbols == 1) {
  186. code.m_symbol_codes.append(0b1);
  187. code.m_symbol_values = move(symbols);
  188. } else if (number_of_symbols == 2) {
  189. code.m_symbol_codes.extend({ 0b10, 0b11 });
  190. if (symbols[0] > symbols[1])
  191. swap(symbols[0], symbols[1]);
  192. code.m_symbol_values = move(symbols);
  193. } else if (number_of_symbols == 3) {
  194. code.m_symbol_codes.extend({ 0b10, 0b110, 0b111 });
  195. if (symbols[1] > symbols[2])
  196. swap(symbols[1], symbols[2]);
  197. code.m_symbol_values = move(symbols);
  198. } else if (number_of_symbols == 4) {
  199. bool tree_select = TRY(m_input_stream.read_bit());
  200. if (tree_select) {
  201. code.m_symbol_codes.extend({ 0b10, 0b110, 0b1110, 0b1111 });
  202. if (symbols[2] > symbols[3])
  203. swap(symbols[2], symbols[3]);
  204. code.m_symbol_values = move(symbols);
  205. } else {
  206. code.m_symbol_codes.extend({ 0b100, 0b101, 0b110, 0b111 });
  207. quick_sort(symbols);
  208. code.m_symbol_values = move(symbols);
  209. }
  210. }
  211. return {};
  212. }
  213. ErrorOr<void> BrotliDecompressionStream::read_complex_prefix_code(CanonicalCode& code, size_t alphabet_size, size_t hskip)
  214. {
  215. // hskip should only be 0, 2 or 3
  216. VERIFY(hskip != 1);
  217. VERIFY(hskip <= 3);
  218. // Read the prefix code_value that is used to encode the actual prefix code_value
  219. size_t const symbol_mapping[18] = { 1, 2, 3, 4, 0, 5, 17, 6, 16, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
  220. size_t code_length[18] { 0 };
  221. size_t code_length_counts[6] { 0 };
  222. size_t sum = 0;
  223. size_t number_of_non_zero_symbols = 0;
  224. for (size_t i = hskip; i < 18; i++) {
  225. size_t len = TRY(read_complex_prefix_code_length());
  226. code_length[symbol_mapping[i]] = len;
  227. if (len != 0) {
  228. code_length_counts[len]++;
  229. sum += (32 >> len);
  230. number_of_non_zero_symbols++;
  231. }
  232. if (sum == 32)
  233. break;
  234. else if (sum > 32)
  235. return Error::from_string_literal("invalid prefix code");
  236. }
  237. BrotliDecompressionStream::CanonicalCode temp_code;
  238. if (number_of_non_zero_symbols > 1) {
  239. size_t code_value = 0;
  240. for (size_t bits = 1; bits <= 5; bits++) {
  241. code_value = (code_value + code_length_counts[bits - 1]) << 1;
  242. size_t current_code_value = code_value;
  243. for (size_t i = 0; i < 18; i++) {
  244. size_t len = code_length[i];
  245. if (len == bits) {
  246. temp_code.m_symbol_codes.append((1 << bits) | current_code_value);
  247. temp_code.m_symbol_values.append(i);
  248. current_code_value++;
  249. }
  250. }
  251. }
  252. } else {
  253. for (size_t i = 0; i < 18; i++) {
  254. size_t len = code_length[i];
  255. if (len != 0) {
  256. temp_code.m_symbol_codes.append(1);
  257. temp_code.m_symbol_values.append(i);
  258. break;
  259. }
  260. }
  261. }
  262. // Read the actual prefix code_value
  263. sum = 0;
  264. size_t i = 0;
  265. size_t previous_non_zero_code_length = 8;
  266. size_t last_symbol = 0;
  267. size_t last_repeat = 0;
  268. Vector<size_t> result_symbols;
  269. Vector<size_t> result_lengths;
  270. size_t result_lengths_count[16] { 0 };
  271. while (i < alphabet_size) {
  272. auto symbol = TRY(temp_code.read_symbol(m_input_stream));
  273. if (symbol < 16) {
  274. result_symbols.append(i);
  275. result_lengths.append(symbol);
  276. result_lengths_count[symbol]++;
  277. if (symbol != 0) {
  278. previous_non_zero_code_length = symbol;
  279. sum += (32768 >> symbol);
  280. if (sum == 32768)
  281. break;
  282. else if (sum > 32768)
  283. return Error::from_string_literal("invalid prefix code");
  284. }
  285. last_repeat = 0;
  286. i++;
  287. } else if (symbol == 16) {
  288. size_t repeat_count = 0;
  289. if (last_symbol == 16 && last_repeat != 0) {
  290. repeat_count = (4 * (last_repeat - 2));
  291. } else {
  292. last_repeat = 0;
  293. }
  294. repeat_count += 3 + TRY(m_input_stream.read_bits(2));
  295. for (size_t rep = 0; rep < (repeat_count - last_repeat); rep++) {
  296. result_symbols.append(i);
  297. result_lengths.append(previous_non_zero_code_length);
  298. result_lengths_count[previous_non_zero_code_length]++;
  299. if (previous_non_zero_code_length != 0) {
  300. sum += (32768 >> previous_non_zero_code_length);
  301. if (sum == 32768)
  302. break;
  303. else if (sum > 32768)
  304. return Error::from_string_literal("invalid prefix code");
  305. }
  306. i++;
  307. if (i >= alphabet_size)
  308. break;
  309. }
  310. if (sum == 32768)
  311. break;
  312. VERIFY(sum < 32768);
  313. last_repeat = repeat_count;
  314. } else if (symbol == 17) {
  315. size_t repeat_count = 0;
  316. if (last_symbol == 17 && last_repeat != 0) {
  317. repeat_count = (8 * (last_repeat - 2));
  318. } else {
  319. last_repeat = 0;
  320. }
  321. repeat_count += 3 + TRY(m_input_stream.read_bits(3));
  322. i += (repeat_count - last_repeat);
  323. last_repeat = repeat_count;
  324. }
  325. last_symbol = symbol;
  326. }
  327. result_lengths_count[0] = 0;
  328. size_t code_value = 0;
  329. for (size_t bits = 1; bits < 16; bits++) {
  330. code_value = (code_value + result_lengths_count[bits - 1]) << 1;
  331. size_t current_code_value = code_value;
  332. for (size_t n = 0; n < result_symbols.size(); n++) {
  333. size_t len = result_lengths[n];
  334. if (len == bits) {
  335. code.m_symbol_codes.append((1 << bits) | current_code_value);
  336. code.m_symbol_values.append(result_symbols[n]);
  337. current_code_value++;
  338. }
  339. }
  340. }
  341. return {};
  342. }
  343. static void inverse_move_to_front_transform(Span<u8> v)
  344. {
  345. // RFC 7932 section 7.3
  346. u8 mtf[256];
  347. for (size_t i = 0; i < 256; ++i) {
  348. mtf[i] = (u8)i;
  349. }
  350. for (size_t i = 0; i < v.size(); ++i) {
  351. u8 index = v[i];
  352. u8 value = mtf[index];
  353. v[i] = value;
  354. for (; index; --index) {
  355. mtf[index] = mtf[index - 1];
  356. }
  357. mtf[0] = value;
  358. }
  359. }
  360. ErrorOr<void> BrotliDecompressionStream::read_context_map(size_t number_of_codes, Vector<u8>& context_map, size_t context_map_size)
  361. {
  362. bool use_run_length_encoding = TRY(m_input_stream.read_bit());
  363. size_t run_length_encoding_max = 0;
  364. if (use_run_length_encoding) {
  365. run_length_encoding_max = 1 + TRY(m_input_stream.read_bits(4));
  366. }
  367. BrotliDecompressionStream::CanonicalCode code;
  368. TRY(read_prefix_code(code, number_of_codes + run_length_encoding_max));
  369. size_t i = 0;
  370. while (i < context_map_size) {
  371. size_t symbol = TRY(code.read_symbol(m_input_stream));
  372. if (symbol <= run_length_encoding_max) {
  373. size_t repeat_base = 1 << symbol;
  374. size_t repeat_additional = TRY(m_input_stream.read_bits(symbol));
  375. size_t repeat_count = repeat_base + repeat_additional;
  376. while (repeat_count--) {
  377. context_map.append(0);
  378. i++;
  379. }
  380. } else {
  381. size_t value = symbol - run_length_encoding_max;
  382. context_map.append(value);
  383. i++;
  384. }
  385. }
  386. bool inverse_move_to_front = TRY(m_input_stream.read_bit());
  387. if (inverse_move_to_front)
  388. inverse_move_to_front_transform(context_map.span());
  389. return {};
  390. }
  391. ErrorOr<void> BrotliDecompressionStream::read_block_configuration(Block& block)
  392. {
  393. size_t blocks_of_type = TRY(read_variable_length());
  394. block.type = 0;
  395. block.type_previous = 1;
  396. block.number_of_types = blocks_of_type;
  397. block.type_code.clear();
  398. block.length_code.clear();
  399. if (blocks_of_type == 1) {
  400. block.length = 16 * MiB;
  401. } else {
  402. TRY(read_prefix_code(block.type_code, 2 + blocks_of_type));
  403. TRY(read_prefix_code(block.length_code, 26));
  404. TRY(block_update_length(block));
  405. }
  406. return {};
  407. }
  408. ErrorOr<void> BrotliDecompressionStream::block_update_length(Block& block)
  409. {
  410. size_t const block_length_code_base[26] { 1, 5, 9, 13, 17, 25, 33, 41, 49, 65, 81, 97, 113, 145, 177, 209, 241, 305, 369, 497, 753, 1265, 2289, 4337, 8433, 16625 };
  411. size_t const block_length_code_extra[26] { 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 24 };
  412. size_t symbol = TRY(block.length_code.read_symbol(m_input_stream));
  413. size_t block_length = block_length_code_base[symbol] + TRY(m_input_stream.read_bits(block_length_code_extra[symbol]));
  414. block.length = block_length;
  415. return {};
  416. }
  417. ErrorOr<void> BrotliDecompressionStream::block_read_new_state(Block& block)
  418. {
  419. size_t block_type_symbol = TRY(block.type_code.read_symbol(m_input_stream));
  420. TRY(block_update_length(block));
  421. if (block_type_symbol == 0) {
  422. swap(block.type, block.type_previous);
  423. } else if (block_type_symbol == 1) {
  424. block.type_previous = block.type;
  425. block.type = (block.type + 1) % block.number_of_types;
  426. } else {
  427. block.type_previous = block.type;
  428. block.type = block_type_symbol - 2;
  429. }
  430. return {};
  431. }
  432. size_t BrotliDecompressionStream::literal_code_index_from_context()
  433. {
  434. size_t const context_id_lut0[256] {
  435. 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 4, 0, 0,
  436. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  437. 8, 12, 16, 12, 12, 20, 12, 16, 24, 28, 12, 12, 32, 12, 36, 12,
  438. 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 32, 32, 24, 40, 28, 12,
  439. 12, 48, 52, 52, 52, 48, 52, 52, 52, 48, 52, 52, 52, 52, 52, 48,
  440. 52, 52, 52, 52, 52, 48, 52, 52, 52, 52, 52, 24, 12, 28, 12, 12,
  441. 12, 56, 60, 60, 60, 56, 60, 60, 60, 56, 60, 60, 60, 60, 60, 56,
  442. 60, 60, 60, 60, 60, 56, 60, 60, 60, 60, 60, 24, 12, 28, 12, 0,
  443. 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  444. 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  445. 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  446. 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
  447. 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,
  448. 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,
  449. 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3,
  450. 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3
  451. };
  452. size_t const context_id_lut1[256] {
  453. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  454. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  455. 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  456. 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1,
  457. 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  458. 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1,
  459. 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
  460. 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 0,
  461. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  462. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  463. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  464. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  465. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  466. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  467. 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  468. 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
  469. };
  470. size_t const context_id_lut2[256] {
  471. 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  472. 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  473. 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  474. 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
  475. 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
  476. 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
  477. 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
  478. 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
  479. 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  480. 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  481. 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  482. 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
  483. 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
  484. 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
  485. 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
  486. 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7
  487. };
  488. size_t context_mode = m_literal_context_modes[m_literal_block.type];
  489. size_t context_id;
  490. switch (context_mode) {
  491. case 0:
  492. context_id = m_lookback_buffer.value().lookback(1, 0) & 0x3f;
  493. break;
  494. case 1:
  495. context_id = m_lookback_buffer.value().lookback(1, 0) >> 2;
  496. break;
  497. case 2:
  498. context_id = context_id_lut0[m_lookback_buffer.value().lookback(1, 0)] | context_id_lut1[m_lookback_buffer.value().lookback(2, 0)];
  499. break;
  500. case 3:
  501. context_id = (context_id_lut2[m_lookback_buffer.value().lookback(1, 0)] << 3) | context_id_lut2[m_lookback_buffer.value().lookback(2, 0)];
  502. break;
  503. default:
  504. VERIFY_NOT_REACHED();
  505. }
  506. size_t literal_code_index = m_context_mapping_literal[64 * m_literal_block.type + context_id];
  507. return literal_code_index;
  508. }
  509. ErrorOr<Bytes> BrotliDecompressionStream::read_some(Bytes output_buffer)
  510. {
  511. size_t bytes_read = 0;
  512. while (bytes_read < output_buffer.size()) {
  513. if (m_current_state == State::WindowSize) {
  514. size_t window_bits = TRY(read_window_length());
  515. m_window_size = (1 << window_bits) - 16;
  516. m_lookback_buffer = TRY(LookbackBuffer::try_create(m_window_size));
  517. m_current_state = State::Idle;
  518. } else if (m_current_state == State::Idle) {
  519. // If the final block was read, we are done decompressing
  520. if (m_read_final_block)
  521. break;
  522. // RFC 7932 section 9.1
  523. //
  524. // 1 bit: ISLAST, set to 1 if this is the last meta-block
  525. m_read_final_block = TRY(m_input_stream.read_bit());
  526. if (m_read_final_block) {
  527. // 1 bit: ISLASTEMPTY, if set to 1, the meta-block is empty; this
  528. // field is only present if ISLAST bit is set -- if it is 1,
  529. // then the meta-block and the brotli stream ends at that
  530. // bit, with any remaining bits in the last byte of the
  531. // compressed stream filled with zeros (if the fill bits are
  532. // not zero, then the stream should be rejected as invalid)
  533. bool is_last_block_empty = TRY(m_input_stream.read_bit());
  534. // If the last block is empty we are done decompressing
  535. if (is_last_block_empty)
  536. break;
  537. }
  538. // 2 bits: MNIBBLES, number of nibbles to represent the uncompressed
  539. // length
  540. size_t size_number_of_nibbles = TRY(read_size_number_of_nibbles());
  541. // If MNIBBLES is 0, the meta-block is empty, i.e., it does
  542. // not generate any uncompressed data. In this case, the
  543. // rest of the meta-block has the following format:
  544. if (size_number_of_nibbles == 0) {
  545. // 1 bit: reserved, must be zero
  546. bool reserved = TRY(m_input_stream.read_bit());
  547. if (reserved)
  548. return Error::from_string_literal("invalid reserved bit");
  549. // 2 bits: MSKIPBYTES, number of bytes to represent
  550. // metadata length
  551. //
  552. // MSKIPBYTES * 8 bits: MSKIPLEN - 1, where MSKIPLEN is
  553. // the number of metadata bytes; this field is
  554. // only present if MSKIPBYTES is positive;
  555. // otherwise, MSKIPLEN is 0 (if MSKIPBYTES is
  556. // greater than 1, and the last byte is all
  557. // zeros, then the stream should be rejected as
  558. // invalid)
  559. size_t skip_bytes = TRY(m_input_stream.read_bits(2));
  560. if (skip_bytes == 0) {
  561. // 0..7 bits: fill bits until the next byte boundary,
  562. // must be all zeros
  563. u8 remainder = m_input_stream.align_to_byte_boundary();
  564. if (remainder != 0)
  565. return Error::from_string_literal("remainder bits are non-zero");
  566. continue;
  567. }
  568. // MSKIPLEN bytes of metadata, not part of the
  569. // uncompressed data or the sliding window
  570. size_t skip_length = 1 + TRY(m_input_stream.read_bits(8 * skip_bytes));
  571. u8 remainder = m_input_stream.align_to_byte_boundary();
  572. if (remainder != 0)
  573. return Error::from_string_literal("remainder bits are non-zero");
  574. // Discard meta-data bytes
  575. u8 temp_buffer[4096];
  576. Bytes temp_bytes { temp_buffer, 4096 };
  577. while (skip_length > 0) {
  578. Bytes temp_bytes_slice = temp_bytes.slice(0, min(4096, skip_length));
  579. auto metadata_bytes = TRY(m_input_stream.read_some(temp_bytes_slice));
  580. if (metadata_bytes.is_empty())
  581. return Error::from_string_literal("eof");
  582. if (metadata_bytes.last() == 0)
  583. return Error::from_string_literal("invalid stream");
  584. skip_length -= metadata_bytes.size();
  585. }
  586. continue;
  587. }
  588. size_t uncompressed_size = 1 + TRY(m_input_stream.read_bits(4 * size_number_of_nibbles));
  589. // 1 bit: ISUNCOMPRESSED, if set to 1, any bits of compressed data
  590. // up to the next byte boundary are ignored, and the rest of
  591. // the meta-block contains MLEN bytes of literal data; this
  592. // field is only present if the ISLAST bit is not set (if the
  593. // ignored bits are not all zeros, the stream should be
  594. // rejected as invalid)
  595. bool is_uncompressed = false;
  596. if (!m_read_final_block)
  597. is_uncompressed = TRY(m_input_stream.read_bit());
  598. m_bytes_left = uncompressed_size;
  599. if (is_uncompressed) {
  600. u8 remainder = m_input_stream.align_to_byte_boundary();
  601. if (remainder != 0)
  602. return Error::from_string_literal("remainder is non-zero");
  603. m_current_state = State::UncompressedData;
  604. } else {
  605. TRY(read_block_configuration(m_literal_block));
  606. TRY(read_block_configuration(m_insert_and_copy_block));
  607. TRY(read_block_configuration(m_distance_block));
  608. m_postfix_bits = TRY(m_input_stream.read_bits(2));
  609. m_direct_distances = TRY(m_input_stream.read_bits(4)) << m_postfix_bits;
  610. m_literal_context_modes.clear();
  611. for (size_t i = 0; i < m_literal_block.number_of_types; i++) {
  612. size_t context_mode = TRY(m_input_stream.read_bits(2));
  613. m_literal_context_modes.append(context_mode);
  614. }
  615. m_context_mapping_literal.clear();
  616. size_t number_of_literal_codes = TRY(read_variable_length());
  617. if (number_of_literal_codes == 1) {
  618. for (size_t i = 0; i < 64 * m_literal_block.number_of_types; i++)
  619. m_context_mapping_literal.append(0);
  620. } else {
  621. TRY(read_context_map(number_of_literal_codes, m_context_mapping_literal, 64 * m_literal_block.number_of_types));
  622. }
  623. m_context_mapping_distance.clear();
  624. size_t number_of_distance_codes = TRY(read_variable_length());
  625. if (number_of_distance_codes == 1) {
  626. for (size_t i = 0; i < 4 * m_distance_block.number_of_types; i++)
  627. m_context_mapping_distance.append(0);
  628. } else {
  629. TRY(read_context_map(number_of_distance_codes, m_context_mapping_distance, 4 * m_distance_block.number_of_types));
  630. }
  631. m_literal_codes.clear();
  632. for (size_t i = 0; i < number_of_literal_codes; i++) {
  633. CanonicalCode code;
  634. TRY(read_prefix_code(code, 256));
  635. m_literal_codes.append(move(code));
  636. }
  637. m_insert_and_copy_codes.clear();
  638. for (size_t i = 0; i < m_insert_and_copy_block.number_of_types; i++) {
  639. CanonicalCode code;
  640. TRY(read_prefix_code(code, 704));
  641. m_insert_and_copy_codes.append(move(code));
  642. }
  643. m_distance_codes.clear();
  644. for (size_t i = 0; i < number_of_distance_codes; i++) {
  645. CanonicalCode code;
  646. TRY(read_prefix_code(code, 16 + m_direct_distances + (48 << m_postfix_bits)));
  647. m_distance_codes.append(move(code));
  648. }
  649. m_current_state = State::CompressedCommand;
  650. }
  651. } else if (m_current_state == State::UncompressedData) {
  652. size_t number_of_fitting_bytes = min(output_buffer.size() - bytes_read, m_bytes_left);
  653. VERIFY(number_of_fitting_bytes > 0);
  654. auto uncompressed_bytes = TRY(m_input_stream.read_some(output_buffer.slice(bytes_read, number_of_fitting_bytes)));
  655. if (uncompressed_bytes.is_empty())
  656. return Error::from_string_literal("eof");
  657. m_bytes_left -= uncompressed_bytes.size();
  658. bytes_read += uncompressed_bytes.size();
  659. // If all bytes were read, return to the idle state
  660. if (m_bytes_left == 0)
  661. m_current_state = State::Idle;
  662. } else if (m_current_state == State::CompressedCommand) {
  663. if (m_insert_and_copy_block.length == 0) {
  664. TRY(block_read_new_state(m_insert_and_copy_block));
  665. }
  666. m_insert_and_copy_block.length--;
  667. size_t insert_and_copy_symbol = TRY(m_insert_and_copy_codes[m_insert_and_copy_block.type].read_symbol(m_input_stream));
  668. size_t const insert_length_code_base[11] { 0, 0, 0, 0, 8, 8, 0, 16, 8, 16, 16 };
  669. size_t const copy_length_code_base[11] { 0, 8, 0, 8, 0, 8, 16, 0, 16, 8, 16 };
  670. bool const implicit_zero_distance[11] { true, true, false, false, false, false, false, false, false, false, false };
  671. size_t insert_and_copy_index = insert_and_copy_symbol >> 6;
  672. size_t insert_length_code_offset = (insert_and_copy_symbol >> 3) & 0b111;
  673. size_t copy_length_code_offset = insert_and_copy_symbol & 0b111;
  674. size_t insert_length_code = insert_length_code_base[insert_and_copy_index] + insert_length_code_offset;
  675. size_t copy_length_code = copy_length_code_base[insert_and_copy_index] + copy_length_code_offset;
  676. m_implicit_zero_distance = implicit_zero_distance[insert_and_copy_index];
  677. size_t const insert_length_base[24] { 0, 1, 2, 3, 4, 5, 6, 8, 10, 14, 18, 26, 34, 50, 66, 98, 130, 194, 322, 578, 1090, 2114, 6210, 22594 };
  678. size_t const insert_length_extra[24] { 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 9, 10, 12, 14, 24 };
  679. size_t const copy_length_base[24] { 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 18, 22, 30, 38, 54, 70, 102, 134, 198, 326, 582, 1094, 2118 };
  680. size_t const copy_length_extra[24] { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 8, 9, 10, 24 };
  681. m_insert_length = insert_length_base[insert_length_code] + TRY(m_input_stream.read_bits(insert_length_extra[insert_length_code]));
  682. m_copy_length = copy_length_base[copy_length_code] + TRY(m_input_stream.read_bits(copy_length_extra[copy_length_code]));
  683. if (m_insert_length > 0) {
  684. m_current_state = State::CompressedLiteral;
  685. } else {
  686. m_current_state = State::CompressedDistance;
  687. }
  688. } else if (m_current_state == State::CompressedLiteral) {
  689. if (m_literal_block.length == 0) {
  690. TRY(block_read_new_state(m_literal_block));
  691. }
  692. m_literal_block.length--;
  693. size_t literal_code_index = literal_code_index_from_context();
  694. size_t literal_value = TRY(m_literal_codes[literal_code_index].read_symbol(m_input_stream));
  695. output_buffer[bytes_read] = literal_value;
  696. m_lookback_buffer.value().write(literal_value);
  697. bytes_read++;
  698. m_insert_length--;
  699. m_bytes_left--;
  700. if (m_bytes_left == 0)
  701. m_current_state = State::Idle;
  702. else if (m_insert_length == 0)
  703. m_current_state = State::CompressedDistance;
  704. } else if (m_current_state == State::CompressedDistance) {
  705. size_t distance_symbol;
  706. if (m_implicit_zero_distance) {
  707. distance_symbol = 0;
  708. } else {
  709. if (m_distance_block.length == 0) {
  710. TRY(block_read_new_state(m_distance_block));
  711. }
  712. m_distance_block.length--;
  713. size_t context_id = clamp(m_copy_length - 2, 0, 3);
  714. size_t distance_code_index = m_context_mapping_distance[4 * m_distance_block.type + context_id];
  715. distance_symbol = TRY(m_distance_codes[distance_code_index].read_symbol(m_input_stream));
  716. }
  717. size_t distance;
  718. bool reuse_previous_distance = false;
  719. if (distance_symbol < 16) {
  720. switch (distance_symbol) {
  721. case 0:
  722. distance = m_distances[0];
  723. reuse_previous_distance = true;
  724. break;
  725. case 1:
  726. distance = m_distances[1];
  727. break;
  728. case 2:
  729. distance = m_distances[2];
  730. break;
  731. case 3:
  732. distance = m_distances[3];
  733. break;
  734. case 4:
  735. distance = m_distances[0] - 1;
  736. break;
  737. case 5:
  738. distance = m_distances[0] + 1;
  739. break;
  740. case 6:
  741. distance = m_distances[0] - 2;
  742. break;
  743. case 7:
  744. distance = m_distances[0] + 2;
  745. break;
  746. case 8:
  747. distance = m_distances[0] - 3;
  748. break;
  749. case 9:
  750. distance = m_distances[0] + 3;
  751. break;
  752. case 10:
  753. distance = m_distances[1] - 1;
  754. break;
  755. case 11:
  756. distance = m_distances[1] + 1;
  757. break;
  758. case 12:
  759. distance = m_distances[1] - 2;
  760. break;
  761. case 13:
  762. distance = m_distances[1] + 2;
  763. break;
  764. case 14:
  765. distance = m_distances[1] - 3;
  766. break;
  767. case 15:
  768. distance = m_distances[1] + 3;
  769. break;
  770. }
  771. } else if (distance_symbol < 16 + m_direct_distances) {
  772. distance = distance_symbol - 15;
  773. } else {
  774. size_t POSTFIX_MASK = (1 << m_postfix_bits) - 1;
  775. size_t ndistbits = 1 + ((distance_symbol - m_direct_distances - 16) >> (m_postfix_bits + 1));
  776. size_t dextra = TRY(m_input_stream.read_bits(ndistbits));
  777. size_t hcode = (distance_symbol - m_direct_distances - 16) >> m_postfix_bits;
  778. size_t lcode = (distance_symbol - m_direct_distances - 16) & POSTFIX_MASK;
  779. size_t offset = ((2 + (hcode & 1)) << ndistbits) - 4;
  780. distance = ((offset + dextra) << m_postfix_bits) + lcode + m_direct_distances + 1;
  781. }
  782. m_distance = distance;
  783. size_t total_written = m_lookback_buffer.value().total_written();
  784. size_t max_lookback = min(total_written, m_window_size);
  785. if (distance > max_lookback) {
  786. size_t word_index = distance - (max_lookback + 1);
  787. m_dictionary_data = TRY(BrotliDictionary::lookup_word(word_index, m_copy_length));
  788. m_copy_length = m_dictionary_data.size();
  789. if (m_copy_length == 0)
  790. m_current_state = State::CompressedCommand;
  791. else
  792. m_current_state = State::CompressedDictionary;
  793. } else {
  794. if (!reuse_previous_distance) {
  795. m_distances[3] = m_distances[2];
  796. m_distances[2] = m_distances[1];
  797. m_distances[1] = m_distances[0];
  798. m_distances[0] = distance;
  799. }
  800. m_current_state = State::CompressedCopy;
  801. }
  802. } else if (m_current_state == State::CompressedCopy) {
  803. u8 copy_value = m_lookback_buffer.value().lookback(m_distance);
  804. output_buffer[bytes_read] = copy_value;
  805. m_lookback_buffer.value().write(copy_value);
  806. bytes_read++;
  807. m_copy_length--;
  808. m_bytes_left--;
  809. if (m_bytes_left == 0)
  810. m_current_state = State::Idle;
  811. else if (m_copy_length == 0)
  812. m_current_state = State::CompressedCommand;
  813. } else if (m_current_state == State::CompressedDictionary) {
  814. size_t offset = m_dictionary_data.size() - m_copy_length;
  815. u8 dictionary_value = m_dictionary_data[offset];
  816. output_buffer[bytes_read] = dictionary_value;
  817. m_lookback_buffer.value().write(dictionary_value);
  818. bytes_read++;
  819. m_copy_length--;
  820. m_bytes_left--;
  821. if (m_bytes_left == 0)
  822. m_current_state = State::Idle;
  823. else if (m_copy_length == 0)
  824. m_current_state = State::CompressedCommand;
  825. }
  826. }
  827. return output_buffer.slice(0, bytes_read);
  828. }
  829. bool BrotliDecompressionStream::is_eof() const
  830. {
  831. return m_read_final_block && m_current_state == State::Idle;
  832. }
  833. }