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,203 @@
1
+ #pragma once
2
+ /**
3
+ @file
4
+ @brief tiny wrapper of openssl class
5
+
6
+ @author MITSUNARI Shigeo(@herumi)
7
+ */
8
+ #include <cybozu/socket.hpp>
9
+ #include <cybozu/exception.hpp>
10
+ #include <openssl/engine.h>
11
+ #include <openssl/ssl.h>
12
+ #include <openssl/err.h>
13
+ #include <openssl/rand.h>
14
+ //#include <openssl/crypto.h>
15
+ //#include <openssl/conf.h>
16
+ #ifdef _MSC_VER
17
+ #include <cybozu/link_libeay32.hpp>
18
+ #include <cybozu/link_ssleay32.hpp>
19
+ #endif
20
+
21
+ namespace cybozu {
22
+
23
+ namespace ssl {
24
+
25
+ struct Engine {
26
+ Engine()
27
+ {
28
+ SSL_load_error_strings();
29
+ SSL_library_init();
30
+ }
31
+ ~Engine()
32
+ {
33
+ #if OPENSSL_VERSION_NUMBER >= 0x10000000L && OPENSSL_VERSION_NUMBER < 0x10100000L
34
+ ERR_remove_thread_state(0);
35
+ #elif OPENSSL_VERSION_NUMBER < 0x10000000L
36
+ ERR_remove_state(0);
37
+ #endif
38
+ EVP_cleanup();
39
+ CRYPTO_cleanup_all_ex_data();
40
+ ENGINE_cleanup();
41
+ ERR_free_strings();
42
+ // CONF_modules_unload(1); // openssl/conf.h
43
+ /* this decreases one leak, but is this correct? */
44
+ OPENSSL_free(SSL_COMP_get_compression_methods());
45
+ }
46
+ static Engine& getInstance()
47
+ {
48
+ static Engine engine;
49
+ return engine;
50
+ }
51
+ void putError()
52
+ {
53
+ ERR_print_errors_fp(stderr);
54
+ }
55
+ };
56
+
57
+ class Ctx {
58
+ Engine& engine_;
59
+ SSL_CTX *ctx_;
60
+ Ctx(const Ctx&);
61
+ void operator=(const Ctx&);
62
+ public:
63
+ explicit Ctx()
64
+ : engine_(Engine::getInstance())
65
+ #if OPENSSL_VERSION_NUMBER >= 0x10100000L
66
+ , ctx_(SSL_CTX_new(TLS_client_method()))
67
+ #else
68
+ , ctx_(SSL_CTX_new(TLSv1_client_method()))
69
+ #endif
70
+ {
71
+ if (ctx_ == 0) {
72
+ engine_.putError();
73
+ fprintf(stderr, "SSL_CTX_new:err");
74
+ exit(1);
75
+ }
76
+ #if 0
77
+ if (SSL_CTX_set_cipher_list(ctx_, "ALL:eNULL") == 0) {
78
+ engine_.putError();
79
+ fprintf(stderr, "SSL_CTX_set_cipher_list:err");
80
+ exit(1);
81
+ }
82
+ #endif
83
+ }
84
+ ~Ctx()
85
+ {
86
+ if (ctx_) SSL_CTX_free(ctx_);
87
+ }
88
+ SSL_CTX* get() const { return ctx_; }
89
+ };
90
+
91
+ namespace impl {
92
+ template<int dummy = 0>
93
+ struct InstanceIsHere { static Ctx ctx_; };
94
+
95
+ template<int dummy>
96
+ Ctx InstanceIsHere<dummy>::ctx_;
97
+
98
+ struct DummyCall {
99
+ DummyCall() { InstanceIsHere<>::ctx_.get(); }
100
+ };
101
+
102
+ } // impl
103
+
104
+ class ClientSocket {
105
+ cybozu::Socket soc_;
106
+ SSL *ssl_;
107
+
108
+ ClientSocket(const ClientSocket&);
109
+ void operator=(const ClientSocket&);
110
+ public:
111
+ ClientSocket()
112
+ : ssl_(SSL_new(impl::InstanceIsHere<>::ctx_.get()))
113
+ {
114
+ if (ssl_ == 0) {
115
+ throw cybozu::Exception("ssl:ClientSocket");
116
+ }
117
+ }
118
+ void connect(const std::string& address, uint16_t port)
119
+ {
120
+ SocketAddr addr;
121
+ addr.set(address, port);
122
+ connect(addr);
123
+ }
124
+ void connect(const cybozu::SocketAddr& addr)
125
+ {
126
+ soc_.connect(addr);
127
+ bool isOK;
128
+ #ifdef _WIN32
129
+ if (soc_.sd_ > INT_MAX) {
130
+ throw cybozu::Exception("ssl:ClientSocket:connect:large socket handle") << soc_.sd_;
131
+ }
132
+ #endif
133
+ isOK = SSL_set_fd(ssl_, static_cast<int>(soc_.sd_)) != 0;
134
+ if (!isOK) goto ERR_EXIT;
135
+ isOK = SSL_connect(ssl_) == 1;
136
+ if (!isOK) goto ERR_EXIT;
137
+ return;
138
+ ERR_EXIT:
139
+ Engine::getInstance().putError();
140
+ throw cybozu::Exception("ssl:ClientSocket:connect");
141
+ }
142
+ size_t readSome(void *buf, size_t bufSize)
143
+ {
144
+ int size = (int)std::min((size_t)0x7fffffff, bufSize);
145
+ RETRY:
146
+ int ret = SSL_read(ssl_, buf, size);
147
+ if (ret > 0) return ret;
148
+ ret = SSL_get_error(ssl_, ret);
149
+ if (ret == SSL_ERROR_ZERO_RETURN) return 0;
150
+ if (ret == SSL_ERROR_WANT_READ || ret == SSL_ERROR_WANT_WRITE) goto RETRY;
151
+ Engine::getInstance().putError();
152
+ throw cybozu::Exception("ssl:ClientSocket:readSome") << ret;
153
+ }
154
+ void read(void *buf, size_t bufSize)
155
+ {
156
+ char *p = (char *)buf;
157
+ while (bufSize > 0) {
158
+ size_t readSize = readSome(p, bufSize);
159
+ p += readSize;
160
+ bufSize -= readSize;
161
+ }
162
+ }
163
+ void write(const char *buf, size_t bufSize)
164
+ {
165
+ const char *p = (const char *)buf;
166
+ while (bufSize > 0) {
167
+ int size = (int)std::min((size_t)0x7fffffff, bufSize);
168
+ int ret = SSL_write(ssl_, p, size);
169
+ if (ret <= 0) {
170
+ ret = SSL_get_error(ssl_, ret);
171
+ if (ret == SSL_ERROR_WANT_READ || ret == SSL_ERROR_WANT_WRITE) continue;
172
+ Engine::getInstance().putError();
173
+ throw cybozu::Exception("ssl:ClientSocket:write") << ret;
174
+ }
175
+ p += ret;
176
+ bufSize -= ret;
177
+ }
178
+ }
179
+ void close(bool dontThrow = false)
180
+ {
181
+ bool isOK = true;
182
+ if (soc_.isValid()) {
183
+ isOK = SSL_shutdown(ssl_) == 1;
184
+ if (!isOK) {
185
+ Engine::getInstance().putError();
186
+ }
187
+ soc_.close(dontThrow);
188
+ }
189
+ if (!dontThrow && !isOK) throw cybozu::Exception("ssl:ClientSocket:close");
190
+ }
191
+ ~ClientSocket()
192
+ {
193
+ if (ssl_) {
194
+ close(cybozu::DontThrow);
195
+ SSL_free(ssl_);
196
+ ssl_ = 0;
197
+ }
198
+ }
199
+ };
200
+
201
+ } // cybozu::ssl
202
+
203
+ } // cybozu
@@ -0,0 +1,291 @@
1
+ #pragma once
2
+ /**
3
+ @file
4
+ @brief stacktrace class
5
+ @author MITSUNARI Shigeo(@herumi)
6
+ */
7
+ #include <string>
8
+ #include <vector>
9
+ #include <cybozu/itoa.hpp>
10
+ #include <stdlib.h>
11
+ #include <iosfwd>
12
+
13
+ #ifdef _WIN32
14
+ #ifndef WIN32_LEAN_AND_MEAN
15
+ #define WIN32_LEAN_AND_MEAN
16
+ #endif
17
+ #include <windows.h>
18
+ #include <imagehlp.h>
19
+ #include <stdio.h>
20
+ #pragma comment(lib, "imagehlp.lib")
21
+ #else
22
+ #include <execinfo.h>
23
+ #include <string.h>
24
+ #include <cxxabi.h>
25
+ #include <stdint.h>
26
+ #ifdef CYBOZU_STACKTRACE_WITH_BFD_GPL
27
+ #include <cybozu/bfd.hpp>
28
+ #endif
29
+ #endif
30
+
31
+ #ifndef NDEBUG
32
+ #define CYBOZU_STACKTRACE_RESOLVE_SYMBOL
33
+ #endif
34
+
35
+ namespace cybozu {
36
+
37
+ namespace stacktrace_local {
38
+
39
+ #ifdef _WIN32
40
+
41
+ struct InitSymbol {
42
+ HANDLE hdl_;
43
+ InitSymbol()
44
+ : hdl_(GetCurrentProcess())
45
+ {
46
+ #ifdef CYBOZU_STACKTRACE_RESOLVE_SYMBOL
47
+ SymInitialize(hdl_, NULL, TRUE);
48
+ #endif
49
+ }
50
+ ~InitSymbol()
51
+ {
52
+ #ifdef CYBOZU_STACKTRACE_RESOLVE_SYMBOL
53
+ SymCleanup(hdl_);
54
+ #endif
55
+ }
56
+ HANDLE getHandle() const { return hdl_; }
57
+ };
58
+
59
+ template<int dummy = 0>
60
+ struct InstanceIsHere { static InitSymbol is_; };
61
+
62
+ template<int dummy>
63
+ InitSymbol InstanceIsHere<dummy>::is_;
64
+
65
+ struct DummyCall {
66
+ DummyCall() { InstanceIsHere<>::is_.getHandle(); }
67
+ };
68
+
69
+ #endif
70
+
71
+ class AutoFree {
72
+ void *p_;
73
+ public:
74
+ AutoFree(void *p)
75
+ : p_(p)
76
+ {
77
+ }
78
+ ~AutoFree()
79
+ {
80
+ free(p_);
81
+ }
82
+ };
83
+
84
+ #if defined(CYBOZU_STACKTRACE_WITH_BFD_GPL) || defined(CYBOZU_STACKTRACE_RESOLVE_SYMBOL)
85
+ const char delim = '\n';
86
+ #else
87
+ #define CYBOZU_STACKTRACE_ONELINE
88
+ const char delim = ' ';
89
+ #endif
90
+
91
+ inline std::string addrToHex(const void *addr)
92
+ {
93
+ char buf[32];
94
+ #ifdef CYBOZU_STACKTRACE_ONELINE
95
+ CYBOZU_SNPRINTF(buf, sizeof(buf), "0x%llx", (long long)addr);
96
+ #else
97
+ CYBOZU_SNPRINTF(buf, sizeof(buf), "[0x%llx]", (long long)addr);
98
+ #endif
99
+ return buf;
100
+ }
101
+
102
+ } // stacktrace_local
103
+
104
+ #ifdef __GNUC__
105
+ inline bool Demangle(std::string& out, const std::string& func)
106
+ {
107
+ int status;
108
+ char *demangled = abi::__cxa_demangle(func.c_str(), 0, 0, &status);
109
+ stacktrace_local::AutoFree afDemangle(demangled);
110
+ if (status == 0) {
111
+ out = demangled;
112
+ return true;
113
+ } else {
114
+ out = func;
115
+ return false;
116
+ }
117
+ }
118
+ #endif
119
+
120
+ class StackTrace {
121
+ std::vector<void*> data_;
122
+ #ifdef CYBOZU_STACKTRACE_WITH_BFD_GPL
123
+ static inline cybozu::Bfd& getBfd()
124
+ {
125
+ static cybozu::Bfd bfd;
126
+ return bfd;
127
+ }
128
+ #endif
129
+ public:
130
+ /**
131
+ set current stack trace
132
+ */
133
+ StackTrace()
134
+ {
135
+ data_.clear();
136
+
137
+ const int maxTraceNum = 32;
138
+
139
+ #ifdef _WIN32
140
+
141
+ CONTEXT ctx;
142
+ memset(&ctx, 0, sizeof(ctx));
143
+ ctx.ContextFlags = CONTEXT_CONTROL | CONTEXT_INTEGER;
144
+ RtlCaptureContext(&ctx);
145
+
146
+ STACKFRAME64 sf;
147
+ memset(&sf, 0, sizeof(sf));
148
+
149
+ #ifdef _WIN64
150
+ sf.AddrPC.Offset = ctx.Rip;
151
+ sf.AddrFrame.Offset = ctx.Rbp;
152
+ sf.AddrStack.Offset = ctx.Rsp;
153
+ DWORD machineType = IMAGE_FILE_MACHINE_AMD64;
154
+ #else
155
+ sf.AddrPC.Offset = ctx.Eip;
156
+ sf.AddrFrame.Offset = ctx.Ebp;
157
+ sf.AddrStack.Offset = ctx.Esp;
158
+ DWORD machineType = IMAGE_FILE_MACHINE_I386;
159
+ #endif
160
+ sf.AddrPC.Mode = AddrModeFlat;
161
+ sf.AddrFrame.Mode = AddrModeFlat;
162
+ sf.AddrStack.Mode = AddrModeFlat;
163
+
164
+ HANDLE threadHdl = GetCurrentThread();
165
+
166
+ HANDLE processHdl = stacktrace_local::InstanceIsHere<>::is_.getHandle();
167
+ for(;;) {
168
+ BOOL ret;
169
+ ret = StackWalk64(machineType, processHdl, threadHdl, &sf, &ctx, NULL,
170
+ SymFunctionTableAccess64, SymGetModuleBase64, NULL);
171
+ if (!ret || sf.AddrFrame.Offset == 0) return;
172
+
173
+ data_.push_back((void*)sf.AddrPC.Offset);
174
+ if (data_.size() == maxTraceNum) return;
175
+ }
176
+ #else
177
+ data_.resize(maxTraceNum);
178
+ int traceNum = backtrace(&data_[0], maxTraceNum);
179
+ data_.resize(traceNum);
180
+ #endif
181
+ }
182
+ /**
183
+ get stack trace
184
+ */
185
+ std::string toString() const
186
+ {
187
+ size_t traceNum = data_.size();
188
+ if (traceNum == 0) return "";
189
+
190
+ std::string out;
191
+
192
+ #ifdef _WIN32
193
+ #ifdef CYBOZU_STACKTRACE_RESOLVE_SYMBOL
194
+ HANDLE processHdl = stacktrace_local::InstanceIsHere<>::is_.getHandle();
195
+ #endif
196
+ if (traceNum > 1) traceNum--; // last information is unnecessary
197
+ for (size_t i = 0; i < traceNum; i++) {
198
+ uintptr_t ptr = (uintptr_t)data_[i];
199
+
200
+ #ifdef CYBOZU_STACKTRACE_RESOLVE_SYMBOL
201
+ DWORD disp;
202
+ IMAGEHLP_LINE64 line;
203
+ memset(&line, 0, sizeof(line));
204
+ line.SizeOfStruct = sizeof(line);
205
+ if (SymGetLineFromAddr64(processHdl, ptr, &disp, &line)) {
206
+ out += line.FileName;
207
+ out += ':';
208
+ out += cybozu::itoa((int)line.LineNumber);
209
+ out += ' ';
210
+ }
211
+ #endif
212
+ out += stacktrace_local::addrToHex((const void*)ptr);
213
+ if (i < traceNum - 1) out += stacktrace_local::delim;
214
+ }
215
+ #else
216
+
217
+ #ifdef CYBOZU_STACKTRACE_RESOLVE_SYMBOL
218
+ char **symbol = backtrace_symbols(&data_[0], traceNum);
219
+ stacktrace_local::AutoFree freeSymbol(symbol);
220
+ #endif
221
+ for (size_t i = 0; i < traceNum; i++) {
222
+ std::string funcName;
223
+ #ifdef CYBOZU_STACKTRACE_WITH_BFD_GPL
224
+ {
225
+ std::string fileName;
226
+ int line;
227
+ if (getBfd().getInfo(&fileName, &funcName, &line, data_[i])) {
228
+ Demangle(funcName, funcName);
229
+ out += fileName;
230
+ out += ':';
231
+ out += cybozu::itoa(line);
232
+ out += ' ';
233
+ }
234
+ }
235
+ #endif
236
+ #ifdef CYBOZU_STACKTRACE_RESOLVE_SYMBOL
237
+ if (symbol) {
238
+ std::string str(symbol[i]);
239
+ str += '\0';
240
+ size_t p = str.find('(');
241
+ const char *obj = 0, *addr = 0;
242
+ if (p != std::string::npos) {
243
+ size_t q = str.find('+', p + 1);
244
+ if (q != std::string::npos) {
245
+ obj = &str[0]; str[p] = '\0';
246
+ const char *const func = &str[p + 1]; str[q] = '\0';
247
+ addr = &str[q + 1];
248
+ if (funcName.empty()) {
249
+ Demangle(funcName, func);
250
+ }
251
+ }
252
+ }
253
+ bool doPrint = false;
254
+ if (obj && addr) {
255
+ out += obj;
256
+ out += '(';
257
+ out += funcName;
258
+ out += '+';
259
+ out += addr;
260
+ out += ' ';
261
+ doPrint = true;
262
+ } else if (!funcName.empty()) {
263
+ out += funcName;
264
+ out += ' ';
265
+ }
266
+ if (!doPrint) {
267
+ out += symbol[i];
268
+ out += ' ';
269
+ }
270
+ } else
271
+ #endif
272
+ {
273
+ out += stacktrace_local::addrToHex(data_[i]);
274
+ }
275
+ if (i < traceNum - 1) out += stacktrace_local::delim;
276
+ }
277
+ #endif
278
+ return out;
279
+ }
280
+ bool empty() const CYBOZU_NOEXCEPT { return data_.empty(); }
281
+ void clear() CYBOZU_NOEXCEPT { data_.clear(); }
282
+ };
283
+
284
+ inline std::ostream& operator<<(std::ostream& os, const StackTrace& self)
285
+ {
286
+ return os << self.toString();
287
+ }
288
+
289
+ } // cybozu
290
+
291
+ #undef CYBOZU_STACKTRACE_RESOLVE_SYMBOL