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,276 @@
1
+ /**
2
+ @file
3
+ @brief MS Office Crypt DLL
4
+ @author herumi
5
+ Copyright (C) 2016 Cybozu Labs, Inc., all rights reserved.
6
+ */
7
+ #ifdef _MSC_VER
8
+ #pragma warning(disable : 4456)
9
+ #pragma warning(disable : 4458)
10
+ #endif
11
+
12
+ #define MSOC_DONT_AUTO_LINK
13
+ #include "cfb.hpp"
14
+ #include "decode.hpp"
15
+ #include "encode.hpp"
16
+ #include "make_dataspace.hpp"
17
+ #include "msoc.h"
18
+
19
+ static const size_t maxExceptionSize = 1024;
20
+ static char g_exception[maxExceptionSize + 1] = "exception";
21
+
22
+ static void setException(const std::exception& e)
23
+ {
24
+ /// QQQ : not multi-thread
25
+ size_t len = strlen(e.what());
26
+ if (len >= maxExceptionSize) len = maxExceptionSize;
27
+ memcpy(g_exception, e.what(), len);
28
+ g_exception[len] = '\0';
29
+ }
30
+
31
+ const char * MSOC_DLL_EXPORT MSOC_getErrMessage(int err)
32
+ {
33
+ switch (err) {
34
+ case MSOC_NOERR:
35
+ return "noerr";
36
+ case MSOC_ERR_NOT_SUPPORT:
37
+ return "not supported format";
38
+ case MSOC_ERR_ALREADY_ENCRYPTED:
39
+ return "already encrypted";
40
+ case MSOC_ERR_ALREADY_DECRYPTED:
41
+ return "already decrypted";
42
+ case MSOC_ERR_BAD_PASSWORD:
43
+ return "bad password";
44
+ case MSOC_ERR_NO_MEMORY:
45
+ return "no memory";
46
+ case MSOC_ERR_EXCEPTION:
47
+ return g_exception;
48
+ case MSOC_ERR_TOO_LARGE_FILE:
49
+ return "too large file";
50
+ case MSOC_ERR_INFILE_IS_EMPTY:
51
+ return "inFile is empty";
52
+ case MSOC_ERR_OUTFILE_IS_EMPTY:
53
+ return "outFile is empty";
54
+ case MSOC_ERR_PASS_IS_EMPTY:
55
+ return "pass is empty";
56
+ default:
57
+ return "unknown err";
58
+ }
59
+ }
60
+
61
+ struct msoc_opt {
62
+ int spinCount;
63
+ std::string secretKey;
64
+ msoc_opt()
65
+ : spinCount(100000)
66
+ , secretKey()
67
+ {
68
+ }
69
+ };
70
+
71
+ msoc_opt * MSOC_DLL_EXPORT MSOC_createOpt(void)
72
+ {
73
+ try {
74
+ return new msoc_opt();
75
+ } catch (...) {
76
+ return NULL;
77
+ }
78
+ }
79
+
80
+ void MSOC_DLL_EXPORT MSOC_destroyOpt(msoc_opt *msoc)
81
+ {
82
+ delete(msoc);
83
+ }
84
+
85
+ int MSOC_DLL_EXPORT MSOC_getInt(int *value, const msoc_opt *opt, int optType)
86
+ {
87
+ switch (optType) {
88
+ case MSOC_OPT_TYPE_SPIN_COUNT:
89
+ *value = opt->spinCount;
90
+ return MSOC_NOERR;
91
+ default:
92
+ return MSOC_ERR_BAD_PARAMETER;
93
+ }
94
+ }
95
+
96
+ int MSOC_DLL_EXPORT MSOC_setInt(msoc_opt *opt, int optType, int value)
97
+ {
98
+ switch (optType) {
99
+ case MSOC_OPT_TYPE_SPIN_COUNT:
100
+ opt->spinCount = value;
101
+ return MSOC_NOERR;
102
+ default:
103
+ return MSOC_ERR_BAD_PARAMETER;
104
+ }
105
+ }
106
+
107
+ static int getStr(char *str, size_t maxSize, const std::string& s)
108
+ {
109
+ if (maxSize < s.size() + 1) return MSOC_ERR_SMALL_MAX_SIZE;
110
+ memcpy(str, s.c_str(), s.size());
111
+ str[s.size()] = '\0';
112
+ return MSOC_NOERR;
113
+ }
114
+
115
+ int MSOC_DLL_EXPORT MSOC_getStr(char *str, size_t maxSize, const msoc_opt *opt, int optType)
116
+ {
117
+ switch (optType) {
118
+ case MSOC_OPT_TYPE_SECRET_KEY:
119
+ return getStr(str, maxSize, opt->secretKey);
120
+ default:
121
+ return MSOC_ERR_BAD_PARAMETER;
122
+ }
123
+ }
124
+
125
+ int MSOC_DLL_EXPORT MSOC_setStr(msoc_opt *opt, int optType, const char *str)
126
+ try
127
+ {
128
+ switch (optType) {
129
+ case MSOC_OPT_TYPE_SECRET_KEY:
130
+ opt->secretKey = str;
131
+ return MSOC_NOERR;
132
+ default:
133
+ return MSOC_ERR_BAD_PARAMETER;
134
+ }
135
+ } catch (...) {
136
+ return MSOC_ERR_NO_MEMORY;
137
+ }
138
+
139
+ template<class T>
140
+ static int readFile(std::string& data, ms::Format& format, uint32_t& dataSize, const T *inFile)
141
+ {
142
+ cybozu::Mmap m(inFile);
143
+ if (m.size() > 0xffffffff) {
144
+ return MSOC_ERR_TOO_LARGE_FILE;
145
+ }
146
+ dataSize = static_cast<uint32_t>(m.size());
147
+ data.assign(m.get(), dataSize);
148
+ format = ms::DetectFormat(data.data(), dataSize);
149
+ return MSOC_NOERR;
150
+ }
151
+
152
+ /*
153
+ REMARK : passData is UTF-16 encoded
154
+ if pass = "abc"
155
+ passData[0] = 'a'
156
+ passData[1] = '\0'
157
+ passData[2] = 'b'
158
+ passData[3] = '\0'
159
+ passData[4] = 'c'
160
+ passData[5] = '\0'
161
+ */
162
+ template<class T>
163
+ int encrypt(const T *outFile, const T *inFile, const std::string& passData, const msoc_opt *opt)
164
+ {
165
+ if (outFile == NULL) return MSOC_ERR_OUTFILE_IS_EMPTY;
166
+ if (inFile == NULL) return MSOC_ERR_INFILE_IS_EMPTY;
167
+ const bool isOffice2013 = true;
168
+ std::string data;
169
+ ms::Format format;
170
+ uint32_t dataSize;
171
+ int err = readFile(data, format, dataSize, inFile);
172
+ if (err != MSOC_NOERR) return err;
173
+ if (format == ms::fCfb) {
174
+ return MSOC_ERR_ALREADY_ENCRYPTED;
175
+ }
176
+ int spinCount = 100000;
177
+ std::string secretKey;
178
+ if (opt) {
179
+ if (opt->spinCount) spinCount = opt->spinCount;
180
+ if (!opt->secretKey.empty()) secretKey = ms::fromHex(opt->secretKey);
181
+ }
182
+ std::basic_string<T> outFileW = outFile;
183
+ ms::encode(data.data(), dataSize, outFileW, passData, isOffice2013, secretKey, spinCount);
184
+ return MSOC_NOERR;
185
+ }
186
+
187
+ static std::string convertChar2Wchar(const char *s)
188
+ {
189
+ if (s == NULL) return "";
190
+ const size_t len= strlen(s);
191
+ std::string ret;
192
+ ret.resize(len * 2);
193
+ for (size_t i = 0; i < len; i++) {
194
+ ret[i * 2] = s[i];
195
+ }
196
+ return ret;
197
+ }
198
+
199
+ int MSOC_DLL_EXPORT MSOC_encryptA(const char *outFile, const char *inFile, const char *pass, const msoc_opt *opt)
200
+ try
201
+ {
202
+ if (pass == NULL) return MSOC_ERR_PASS_IS_EMPTY;
203
+ std::string passData = convertChar2Wchar(pass);
204
+ return encrypt(outFile, inFile, passData, opt);
205
+ } catch (std::exception& e) {
206
+ setException(e);
207
+ return MSOC_ERR_EXCEPTION;
208
+ }
209
+
210
+ #ifdef _MSC_VER
211
+ int MSOC_DLL_EXPORT MSOC_encrypt(const wchar_t *outFile, const wchar_t *inFile, const wchar_t *pass, const msoc_opt *opt)
212
+ try
213
+ {
214
+ if (pass == NULL) return MSOC_ERR_PASS_IS_EMPTY;
215
+ std::string passData = ms::Char16toChar8(pass);
216
+ return encrypt(outFile, inFile, passData, opt);
217
+ } catch (std::exception& e) {
218
+ setException(e);
219
+ return MSOC_ERR_EXCEPTION;
220
+ }
221
+ #endif
222
+
223
+ template<class T>
224
+ int decrypt(const T *outFile, const T *inFile, const std::string& passData, msoc_opt *opt)
225
+ {
226
+ if (inFile == NULL) return MSOC_ERR_INFILE_IS_EMPTY;
227
+ const bool doView = outFile == NULL;
228
+ std::string data;
229
+ ms::Format format;
230
+ uint32_t dataSize;
231
+ int err = readFile(data, format, dataSize, inFile);
232
+ if (err != MSOC_NOERR) return err;
233
+ if (format == ms::fZip) {
234
+ return MSOC_ERR_ALREADY_DECRYPTED;
235
+ }
236
+ std::string secretKey;
237
+ if (opt) {
238
+ if (!opt->secretKey.empty()) secretKey = ms::fromHex(opt->secretKey);
239
+ }
240
+ std::basic_string<T> outFileW;
241
+ if (outFile) {
242
+ outFileW = outFile;
243
+ }
244
+ int spinCount;
245
+ bool ok = ms::decode(data.data(), dataSize, outFileW, passData, secretKey, doView, &spinCount);
246
+ if (!ok) return MSOC_ERR_BAD_PASSWORD;
247
+ if (opt) {
248
+ opt->spinCount = spinCount;
249
+ opt->secretKey = ms::hex(secretKey);
250
+ }
251
+ return MSOC_NOERR;
252
+ }
253
+
254
+ int MSOC_DLL_EXPORT MSOC_decryptA(const char *outFile, const char *inFile, const char *pass, msoc_opt *opt)
255
+ try
256
+ {
257
+ std::string passData;
258
+ if (pass) passData = convertChar2Wchar(pass);
259
+ return decrypt(outFile, inFile, passData, opt);
260
+ } catch (std::exception& e) {
261
+ setException(e);
262
+ return MSOC_ERR_EXCEPTION;
263
+ }
264
+
265
+ #ifdef _MSC_VER
266
+ int MSOC_DLL_EXPORT MSOC_decrypt(const wchar_t *outFile, const wchar_t *inFile, const wchar_t *pass, msoc_opt *opt)
267
+ try
268
+ {
269
+ std::string passData;
270
+ if (pass) passData = ms::Char16toChar8(pass);
271
+ return decrypt(outFile, inFile, passData, opt);
272
+ } catch (std::exception& e) {
273
+ setException(e);
274
+ return MSOC_ERR_EXCEPTION;
275
+ }
276
+ #endif
@@ -0,0 +1,136 @@
1
+ /**
2
+ @file
3
+ @brief 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
+
10
+ void usage()
11
+ {
12
+ const char *s =
13
+ "how to use\n"
14
+ "msocsample.exe enc <inFile> <outFile> <pass>\n"
15
+ "msocsample.exe dec <inFile> <outFile> <pass>\n"
16
+ "msocsample.exe opt <inFile> <pass>\n"
17
+ "msocsample.exe enc-sec <inFile> <outFile> <pass> <secretKey> [<spinCount>]\n"
18
+ "msocsample.exe dec-sec <inFile> <outFile> <secretKey>\n";
19
+ printf("%s", s);
20
+ exit(1);
21
+ }
22
+
23
+ /*
24
+ assume w[i] is ascii code
25
+ */
26
+ void wchar2ascii(char *s, size_t maxSize, const wchar_t *w)
27
+ {
28
+ size_t i;
29
+ for (i = 0; i < maxSize; i++) {
30
+ wchar_t c = w[i];
31
+ s[i] = (char)c;
32
+ if (s[i] != c) {
33
+ printf("not ascii %04x\n", c);
34
+ exit(1);
35
+ }
36
+ if (s[i] == '\0') return;
37
+ }
38
+ puts("too long w");
39
+ exit(1);
40
+ }
41
+
42
+ int wmain(int argc, wchar_t **argv)
43
+ {
44
+ int err = 0;
45
+ const wchar_t *inFile = NULL;
46
+ const wchar_t *outFile = NULL;
47
+ struct msoc_opt *opt = NULL;
48
+ int spinCount;
49
+ char secretKey[256];
50
+
51
+ argc--, argv++;
52
+ if (argc < 3) {
53
+ usage();
54
+ }
55
+ if (wcscmp(argv[0], L"enc") == 0) {
56
+ if (argc != 4) {
57
+ usage();
58
+ }
59
+ printf("enc in=%S, out=%S\n", argv[1], argv[2]);
60
+ err = MSOC_encrypt(argv[2], argv[1], argv[3], NULL);
61
+ } else
62
+ if (wcscmp(argv[0], L"dec") == 0) {
63
+ if (argc != 4) {
64
+ usage();
65
+ }
66
+ printf("dec in=%S, out=%S, pass=%S\n", argv[1], argv[2], argv[3]);
67
+ err = MSOC_decrypt(argv[2], argv[1], argv[3], NULL);
68
+ } else
69
+ if (wcscmp(argv[0], L"opt") == 0) {
70
+ if (argc != 3) {
71
+ usage();
72
+ }
73
+ printf("opt in=%S, pass=%S\n", argv[1], argv[2]);
74
+ opt = MSOC_createOpt();
75
+ if (opt == NULL) {
76
+ puts("ERR MSOC_createOpt");
77
+ return 1;
78
+ }
79
+ err = MSOC_decrypt(NULL, argv[1], argv[2], opt);
80
+ if (err != MSOC_NOERR) goto EXIT;
81
+ err = MSOC_getInt(&spinCount, opt, MSOC_OPT_TYPE_SPIN_COUNT);
82
+ if (err != MSOC_NOERR) goto EXIT;
83
+ err = MSOC_getStr(secretKey, sizeof(secretKey), opt, MSOC_OPT_TYPE_SECRET_KEY);
84
+ if (err != MSOC_NOERR) goto EXIT;
85
+ printf("spinCout=%d\n", spinCount);
86
+ printf("secretKey=%s\n", secretKey);
87
+ } else
88
+ if (wcscmp(argv[0], L"enc-sec") == 0) {
89
+ if (argc != 5 && argc != 6) {
90
+ usage();
91
+ }
92
+ printf("enc-sec in=%S, out=%S, pass=%S, secretKey=%S\n", argv[1], argv[2], argv[3], argv[4]);
93
+ wchar2ascii(secretKey, sizeof(secretKey), argv[4]);
94
+ opt = MSOC_createOpt();
95
+ if (opt == NULL) {
96
+ puts("ERR MSOC_createOpt");
97
+ return 1;
98
+ }
99
+ err = MSOC_setStr(opt, MSOC_OPT_TYPE_SECRET_KEY, secretKey);
100
+ if (err != MSOC_NOERR) goto EXIT;
101
+ if (argc == 6) {
102
+ int spinCount = _wtoi(argv[5]);
103
+ printf("spinCount=%d\n", spinCount);
104
+ err = MSOC_setInt(opt, MSOC_OPT_TYPE_SPIN_COUNT, spinCount);
105
+ if (err != MSOC_NOERR) goto EXIT;
106
+ }
107
+ err = MSOC_encrypt(argv[2], argv[1], argv[3], opt);
108
+ } else
109
+ if (wcscmp(argv[0], L"dec-sec") == 0) {
110
+ if (argc != 4) {
111
+ usage();
112
+ }
113
+ printf("dec-sec in=%S, out=%S, secretKey=%S\n", argv[1], argv[2], argv[3]);
114
+ wchar2ascii(secretKey, sizeof(secretKey), argv[3]);
115
+ opt = MSOC_createOpt();
116
+ if (opt == NULL) {
117
+ puts("ERR MSOC_createOpt");
118
+ return 1;
119
+ }
120
+ err = MSOC_setStr(opt, MSOC_OPT_TYPE_SECRET_KEY, secretKey);
121
+ if (err != MSOC_NOERR) goto EXIT;
122
+ err = MSOC_decrypt(argv[2], argv[1], NULL, opt);
123
+ } else
124
+ {
125
+ usage();
126
+ }
127
+ EXIT:
128
+ MSOC_destroyOpt(opt);
129
+ if (err != MSOC_NOERR) {
130
+ printf("ERR %s\n", MSOC_getErrMessage(err));
131
+ return 1;
132
+ } else {
133
+ puts("ok");
134
+ }
135
+ return 0;
136
+ }
@@ -0,0 +1,219 @@
1
+ /**
2
+ @file
3
+ @brief MS Office encryption encoder/decoder
4
+ Copyright (C) 2012 Cybozu Labs, Inc., all rights reserved.
5
+ */
6
+ #include <stdio.h>
7
+ #include <stdlib.h>
8
+ #include <string>
9
+ #include <locale>
10
+ #include <fstream>
11
+ #include <cybozu/mmap.hpp>
12
+ #include <cybozu/file.hpp>
13
+ #include <cybozu/atoi.hpp>
14
+ #include <cybozu/option.hpp>
15
+ #include "cfb.hpp"
16
+ #include "decode.hpp"
17
+ #include "encode.hpp"
18
+ #include "make_dataspace.hpp"
19
+ #ifdef _MSC_VER
20
+ #include <cybozu/string.hpp>
21
+ #endif
22
+
23
+ inline cybozu::String16 fromUniHex(const std::string& str)
24
+ {
25
+ const size_t n = str.size();
26
+ if ((n % 5) != 0) throw cybozu::Exception("f8romUniHex:bad str") << str;
27
+ cybozu::String16 ret;
28
+ for (size_t i = 0; i < n; i += 5) {
29
+ if (str[i] != 'u') throw cybozu::Exception("fromUniHex:bad format") << str;
30
+ cybozu::Char16 c = static_cast<uint16_t>(cybozu::hextoi(&str[i + 1], 4));
31
+ ret += c;
32
+ }
33
+ return ret;
34
+ }
35
+
36
+ const char denySuffixTbl[][8] = {
37
+ "xls",
38
+ "xlt",
39
+ "xla",
40
+
41
+ "ppt",
42
+ "pot",
43
+ "pps",
44
+ "ppa",
45
+
46
+ "doc",
47
+ "dot",
48
+ };
49
+
50
+ bool denySuffix(const std::string& suf)
51
+ {
52
+ for (size_t i = 0; i < CYBOZU_NUM_OF_ARRAY(denySuffixTbl); i++) {
53
+ if (suf == denySuffixTbl[i]) return true;
54
+ }
55
+ return false;
56
+ }
57
+
58
+ #ifdef _MSC_VER
59
+ int wmain(int argc, wchar_t *wargv[])
60
+ #else
61
+ int main(int argc, char *argv[])
62
+ #endif
63
+ try
64
+ {
65
+ #ifdef _MSC_VER
66
+ std::vector<std::string> strVec;
67
+ for (size_t i = 0; i < argc; i++) {
68
+ const std::wstring s = __wargv[i];
69
+ std::string utf8;
70
+ cybozu::ConvertUtf16ToUtf8(&utf8, s);
71
+ strVec.push_back(utf8);
72
+ }
73
+ std::vector<char*> ptrVec(argc);
74
+ for (size_t i = 0; i < argc; i++) {
75
+ ptrVec[i] = &strVec[i][0];
76
+ }
77
+ char **argv = &ptrVec[0];
78
+ #endif
79
+ // std::locale::global(std::locale(""));
80
+
81
+ std::string inFileA;
82
+ std::string outFileA;
83
+ std::string keyFile;
84
+ std::string pstr, ph8str, ph16str;
85
+ cybozu::String16 wpass;
86
+ std::string secretKeyHex;
87
+ bool doEncode = false, doDecode = false, doView = false;
88
+ int encMode = 0;
89
+ int spinCount = 0;
90
+ bool putEncryptionInfo = false;
91
+ bool debug2 = false;
92
+ bool debug3 = false;
93
+ bool putSecretKey = false;
94
+ bool excelProtect = false;
95
+ bool forceProcessing = false;
96
+
97
+ cybozu::Option opt;
98
+ opt.appendOpt(&pstr, "", "p", "password in only ascii");
99
+ opt.appendOpt(&encMode, 0, "encMode", "0:use AES128(default), 1: use AES256 for encoding");
100
+ opt.appendOpt(&ph8str, "", "ph8", "password in utf8 hex. ex. 68656C6C6F for 'hello'");
101
+ opt.appendOpt(&ph16str, "", "ph16", "password in utf16 hex. ex. u3042u3044u3046 for 'aiu' in hiragana");
102
+ opt.appendBoolOpt(&excelProtect, "pep", "password for Excel protection (VelvetSweatshop)");
103
+ opt.appendOpt(&secretKeyHex, "", "k", "(experimental) secret key in hex. ex. 0123456789ABCDEF0123456789ABCDEF");
104
+ opt.appendOpt(&keyFile, "", "by", "(experimental) extract secret key from this file");
105
+ opt.appendBoolOpt(&doEncode, "e", "encode");
106
+ opt.appendBoolOpt(&doDecode, "d", "decode");
107
+ opt.appendBoolOpt(&forceProcessing, "force", "force processing regardless of detected file type");
108
+ opt.appendOpt(&spinCount, 100000, "c", "spin count");
109
+ opt.appendBoolOpt(&putSecretKey, "psk", "print secret key");
110
+ opt.appendBoolOpt(&putEncryptionInfo, "info", "print EncryptionInfo info");
111
+ opt.appendBoolOpt(&debug2, "v", "print debug info");
112
+ opt.appendBoolOpt(&debug3, "vv", "print debug info and save binary data");
113
+ opt.appendHelp("h");
114
+ opt.appendParam(&inFileA, "input");
115
+ opt.appendParamOpt(&outFileA, "", "output");
116
+
117
+ if (!opt.parse(argc, argv)) {
118
+ opt.usage();
119
+ return 1;
120
+ }
121
+ ms::setDebug(debug3 ? 3 : debug2 ? 2 : putEncryptionInfo ? 1 : 0);
122
+ if (!pstr.empty()) {
123
+ wpass = cybozu::ToUtf16(pstr);
124
+ }
125
+ if (excelProtect) {
126
+ wpass = cybozu::ToUtf16("VelvetSweatshop");
127
+ }
128
+ if (putSecretKey) {
129
+ ms::putSecretKeyInstance() = true;
130
+ }
131
+ if (!ph8str.empty()) {
132
+ wpass = cybozu::ToUtf16(ms::fromHex(ph8str));
133
+ }
134
+ if (!ph16str.empty()) {
135
+ wpass = fromUniHex(ph16str);
136
+ }
137
+ std::string secretKey;
138
+ if (!secretKeyHex.empty()) {
139
+ secretKey = ms::fromHex(secretKeyHex, true);
140
+ }
141
+ if (!doEncode && !doDecode) {
142
+ doDecode = true;
143
+ doView = true;
144
+ }
145
+ if (keyFile.empty() && secretKey.empty() && wpass.empty()) {
146
+ puts("specify -p password");
147
+ opt.usage();
148
+ }
149
+
150
+ if (outFileA.empty()) {
151
+ std::string suf;
152
+ const std::string base = cybozu::GetBaseName(inFileA, &suf);
153
+ if (denySuffix(suf)) {
154
+ printf("bad input file [%s]. does not support %s\n", inFileA.c_str(), suf.c_str());
155
+ return 1;
156
+ }
157
+ outFileA = base +(doEncode ? "_e." : "_d.") + suf;
158
+ }
159
+ printf("inFile=%s, outFile=%s, mode=%s, encMode=%d\n", inFileA.c_str(), outFileA.c_str(), doEncode ? "enc" : doView ? "view" : "dec", encMode);
160
+ if (!secretKey.empty()) {
161
+ printf("set secretKey = "); ms::dump(secretKey, false);
162
+ }
163
+ if (!keyFile.empty()) {
164
+ printf("keyFile = %s\n", keyFile.c_str());
165
+ }
166
+ const std::string passData = ms::Char16toChar8(wpass);
167
+
168
+ #ifdef _MSC_VER
169
+ std::wstring inFile;
170
+ std::wstring outFile;
171
+ cybozu::ConvertUtf8ToUtf16(&inFile, inFileA);
172
+ cybozu::ConvertUtf8ToUtf16(&outFile, outFileA);
173
+ #else
174
+ const std::string inFile = inFileA;
175
+ const std::string outFile = outFileA;
176
+ #endif
177
+ cybozu::Mmap m(inFile);
178
+ const char *data = m.get();
179
+ if (m.size() > 0xffffffff) {
180
+ throw cybozu::Exception("ms:encode:m.size") << m.size();
181
+ }
182
+ const uint32_t dataSize = static_cast<uint32_t>(m.size());
183
+ ms::Format format;
184
+ try {
185
+ format = ms::DetectFormat(data, dataSize);
186
+ } catch (std::exception& e) {
187
+ format = ms::fUnknown;
188
+ if (!forceProcessing) {
189
+ printf("unknown format %s\n", e.what());
190
+ return 1;
191
+ }
192
+ }
193
+
194
+ if (doEncode) {
195
+ if (!forceProcessing && format == ms::fCfb) {
196
+ printf("already encrypted\n");
197
+ return 2;
198
+ }
199
+ bool isOffice2013 = encMode == 1;
200
+ ms::encode(data, dataSize, outFile, passData, isOffice2013, secretKey, spinCount);
201
+ } else {
202
+ if (!forceProcessing && format == ms::fZip) {
203
+ printf("already decrypted\n");
204
+ return 2;
205
+ }
206
+ if (!keyFile.empty()) {
207
+ secretKey = ms::getSecretKey(keyFile, passData);
208
+ printf("get secretKey = "); ms::dump(secretKey, false);
209
+ }
210
+ bool ok = ms::decode(data, dataSize, outFile, passData, secretKey, doView);
211
+ if (!ok) {
212
+ printf("bad password\n");
213
+ return 3;
214
+ }
215
+ }
216
+ } catch (std::exception& e) {
217
+ printf("exception:%s\n", e.what());
218
+ return 1;
219
+ }