hexapdf 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (346) hide show
  1. checksums.yaml +7 -0
  2. data/CONTRIBUTERS +3 -0
  3. data/LICENSE +26 -0
  4. data/README.md +88 -0
  5. data/Rakefile +121 -0
  6. data/VERSION +1 -0
  7. data/agpl-3.0.txt +661 -0
  8. data/bin/hexapdf +6 -0
  9. data/data/hexapdf/afm/Courier-Bold.afm +342 -0
  10. data/data/hexapdf/afm/Courier-BoldOblique.afm +342 -0
  11. data/data/hexapdf/afm/Courier-Oblique.afm +342 -0
  12. data/data/hexapdf/afm/Courier.afm +342 -0
  13. data/data/hexapdf/afm/Helvetica-Bold.afm +2827 -0
  14. data/data/hexapdf/afm/Helvetica-BoldOblique.afm +2827 -0
  15. data/data/hexapdf/afm/Helvetica-Oblique.afm +3051 -0
  16. data/data/hexapdf/afm/Helvetica.afm +3051 -0
  17. data/data/hexapdf/afm/MustRead.html +1 -0
  18. data/data/hexapdf/afm/Symbol.afm +213 -0
  19. data/data/hexapdf/afm/Times-Bold.afm +2588 -0
  20. data/data/hexapdf/afm/Times-BoldItalic.afm +2384 -0
  21. data/data/hexapdf/afm/Times-Italic.afm +2667 -0
  22. data/data/hexapdf/afm/Times-Roman.afm +2419 -0
  23. data/data/hexapdf/afm/ZapfDingbats.afm +225 -0
  24. data/data/hexapdf/encoding/glyphlist.txt +4305 -0
  25. data/data/hexapdf/encoding/zapfdingbats.txt +225 -0
  26. data/examples/arc.rb +50 -0
  27. data/examples/graphics.rb +274 -0
  28. data/examples/hello_world.rb +16 -0
  29. data/examples/machupicchu.jpg +0 -0
  30. data/examples/merging.rb +24 -0
  31. data/examples/optimizing.rb +20 -0
  32. data/examples/show_char_bboxes.rb +55 -0
  33. data/examples/standard_pdf_fonts.rb +72 -0
  34. data/examples/truetype.rb +45 -0
  35. data/lib/hexapdf/cli/extract.rb +128 -0
  36. data/lib/hexapdf/cli/info.rb +121 -0
  37. data/lib/hexapdf/cli/inspect.rb +157 -0
  38. data/lib/hexapdf/cli/modify.rb +218 -0
  39. data/lib/hexapdf/cli.rb +121 -0
  40. data/lib/hexapdf/configuration.rb +392 -0
  41. data/lib/hexapdf/content/canvas.rb +1974 -0
  42. data/lib/hexapdf/content/color_space.rb +364 -0
  43. data/lib/hexapdf/content/graphic_object/arc.rb +267 -0
  44. data/lib/hexapdf/content/graphic_object/endpoint_arc.rb +208 -0
  45. data/lib/hexapdf/content/graphic_object/solid_arc.rb +173 -0
  46. data/lib/hexapdf/content/graphic_object.rb +81 -0
  47. data/lib/hexapdf/content/graphics_state.rb +579 -0
  48. data/lib/hexapdf/content/operator.rb +1072 -0
  49. data/lib/hexapdf/content/parser.rb +204 -0
  50. data/lib/hexapdf/content/processor.rb +451 -0
  51. data/lib/hexapdf/content/transformation_matrix.rb +172 -0
  52. data/lib/hexapdf/content.rb +47 -0
  53. data/lib/hexapdf/data_dir.rb +51 -0
  54. data/lib/hexapdf/dictionary.rb +303 -0
  55. data/lib/hexapdf/dictionary_fields.rb +382 -0
  56. data/lib/hexapdf/document.rb +589 -0
  57. data/lib/hexapdf/document_utils.rb +209 -0
  58. data/lib/hexapdf/encryption/aes.rb +206 -0
  59. data/lib/hexapdf/encryption/arc4.rb +93 -0
  60. data/lib/hexapdf/encryption/fast_aes.rb +79 -0
  61. data/lib/hexapdf/encryption/fast_arc4.rb +67 -0
  62. data/lib/hexapdf/encryption/identity.rb +63 -0
  63. data/lib/hexapdf/encryption/ruby_aes.rb +447 -0
  64. data/lib/hexapdf/encryption/ruby_arc4.rb +96 -0
  65. data/lib/hexapdf/encryption/security_handler.rb +494 -0
  66. data/lib/hexapdf/encryption/standard_security_handler.rb +616 -0
  67. data/lib/hexapdf/encryption.rb +94 -0
  68. data/lib/hexapdf/error.rb +73 -0
  69. data/lib/hexapdf/filter/ascii85_decode.rb +160 -0
  70. data/lib/hexapdf/filter/ascii_hex_decode.rb +87 -0
  71. data/lib/hexapdf/filter/dct_decode.rb +57 -0
  72. data/lib/hexapdf/filter/encryption.rb +59 -0
  73. data/lib/hexapdf/filter/flate_decode.rb +93 -0
  74. data/lib/hexapdf/filter/jpx_decode.rb +56 -0
  75. data/lib/hexapdf/filter/lzw_decode.rb +191 -0
  76. data/lib/hexapdf/filter/predictor.rb +266 -0
  77. data/lib/hexapdf/filter/run_length_decode.rb +108 -0
  78. data/lib/hexapdf/filter.rb +176 -0
  79. data/lib/hexapdf/font/cmap/parser.rb +146 -0
  80. data/lib/hexapdf/font/cmap/writer.rb +176 -0
  81. data/lib/hexapdf/font/cmap.rb +90 -0
  82. data/lib/hexapdf/font/encoding/base.rb +77 -0
  83. data/lib/hexapdf/font/encoding/difference_encoding.rb +64 -0
  84. data/lib/hexapdf/font/encoding/glyph_list.rb +150 -0
  85. data/lib/hexapdf/font/encoding/mac_expert_encoding.rb +221 -0
  86. data/lib/hexapdf/font/encoding/mac_roman_encoding.rb +265 -0
  87. data/lib/hexapdf/font/encoding/standard_encoding.rb +205 -0
  88. data/lib/hexapdf/font/encoding/symbol_encoding.rb +244 -0
  89. data/lib/hexapdf/font/encoding/win_ansi_encoding.rb +280 -0
  90. data/lib/hexapdf/font/encoding/zapf_dingbats_encoding.rb +250 -0
  91. data/lib/hexapdf/font/encoding.rb +68 -0
  92. data/lib/hexapdf/font/true_type/font.rb +179 -0
  93. data/lib/hexapdf/font/true_type/table/cmap.rb +103 -0
  94. data/lib/hexapdf/font/true_type/table/cmap_subtable.rb +384 -0
  95. data/lib/hexapdf/font/true_type/table/directory.rb +92 -0
  96. data/lib/hexapdf/font/true_type/table/glyf.rb +166 -0
  97. data/lib/hexapdf/font/true_type/table/head.rb +143 -0
  98. data/lib/hexapdf/font/true_type/table/hhea.rb +109 -0
  99. data/lib/hexapdf/font/true_type/table/hmtx.rb +79 -0
  100. data/lib/hexapdf/font/true_type/table/loca.rb +79 -0
  101. data/lib/hexapdf/font/true_type/table/maxp.rb +112 -0
  102. data/lib/hexapdf/font/true_type/table/name.rb +218 -0
  103. data/lib/hexapdf/font/true_type/table/os2.rb +200 -0
  104. data/lib/hexapdf/font/true_type/table/post.rb +230 -0
  105. data/lib/hexapdf/font/true_type/table.rb +155 -0
  106. data/lib/hexapdf/font/true_type.rb +48 -0
  107. data/lib/hexapdf/font/true_type_wrapper.rb +240 -0
  108. data/lib/hexapdf/font/type1/afm_parser.rb +230 -0
  109. data/lib/hexapdf/font/type1/character_metrics.rb +67 -0
  110. data/lib/hexapdf/font/type1/font.rb +123 -0
  111. data/lib/hexapdf/font/type1/font_metrics.rb +117 -0
  112. data/lib/hexapdf/font/type1/pfb_parser.rb +71 -0
  113. data/lib/hexapdf/font/type1.rb +52 -0
  114. data/lib/hexapdf/font/type1_wrapper.rb +193 -0
  115. data/lib/hexapdf/font_loader/from_configuration.rb +70 -0
  116. data/lib/hexapdf/font_loader/standard14.rb +98 -0
  117. data/lib/hexapdf/font_loader.rb +85 -0
  118. data/lib/hexapdf/font_utils.rb +89 -0
  119. data/lib/hexapdf/image_loader/jpeg.rb +166 -0
  120. data/lib/hexapdf/image_loader/pdf.rb +89 -0
  121. data/lib/hexapdf/image_loader/png.rb +410 -0
  122. data/lib/hexapdf/image_loader.rb +68 -0
  123. data/lib/hexapdf/importer.rb +139 -0
  124. data/lib/hexapdf/name_tree_node.rb +78 -0
  125. data/lib/hexapdf/number_tree_node.rb +67 -0
  126. data/lib/hexapdf/object.rb +363 -0
  127. data/lib/hexapdf/parser.rb +349 -0
  128. data/lib/hexapdf/rectangle.rb +99 -0
  129. data/lib/hexapdf/reference.rb +98 -0
  130. data/lib/hexapdf/revision.rb +206 -0
  131. data/lib/hexapdf/revisions.rb +194 -0
  132. data/lib/hexapdf/serializer.rb +326 -0
  133. data/lib/hexapdf/stream.rb +279 -0
  134. data/lib/hexapdf/task/dereference.rb +109 -0
  135. data/lib/hexapdf/task/optimize.rb +230 -0
  136. data/lib/hexapdf/task.rb +68 -0
  137. data/lib/hexapdf/tokenizer.rb +406 -0
  138. data/lib/hexapdf/type/catalog.rb +107 -0
  139. data/lib/hexapdf/type/embedded_file.rb +87 -0
  140. data/lib/hexapdf/type/file_specification.rb +232 -0
  141. data/lib/hexapdf/type/font.rb +81 -0
  142. data/lib/hexapdf/type/font_descriptor.rb +109 -0
  143. data/lib/hexapdf/type/font_simple.rb +190 -0
  144. data/lib/hexapdf/type/font_true_type.rb +47 -0
  145. data/lib/hexapdf/type/font_type1.rb +162 -0
  146. data/lib/hexapdf/type/form.rb +103 -0
  147. data/lib/hexapdf/type/graphics_state_parameter.rb +79 -0
  148. data/lib/hexapdf/type/image.rb +73 -0
  149. data/lib/hexapdf/type/info.rb +70 -0
  150. data/lib/hexapdf/type/names.rb +69 -0
  151. data/lib/hexapdf/type/object_stream.rb +224 -0
  152. data/lib/hexapdf/type/page.rb +355 -0
  153. data/lib/hexapdf/type/page_tree_node.rb +269 -0
  154. data/lib/hexapdf/type/resources.rb +212 -0
  155. data/lib/hexapdf/type/trailer.rb +128 -0
  156. data/lib/hexapdf/type/viewer_preferences.rb +73 -0
  157. data/lib/hexapdf/type/xref_stream.rb +204 -0
  158. data/lib/hexapdf/type.rb +67 -0
  159. data/lib/hexapdf/utils/bit_field.rb +87 -0
  160. data/lib/hexapdf/utils/bit_stream.rb +148 -0
  161. data/lib/hexapdf/utils/lru_cache.rb +65 -0
  162. data/lib/hexapdf/utils/math_helpers.rb +55 -0
  163. data/lib/hexapdf/utils/object_hash.rb +130 -0
  164. data/lib/hexapdf/utils/pdf_doc_encoding.rb +93 -0
  165. data/lib/hexapdf/utils/sorted_tree_node.rb +339 -0
  166. data/lib/hexapdf/version.rb +39 -0
  167. data/lib/hexapdf/writer.rb +199 -0
  168. data/lib/hexapdf/xref_section.rb +152 -0
  169. data/lib/hexapdf.rb +34 -0
  170. data/man/man1/hexapdf.1 +249 -0
  171. data/test/data/aes-test-vectors/CBCGFSbox-128-decrypt.data.gz +0 -0
  172. data/test/data/aes-test-vectors/CBCGFSbox-128-encrypt.data.gz +0 -0
  173. data/test/data/aes-test-vectors/CBCGFSbox-192-decrypt.data.gz +0 -0
  174. data/test/data/aes-test-vectors/CBCGFSbox-192-encrypt.data.gz +0 -0
  175. data/test/data/aes-test-vectors/CBCGFSbox-256-decrypt.data.gz +0 -0
  176. data/test/data/aes-test-vectors/CBCGFSbox-256-encrypt.data.gz +0 -0
  177. data/test/data/aes-test-vectors/CBCKeySbox-128-decrypt.data.gz +0 -0
  178. data/test/data/aes-test-vectors/CBCKeySbox-128-encrypt.data.gz +0 -0
  179. data/test/data/aes-test-vectors/CBCKeySbox-192-decrypt.data.gz +0 -0
  180. data/test/data/aes-test-vectors/CBCKeySbox-192-encrypt.data.gz +0 -0
  181. data/test/data/aes-test-vectors/CBCKeySbox-256-decrypt.data.gz +0 -0
  182. data/test/data/aes-test-vectors/CBCKeySbox-256-encrypt.data.gz +0 -0
  183. data/test/data/aes-test-vectors/CBCVarKey-128-decrypt.data.gz +0 -0
  184. data/test/data/aes-test-vectors/CBCVarKey-128-encrypt.data.gz +0 -0
  185. data/test/data/aes-test-vectors/CBCVarKey-192-decrypt.data.gz +0 -0
  186. data/test/data/aes-test-vectors/CBCVarKey-192-encrypt.data.gz +0 -0
  187. data/test/data/aes-test-vectors/CBCVarKey-256-decrypt.data.gz +0 -0
  188. data/test/data/aes-test-vectors/CBCVarKey-256-encrypt.data.gz +0 -0
  189. data/test/data/aes-test-vectors/CBCVarTxt-128-decrypt.data.gz +0 -0
  190. data/test/data/aes-test-vectors/CBCVarTxt-128-encrypt.data.gz +0 -0
  191. data/test/data/aes-test-vectors/CBCVarTxt-192-decrypt.data.gz +0 -0
  192. data/test/data/aes-test-vectors/CBCVarTxt-192-encrypt.data.gz +0 -0
  193. data/test/data/aes-test-vectors/CBCVarTxt-256-decrypt.data.gz +0 -0
  194. data/test/data/aes-test-vectors/CBCVarTxt-256-encrypt.data.gz +0 -0
  195. data/test/data/fonts/Ubuntu-Title.ttf +0 -0
  196. data/test/data/images/cmyk.jpg +0 -0
  197. data/test/data/images/fillbytes.jpg +0 -0
  198. data/test/data/images/gray.jpg +0 -0
  199. data/test/data/images/greyscale-1bit.png +0 -0
  200. data/test/data/images/greyscale-2bit.png +0 -0
  201. data/test/data/images/greyscale-4bit.png +0 -0
  202. data/test/data/images/greyscale-8bit.png +0 -0
  203. data/test/data/images/greyscale-alpha-8bit.png +0 -0
  204. data/test/data/images/greyscale-trns-8bit.png +0 -0
  205. data/test/data/images/greyscale-with-gamma1.0.png +0 -0
  206. data/test/data/images/greyscale-with-gamma1.5.png +0 -0
  207. data/test/data/images/indexed-1bit.png +0 -0
  208. data/test/data/images/indexed-2bit.png +0 -0
  209. data/test/data/images/indexed-4bit.png +0 -0
  210. data/test/data/images/indexed-8bit.png +0 -0
  211. data/test/data/images/indexed-alpha-4bit.png +0 -0
  212. data/test/data/images/indexed-alpha-8bit.png +0 -0
  213. data/test/data/images/rgb.jpg +0 -0
  214. data/test/data/images/truecolour-8bit.png +0 -0
  215. data/test/data/images/truecolour-alpha-8bit.png +0 -0
  216. data/test/data/images/truecolour-gama-chrm-8bit.png +0 -0
  217. data/test/data/images/truecolour-srgb-8bit.png +0 -0
  218. data/test/data/minimal.pdf +44 -0
  219. data/test/data/standard-security-handler/README +9 -0
  220. data/test/data/standard-security-handler/bothpwd-aes-128bit-V4.pdf +44 -0
  221. data/test/data/standard-security-handler/bothpwd-aes-256bit-V5.pdf +0 -0
  222. data/test/data/standard-security-handler/bothpwd-arc4-128bit-V2.pdf +43 -0
  223. data/test/data/standard-security-handler/bothpwd-arc4-128bit-V4.pdf +43 -0
  224. data/test/data/standard-security-handler/bothpwd-arc4-40bit-V1.pdf +0 -0
  225. data/test/data/standard-security-handler/nopwd-aes-128bit-V4.pdf +43 -0
  226. data/test/data/standard-security-handler/nopwd-aes-256bit-V5.pdf +0 -0
  227. data/test/data/standard-security-handler/nopwd-arc4-128bit-V2.pdf +43 -0
  228. data/test/data/standard-security-handler/nopwd-arc4-128bit-V4.pdf +43 -0
  229. data/test/data/standard-security-handler/nopwd-arc4-40bit-V1.pdf +43 -0
  230. data/test/data/standard-security-handler/ownerpwd-aes-128bit-V4.pdf +0 -0
  231. data/test/data/standard-security-handler/ownerpwd-aes-256bit-V5.pdf +43 -0
  232. data/test/data/standard-security-handler/ownerpwd-arc4-128bit-V2.pdf +43 -0
  233. data/test/data/standard-security-handler/ownerpwd-arc4-128bit-V4.pdf +43 -0
  234. data/test/data/standard-security-handler/ownerpwd-arc4-40bit-V1.pdf +43 -0
  235. data/test/data/standard-security-handler/userpwd-aes-128bit-V4.pdf +43 -0
  236. data/test/data/standard-security-handler/userpwd-aes-256bit-V5.pdf +43 -0
  237. data/test/data/standard-security-handler/userpwd-arc4-128bit-V2.pdf +0 -0
  238. data/test/data/standard-security-handler/userpwd-arc4-128bit-V4.pdf +0 -0
  239. data/test/data/standard-security-handler/userpwd-arc4-40bit-V1.pdf +43 -0
  240. data/test/hexapdf/common_tokenizer_tests.rb +204 -0
  241. data/test/hexapdf/content/common.rb +31 -0
  242. data/test/hexapdf/content/graphic_object/test_arc.rb +93 -0
  243. data/test/hexapdf/content/graphic_object/test_endpoint_arc.rb +91 -0
  244. data/test/hexapdf/content/graphic_object/test_solid_arc.rb +86 -0
  245. data/test/hexapdf/content/test_canvas.rb +1113 -0
  246. data/test/hexapdf/content/test_color_space.rb +97 -0
  247. data/test/hexapdf/content/test_graphics_state.rb +138 -0
  248. data/test/hexapdf/content/test_operator.rb +619 -0
  249. data/test/hexapdf/content/test_parser.rb +66 -0
  250. data/test/hexapdf/content/test_processor.rb +156 -0
  251. data/test/hexapdf/content/test_transformation_matrix.rb +64 -0
  252. data/test/hexapdf/encryption/common.rb +87 -0
  253. data/test/hexapdf/encryption/test_aes.rb +121 -0
  254. data/test/hexapdf/encryption/test_arc4.rb +39 -0
  255. data/test/hexapdf/encryption/test_fast_aes.rb +17 -0
  256. data/test/hexapdf/encryption/test_fast_arc4.rb +12 -0
  257. data/test/hexapdf/encryption/test_identity.rb +21 -0
  258. data/test/hexapdf/encryption/test_ruby_aes.rb +23 -0
  259. data/test/hexapdf/encryption/test_ruby_arc4.rb +20 -0
  260. data/test/hexapdf/encryption/test_security_handler.rb +356 -0
  261. data/test/hexapdf/encryption/test_standard_security_handler.rb +274 -0
  262. data/test/hexapdf/filter/common.rb +53 -0
  263. data/test/hexapdf/filter/test_ascii85_decode.rb +60 -0
  264. data/test/hexapdf/filter/test_ascii_hex_decode.rb +33 -0
  265. data/test/hexapdf/filter/test_encryption.rb +24 -0
  266. data/test/hexapdf/filter/test_flate_decode.rb +35 -0
  267. data/test/hexapdf/filter/test_lzw_decode.rb +52 -0
  268. data/test/hexapdf/filter/test_predictor.rb +183 -0
  269. data/test/hexapdf/filter/test_run_length_decode.rb +32 -0
  270. data/test/hexapdf/font/cmap/test_parser.rb +67 -0
  271. data/test/hexapdf/font/cmap/test_writer.rb +58 -0
  272. data/test/hexapdf/font/encoding/test_base.rb +35 -0
  273. data/test/hexapdf/font/encoding/test_difference_encoding.rb +21 -0
  274. data/test/hexapdf/font/encoding/test_glyph_list.rb +59 -0
  275. data/test/hexapdf/font/encoding/test_zapf_dingbats_encoding.rb +16 -0
  276. data/test/hexapdf/font/test_encoding.rb +27 -0
  277. data/test/hexapdf/font/test_true_type_wrapper.rb +110 -0
  278. data/test/hexapdf/font/test_type1_wrapper.rb +66 -0
  279. data/test/hexapdf/font/true_type/common.rb +19 -0
  280. data/test/hexapdf/font/true_type/table/test_cmap.rb +59 -0
  281. data/test/hexapdf/font/true_type/table/test_cmap_subtable.rb +133 -0
  282. data/test/hexapdf/font/true_type/table/test_directory.rb +35 -0
  283. data/test/hexapdf/font/true_type/table/test_glyf.rb +58 -0
  284. data/test/hexapdf/font/true_type/table/test_head.rb +76 -0
  285. data/test/hexapdf/font/true_type/table/test_hhea.rb +40 -0
  286. data/test/hexapdf/font/true_type/table/test_hmtx.rb +38 -0
  287. data/test/hexapdf/font/true_type/table/test_loca.rb +43 -0
  288. data/test/hexapdf/font/true_type/table/test_maxp.rb +62 -0
  289. data/test/hexapdf/font/true_type/table/test_name.rb +95 -0
  290. data/test/hexapdf/font/true_type/table/test_os2.rb +65 -0
  291. data/test/hexapdf/font/true_type/table/test_post.rb +89 -0
  292. data/test/hexapdf/font/true_type/test_font.rb +120 -0
  293. data/test/hexapdf/font/true_type/test_table.rb +41 -0
  294. data/test/hexapdf/font/type1/test_afm_parser.rb +51 -0
  295. data/test/hexapdf/font/type1/test_font.rb +68 -0
  296. data/test/hexapdf/font/type1/test_pfb_parser.rb +37 -0
  297. data/test/hexapdf/font_loader/test_from_configuration.rb +28 -0
  298. data/test/hexapdf/font_loader/test_standard14.rb +22 -0
  299. data/test/hexapdf/image_loader/test_jpeg.rb +83 -0
  300. data/test/hexapdf/image_loader/test_pdf.rb +47 -0
  301. data/test/hexapdf/image_loader/test_png.rb +258 -0
  302. data/test/hexapdf/task/test_dereference.rb +46 -0
  303. data/test/hexapdf/task/test_optimize.rb +137 -0
  304. data/test/hexapdf/test_configuration.rb +82 -0
  305. data/test/hexapdf/test_data_dir.rb +32 -0
  306. data/test/hexapdf/test_dictionary.rb +284 -0
  307. data/test/hexapdf/test_dictionary_fields.rb +185 -0
  308. data/test/hexapdf/test_document.rb +574 -0
  309. data/test/hexapdf/test_document_utils.rb +144 -0
  310. data/test/hexapdf/test_filter.rb +96 -0
  311. data/test/hexapdf/test_font_utils.rb +47 -0
  312. data/test/hexapdf/test_importer.rb +78 -0
  313. data/test/hexapdf/test_object.rb +177 -0
  314. data/test/hexapdf/test_parser.rb +394 -0
  315. data/test/hexapdf/test_rectangle.rb +36 -0
  316. data/test/hexapdf/test_reference.rb +41 -0
  317. data/test/hexapdf/test_revision.rb +139 -0
  318. data/test/hexapdf/test_revisions.rb +93 -0
  319. data/test/hexapdf/test_serializer.rb +169 -0
  320. data/test/hexapdf/test_stream.rb +262 -0
  321. data/test/hexapdf/test_tokenizer.rb +30 -0
  322. data/test/hexapdf/test_writer.rb +120 -0
  323. data/test/hexapdf/test_xref_section.rb +35 -0
  324. data/test/hexapdf/type/test_catalog.rb +30 -0
  325. data/test/hexapdf/type/test_embedded_file.rb +16 -0
  326. data/test/hexapdf/type/test_file_specification.rb +148 -0
  327. data/test/hexapdf/type/test_font.rb +35 -0
  328. data/test/hexapdf/type/test_font_descriptor.rb +51 -0
  329. data/test/hexapdf/type/test_font_simple.rb +190 -0
  330. data/test/hexapdf/type/test_font_type1.rb +128 -0
  331. data/test/hexapdf/type/test_form.rb +60 -0
  332. data/test/hexapdf/type/test_info.rb +14 -0
  333. data/test/hexapdf/type/test_names.rb +9 -0
  334. data/test/hexapdf/type/test_object_stream.rb +84 -0
  335. data/test/hexapdf/type/test_page.rb +260 -0
  336. data/test/hexapdf/type/test_page_tree_node.rb +255 -0
  337. data/test/hexapdf/type/test_resources.rb +167 -0
  338. data/test/hexapdf/type/test_trailer.rb +109 -0
  339. data/test/hexapdf/type/test_xref_stream.rb +131 -0
  340. data/test/hexapdf/utils/test_bit_field.rb +47 -0
  341. data/test/hexapdf/utils/test_lru_cache.rb +22 -0
  342. data/test/hexapdf/utils/test_object_hash.rb +115 -0
  343. data/test/hexapdf/utils/test_pdf_doc_encoding.rb +18 -0
  344. data/test/hexapdf/utils/test_sorted_tree_node.rb +232 -0
  345. data/test/test_helper.rb +56 -0
  346. metadata +427 -0
