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,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