facets 2.6.0 → 2.7.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 (321) hide show
  1. data/HISTORY.rdoc +331 -35
  2. data/MANIFEST +685 -826
  3. data/{doc/guide/notes.rd → NOTES} +0 -0
  4. data/README.rdoc +73 -25
  5. data/Rakefile +245 -2
  6. data/TODO +5 -0
  7. data/demo/hook.rd +47 -0
  8. data/demo/scenario_require.rd +9 -0
  9. data/doc/README.more +24 -6
  10. data/doc/manual/about.rb +47 -0
  11. data/doc/manual/annotations.rdoc +60 -0
  12. data/doc/manual/associations.rdoc +55 -0
  13. data/doc/manual/blockups.rdoc +101 -0
  14. data/doc/manual/capsule.rdoc +34 -0
  15. data/doc/manual/command.rdoc +177 -0
  16. data/doc/manual/core.rdoc +37 -0
  17. data/doc/manual/faq.rdoc +32 -0
  18. data/doc/manual/typecast.html +112 -0
  19. data/lib/core/facets.rb +359 -11
  20. data/lib/core/facets/array/combination.rb +3 -3
  21. data/lib/core/facets/array/index.rb +4 -1
  22. data/lib/core/facets/array/permutation.rb +2 -2
  23. data/lib/core/facets/array/product.rb +1 -1
  24. data/lib/core/facets/binding/eval.rb +1 -1
  25. data/lib/core/facets/denumerable.rb +76 -0
  26. data/lib/core/facets/duplicable.rb +34 -0
  27. data/lib/core/facets/enumerable/count.rb +10 -4
  28. data/lib/core/facets/enumerable/defer.rb +77 -0
  29. data/lib/core/facets/enumerable/each_by.rb +1 -1
  30. data/lib/core/facets/enumerable/every.rb +35 -0
  31. data/lib/{more/facets/elementwise.rb → core/facets/enumerable/ewise.rb} +0 -0
  32. data/lib/core/facets/enumerable/filter.rb +25 -0
  33. data/lib/core/facets/enumerable/group_by.rb +1 -1
  34. data/lib/core/facets/enumerable/none.rb +3 -2
  35. data/lib/core/facets/enumerable/one.rb +3 -2
  36. data/lib/core/facets/enumerable/per.rb +61 -0
  37. data/lib/core/facets/exception/raised.rb +14 -0
  38. data/lib/core/facets/integer/odd.rb +5 -1
  39. data/lib/core/facets/kernel/__dir__.rb +13 -3
  40. data/lib/core/facets/kernel/__here__.rb +14 -0
  41. data/lib/core/facets/kernel/__method__.rb +9 -3
  42. data/lib/core/facets/kernel/ask.rb +1 -0
  43. data/lib/core/facets/kernel/equate.rb +13 -0
  44. data/lib/core/facets/kernel/extension.rb +9 -0
  45. data/lib/core/facets/kernel/identical.rb +4 -0
  46. data/lib/core/facets/kernel/instance_exec.rb +2 -1
  47. data/lib/core/facets/kernel/method.rb +49 -0
  48. data/lib/core/facets/kernel/object_send.rb +2 -2
  49. data/lib/core/facets/kernel/{state.rb → object_state.rb} +23 -12
  50. data/lib/core/facets/kernel/require_all.rb +6 -1
  51. data/lib/core/facets/kernel/require_local.rb +8 -1
  52. data/lib/core/facets/kernel/require_relative.rb +52 -0
  53. data/lib/core/facets/kernel/source_location.rb +13 -0
  54. data/lib/core/facets/kernel/tap.rb +13 -6
  55. data/lib/core/facets/module/attr_setter.rb +57 -0
  56. data/lib/core/facets/module/instance_method.rb +24 -0
  57. data/lib/core/facets/module/module_load.rb +60 -44
  58. data/lib/core/facets/module/module_require.rb +1 -0
  59. data/lib/core/facets/nilclass/to_f.rb +1 -1
  60. data/lib/core/facets/objectspace/op_fetch.rb +3 -0
  61. data/lib/core/facets/proc/curry.rb +4 -3
  62. data/lib/core/facets/string/bytes.rb +10 -4
  63. data/lib/core/facets/string/camelcase.rb +6 -5
  64. data/lib/core/facets/string/chars.rb +5 -1
  65. data/lib/core/facets/string/each_char.rb +1 -1
  66. data/lib/core/facets/string/each_word.rb +1 -1
  67. data/lib/core/facets/string/lines.rb +11 -4
  68. data/lib/core/facets/string/start_with.rb +9 -2
  69. data/lib/core/facets/string/unfold.rb +27 -0
  70. data/lib/core/facets/symbol/succ.rb +3 -3
  71. data/lib/core/facets/symbol/thrown.rb +20 -0
  72. data/lib/core/facets/symbol/to_proc.rb +3 -2
  73. data/lib/core/facets/time/to_time.rb +1 -1
  74. data/lib/core/facets/to_hash.rb +41 -100
  75. data/lib/core/facets/unboundmethod/name.rb +20 -23
  76. data/lib/more/facets/ansicode.rb +1 -10
  77. data/lib/more/facets/autoarray.rb +3 -31
  78. data/lib/more/facets/basicobject.rb +73 -0
  79. data/lib/more/facets/blankslate.rb +2 -66
  80. data/lib/{lore → more}/facets/cgi.rb +0 -0
  81. data/lib/more/facets/class_extend.rb +1 -0
  82. data/lib/{lore → more}/facets/continuation.rb +0 -0
  83. data/lib/{lore → more}/facets/date.rb +3 -3
  84. data/lib/more/facets/enumargs.rb +192 -0
  85. data/lib/more/facets/enumerablepass.rb +2 -216
  86. data/lib/more/facets/enumerator.rb +62 -0
  87. data/lib/more/facets/{equatable.rb → equitable.rb} +11 -11
  88. data/lib/more/facets/expirable.rb +13 -41
  89. data/lib/{lore → more}/facets/fileutils.rb +0 -0
  90. data/lib/{lore → more}/facets/fileutils/head.rb +0 -0
  91. data/lib/{lore → more}/facets/fileutils/safe_ln.rb +0 -0
  92. data/lib/{lore → more}/facets/fileutils/slice.rb +0 -0
  93. data/lib/{lore → more}/facets/fileutils/tail.rb +0 -0
  94. data/lib/{lore → more}/facets/fileutils/wc.rb +0 -0
  95. data/lib/{lore → more}/facets/fileutils/whereis.rb +0 -0
  96. data/lib/{lore → more}/facets/fileutils/which.rb +0 -0
  97. data/lib/{lore → more}/facets/getoptlong.rb +0 -0
  98. data/lib/more/facets/hook.rb +2 -29
  99. data/lib/more/facets/inheritor.rb +2 -2
  100. data/lib/more/facets/instance_eval.rb +50 -0
  101. data/lib/more/facets/instance_function.rb +78 -0
  102. data/lib/more/facets/main.rb +20 -15
  103. data/lib/more/facets/memoize.rb +1 -113
  104. data/lib/more/facets/module/attr.rb +83 -0
  105. data/lib/more/facets/module/attr_tester.rb +44 -0
  106. data/lib/more/facets/module/attr_toggler.rb +59 -0
  107. data/lib/more/facets/module/attr_validator.rb +34 -0
  108. data/lib/more/facets/{class_extension.rb → module/class_extend.rb} +21 -13
  109. data/lib/more/facets/once.rb +59 -0
  110. data/lib/more/facets/openmodule.rb +1 -0
  111. data/lib/more/facets/orderedhash.rb +1 -33
  112. data/lib/{lore → more}/facets/ostruct.rb +0 -0
  113. data/lib/more/facets/ostructable.rb +1 -4
  114. data/lib/more/facets/partial.rb +18 -16
  115. data/lib/{lore → more}/facets/pathname.rb +0 -0
  116. data/lib/more/facets/preinitialize.rb +157 -0
  117. data/lib/{lore → more}/facets/rbconfig.rb +0 -0
  118. data/lib/more/facets/recorder.rb +1 -2
  119. data/lib/{lore → more}/facets/set.rb +0 -0
  120. data/lib/{lore → more}/facets/shellwords.rb +0 -0
  121. data/lib/{lore → more}/facets/uri.rb +0 -0
  122. data/lib/{lore → more}/facets/yaml.rb +0 -0
  123. data/lib/{lore → more}/facets/zlib.rb +0 -0
  124. data/meta/loadpath +0 -1
  125. data/meta/sitemap +4 -0
  126. data/meta/version +1 -1
  127. data/test/core/enumerable/test_count.rb +1 -1
  128. data/test/{more/test_filter.rb → core/enumerable/test_defer.rb} +24 -22
  129. data/test/{more/test_elementor.rb → core/enumerable/test_every.rb} +2 -15
  130. data/test/core/enumerable/test_ewise.rb +23 -0
  131. data/test/core/enumerable/test_per.rb +18 -0
  132. data/test/core/enumerable/test_take.rb +13 -0
  133. data/test/core/kernel/test_deepcopy.rb +1 -1
  134. data/test/{more/test_1stclassmethod.rb → core/kernel/test_method.rb} +2 -7
  135. data/test/core/kernel/test_tap.rb +1 -1
  136. data/test/core/proc/test_curry.rb +11 -0
  137. data/test/core/string/test_bytes.rb +1 -1
  138. data/test/core/string/test_camelcase.rb +23 -6
  139. data/test/core/string/test_lines.rb +1 -1
  140. data/test/core/string/test_unfold.rb +14 -0
  141. data/test/{more → core}/test_blank.rb +0 -0
  142. data/test/{more → core}/test_boolean.rb +0 -0
  143. data/test/{more → core}/test_functor.rb +0 -0
  144. data/test/{lore → more}/test_basicobject.rb +0 -0
  145. data/test/more/{test_class_extension.rb → test_class_extend.rb} +6 -6
  146. data/test/{lore → more}/test_continuation.rb +0 -0
  147. data/test/{lore → more}/test_date.rb +0 -0
  148. data/test/more/{test_enumerablepass.rb → test_enumargs.rb} +2 -4
  149. data/test/more/{test_equatable.rb → test_equitable.rb} +2 -2
  150. data/test/more/{test_instantise.rb → test_instance_function.rb} +3 -2
  151. data/test/more/test_memoize.rb +1 -1
  152. data/test/{lore → more}/test_ostruct.rb +0 -0
  153. metadata +865 -1016
  154. data/RELEASE +0 -38
  155. data/doc/README.lore +0 -51
  156. data/doc/log/basic_stats/index.html +0 -39
  157. data/doc/log/changelog.html +0 -648
  158. data/doc/log/changelog.txt +0 -217
  159. data/doc/log/stats/index.html +0 -39
  160. data/doc/log/testlog.txt +0 -278
  161. data/doc/notes/CHANGES +0 -2529
  162. data/doc/rdoc/lore/classes/Array.html +0 -176
  163. data/doc/rdoc/lore/classes/CGI.html +0 -191
  164. data/doc/rdoc/lore/classes/Config.html +0 -135
  165. data/doc/rdoc/lore/classes/Continuation.html +0 -113
  166. data/doc/rdoc/lore/classes/Date.html +0 -631
  167. data/doc/rdoc/lore/classes/DateTime.html +0 -583
  168. data/doc/rdoc/lore/classes/Enumerable.html +0 -89
  169. data/doc/rdoc/lore/classes/Enumerable/Enumerator.html +0 -147
  170. data/doc/rdoc/lore/classes/File.html +0 -128
  171. data/doc/rdoc/lore/classes/FileUtils.html +0 -434
  172. data/doc/rdoc/lore/classes/GetoptLong.html +0 -118
  173. data/doc/rdoc/lore/classes/GetoptLong/DSL.html +0 -208
  174. data/doc/rdoc/lore/classes/Kernel.html +0 -135
  175. data/doc/rdoc/lore/classes/Logger.html +0 -229
  176. data/doc/rdoc/lore/classes/Logger/Ansicolor.html +0 -277
  177. data/doc/rdoc/lore/classes/Logger/LogDevice.html +0 -121
  178. data/doc/rdoc/lore/classes/NilClass.html +0 -119
  179. data/doc/rdoc/lore/classes/OpenStruct.html +0 -432
  180. data/doc/rdoc/lore/classes/Pathname.html +0 -353
  181. data/doc/rdoc/lore/classes/Set.html +0 -117
  182. data/doc/rdoc/lore/classes/Shellwords.html +0 -111
  183. data/doc/rdoc/lore/classes/String.html +0 -140
  184. data/doc/rdoc/lore/classes/Time.html +0 -154
  185. data/doc/rdoc/lore/classes/URI.html +0 -454
  186. data/doc/rdoc/lore/classes/URI/Hash.html +0 -105
  187. data/doc/rdoc/lore/classes/URI/Kernel.html +0 -122
  188. data/doc/rdoc/lore/classes/Zlib.html +0 -188
  189. data/doc/rdoc/lore/created.rid +0 -1
  190. data/doc/rdoc/lore/files/README.html +0 -286
  191. data/doc/rdoc/lore/files/doc/README_lore.html +0 -155
  192. data/doc/rdoc/lore/files/lib/lore/facets/basicobject_rb.html +0 -118
  193. data/doc/rdoc/lore/files/lib/lore/facets/cgi_rb.html +0 -111
  194. data/doc/rdoc/lore/files/lib/lore/facets/continuation_rb.html +0 -147
  195. data/doc/rdoc/lore/files/lib/lore/facets/date_rb.html +0 -97
  196. data/doc/rdoc/lore/files/lib/lore/facets/enumerator_rb.html +0 -111
  197. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/head_rb.html +0 -96
  198. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/safe_ln_rb.html +0 -96
  199. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/slice_rb.html +0 -96
  200. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/tail_rb.html +0 -96
  201. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/wc_rb.html +0 -96
  202. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/whereis_rb.html +0 -96
  203. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/which_rb.html +0 -96
  204. data/doc/rdoc/lore/files/lib/lore/facets/fileutils_rb.html +0 -131
  205. data/doc/rdoc/lore/files/lib/lore/facets/getoptlong_rb.html +0 -135
  206. data/doc/rdoc/lore/files/lib/lore/facets/logger_rb.html +0 -142
  207. data/doc/rdoc/lore/files/lib/lore/facets/ostruct_rb.html +0 -135
  208. data/doc/rdoc/lore/files/lib/lore/facets/pathname_rb.html +0 -145
  209. data/doc/rdoc/lore/files/lib/lore/facets/rbconfig_rb.html +0 -124
  210. data/doc/rdoc/lore/files/lib/lore/facets/set_rb.html +0 -96
  211. data/doc/rdoc/lore/files/lib/lore/facets/shellwords_rb.html +0 -124
  212. data/doc/rdoc/lore/files/lib/lore/facets/uri_rb.html +0 -125
  213. data/doc/rdoc/lore/files/lib/lore/facets/yaml_rb.html +0 -146
  214. data/doc/rdoc/lore/files/lib/lore/facets/zlib_rb.html +0 -97
  215. data/doc/rdoc/lore/fr_class_index.html +0 -73
  216. data/doc/rdoc/lore/fr_file_index.html +0 -71
  217. data/doc/rdoc/lore/fr_method_index.html +0 -177
  218. data/doc/rdoc/lore/index.html +0 -26
  219. data/doc/rdoc/lore/rdoc-style.css +0 -177
  220. data/doc/release-notes/RELEASE-2.0.5 +0 -8
  221. data/doc/release-notes/RELEASE-2.1.0 +0 -9
  222. data/doc/release-notes/RELEASE-2.1.1 +0 -5
  223. data/doc/release-notes/RELEASE-2.1.2 +0 -6
  224. data/doc/release-notes/RELEASE-2.1.3 +0 -5
  225. data/doc/release-notes/RELEASE-2.2.0 +0 -14
  226. data/doc/release-notes/RELEASE-2.2.1 +0 -4
  227. data/doc/release-notes/RELEASE-2.3.0 +0 -6
  228. data/doc/release-notes/RELEASE-2.4.0 +0 -70
  229. data/doc/release-notes/RELEASE-2.4.1 +0 -8
  230. data/doc/release-notes/RELEASE-2.4.2 +0 -4
  231. data/doc/release-notes/RELEASE-2.4.3 +0 -78
  232. data/doc/release-notes/RELEASE-2.4.4 +0 -38
  233. data/doc/release-notes/RELEASE-2.4.5 +0 -37
  234. data/doc/release-notes/RELEASE-2.5.0 +0 -83
  235. data/lib/core/facets/kernel/instance.rb +0 -19
  236. data/lib/lore/facets/basicobject.rb +0 -14
  237. data/lib/lore/facets/enumerator.rb +0 -67
  238. data/lib/lore/facets/logger.rb +0 -291
  239. data/lib/more/facets/1stclassmethod.rb +0 -140
  240. data/lib/more/facets/advisable.rb +0 -162
  241. data/lib/more/facets/association.rb +0 -210
  242. data/lib/more/facets/attr.rb +0 -209
  243. data/lib/more/facets/basex.rb +0 -37
  244. data/lib/more/facets/bbcode.rb +0 -397
  245. data/lib/more/facets/bicrypt.rb +0 -265
  246. data/lib/more/facets/binreadable.rb +0 -221
  247. data/lib/more/facets/censor.rb +0 -97
  248. data/lib/more/facets/classmethods.rb +0 -199
  249. data/lib/more/facets/consoleutils.rb +0 -99
  250. data/lib/more/facets/crypt.rb +0 -166
  251. data/lib/more/facets/dependency.rb +0 -151
  252. data/lib/more/facets/downloader.rb +0 -281
  253. data/lib/more/facets/duplicable.rb +0 -43
  254. data/lib/more/facets/elementor.rb +0 -133
  255. data/lib/more/facets/filter.rb +0 -121
  256. data/lib/more/facets/heap.rb +0 -22
  257. data/lib/more/facets/infinity.rb +0 -193
  258. data/lib/more/facets/ini.rb +0 -264
  259. data/lib/more/facets/instantise.rb +0 -1
  260. data/lib/more/facets/instantize.rb +0 -95
  261. data/lib/more/facets/interval.rb +0 -282
  262. data/lib/more/facets/iteration.rb +0 -65
  263. data/lib/more/facets/linkedlist.rb +0 -222
  264. data/lib/more/facets/lrucache.rb +0 -157
  265. data/lib/more/facets/matcher.rb +0 -140
  266. data/lib/more/facets/memoizer.rb +0 -74
  267. data/lib/more/facets/minitar.rb +0 -1063
  268. data/lib/more/facets/nackclass.rb +0 -41
  269. data/lib/more/facets/net/smtp_tls.rb +0 -131
  270. data/lib/more/facets/nilstatus.rb +0 -48
  271. data/lib/more/facets/overload.rb +0 -94
  272. data/lib/more/facets/paramix.rb +0 -202
  273. data/lib/more/facets/pool.rb +0 -91
  274. data/lib/more/facets/pqueue.rb +0 -449
  275. data/lib/more/facets/pry.rb +0 -32
  276. data/lib/more/facets/reflection.rb +0 -145
  277. data/lib/more/facets/semaphore.rb +0 -92
  278. data/lib/more/facets/settings.rb +0 -248
  279. data/lib/more/facets/snapshot.rb +0 -209
  280. data/lib/more/facets/sparse_array.rb +0 -809
  281. data/lib/more/facets/string/mask.rb +0 -278
  282. data/lib/more/facets/string/obfuscate.rb +0 -65
  283. data/lib/more/facets/string/stylize.rb +0 -169
  284. data/lib/more/facets/string/words.rb +0 -167
  285. data/lib/more/facets/syncarray.rb +0 -114
  286. data/lib/more/facets/synchash.rb +0 -157
  287. data/lib/more/facets/typecast.rb +0 -261
  288. data/lib/more/facets/uninheritable.rb +0 -50
  289. data/lib/more/facets/xmlhash.rb +0 -112
  290. data/lib/more/facets/xoxo.rb +0 -259
  291. data/lib/more/facets/ziputils.rb +0 -490
  292. data/task/conflicts +0 -63
  293. data/task/coverage.rake +0 -37
  294. data/task/methods +0 -49
  295. data/task/rdoc.rake +0 -17
  296. data/task/setup.rake +0 -38
  297. data/task/test.rake +0 -145
  298. data/test/more/test_advisable.rb +0 -71
  299. data/test/more/test_association.rb +0 -38
  300. data/test/more/test_bbcode.rb +0 -21
  301. data/test/more/test_binreadable.rb +0 -50
  302. data/test/more/test_buildable.rb +0 -73
  303. data/test/more/test_classmethods.rb +0 -56
  304. data/test/more/test_crypt.rb +0 -32
  305. data/test/more/test_dependency.rb +0 -69
  306. data/test/more/test_elementwise.rb +0 -25
  307. data/test/more/test_infinity.rb +0 -40
  308. data/test/more/test_interval.rb +0 -151
  309. data/test/more/test_linkedlist.rb +0 -41
  310. data/test/more/test_lrucache.rb +0 -14
  311. data/test/more/test_overload.rb +0 -160
  312. data/test/more/test_paramix.rb +0 -170
  313. data/test/more/test_prototype.rb +0 -35
  314. data/test/more/test_snapshot.rb +0 -21
  315. data/test/more/test_sparsearray.rb +0 -279
  316. data/test/more/test_syncarray.rb +0 -15
  317. data/test/more/test_synchash.rb +0 -16
  318. data/test/more/test_typecast.rb +0 -54
  319. data/test/more/test_uninheritable.rb +0 -31
  320. data/test/more/test_xoxo.rb +0 -274
  321. data/test/test_facets.rb +0 -9
