ooxml_crypt 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 (264) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE.txt +21 -0
  4. data/README.md +58 -0
  5. data/Rakefile +12 -0
  6. data/bin/console +15 -0
  7. data/bin/setup +8 -0
  8. data/ext/ooxml_crypt/extconf.rb +18 -0
  9. data/ext/ooxml_crypt/ooxml_crypt.c +27 -0
  10. data/ext/ooxml_crypt/ooxml_crypt.h +7 -0
  11. data/lib/ooxml_crypt/version.rb +5 -0
  12. data/lib/ooxml_crypt.rb +75 -0
  13. data/vendor/cybozulib/.github/workflows/main.yml +12 -0
  14. data/vendor/cybozulib/.gitignore +5 -0
  15. data/vendor/cybozulib/CMakeLists.txt +6 -0
  16. data/vendor/cybozulib/COPYRIGHT +27 -0
  17. data/vendor/cybozulib/Makefile +26 -0
  18. data/vendor/cybozulib/bin/libeay32.dll +0 -0
  19. data/vendor/cybozulib/bin/libmecab.dll +0 -0
  20. data/vendor/cybozulib/bin/ssleay32.dll +0 -0
  21. data/vendor/cybozulib/common.mk +116 -0
  22. data/vendor/cybozulib/common.props +25 -0
  23. data/vendor/cybozulib/cybozulib.sln +286 -0
  24. data/vendor/cybozulib/debug.props +14 -0
  25. data/vendor/cybozulib/include/cybozu/array.hpp +197 -0
  26. data/vendor/cybozulib/include/cybozu/atoi.hpp +238 -0
  27. data/vendor/cybozulib/include/cybozu/atomic.hpp +146 -0
  28. data/vendor/cybozulib/include/cybozu/base64.hpp +210 -0
  29. data/vendor/cybozulib/include/cybozu/benchmark.hpp +212 -0
  30. data/vendor/cybozulib/include/cybozu/bfd.hpp +105 -0
  31. data/vendor/cybozulib/include/cybozu/bit_operation.hpp +139 -0
  32. data/vendor/cybozulib/include/cybozu/bitvector.hpp +358 -0
  33. data/vendor/cybozulib/include/cybozu/condition_variable.hpp +113 -0
  34. data/vendor/cybozulib/include/cybozu/condition_variable_cs.hpp +74 -0
  35. data/vendor/cybozulib/include/cybozu/config.hpp +392 -0
  36. data/vendor/cybozulib/include/cybozu/critical_section.hpp +60 -0
  37. data/vendor/cybozulib/include/cybozu/crypto.hpp +321 -0
  38. data/vendor/cybozulib/include/cybozu/csucvector.hpp +624 -0
  39. data/vendor/cybozulib/include/cybozu/csv.hpp +294 -0
  40. data/vendor/cybozulib/include/cybozu/data_type.hpp +27 -0
  41. data/vendor/cybozulib/include/cybozu/endian.hpp +224 -0
  42. data/vendor/cybozulib/include/cybozu/env.hpp +63 -0
  43. data/vendor/cybozulib/include/cybozu/event.hpp +122 -0
  44. data/vendor/cybozulib/include/cybozu/exception.hpp +253 -0
  45. data/vendor/cybozulib/include/cybozu/file.hpp +626 -0
  46. data/vendor/cybozulib/include/cybozu/fmindex.hpp +291 -0
  47. data/vendor/cybozulib/include/cybozu/format.hpp +93 -0
  48. data/vendor/cybozulib/include/cybozu/frequency.hpp +264 -0
  49. data/vendor/cybozulib/include/cybozu/hash.hpp +67 -0
  50. data/vendor/cybozulib/include/cybozu/inttype.hpp +174 -0
  51. data/vendor/cybozulib/include/cybozu/itoa.hpp +336 -0
  52. data/vendor/cybozulib/include/cybozu/json.hpp +120 -0
  53. data/vendor/cybozulib/include/cybozu/line_stream.hpp +149 -0
  54. data/vendor/cybozulib/include/cybozu/link_libeay32.hpp +21 -0
  55. data/vendor/cybozulib/include/cybozu/link_mpir.hpp +18 -0
  56. data/vendor/cybozulib/include/cybozu/link_ssleay32.hpp +19 -0
  57. data/vendor/cybozulib/include/cybozu/log.hpp +237 -0
  58. data/vendor/cybozulib/include/cybozu/minixml.hpp +452 -0
  59. data/vendor/cybozulib/include/cybozu/mmap.hpp +143 -0
  60. data/vendor/cybozulib/include/cybozu/mutex.hpp +144 -0
  61. data/vendor/cybozulib/include/cybozu/nlp/mecab.hpp +96 -0
  62. data/vendor/cybozulib/include/cybozu/nlp/plsi.hpp +315 -0
  63. data/vendor/cybozulib/include/cybozu/nlp/random.hpp +74 -0
  64. data/vendor/cybozulib/include/cybozu/nlp/sparse.hpp +529 -0
  65. data/vendor/cybozulib/include/cybozu/nlp/svd.hpp +486 -0
  66. data/vendor/cybozulib/include/cybozu/nlp/tfidf.hpp +226 -0
  67. data/vendor/cybozulib/include/cybozu/nlp/top_score.hpp +75 -0
  68. data/vendor/cybozulib/include/cybozu/option.hpp +743 -0
  69. data/vendor/cybozulib/include/cybozu/parallel.hpp +88 -0
  70. data/vendor/cybozulib/include/cybozu/pcg.hpp +72 -0
  71. data/vendor/cybozulib/include/cybozu/process.hpp +324 -0
  72. data/vendor/cybozulib/include/cybozu/quit_signal_handler.hpp +66 -0
  73. data/vendor/cybozulib/include/cybozu/random_generator.hpp +144 -0
  74. data/vendor/cybozulib/include/cybozu/regex.hpp +463 -0
  75. data/vendor/cybozulib/include/cybozu/select8.hpp +279 -0
  76. data/vendor/cybozulib/include/cybozu/serializer.hpp +363 -0
  77. data/vendor/cybozulib/include/cybozu/sha1.hpp +209 -0
  78. data/vendor/cybozulib/include/cybozu/sha2.hpp +506 -0
  79. data/vendor/cybozulib/include/cybozu/siphash.hpp +105 -0
  80. data/vendor/cybozulib/include/cybozu/socket.hpp +785 -0
  81. data/vendor/cybozulib/include/cybozu/ssl.hpp +203 -0
  82. data/vendor/cybozulib/include/cybozu/stacktrace.hpp +291 -0
  83. data/vendor/cybozulib/include/cybozu/stream.hpp +269 -0
  84. data/vendor/cybozulib/include/cybozu/string.hpp +1746 -0
  85. data/vendor/cybozulib/include/cybozu/string_operation.hpp +365 -0
  86. data/vendor/cybozulib/include/cybozu/sucvector.hpp +378 -0
  87. data/vendor/cybozulib/include/cybozu/test.hpp +373 -0
  88. data/vendor/cybozulib/include/cybozu/thread.hpp +229 -0
  89. data/vendor/cybozulib/include/cybozu/time.hpp +281 -0
  90. data/vendor/cybozulib/include/cybozu/tls.hpp +115 -0
  91. data/vendor/cybozulib/include/cybozu/unordered_map.hpp +13 -0
  92. data/vendor/cybozulib/include/cybozu/unordered_set.hpp +13 -0
  93. data/vendor/cybozulib/include/cybozu/v128.hpp +376 -0
  94. data/vendor/cybozulib/include/cybozu/wavelet_matrix.hpp +345 -0
  95. data/vendor/cybozulib/include/cybozu/xorshift.hpp +189 -0
  96. data/vendor/cybozulib/include/cybozu/zlib.hpp +325 -0
  97. data/vendor/cybozulib/include/sais.hxx +364 -0
  98. data/vendor/cybozulib/misc/make_select8tbl.cpp +26 -0
  99. data/vendor/cybozulib/mk.bat +37 -0
  100. data/vendor/cybozulib/readme.md +29 -0
  101. data/vendor/cybozulib/release.props +12 -0
  102. data/vendor/cybozulib/sample/Makefile +30 -0
  103. data/vendor/cybozulib/sample/csucvector_smpl.cpp +42 -0
  104. data/vendor/cybozulib/sample/data/svd/org/test1.S +4 -0
  105. data/vendor/cybozulib/sample/data/svd/org/test1.U +4 -0
  106. data/vendor/cybozulib/sample/data/svd/org/test1.V +6 -0
  107. data/vendor/cybozulib/sample/data/svd/test1 +4 -0
  108. data/vendor/cybozulib/sample/data/svd/test2 +4 -0
  109. data/vendor/cybozulib/sample/desymbol.cpp +127 -0
  110. data/vendor/cybozulib/sample/exception_smpl.cpp +46 -0
  111. data/vendor/cybozulib/sample/fmindex_smpl.cpp +231 -0
  112. data/vendor/cybozulib/sample/log_smpl.cpp +19 -0
  113. data/vendor/cybozulib/sample/mecab_smpl.cpp +37 -0
  114. data/vendor/cybozulib/sample/option2_smpl.cpp +68 -0
  115. data/vendor/cybozulib/sample/option_smpl.cpp +42 -0
  116. data/vendor/cybozulib/sample/plsi_smpl.cpp +207 -0
  117. data/vendor/cybozulib/sample/proj/exception_smpl.vcproj +184 -0
  118. data/vendor/cybozulib/sample/proj/mecab_smpl.vcproj +184 -0
  119. data/vendor/cybozulib/sample/proj/ssl_smpl/ssl_smpl.vcxproj +85 -0
  120. data/vendor/cybozulib/sample/proj/ssl_smpl.vcproj +347 -0
  121. data/vendor/cybozulib/sample/proj/stacktrace_smpl/stacktrace_smpl.vcxproj +85 -0
  122. data/vendor/cybozulib/sample/proj/svd_smpl.vcproj +184 -0
  123. data/vendor/cybozulib/sample/quit_signal_handler.cpp +30 -0
  124. data/vendor/cybozulib/sample/serializer_smpl.cpp +196 -0
  125. data/vendor/cybozulib/sample/socket_smpl.cpp +82 -0
  126. data/vendor/cybozulib/sample/ssl_smpl.cpp +39 -0
  127. data/vendor/cybozulib/sample/stacktrace_smpl.cpp +52 -0
  128. data/vendor/cybozulib/sample/svd_bench_smpl.cpp +143 -0
  129. data/vendor/cybozulib/sample/svd_smpl.cpp +94 -0
  130. data/vendor/cybozulib/sample/wm_bench_smpl.cpp +182 -0
  131. data/vendor/cybozulib/sample/zlib_smpl.cpp +41 -0
  132. data/vendor/cybozulib/src/Makefile +8 -0
  133. data/vendor/cybozulib/src/base/Makefile +19 -0
  134. data/vendor/cybozulib/test/Makefile +12 -0
  135. data/vendor/cybozulib/test/base/Makefile +37 -0
  136. data/vendor/cybozulib/test/base/array_test.cpp +173 -0
  137. data/vendor/cybozulib/test/base/atoi_test.cpp +774 -0
  138. data/vendor/cybozulib/test/base/atomic_test.cpp +49 -0
  139. data/vendor/cybozulib/test/base/base64_test.cpp +113 -0
  140. data/vendor/cybozulib/test/base/bit_operation_test.cpp +134 -0
  141. data/vendor/cybozulib/test/base/bitvector_test.cpp +204 -0
  142. data/vendor/cybozulib/test/base/condition_variable_cs_test.cpp +92 -0
  143. data/vendor/cybozulib/test/base/condition_variable_test.cpp +88 -0
  144. data/vendor/cybozulib/test/base/config_test.cpp +236 -0
  145. data/vendor/cybozulib/test/base/crypto_test.cpp +122 -0
  146. data/vendor/cybozulib/test/base/csucvector_test.cpp +63 -0
  147. data/vendor/cybozulib/test/base/csv_test.cpp +182 -0
  148. data/vendor/cybozulib/test/base/data/a.xml +26 -0
  149. data/vendor/cybozulib/test/base/endian_test.cpp +56 -0
  150. data/vendor/cybozulib/test/base/env_test.cpp +22 -0
  151. data/vendor/cybozulib/test/base/event_test.cpp +41 -0
  152. data/vendor/cybozulib/test/base/file_test.cpp +233 -0
  153. data/vendor/cybozulib/test/base/fmindex_test.cpp +118 -0
  154. data/vendor/cybozulib/test/base/format_test.cpp +12 -0
  155. data/vendor/cybozulib/test/base/frequency_test.cpp +104 -0
  156. data/vendor/cybozulib/test/base/itoa_test.cpp +522 -0
  157. data/vendor/cybozulib/test/base/line_stream_test.cpp +208 -0
  158. data/vendor/cybozulib/test/base/mecab_test.cpp +41 -0
  159. data/vendor/cybozulib/test/base/minixml_test.cpp +103 -0
  160. data/vendor/cybozulib/test/base/mmap_test.cpp +15 -0
  161. data/vendor/cybozulib/test/base/option_test.cpp +487 -0
  162. data/vendor/cybozulib/test/base/parallel_test.cpp +48 -0
  163. data/vendor/cybozulib/test/base/proj/array_test/array_test.vcxproj +86 -0
  164. data/vendor/cybozulib/test/base/proj/atoi_test/atoi_test.vcxproj +86 -0
  165. data/vendor/cybozulib/test/base/proj/atomic_test/atomic_test.vcxproj +86 -0
  166. data/vendor/cybozulib/test/base/proj/base64_test/base64_test.vcxproj +86 -0
  167. data/vendor/cybozulib/test/base/proj/condition_variable_cs_test/condition_variable_cs_test.vcxproj +86 -0
  168. data/vendor/cybozulib/test/base/proj/condition_variable_test/condition_variable_test.vcxproj +86 -0
  169. data/vendor/cybozulib/test/base/proj/config_test/config_test.vcxproj +86 -0
  170. data/vendor/cybozulib/test/base/proj/csv_test/csv_test.vcxproj +86 -0
  171. data/vendor/cybozulib/test/base/proj/endian_test/endian_test.vcxproj +86 -0
  172. data/vendor/cybozulib/test/base/proj/env_test/env_test.vcxproj +86 -0
  173. data/vendor/cybozulib/test/base/proj/event_test/event_test.vcxproj +86 -0
  174. data/vendor/cybozulib/test/base/proj/file_test/file_test.vcxproj +86 -0
  175. data/vendor/cybozulib/test/base/proj/itoa_test/itoa_test.vcxproj +86 -0
  176. data/vendor/cybozulib/test/base/proj/mecab_test/mecab_test.vcxproj +88 -0
  177. data/vendor/cybozulib/test/base/proj/minixml_test/minixml_test.vcxproj +86 -0
  178. data/vendor/cybozulib/test/base/proj/mmap_test/mmap_test.vcxproj +86 -0
  179. data/vendor/cybozulib/test/base/proj/serializer_test/serializer_test.vcxproj +86 -0
  180. data/vendor/cybozulib/test/base/proj/sha1_test/sha1_test.vcxproj +86 -0
  181. data/vendor/cybozulib/test/base/proj/stream_test/stream_test.vcxproj +86 -0
  182. data/vendor/cybozulib/test/base/proj/string_operation_test/string_operation_test.vcxproj +86 -0
  183. data/vendor/cybozulib/test/base/proj/string_test/string_test.vcxproj +86 -0
  184. data/vendor/cybozulib/test/base/proj/thread_test/thread_test.vcxproj +86 -0
  185. data/vendor/cybozulib/test/base/proj/time_test/time_test.vcxproj +86 -0
  186. data/vendor/cybozulib/test/base/proj/tls_test/tls_test.vcxproj +86 -0
  187. data/vendor/cybozulib/test/base/proj/zlib_test/zlib_test.vcxproj +86 -0
  188. data/vendor/cybozulib/test/base/random_generator_test.cpp +28 -0
  189. data/vendor/cybozulib/test/base/regex_test.cpp +74 -0
  190. data/vendor/cybozulib/test/base/serializer_test.cpp +483 -0
  191. data/vendor/cybozulib/test/base/sha1_test.cpp +61 -0
  192. data/vendor/cybozulib/test/base/sha2_test.cpp +191 -0
  193. data/vendor/cybozulib/test/base/siphash_test.cpp +33 -0
  194. data/vendor/cybozulib/test/base/socket_test.cpp +76 -0
  195. data/vendor/cybozulib/test/base/stream_test.cpp +101 -0
  196. data/vendor/cybozulib/test/base/string_operation_test.cpp +340 -0
  197. data/vendor/cybozulib/test/base/string_test.cpp +1705 -0
  198. data/vendor/cybozulib/test/base/sucvector_test.cpp +312 -0
  199. data/vendor/cybozulib/test/base/thread_test.cpp +62 -0
  200. data/vendor/cybozulib/test/base/time_test.cpp +164 -0
  201. data/vendor/cybozulib/test/base/tls_test.cpp +50 -0
  202. data/vendor/cybozulib/test/base/wavelet_matrix_test.cpp +145 -0
  203. data/vendor/cybozulib/test/base/zlib_test.cpp +371 -0
  204. data/vendor/cybozulib/test/nlp/Makefile +27 -0
  205. data/vendor/cybozulib/test/nlp/proj/random_test.vcproj +184 -0
  206. data/vendor/cybozulib/test/nlp/proj/sparse_test.vcproj +184 -0
  207. data/vendor/cybozulib/test/nlp/proj/svd_test.vcproj +184 -0
  208. data/vendor/cybozulib/test/nlp/random_test.cpp +62 -0
  209. data/vendor/cybozulib/test/nlp/sparse_test.cpp +347 -0
  210. data/vendor/cybozulib/test/nlp/svd_test.cpp +234 -0
  211. data/vendor/cybozulib/test/nlp/top_score_test.cpp +40 -0
  212. data/vendor/cybozulib/tool/create_vcproj.py +186 -0
  213. data/vendor/cybozulib/tool/vcproj_tmpl.py +185 -0
  214. data/vendor/msoffice/COPYRIGHT +27 -0
  215. data/vendor/msoffice/Makefile +29 -0
  216. data/vendor/msoffice/bin/64/msoc.dll +0 -0
  217. data/vendor/msoffice/bin/64/msocsample.exe +0 -0
  218. data/vendor/msoffice/bin/64/msoffice-crypt.exe +0 -0
  219. data/vendor/msoffice/bin/msoc.dll +0 -0
  220. data/vendor/msoffice/bin/msocsample.exe +0 -0
  221. data/vendor/msoffice/bin/msoffice-crypt.exe +0 -0
  222. data/vendor/msoffice/common.mk +71 -0
  223. data/vendor/msoffice/common.props +26 -0
  224. data/vendor/msoffice/debug.props +14 -0
  225. data/vendor/msoffice/include/attack.hpp +211 -0
  226. data/vendor/msoffice/include/cfb.hpp +777 -0
  227. data/vendor/msoffice/include/crypto_util.hpp +450 -0
  228. data/vendor/msoffice/include/custom_sha1.hpp +342 -0
  229. data/vendor/msoffice/include/decode.hpp +240 -0
  230. data/vendor/msoffice/include/encode.hpp +221 -0
  231. data/vendor/msoffice/include/make_dataspace.hpp +316 -0
  232. data/vendor/msoffice/include/msoc.h +129 -0
  233. data/vendor/msoffice/include/resource.hpp +7 -0
  234. data/vendor/msoffice/include/standard_encryption.hpp +145 -0
  235. data/vendor/msoffice/include/uint32vec.hpp +179 -0
  236. data/vendor/msoffice/include/util.hpp +212 -0
  237. data/vendor/msoffice/lib/.emptydir +0 -0
  238. data/vendor/msoffice/misc/decrypt-xls.vbs +46 -0
  239. data/vendor/msoffice/mk.bat +1 -0
  240. data/vendor/msoffice/mkdll.bat +3 -0
  241. data/vendor/msoffice/msoc.def +13 -0
  242. data/vendor/msoffice/msocsample.py +178 -0
  243. data/vendor/msoffice/msoffice12.sln +31 -0
  244. data/vendor/msoffice/readme.md +110 -0
  245. data/vendor/msoffice/release.props +28 -0
  246. data/vendor/msoffice/src/Makefile +19 -0
  247. data/vendor/msoffice/src/attack.cpp +124 -0
  248. data/vendor/msoffice/src/cfb_test.cpp +77 -0
  249. data/vendor/msoffice/src/minisample.c +54 -0
  250. data/vendor/msoffice/src/msocdll.cpp +276 -0
  251. data/vendor/msoffice/src/msocsample.c +136 -0
  252. data/vendor/msoffice/src/msoffice-crypt.cpp +219 -0
  253. data/vendor/msoffice/src/proj/attack/attack.vcxproj +88 -0
  254. data/vendor/msoffice/src/proj/main/msoffice-crypt.vcxproj +88 -0
  255. data/vendor/msoffice/src/sha1.cpp +234 -0
  256. data/vendor/msoffice/test/Makefile +20 -0
  257. data/vendor/msoffice/test/cfb_test.cpp +74 -0
  258. data/vendor/msoffice/test/hash_test.cpp +59 -0
  259. data/vendor/msoffice/test/proj/cfb/cfb_test.vcxproj +90 -0
  260. data/vendor/msoffice/test/proj/hash/hash_test.vcxproj +90 -0
  261. data/vendor/msoffice/test/sampl.bat +8 -0
  262. data/vendor/msoffice/test_all.py +46 -0
  263. data/vendor/update +4 -0
  264. metadata +351 -0