@@ -0,0 +1,156 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'test_helper'
4
+ require 'hexapdf/content/processor'
5
+ require 'hexapdf/document'
6
+
7
+ describe HexaPDF::Content::Processor::GlyphBox do
8
+ before do
9
+ @box = HexaPDF::Content::Processor::GlyphBox.new(5, "5", 1, 2, 3, 4, 5, 6)
10
+ end
11
+
12
+ it "returns the correct bounding box coordinates" do
13
+ assert_equal([1, 2], @box.lower_left)
14
+ assert_equal([3, 4], @box.lower_right)
15
+ assert_equal([5, 6], @box.upper_left)
16
+ assert_equal([7, 8], @box.upper_right)
17
+ end
18
+
19
+ it "returns all box corners in one array when using #points" do
20
+ assert_equal([1, 2, 3, 4, 7, 8, 5, 6], @box.points)
21
+ end
22
+ end
23
+
24
+ describe HexaPDF::Content::Processor::CompositeBox do
25
+ before do
26
+ @glyph_box1 = HexaPDF::Content::Processor::GlyphBox.new(4, "4", 1, 1, 2, 1, 1, 2)
27
+ @glyph_box2 = HexaPDF::Content::Processor::GlyphBox.new(2, "2", 3, 1, 7, 1, 3, 2)
28
+ @boxes = HexaPDF::Content::Processor::CompositeBox.new
29
+ end
30
+
31
+ it "allows appending and retrieving of glyph boxes" do
32
+ result = (@boxes << @glyph_box1)
33
+ assert_equal(@boxes, result)
34
+ assert_equal(@glyph_box1, @boxes[0])
35
+ end
36
+
37
+ it "allows iterating over the glyph boxes " do
38
+ @boxes << @glyph_box1 << @glyph_box2
39
+ assert_equal([@glyph_box1, @glyph_box2], @boxes.each.to_a)
40
+ end
41
+
42
+ it "returns the concatenated string of the individual boxes" do
43
+ @boxes << @glyph_box1 << @glyph_box2
44
+ assert_equal("42", @boxes.string)
45
+ end
46
+
47
+ it "returns the correct bounding box coordinates" do
48
+ @boxes << @glyph_box1 << @glyph_box2
49
+ assert_equal([1, 1], @boxes.lower_left)
50
+ assert_equal([7, 1], @boxes.lower_right)
51
+ assert_equal([1, 2], @boxes.upper_left)
52
+ assert_equal([7, 2], @boxes.upper_right)
53
+ end
54
+ end
55
+
56
+ describe HexaPDF::Content::Processor do
57
+ before do
58
+ @processor = HexaPDF::Content::Processor.new
59
+ end
60
+
61
+ describe "initialization" do
62
+ it "has a prepopulated operators mapping" do
63
+ assert_kind_of(HexaPDF::Content::Operator::BaseOperator, @processor.operators[:q])
64
+ end
65
+ end
66
+
67
+ describe "graphics_object" do
68
+ it "default to :none on initialization" do
69
+ assert_equal(:none, @processor.graphics_object)
70
+ end
71
+ end
72
+
73
+ describe "process" do
74
+ it "invokes the specified operator implementation" do
75
+ op = Minitest::Mock.new
76
+ op.expect(:invoke, nil, [@processor, :arg])
77
+ @processor.operators[:test] = op
78
+ @processor.process(:test, [:arg])
79
+ op.verify
80
+ end
81
+
82
+ it "invokes the mapped message name" do
83
+ val = nil
84
+ @processor.define_singleton_method(:save_graphics_state) { val = :arg }
85
+ @processor.process(:q)
86
+ assert_equal(:arg, val)
87
+ end
88
+ end
89
+
90
+ describe "paint_xobject" do
91
+ it "processes the contents of a Form xobject" do
92
+ test_case = self
93
+ invoked = false
94
+
95
+ @processor.define_singleton_method(:set_line_width) do |_width|
96
+ test_case.assert_equal([2, 0, 0, 2, 10, 10], graphics_state.ctm.to_a)
97
+ invoked = true
98
+ end
99
+ @processor.resources = resources = Object.new
100
+ @processor.resources.define_singleton_method(:xobject) do |_name|
101
+ obj = {Matrix: [2, 0, 0, 2, 10, 10], Subtype: :Form}
102
+ obj.define_singleton_method(:process_contents) {|processor| processor.process(:w, [10])}
103
+ obj
104
+ end
105
+
106
+ @processor.process(:Do, [:Name])
107
+ assert(invoked)
108
+ assert_equal([1, 0, 0, 1, 0, 0], @processor.graphics_state.ctm.to_a)
109
+ assert_same(resources, @processor.resources)
110
+ end
111
+ end
112
+
113
+ describe "text decoding" do
114
+ before do
115
+ @doc = HexaPDF::Document.new
116
+ @processor.process(:BT)
117
+ @processor.graphics_state.font = @font = @doc.add(Type: :Font, Subtype: :Type1,
118
+ Encoding: :WinAnsiEncoding,
119
+ BaseFont: :"Times-Roman")
120
+ @processor.graphics_state.font_size = 10
121
+ @processor.graphics_state.text_rise = 10
122
+ end
123
+
124
+ describe "decode_text" do
125
+ it "decodes text provided via one or the other of the two show show text operators" do
126
+ assert_equal("Hülle", @processor.send(:decode_text, "Hülle".encode("Windows-1252")))
127
+ arr = ["Hül".encode("Windows-1252"), 20, "le".encode("Windows-1252")]
128
+ assert_equal("Hülle", @processor.send(:decode_text, arr))
129
+ end
130
+ end
131
+
132
+ describe "decode_text_with_positioning" do
133
+ it "returns a composite box with positioning information" do
134
+ lly = @font.bounding_box[1] / 1000.0 * @processor.graphics_state.font_size +
135
+ @processor.graphics_state.text_rise
136
+ lry = @font.bounding_box[3] / 1000.0 * @processor.graphics_state.font_size +
137
+ @processor.graphics_state.text_rise
138
+ arr = ["Hül".encode("Windows-1252"), 20, "le".encode("Windows-1252")]
139
+ width = "Hülle".encode("Windows-1252").codepoints.inject(0) {|s, cp| s + @font.width(cp)}
140
+ width = (width - 20) * @processor.graphics_state.font_size / 1000.0
141
+
142
+ box = @processor.send(:decode_text_with_positioning, arr)
143
+ assert_equal("Hülle", box.string)
144
+ assert_in_delta(0, box[0].lower_left[0])
145
+ assert_in_delta(lly, box[0].lower_left[1])
146
+ assert_in_delta(width, box[4].upper_right[0])
147
+ assert_in_delta(lry, box[4].upper_right[1])
148
+ end
149
+
150
+ it "fails if the current font is a vertical font" do
151
+ @processor.graphics_state.font.define_singleton_method(:writing_mode) { :vertical }
152
+ assert_raises(NotImplementedError) { @processor.send(:decode_text_with_positioning, "a") }
153
+ end
154
+ end
155
+ end
156
+ end
@@ -0,0 +1,64 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'test_helper'
4
+ require 'hexapdf/content/transformation_matrix'
5
+
6
+ describe HexaPDF::Content::TransformationMatrix do
7
+ before do
8
+ @matrix = HexaPDF::Content::TransformationMatrix.new
9
+ end
10
+
11
+ describe "initialize" do
12
+ it "initializes to the identity matrix" do
13
+ assert_equal(1, @matrix.a)
14
+ assert_equal(0, @matrix.b)
15
+ assert_equal(0, @matrix.c)
16
+ assert_equal(1, @matrix.d)
17
+ assert_equal(0, @matrix.e)
18
+ assert_equal(0, @matrix.f)
19
+ end
20
+
21
+ it "can use arbitrary values" do
22
+ @matrix = HexaPDF::Content::TransformationMatrix.new(2, 3, 4, 5, 6, 7)
23
+ assert_equal(2, @matrix.a)
24
+ assert_equal(3, @matrix.b)
25
+ assert_equal(4, @matrix.c)
26
+ assert_equal(5, @matrix.d)
27
+ assert_equal(6, @matrix.e)
28
+ assert_equal(7, @matrix.f)
29
+ end
30
+ end
31
+
32
+ it "correctly evaluates a point" do
33
+ assert_equal([2, 3], @matrix.evaluate(2, 3))
34
+ end
35
+
36
+ it "correctly translates the matrix" do
37
+ @matrix.translate(5, 10)
38
+ assert_equal([7, 13], @matrix.evaluate(2, 3))
39
+ end
40
+
41
+ it "correctly rotates the matrix" do
42
+ @matrix.rotate(90)
43
+ assert_equal([-3, 2], @matrix.evaluate(2, 3))
44
+ end
45
+
46
+ it "correctly scales the matrix" do
47
+ @matrix.scale(5, 10)
48
+ assert_equal([10, 30], @matrix.evaluate(2, 3))
49
+ end
50
+
51
+ it "correctly skews the matrix" do
52
+ assert_equal([2, 5], @matrix.dup.skew(45, 0).evaluate(2, 3))
53
+ assert_equal([5, 3], @matrix.dup.skew(0, 45).evaluate(2, 3))
54
+ end
55
+
56
+ it "can be compared to another matrix" do
57
+ assert_equal(HexaPDF::Content::TransformationMatrix.new, @matrix)
58
+ refute_equal(HexaPDF::Content::TransformationMatrix.new(5), @matrix)
59
+ end
60
+
61
+ it "allows the conversion of the matrix into an array" do
62
+ assert_equal([1, 0, 0, 1, 0, 0], @matrix.to_a)
63
+ end
64
+ end
@@ -0,0 +1,87 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'test_helper'
4
+
5
+ # Contains tests that validate that an encryption algorithm's class conforms to the general
6
+ # interface.
7
+ #
8
+ # The algorithm class needs to be available in the @algorithm_class variable.
9
+ module EncryptionAlgorithmInterfaceTests
10
+
11
+ def test_responds_to_necessary_methods
12
+ [:encrypt, :decrypt, :encryption_fiber, :decryption_fiber].each do |method|
13
+ assert_respond_to(@algorithm_class, method)
14
+ assert_equal(2, @algorithm_class.method(method).arity)
15
+ end
16
+ end
17
+
18
+ end
19
+
20
+ # Contains common tests for AES algorithms.
21
+ #
22
+ # The algorithm class needs to be available in the @algorithm_class variable.
23
+ module AESEncryptionTests
24
+
25
+ include EncryptionAlgorithmInterfaceTests
26
+
27
+ TEST_VECTOR_FILES = Dir[File.join(TEST_DATA_DIR, 'aes-test-vectors', '*')]
28
+
29
+ def test_processes_the_aes_test_vectors
30
+ TEST_VECTOR_FILES.each do |filename|
31
+ name, size, mode = File.basename(filename, '.data.gz').split('-')
32
+ size = size.to_i / 8
33
+ data = Zlib::GzipReader.open(filename) {|io| io.read}.force_encoding(Encoding::BINARY)
34
+ data.scan(/(.{#{size}})(.{16})(.{16})(.{16})/m).each_with_index do |(key, iv, plain, cipher), index|
35
+ aes = @algorithm_class.new(key, iv, mode.intern)
36
+ assert_equal(cipher, aes.process(plain),
37
+ "name: #{name}, size: #{size * 8}, mode: #{mode}, index: #{index}")
38
+ end
39
+ end
40
+ end
41
+
42
+ def test_can_accept_one_big_chunk_or_multiple_smaller_ones
43
+ big = @algorithm_class.new('t' * 16, '0' * 16, :encrypt)
44
+ small = @algorithm_class.new('t' * 16, '0' * 16, :encrypt)
45
+ assert_equal(big.process('some' * 16),
46
+ small.process('some' * 8) << small.process('some' * 4) << small.process('some' * 4))
47
+ end
48
+
49
+ def test_raises_error_on_invalid_key_length
50
+ assert_raises(HexaPDF::EncryptionError) { @algorithm_class.new('t' * 7, '0' * 16, :encrypt) }
51
+ end
52
+
53
+ def test_raises_error_on_invalid_iv_length
54
+ assert_raises(HexaPDF::EncryptionError) { @algorithm_class.new('t' * 16, '0' * 7, :encrypt) }
55
+ end
56
+
57
+ end
58
+
59
+ # Contains common tests for AES algorithms.
60
+ #
61
+ # The algorithm class needs to be available in the @algorithm_class variable.
62
+ module ARC4EncryptionTests
63
+
64
+ include EncryptionAlgorithmInterfaceTests
65
+
66
+ def setup
67
+ super
68
+ @encrypted = ['BBF316E8D940AF0AD3', '1021BF0420', '45A01F645FC35B383552544B9BF5'].
69
+ map {|c| [c].pack('H*')}
70
+ @plain = ['Plaintext', 'pedia', 'Attack at dawn'].each {|s| s.force_encoding('BINARY')}
71
+ @keys = ['Key', 'Wiki', 'Secret']
72
+ end
73
+
74
+ def test_processes_the_test_vectors_from_the_rc4_wikipeda_page
75
+ @keys.each_with_index do |key, i|
76
+ assert_equal(@encrypted[i], @algorithm_class.new(key).process(@plain[i]))
77
+ end
78
+ end
79
+
80
+ def test_can_accept_one_big_chunk_or_multiple_smaller_ones
81
+ big = @algorithm_class.new('key')
82
+ small = @algorithm_class.new('key')
83
+ assert_equal(big.process('some big data chunk'),
84
+ small.process('some') << small.process(' big') << small.process(' data chunk'))
85
+ end
86
+
87
+ end
@@ -0,0 +1,121 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require_relative 'common'
4
+ require 'hexapdf/encryption/aes'
5
+
6
+ describe HexaPDF::Encryption::AES do
7
+ include EncryptionAlgorithmInterfaceTests
8
+
9
+ before do
10
+ @algorithm_class = Class.new do
11
+ prepend HexaPDF::Encryption::AES
12
+
13
+ attr_reader :key, :iv, :mode
14
+
15
+ def initialize(key, iv, mode)
16
+ @key, @iv, @mode = key, iv, mode
17
+ end
18
+
19
+ def process(data)
20
+ raise "invalid data" if data.length == 0 || data.length % 16 != 0
21
+ data
22
+ end
23
+ end
24
+
25
+ @padding_data = (0..15).map do |length|
26
+ {plain: '5' * length, cipher_padding: '5' * length + (16 - length).chr * (16 - length), length: 32}
27
+ end
28
+ @padding_data << {plain: '5' * 16, cipher_padding: '5' * 16 + 16.chr * 16, length: 48}
29
+ end
30
+
31
+ describe "klass.encrypt/.decrypt" do
32
+ it "returns the padded result with IV on klass.encrypt" do
33
+ @padding_data.each do |data|
34
+ result = @algorithm_class.encrypt('some key' * 2, data[:plain])
35
+ assert_equal(data[:length], result.length)
36
+ assert_equal(data[:cipher_padding][-16, 16], result[-16, 16])
37
+ end
38
+ end
39
+
40
+ it "returns the decrypted result without padding and with IV removed on klass.decrypt" do
41
+ @padding_data.each do |data|
42
+ result = @algorithm_class.decrypt('some key' * 2, 'iv' * 8 + data[:cipher_padding])
43
+ assert_equal(data[:plain], result)
44
+ end
45
+ end
46
+
47
+ it "fails on decryption if the padding is invalid" do
48
+ assert_raises(HexaPDF::EncryptionError) do
49
+ @algorithm_class.decrypt('some' * 4, 'iv' * 8 + 'somedata' * 4)
50
+ end
51
+ end
52
+
53
+ it "fails on decryption if not enough bytes are provided" do
54
+ assert_raises(HexaPDF::EncryptionError) do
55
+ @algorithm_class.decrypt('some' * 4, 'no iv')
56
+ end
57
+ end
58
+ end
59
+
60
+ describe "klass.encryption_fiber/.decryption_fiber" do
61
+ before do
62
+ @fiber = Fiber.new { Fiber.yield('first'); 'second' }
63
+ end
64
+
65
+ it "returns the padded result with IV on encryption_fiber" do
66
+ @padding_data.each do |data|
67
+ result = @algorithm_class.encryption_fiber('some key' * 2, Fiber.new { data[:plain] })
68
+ result = TestHelper.collector(result)
69
+ assert_equal(data[:length], result.length)
70
+ assert_equal(data[:cipher_padding][-16, 16], result[-16, 16])
71
+ end
72
+ end
73
+
74
+ it "returns the decrypted result without padding and with IV removed on decryption_fiber" do
75
+ @padding_data.each do |data|
76
+ result = @algorithm_class.decryption_fiber('some key' * 2, Fiber.new {'iv' * 8 + data[:cipher_padding]})
77
+ result = TestHelper.collector(result)
78
+ assert_equal(data[:plain], result)
79
+ end
80
+ end
81
+
82
+ it "encryption works with multiple yielded strings" do
83
+ f = Fiber.new { Fiber.yield('a' * 40); Fiber.yield('test'); "b" * 20 }
84
+ result = TestHelper.collector(@algorithm_class.encryption_fiber('some key' * 2, f))
85
+ assert_equal('a' * 40 << 'test' << 'b' * 20, result[16..-17])
86
+ end
87
+
88
+ it "decryption works with multiple yielded strings" do
89
+ f = Fiber.new do
90
+ Fiber.yield('iv' * 4)
91
+ Fiber.yield('iv' * 4)
92
+ Fiber.yield('a' * 20)
93
+ Fiber.yield('a' * 20)
94
+ 8.chr * 8
95
+ end
96
+ result = TestHelper.collector(@algorithm_class.decryption_fiber('some key' * 2, f))
97
+ assert_equal('a' * 40, result)
98
+ end
99
+
100
+ it "fails on decryption if the padding is invalid" do
101
+ assert_raises(HexaPDF::EncryptionError) do
102
+ TestHelper.collector(@algorithm_class.decryption_fiber('some' * 4, Fiber.new { 'a' * 32 }))
103
+ end
104
+ end
105
+
106
+ it "fails on decryption if not enough bytes are provided" do
107
+ [4, 20, 40].each do |length|
108
+ assert_raises(HexaPDF::EncryptionError) do
109
+ TestHelper.collector(@algorithm_class.decryption_fiber('some' * 4, Fiber.new { 'a' * length }))
110
+ end
111
+ end
112
+ end
113
+ end
114
+
115
+ it "does basic validation on initialization" do
116
+ assert_raises(HexaPDF::EncryptionError) { @algorithm_class.new('t' * 7, '0' * 16, :encrypt) }
117
+ assert_raises(HexaPDF::EncryptionError) { @algorithm_class.new('t' * 16, '0' * 7, :encrypt) }
118
+ obj = @algorithm_class.new('t' * 16, 'i' * 16, 'encrypt')
119
+ assert_equal(:encrypt, obj.mode)
120
+ end
121
+ end
@@ -0,0 +1,39 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require_relative 'common'
4
+ require 'hexapdf/encryption/arc4'
5
+
6
+ describe HexaPDF::Encryption::ARC4 do
7
+ include EncryptionAlgorithmInterfaceTests
8
+
9
+ before do
10
+ @algorithm_class = Class.new do
11
+ prepend HexaPDF::Encryption::ARC4
12
+
13
+ def initialize(key)
14
+ @data = key
15
+ end
16
+
17
+ def process(data)
18
+ raise if data.empty?
19
+ result = @data << data
20
+ @data = ''
21
+ result
22
+ end
23
+ end
24
+ end
25
+
26
+ it "correctly uses klass.encrypt and klass.decrypt" do
27
+ assert_equal('mykeydata', @algorithm_class.encrypt('mykey', 'data'))
28
+ assert_equal('mykeydata', @algorithm_class.decrypt('mykey', 'data'))
29
+ end
30
+
31
+ it "correctly uses klass.encryption_fiber and klass.decryption_fiber" do
32
+ f = Fiber.new { Fiber.yield('first'); Fiber.yield(''); 'second' }
33
+ assert_equal('mykeyfirstsecond',
34
+ TestHelper.collector(@algorithm_class.encryption_fiber('mykey', f)))
35
+ f = Fiber.new { Fiber.yield('first'); 'second' }
36
+ assert_equal('mykeyfirstsecond',
37
+ TestHelper.collector(@algorithm_class.decryption_fiber('mykey', f)))
38
+ end
39
+ end
@@ -0,0 +1,17 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require_relative 'common'
4
+ require 'hexapdf/encryption/fast_aes'
5
+
6
+ describe HexaPDF::Encryption::FastAES do
7
+ include AESEncryptionTests
8
+
9
+ before do
10
+ @algorithm_class = HexaPDF::Encryption::FastAES
11
+ end
12
+
13
+ it "uses a better random bytes generator" do
14
+ assert_equal(@algorithm_class.singleton_class, @algorithm_class.method(:random_bytes).owner)
15
+ assert_equal(16, @algorithm_class.random_bytes(16).length)
16
+ end
17
+ end
@@ -0,0 +1,12 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require_relative 'common'
4
+ require 'hexapdf/encryption/fast_arc4'
5
+
6
+ describe HexaPDF::Encryption::FastARC4 do
7
+ include ARC4EncryptionTests
8
+
9
+ before do
10
+ @algorithm_class = HexaPDF::Encryption::FastARC4
11
+ end
12
+ end
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require_relative 'common'
4
+ require 'hexapdf/encryption/identity'
5
+
6
+ describe HexaPDF::Encryption::Identity do
7
+ include EncryptionAlgorithmInterfaceTests
8
+
9
+ before do
10
+ @algorithm_class = HexaPDF::Encryption::Identity
11
+ end
12
+
13
+ it "returns the data unmodified for encrypt/decrypt" do
14
+ assert_equal('data', @algorithm_class.encrypt('key', 'data'))
15
+ end
16
+
17
+ it "returns the source Fiber unmodified for encryption_fiber/decryption_fiber" do
18
+ f = Fiber.new {'data'}
19
+ assert_equal(f, @algorithm_class.encryption_fiber('key', f))
20
+ end
21
+ end
@@ -0,0 +1,23 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require_relative 'common'
4
+ require 'hexapdf/encryption/ruby_aes'
5
+ require 'hexapdf/encryption/fast_aes'
6
+
7
+ describe HexaPDF::Encryption::RubyAES do
8
+ include AESEncryptionTests
9
+
10
+ before do
11
+ @algorithm_class = HexaPDF::Encryption::RubyAES
12
+ end
13
+
14
+ it "is compatible with the OpenSSL based FastAES implementation" do
15
+ sample = Random.new.bytes(1024)
16
+ key = Random.new.bytes(16)
17
+ iv = Random.new.bytes(16)
18
+ assert_equal(sample, HexaPDF::Encryption::FastAES.new(key, iv, :encrypt).
19
+ process(HexaPDF::Encryption::RubyAES.new(key, iv, :decrypt).process(sample)))
20
+ assert_equal(sample, HexaPDF::Encryption::FastAES.new(key, iv, :decrypt).
21
+ process(HexaPDF::Encryption::RubyAES.new(key, iv, :encrypt).process(sample)))
22
+ end
23
+ end
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require_relative 'common'
4
+ require 'hexapdf/encryption/ruby_arc4'
5
+ require 'hexapdf/encryption/fast_arc4'
6
+
7
+ describe HexaPDF::Encryption::RubyARC4 do
8
+ include ARC4EncryptionTests
9
+
10
+ before do
11
+ @algorithm_class = HexaPDF::Encryption::RubyARC4
12
+ end
13
+
14
+ it "is compatible with the OpenSSL based FastARC4 implementation" do
15
+ @keys.each_with_index do |key, i|
16
+ assert_equal(@plain[i], HexaPDF::Encryption::FastARC4.new(key).
17
+ process(HexaPDF::Encryption::RubyARC4.new(key).process(@plain[i])))
18
+ end
19
+ end
20
+ end