@@ -1,265 +0,0 @@
1
- # = BiCrypt
2
- #
3
- # A simple two-way encryption class.
4
- #
5
- # == Authors
6
- #
7
- # * Trans
8
- #
9
- # == Copying
10
- #
11
- # Copyright (c) 2007 Trans
12
- #
13
- # Ruby License
14
- #
15
- # This module is free software. You may use, modify, and/or redistribute this
16
- # software under the same terms as Ruby.
17
- #
18
- # This program is distributed in the hope that it will be useful, but WITHOUT
19
- # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
20
- # FOR A PARTICULAR PURPOSE.
21
-
22
- require 'stringio'
23
- require 'facets/string/xor'
24
-
25
- # = BiCrypt
26
- #
27
- # A simple two-way encryption class.
28
- #
29
- class BiCrypt
30
-
31
- ULONG = 0x100000000
32
-
33
- def block_size
34
- return(8)
35
- end
36
-
37
- def initialize(userKey)
38
-
39
- # These are the S-boxes given in Applied Cryptography 2nd Ed., p. 333
40
- @sBox = [
41
- [4, 10, 9, 2, 13, 8, 0, 14, 6, 11, 1, 12, 7, 15, 5, 3],
42
- [14, 11, 4, 12, 6, 13, 15, 10, 2, 3, 8, 1, 0, 7, 5, 9],
43
- [5, 8, 1, 13, 10, 3, 4, 2, 14, 15, 12, 7, 6, 0, 9, 11],
44
- [7, 13, 10, 1, 0, 8, 9, 15, 14, 4, 6, 12, 11, 2, 5, 3],
45
- [6, 12, 7, 1, 5, 15, 13, 8, 4, 10, 9, 14, 0, 3, 11, 2],
46
- [4, 11, 10, 0, 7, 2, 1, 13, 3, 6, 8, 5, 9, 12, 15, 14],
47
- [13, 11, 4, 1, 3, 15, 5, 9, 0, 10, 14, 7, 6, 8, 2, 12],
48
- [1, 15, 13, 0, 5, 7, 10, 4, 9, 2, 3, 14, 6, 11, 8, 12]
49
- ]
50
-
51
- # These are the S-boxes given in the GOST source code listing in Applied
52
- # Cryptography 2nd Ed., p. 644. They appear to be from the DES S-boxes
53
- # [13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7 ],
54
- # [ 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1 ],
55
- # [12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11 ],
56
- # [ 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9 ],
57
- # [ 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15 ],
58
- # [10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8 ],
59
- # [15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10 ],
60
- # [14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7 ]
61
-
62
- # precalculate the S table
63
- @sTable = precalculate_S_table()
64
-
65
- # derive the 32-byte key from the user-supplied key
66
- userKeyLength = userKey.length
67
- @key = userKey[0..31].unpack('C'*32)
68
- if (userKeyLength < 32)
69
- userKeyLength.upto(31) { @key << 0 }
70
- end
71
- end
72
-
73
-
74
- def precalculate_S_table()
75
- sTable = [[], [], [], []]
76
- 0.upto(3) { |i|
77
- 0.upto(255) { |j|
78
- t = @sBox[2*i][j % 16] | (@sBox[2*i+1][j/16] << 4)
79
- u = (8*i + 11) % 32
80
- v = (t << u) | (t >> (32-u))
81
- sTable[i][j] = (v % ULONG)
82
- }
83
- }
84
- return(sTable)
85
- end
86
-
87
-
88
- def f(longWord)
89
- longWord = longWord % ULONG
90
- a, b, c, d = [longWord].pack('L').unpack('CCCC')
91
- return(@sTable[3][d] ^ @sTable[2][c] ^ @sTable[1][b] ^ @sTable[0][a])
92
- end
93
-
94
- def encrypt_pair(xl, xr)
95
- 3.times {
96
- xr ^= f(xl+@key[0])
97
- xl ^= f(xr+@key[1])
98
- xr ^= f(xl+@key[2])
99
- xl ^= f(xr+@key[3])
100
- xr ^= f(xl+@key[4])
101
- xl ^= f(xr+@key[5])
102
- xr ^= f(xl+@key[6])
103
- xl ^= f(xr+@key[7])
104
- }
105
- xr ^= f(xl+@key[7])
106
- xl ^= f(xr+@key[6])
107
- xr ^= f(xl+@key[5])
108
- xl ^= f(xr+@key[4])
109
- xr ^= f(xl+@key[3])
110
- xl ^= f(xr+@key[2])
111
- xr ^= f(xl+@key[1])
112
- xl ^= f(xr+@key[0])
113
- return([xr, xl])
114
- end
115
-
116
-
117
- def decrypt_pair(xl, xr)
118
- xr ^= f(xl+@key[0])
119
- xl ^= f(xr+@key[1])
120
- xr ^= f(xl+@key[2])
121
- xl ^= f(xr+@key[3])
122
- xr ^= f(xl+@key[4])
123
- xl ^= f(xr+@key[5])
124
- xr ^= f(xl+@key[6])
125
- xl ^= f(xr+@key[7])
126
- 3.times {
127
- xr ^= f(xl+@key[7])
128
- xl ^= f(xr+@key[6])
129
- xr ^= f(xl+@key[5])
130
- xl ^= f(xr+@key[4])
131
- xr ^= f(xl+@key[3])
132
- xl ^= f(xr+@key[2])
133
- xr ^= f(xl+@key[1])
134
- xl ^= f(xr+@key[0])
135
- }
136
- return([xr, xl])
137
- end
138
-
139
- def encrypt_block(block)
140
- xl, xr = block.unpack('NN')
141
- xl, xr = encrypt_pair(xl, xr)
142
- encrypted = [xl, xr].pack('NN')
143
- return(encrypted)
144
- end
145
-
146
-
147
- def decrypt_block(block)
148
- xl, xr = block.unpack('NN')
149
- xl, xr = decrypt_pair(xl, xr)
150
- decrypted = [xl, xr].pack('NN')
151
- return(decrypted)
152
- end
153
-
154
- # When this module is mixed in with an encryption class, the class
155
- # must provide three methods: encrypt_block(block) and decrypt_block(block)
156
- # and block_size()
157
-
158
- def generate_initialization_vector(words)
159
- srand(Time.now.to_i)
160
- vector = ""
161
- words.times {
162
- vector << [rand(ULONG)].pack('N')
163
- }
164
- return(vector)
165
- end
166
-
167
-
168
- def encrypt_stream(plainStream, cryptStream)
169
- # Cypher-block-chain mode
170
-
171
- initVector = generate_initialization_vector(block_size() / 4)
172
- chain = encrypt_block(initVector)
173
- cryptStream.write(chain)
174
-
175
- while ((block = plainStream.read(block_size())) && (block.length == block_size()))
176
- block = block ^ chain
177
- encrypted = encrypt_block(block)
178
- cryptStream.write(encrypted)
179
- chain = encrypted
180
- end
181
-
182
- # write the final block
183
- # At most block_size()-1 bytes can be part of the message.
184
- # That means the final byte can be used to store the number of meaningful
185
- # bytes in the final block
186
- block = '' if block.nil?
187
- buffer = block.split('')
188
- remainingMessageBytes = buffer.length
189
- # we use 7-bit characters to avoid possible strange behavior on the Mac
190
- remainingMessageBytes.upto(block_size()-2) { buffer << rand(128).chr }
191
- buffer << remainingMessageBytes.chr
192
- block = buffer.join('')
193
- block = block ^ chain
194
- encrypted = encrypt_block(block)
195
- cryptStream.write(encrypted)
196
- end
197
-
198
-
199
- def decrypt_stream(cryptStream, plainStream)
200
- # Cypher-block-chain mode
201
- chain = cryptStream.read(block_size())
202
-
203
- while (block = cryptStream.read(block_size()))
204
- decrypted = decrypt_block(block)
205
- plainText = decrypted ^ chain
206
- plainStream.write(plainText) unless cryptStream.eof?
207
- chain = block
208
- end
209
-
210
- # write the final block, omitting the padding
211
- buffer = plainText.split('')
212
- remainingMessageBytes = buffer.last.unpack('C').first
213
- remainingMessageBytes.times { plainStream.write(buffer.shift) }
214
- end
215
-
216
-
217
- def carefully_open_file(filename, mode)
218
- begin
219
- aFile = File.new(filename, mode)
220
- rescue
221
- puts "Sorry. There was a problem opening the file <#{filename}>."
222
- aFile.close() unless aFile.nil?
223
- raise
224
- end
225
- return(aFile)
226
- end
227
-
228
-
229
- def encrypt_file(plainFilename, cryptFilename)
230
- plainFile = carefully_open_file(plainFilename, 'rb')
231
- cryptFile = carefully_open_file(cryptFilename, 'wb+')
232
- encrypt_stream(plainFile, cryptFile)
233
- plainFile.close unless plainFile.closed?
234
- cryptFile.close unless cryptFile.closed?
235
- end
236
-
237
-
238
- def decrypt_file(cryptFilename, plainFilename)
239
- cryptFile = carefully_open_file(cryptFilename, 'rb')
240
- plainFile = carefully_open_file(plainFilename, 'wb+')
241
- decrypt_stream(cryptFile, plainFile)
242
- cryptFile.close unless cryptFile.closed?
243
- plainFile.close unless plainFile.closed?
244
- end
245
-
246
-
247
- def encrypt_string(plainText)
248
- plainStream = StringIO.new(plainText)
249
- cryptStream = StringIO.new('')
250
- encrypt_stream(plainStream, cryptStream)
251
- cryptText = cryptStream.string
252
- return(cryptText)
253
- end
254
-
255
-
256
- def decrypt_string(cryptText)
257
- cryptStream = StringIO.new(cryptText)
258
- plainStream = StringIO.new('')
259
- decrypt_stream(cryptStream, plainStream)
260
- plainText = plainStream.string
261
- return(plainText)
262
- end
263
-
264
- end
265
-
@@ -1,221 +0,0 @@
1
- # = BinReadable
2
- #
3
- # This mixin solely depends on method read(n), which must be
4
- # defined in the class/module where you mix in this module.
5
- #
6
- # == Todo
7
- #
8
- # * The name of this module sucks.
9
- #
10
- # == Authors
11
- #
12
- # * Michael Neumann
13
- #
14
- # == Copying
15
- #
16
- # Copyright (c) 2003 Michael Neumann
17
- #
18
- # Ruby License
19
- #
20
- # This module is free software. You may use, modify, and/or redistribute this
21
- # software under the same terms as Ruby.
22
- #
23
- # This program is distributed in the hope that it will be useful, but WITHOUT
24
- # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
25
- # FOR A PARTICULAR PURPOSE.
26
-
27
- # = BinReadable
28
- #
29
- # This mixin solely depends on method read(n), which must be
30
- # defined in the class/module where you mix in this module.
31
-
32
- module BinReadable
33
-
34
- #--
35
- # TODO Would like to get the core functionality this provides into the
36
- # System module and then change BinaryReader to depend on that instead.
37
- #++
38
- module ByteOrder
39
-
40
- Native = :Native
41
- BigEndian = Big = Network = :BigEndian
42
- LittleEndian = Little = :LittleEndian
43
-
44
- # examines the byte order of the underlying machine
45
- def byte_order
46
- if [0x12345678].pack("L") == "\x12\x34\x56\x78"
47
- BigEndian
48
- else
49
- LittleEndian
50
- end
51
- end
52
-
53
- alias_method :byteorder, :byte_order
54
-
55
- def little_endian?
56
- byte_order == LittleEndian
57
- end
58
-
59
- def big_endian?
60
- byte_order == BigEndian
61
- end
62
-
63
- alias_method :little?, :little_endian?
64
- alias_method :big?, :big_endian?
65
- alias_method :network?, :big_endian?
66
-
67
- module_function :byte_order, :byteorder
68
- module_function :little_endian?, :little?
69
- module_function :big_endian?, :big?, :network?
70
-
71
- end
72
-
73
- # default is native byte-order
74
- def byte_order
75
- @byte_order || ByteOrder::Native
76
- end
77
-
78
- def byte_order=(new_byteorder)
79
- @byte_order = new_byteorder
80
- end
81
-
82
- alias byteorder byte_order
83
- alias byteorder= byte_order=
84
-
85
- # == 8 bit
86
-
87
- # no byteorder for 8 bit!
88
-
89
- def read_word8
90
- ru(1, 'C')
91
- end
92
-
93
- def read_int8
94
- ru(1, 'c')
95
- end
96
-
97
- # == 16 bit
98
-
99
- # === Unsigned
100
-
101
- def read_word16_native
102
- ru(2, 'S')
103
- end
104
-
105
- def read_word16_little
106
- ru(2, 'v')
107
- end
108
-
109
- def read_word16_big
110
- ru(2, 'n')
111
- end
112
-
113
- # === Signed
114
-
115
- def read_int16_native
116
- ru(2, 's')
117
- end
118
-
119
- def read_int16_little
120
- # swap bytes if native=big (but we want little)
121
- ru_swap(2, 's', ByteOrder::Big)
122
- end
123
-
124
- def read_int16_big
125
- # swap bytes if native=little (but we want big)
126
- ru_swap(2, 's', ByteOrder::Little)
127
- end
128
-
129
- # == 32 bit
130
-
131
- # === Unsigned
132
-
133
- def read_word32_native
134
- ru(4, 'L')
135
- end
136
-
137
- def read_word32_little
138
- ru(4, 'V')
139
- end
140
-
141
- def read_word32_big
142
- ru(4, 'N')
143
- end
144
-
145
- # === Signed
146
-
147
- def read_int32_native
148
- ru(4, 'l')
149
- end
150
-
151
- def read_int32_little
152
- # swap bytes if native=big (but we want little)
153
- ru_swap(4, 'l', ByteOrder::Big)
154
- end
155
-
156
- def read_int32_big
157
- # swap bytes if native=little (but we want big)
158
- ru_swap(4, 'l', ByteOrder::Little)
159
- end
160
-
161
- # == Aliases
162
-
163
- alias read_uint8 read_word8
164
-
165
- # add some short-cut functions
166
- %w(word16 int16 word32 int32).each do |typ|
167
- eval %{
168
- alias read_#{typ}_network read_#{typ}_big
169
- def read_#{typ}(byte_order = nil)
170
- case byte_order || @byte_order
171
- when ByteOrder::Native then read_#{typ}_native
172
- when ByteOrder::Little then read_#{typ}_little
173
- when ByteOrder::Network then read_#{typ}_network
174
- else raise ArgumentError
175
- end
176
- end
177
- }
178
- end
179
-
180
- {:word16 => :uint16, :word32 => :uint32}.each do |old, new|
181
- ['', '_native', '_little', '_big', '_network'].each do |bo|
182
- eval %{
183
- alias read_#{new}#{bo} read_#{old}#{bo}
184
- }
185
- end
186
- end
187
-
188
- def read_cstring
189
- str = ""
190
- while (c=readn(1)) != "\0"
191
- str << c
192
- end
193
- str
194
- end
195
-
196
- # read exactly n characters, otherwise raise an exception.
197
- def readn(n)
198
- str = read(n)
199
- raise "couldn't read #{n} characters" if str.nil? or str.size != n
200
- str
201
- end
202
-
203
- private
204
-
205
- # shortcut method for readn+unpack
206
- def ru(size, template)
207
- readn(size).unpack(template).first
208
- end
209
-
210
- # same as method +ru+, but swap bytes if native byteorder == _byteorder_
211
- def ru_swap(size, template, byteorder)
212
- str = readn(size)
213
- str.reverse! if ByteOrder.byteorder == byteorder
214
- str.unpack(template).first
215
- end
216
-
217
- end
218
-
219
- # Compatability with old version.
220
- BinaryReader = BinReadable
221
-