@@ -0,0 +1,178 @@
1
+ # -*- coding: utf-8 -*-
2
+ # @file
3
+ # @brief MS Office Crypt DLL sample
4
+ # @author herumi
5
+ # Copyright (C) 2016 Cybozu Labs, Inc., all rights reserved.
6
+ import os, sys
7
+ import argparse
8
+ from ctypes import *
9
+ from ctypes.wintypes import LPWSTR, LPCSTR, LPVOID
10
+
11
+ MSOC_OPT_TYPE_SPIN_COUNT = 1
12
+ MSOC_OPT_TYPE_SECRET_KEY = 2
13
+
14
+ def getWargv():
15
+ cmd = cdll.kernel32.GetCommandLineW()
16
+ argc = c_int(0)
17
+ CommandLineToArgvW = windll.shell32.CommandLineToArgvW
18
+ CommandLineToArgvW.restype = POINTER(LPWSTR)
19
+ argv = CommandLineToArgvW(cmd, byref(argc))
20
+ ret = []
21
+ for i in xrange(argc.value):
22
+ ret.append(argv[i])
23
+ return ret
24
+
25
+ def wchar2ascii(w):
26
+ s = ''
27
+ for wc in w:
28
+ c = chr(ord(wc))
29
+ s += c
30
+ return s
31
+
32
+ def putErrMsg(lib, err):
33
+ MSOC_getErrMessage = lib.MSOC_getErrMessage
34
+ MSOC_getErrMessage.restype = LPCSTR
35
+ print 'ERR', MSOC_getErrMessage(err)
36
+ os._exit(1)
37
+
38
+ def _createOpt(lib):
39
+ opt = c_void_p(0)
40
+ MSOC_createOpt = lib.MSOC_createOpt
41
+ MSOC_createOpt.restype = LPVOID
42
+ opt = MSOC_createOpt()
43
+ if opt:
44
+ return opt
45
+ print 'ERR MSOC_createOpt()'
46
+ os._exit(1)
47
+
48
+ def _destroyOpt(lib, opt):
49
+ lib.MSOC_destroyOpt(opt)
50
+
51
+ def _getInt(lib, opt, optType):
52
+ intv = c_int(0)
53
+ err = lib.MSOC_getInt(byref(intv), opt, optType)
54
+ if err:
55
+ putErrMsg(lib, err)
56
+ return intv.value
57
+
58
+ def _setInt(lib, opt, optType, v):
59
+ err = lib.MSOC_setInt(opt, optType, v)
60
+ if err:
61
+ putErrMsg(lib, err)
62
+
63
+ def _getStr(lib, opt, optType):
64
+ svLen = 256
65
+ sv = create_string_buffer('\0' * svLen)
66
+ err = lib.MSOC_getStr(sv, svLen, opt, optType)
67
+ if err:
68
+ putErrMsg(lib, err)
69
+ return sv.value
70
+
71
+ def _setStr(lib, opt, optType, s):
72
+ cs = c_char_p(s)
73
+ err = lib.MSOC_setStr(opt, optType, cs)
74
+ if err:
75
+ putErrMsg(lib, err)
76
+
77
+ class Msoc:
78
+ def __init__(self):
79
+ if sys.maxsize > 2**32:
80
+ dll = 'bin/64/msoc.dll'
81
+ else:
82
+ dll = 'bin/msoc.dll'
83
+ self.lib = windll.LoadLibrary(dll)
84
+ self.opt = _createOpt(self.lib)
85
+ def __del__(self):
86
+ _destroyOpt(self.lib, self.opt)
87
+
88
+ def encrypt(self, outFile, inFile, ps):
89
+ outFileW = c_wchar_p(outFile)
90
+ inFileW = c_wchar_p(inFile)
91
+ psW = c_wchar_p(ps)
92
+ # permit self.opt is None
93
+ err = self.lib.MSOC_encrypt(outFileW, inFileW, psW, self.opt)
94
+ if err:
95
+ putErrMsg(self.lib, err)
96
+
97
+ def decrypt(self, outFile, inFile, ps):
98
+ if outFile:
99
+ outFileW = c_wchar_p(outFile)
100
+ else:
101
+ outFileW = None
102
+ inFileW = c_wchar_p(inFile)
103
+ psW = c_wchar_p(ps)
104
+ # permit self.opt is None
105
+ err = self.lib.MSOC_decrypt(outFileW, inFileW, psW, self.opt)
106
+ if err:
107
+ putErrMsg(self.lib, err)
108
+
109
+ def getOpt(self, optType):
110
+ if optType in [MSOC_OPT_TYPE_SPIN_COUNT]:
111
+ return _getInt(self.lib, self.opt, optType)
112
+ elif optType in [MSOC_OPT_TYPE_SECRET_KEY]:
113
+ return _getStr(self.lib, self.opt, optType)
114
+ else:
115
+ raise Exception('getOpt not support type', optType)
116
+
117
+ def setOpt(self, optType, v):
118
+ if optType in [MSOC_OPT_TYPE_SPIN_COUNT]:
119
+ return _setInt(self.lib, self.opt, optType, v)
120
+ elif optType in [MSOC_OPT_TYPE_SECRET_KEY]:
121
+ return _setStr(self.lib, self.opt, optType, v)
122
+ else:
123
+ raise Exception('setOpt not support type', optType)
124
+
125
+ def main():
126
+ parser = argparse.ArgumentParser(description='msocsample.py')
127
+ sub = parser.add_subparsers(dest='mode')
128
+ enc = sub.add_parser('enc', help='encrypt')
129
+ enc.add_argument('inFile')
130
+ enc.add_argument('outFile')
131
+ enc.add_argument('ps', help='password')
132
+ enc.add_argument('-sc', '--spinCount', help='spinCount')
133
+ enc.add_argument('-sk', '--secretKey', help='secretKey')
134
+
135
+ dec = sub.add_parser('dec', help='decrypt')
136
+ dec.add_argument('inFile')
137
+ dec.add_argument('outFile')
138
+ dec.add_argument('ps', help='password')
139
+
140
+ opt = sub.add_parser('opt', help='view option')
141
+ opt.add_argument('inFile')
142
+ opt.add_argument('ps', help='password')
143
+
144
+ dec_sk = sub.add_parser('dec-sk', help='decrypt by secret key')
145
+ dec_sk.add_argument('inFile')
146
+ dec_sk.add_argument('outFile')
147
+ dec_sk.add_argument('secretKey')
148
+
149
+ argv = getWargv()
150
+ for pos in xrange(len(argv)):
151
+ if argv[pos].find('msocsample.py') >= 0:
152
+ argv = argv[pos + 1:]
153
+ break
154
+
155
+ arg = parser.parse_args(argv)
156
+
157
+ msoc = Msoc()
158
+
159
+ if getattr(arg, 'secretKey', None) and arg.secretKey:
160
+ secretKey = wchar2ascii(arg.secretKey)
161
+ msoc.setOpt(MSOC_OPT_TYPE_SECRET_KEY, secretKey)
162
+ if getattr(arg, 'spinCount', None) and arg.spinCount:
163
+ spinCount = int(wchar2ascii(arg.spinCount))
164
+ msoc.setOpt(MSOC_OPT_TYPE_SPIN_COUNT, spinCount)
165
+
166
+ if arg.mode == 'enc':
167
+ msoc.encrypt(arg.outFile, arg.inFile, arg.ps)
168
+ elif arg.mode == 'dec':
169
+ msoc.decrypt(arg.outFile, arg.inFile, arg.ps)
170
+ elif arg.mode == 'opt':
171
+ msoc.decrypt(None, arg.inFile, arg.ps)
172
+ print 'spinCount', msoc.getOpt(MSOC_OPT_TYPE_SPIN_COUNT)
173
+ print 'secretKey', msoc.getOpt(MSOC_OPT_TYPE_SECRET_KEY)
174
+ elif arg.mode == 'dec-sk':
175
+ msoc.decrypt(arg.outFile, arg.inFile, None)
176
+
177
+ if __name__ == '__main__':
178
+ main()
@@ -0,0 +1,31 @@
1
+ Microsoft Visual Studio Solution File, Format Version 12.00
2
+ # Visual Studio 2012
3
+ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "attack", "src\proj\attack\attack.vcxproj", "{40B5AD5D-5F35-4FFD-945D-022E7F1AAB31}"
4
+ EndProject
5
+ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "hash_test", "test\proj\hash\hash_test.vcxproj", "{3964602A-8554-4AB5-BB10-E4A24CFBCA4F}"
6
+ EndProject
7
+ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "msoffice-crypt", "src\proj\main\msoffice-crypt.vcxproj", "{9E396E79-C168-4C40-BDE0-C9413B33C8CE}"
8
+ EndProject
9
+ Global
10
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
11
+ Debug|x64 = Debug|x64
12
+ Release|x64 = Release|x64
13
+ EndGlobalSection
14
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
15
+ {40B5AD5D-5F35-4FFD-945D-022E7F1AAB31}.Debug|x64.ActiveCfg = Debug|x64
16
+ {40B5AD5D-5F35-4FFD-945D-022E7F1AAB31}.Debug|x64.Build.0 = Debug|x64
17
+ {40B5AD5D-5F35-4FFD-945D-022E7F1AAB31}.Release|x64.ActiveCfg = Release|x64
18
+ {40B5AD5D-5F35-4FFD-945D-022E7F1AAB31}.Release|x64.Build.0 = Release|x64
19
+ {3964602A-8554-4AB5-BB10-E4A24CFBCA4F}.Debug|x64.ActiveCfg = Debug|x64
20
+ {3964602A-8554-4AB5-BB10-E4A24CFBCA4F}.Debug|x64.Build.0 = Debug|x64
21
+ {3964602A-8554-4AB5-BB10-E4A24CFBCA4F}.Release|x64.ActiveCfg = Release|x64
22
+ {3964602A-8554-4AB5-BB10-E4A24CFBCA4F}.Release|x64.Build.0 = Release|x64
23
+ {9E396E79-C168-4C40-BDE0-C9413B33C8CE}.Debug|x64.ActiveCfg = Debug|x64
24
+ {9E396E79-C168-4C40-BDE0-C9413B33C8CE}.Debug|x64.Build.0 = Debug|x64
25
+ {9E396E79-C168-4C40-BDE0-C9413B33C8CE}.Release|x64.ActiveCfg = Release|x64
26
+ {9E396E79-C168-4C40-BDE0-C9413B33C8CE}.Release|x64.Build.0 = Release|x64
27
+ EndGlobalSection
28
+ GlobalSection(SolutionProperties) = preSolution
29
+ HideSolutionNode = FALSE
30
+ EndGlobalSection
31
+ EndGlobal
@@ -0,0 +1,110 @@
1
+ # A tool/lib to encrypt/decrypt Microsoft Office Document
2
+
3
+ # Environment
4
+
5
+ * 64-bit Windows Visual Studio 2012 or later
6
+ * gcc 4.6, clang 3.0 or later
7
+
8
+ # How to make `bin/msoffice-crypt.exe`
9
+
10
+ Linux
11
+ ```
12
+ mkdir work
13
+ git clone https://github.com/herumi/cybozulib
14
+ git clone https://github.com/herumi/msoffice
15
+ cd msoffice
16
+ make -j RELEASE=1
17
+ ```
18
+ Windows
19
+ ```
20
+ mkdir work
21
+ git clone https://github.com/herumi/cybozulib
22
+ git clone https://github.com/herumi/msoffice
23
+ git clone https://github.com/herumi/cybozulib_ext # for openssl
24
+ cd msoffice
25
+ mk.bat ; or open msoffice12.sln and build
26
+ ```
27
+ # How to use
28
+ * Encrypt test.xlsx with a password `test`.
29
+ ```
30
+ bin/msoffice-crypt.exe -e -p test test.xlsx enc.xlsx
31
+ ```
32
+ * Decrypt enc.xlsx with a password `test`.
33
+ ```
34
+ bin/msoffice-crypt.exe -d -p test enc.xlsx dec.xlsx
35
+ ```
36
+
37
+ * Other options
38
+ ```
39
+ usage:msoffice-crypt.exe [opt] input output
40
+ -h : show this message
41
+ -p password in only ascii
42
+ -encMode 0:use AES128(default), 1: use AES256 for encoding
43
+ -ph8 password in utf8 hex. ex. 68656C6C6F for 'hello'
44
+ -ph16 password in utf16 hex. ex. u3042u3044u3046 for 'aiu' in hiragana
45
+ -k (experimental) secret key in hex. ex. 0123456789ABCDEF0123456789ABCDEF
46
+ -by (experimental) extract secret key from this file
47
+ -e encode
48
+ -d decode
49
+ -c spin count
50
+ -psk print secret key
51
+ -v print debug info
52
+ -vv print debug info and save binary data
53
+ ```
54
+ # Return code
55
+
56
+ * 0 success
57
+ * 1 not support formart
58
+ * 2 already encrypted with -e or decrypted with -d
59
+ * 3 bad password with -d
60
+
61
+ # Support format
62
+
63
+ Office 2010 or later Office Document format which suffix is pptx, docx, xlsx.
64
+
65
+ # DLL for Windows
66
+ * msoc.dll (Microsoft Office Crypto)
67
+
68
+ * [msoc.dll](https://github.com/herumi/msoffice/raw/master/bin/msoc.dll)
69
+ * [msoc.h](https://github.com/herumi/msoffice/blob/master/include/msoc.h)
70
+
71
+ * Encrypt `inFile` with `pass` and make `outFile`.
72
+ ```
73
+ MSOC_encrypt(outFile, inFile, pass, NULL);
74
+ ```
75
+ * Decrypt `inFile` with `pass` and make `outFile`.
76
+ ```
77
+ MSOC_decrypt(outFile, inFile, pass, NULL);
78
+ ```
79
+ ## Remark
80
+ The type of `inFile`, `outFile` and `pass` are `const wchar_t*`(UTF-16 string).
81
+ See [Csample code](https://github.com/herumi/msoffice/blob/master/src/msocsample.c)
82
+ and [Python sample code](https://github.com/herumi/msoffice/blob/master/bin/msocsample.py).
83
+
84
+ # lib for Linux
85
+ * libmsoc.lib
86
+
87
+ * Encrypt `inFile` with `pass` and make `outFile`.
88
+ ```
89
+ MSOC_encryptA(outFile, inFile, pass, NULL);
90
+ ```
91
+ * Decrypt `inFile` with `pass` and make `outFile`.
92
+ ```
93
+ MSOC_decryptA(outFile, inFile, pass, NULL);
94
+ ```
95
+ ## Remark
96
+ The type of `inFile`, `outFile` and `pass` are `const char*`(ascii string).
97
+ See [mini C sample code](https://github.com/herumi/msoffice/blob/master/src/minisample.c).
98
+
99
+ # License
100
+ BSD 3-Clause License
101
+
102
+ Copyright (c) 2015 Cybozu Labs, Inc. All rights reserved.
103
+
104
+ # References
105
+
106
+ * Compound File Binary File Format(v20120328)
107
+ [[MS-CFB]](http://msdn.microsoft.com/en-us/library/dd942138.aspx)
108
+ * Office Document Cryptography Structure Specification(v20120412)
109
+ [[MS-OFFCRYPTO]](http://msdn.microsoft.com/en-us/library/cc313071.aspx)
110
+ * CODE BLUE 2015 [[Backdoors with the MS Office file encryption master key and a proposal for a reliable file format]](http://www.slideshare.net/herumi/backdoors-with-the-ms-office-file-encryption-master-key-and-a-proposal-for-a-reliable-file-format)
@@ -0,0 +1,28 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3
+ <ImportGroup Label="PropertySheets" />
4
+ <PropertyGroup Label="UserMacros" />
5
+ <PropertyGroup />
6
+ <ItemDefinitionGroup>
7
+ <ClCompile>
8
+ <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
9
+ </ClCompile>
10
+ </ItemDefinitionGroup>
11
+ <ItemDefinitionGroup>
12
+ <ClCompile>
13
+ <IntrinsicFunctions>true</IntrinsicFunctions>
14
+ </ClCompile>
15
+ </ItemDefinitionGroup>
16
+ <ItemDefinitionGroup>
17
+ <ClCompile>
18
+ <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
19
+ </ClCompile>
20
+ </ItemDefinitionGroup>
21
+ <ItemDefinitionGroup>
22
+ <ClCompile>
23
+ <OmitFramePointers>true</OmitFramePointers>
24
+ <BufferSecurityCheck>false</BufferSecurityCheck>
25
+ </ClCompile>
26
+ </ItemDefinitionGroup>
27
+ <ItemGroup />
28
+ </Project>
@@ -0,0 +1,19 @@
1
+ include ../common.mk
2
+
3
+ TARGET=$(TEST_FILE)
4
+
5
+ SRC=msoffice-crypt.cpp attack.cpp
6
+
7
+ all: $(TARGET) $(SRC)
8
+
9
+ test: $(TARGET)
10
+ @$(SAMPLE_TEST)
11
+
12
+ $(OBJDIR):
13
+ @$(MKDIR) $(OBJDIR)
14
+
15
+ clean:
16
+ $(CLEAN)
17
+
18
+ -include $(DEPEND_FILE)
19
+
@@ -0,0 +1,124 @@
1
+ /**
2
+ Copyright (C) 2012 Cybozu Labs, Inc., all rights reserved.
3
+ */
4
+ #include <stdio.h>
5
+ #include <stdlib.h>
6
+ #include <string>
7
+ #include <locale>
8
+ #include <fstream>
9
+ #include <cybozu/mmap.hpp>
10
+ #include <cybozu/file.hpp>
11
+ #include <cybozu/atoi.hpp>
12
+ #include <cybozu/option.hpp>
13
+ #include "cfb.hpp"
14
+ #include "attack.hpp"
15
+ #include "make_dataspace.hpp"
16
+
17
+ struct Option {
18
+ typedef std::vector<std::string> StrVec;
19
+ std::string encFile;
20
+ std::string charSet;
21
+ StrVec passSet;
22
+ size_t threadNum;
23
+ size_t passLen;
24
+ void trim(std::string& str) const
25
+ {
26
+ const size_t size = str.size();
27
+ if (size == 0) return;
28
+ const char c = str[size - 1];
29
+ if (c == '\n' || c == '\r') str.resize(size - 1);
30
+ }
31
+ void toUtf8(std::string& str) const
32
+ {
33
+ const size_t size = str.size();
34
+ std::string out(size * 2, '\0');
35
+ for (size_t i = 0; i < size; i++) {
36
+ out[i * 2] = str[i];
37
+ }
38
+ str.swap(out);
39
+ }
40
+ static inline bool lessByLength(const std::string& rhs, const std::string& lhs)
41
+ {
42
+ if (rhs.size() < lhs.size()) return true;
43
+ if (rhs.size() > lhs.size()) return false;
44
+ return rhs < lhs;
45
+ }
46
+ Option(int argc, const char *const argv[])
47
+ {
48
+ cybozu::Option opt;
49
+ std::string charSetFile;
50
+ std::string dicFile;
51
+ bool debug;
52
+ opt.appendOpt(&charSetFile, "", "cf", "char set file");
53
+ opt.appendOpt(&threadNum, 4, "t", "thread num");
54
+ opt.appendOpt(&dicFile, "", "d", "dictionary file");
55
+ opt.appendOpt(&passLen, 0, "l", "length of pass");
56
+ opt.appendBoolOpt(&debug, "v", "verbose message");
57
+ opt.appendHelp("h");
58
+ opt.appendParam(&encFile, "encrypted file");
59
+ if (!opt.parse(argc, argv)) {
60
+ opt.usage();
61
+ exit(1);
62
+ }
63
+ if (debug) ms::setDebug(2);
64
+ if (charSetFile.empty()) {
65
+ charSet = "abcdefghijklmnopqrstuvwxyz"
66
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
67
+ "0123456789-_";
68
+ } else {
69
+ std::ifstream ifs(charSetFile.c_str(), std::ios::binary);
70
+ if (!std::getline(ifs, charSet)) {
71
+ fprintf(stderr, "can't read char set file [%s]\n", charSetFile.c_str());
72
+ exit(1);
73
+ }
74
+ trim(charSet);
75
+ }
76
+ if (!dicFile.empty()) {
77
+ std::ifstream ifs(dicFile.c_str(), std::ios::binary);
78
+ std::string line;
79
+ while (std::getline(ifs, line)) {
80
+ trim(line);
81
+ toUtf8(line);
82
+ passSet.push_back(line);
83
+ }
84
+ if (passSet.empty()) {
85
+ fprintf(stderr, "can't read dicFile [%s]\n", dicFile.c_str());
86
+ exit(1);
87
+ }
88
+ std::sort(passSet.begin(), passSet.end(), &lessByLength);
89
+ }
90
+ if (ms::isDebug()) {
91
+ opt.put();
92
+ }
93
+ }
94
+ };
95
+
96
+ int main(int argc, char *argv[])
97
+ try
98
+ {
99
+ #ifdef SHA1_USE_SIMD
100
+ printf("use simd x %d\n", Uint32Vec::size);
101
+ #endif
102
+ const Option opt(argc, argv);
103
+ cybozu::Mmap m(opt.encFile);
104
+ const char *data = m.get();
105
+ if (m.size() > 0xffffffff) {
106
+ throw cybozu::Exception("ms:encode:m.size") << m.size();
107
+ }
108
+ const uint32_t dataSize = static_cast<uint32_t>(m.size());
109
+ const ms::Format format = ms::DetectFormat(data, dataSize);
110
+
111
+ if (format == ms::fZip) {
112
+ printf("already decrypted\n");
113
+ return 2;
114
+ }
115
+ if (!opt.passSet.empty()) {
116
+ ms::Attack attack(data, dataSize, opt.threadNum, opt.passSet);
117
+ }
118
+ if (opt.passLen) {
119
+ ms::Attack attack(data, dataSize, opt.passLen);
120
+ }
121
+ } catch (std::exception& e) {
122
+ printf("exception:%s\n", e.what());
123
+ return 1;
124
+ }
@@ -0,0 +1,77 @@
1
+ #include <stdio.h>
2
+ #include <stdlib.h>
3
+ #include <string>
4
+ #include <locale>
5
+ #include <fstream>
6
+ #include <cybozu/mmap.hpp>
7
+ #include "cfb.hpp"
8
+
9
+
10
+ void usage()
11
+ {
12
+ fprintf(stderr, "cfb_test -f <inFile>\n");
13
+ exit(1);
14
+ }
15
+
16
+ std::string toAscii(const cybozu::String16& str)
17
+ {
18
+ std::string ret;
19
+ if (cybozu::ConvertUtf16ToUtf8(&ret, str)) {
20
+ return ret;
21
+ }
22
+ return "";
23
+ }
24
+
25
+ void run(const std::string& inFile)
26
+ {
27
+ cybozu::Mmap m(inFile);
28
+ if (m.size() > 0xffffffff) {
29
+ fprintf(stderr, "too large file size %lld\n", m.size());
30
+ exit(1);
31
+ }
32
+ const uint32_t mSize = static_cast<uint32_t>(m.size());
33
+ ms::cfb::CompoundFile cfb(m.get(), mSize);
34
+ cfb.put();
35
+ const char nameTbl[][128] = {
36
+ "EncryptedPackage",
37
+ "EncryptionInfo",
38
+ };
39
+ const ms::cfb::DirectoryEntryVec& dirs = cfb.dirs;
40
+ for (size_t i = 0; i < dirs.size(); i++) {
41
+ const ms::cfb::DirectoryEntry& dir = dirs[i];
42
+ for (size_t j = 0; j < CYBOZU_NUM_OF_ARRAY(nameTbl); j++) {
43
+ std::string asc = toAscii(dir.directoryEntryName);
44
+ if (asc == nameTbl[j]) {
45
+ printf("save %s\n", nameTbl[j]);
46
+ std::ofstream ofs(nameTbl[j], std::ios::binary);
47
+ ofs.write((const char*)&dir.data[0], (size_t)dir.streamSize);
48
+ }
49
+ }
50
+ }
51
+ }
52
+
53
+ int main(int argc, char *argv[])
54
+ try
55
+ {
56
+ std::locale::global(std::locale(""));
57
+
58
+ argc--, argv++;
59
+ std::string inFile;
60
+ while (argc > 0) {
61
+ if (argc > 1 && strcmp(*argv, "-f") == 0) {
62
+ argc--, argv++;
63
+ inFile = *argv;
64
+ } else
65
+ {
66
+ usage();
67
+ }
68
+ argc--, argv++;
69
+ }
70
+ if (inFile.empty()) {
71
+ usage();
72
+ }
73
+ run(inFile);
74
+ } catch (std::exception& e) {
75
+ fprintf(stderr, "exception:%s\n", e.what());
76
+ return 1;
77
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ @file
3
+ @brief mini MS Office Crypt DLL sample
4
+ @author herumi
5
+ Copyright (C) 2016 Cybozu Labs, Inc., all rights reserved.
6
+ */
7
+ #include "msoc.h"
8
+ #include <stdio.h>
9
+ #include <string.h>
10
+
11
+ void usage()
12
+ {
13
+ const char *s =
14
+ "how to use\n"
15
+ "minisample enc <inFile> <outFile> <pass>\n"
16
+ "minisample dec <inFile> <outFile> <pass>\n";
17
+ printf("%s", s);
18
+ exit(1);
19
+ }
20
+
21
+ int main(int argc, char **argv)
22
+ {
23
+ int err = 0;
24
+ const char *mode = NULL;
25
+ const char *inFile = NULL;
26
+ const char *outFile = NULL;
27
+ const char *pass = NULL;
28
+
29
+ argc--, argv++;
30
+ if (argc != 4) {
31
+ usage();
32
+ }
33
+ mode = argv[0];
34
+ inFile = argv[1];
35
+ outFile = argv[2];
36
+ pass = argv[3];
37
+ printf("enc in=%s, out=%s, pass=%s\n", inFile, outFile, pass);
38
+
39
+ if (strcmp(mode, "enc") == 0) {
40
+ err = MSOC_encryptA(outFile, inFile, pass, NULL);
41
+ } else if (strcmp(mode, "dec") == 0) {
42
+ err = MSOC_decryptA(outFile, inFile, pass, NULL);
43
+ } else {
44
+ printf("base mode=%s\n", mode);
45
+ usage();
46
+ }
47
+ if (err != MSOC_NOERR) {
48
+ printf("ERR %s\n", MSOC_getErrMessage(err));
49
+ return 1;
50
+ } else {
51
+ puts("ok");
52
+ }
53
+ return 0;
54
+ }