ooxml_crypt 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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,221 @@
1
+ #pragma once
2
+ /**
3
+ @file
4
+ @brief MS Office encryption encoder
5
+ Copyright (C) 2012 Cybozu Labs, Inc., all rights reserved.
6
+ */
7
+ #include <cybozu/crypto.hpp>
8
+ #include <cybozu/mmap.hpp>
9
+ #include <cybozu/random_generator.hpp>
10
+ #include "crypto_util.hpp"
11
+ #include "cfb.hpp"
12
+ #include "make_dataspace.hpp"
13
+ #include "resource.hpp"
14
+
15
+ //#define SAME_KEY
16
+
17
+ namespace ms {
18
+
19
+ inline cybozu::RandomGenerator& GetRandGen()
20
+ {
21
+ static cybozu::RandomGenerator rg;
22
+ return rg;
23
+ }
24
+
25
+ inline void FillRand(std::string& str, size_t n)
26
+ {
27
+ str.resize(n);
28
+ GetRandGen().read(&str[0], static_cast<int>(n));
29
+ }
30
+
31
+ #if 0
32
+ inline void VerifyFormat(const char *data, uint32_t dataSize)
33
+ {
34
+ if (dataSize < 2) throw cybozu::Exception("ms:VerifyFormat:too small") << dataSize;
35
+ if (memcmp(data, "PK", 2) != 0) throw cybozu::Exception("ms:VerifyFormat:bad format");
36
+ }
37
+ #endif
38
+
39
+ /*
40
+ encryptedPackage = [uint64_t:encData]
41
+ */
42
+ inline void MakeEncryptedPackage(std::string& encryptedPackage, const std::string& encData)
43
+ {
44
+ encryptedPackage.reserve(encData.size() + 8);
45
+ encryptedPackage.resize(8);
46
+ cybozu::Set64bitAsLE(&encryptedPackage[0], encData.size());
47
+ encryptedPackage += encData;
48
+ }
49
+
50
+ /*
51
+ [MS-OFFCRYPTO] 2.3.4.14
52
+ */
53
+ inline void GenerateIntegrityParameter(
54
+ std::string& encryptedHmacKey,
55
+ std::string& encryptedHmacValue,
56
+ const std::string& encryptedPackage,
57
+ const CipherParam& keyData,
58
+ const std::string& secretKey,
59
+ const std::string& saltValue)
60
+ {
61
+ std::string salt;
62
+ FillRand(salt, keyData.hashSize);
63
+ #ifdef SAME_KEY
64
+ salt = fromHex("C9FACA5436849906B600DE95E155B47A01ABEDD0");
65
+ #endif
66
+ const std::string iv1 = generateIv(keyData, ms::blkKey_dataIntegrity1, saltValue);
67
+ const std::string iv2 = generateIv(keyData, ms::blkKey_dataIntegrity2, saltValue);
68
+ encryptedHmacKey = cipher(keyData.cipherName, salt, secretKey, iv1, cybozu::crypto::Cipher::Encoding);
69
+ cybozu::crypto::Hmac hmac(keyData.hashName);
70
+ std::string ret = hmac.eval(salt, encryptedPackage);
71
+ encryptedHmacValue = cipher(keyData.cipherName, ret, secretKey, iv2, cybozu::crypto::Cipher::Encoding);
72
+ }
73
+
74
+ inline void EncContent(std::string& encryptedPackage, const std::string& org, const CipherParam& param, const std::string& key, const std::string& salt)
75
+ {
76
+ uint64_t orgSize = org.size();
77
+ const size_t blockSize = 4096;
78
+ std::string data = org;
79
+ data.resize(RoundUp(data.size(), size_t(16)));
80
+ #ifdef SAME_KEY
81
+ data[data.size() - 2] = 0x4b; // QQQ remove this
82
+ data[data.size() - 1] = 0x6a;
83
+ #endif
84
+ encryptedPackage.reserve(data.size() + 8);
85
+ encryptedPackage.resize(8);
86
+ cybozu::Set64bitAsLE(&encryptedPackage[0], orgSize);
87
+
88
+ const size_t n = (data.size() + blockSize - 1) / blockSize;
89
+ for (size_t i = 0; i < n; i++) {
90
+ const size_t len = (i < n - 1) ? blockSize : (data.size() - blockSize * i);
91
+ std::string blockKey(4, 0);
92
+ cybozu::Set32bitAsLE(&blockKey[0], static_cast<uint32_t>(i));
93
+ const std::string iv = generateKey(param, salt, blockKey);
94
+ encryptedPackage.append(cipher(param.cipherName, data.c_str() + i * blockSize, len, key, iv, cybozu::crypto::Cipher::Encoding));
95
+ }
96
+ }
97
+
98
+ /*
99
+ ����̋t���ňÍ���
100
+ fix parameter : c1(blkKey_VerifierHashInput)
101
+ c2(blkKey_encryptedVerifierHashValue)
102
+ c3(blkKey_encryptedKeyValue)
103
+
104
+ input : pass, spinCount
105
+ output: iv,
106
+ verifierHashInput,
107
+ encryptedVerifierHashValue,
108
+ encryptedKeyValue
109
+
110
+ iv(encryptedKey.saltValue)�������_������
111
+
112
+ pwHash = hashPassword(iv, pass, spinCount)
113
+ skey1 = generateKey(pwHash, c1)
114
+ skey2 = generateKey(pwHash, c2)
115
+
116
+ verifierHashInput�������_������
117
+ encryptedVerifierHashInput = Enc(verifierHashInput, skey1, iv)
118
+ hashedVerifier = H(verifierHashInput)
119
+
120
+ encryptedVerifierHashValue = Enc(verifierHash, skey2, iv)
121
+
122
+ skey3 = generateKey(pwHash, c3)
123
+ secretKey�������_������
124
+ encryptedKeyValue = Enc(secretKey, skey3, iv)
125
+ */
126
+
127
+ /*
128
+ encode data by pass with cipherName, hashName, spinCount
129
+ output encData and info
130
+ */
131
+
132
+ inline bool encode_in(
133
+ std::string& encryptedPackage,
134
+ EncryptionInfo& info,
135
+ const std::string& data,
136
+ cybozu::crypto::Cipher::Name cipherName,
137
+ cybozu::crypto::Hash::Name hashName,
138
+ int spinCount,
139
+ const std::string& pass,
140
+ const std::string& masterKey)
141
+ {
142
+ if (spinCount > 10000000) throw cybozu::Exception("ms:encode_in:too large spinCount") << spinCount;
143
+ CipherParam& keyData = info.keyData;
144
+ CipherParam& encryptedKey = info.encryptedKey;
145
+
146
+ keyData.setByName(cipherName, hashName);
147
+ encryptedKey.setByName(cipherName, hashName);
148
+ info.spinCount = spinCount;
149
+
150
+ std::string& iv = encryptedKey.saltValue;
151
+ FillRand(iv, encryptedKey.saltSize);
152
+ #ifdef SAME_KEY
153
+ puts("QQQ defined SAME_KEY QQQ");
154
+ iv = fromHex("F4994F9B2DCD5E0E84BC6386D4523D2C");
155
+ #endif
156
+ const std::string pwHash = hashPassword(encryptedKey.hashName, iv, pass, spinCount);
157
+
158
+ const std::string skey1 = generateKey(encryptedKey, pwHash, blkKey_VerifierHashInput);
159
+ const std::string skey2 = generateKey(encryptedKey, pwHash, blkKey_encryptedVerifierHashValue);
160
+ const std::string skey3 = generateKey(encryptedKey, pwHash, blkKey_encryptedKeyValue);
161
+
162
+ std::string verifierHashInput;
163
+ FillRand(verifierHashInput, encryptedKey.saltSize);
164
+ #ifdef SAME_KEY
165
+ verifierHashInput = fromHex("FEDAECD950F9E82C47CADA29B7837C6D");
166
+ #endif
167
+
168
+ verifierHashInput.resize(RoundUp(verifierHashInput.size(), encryptedKey.blockSize));
169
+
170
+ info.encryptedVerifierHashInput = cipher(encryptedKey.cipherName, verifierHashInput, skey1, iv, cybozu::crypto::Cipher::Encoding);
171
+ std::string hashedVerifier = cybozu::crypto::Hash::digest(encryptedKey.hashName, verifierHashInput);
172
+ hashedVerifier.resize(RoundUp(hashedVerifier.size(), encryptedKey.blockSize));
173
+
174
+ info.encryptedVerifierHashValue = cipher(encryptedKey.cipherName, hashedVerifier, skey2, iv, cybozu::crypto::Cipher::Encoding);
175
+
176
+ std::string secretKey;
177
+ FillRand(secretKey, encryptedKey.saltSize);
178
+ #ifdef SAME_KEY
179
+ secretKey = fromHex("BF44FBB51BE1E88BF130156E117E7900");
180
+ #endif
181
+ if (!masterKey.empty()) {
182
+ secretKey = masterKey;
183
+ }
184
+ normalizeKey(secretKey, encryptedKey.keyBits / 8);
185
+
186
+ info.encryptedKeyValue = cipher(encryptedKey.cipherName, secretKey, skey3, iv, cybozu::crypto::Cipher::Encoding);
187
+
188
+ FillRand(keyData.saltValue, keyData.saltSize);
189
+ #ifdef SAME_KEY
190
+ keyData.saltValue = fromHex("C49AAAEE99004C6B017EE5CD11B86729");
191
+ #endif
192
+
193
+ EncContent(encryptedPackage, data, encryptedKey, secretKey, keyData.saltValue);
194
+
195
+ GenerateIntegrityParameter(info.encryptedHmacKey, info.encryptedHmacValue, encryptedPackage, keyData, secretKey, keyData.saltValue);
196
+ return true;
197
+ }
198
+
199
+ template<class String>
200
+ bool encode(const char *data, uint32_t dataSize, const String& outFile, const std::string& pass, bool isOffice2013, const std::string& masterKey, int spinCount)
201
+ {
202
+ std::string encryptedPackage;
203
+ ms::EncryptionInfo info;
204
+ const cybozu::crypto::Cipher::Name cipherName = isOffice2013 ? cybozu::crypto::Cipher::N_AES256_CBC : cybozu::crypto::Cipher::N_AES128_CBC;
205
+ const cybozu::crypto::Hash::Name hashName = isOffice2013 ? cybozu::crypto::Hash::N_SHA512 : cybozu::crypto::Hash::N_SHA1;
206
+ encode_in(encryptedPackage, info, std::string(data, dataSize), cipherName, hashName, spinCount, pass, masterKey);
207
+ const std::string encryptionInfoStr = info.addHeader(info.toXml(isOffice2013));
208
+ dprintf("encryptionInfoStr size=%d\n", (int)encryptionInfoStr.size());
209
+ ms::cfb::CompoundFile cfb;
210
+ ms::makeDataSpace(cfb.dirs, encryptedPackage, encryptionInfoStr);
211
+ std::string outData;
212
+ makeLayout(outData, cfb);
213
+ {
214
+ cybozu::File out;
215
+ out.openW(outFile);
216
+ out.write(outData.c_str(), outData.size());
217
+ }
218
+ return true;
219
+ }
220
+
221
+ } // ms
@@ -0,0 +1,316 @@
1
+ #pragma once
2
+ /**
3
+ Copyright (C) 2012 Cybozu Labs, Inc., all rights reserved.
4
+ */
5
+
6
+ #include <cybozu/time.hpp>
7
+ #include "cfb.hpp"
8
+ #include "resource.hpp"
9
+
10
+ namespace ms {
11
+
12
+ enum DSposition {
13
+ iRoot = 0,
14
+ iEncryptionPackage, // 1
15
+ iDataSpaces, // 2
16
+ iVersion, // 3
17
+ iDataSpaceMap, // 4
18
+ iDataSpaceInfo, // 5
19
+ iStongEncryptionDataSpace, // 6
20
+ iTransformInfo, // 7
21
+ iStrongEncryptionTransform, // 8
22
+ iPrimary, // 9
23
+ iEncryptionInfo, // 10
24
+ dirNum
25
+ };
26
+
27
+ /*
28
+ make Data Spaces
29
+ */
30
+ inline void makeDataSpace(
31
+ cfb::DirectoryEntryVec& dirs,
32
+ const std::string& encryptedPackage,
33
+ const std::string& encryptionInfoXml)
34
+ {
35
+ using namespace cfb;
36
+ cybozu::Time curTime;
37
+ curTime.setCurrentTime();
38
+ DirectoryEntry::FileTime fileTime;
39
+ curTime.getFILETIME(fileTime.dwLowDateTime, fileTime.dwHighDateTime);
40
+
41
+ /*
42
+
43
+ 0:Root/ 1:EncryptionPackage(F)
44
+ /10:EncryptionInfo(F)
45
+ / 2:DataSpaces/3:Version(F)
46
+ /4:DataSpaceMap(F)
47
+ /5:DataSpaceInfo/6:StrongEncryptionDataSpace(F)
48
+ /7:Transformation/8:StrongEncryptionTransform/9:Primary(F)
49
+
50
+ <10:B>
51
+ �^�_
52
+ <2:R> <1:R>
53
+ ---------------
54
+ <4:B>
55
+ �^�_
56
+ <3:B> <5:B>
57
+ �_
58
+ <7:R>
59
+ ---------------
60
+ <6:B>
61
+ ---------------
62
+ <8:B>
63
+ ---------------
64
+ <9:B>
65
+
66
+ */
67
+
68
+ const struct Info {
69
+ const char *name;
70
+ ObjectType objectType;
71
+ ColorFlag colorFlag;
72
+ uint32_t leftSiblingId;
73
+ uint32_t rightSiblingId;
74
+ uint32_t childId;
75
+ std::string content;
76
+ } infoTbl[] = {
77
+ { "Root Entry", RootStorageObject, Red, NOSTREAM, NOSTREAM, iEncryptionInfo, "" },
78
+ { "EncryptedPackage", StreamObject, Red, NOSTREAM, NOSTREAM, NOSTREAM, encryptedPackage },
79
+ { "\x06""DataSpaces", StorageObject, Red, NOSTREAM, NOSTREAM, iDataSpaceMap, "" },
80
+ { "Version", StreamObject, Black, NOSTREAM, NOSTREAM, NOSTREAM, resource::Version },
81
+ { "DataSpaceMap", StreamObject, Black, iVersion, iDataSpaceInfo, NOSTREAM, resource::DataSpaceMap },
82
+ { "DataSpaceInfo", StorageObject, Black, NOSTREAM, iTransformInfo, iStongEncryptionDataSpace, "" },
83
+ { "StrongEncryptionDataSpace", StreamObject, Black, NOSTREAM, NOSTREAM, NOSTREAM, resource::StrongEncryptionDataSpace },
84
+ { "TransformInfo", StorageObject, Red, NOSTREAM, NOSTREAM, iStrongEncryptionTransform, "" },
85
+ { "StrongEncryptionTransform", StorageObject, Black, NOSTREAM, NOSTREAM, iPrimary, "" },
86
+ { "\x06""Primary", StreamObject, Black, NOSTREAM, NOSTREAM, NOSTREAM, resource::Primary },
87
+ { "EncryptionInfo", StreamObject, Black, iDataSpaces, iEncryptionPackage, NOSTREAM, encryptionInfoXml },
88
+ };
89
+ dirs.resize(dirNum);
90
+ const std::string clsid = "";
91
+ const uint32_t stateBits = 0;
92
+ for (size_t i = 0; i < dirs.size(); i++) {
93
+ uint32_t startingSectorLocation = 0;
94
+ const Info& info = infoTbl[i];
95
+ dirs[i].set(
96
+ cybozu::ToUtf16(info.name),
97
+ info.objectType,
98
+ info.colorFlag,
99
+ info.leftSiblingId,
100
+ info.rightSiblingId,
101
+ info.childId,
102
+ clsid,
103
+ stateBits,
104
+ fileTime,
105
+ fileTime,
106
+ startingSectorLocation,
107
+ info.content);
108
+ }
109
+ }
110
+
111
+ inline void makeDifat(char *data, uint32_t difatPos, uint32_t difatSectorNum, uint32_t fatSectorNum, uint32_t sectorSize)
112
+ {
113
+ uint32_t v = ms::cfb::Header::firstNumDIFAT + difatSectorNum;
114
+ for (uint32_t i = 0; i < difatSectorNum; i++) {
115
+ dprintf("\ndifatSectorNum i=%d\n", i);
116
+ char *p = data + 512 + (difatPos + i) * sectorSize;
117
+ for (uint32_t j = 0; j < sectorSize / 4 - 1; j++) {
118
+ cybozu::Set32bitAsLE(p + j * 4, v);
119
+ v++;
120
+ dprintf("%d ", v);
121
+ if (v > difatSectorNum + fatSectorNum) {
122
+ for (; j < sectorSize / 4 - 1; j++) {
123
+ cybozu::Set32bitAsLE(p + j * 4, ms::cfb::FREESECT);
124
+ }
125
+ dprintf("endof\n");
126
+ cybozu::Set32bitAsLE(p + sectorSize - 4, ms::cfb::ENDOFCHAIN);
127
+ return;
128
+ }
129
+ }
130
+ dprintf("next %d\n", difatPos + i + 1);
131
+ cybozu::Set32bitAsLE(p + sectorSize - 4, difatPos + i + 1);
132
+ }
133
+ }
134
+
135
+ inline void makeFat(char *data, const char *dataEnd, const cfb::UintVec& entry)
136
+ {
137
+ uint32_t v = 0;
138
+ for (size_t i = 0; i < entry.size(); i++) {
139
+ const uint32_t n = entry[i];
140
+ if (n <= cfb::MAXREGSECT) {
141
+ for (uint32_t j = 1; j < n; j++) {
142
+ v++;
143
+ if (data == dataEnd) throw cybozu::Exception("ms:makeFat:err1") << v << i << j;
144
+ cybozu::Set32bitAsLE(data, v);
145
+ data += 4;
146
+ }
147
+ if (data == dataEnd) throw cybozu::Exception("ms:makeFat:err2") << v << i;
148
+ cybozu::Set32bitAsLE(data, cfb::ENDOFCHAIN);
149
+ } else {
150
+ cybozu::Set32bitAsLE(data, n);
151
+ }
152
+ data += 4;
153
+ v++;
154
+ }
155
+ while (data != dataEnd) {
156
+ cybozu::Set32bitAsLE(data, cfb::FREESECT);
157
+ data += 4;
158
+ }
159
+ }
160
+
161
+ inline void detectSectorNum(uint32_t& difatSectorNum, uint32_t& fatSectorNum, uint32_t n, uint32_t sectorSize)
162
+ {
163
+ const uint32_t numInFat = sectorSize / 4;
164
+ difatSectorNum = 0;
165
+ fatSectorNum = 0;
166
+ int count = 0;
167
+ for (;;) {
168
+ uint32_t a = getBlockNum(difatSectorNum + fatSectorNum + n + 0, numInFat);
169
+ uint32_t b = (a <= cfb::Header::firstNumDIFAT) ? 0 : getBlockNum(a - cfb::Header::firstNumDIFAT, numInFat - 1);
170
+ if (b == difatSectorNum && a == fatSectorNum) return;
171
+ difatSectorNum = b;
172
+ fatSectorNum = a;
173
+ count++;
174
+ if (count == 10) cybozu::Exception("ms:detectSectorNum:max loop") << difatSectorNum << fatSectorNum << n;
175
+ }
176
+ }
177
+
178
+ template<class T>
179
+ uint32_t getMiniFatSectorNum(T size)
180
+ {
181
+ return getBlockNum(static_cast<uint32_t>(size), 64u);
182
+ }
183
+ /*
184
+ @note DIFAT is empty for current version
185
+
186
+ |Header|DIFAT0|DIFAT1|...|FAT0|FAT1|...|miniFAT|dir0|dir1|dir2|min0|min1|min2|min3|enc0|enc1|...
187
+
188
+ FAT
189
+ 1 ; miniFAT
190
+ 2 3 4 ; directoryEntry([d0:d1:d2])
191
+ 5 6 7 8 ; miniFATdata([m0:m1:m2:m3])
192
+ 9 10... ; encryptedPackage([c0:c1:...])
193
+
194
+ miniFAT(64byte x 8 x 4)
195
+ 0 1 ; Version
196
+ 2 3 ; DataSpaceMap
197
+ 4
198
+ 5 6 7 8
199
+ 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
200
+ */
201
+ inline void makeLayout(std::string& data, cfb::CompoundFile& cfb)
202
+ {
203
+ cfb::Header& header = cfb.header;
204
+ cfb::DirectoryEntryVec& dirs = cfb.dirs;
205
+ const uint32_t sectorSize = header.sectorSize;
206
+
207
+ // miniFAT
208
+ const uint32_t numMiniFatSectors = 1;
209
+ cfb::UintVec miniFatSectorNumVec;
210
+ uint32_t miniFatNum; // num of mini fat sector
211
+ uint32_t miniFatDataSectorNum; // sector num for mini fat data
212
+ {
213
+ // streamObject
214
+ const int tbl[] = {
215
+ iVersion, iDataSpaceMap, iStongEncryptionDataSpace, iPrimary, iEncryptionInfo
216
+ };
217
+ uint32_t pos = 0;
218
+ for (size_t i = 0; i < CYBOZU_NUM_OF_ARRAY(tbl); i++) {
219
+ uint32_t n = getMiniFatSectorNum(dirs[tbl[i]].streamSize);
220
+ miniFatSectorNumVec.push_back(n);
221
+ dirs[tbl[i]].startingSectorLocation = pos;
222
+ pos += n;
223
+ }
224
+ miniFatNum = pos;
225
+ dprintf("miniFatNum=%d\n", miniFatNum);
226
+ miniFatDataSectorNum = getBlockNum(miniFatNum, (sectorSize / 64));
227
+ dprintf("miniFatDataSectorNum=%d\n", miniFatDataSectorNum);
228
+ if (getBlockNum(miniFatDataSectorNum, 128u) > numMiniFatSectors) throw cybozu::Exception("ms:makeLayout:large miniFatDataSectorNum") << miniFatDataSectorNum;
229
+ }
230
+
231
+ const uint32_t directoryEntrySectorNum = getBlockNum(static_cast<uint32_t>(cfb.dirs.size()), 4u);
232
+ const uint32_t encryptionPackageSectorNum = getBlockNum(static_cast<uint32_t>(dirs[iEncryptionPackage].streamSize), sectorSize);
233
+ const uint32_t contentSectorNum = numMiniFatSectors + directoryEntrySectorNum + miniFatDataSectorNum + encryptionPackageSectorNum;
234
+ dprintf("encryptionPackageSectorNum=%u\n", encryptionPackageSectorNum);
235
+ dprintf("contentSectorNum=%u\n", contentSectorNum);
236
+
237
+ uint32_t fatSectorNum;
238
+ uint32_t difatSectorNum;
239
+
240
+ detectSectorNum(difatSectorNum, fatSectorNum, contentSectorNum, sectorSize);
241
+ dprintf("fatSectorNum=%u\n", fatSectorNum);
242
+ dprintf("difatSectorNum=%u\n", difatSectorNum);
243
+
244
+ const uint32_t difatPos = 0;
245
+ const uint32_t fatPos = difatPos + difatSectorNum;
246
+ const uint32_t miniFatPos = fatPos + fatSectorNum;
247
+ const uint32_t directoryEntryPos = miniFatPos + numMiniFatSectors;
248
+ const uint32_t miniFatDataPos = directoryEntryPos + directoryEntrySectorNum;
249
+ const uint32_t encryptionPackagePos = miniFatDataPos + miniFatDataSectorNum;
250
+
251
+ header.firstDirectorySectorLocation = directoryEntryPos;
252
+ header.firstMiniFatSectorLocation = miniFatPos;
253
+ header.numMiniFatSectors = numMiniFatSectors;
254
+
255
+ // FAT
256
+ dirs[iRoot].startingSectorLocation = miniFatDataPos;
257
+ dirs[iRoot].streamSize = 64 * miniFatNum;
258
+ dirs[iEncryptionPackage].startingSectorLocation = encryptionPackagePos;
259
+
260
+ const uint32_t allSectorNum = difatSectorNum + fatSectorNum + contentSectorNum;
261
+ dprintf("allSectorNum=%u\n", allSectorNum);
262
+ data.resize(512 + allSectorNum * sectorSize);
263
+
264
+ for (uint32_t i = 0; i < std::min<uint32_t>(fatSectorNum, cfb::Header::firstNumDIFAT); i++) {
265
+ header.difat.push_back(fatPos + i);
266
+ }
267
+ header.numFatSectors = fatSectorNum;
268
+ header.numDifatSectors = difatSectorNum;
269
+ if (difatSectorNum > 0) {
270
+ header.firstDifatSectorLocation = difatPos;
271
+ }
272
+ header.write(&data[0]);
273
+
274
+ // make DIFAT
275
+ if (difatSectorNum > 0) {
276
+ makeDifat(&data[0], difatPos, difatSectorNum, fatSectorNum, sectorSize);
277
+ }
278
+
279
+ // make FAT
280
+ {
281
+ cfb::UintVec v;
282
+ for (uint32_t i = 0; i < difatSectorNum; i++) {
283
+ v.push_back(cfb::DIFSECT);
284
+ }
285
+ for (uint32_t i = 0; i < fatSectorNum; i++) {
286
+ v.push_back(cfb::FATSECT);
287
+ }
288
+ v.push_back(numMiniFatSectors);
289
+ v.push_back(directoryEntrySectorNum);
290
+ v.push_back(miniFatDataSectorNum);
291
+ v.push_back(encryptionPackageSectorNum);
292
+ char *p = &data[512 + fatPos * sectorSize];
293
+ makeFat(p, p + fatSectorNum * sectorSize, v);
294
+ }
295
+ // make mini FAT
296
+ {
297
+ char *p = &data[512 + miniFatPos * sectorSize];
298
+ makeFat(p, p + numMiniFatSectors * sectorSize, miniFatSectorNumVec);
299
+ }
300
+ for (size_t i = 0; i < dirs.size(); i++) {
301
+ dirs[i].write(&data[512 + directoryEntryPos * sectorSize + i * 128]);
302
+ }
303
+ for (size_t i = 0; i < dirs.size(); i++) {
304
+ const cfb::DirectoryEntry& dir = dirs[i];
305
+ const size_t size = dir.content.size();
306
+ if (size == 0) continue;
307
+ if (size <= 4096) {
308
+ memcpy(&data[512 + miniFatDataPos * sectorSize + dir.startingSectorLocation * 64], dir.content.c_str(), size);
309
+ } else {
310
+ memcpy(&data[512 + dir.startingSectorLocation * sectorSize], dir.content.c_str(), size);
311
+ }
312
+ }
313
+ dprintf("data.size=%d\n", (int)data.size());
314
+ }
315
+
316
+ } // ms
@@ -0,0 +1,129 @@
1
+ #pragma once
2
+ #include <stdlib.h>
3
+ /**
4
+ @file
5
+ @brief MS Office Crypt tool dll
6
+ @author herumi
7
+ Copyright (C) 2016 Cybozu Labs, Inc., all rights reserved.
8
+ */
9
+
10
+ #ifdef _MSC_VER
11
+ #ifndef MSOC_DONT_AUTO_LINK
12
+ #pragma comment(lib, "msoc.lib")
13
+ #endif
14
+ #ifdef _WIN64
15
+ #define MSOC_DLL_EXPORT
16
+ #else
17
+ #define MSOC_DLL_EXPORT __stdcall
18
+ #endif
19
+ #else
20
+ #define MSOC_DLL_EXPORT
21
+ #endif
22
+
23
+ #ifdef __cplusplus
24
+ extern "C" {
25
+ #endif
26
+
27
+ #define MSOC_NOERR 0
28
+ #define MSOC_ERR_NOT_SUPPORT (-1)
29
+ #define MSOC_ERR_ALREADY_ENCRYPTED (-2)
30
+ #define MSOC_ERR_ALREADY_DECRYPTED (-3)
31
+ #define MSOC_ERR_BAD_PASSWORD (-4)
32
+ #define MSOC_ERR_BAD_PARAMETER (-5)
33
+ #define MSOC_ERR_SMALL_MAX_SIZE (-6)
34
+ #define MSOC_ERR_NO_MEMORY (-7)
35
+ #define MSOC_ERR_EXCEPTION (-8)
36
+ #define MSOC_ERR_TOO_LARGE_FILE (-9)
37
+ #define MSOC_ERR_INFILE_IS_EMPTY (-10)
38
+ #define MSOC_ERR_OUTFILE_IS_EMPTY (-11)
39
+ #define MSOC_ERR_PASS_IS_EMPTY (-12)
40
+
41
+ const char * MSOC_DLL_EXPORT MSOC_getErrMessage(int err);
42
+
43
+ typedef struct msoc_opt msoc_opt;
44
+
45
+ #ifdef _MSC_VER
46
+ /*
47
+ encrypt inFile and make outFile with pass(UTF-16 version)
48
+ @param outFile [in] encrypted MS Office file
49
+ @param inFile [in] plain MS Office file
50
+ @param pass [in] password
51
+ @param opt [inout] option (NULL is permitted)
52
+ use spinCount, secretKey of opt if set
53
+ */
54
+ int MSOC_DLL_EXPORT MSOC_encrypt(const wchar_t *outFile, const wchar_t *inFile, const wchar_t *pass, const msoc_opt *opt);
55
+ /*
56
+ decrypt inFile and make outFile with pass(UTF-16 version)
57
+ @param outFile [in] plain MS Office file (NULL is permitted)
58
+ @param inFile [in] encrypted MS Office file
59
+ @param pass [in] password (NULL is permitted)
60
+ @param opt [inout] option (NULL is permitted)
61
+
62
+ secretKey of opt is used if pass is NULL
63
+ opt is set by the value of inFile if opt is not NULL
64
+ */
65
+ int MSOC_DLL_EXPORT MSOC_decrypt(const wchar_t *outFile, const wchar_t *inFile, const wchar_t *pass, msoc_opt *opt);
66
+ #endif
67
+ /*
68
+ encrypt inFile and make outFile with pass(ASCII version : not UTF-8)
69
+ @param outFile [in] encrypted MS Office file
70
+ @param inFile [in] plain MS Office file
71
+ @param pass [in] password
72
+ @param opt [inout] option (NULL is permitted)
73
+ use spinCount, secretKey of opt if set
74
+ */
75
+ int MSOC_DLL_EXPORT MSOC_encryptA(const char *outFile, const char *inFile, const char *pass, const msoc_opt *opt);
76
+ /*
77
+ decrypt inFile and make outFile with pass(ASCII version : not UTF-8)
78
+ @param outFile [in] plain MS Office file (NULL is permitted)
79
+ @param inFile [in] encrypted MS Office file
80
+ @param pass [in] password (NULL is permitted)
81
+ @param opt [inout] option (NULL is permitted)
82
+
83
+ secretKey of opt is used if pass is NULL
84
+ opt is set by the value of inFile if opt is not NULL
85
+ */
86
+ int MSOC_DLL_EXPORT MSOC_decryptA(const char *outFile, const char *inFile, const char *pass, msoc_opt *opt);
87
+
88
+ /*
89
+ optType of msoc_opt
90
+ */
91
+ #define MSOC_OPT_TYPE_SPIN_COUNT 1 // spinCount(int)
92
+ #define MSOC_OPT_TYPE_SECRET_KEY 2 // secretKey(hex ascii string) (eg. 0123ab)
93
+
94
+ /*
95
+ create default msoc_opt
96
+ spinCount = 100000
97
+ secretKey = "" (auto generated)
98
+ return pointer to msoc_opt
99
+ err if NULL
100
+ */
101
+ msoc_opt * MSOC_DLL_EXPORT MSOC_createOpt(void);
102
+ /*
103
+ destroy msoc_opt
104
+ */
105
+ void MSOC_DLL_EXPORT MSOC_destroyOpt(msoc_opt *msoc);
106
+
107
+ /*
108
+ get int value of optType of opt);
109
+ @param value [out] return value
110
+ */
111
+ int MSOC_DLL_EXPORT MSOC_getInt(int *value, const msoc_opt *opt, int optType);
112
+ /*
113
+ set int value of optType of opt
114
+ */
115
+ int MSOC_DLL_EXPORT MSOC_setInt(msoc_opt *opt, int optType, int value);
116
+ /*
117
+ get string value of optType of opt
118
+ @param str [out] return value
119
+ @param maxSize [in] buffer size of str including '\0'
120
+ */
121
+ int MSOC_DLL_EXPORT MSOC_getStr(char *str, size_t maxSize, const msoc_opt *opt, int optType);
122
+ /*
123
+ set string value of optType of opt
124
+ */
125
+ int MSOC_DLL_EXPORT MSOC_setStr(msoc_opt *opt, int optType, const char *str);
126
+
127
+ #ifdef __cplusplus
128
+ }
129
+ #endif
@@ -0,0 +1,7 @@
1
+ #pragma once
2
+ namespace ms { namespace resource {
3
+ const std::string Version("\x3c\x00\x00\x00\x4d\x00\x69\x00\x63\x00\x72\x00\x6f\x00\x73\x00\x6f\x00\x66\x00\x74\x00\x2e\x00\x43\x00\x6f\x00\x6e\x00\x74\x00\x61\x00\x69\x00\x6e\x00\x65\x00\x72\x00\x2e\x00\x44\x00\x61\x00\x74\x00\x61\x00\x53\x00\x70\x00\x61\x00\x63\x00\x65\x00\x73\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00", 76);
4
+ const std::string Primary("\x58\x00\x00\x00\x01\x00\x00\x00\x4c\x00\x00\x00\x7b\x00\x46\x00\x46\x00\x39\x00\x41\x00\x33\x00\x46\x00\x30\x00\x33\x00\x2d\x00\x35\x00\x36\x00\x45\x00\x46\x00\x2d\x00\x34\x00\x36\x00\x31\x00\x33\x00\x2d\x00\x42\x00\x44\x00\x44\x00\x35\x00\x2d\x00\x35\x00\x41\x00\x34\x00\x31\x00\x43\x00\x31\x00\x44\x00\x30\x00\x37\x00\x32\x00\x34\x00\x36\x00\x7d\x00\x4e\x00\x00\x00\x4d\x00\x69\x00\x63\x00\x72\x00\x6f\x00\x73\x00\x6f\x00\x66\x00\x74\x00\x2e\x00\x43\x00\x6f\x00\x6e\x00\x74\x00\x61\x00\x69\x00\x6e\x00\x65\x00\x72\x00\x2e\x00\x45\x00\x6e\x00\x63\x00\x72\x00\x79\x00\x70\x00\x74\x00\x69\x00\x6f\x00\x6e\x00\x54\x00\x72\x00\x61\x00\x6e\x00\x73\x00\x66\x00\x6f\x00\x72\x00\x6d\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00", 200);
5
+ const std::string DataSpaceMap("\x08\x00\x00\x00\x01\x00\x00\x00\x68\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x45\x00\x6e\x00\x63\x00\x72\x00\x79\x00\x70\x00\x74\x00\x65\x00\x64\x00\x50\x00\x61\x00\x63\x00\x6b\x00\x61\x00\x67\x00\x65\x00\x32\x00\x00\x00\x53\x00\x74\x00\x72\x00\x6f\x00\x6e\x00\x67\x00\x45\x00\x6e\x00\x63\x00\x72\x00\x79\x00\x70\x00\x74\x00\x69\x00\x6f\x00\x6e\x00\x44\x00\x61\x00\x74\x00\x61\x00\x53\x00\x70\x00\x61\x00\x63\x00\x65\x00\x00\x00", 112);
6
+ const std::string StrongEncryptionDataSpace("\x08\x00\x00\x00\x01\x00\x00\x00\x32\x00\x00\x00\x53\x00\x74\x00\x72\x00\x6f\x00\x6e\x00\x67\x00\x45\x00\x6e\x00\x63\x00\x72\x00\x79\x00\x70\x00\x74\x00\x69\x00\x6f\x00\x6e\x00\x54\x00\x72\x00\x61\x00\x6e\x00\x73\x00\x66\x00\x6f\x00\x72\x00\x6d\x00\x00\x00", 64);
7
+ } } // ms::resource