javonet-nodejs-sdk 2.0.4 → 2.0.5

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 (323) hide show
  1. package/Binaries/Cpp/Windows/X64/JavonetCppRuntime.dll +0 -0
  2. package/Binaries/Go/Windows/X64/JavonetGoRuntime.dll +0 -0
  3. package/Binaries/Jvm/Linux/X64/JavonetJvmRuntime.jar +0 -0
  4. package/Binaries/Jvm/MacOs/X64/JavonetJvmRuntime.jar +0 -0
  5. package/Binaries/Jvm/Windows/X64/JavonetJvmRuntime.jar +0 -0
  6. package/Binaries/Native/MacOs/X64/libJavonetNodejsRuntimeNative.dylib +0 -0
  7. package/Binaries/Native/MacOs/X64/libJavonetPerlRuntimeNative.dylib +0 -0
  8. package/Binaries/Native/Windows/X64/JavonetClrRuntimeNative.dll +0 -0
  9. package/Binaries/Native/Windows/X64/JavonetCppRuntimeNative.dll +0 -0
  10. package/Binaries/Native/Windows/X64/JavonetGoRuntimeNative.dll +0 -0
  11. package/Binaries/Native/Windows/X64/JavonetJvmRuntimeNative.dll +0 -0
  12. package/Binaries/Native/Windows/X64/JavonetNetcoreRuntimeNative.dll +0 -0
  13. package/Binaries/Native/Windows/X64/JavonetNodejsRuntimeNative.dll +0 -0
  14. package/Binaries/Native/Windows/X64/JavonetPerlRuntimeNative.dll +0 -0
  15. package/Binaries/Native/Windows/X64/JavonetPythonRuntimeNative.dll +0 -0
  16. package/Binaries/Native/Windows/X64/JavonetRubyRuntimeNative.dll +0 -0
  17. package/Binaries/Native/Windows/X64/Utils.dll +0 -0
  18. package/Binaries/Nodejs/MacOs/X64/JavonetNodejsRuntimeAddon.node +0 -0
  19. package/Binaries/Nodejs/Windows/X64/JavonetNodejsRuntimeAddon.node +0 -0
  20. package/Binaries/Perl/Linux/X64/deps/lib/perl5/Package/DeprecationManager.pm +45 -38
  21. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Alien-Build-2.77/install.json +1 -1
  22. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Alien-Build-Plugin-Download-GitHub-0.10/install.json +1 -1
  23. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Alien-FFI-0.27/install.json +1 -1
  24. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Attribute-Util-1.07/install.json +1 -1
  25. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Capture-Tiny-0.48/install.json +1 -1
  26. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Class-Data-Inheritable-0.09/install.json +1 -1
  27. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Class-Load-0.25/install.json +1 -1
  28. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Class-Load-XS-0.10/install.json +1 -1
  29. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Clone-0.46/install.json +1 -1
  30. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Data-Cmp-0.010/install.json +1 -1
  31. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Data-OptList-0.113/install.json +1 -1
  32. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Data-UUID-1.226/install.json +1 -1
  33. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Devel-GlobalDestruction-0.14/install.json +1 -1
  34. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Devel-OverloadInfo-0.007/install.json +1 -1
  35. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Devel-StackTrace-2.04/install.json +1 -1
  36. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Dist-CheckConflicts-0.11/install.json +1 -1
  37. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Eval-Closure-0.14/install.json +1 -1
  38. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/ExtUtils-Config-0.008/install.json +1 -1
  39. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/ExtUtils-Helpers-0.026/install.json +1 -1
  40. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/ExtUtils-InstallPaths-0.012/install.json +1 -1
  41. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/FFI-CheckLib-0.31/install.json +1 -1
  42. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/FFI-Platypus-2.05/install.json +1 -1
  43. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/File-Listing-6.15/install.json +1 -1
  44. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/File-Which-1.27/install.json +1 -1
  45. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/File-chdir-0.1011/install.json +1 -1
  46. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/HTTP-Cookies-6.10/install.json +1 -1
  47. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/HTTP-Negotiate-6.01/install.json +1 -1
  48. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/IPC-System-Simple-1.30/install.json +1 -1
  49. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/MRO-Compat-0.15/install.json +1 -1
  50. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Module-Build-0.4232/install.json +1 -1
  51. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Module-Build-Tiny-0.039/install.json +1 -1
  52. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Module-Implementation-0.09/install.json +1 -1
  53. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Module-Runtime-0.016/install.json +1 -1
  54. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Module-Runtime-Conflicts-0.003/install.json +1 -1
  55. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Moose-2.2203/install.json +1 -1
  56. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Net-HTTP-6.22/install.json +1 -1
  57. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Nice-Try-v1.3.3/install.json +1 -1
  58. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/PPI-1.276/install.json +1 -1
  59. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/PPI-XS-0.910/install.json +1 -1
  60. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/{Package-DeprecationManager-0.17 → Package-DeprecationManager-0.18}/MYMETA.json +298 -181
  61. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Package-DeprecationManager-0.18/install.json +1 -0
  62. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Package-Stash-0.40/install.json +1 -1
  63. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Package-Stash-XS-0.30/install.json +1 -1
  64. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Params-Util-1.102/install.json +1 -1
  65. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Path-Tiny-0.144/install.json +1 -1
  66. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Scalar-List-Utils-1.63/install.json +1 -1
  67. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Scalar-Util-Numeric-0.40/install.json +1 -1
  68. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Scope-Guard-0.21/install.json +1 -1
  69. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Sub-Exporter-0.989/install.json +1 -1
  70. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Sub-Exporter-Progressive-0.001013/install.json +1 -1
  71. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Sub-Install-0.929/install.json +1 -1
  72. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Task-Weaken-1.06/install.json +1 -1
  73. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Test-Fatal-0.017/install.json +1 -1
  74. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Try-Tiny-0.31/install.json +1 -1
  75. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/WWW-RobotRules-6.02/install.json +1 -1
  76. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Want-0.29/install.json +1 -1
  77. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/YAML-1.30/install.json +1 -1
  78. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/aliased-0.34/install.json +1 -1
  79. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/autobox-v3.0.1/install.json +1 -1
  80. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/libwww-perl-6.67/install.json +1 -1
  81. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/auto/Class/Load/XS/XS.so +0 -0
  82. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/auto/Data/UUID/UUID.so +0 -0
  83. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/auto/FFI/Platypus/Platypus.so +0 -0
  84. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/auto/List/Util/Util.so +0 -0
  85. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/auto/Moose/Moose.so +0 -0
  86. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/auto/PPI/XS/XS.so +0 -0
  87. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/auto/Package/Stash/XS/XS.so +0 -0
  88. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/auto/Params/Util/Util.so +0 -0
  89. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/auto/Want/Want.so +0 -0
  90. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/auto/share/dist/FFI-Platypus/lib/libplfill.so +0 -0
  91. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/auto/share/dist/FFI-Platypus/probe/bin/dlrun +0 -0
  92. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/perllocal.pod +114 -136
  93. package/Binaries/Perl/MacOs/X64/deps/bin/pkg-config.pl +1786 -0
  94. package/Binaries/Perl/MacOs/X64/deps/bin/ppkg-config +1786 -0
  95. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/IO/Socket/SSL/Intercept.pm +379 -0
  96. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/IO/Socket/SSL/PublicSuffix.pm +14537 -0
  97. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/IO/Socket/SSL/Utils.pm +792 -0
  98. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/IO/Socket/SSL.pm +3701 -0
  99. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/IO/Socket/SSL.pod +2241 -0
  100. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/Mojo/DOM58/Entities.pm +2378 -0
  101. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/Mojo/DOM58/_CSS.pm +409 -0
  102. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/Mojo/DOM58/_Collection.pm +172 -0
  103. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/Mojo/DOM58/_HTML.pm +337 -0
  104. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/Mojo/DOM58.pm +1784 -0
  105. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/Mozilla/CA/cacert.pem +3506 -0
  106. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/Mozilla/CA.pm +71 -0
  107. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/Package/DeprecationManager.pm +45 -38
  108. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/PkgConfig.pm +1786 -0
  109. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Alien-Build-2.77/MYMETA.json +1 -0
  110. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Alien-Build-2.77/install.json +1 -1
  111. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Alien-Build-Plugin-Download-GitHub-0.10/install.json +1 -1
  112. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Alien-FFI-0.27/MYMETA.json +12 -1
  113. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Alien-FFI-0.27/install.json +1 -1
  114. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Attribute-Util-1.07/install.json +1 -1
  115. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Capture-Tiny-0.48/install.json +1 -1
  116. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Class-Data-Inheritable-0.09/install.json +1 -1
  117. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Class-Load-0.25/install.json +1 -1
  118. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Class-Load-XS-0.10/install.json +1 -1
  119. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Clone-0.46/install.json +1 -1
  120. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Data-Cmp-0.010/install.json +1 -1
  121. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Data-OptList-0.113/install.json +1 -1
  122. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Data-UUID-1.226/install.json +1 -1
  123. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Devel-GlobalDestruction-0.14/install.json +1 -1
  124. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Devel-OverloadInfo-0.007/install.json +1 -1
  125. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Devel-StackTrace-2.04/install.json +1 -1
  126. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Dist-CheckConflicts-0.11/install.json +1 -1
  127. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Encode-Locale-1.05/install.json +1 -1
  128. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Eval-Closure-0.14/install.json +1 -1
  129. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/ExtUtils-Config-0.008/install.json +1 -1
  130. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/ExtUtils-Helpers-0.026/install.json +1 -1
  131. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/ExtUtils-InstallPaths-0.012/install.json +1 -1
  132. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/FFI-CheckLib-0.31/install.json +1 -1
  133. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/FFI-Platypus-2.05/MYMETA.json +1 -0
  134. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/FFI-Platypus-2.05/install.json +1 -1
  135. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/File-Listing-6.15/install.json +1 -1
  136. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/File-Which-1.27/install.json +1 -1
  137. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/File-chdir-0.1011/install.json +1 -1
  138. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/HTML-Parser-3.81/install.json +1 -1
  139. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/HTML-Tagset-3.20/install.json +1 -1
  140. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/HTTP-Cookies-6.10/install.json +1 -1
  141. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/HTTP-Date-6.05/install.json +1 -1
  142. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/HTTP-Message-6.44/install.json +1 -1
  143. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/HTTP-Negotiate-6.01/install.json +1 -1
  144. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/IO-HTML-1.004/install.json +1 -1
  145. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/IO-Socket-SSL-2.081/MYMETA.json +57 -0
  146. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/IO-Socket-SSL-2.081/install.json +1 -0
  147. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/IPC-System-Simple-1.30/install.json +1 -1
  148. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/LWP-MediaTypes-6.04/install.json +1 -1
  149. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/MRO-Compat-0.15/install.json +1 -1
  150. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Module-Build-0.4232/install.json +1 -1
  151. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Module-Build-Tiny-0.039/install.json +1 -1
  152. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Module-Implementation-0.09/install.json +1 -1
  153. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Module-Runtime-0.016/install.json +1 -1
  154. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Module-Runtime-Conflicts-0.003/install.json +1 -1
  155. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Mojo-DOM58-3.001/MYMETA.json +107 -0
  156. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Mojo-DOM58-3.001/install.json +1 -0
  157. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Moose-2.2203/install.json +1 -1
  158. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Mozilla-CA-20221114/MYMETA.json +61 -0
  159. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Mozilla-CA-20221114/install.json +1 -0
  160. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Net-HTTP-6.22/install.json +1 -1
  161. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Net-SSLeay-1.92/MYMETA.json +87 -0
  162. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Net-SSLeay-1.92/install.json +1 -0
  163. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Nice-Try-v1.3.3/install.json +1 -1
  164. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/PPI-1.276/install.json +1 -1
  165. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/PPI-XS-0.910/install.json +1 -1
  166. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/{Package-DeprecationManager-0.17 → Package-DeprecationManager-0.18}/MYMETA.json +298 -181
  167. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Package-DeprecationManager-0.18/install.json +1 -0
  168. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Package-Stash-0.40/install.json +1 -1
  169. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Package-Stash-XS-0.30/install.json +1 -1
  170. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Params-Util-1.102/install.json +1 -1
  171. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Path-Tiny-0.144/install.json +1 -1
  172. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/PkgConfig-0.25026/MYMETA.json +61 -0
  173. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/PkgConfig-0.25026/install.json +1 -0
  174. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Scalar-Util-Numeric-0.40/install.json +1 -1
  175. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Scope-Guard-0.21/install.json +1 -1
  176. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Sub-Exporter-0.989/install.json +1 -1
  177. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Sub-Exporter-Progressive-0.001013/install.json +1 -1
  178. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Sub-Install-0.929/install.json +1 -1
  179. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Task-Weaken-1.06/install.json +1 -1
  180. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Test-Fatal-0.017/install.json +1 -1
  181. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/TimeDate-2.33/install.json +1 -1
  182. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Try-Tiny-0.31/install.json +1 -1
  183. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/URI-5.17/install.json +1 -1
  184. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/WWW-RobotRules-6.02/install.json +1 -1
  185. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Want-0.29/install.json +1 -1
  186. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/YAML-1.30/install.json +1 -1
  187. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/aliased-0.34/install.json +1 -1
  188. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/autobox-v3.0.1/install.json +1 -1
  189. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/libwww-perl-6.67/install.json +1 -1
  190. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/Net/SSLeay/Handle.pm +409 -0
  191. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/Net/SSLeay.pm +1905 -0
  192. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/Net/SSLeay.pod +10434 -0
  193. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Alien/FFI/.packlist +11 -0
  194. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/FFI/Platypus/Platypus.bundle +0 -0
  195. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/IO/Socket/SSL/.packlist +9 -0
  196. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Mojo/DOM58/.packlist +7 -0
  197. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Mozilla/CA/.packlist +3 -0
  198. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/.packlist +82 -0
  199. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/SSLeay.bundle +0 -0
  200. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/autosplit.ix +80 -0
  201. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/debug_read.al +22 -0
  202. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/do_https.al +19 -0
  203. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/do_https2.al +13 -0
  204. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/do_https3.al +13 -0
  205. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/do_https4.al +12 -0
  206. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/do_httpx2.al +18 -0
  207. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/do_httpx3.al +43 -0
  208. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/do_httpx4.al +18 -0
  209. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/dump_peer_certificate.al +29 -0
  210. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/get_http.al +9 -0
  211. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/get_http3.al +9 -0
  212. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/get_http4.al +9 -0
  213. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/get_https.al +9 -0
  214. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/get_https3.al +9 -0
  215. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/get_https4.al +9 -0
  216. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/get_httpx.al +9 -0
  217. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/get_httpx3.al +9 -0
  218. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/get_httpx4.al +9 -0
  219. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/head_http.al +10 -0
  220. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/head_http3.al +10 -0
  221. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/head_http4.al +12 -0
  222. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/head_https.al +10 -0
  223. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/head_https3.al +10 -0
  224. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/head_https4.al +12 -0
  225. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/head_httpx.al +10 -0
  226. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/head_httpx3.al +10 -0
  227. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/head_httpx4.al +13 -0
  228. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/http_cat.al +34 -0
  229. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/https_cat.al +95 -0
  230. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/httpx_cat.al +18 -0
  231. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/initialize.al +27 -0
  232. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/make_form.al +25 -0
  233. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/make_headers.al +21 -0
  234. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/new_x_ctx.al +51 -0
  235. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/open_proxy_tcp_connection.al +31 -0
  236. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/open_tcp_connection.al +40 -0
  237. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/post_http.al +9 -0
  238. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/post_http3.al +9 -0
  239. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/post_http4.al +9 -0
  240. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/post_https.al +9 -0
  241. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/post_https3.al +9 -0
  242. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/post_https4.al +9 -0
  243. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/post_httpx.al +9 -0
  244. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/post_httpx3.al +9 -0
  245. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/post_httpx4.al +9 -0
  246. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/put_http.al +9 -0
  247. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/put_http3.al +9 -0
  248. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/put_http4.al +9 -0
  249. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/put_https.al +9 -0
  250. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/put_https3.al +9 -0
  251. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/put_https4.al +9 -0
  252. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/put_httpx.al +9 -0
  253. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/put_httpx3.al +9 -0
  254. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/put_httpx4.al +9 -0
  255. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/randomize.al +31 -0
  256. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/set_cert_and_key.al +23 -0
  257. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/set_proxy.al +17 -0
  258. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/set_server_cert_and_key.al +14 -0
  259. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/ssl_read_CRLF.al +10 -0
  260. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/ssl_read_all.al +36 -0
  261. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/ssl_read_until.al +94 -0
  262. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/ssl_write_CRLF.al +23 -0
  263. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/ssl_write_all.al +149 -0
  264. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/sslcat.al +98 -0
  265. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/tcp_read_CRLF.al +11 -0
  266. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/tcp_read_all.al +26 -0
  267. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/tcp_read_until.al +33 -0
  268. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/tcp_write_CRLF.al +23 -0
  269. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/tcp_write_all.al +36 -0
  270. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/tcpcat.al +37 -0
  271. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/tcpxcat.al +17 -0
  272. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/want_X509_lookup.al +15 -0
  273. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/want_nothing.al +11 -0
  274. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/want_read.al +9 -0
  275. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Net/SSLeay/want_write.al +9 -0
  276. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/PkgConfig/.packlist +6 -0
  277. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/share/dist/Alien-FFI/_alien/alien.json +9 -8
  278. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/share/dist/Alien-FFI/include/ffi.h +531 -0
  279. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/share/dist/Alien-FFI/include/ffitarget.h +164 -0
  280. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/share/dist/Alien-FFI/lib/libffi.a +0 -0
  281. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/share/dist/Alien-FFI/lib/libffi.la +41 -0
  282. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/share/dist/Alien-FFI/lib/pkgconfig/libffi.pc +11 -0
  283. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/share/dist/Alien-FFI/share/info/dir +18 -0
  284. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/share/dist/Alien-FFI/share/info/libffi.info +1060 -0
  285. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/share/dist/Alien-FFI/share/man/man3/ffi.3 +41 -0
  286. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/share/dist/Alien-FFI/share/man/man3/ffi_call.3 +103 -0
  287. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/share/dist/Alien-FFI/share/man/man3/ffi_prep_cif.3 +68 -0
  288. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/share/dist/Alien-FFI/share/man/man3/ffi_prep_cif_var.3 +73 -0
  289. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/share/dist/FFI-Platypus/lib/libplfill.dylib +0 -0
  290. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/perllocal.pod +216 -128
  291. package/Binaries/Perl/Windows/X64/deps/lib/perl5/MSWin32-x64-multi-thread/.meta/Alien-Build-2.77/install.json +1 -1
  292. package/Binaries/Perl/Windows/X64/deps/lib/perl5/MSWin32-x64-multi-thread/.meta/Alien-Build-Plugin-Download-GitHub-0.10/install.json +1 -1
  293. package/Binaries/Perl/Windows/X64/deps/lib/perl5/MSWin32-x64-multi-thread/.meta/Alien-FFI-0.27/install.json +1 -1
  294. package/Binaries/Perl/Windows/X64/deps/lib/perl5/MSWin32-x64-multi-thread/.meta/Attribute-Util-1.07/install.json +1 -1
  295. package/Binaries/Perl/Windows/X64/deps/lib/perl5/MSWin32-x64-multi-thread/.meta/Data-Cmp-0.010/install.json +1 -1
  296. package/Binaries/Perl/Windows/X64/deps/lib/perl5/MSWin32-x64-multi-thread/.meta/Data-UUID-1.226/install.json +1 -1
  297. package/Binaries/Perl/Windows/X64/deps/lib/perl5/MSWin32-x64-multi-thread/.meta/Nice-Try-v1.3.3/install.json +1 -1
  298. package/Binaries/Perl/Windows/X64/deps/lib/perl5/MSWin32-x64-multi-thread/.meta/PPI-1.276/install.json +1 -1
  299. package/Binaries/Perl/Windows/X64/deps/lib/perl5/MSWin32-x64-multi-thread/.meta/PPI-XS-0.910/install.json +1 -1
  300. package/Binaries/Perl/Windows/X64/deps/lib/perl5/MSWin32-x64-multi-thread/.meta/Scalar-Util-Numeric-0.40/install.json +1 -1
  301. package/Binaries/Perl/Windows/X64/deps/lib/perl5/MSWin32-x64-multi-thread/.meta/Want-0.29/install.json +1 -1
  302. package/Binaries/Perl/Windows/X64/deps/lib/perl5/MSWin32-x64-multi-thread/.meta/autobox-v3.0.1/install.json +1 -1
  303. package/Binaries/Perl/Windows/X64/deps/lib/perl5/MSWin32-x64-multi-thread/auto/Data/UUID/UUID.xs.dll +0 -0
  304. package/Binaries/Perl/Windows/X64/deps/lib/perl5/MSWin32-x64-multi-thread/auto/PPI/XS/XS.xs.dll +0 -0
  305. package/Binaries/Perl/Windows/X64/deps/lib/perl5/MSWin32-x64-multi-thread/auto/Scalar/Util/Numeric/Numeric.xs.dll +0 -0
  306. package/Binaries/Perl/Windows/X64/deps/lib/perl5/MSWin32-x64-multi-thread/auto/Want/Want.xs.dll +0 -0
  307. package/Binaries/Perl/Windows/X64/deps/lib/perl5/MSWin32-x64-multi-thread/auto/autobox/autobox.xs.dll +0 -0
  308. package/Binaries/Perl/Windows/X64/deps/lib/perl5/MSWin32-x64-multi-thread/perllocal.pod +23 -23
  309. package/addon/JavonetNodejsRuntimeAddon.cpp +42 -15
  310. package/addon/JavonetNodejsRuntimeAddon.h +1 -0
  311. package/package.json +5 -4
  312. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Package-DeprecationManager-0.17/install.json +0 -1
  313. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Sub-Name-0.26/MYMETA.json +0 -1394
  314. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/.meta/Sub-Name-0.26/install.json +0 -1
  315. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/Sub/Name.pm +0 -202
  316. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/auto/Sub/Name/.packlist +0 -3
  317. package/Binaries/Perl/Linux/X64/deps/lib/perl5/x86_64-linux-gnu-thread-multi/auto/Sub/Name/Name.so +0 -0
  318. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Package-DeprecationManager-0.17/install.json +0 -1
  319. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Sub-Name-0.26/MYMETA.json +0 -1394
  320. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/.meta/Sub-Name-0.26/install.json +0 -1
  321. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/Sub/Name.pm +0 -202
  322. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Sub/Name/.packlist +0 -3
  323. package/Binaries/Perl/MacOs/X64/deps/lib/perl5/darwin-thread-multi-2level/auto/Sub/Name/Name.bundle +0 -0
@@ -0,0 +1,3701 @@
1
+ #vim: set sts=4 sw=4 ts=8 ai:
2
+ #
3
+ # IO::Socket::SSL:
4
+ # provide an interface to SSL connections similar to IO::Socket modules
5
+ #
6
+ # Current Code Shepherd: Steffen Ullrich <sullr at cpan.org>
7
+ # Code Shepherd before: Peter Behroozi, <behrooz at fas.harvard.edu>
8
+ #
9
+ # The original version of this module was written by
10
+ # Marko Asplund, <marko.asplund at kronodoc.fi>, who drew from
11
+ # Crypt::SSLeay (Net::SSL) by Gisle Aas.
12
+ #
13
+
14
+ package IO::Socket::SSL;
15
+
16
+ our $VERSION = '2.081';
17
+
18
+ use IO::Socket;
19
+ use Net::SSLeay 1.46;
20
+ use IO::Socket::SSL::PublicSuffix;
21
+ use Exporter ();
22
+ use Errno qw( EWOULDBLOCK EAGAIN ETIMEDOUT EINTR EPIPE );
23
+ use Carp;
24
+ use strict;
25
+
26
+ my $use_threads;
27
+ BEGIN {
28
+ die "no support for weaken - please install Scalar::Util" if ! do {
29
+ local $SIG{__DIE__};
30
+ eval { require Scalar::Util; Scalar::Util->import("weaken"); 1 }
31
+ || eval { require WeakRef; WeakRef->import("weaken"); 1 }
32
+ };
33
+ require Config;
34
+ $use_threads = $Config::Config{usethreads};
35
+ }
36
+
37
+
38
+ # results from commonly used constant functions from Net::SSLeay for fast access
39
+ my $Net_SSLeay_ERROR_WANT_READ = Net::SSLeay::ERROR_WANT_READ();
40
+ my $Net_SSLeay_ERROR_WANT_WRITE = Net::SSLeay::ERROR_WANT_WRITE();
41
+ my $Net_SSLeay_ERROR_SYSCALL = Net::SSLeay::ERROR_SYSCALL();
42
+ my $Net_SSLeay_ERROR_SSL = Net::SSLeay::ERROR_SSL();
43
+ my $Net_SSLeay_VERIFY_NONE = Net::SSLeay::VERIFY_NONE();
44
+ my $Net_SSLeay_VERIFY_PEER = Net::SSLeay::VERIFY_PEER();
45
+
46
+
47
+ use constant SSL_VERIFY_NONE => &Net::SSLeay::VERIFY_NONE;
48
+ use constant SSL_VERIFY_PEER => &Net::SSLeay::VERIFY_PEER;
49
+ use constant SSL_VERIFY_FAIL_IF_NO_PEER_CERT => Net::SSLeay::VERIFY_FAIL_IF_NO_PEER_CERT();
50
+ use constant SSL_VERIFY_CLIENT_ONCE => Net::SSLeay::VERIFY_CLIENT_ONCE();
51
+
52
+ # from openssl/ssl.h; should be better in Net::SSLeay
53
+ use constant SSL_SENT_SHUTDOWN => 1;
54
+ use constant SSL_RECEIVED_SHUTDOWN => 2;
55
+
56
+ use constant SSL_OCSP_NO_STAPLE => 0b00001;
57
+ use constant SSL_OCSP_MUST_STAPLE => 0b00010;
58
+ use constant SSL_OCSP_FAIL_HARD => 0b00100;
59
+ use constant SSL_OCSP_FULL_CHAIN => 0b01000;
60
+ use constant SSL_OCSP_TRY_STAPLE => 0b10000;
61
+
62
+ # capabilities of underlying Net::SSLeay/openssl
63
+ my $can_client_sni; # do we support SNI on the client side
64
+ my $can_server_sni; # do we support SNI on the server side
65
+ my $can_multi_cert; # RSA and ECC certificate in same context
66
+ my $can_npn; # do we support NPN (obsolete)
67
+ my $can_alpn; # do we support ALPN
68
+ my $can_ecdh; # do we support ECDH key exchange
69
+ my $set_groups_list; # SSL_CTX_set1_groups_list || SSL_CTX_set1_curves_list || undef
70
+ my $can_ocsp; # do we support OCSP
71
+ my $can_ocsp_staple; # do we support OCSP stapling
72
+ my $can_tckt_keycb; # TLS ticket key callback
73
+ my $can_pha; # do we support PHA
74
+ my $session_upref; # SSL_SESSION_up_ref is implemented
75
+ my %sess_cb; # SSL_CTX_sess_set_(new|remove)_cb
76
+ my $check_partial_chain; # use X509_V_FLAG_PARTIAL_CHAIN if available
77
+ my $auto_retry; # (clear|set)_mode SSL_MODE_AUTO_RETRY with OpenSSL 1.1.1+ with non-blocking
78
+ my $ssl_mode_release_buffers = 0; # SSL_MODE_RELEASE_BUFFERS if available
79
+ my $can_ciphersuites; # support for SSL_CTX_set_ciphersuites (TLS 1.3)
80
+
81
+ my $openssl_version;
82
+ my $netssleay_version;
83
+
84
+ BEGIN {
85
+ $openssl_version = Net::SSLeay::OPENSSL_VERSION_NUMBER();
86
+ $netssleay_version = do { no warnings; $Net::SSLeay::VERSION + 0.0; };
87
+ $can_client_sni = $openssl_version >= 0x10000000;
88
+ $can_server_sni = defined &Net::SSLeay::get_servername;
89
+ $can_npn = defined &Net::SSLeay::P_next_proto_negotiated &&
90
+ ! Net::SSLeay::constant("LIBRESSL_VERSION_NUMBER");
91
+ # LibreSSL 2.6.1 disabled NPN by keeping the relevant functions
92
+ # available but removed the actual functionality from these functions.
93
+ $can_alpn = defined &Net::SSLeay::CTX_set_alpn_protos;
94
+ $can_ecdh =
95
+ ($openssl_version >= 0x1010000f) ? 'auto' :
96
+ defined(&Net::SSLeay::CTX_set_ecdh_auto) ? 'can_auto' :
97
+ (defined &Net::SSLeay::CTX_set_tmp_ecdh &&
98
+ # There is a regression with elliptic curves on 1.0.1d with 64bit
99
+ # http://rt.openssl.org/Ticket/Display.html?id=2975
100
+ ( $openssl_version != 0x1000104f
101
+ || length(pack("P",0)) == 4 )) ? 'tmp_ecdh' :
102
+ '';
103
+ $set_groups_list =
104
+ defined &Net::SSLeay::CTX_set1_groups_list ? \&Net::SSLeay::CTX_set1_groups_list :
105
+ defined &Net::SSLeay::CTX_set1_curves_list ? \&Net::SSLeay::CTX_set1_curves_list :
106
+ undef;
107
+ $can_multi_cert = $can_ecdh
108
+ && $openssl_version >= 0x10002000;
109
+ $can_ocsp = defined &Net::SSLeay::OCSP_cert2ids
110
+ # OCSP got broken in 1.75..1.77
111
+ && ($netssleay_version < 1.75 || $netssleay_version > 1.77);
112
+ $can_ocsp_staple = $can_ocsp
113
+ && defined &Net::SSLeay::set_tlsext_status_type;
114
+ $can_tckt_keycb = defined &Net::SSLeay::CTX_set_tlsext_ticket_getkey_cb
115
+ && $netssleay_version >= 1.80;
116
+ $can_pha = defined &Net::SSLeay::CTX_set_post_handshake_auth;
117
+ $can_ciphersuites = defined &Net::SSLeay::CTX_set_ciphersuites;
118
+
119
+ if (defined &Net::SSLeay::SESSION_up_ref) {
120
+ $session_upref = 1;
121
+ }
122
+
123
+ if ($session_upref
124
+ && defined &Net::SSLeay::CTX_sess_set_new_cb
125
+ && defined &Net::SSLeay::CTX_sess_set_remove_cb) {
126
+ %sess_cb = (
127
+ new => \&Net::SSLeay::CTX_sess_set_new_cb,
128
+ remove => \&Net::SSLeay::CTX_sess_set_remove_cb,
129
+ );
130
+ }
131
+
132
+ if (my $c = defined &Net::SSLeay::CTX_get0_param
133
+ && eval { Net::SSLeay::X509_V_FLAG_PARTIAL_CHAIN() }) {
134
+ $check_partial_chain = sub {
135
+ my $ctx = shift;
136
+ my $param = Net::SSLeay::CTX_get0_param($ctx);
137
+ Net::SSLeay::X509_VERIFY_PARAM_set_flags($param, $c);
138
+ };
139
+ }
140
+
141
+ if (!defined &Net::SSLeay::clear_mode) {
142
+ # assume SSL_CTRL_CLEAR_MODE being 78 since it was always this way
143
+ *Net::SSLeay::clear_mode = sub {
144
+ my ($ctx,$opt) = @_;
145
+ Net::SSLeay::ctrl($ctx,78,$opt,0);
146
+ };
147
+ }
148
+
149
+ if ($openssl_version >= 0x10101000) {
150
+ # openssl 1.1.1 enabled SSL_MODE_AUTO_RETRY by default, which is bad for
151
+ # non-blocking sockets
152
+ my $mode_auto_retry =
153
+ # was always 0x00000004
154
+ eval { Net::SSLeay::MODE_AUTO_RETRY() } || 0x00000004;
155
+ $auto_retry = sub {
156
+ my ($ssl,$on) = @_;
157
+ if ($on) {
158
+ Net::SSLeay::set_mode($ssl, $mode_auto_retry);
159
+ } else {
160
+ Net::SSLeay::clear_mode($ssl, $mode_auto_retry);
161
+ }
162
+ }
163
+ }
164
+ if ($openssl_version >= 0x10000000) {
165
+ # ssl/ssl.h:#define SSL_MODE_RELEASE_BUFFERS 0x00000010L
166
+ $ssl_mode_release_buffers = 0x00000010;
167
+ }
168
+ }
169
+
170
+ my $algo2digest = do {
171
+ my %digest;
172
+ sub {
173
+ my $digest_name = shift;
174
+ return $digest{$digest_name} ||= do {
175
+ Net::SSLeay::SSLeay_add_ssl_algorithms();
176
+ Net::SSLeay::EVP_get_digestbyname($digest_name)
177
+ or die "Digest algorithm $digest_name is not available";
178
+ };
179
+ }
180
+ };
181
+
182
+ my $CTX_tlsv1_3_new;
183
+ if ( defined &Net::SSLeay::CTX_set_min_proto_version
184
+ and defined &Net::SSLeay::CTX_set_max_proto_version
185
+ and my $tls13 = eval { Net::SSLeay::TLS1_3_VERSION() }
186
+ ) {
187
+ $CTX_tlsv1_3_new = sub {
188
+ my $ctx = Net::SSLeay::CTX_new();
189
+ return $ctx if Net::SSLeay::CTX_set_min_proto_version($ctx,$tls13)
190
+ && Net::SSLeay::CTX_set_max_proto_version($ctx,$tls13);
191
+ Net::SSLeay::CTX_free($ctx);
192
+ return;
193
+ };
194
+ }
195
+
196
+ # global defaults
197
+ my %DEFAULT_SSL_ARGS = (
198
+ SSL_check_crl => 0,
199
+ SSL_version => 'SSLv23:!SSLv3:!SSLv2', # consider both SSL3.0 and SSL2.0 as broken
200
+ SSL_verify_callback => undef,
201
+ SSL_verifycn_scheme => undef, # fallback cn verification
202
+ SSL_verifycn_publicsuffix => undef, # fallback default list verification
203
+ #SSL_verifycn_name => undef, # use from PeerAddr/PeerHost - do not override in set_args_filter_hack 'use_defaults'
204
+ SSL_npn_protocols => undef, # meaning depends whether on server or client side
205
+ SSL_alpn_protocols => undef, # list of protocols we'll accept/send, for example ['http/1.1','spdy/3.1']
206
+
207
+ # rely on system default but be sure to disable some definitely bad ones
208
+ SSL_cipher_list => 'DEFAULT !EXP !MEDIUM !LOW !eNULL !aNULL !RC4 !DES !MD5 !PSK !SRP',
209
+ );
210
+
211
+ my %DEFAULT_SSL_CLIENT_ARGS = (
212
+ %DEFAULT_SSL_ARGS,
213
+ SSL_verify_mode => SSL_VERIFY_PEER,
214
+
215
+ SSL_ca_file => undef,
216
+ SSL_ca_path => undef,
217
+ );
218
+
219
+ # set values inside _init to work with perlcc, RT#95452
220
+ my %DEFAULT_SSL_SERVER_ARGS;
221
+
222
+ # Initialization of OpenSSL internals
223
+ # This will be called once during compilation - perlcc users might need to
224
+ # call it again by hand, see RT#95452
225
+ {
226
+ sub init {
227
+ # library_init returns false if the library was already initialized.
228
+ # This way we can find out if the library needs to be re-initialized
229
+ # inside code compiled with perlcc
230
+ Net::SSLeay::library_init() or return;
231
+
232
+ Net::SSLeay::load_error_strings();
233
+ Net::SSLeay::OpenSSL_add_all_digests();
234
+ Net::SSLeay::randomize();
235
+
236
+ %DEFAULT_SSL_SERVER_ARGS = (
237
+ %DEFAULT_SSL_ARGS,
238
+ SSL_verify_mode => SSL_VERIFY_NONE,
239
+ SSL_honor_cipher_order => 1, # trust server to know the best cipher
240
+ SSL_dh => do {
241
+ my $bio = Net::SSLeay::BIO_new(Net::SSLeay::BIO_s_mem());
242
+ # generated with: openssl dhparam 2048
243
+ Net::SSLeay::BIO_write($bio,<<'DH');
244
+ -----BEGIN DH PARAMETERS-----
245
+ MIIBCAKCAQEAr8wskArj5+1VCVsnWt/RUR7tXkHJ7mGW7XxrLSPOaFyKyWf8lZht
246
+ iSY2Lc4oa4Zw8wibGQ3faeQu/s8fvPq/aqTxYmyHPKCMoze77QJHtrYtJAosB9SY
247
+ CN7s5Hexxb5/vQ4qlQuOkVrZDiZO9GC4KaH9mJYnCoAsXDhDft6JT0oRVSgtZQnU
248
+ gWFKShIm+JVjN94kGs0TcBEesPTK2g8XVHK9H8AtSUb9BwW2qD/T5RmgNABysApO
249
+ Ps2vlkxjAHjJcqc3O+OiImKik/X2rtBTZjpKmzN3WWTB0RJZCOWaLlDO81D01o1E
250
+ aZecz3Np9KIYey900f+X7zC2bJxEHp95ywIBAg==
251
+ -----END DH PARAMETERS-----
252
+ DH
253
+ my $dh = Net::SSLeay::PEM_read_bio_DHparams($bio);
254
+ Net::SSLeay::BIO_free($bio);
255
+ $dh or die "no DH";
256
+ $dh;
257
+ },
258
+ (
259
+ $can_ecdh eq 'auto' ? () : # automatically enabled by openssl
260
+ $can_ecdh eq 'can_auto' ? (SSL_ecdh_curve => 'auto') :
261
+ $can_ecdh eq 'tmp_ecdh' ? ( SSL_ecdh_curve => 'prime256v1' ) :
262
+ (),
263
+ )
264
+ );
265
+ }
266
+ # Call it once at compile time and try it at INIT.
267
+ # This should catch all cases of including the module, e.g. 'use' (INIT) or
268
+ # 'require' (compile time) and works also with perlcc
269
+ {
270
+ no warnings;
271
+ INIT { init() }
272
+ init();
273
+ }
274
+ }
275
+
276
+ # global defaults which can be changed using set_defaults
277
+ # either key/value can be set or it can just be set to an external hash
278
+ my $GLOBAL_SSL_ARGS = {};
279
+ my $GLOBAL_SSL_CLIENT_ARGS = {};
280
+ my $GLOBAL_SSL_SERVER_ARGS = {};
281
+
282
+ # hack which is used to filter bad settings from used modules
283
+ my $FILTER_SSL_ARGS = undef;
284
+
285
+ # non-XS Versions of Scalar::Util will fail
286
+ BEGIN{
287
+ die "You need the XS Version of Scalar::Util for dualvar() support" if !do {
288
+ local $SIG{__DIE__}; local $SIG{__WARN__}; # be silent
289
+ eval { use Scalar::Util 'dualvar'; dualvar(0,''); 1 };
290
+ };
291
+ }
292
+
293
+ # get constants for SSL_OP_NO_* now, instead calling the related functions
294
+ # every time we setup a connection
295
+ my %SSL_OP_NO;
296
+ for(qw( SSLv2 SSLv3 TLSv1 TLSv1_1 TLSv11:TLSv1_1 TLSv1_2 TLSv12:TLSv1_2
297
+ TLSv1_3 TLSv13:TLSv1_3 )) {
298
+ my ($k,$op) = m{:} ? split(m{:},$_,2) : ($_,$_);
299
+ my $sub = "Net::SSLeay::OP_NO_$op";
300
+ local $SIG{__DIE__};
301
+ $SSL_OP_NO{$k} = eval { no strict 'refs'; &$sub } || 0;
302
+ }
303
+
304
+ # Make SSL_CTX_clear_options accessible through SSL_CTX_ctrl unless it is
305
+ # already implemented in Net::SSLeay
306
+ if (!defined &Net::SSLeay::CTX_clear_options) {
307
+ *Net::SSLeay::CTX_clear_options = sub {
308
+ my ($ctx,$opt) = @_;
309
+ # 77 = SSL_CTRL_CLEAR_OPTIONS
310
+ Net::SSLeay::CTX_ctrl($ctx,77,$opt,0);
311
+ };
312
+ }
313
+
314
+ # Try to work around problems with alternative trust path by default, RT#104759
315
+ my $DEFAULT_X509_STORE_flags = 0;
316
+ {
317
+ local $SIG{__DIE__};
318
+ eval { $DEFAULT_X509_STORE_flags |= Net::SSLeay::X509_V_FLAG_TRUSTED_FIRST() };
319
+ }
320
+
321
+ our $DEBUG;
322
+ use vars qw(@ISA $SSL_ERROR @EXPORT);
323
+
324
+ {
325
+ # These constants will be used in $! at return from SSL_connect,
326
+ # SSL_accept, _generic_(read|write), thus notifying the caller
327
+ # the usual way of problems. Like with EWOULDBLOCK, EINPROGRESS..
328
+ # these are especially important for non-blocking sockets
329
+
330
+ my $x = $Net_SSLeay_ERROR_WANT_READ;
331
+ use constant SSL_WANT_READ => dualvar( \$x, 'SSL wants a read first' );
332
+ my $y = $Net_SSLeay_ERROR_WANT_WRITE;
333
+ use constant SSL_WANT_WRITE => dualvar( \$y, 'SSL wants a write first' );
334
+
335
+ @EXPORT = qw(
336
+ SSL_WANT_READ SSL_WANT_WRITE SSL_VERIFY_NONE SSL_VERIFY_PEER
337
+ SSL_VERIFY_FAIL_IF_NO_PEER_CERT SSL_VERIFY_CLIENT_ONCE
338
+ SSL_OCSP_NO_STAPLE SSL_OCSP_TRY_STAPLE SSL_OCSP_MUST_STAPLE
339
+ SSL_OCSP_FAIL_HARD SSL_OCSP_FULL_CHAIN
340
+ $SSL_ERROR GEN_DNS GEN_IPADD
341
+ );
342
+ }
343
+
344
+ my @caller_force_inet4; # in case inet4 gets forced we store here who forced it
345
+
346
+ my $IOCLASS;
347
+ my $family_key; # 'Domain'||'Family'
348
+ BEGIN {
349
+ # declare @ISA depending of the installed socket class
350
+
351
+ # try to load inet_pton from Socket or Socket6 and make sure it is usable
352
+ local $SIG{__DIE__}; local $SIG{__WARN__}; # be silent
353
+ my $ip6 = eval {
354
+ require Socket;
355
+ Socket->VERSION(1.95);
356
+ Socket::inet_pton( AF_INET6(),'::1') && AF_INET6() or die;
357
+ Socket->import( qw/inet_pton NI_NUMERICHOST NI_NUMERICSERV/ );
358
+ # behavior different to Socket6::getnameinfo - wrap
359
+ *_getnameinfo = sub {
360
+ my ($err,$host,$port) = Socket::getnameinfo(@_) or return;
361
+ return if $err;
362
+ return ($host,$port);
363
+ };
364
+ 'Socket';
365
+ } || eval {
366
+ require Socket6;
367
+ Socket6::inet_pton( AF_INET6(),'::1') && AF_INET6() or die;
368
+ Socket6->import( qw/inet_pton NI_NUMERICHOST NI_NUMERICSERV/ );
369
+ # behavior different to Socket::getnameinfo - wrap
370
+ *_getnameinfo = sub { return Socket6::getnameinfo(@_); };
371
+ 'Socket6';
372
+ } || undef;
373
+
374
+ # try IO::Socket::IP or IO::Socket::INET6 for IPv6 support
375
+ $family_key = 'Domain'; # traditional
376
+ if ($ip6) {
377
+ # if we have IO::Socket::IP >= 0.31 we will use this in preference
378
+ # because it can handle both IPv4 and IPv6
379
+ if ( eval {
380
+ require IO::Socket::IP;
381
+ IO::Socket::IP->VERSION(0.31)
382
+ }) {
383
+ @ISA = qw(IO::Socket::IP);
384
+ constant->import( CAN_IPV6 => "IO::Socket::IP" );
385
+ $family_key = 'Family';
386
+ $IOCLASS = "IO::Socket::IP";
387
+
388
+ # if we have IO::Socket::INET6 we will use this not IO::Socket::INET
389
+ # because it can handle both IPv4 and IPv6
390
+ # require at least 2.62 because of several problems before that version
391
+ } elsif( eval { require IO::Socket::INET6; IO::Socket::INET6->VERSION(2.62) } ) {
392
+ @ISA = qw(IO::Socket::INET6);
393
+ constant->import( CAN_IPV6 => "IO::Socket::INET6" );
394
+ $IOCLASS = "IO::Socket::INET6";
395
+ } else {
396
+ $ip6 = ''
397
+ }
398
+ }
399
+
400
+ # fall back to IO::Socket::INET for IPv4 only
401
+ if (!$ip6) {
402
+ @ISA = qw(IO::Socket::INET);
403
+ $IOCLASS = "IO::Socket::INET";
404
+ constant->import(CAN_IPV6 => '');
405
+ if (!defined $ip6) {
406
+ constant->import(NI_NUMERICHOST => 1);
407
+ constant->import(NI_NUMERICSERV => 2);
408
+ }
409
+ }
410
+
411
+ #Make $DEBUG another name for $Net::SSLeay::trace
412
+ *DEBUG = \$Net::SSLeay::trace;
413
+
414
+ #Compatibility
415
+ *ERROR = \$SSL_ERROR;
416
+ }
417
+
418
+
419
+ sub DEBUG {
420
+ $DEBUG or return;
421
+ my (undef,$file,$line,$sub) = caller(1);
422
+ if ($sub =~m{^IO::Socket::SSL::(?:error|(_internal_error))$}) {
423
+ (undef,$file,$line) = caller(2) if $1;
424
+ } else {
425
+ (undef,$file,$line) = caller;
426
+ }
427
+ my $msg = shift;
428
+ $file = '...'.substr( $file,-17 ) if length($file)>20;
429
+ $msg = sprintf $msg,@_ if @_;
430
+ print STDERR "DEBUG: $file:$line: $msg\n";
431
+ }
432
+
433
+ BEGIN {
434
+ # import some constants from Net::SSLeay or use hard-coded defaults
435
+ # if Net::SSLeay isn't recent enough to provide the constants
436
+ my %const = (
437
+ NID_CommonName => 13,
438
+ GEN_DNS => 2,
439
+ GEN_IPADD => 7,
440
+ );
441
+ while ( my ($name,$value) = each %const ) {
442
+ no strict 'refs';
443
+ *{$name} = UNIVERSAL::can( 'Net::SSLeay', $name ) || sub { $value };
444
+ }
445
+
446
+ *idn_to_ascii = \&IO::Socket::SSL::PublicSuffix::idn_to_ascii;
447
+ *idn_to_unicode = \&IO::Socket::SSL::PublicSuffix::idn_to_unicode;
448
+ }
449
+
450
+ my $OPENSSL_LIST_SEPARATOR = $^O =~m{^(?:(dos|os2|mswin32|netware)|vms)$}i
451
+ ? $1 ? ';' : ',' : ':';
452
+ my $CHECK_SSL_PATH = sub {
453
+ my %args = (@_ == 1) ? ('',@_) : @_;
454
+ for my $type (keys %args) {
455
+ my $path = $args{$type};
456
+ if (!$type) {
457
+ delete $args{$type};
458
+ $type = (ref($path) || -d $path) ? 'SSL_ca_path' : 'SSL_ca_file';
459
+ $args{$type} = $path;
460
+ }
461
+
462
+ next if ref($path) eq 'SCALAR' && ! $$path;
463
+ if ($type eq 'SSL_ca_file') {
464
+ die "SSL_ca_file $path can't be used: $!"
465
+ if ! open(my $fh,'<',$path);
466
+ } elsif ($type eq 'SSL_ca_path') {
467
+ $path = [ split($OPENSSL_LIST_SEPARATOR,$path) ] if !ref($path);
468
+ my @err;
469
+ for my $d (ref($path) ? @$path : $path) {
470
+ if (! -d $d) {
471
+ push @err, "SSL_ca_path $d does not exist";
472
+ } elsif (! opendir(my $dh,$d)) {
473
+ push @err, "SSL_ca_path $d is not accessible: $!"
474
+ } else {
475
+ @err = ();
476
+ last
477
+ }
478
+ }
479
+ die "@err" if @err;
480
+ }
481
+ }
482
+ return %args;
483
+ };
484
+
485
+
486
+ {
487
+ my %default_ca;
488
+ my $ca_detected; # 0: never detect, undef: need to (re)detect
489
+ my $openssldir;
490
+
491
+ sub default_ca {
492
+ if (@_) {
493
+ # user defined default CA or reset
494
+ if ( @_ > 1 ) {
495
+ %default_ca = @_;
496
+ $ca_detected = 0;
497
+ } elsif ( my $path = shift ) {
498
+ %default_ca = $CHECK_SSL_PATH->($path);
499
+ $ca_detected = 0;
500
+ } else {
501
+ $ca_detected = undef;
502
+ }
503
+ }
504
+ return %default_ca if defined $ca_detected;
505
+
506
+ # SSLEAY_DIR was 5 up to OpenSSL 1.1, then switched to 4 and got
507
+ # renamed to OPENSSL_DIR. Unfortunately it is not exported as constant
508
+ # by Net::SSLeay so we use the fixed number.
509
+ $openssldir ||=
510
+ Net::SSLeay::SSLeay_version(5) =~m{^OPENSSLDIR: "(.+)"$} ? $1 :
511
+ Net::SSLeay::SSLeay_version(4) =~m{^OPENSSLDIR: "(.+)"$} ? $1 :
512
+ 'cannot-determine-openssldir-from-ssleay-version';
513
+
514
+ # (re)detect according to openssl crypto/cryptlib.h
515
+ my $dir = $ENV{SSL_CERT_DIR}
516
+ || ( $^O =~m{vms}i ? "SSLCERTS:":"$openssldir/certs" );
517
+ if ( opendir(my $dh,$dir)) {
518
+ FILES: for my $f ( grep { m{^[a-f\d]{8}(\.\d+)?$} } readdir($dh) ) {
519
+ open( my $fh,'<',"$dir/$f") or next;
520
+ while (my $line = <$fh>) {
521
+ $line =~m{^-+BEGIN (X509 |TRUSTED |)CERTIFICATE-} or next;
522
+ $default_ca{SSL_ca_path} = $dir;
523
+ last FILES;
524
+ }
525
+ }
526
+ }
527
+ my $file = $ENV{SSL_CERT_FILE}
528
+ || ( $^O =~m{vms}i ? "SSLCERTS:cert.pem":"$openssldir/cert.pem" );
529
+ if ( open(my $fh,'<',$file)) {
530
+ while (my $line = <$fh>) {
531
+ $line =~m{^-+BEGIN (X509 |TRUSTED |)CERTIFICATE-} or next;
532
+ $default_ca{SSL_ca_file} = $file;
533
+ last;
534
+ }
535
+ }
536
+
537
+ $default_ca{SSL_ca_file} = Mozilla::CA::SSL_ca_file() if ! %default_ca && do {
538
+ local $SIG{__DIE__};
539
+ eval { require Mozilla::CA; 1 };
540
+ };
541
+
542
+ $ca_detected = 1;
543
+ return %default_ca;
544
+ }
545
+ }
546
+
547
+
548
+ # Export some stuff
549
+ # inet4|inet6|debug will be handled by myself, everything
550
+ # else will be handled the Exporter way
551
+ sub import {
552
+ my $class = shift;
553
+
554
+ my @export;
555
+ foreach (@_) {
556
+ if ( /^inet4$/i ) {
557
+ # explicitly fall back to inet4
558
+ @ISA = 'IO::Socket::INET';
559
+ @caller_force_inet4 = caller(); # save for warnings for 'inet6' case
560
+ } elsif ( /^inet6$/i ) {
561
+ # check if we have already ipv6 as base
562
+ if ( ! UNIVERSAL::isa( $class, 'IO::Socket::INET6')
563
+ and ! UNIVERSAL::isa( $class, 'IO::Socket::IP' )) {
564
+ # either we don't support it or we disabled it by explicitly
565
+ # loading it with 'inet4'. In this case re-enable but warn
566
+ # because this is probably an error
567
+ if ( CAN_IPV6 ) {
568
+ @ISA = ( CAN_IPV6 );
569
+ warn "IPv6 support re-enabled in __PACKAGE__, got disabled in file $caller_force_inet4[1] line $caller_force_inet4[2]";
570
+ } else {
571
+ die "INET6 is not supported, install IO::Socket::IP";
572
+ }
573
+ }
574
+ } elsif ( /^:?debug(\d+)/ ) {
575
+ $DEBUG=$1;
576
+ } else {
577
+ push @export,$_
578
+ }
579
+ }
580
+
581
+ @_ = ( $class,@export );
582
+ goto &Exporter::import;
583
+ }
584
+
585
+ my %SSL_OBJECT;
586
+ my %CREATED_IN_THIS_THREAD;
587
+ sub CLONE { %CREATED_IN_THIS_THREAD = (); }
588
+
589
+ # all keys used internally, these should be cleaned up at end
590
+ my @all_my_keys = qw(
591
+ _SSL_arguments
592
+ _SSL_certificate
593
+ _SSL_ctx
594
+ _SSL_fileno
595
+ _SSL_in_DESTROY
596
+ _SSL_ioclass_downgrade
597
+ _SSL_ioclass_upgraded
598
+ _SSL_last_err
599
+ _SSL_object
600
+ _SSL_ocsp_verify
601
+ _SSL_opened
602
+ _SSL_opening
603
+ _SSL_servername
604
+ _SSL_msg_callback
605
+ );
606
+
607
+
608
+ # we have callbacks associated with contexts, but have no way to access the
609
+ # current SSL object from these callbacks. To work around this
610
+ # CURRENT_SSL_OBJECT will be set before calling Net::SSLeay::{connect,accept}
611
+ # and reset afterwards, so we have access to it inside _internal_error.
612
+ my $CURRENT_SSL_OBJECT;
613
+
614
+ # You might be expecting to find a new() subroutine here, but that is
615
+ # not how IO::Socket::INET works. All configuration gets performed in
616
+ # the calls to configure() and either connect() or accept().
617
+
618
+ #Call to configure occurs when a new socket is made using
619
+ #IO::Socket::INET. Returns false (empty list) on failure.
620
+ sub configure {
621
+ my ($self, $arg_hash) = @_;
622
+ return _invalid_object() unless($self);
623
+
624
+ # force initial blocking
625
+ # otherwise IO::Socket::SSL->new might return undef if the
626
+ # socket is nonblocking and it fails to connect immediately
627
+ # for real nonblocking behavior one should create a nonblocking
628
+ # socket and later call connect explicitly
629
+ my $blocking = delete $arg_hash->{Blocking};
630
+
631
+ # because Net::HTTPS simple redefines blocking() to {} (e.g.
632
+ # return undef) and IO::Socket::INET does not like this we
633
+ # set Blocking only explicitly if it was set
634
+ $arg_hash->{Blocking} = 1 if defined ($blocking);
635
+
636
+ $self->configure_SSL($arg_hash) || return;
637
+
638
+ if ($arg_hash->{$family_key} ||= $arg_hash->{Domain} || $arg_hash->{Family}) {
639
+ # Hack to work around the problem that IO::Socket::IP defaults to
640
+ # AI_ADDRCONFIG which creates problems if we have only the loopback
641
+ # interface. If we already know the family this flag is more harmful
642
+ # then useful.
643
+ $arg_hash->{GetAddrInfoFlags} = 0 if $IOCLASS eq 'IO::Socket::IP'
644
+ && ! defined $arg_hash->{GetAddrInfoFlags};
645
+ }
646
+ return $self->_internal_error("@ISA configuration failed",0)
647
+ if ! $self->SUPER::configure($arg_hash);
648
+
649
+ $self->blocking(0) if defined $blocking && !$blocking;
650
+ return $self;
651
+ }
652
+
653
+ sub configure_SSL {
654
+ my ($self, $arg_hash) = @_;
655
+
656
+ $arg_hash->{Proto} ||= 'tcp';
657
+ my $is_server = $arg_hash->{SSL_server};
658
+ if ( ! defined $is_server ) {
659
+ $is_server = $arg_hash->{SSL_server} = $arg_hash->{Listen} || 0;
660
+ }
661
+
662
+ # add user defined defaults, maybe after filtering
663
+ $FILTER_SSL_ARGS->($is_server,$arg_hash) if $FILTER_SSL_ARGS;
664
+
665
+ delete @{*$self}{@all_my_keys};
666
+ ${*$self}{_SSL_opened} = $is_server;
667
+ ${*$self}{_SSL_arguments} = $arg_hash;
668
+
669
+ # this adds defaults to $arg_hash as a side effect!
670
+ ${*$self}{'_SSL_ctx'} = IO::Socket::SSL::SSL_Context->new($arg_hash)
671
+ or return;
672
+
673
+ return $self;
674
+ }
675
+
676
+
677
+ sub _skip_rw_error {
678
+ my ($self,$ssl,$rv) = @_;
679
+ my $err = Net::SSLeay::get_error($ssl,$rv);
680
+ if ( $err == $Net_SSLeay_ERROR_WANT_READ) {
681
+ $SSL_ERROR = SSL_WANT_READ;
682
+ } elsif ( $err == $Net_SSLeay_ERROR_WANT_WRITE) {
683
+ $SSL_ERROR = SSL_WANT_WRITE;
684
+ } else {
685
+ return $err;
686
+ }
687
+ $! ||= EWOULDBLOCK;
688
+ ${*$self}{_SSL_last_err} = [$SSL_ERROR,4] if ref($self);
689
+ Net::SSLeay::ERR_clear_error();
690
+ return 0;
691
+ }
692
+
693
+
694
+ # Call to connect occurs when a new client socket is made using IO::Socket::*
695
+ sub connect {
696
+ my $self = shift || return _invalid_object();
697
+ return $self if ${*$self}{'_SSL_opened'}; # already connected
698
+
699
+ if ( ! ${*$self}{'_SSL_opening'} ) {
700
+ # call SUPER::connect if the underlying socket is not connected
701
+ # if this fails this might not be an error (e.g. if $! = EINPROGRESS
702
+ # and socket is nonblocking this is normal), so keep any error
703
+ # handling to the client
704
+ $DEBUG>=2 && DEBUG('socket not yet connected' );
705
+ $self->SUPER::connect(@_) || return;
706
+ $DEBUG>=2 && DEBUG('socket connected' );
707
+
708
+ # IO::Socket works around systems, which return EISCONN or similar
709
+ # on non-blocking re-connect by returning true, even if $! is set
710
+ # but it does not clear $!, so do it here
711
+ $! = undef;
712
+
713
+ # don't continue with connect_SSL if SSL_startHandshake is set to 0
714
+ my $sh = ${*$self}{_SSL_arguments}{SSL_startHandshake};
715
+ return $self if defined $sh && ! $sh;
716
+ }
717
+ return $self->connect_SSL;
718
+ }
719
+
720
+
721
+ sub connect_SSL {
722
+ my $self = shift;
723
+ my $args = @_>1 ? {@_}: $_[0]||{};
724
+ return $self if ${*$self}{'_SSL_opened'}; # already connected
725
+
726
+ my ($ssl,$ctx);
727
+ if ( ! ${*$self}{'_SSL_opening'} ) {
728
+ # start ssl connection
729
+ $DEBUG>=2 && DEBUG('ssl handshake not started' );
730
+ ${*$self}{'_SSL_opening'} = 1;
731
+ my $arg_hash = ${*$self}{'_SSL_arguments'};
732
+
733
+ my $fileno = ${*$self}{'_SSL_fileno'} = fileno($self);
734
+ return $self->_internal_error("Socket has no fileno",9)
735
+ if ! defined $fileno;
736
+
737
+ $ctx = ${*$self}{'_SSL_ctx'}; # Reference to real context
738
+ $ssl = ${*$self}{'_SSL_object'} = Net::SSLeay::new($ctx->{context})
739
+ || return $self->error("SSL structure creation failed");
740
+ $CREATED_IN_THIS_THREAD{$ssl} = 1 if $use_threads;
741
+ $SSL_OBJECT{$ssl} = [$self,0];
742
+ weaken($SSL_OBJECT{$ssl}[0]);
743
+
744
+ if ($ctx->{session_cache}) {
745
+ $arg_hash->{SSL_session_key} ||= do {
746
+ my $host = $arg_hash->{PeerAddr} || $arg_hash->{PeerHost}
747
+ || $self->_update_peer;
748
+ my $port = $arg_hash->{PeerPort} || $arg_hash->{PeerService};
749
+ $port ? "$host:$port" : $host;
750
+ }
751
+ }
752
+
753
+ Net::SSLeay::set_fd($ssl, $fileno)
754
+ || return $self->error("SSL filehandle association failed");
755
+
756
+ set_msg_callback($self) if $DEBUG>=2 || ${*$self}{_SSL_msg_callback};
757
+
758
+ if ( $can_client_sni ) {
759
+ my $host;
760
+ if ( exists $arg_hash->{SSL_hostname} ) {
761
+ # explicitly given
762
+ # can be set to undef/'' to not use extension
763
+ $host = $arg_hash->{SSL_hostname}
764
+ } elsif ( $host = $arg_hash->{PeerAddr} || $arg_hash->{PeerHost} ) {
765
+ # implicitly given
766
+ $host =~s{:[a-zA-Z0-9_\-]+$}{};
767
+ # should be hostname, not IPv4/6
768
+ $host = undef if $host !~m{[a-z_]}i or $host =~m{:};
769
+ }
770
+ # define SSL_CTRL_SET_TLSEXT_HOSTNAME 55
771
+ # define TLSEXT_NAMETYPE_host_name 0
772
+ if ($host) {
773
+ $DEBUG>=2 && DEBUG("using SNI with hostname $host");
774
+ Net::SSLeay::ctrl($ssl,55,0,$host);
775
+ } else {
776
+ $DEBUG>=2 && DEBUG("not using SNI because hostname is unknown");
777
+ }
778
+ } elsif ( $arg_hash->{SSL_hostname} ) {
779
+ return $self->_internal_error(
780
+ "Client side SNI not supported for this openssl",9);
781
+ } else {
782
+ $DEBUG>=2 && DEBUG("not using SNI because openssl is too old");
783
+ }
784
+
785
+ $arg_hash->{PeerAddr} || $arg_hash->{PeerHost} || $self->_update_peer;
786
+ if ( $ctx->{verify_name_ref} ) {
787
+ # need target name for update
788
+ my $host = $arg_hash->{SSL_verifycn_name}
789
+ || $arg_hash->{SSL_hostname};
790
+ if ( ! defined $host ) {
791
+ if ( $host = $arg_hash->{PeerAddr} || $arg_hash->{PeerHost} ) {
792
+ $host =~s{^
793
+ (?:
794
+ ([^:\[]+) | # ipv4|host
795
+ (\[(.*)\]) # [ipv6|host]
796
+ )
797
+ (:[\w\-]+)? # optional :port
798
+ $}{$1$2}x; # ipv4|host|ipv6
799
+ }
800
+ }
801
+ ${$ctx->{verify_name_ref}} = $host;
802
+ }
803
+
804
+ my $ocsp = $ctx->{ocsp_mode};
805
+ if ( $ocsp & SSL_OCSP_NO_STAPLE ) {
806
+ # don't try stapling
807
+ } elsif ( ! $can_ocsp_staple ) {
808
+ croak("OCSP stapling not support") if $ocsp & SSL_OCSP_MUST_STAPLE;
809
+ } elsif ( $ocsp & (SSL_OCSP_TRY_STAPLE|SSL_OCSP_MUST_STAPLE)) {
810
+ # staple by default if verification enabled
811
+ ${*$self}{_SSL_ocsp_verify} = undef;
812
+ Net::SSLeay::set_tlsext_status_type($ssl,
813
+ Net::SSLeay::TLSEXT_STATUSTYPE_ocsp());
814
+ $DEBUG>=2 && DEBUG("request OCSP stapling");
815
+ }
816
+
817
+ if ($ctx->{session_cache} and my $session =
818
+ $ctx->{session_cache}->get_session($arg_hash->{SSL_session_key})
819
+ ) {
820
+ Net::SSLeay::set_session($ssl, $session);
821
+ }
822
+ }
823
+
824
+ $ssl ||= ${*$self}{'_SSL_object'};
825
+
826
+ $SSL_ERROR = $! = undef;
827
+ my $timeout = exists $args->{Timeout}
828
+ ? $args->{Timeout}
829
+ : ${*$self}{io_socket_timeout}; # from IO::Socket
830
+ if ( defined($timeout) && $timeout>0 && $self->blocking(0) ) {
831
+ $DEBUG>=2 && DEBUG( "set socket to non-blocking to enforce timeout=$timeout" );
832
+ # timeout was given and socket was blocking
833
+ # enforce timeout with now non-blocking socket
834
+ } else {
835
+ # timeout does not apply because invalid or socket non-blocking
836
+ $timeout = undef;
837
+ $auto_retry && $auto_retry->($ssl,$self->blocking);
838
+ }
839
+
840
+ my $start = defined($timeout) && time();
841
+ {
842
+ $SSL_ERROR = undef;
843
+ $CURRENT_SSL_OBJECT = $self;
844
+ $DEBUG>=3 && DEBUG("call Net::SSLeay::connect" );
845
+ my $rv = Net::SSLeay::connect($ssl);
846
+ $CURRENT_SSL_OBJECT = undef;
847
+ $DEBUG>=3 && DEBUG("done Net::SSLeay::connect -> $rv" );
848
+ if ( $rv < 0 ) {
849
+ if ( my $err = $self->_skip_rw_error( $ssl,$rv )) {
850
+ $self->error("SSL connect attempt failed");
851
+ delete ${*$self}{'_SSL_opening'};
852
+ ${*$self}{'_SSL_opened'} = -1;
853
+ $DEBUG>=1 && DEBUG( "fatal SSL error: $SSL_ERROR" );
854
+ return $self->fatal_ssl_error();
855
+ }
856
+
857
+ $DEBUG>=2 && DEBUG('ssl handshake in progress' );
858
+ # connect failed because handshake needs to be completed
859
+ # if socket was non-blocking or no timeout was given return with this error
860
+ return if ! defined($timeout);
861
+
862
+ # wait until socket is readable or writable
863
+ my $rv;
864
+ if ( $timeout>0 ) {
865
+ my $vec = '';
866
+ vec($vec,$self->fileno,1) = 1;
867
+ $DEBUG>=2 && DEBUG( "waiting for fd to become ready: $SSL_ERROR" );
868
+ $rv =
869
+ $SSL_ERROR == SSL_WANT_READ ? select( $vec,undef,undef,$timeout) :
870
+ $SSL_ERROR == SSL_WANT_WRITE ? select( undef,$vec,undef,$timeout) :
871
+ undef;
872
+ } else {
873
+ $DEBUG>=2 && DEBUG("handshake failed because no more time" );
874
+ $! = ETIMEDOUT
875
+ }
876
+ if ( ! $rv ) {
877
+ $DEBUG>=2 && DEBUG("handshake failed because socket did not became ready" );
878
+ # failed because of timeout, return
879
+ $! ||= ETIMEDOUT;
880
+ delete ${*$self}{'_SSL_opening'};
881
+ ${*$self}{'_SSL_opened'} = -1;
882
+ $self->blocking(1); # was blocking before
883
+ return
884
+ }
885
+
886
+ # socket is ready, try non-blocking connect again after recomputing timeout
887
+ $DEBUG>=2 && DEBUG("socket ready, retrying connect" );
888
+ my $now = time();
889
+ $timeout -= $now - $start;
890
+ $start = $now;
891
+ redo;
892
+
893
+ } elsif ( $rv == 0 ) {
894
+ delete ${*$self}{'_SSL_opening'};
895
+ $DEBUG>=2 && DEBUG("connection failed - connect returned 0" );
896
+ $self->error("SSL connect attempt failed because of handshake problems" );
897
+ ${*$self}{'_SSL_opened'} = -1;
898
+ return $self->fatal_ssl_error();
899
+ }
900
+ }
901
+
902
+ $DEBUG>=2 && DEBUG('ssl handshake done' );
903
+ # ssl connect successful
904
+ delete ${*$self}{'_SSL_opening'};
905
+ ${*$self}{'_SSL_opened'}=1;
906
+ if (defined($timeout)) {
907
+ $self->blocking(1); # reset back to blocking
908
+ $! = undef; # reset errors from non-blocking
909
+ }
910
+
911
+ $ctx ||= ${*$self}{'_SSL_ctx'};
912
+
913
+ if ( my $ocsp_result = ${*$self}{_SSL_ocsp_verify} ) {
914
+ # got result from OCSP stapling
915
+ if ( $ocsp_result->[0] > 0 ) {
916
+ $DEBUG>=3 && DEBUG("got OCSP success with stapling");
917
+ # successful validated
918
+ } elsif ( $ocsp_result->[0] < 0 ) {
919
+ # Permanent problem with validation because certificate
920
+ # is either self-signed or the issuer cannot be found.
921
+ # Ignore here, because this will cause other errors too.
922
+ $DEBUG>=3 && DEBUG("got OCSP failure with stapling: %s",
923
+ $ocsp_result->[1]);
924
+ } else {
925
+ # definitely revoked
926
+ $DEBUG>=3 && DEBUG("got OCSP revocation with stapling: %s",
927
+ $ocsp_result->[1]);
928
+ $self->_internal_error($ocsp_result->[1],5);
929
+ return $self->fatal_ssl_error();
930
+ }
931
+ } elsif ( $ctx->{ocsp_mode} & SSL_OCSP_MUST_STAPLE ) {
932
+ $self->_internal_error("did not receive the required stapled OCSP response",5);
933
+ return $self->fatal_ssl_error();
934
+ }
935
+
936
+ if (!%sess_cb and $ctx->{session_cache}
937
+ and my $session = Net::SSLeay::get1_session($ssl)) {
938
+ $ctx->{session_cache}->add_session(
939
+ ${*$self}{_SSL_arguments}{SSL_session_key},
940
+ $session
941
+ );
942
+ }
943
+
944
+ tie *{$self}, "IO::Socket::SSL::SSL_HANDLE", $self;
945
+
946
+ return $self;
947
+ }
948
+
949
+ # called if PeerAddr is not set in ${*$self}{'_SSL_arguments'}
950
+ # this can be the case if start_SSL is called with a normal IO::Socket::INET
951
+ # so that PeerAddr|PeerPort are not set from args
952
+ # returns PeerAddr
953
+ sub _update_peer {
954
+ my $self = shift;
955
+ my $arg_hash = ${*$self}{'_SSL_arguments'};
956
+ eval {
957
+ my $sockaddr = getpeername( $self );
958
+ my $af = sockaddr_family($sockaddr);
959
+ if( CAN_IPV6 && $af == AF_INET6 ) {
960
+ my (undef, $host, $port) = _getnameinfo($sockaddr,
961
+ NI_NUMERICHOST | NI_NUMERICSERV);
962
+ $arg_hash->{PeerPort} = $port;
963
+ $arg_hash->{PeerAddr} = $host;
964
+ } else {
965
+ my ($port,$addr) = sockaddr_in( $sockaddr);
966
+ $arg_hash->{PeerPort} = $port;
967
+ $arg_hash->{PeerAddr} = inet_ntoa( $addr );
968
+ }
969
+ }
970
+ }
971
+
972
+ #Call to accept occurs when a new client connects to a server using
973
+ #IO::Socket::SSL
974
+ sub accept {
975
+ my $self = shift || return _invalid_object();
976
+ my $class = shift || 'IO::Socket::SSL';
977
+
978
+ my $socket = ${*$self}{'_SSL_opening'};
979
+ if ( ! $socket ) {
980
+ # underlying socket not done
981
+ $DEBUG>=2 && DEBUG('no socket yet' );
982
+ $socket = $self->SUPER::accept($class) || return;
983
+ $DEBUG>=2 && DEBUG('accept created normal socket '.$socket );
984
+
985
+ # don't continue with accept_SSL if SSL_startHandshake is set to 0
986
+ my $sh = ${*$self}{_SSL_arguments}{SSL_startHandshake};
987
+ if (defined $sh && ! $sh) {
988
+ ${*$socket}{_SSL_ctx} = ${*$self}{_SSL_ctx};
989
+ ${*$socket}{_SSL_arguments} = {
990
+ %{${*$self}{_SSL_arguments}},
991
+ SSL_server => 0,
992
+ };
993
+ $DEBUG>=2 && DEBUG('will not start SSL handshake yet');
994
+ return wantarray ? ($socket, getpeername($socket) ) : $socket
995
+ }
996
+ }
997
+
998
+ $self->accept_SSL($socket) || return;
999
+ $DEBUG>=2 && DEBUG('accept_SSL ok' );
1000
+
1001
+ return wantarray ? ($socket, getpeername($socket) ) : $socket;
1002
+ }
1003
+
1004
+ sub accept_SSL {
1005
+ my $self = shift;
1006
+ my $socket = ( @_ && UNIVERSAL::isa( $_[0], 'IO::Handle' )) ? shift : $self;
1007
+ my $args = @_>1 ? {@_}: $_[0]||{};
1008
+
1009
+ my $ssl;
1010
+ if ( ! ${*$self}{'_SSL_opening'} ) {
1011
+ $DEBUG>=2 && DEBUG('starting sslifying' );
1012
+ ${*$self}{'_SSL_opening'} = $socket;
1013
+ if ($socket != $self) {
1014
+ ${*$socket}{_SSL_ctx} = ${*$self}{_SSL_ctx};
1015
+ ${*$socket}{_SSL_arguments} = {
1016
+ %{${*$self}{_SSL_arguments}},
1017
+ SSL_server => 0
1018
+ };
1019
+ }
1020
+
1021
+ my $fileno = ${*$socket}{'_SSL_fileno'} = fileno($socket);
1022
+ return $socket->_internal_error("Socket has no fileno",9)
1023
+ if ! defined $fileno;
1024
+
1025
+ $ssl = ${*$socket}{_SSL_object} =
1026
+ Net::SSLeay::new(${*$socket}{_SSL_ctx}{context})
1027
+ || return $socket->error("SSL structure creation failed");
1028
+ $CREATED_IN_THIS_THREAD{$ssl} = 1 if $use_threads;
1029
+ $SSL_OBJECT{$ssl} = [$socket,1];
1030
+ weaken($SSL_OBJECT{$ssl}[0]);
1031
+
1032
+ Net::SSLeay::set_fd($ssl, $fileno)
1033
+ || return $socket->error("SSL filehandle association failed");
1034
+
1035
+ set_msg_callback($self) if $DEBUG>=2 || ${*$self}{_SSL_msg_callback};
1036
+ }
1037
+
1038
+ $ssl ||= ${*$socket}{'_SSL_object'};
1039
+
1040
+ $SSL_ERROR = $! = undef;
1041
+ #$DEBUG>=2 && DEBUG('calling ssleay::accept' );
1042
+
1043
+ my $timeout = exists $args->{Timeout}
1044
+ ? $args->{Timeout}
1045
+ : ${*$self}{io_socket_timeout}; # from IO::Socket
1046
+ if ( defined($timeout) && $timeout>0 && $socket->blocking(0) ) {
1047
+ # timeout was given and socket was blocking
1048
+ # enforce timeout with now non-blocking socket
1049
+ } else {
1050
+ # timeout does not apply because invalid or socket non-blocking
1051
+ $timeout = undef;
1052
+ $auto_retry && $auto_retry->($ssl,$socket->blocking);
1053
+ }
1054
+
1055
+ my $start = defined($timeout) && time();
1056
+ {
1057
+ $SSL_ERROR = undef;
1058
+ $CURRENT_SSL_OBJECT = $self;
1059
+ my $rv = Net::SSLeay::accept($ssl);
1060
+ $CURRENT_SSL_OBJECT = undef;
1061
+ $DEBUG>=3 && DEBUG( "Net::SSLeay::accept -> $rv" );
1062
+ if ( $rv < 0 ) {
1063
+ if ( my $err = $socket->_skip_rw_error( $ssl,$rv )) {
1064
+ $socket->error("SSL accept attempt failed");
1065
+ delete ${*$self}{'_SSL_opening'};
1066
+ ${*$socket}{'_SSL_opened'} = -1;
1067
+ return $socket->fatal_ssl_error();
1068
+ }
1069
+
1070
+ # accept failed because handshake needs to be completed
1071
+ # if socket was non-blocking or no timeout was given return with this error
1072
+ return if ! defined($timeout);
1073
+
1074
+ # wait until socket is readable or writable
1075
+ my $rv;
1076
+ if ( $timeout>0 ) {
1077
+ my $vec = '';
1078
+ vec($vec,$socket->fileno,1) = 1;
1079
+ $rv =
1080
+ $SSL_ERROR == SSL_WANT_READ ? select( $vec,undef,undef,$timeout) :
1081
+ $SSL_ERROR == SSL_WANT_WRITE ? select( undef,$vec,undef,$timeout) :
1082
+ undef;
1083
+ } else {
1084
+ $! = ETIMEDOUT
1085
+ }
1086
+ if ( ! $rv ) {
1087
+ # failed because of timeout, return
1088
+ $! ||= ETIMEDOUT;
1089
+ delete ${*$self}{'_SSL_opening'};
1090
+ ${*$socket}{'_SSL_opened'} = -1;
1091
+ $socket->blocking(1); # was blocking before
1092
+ return
1093
+ }
1094
+
1095
+ # socket is ready, try non-blocking accept again after recomputing timeout
1096
+ my $now = time();
1097
+ $timeout -= $now - $start;
1098
+ $start = $now;
1099
+ redo;
1100
+
1101
+ } elsif ( $rv == 0 ) {
1102
+ $socket->error("SSL accept attempt failed because of handshake problems" );
1103
+ delete ${*$self}{'_SSL_opening'};
1104
+ ${*$socket}{'_SSL_opened'} = -1;
1105
+ return $socket->fatal_ssl_error();
1106
+ }
1107
+ }
1108
+
1109
+ $DEBUG>=2 && DEBUG('handshake done, socket ready' );
1110
+ # socket opened
1111
+ delete ${*$self}{'_SSL_opening'};
1112
+ ${*$socket}{'_SSL_opened'} = 1;
1113
+ if (defined($timeout)) {
1114
+ $socket->blocking(1); # reset back to blocking
1115
+ $! = undef; # reset errors from non-blocking
1116
+ }
1117
+
1118
+ tie *{$socket}, "IO::Socket::SSL::SSL_HANDLE", $socket;
1119
+
1120
+ return $socket;
1121
+ }
1122
+
1123
+
1124
+ # support user defined message callback but also internal debugging
1125
+ sub _msg_callback {
1126
+ ## my ($direction, $ssl_ver, $content_type, $buf, $len, $ssl, $userp) = @_;
1127
+ IO::Socket::SSL::Trace::ossl_trace(@_) if $DEBUG>=2;
1128
+ my $self = ($SSL_OBJECT{$_[5]} || return)->[0] || return;
1129
+ if (my $cb = ${*$self}{_SSL_msg_callback}) {
1130
+ my ($sub,@arg) = @$cb;
1131
+ $sub->($self, @_[0..5], @arg);
1132
+ }
1133
+ }
1134
+
1135
+ my $ssleay_set_msg_callback = defined &Net::SSLeay::set_msg_callback
1136
+ && \&Net::SSLeay::set_msg_callback;
1137
+
1138
+ sub set_msg_callback {
1139
+ my $self = shift;
1140
+ if (@_) {
1141
+ if ($_[0]) {
1142
+ # enable user defined callback: ($cb,@arg)
1143
+ die "no support for msg callback with this version of Net::SSLeay/OpenSSL"
1144
+ if !$ssleay_set_msg_callback;
1145
+ ${*$self}{_SSL_msg_callback} = [@_];
1146
+ } else {
1147
+ # disable user defined callback
1148
+ delete ${*$self}{_SSL_msg_callback};
1149
+ }
1150
+ }
1151
+
1152
+ # activate user set callback and/or internal for debugging
1153
+ if ($ssleay_set_msg_callback and my $ssl = ${*$self}{_SSL_object}) {
1154
+ $ssleay_set_msg_callback->($ssl,
1155
+ ($DEBUG>=2 || ${*$self}{_SSL_msg_callback})? \&_msg_callback : undef)
1156
+ }
1157
+ }
1158
+
1159
+
1160
+ ####### I/O subroutines ########################
1161
+
1162
+ if ($auto_retry) {
1163
+ *blocking = sub {
1164
+ my $self = shift;
1165
+ { @_ && $auto_retry->(${*$self}{_SSL_object} || last, @_); }
1166
+ return $self->SUPER::blocking(@_);
1167
+ };
1168
+ }
1169
+
1170
+ sub _generic_read {
1171
+ my ($self, $read_func, undef, $length, $offset) = @_;
1172
+ my $ssl = ${*$self}{_SSL_object} || return;
1173
+ my $buffer=\$_[2];
1174
+
1175
+ $SSL_ERROR = $! = undef;
1176
+ my ($data,$rwerr) = $read_func->($ssl, $length);
1177
+ while ( ! defined($data)) {
1178
+ if ( my $err = $self->_skip_rw_error( $ssl, defined($rwerr) ? $rwerr:-1 )) {
1179
+ # OpenSSL 1.1.0c+ : EOF can now result in SSL_read returning -1 and SSL_ERROR_SYSCALL
1180
+ # OpenSSL 3.0 : EOF can now result in SSL_read returning -1 and SSL_ERROR_SSL
1181
+ if (not $! and $err == $Net_SSLeay_ERROR_SSL || $err == $Net_SSLeay_ERROR_SYSCALL) {
1182
+ # treat as EOF
1183
+ $data = '';
1184
+ last;
1185
+ }
1186
+ $self->error("SSL read error");
1187
+ }
1188
+ return;
1189
+ }
1190
+
1191
+ $length = length($data);
1192
+ $$buffer = '' if !defined $$buffer;
1193
+ $offset ||= 0;
1194
+ if ($offset>length($$buffer)) {
1195
+ $$buffer.="\0" x ($offset-length($$buffer)); #mimic behavior of read
1196
+ }
1197
+
1198
+ substr($$buffer, $offset, length($$buffer), $data);
1199
+ return $length;
1200
+ }
1201
+
1202
+ sub read {
1203
+ my $self = shift;
1204
+ ${*$self}{_SSL_object} && return _generic_read($self,
1205
+ $self->blocking ? \&Net::SSLeay::ssl_read_all : \&Net::SSLeay::read,
1206
+ @_
1207
+ );
1208
+
1209
+ # fall back to plain read if we are not required to use SSL yet
1210
+ return $self->SUPER::read(@_);
1211
+ }
1212
+
1213
+ # contrary to the behavior of read sysread can read partial data
1214
+ sub sysread {
1215
+ my $self = shift;
1216
+ ${*$self}{_SSL_object} && return _generic_read( $self,
1217
+ \&Net::SSLeay::read, @_ );
1218
+
1219
+ # fall back to plain sysread if we are not required to use SSL yet
1220
+ my $rv = $self->SUPER::sysread(@_);
1221
+ return $rv;
1222
+ }
1223
+
1224
+ sub peek {
1225
+ my $self = shift;
1226
+ ${*$self}{_SSL_object} && return _generic_read( $self,
1227
+ \&Net::SSLeay::peek, @_ );
1228
+
1229
+ # fall back to plain peek if we are not required to use SSL yet
1230
+ # emulate peek with recv(...,MS_PEEK) - peek(buf,len,offset)
1231
+ return if ! defined recv($self,my $buf,$_[1],MSG_PEEK);
1232
+ $_[0] = $_[2] ? substr($_[0],0,$_[2]).$buf : $buf;
1233
+ return length($buf);
1234
+ }
1235
+
1236
+
1237
+ sub _generic_write {
1238
+ my ($self, $write_all, undef, $length, $offset) = @_;
1239
+
1240
+ my $ssl = ${*$self}{_SSL_object} || return;
1241
+ my $buffer = \$_[2];
1242
+
1243
+ my $buf_len = length($$buffer);
1244
+ $length ||= $buf_len;
1245
+ $offset ||= 0;
1246
+ return $self->_internal_error("Invalid offset for SSL write",9)
1247
+ if $offset>$buf_len;
1248
+ return 0 if ($offset == $buf_len);
1249
+
1250
+ $SSL_ERROR = $! = undef;
1251
+ my $written;
1252
+ if ( $write_all ) {
1253
+ my $data = $length < $buf_len-$offset ? substr($$buffer, $offset, $length) : $$buffer;
1254
+ ($written, my $errs) = Net::SSLeay::ssl_write_all($ssl, $data);
1255
+ # ssl_write_all returns number of bytes written
1256
+ $written = undef if ! $written && $errs;
1257
+ } else {
1258
+ $written = Net::SSLeay::write_partial( $ssl,$offset,$length,$$buffer );
1259
+ # write_partial does SSL_write which returns -1 on error
1260
+ $written = undef if $written <= 0;
1261
+ }
1262
+ if ( !defined($written) ) {
1263
+ if ( my $err = $self->_skip_rw_error( $ssl,-1 )) {
1264
+ # if $! is not set with ERROR_SYSCALL then report as EPIPE
1265
+ $! ||= EPIPE if $err == $Net_SSLeay_ERROR_SYSCALL;
1266
+ $self->error("SSL write error ($err)");
1267
+ }
1268
+ return;
1269
+ }
1270
+
1271
+ return $written;
1272
+ }
1273
+
1274
+ # if socket is blocking write() should return only on error or
1275
+ # if all data are written
1276
+ sub write {
1277
+ my $self = shift;
1278
+ ${*$self}{_SSL_object} && return _generic_write( $self,
1279
+ scalar($self->blocking),@_ );
1280
+
1281
+ # fall back to plain write if we are not required to use SSL yet
1282
+ return $self->SUPER::write(@_);
1283
+ }
1284
+
1285
+ # contrary to write syswrite() returns already if only
1286
+ # a part of the data is written
1287
+ sub syswrite {
1288
+ my $self = shift;
1289
+ ${*$self}{_SSL_object} && return _generic_write($self,0,@_);
1290
+
1291
+ # fall back to plain syswrite if we are not required to use SSL yet
1292
+ return $self->SUPER::syswrite(@_);
1293
+ }
1294
+
1295
+ sub print {
1296
+ my $self = shift;
1297
+ my $string = join(($, or ''), @_, ($\ or ''));
1298
+ return $self->write( $string );
1299
+ }
1300
+
1301
+ sub printf {
1302
+ my ($self,$format) = (shift,shift);
1303
+ return $self->write(sprintf($format, @_));
1304
+ }
1305
+
1306
+ sub getc {
1307
+ my ($self, $buffer) = (shift, undef);
1308
+ return $buffer if $self->read($buffer, 1, 0);
1309
+ }
1310
+
1311
+ sub readline {
1312
+ my $self = shift;
1313
+ ${*$self}{_SSL_object} or return $self->SUPER::getline;
1314
+
1315
+ if ( not defined $/ or wantarray) {
1316
+ # read all and split
1317
+
1318
+ my $buf = '';
1319
+ while (1) {
1320
+ my $rv = $self->sysread($buf,2**16,length($buf));
1321
+ if ( ! defined $rv ) {
1322
+ next if $! == EINTR; # retry
1323
+ last if $! == EWOULDBLOCK || $! == EAGAIN; # use everything so far
1324
+ return; # return error
1325
+ } elsif ( ! $rv ) {
1326
+ last
1327
+ }
1328
+ }
1329
+
1330
+ if ( ! defined $/ ) {
1331
+ return $buf
1332
+ } elsif ( ref($/)) {
1333
+ my $size = ${$/};
1334
+ die "bad value in ref \$/: $size" unless $size>0;
1335
+ return $buf=~m{\G(.{1,$size})}g;
1336
+ } elsif ( $/ eq '' ) {
1337
+ return $buf =~m{\G(.*\n\n+|.+)}g;
1338
+ } else {
1339
+ return $buf =~m{\G(.*$/|.+)}g;
1340
+ }
1341
+ }
1342
+
1343
+ # read only one line
1344
+ if ( ref($/) ) {
1345
+ my $size = ${$/};
1346
+ # read record of $size bytes
1347
+ die "bad value in ref \$/: $size" unless $size>0;
1348
+ my $buf = '';
1349
+ while ( $size>length($buf)) {
1350
+ my $rv = $self->sysread($buf,$size-length($buf),length($buf));
1351
+ if ( ! defined $rv ) {
1352
+ next if $! == EINTR; # retry
1353
+ last if $! == EWOULDBLOCK || $! == EAGAIN; # use everything so far
1354
+ return; # return error
1355
+ } elsif ( ! $rv ) {
1356
+ last
1357
+ }
1358
+ }
1359
+ return $buf;
1360
+ }
1361
+
1362
+ my ($delim0,$delim1) = $/ eq '' ? ("\n\n","\n"):($/,'');
1363
+
1364
+ # find first occurrence of $delim0 followed by as much as possible $delim1
1365
+ my $buf = '';
1366
+ my $eod = 0; # pointer into $buf after $delim0 $delim1*
1367
+ my $ssl = $self->_get_ssl_object or return;
1368
+ while (1) {
1369
+
1370
+ # wait until we have more data or eof
1371
+ my $poke = Net::SSLeay::peek($ssl,1);
1372
+ if ( ! defined $poke or $poke eq '' ) {
1373
+ next if $! == EINTR;
1374
+ }
1375
+
1376
+ my $skip = 0;
1377
+
1378
+ # peek into available data w/o reading
1379
+ my $pending = Net::SSLeay::pending($ssl);
1380
+ if ( $pending and
1381
+ ( my $pb = Net::SSLeay::peek( $ssl,$pending )) ne '' ) {
1382
+ $buf .= $pb
1383
+ } else {
1384
+ return $buf eq '' ? ():$buf;
1385
+ }
1386
+ if ( !$eod ) {
1387
+ my $pos = index( $buf,$delim0 );
1388
+ if ( $pos<0 ) {
1389
+ $skip = $pending
1390
+ } else {
1391
+ $eod = $pos + length($delim0); # pos after delim0
1392
+ }
1393
+ }
1394
+
1395
+ if ( $eod ) {
1396
+ if ( $delim1 ne '' ) {
1397
+ # delim0 found, check for as much delim1 as possible
1398
+ while ( index( $buf,$delim1,$eod ) == $eod ) {
1399
+ $eod+= length($delim1);
1400
+ }
1401
+ }
1402
+ $skip = $pending - ( length($buf) - $eod );
1403
+ }
1404
+
1405
+ # remove data from $self which I already have in buf
1406
+ while ( $skip>0 ) {
1407
+ if ($self->sysread(my $p,$skip,0)) {
1408
+ $skip -= length($p);
1409
+ next;
1410
+ }
1411
+ $! == EINTR or last;
1412
+ }
1413
+
1414
+ if ( $eod and ( $delim1 eq '' or $eod < length($buf))) {
1415
+ # delim0 found and there can be no more delim1 pending
1416
+ last
1417
+ }
1418
+ }
1419
+ return substr($buf,0,$eod);
1420
+ }
1421
+
1422
+ sub close {
1423
+ my $self = shift || return _invalid_object();
1424
+ my $close_args = (ref($_[0]) eq 'HASH') ? $_[0] : {@_};
1425
+
1426
+ return if ! $self->stop_SSL(
1427
+ SSL_fast_shutdown => 1,
1428
+ %$close_args,
1429
+ _SSL_ioclass_downgrade => 0,
1430
+ );
1431
+
1432
+ if ( ! $close_args->{_SSL_in_DESTROY} ) {
1433
+ untie( *$self );
1434
+ undef ${*$self}{_SSL_fileno};
1435
+ return $self->SUPER::close;
1436
+ }
1437
+ return 1;
1438
+ }
1439
+
1440
+ sub is_SSL {
1441
+ my $self = pop;
1442
+ return ${*$self}{_SSL_object} && 1
1443
+ }
1444
+
1445
+ sub stop_SSL {
1446
+ my $self = shift || return _invalid_object();
1447
+ my $stop_args = (ref($_[0]) eq 'HASH') ? $_[0] : {@_};
1448
+ $stop_args->{SSL_no_shutdown} = 1 if ! ${*$self}{_SSL_opened};
1449
+
1450
+ if (my $ssl = ${*$self}{'_SSL_object'}) {
1451
+ if (delete ${*$self}{'_SSL_opening'}) {
1452
+ # just destroy the object further below
1453
+ } elsif ( ! $stop_args->{SSL_no_shutdown} ) {
1454
+ my $status = Net::SSLeay::get_shutdown($ssl);
1455
+
1456
+ my $timeout =
1457
+ not($self->blocking) ? undef :
1458
+ exists $stop_args->{Timeout} ? $stop_args->{Timeout} :
1459
+ ${*$self}{io_socket_timeout}; # from IO::Socket
1460
+ if ($timeout) {
1461
+ $self->blocking(0);
1462
+ $timeout += time();
1463
+ }
1464
+
1465
+ while (1) {
1466
+ if ( $status & SSL_SENT_SHUTDOWN and
1467
+ # don't care for received if fast shutdown
1468
+ $status & SSL_RECEIVED_SHUTDOWN
1469
+ || $stop_args->{SSL_fast_shutdown}) {
1470
+ # shutdown complete
1471
+ last;
1472
+ }
1473
+ if ((${*$self}{'_SSL_opened'}||0) <= 0) {
1474
+ # not really open, thus don't expect shutdown to return
1475
+ # something meaningful
1476
+ last;
1477
+ }
1478
+
1479
+ # initiate or complete shutdown
1480
+ local $SIG{PIPE} = 'IGNORE';
1481
+ $SSL_ERROR = $! = undef;
1482
+ my $rv = Net::SSLeay::shutdown($ssl);
1483
+ if ( $rv < 0 ) {
1484
+ # non-blocking socket?
1485
+ if ( ! $timeout ) {
1486
+ if ( my $err = $self->_skip_rw_error( $ssl, $rv )) {
1487
+ # if $! is not set with ERROR_SYSCALL then report as EPIPE
1488
+ $! ||= EPIPE if $err == $Net_SSLeay_ERROR_SYSCALL;
1489
+ $self->error("SSL shutdown error ($err)");
1490
+ }
1491
+ # need to try again
1492
+ return;
1493
+ }
1494
+
1495
+ # don't use _skip_rw_error so that existing error does
1496
+ # not get cleared
1497
+ my $wait = $timeout - time();
1498
+ last if $wait<=0;
1499
+ vec(my $vec = '',fileno($self),1) = 1;
1500
+ my $err = Net::SSLeay::get_error($ssl,$rv);
1501
+ if ( $err == $Net_SSLeay_ERROR_WANT_READ) {
1502
+ select($vec,undef,undef,$wait)
1503
+ } elsif ( $err == $Net_SSLeay_ERROR_WANT_READ) {
1504
+ select(undef,$vec,undef,$wait)
1505
+ } else {
1506
+ last;
1507
+ }
1508
+ }
1509
+
1510
+ $status |= SSL_SENT_SHUTDOWN;
1511
+ $status |= SSL_RECEIVED_SHUTDOWN if $rv>0;
1512
+ }
1513
+ $self->blocking(1) if $timeout;
1514
+ }
1515
+
1516
+ # destroy allocated objects for SSL and untie
1517
+ # do not destroy CTX unless explicitly specified
1518
+ Net::SSLeay::free($ssl);
1519
+ if (my $cert = delete ${*$self}{'_SSL_certificate'}) {
1520
+ Net::SSLeay::X509_free($cert);
1521
+ }
1522
+ delete ${*$self}{_SSL_object};
1523
+ ${*$self}{'_SSL_opened'} = 0;
1524
+ delete $SSL_OBJECT{$ssl};
1525
+ delete $CREATED_IN_THIS_THREAD{$ssl};
1526
+ untie(*$self);
1527
+ }
1528
+
1529
+ if ($stop_args->{'SSL_ctx_free'}) {
1530
+ my $ctx = delete ${*$self}{'_SSL_ctx'};
1531
+ $ctx && $ctx->DESTROY();
1532
+ }
1533
+
1534
+
1535
+ if ( ! $stop_args->{_SSL_in_DESTROY} ) {
1536
+
1537
+ my $downgrade = $stop_args->{_SSL_ioclass_downgrade};
1538
+ if ( $downgrade || ! defined $downgrade ) {
1539
+ # rebless to original class from start_SSL
1540
+ if ( my $orig_class = delete ${*$self}{'_SSL_ioclass_upgraded'} ) {
1541
+ bless $self,$orig_class;
1542
+ # FIXME: if original class was tied too we need to restore the tie
1543
+ # remove all _SSL related from *$self
1544
+ my @sslkeys = grep { m{^_?SSL_} } keys %{*$self};
1545
+ delete @{*$self}{@sslkeys} if @sslkeys;
1546
+ }
1547
+ }
1548
+ }
1549
+ return 1;
1550
+ }
1551
+
1552
+
1553
+ sub fileno {
1554
+ my $self = shift;
1555
+ my $fn = ${*$self}{'_SSL_fileno'};
1556
+ return defined($fn) ? $fn : $self->SUPER::fileno();
1557
+ }
1558
+
1559
+
1560
+ ####### IO::Socket::SSL specific functions #######
1561
+ # _get_ssl_object is for internal use ONLY!
1562
+ sub _get_ssl_object {
1563
+ my $self = shift;
1564
+ return ${*$self}{'_SSL_object'} ||
1565
+ IO::Socket::SSL->_internal_error("Undefined SSL object",9);
1566
+ }
1567
+
1568
+ # _get_ctx_object is for internal use ONLY!
1569
+ sub _get_ctx_object {
1570
+ my $self = shift;
1571
+ my $ctx_object = ${*$self}{_SSL_ctx};
1572
+ return $ctx_object && $ctx_object->{context};
1573
+ }
1574
+
1575
+ # default error for undefined arguments
1576
+ sub _invalid_object {
1577
+ return IO::Socket::SSL->_internal_error("Undefined IO::Socket::SSL object",9);
1578
+ }
1579
+
1580
+
1581
+ sub pending {
1582
+ my $ssl = shift()->_get_ssl_object || return;
1583
+ return Net::SSLeay::pending($ssl);
1584
+ }
1585
+
1586
+ sub start_SSL {
1587
+ my ($class,$socket) = (shift,shift);
1588
+ return $class->_internal_error("Not a socket",9) if ! ref($socket);
1589
+ my $arg_hash = @_ == 1 ? $_[0] : {@_};
1590
+ my %to = exists $arg_hash->{Timeout} ? ( Timeout => delete $arg_hash->{Timeout} ) :();
1591
+ my $original_class = ref($socket);
1592
+ if ( ! $original_class ) {
1593
+ $socket = ($original_class = $ISA[0])->new_from_fd($socket,'<+')
1594
+ or return $class->_internal_error(
1595
+ "creating $original_class from file handle failed",9);
1596
+ }
1597
+ my $original_fileno = (UNIVERSAL::can($socket, "fileno"))
1598
+ ? $socket->fileno : CORE::fileno($socket);
1599
+ return $class->_internal_error("Socket has no fileno",9)
1600
+ if ! defined $original_fileno;
1601
+
1602
+ bless $socket, $class;
1603
+ $socket->configure_SSL($arg_hash) or bless($socket, $original_class) && return;
1604
+
1605
+ ${*$socket}{'_SSL_fileno'} = $original_fileno;
1606
+ ${*$socket}{'_SSL_ioclass_upgraded'} = $original_class
1607
+ if $class ne $original_class;
1608
+
1609
+ my $start_handshake = $arg_hash->{SSL_startHandshake};
1610
+ if ( ! defined($start_handshake) || $start_handshake ) {
1611
+ # if we have no callback force blocking mode
1612
+ $DEBUG>=2 && DEBUG( "start handshake" );
1613
+ my $was_blocking = $socket->blocking(1);
1614
+ my $result = ${*$socket}{'_SSL_arguments'}{SSL_server}
1615
+ ? $socket->accept_SSL(%to)
1616
+ : $socket->connect_SSL(%to);
1617
+ if ( $result ) {
1618
+ $socket->blocking(0) if ! $was_blocking;
1619
+ return $socket;
1620
+ } else {
1621
+ # upgrade to SSL failed, downgrade socket to original class
1622
+ if ( $original_class ) {
1623
+ bless($socket,$original_class);
1624
+ $socket->blocking(0) if ! $was_blocking
1625
+ && $socket->can('blocking');
1626
+ }
1627
+ return;
1628
+ }
1629
+ } else {
1630
+ $DEBUG>=2 && DEBUG( "don't start handshake: $socket" );
1631
+ return $socket; # just return upgraded socket
1632
+ }
1633
+
1634
+ }
1635
+
1636
+ sub new_from_fd {
1637
+ my ($class, $fd) = (shift,shift);
1638
+ # Check for accidental inclusion of MODE in the argument list
1639
+ if (length($_[0]) < 4) {
1640
+ (my $mode = $_[0]) =~ tr/+<>//d;
1641
+ shift unless length($mode);
1642
+ }
1643
+ my $handle = $ISA[0]->new_from_fd($fd, '+<')
1644
+ || return($class->error("Could not create socket from file descriptor."));
1645
+
1646
+ # Annoying workaround for Perl 5.6.1 and below:
1647
+ $handle = $ISA[0]->new_from_fd($handle, '+<');
1648
+
1649
+ return $class->start_SSL($handle, @_);
1650
+ }
1651
+
1652
+
1653
+ sub dump_peer_certificate {
1654
+ my $ssl = shift()->_get_ssl_object || return;
1655
+ return Net::SSLeay::dump_peer_certificate($ssl);
1656
+ }
1657
+
1658
+ if ( defined &Net::SSLeay::get_peer_cert_chain
1659
+ && $netssleay_version >= 1.58 ) {
1660
+ *peer_certificates = sub {
1661
+ my $self = shift;
1662
+ my $ssl = $self->_get_ssl_object || return;
1663
+ my @chain = Net::SSLeay::get_peer_cert_chain($ssl);
1664
+ @chain = () if @chain && !$self->peer_certificate; # work around #96013
1665
+ if ( ${*$self}{_SSL_arguments}{SSL_server} ) {
1666
+ # in the client case the chain contains the peer certificate,
1667
+ # in the server case not
1668
+ # this one has an increased reference counter, the other not
1669
+ if ( my $peer = Net::SSLeay::get_peer_certificate($ssl)) {
1670
+ Net::SSLeay::X509_free($peer);
1671
+ unshift @chain, $peer;
1672
+ }
1673
+ }
1674
+ return @chain;
1675
+
1676
+ }
1677
+ } else {
1678
+ *peer_certificates = sub {
1679
+ die "peer_certificates needs Net::SSLeay>=1.58";
1680
+ }
1681
+ }
1682
+
1683
+ {
1684
+ my %dispatcher = (
1685
+ issuer => sub { Net::SSLeay::X509_NAME_oneline( Net::SSLeay::X509_get_issuer_name( shift )) },
1686
+ subject => sub { Net::SSLeay::X509_NAME_oneline( Net::SSLeay::X509_get_subject_name( shift )) },
1687
+ commonName => sub {
1688
+ my $cn = Net::SSLeay::X509_NAME_get_text_by_NID(
1689
+ Net::SSLeay::X509_get_subject_name( shift ), NID_CommonName);
1690
+ $cn;
1691
+ },
1692
+ subjectAltNames => sub { Net::SSLeay::X509_get_subjectAltNames( shift ) },
1693
+ );
1694
+
1695
+ # alternative names
1696
+ $dispatcher{authority} = $dispatcher{issuer};
1697
+ $dispatcher{owner} = $dispatcher{subject};
1698
+ $dispatcher{cn} = $dispatcher{commonName};
1699
+
1700
+ sub peer_certificate {
1701
+ my ($self,$field,$reload) = @_;
1702
+ my $ssl = $self->_get_ssl_object or return;
1703
+
1704
+ Net::SSLeay::X509_free(delete ${*$self}{_SSL_certificate})
1705
+ if $reload && ${*$self}{_SSL_certificate};
1706
+ my $cert = ${*$self}{_SSL_certificate}
1707
+ ||= Net::SSLeay::get_peer_certificate($ssl)
1708
+ or return $self->error("Could not retrieve peer certificate");
1709
+
1710
+ if ($field) {
1711
+ my $sub = $dispatcher{$field} or croak
1712
+ "invalid argument for peer_certificate, valid are: ".join( " ",keys %dispatcher ).
1713
+ "\nMaybe you need to upgrade your Net::SSLeay";
1714
+ return $sub->($cert);
1715
+ } else {
1716
+ return $cert
1717
+ }
1718
+ }
1719
+
1720
+ sub sock_certificate {
1721
+ my ($self,$field) = @_;
1722
+ my $ssl = $self->_get_ssl_object || return;
1723
+ my $cert = Net::SSLeay::get_certificate( $ssl ) || return;
1724
+ if ($field) {
1725
+ my $sub = $dispatcher{$field} or croak
1726
+ "invalid argument for sock_certificate, valid are: ".join( " ",keys %dispatcher ).
1727
+ "\nMaybe you need to upgrade your Net::SSLeay";
1728
+ return $sub->($cert);
1729
+ } else {
1730
+ return $cert
1731
+ }
1732
+ }
1733
+
1734
+
1735
+ # known schemes, possible attributes are:
1736
+ # - wildcards_in_alt (0, 'full_label', 'anywhere')
1737
+ # - wildcards_in_cn (0, 'full_label', 'anywhere')
1738
+ # - check_cn (0, 'always', 'when_only')
1739
+ # unfortunately there are a lot of different schemes used, see RFC 6125 for a
1740
+ # summary, which references all of the following except RFC4217/ftp
1741
+
1742
+ my %scheme = (
1743
+ none => {}, # do not check
1744
+ # default set is a superset of all the others and thus worse than a more
1745
+ # specific set, but much better than not verifying name at all
1746
+ default => {
1747
+ wildcards_in_cn => 'anywhere',
1748
+ wildcards_in_alt => 'anywhere',
1749
+ check_cn => 'always',
1750
+ ip_in_cn => 1,
1751
+ },
1752
+ );
1753
+
1754
+ for(qw(
1755
+ rfc2818
1756
+ rfc3920 xmpp
1757
+ rfc4217 ftp
1758
+ )) {
1759
+ $scheme{$_} = {
1760
+ wildcards_in_cn => 'anywhere',
1761
+ wildcards_in_alt => 'anywhere',
1762
+ check_cn => 'when_only',
1763
+ }
1764
+ }
1765
+
1766
+ for(qw(www http)) {
1767
+ $scheme{$_} = {
1768
+ wildcards_in_cn => 'anywhere',
1769
+ wildcards_in_alt => 'anywhere',
1770
+ check_cn => 'when_only',
1771
+ ip_in_cn => 4,
1772
+ }
1773
+ }
1774
+
1775
+ for(qw(
1776
+ rfc4513 ldap
1777
+ )) {
1778
+ $scheme{$_} = {
1779
+ wildcards_in_cn => 0,
1780
+ wildcards_in_alt => 'full_label',
1781
+ check_cn => 'always',
1782
+ };
1783
+ }
1784
+
1785
+ for(qw(
1786
+ rfc2595 smtp
1787
+ rfc4642 imap pop3 acap
1788
+ rfc5539 nntp
1789
+ rfc5538 netconf
1790
+ rfc5425 syslog
1791
+ rfc5953 snmp
1792
+ )) {
1793
+ $scheme{$_} = {
1794
+ wildcards_in_cn => 'full_label',
1795
+ wildcards_in_alt => 'full_label',
1796
+ check_cn => 'always'
1797
+ };
1798
+ }
1799
+ for(qw(
1800
+ rfc5971 gist
1801
+ )) {
1802
+ $scheme{$_} = {
1803
+ wildcards_in_cn => 'full_label',
1804
+ wildcards_in_alt => 'full_label',
1805
+ check_cn => 'when_only',
1806
+ };
1807
+ }
1808
+
1809
+ for(qw(
1810
+ rfc5922 sip
1811
+ )) {
1812
+ $scheme{$_} = {
1813
+ wildcards_in_cn => 0,
1814
+ wildcards_in_alt => 0,
1815
+ check_cn => 'always',
1816
+ };
1817
+ }
1818
+
1819
+
1820
+ # function to verify the hostname
1821
+ #
1822
+ # as every application protocol has its own rules to do this
1823
+ # we provide some default rules as well as a user-defined
1824
+ # callback
1825
+
1826
+ sub verify_hostname_of_cert {
1827
+ my $identity = shift;
1828
+ my $cert = shift;
1829
+ my $scheme = shift || 'default';
1830
+ my $publicsuffix = shift;
1831
+ if ( ! ref($scheme) ) {
1832
+ $DEBUG>=3 && DEBUG( "scheme=$scheme cert=$cert" );
1833
+ $scheme = $scheme{$scheme} || croak("scheme $scheme not defined");
1834
+ }
1835
+
1836
+ return 1 if ! %$scheme; # 'none'
1837
+ $identity =~s{\.+$}{}; # ignore absolutism
1838
+
1839
+ # get data from certificate
1840
+ my $commonName = $dispatcher{cn}->($cert);
1841
+ my @altNames = $dispatcher{subjectAltNames}->($cert);
1842
+ $DEBUG>=3 && DEBUG("identity=$identity cn=$commonName alt=@altNames" );
1843
+
1844
+ if ( my $sub = $scheme->{callback} ) {
1845
+ # use custom callback
1846
+ return $sub->($identity,$commonName,@altNames);
1847
+ }
1848
+
1849
+ # is the given hostname an IP address? Then we have to convert to network byte order [RFC791][RFC2460]
1850
+
1851
+ my $ipn;
1852
+ if ( CAN_IPV6 and $identity =~m{:} ) {
1853
+ # no IPv4 or hostname have ':' in it, try IPv6.
1854
+ $identity =~m{[^\da-fA-F:\.]} and return; # invalid characters in name
1855
+ $ipn = inet_pton(AF_INET6,$identity) or return; # invalid name
1856
+ } elsif ( my @ip = $identity =~m{^(\d+)(?:\.(\d+)\.(\d+)\.(\d+)|[\d\.]*)$} ) {
1857
+ # check for invalid IP/hostname
1858
+ return if 4 != @ip or 4 != grep { defined($_) && $_<256 } @ip;
1859
+ $ipn = pack("CCCC",@ip);
1860
+ } else {
1861
+ # assume hostname, check for umlauts etc
1862
+ if ( $identity =~m{[^a-zA-Z0-9_.\-]} ) {
1863
+ $identity =~m{\0} and return; # $identity has \\0 byte
1864
+ $identity = idn_to_ascii($identity)
1865
+ or return; # conversation to IDNA failed
1866
+ $identity =~m{[^a-zA-Z0-9_.\-]}
1867
+ and return; # still junk inside
1868
+ }
1869
+ }
1870
+
1871
+ # do the actual verification
1872
+ my $check_name = sub {
1873
+ my ($name,$identity,$wtyp,$publicsuffix) = @_;
1874
+ $name =~s{\.+$}{}; # ignore absolutism
1875
+ $name eq '' and return;
1876
+ $wtyp ||= '';
1877
+ my $pattern;
1878
+ ### IMPORTANT!
1879
+ # We accept only a single wildcard and only for a single part of the FQDN
1880
+ # e.g. *.example.org does match www.example.org but not bla.www.example.org
1881
+ # The RFCs are in this regard unspecific but we don't want to have to
1882
+ # deal with certificates like *.com, *.co.uk or even *
1883
+ # see also http://nils.toedtmann.net/pub/subjectAltName.txt .
1884
+ # Also, we fall back to full_label matches if the identity is an IDNA
1885
+ # name, see RFC6125 and the discussion at
1886
+ # http://bugs.python.org/issue17997#msg194950
1887
+ if ( $wtyp eq 'anywhere' and $name =~m{^([a-zA-Z0-9_\-]*)\*(.+)} ) {
1888
+ return if $1 ne '' and substr($identity,0,4) eq 'xn--'; # IDNA
1889
+ $pattern = qr{^\Q$1\E[a-zA-Z0-9_\-]+\Q$2\E$}i;
1890
+ } elsif ( $wtyp =~ m{^(?:full_label|leftmost)$}
1891
+ and $name =~m{^\*(\..+)$} ) {
1892
+ $pattern = qr{^[a-zA-Z0-9_\-]+\Q$1\E$}i;
1893
+ } else {
1894
+ return lc($identity) eq lc($name);
1895
+ }
1896
+ if ( $identity =~ $pattern ) {
1897
+ $publicsuffix = IO::Socket::SSL::PublicSuffix->default
1898
+ if ! defined $publicsuffix;
1899
+ return 1 if $publicsuffix eq '';
1900
+ my @labels = split( m{\.+}, $identity );
1901
+ my $tld = $publicsuffix->public_suffix(\@labels,+1);
1902
+ return 1 if @labels > ( $tld ? 0+@$tld : 1 );
1903
+ }
1904
+ return;
1905
+ };
1906
+
1907
+
1908
+ my $alt_dnsNames = 0;
1909
+ while (@altNames) {
1910
+ my ($type, $name) = splice (@altNames, 0, 2);
1911
+ if ( $ipn and $type == GEN_IPADD ) {
1912
+ # exact match needed for IP
1913
+ # $name is already packed format (inet_xton)
1914
+ return 1 if $ipn eq $name;
1915
+
1916
+ } elsif ( ! $ipn and $type == GEN_DNS ) {
1917
+ $name =~s/\s+$//; $name =~s/^\s+//;
1918
+ $alt_dnsNames++;
1919
+ $check_name->($name,$identity,$scheme->{wildcards_in_alt},$publicsuffix)
1920
+ and return 1;
1921
+ }
1922
+ }
1923
+
1924
+ if ( $scheme->{check_cn} eq 'always' or
1925
+ $scheme->{check_cn} eq 'when_only' and !$alt_dnsNames ) {
1926
+ if ( ! $ipn ) {
1927
+ $check_name->($commonName,$identity,$scheme->{wildcards_in_cn},$publicsuffix)
1928
+ and return 1;
1929
+ } elsif ( $scheme->{ip_in_cn} ) {
1930
+ if ( $identity eq $commonName ) {
1931
+ return 1 if
1932
+ $scheme->{ip_in_cn} == 4 ? length($ipn) == 4 :
1933
+ $scheme->{ip_in_cn} == 6 ? length($ipn) == 16 :
1934
+ 1;
1935
+ }
1936
+ }
1937
+ }
1938
+
1939
+ return 0; # no match
1940
+ }
1941
+ }
1942
+
1943
+ sub verify_hostname {
1944
+ my $self = shift;
1945
+ my $host = shift;
1946
+ my $cert = $self->peer_certificate;
1947
+ return verify_hostname_of_cert( $host,$cert,@_ );
1948
+ }
1949
+
1950
+
1951
+ sub get_servername {
1952
+ my $self = shift;
1953
+ return ${*$self}{_SSL_servername} ||= do {
1954
+ my $ssl = $self->_get_ssl_object or return;
1955
+ Net::SSLeay::get_servername($ssl);
1956
+ };
1957
+ }
1958
+
1959
+ sub get_fingerprint_bin {
1960
+ my ($self,$algo,$cert,$key_only) = @_;
1961
+ $cert ||= $self->peer_certificate;
1962
+ return $key_only
1963
+ ? Net::SSLeay::X509_pubkey_digest($cert, $algo2digest->($algo || 'sha256'))
1964
+ : Net::SSLeay::X509_digest($cert, $algo2digest->($algo || 'sha256'));
1965
+ }
1966
+
1967
+ sub get_fingerprint {
1968
+ my ($self,$algo,$cert,$key_only) = @_;
1969
+ $algo ||= 'sha256';
1970
+ my $fp = get_fingerprint_bin($self,$algo,$cert,$key_only) or return;
1971
+ return $algo.'$'.($key_only ? 'pub$':'').unpack('H*',$fp);
1972
+ }
1973
+
1974
+ sub get_cipher {
1975
+ my $ssl = shift()->_get_ssl_object || return;
1976
+ return Net::SSLeay::get_cipher($ssl);
1977
+ }
1978
+
1979
+ sub get_sslversion {
1980
+ my $ssl = shift()->_get_ssl_object || return;
1981
+ my $version = Net::SSLeay::version($ssl) or return;
1982
+ return
1983
+ $version == 0x0304 ? 'TLSv1_3' :
1984
+ $version == 0x0303 ? 'TLSv1_2' :
1985
+ $version == 0x0302 ? 'TLSv1_1' :
1986
+ $version == 0x0301 ? 'TLSv1' :
1987
+ $version == 0x0300 ? 'SSLv3' :
1988
+ $version == 0x0002 ? 'SSLv2' :
1989
+ $version == 0xfeff ? 'DTLS1' :
1990
+ undef;
1991
+ }
1992
+
1993
+ sub get_sslversion_int {
1994
+ my $ssl = shift()->_get_ssl_object || return;
1995
+ return Net::SSLeay::version($ssl);
1996
+ }
1997
+
1998
+ sub get_session_reused {
1999
+ return Net::SSLeay::session_reused(
2000
+ shift()->_get_ssl_object || return);
2001
+ }
2002
+
2003
+ if ($can_ocsp) {
2004
+ no warnings 'once';
2005
+ *ocsp_resolver = sub {
2006
+ my $self = shift;
2007
+ my $ssl = $self->_get_ssl_object || return;
2008
+ my $ctx = ${*$self}{_SSL_ctx};
2009
+ return IO::Socket::SSL::OCSP_Resolver->new(
2010
+ $ssl,
2011
+ $ctx->{ocsp_cache} ||= IO::Socket::SSL::OCSP_Cache->new,
2012
+ $ctx->{ocsp_mode} & SSL_OCSP_FAIL_HARD,
2013
+ @_ ? \@_ :
2014
+ $ctx->{ocsp_mode} & SSL_OCSP_FULL_CHAIN ? [ $self->peer_certificates ]:
2015
+ [ $self->peer_certificate ]
2016
+ );
2017
+ };
2018
+ }
2019
+
2020
+ sub errstr {
2021
+ my $self = shift;
2022
+ my $oe = ref($self) && ${*$self}{_SSL_last_err};
2023
+ return $oe ? $oe->[0] : $SSL_ERROR || '';
2024
+ }
2025
+
2026
+ sub fatal_ssl_error {
2027
+ my $self = shift;
2028
+ my $error_trap = ${*$self}{'_SSL_arguments'}->{'SSL_error_trap'};
2029
+ $@ = $self->errstr;
2030
+ my $saved_error = $SSL_ERROR;
2031
+ if (defined $error_trap and ref($error_trap) eq 'CODE') {
2032
+ $error_trap->($self, $self->errstr()."\n".$self->get_ssleay_error());
2033
+ } elsif ( ${*$self}{'_SSL_ioclass_upgraded'}
2034
+ || ${*$self}{_SSL_arguments}{SSL_keepSocketOnError}) {
2035
+ # downgrade only
2036
+ $DEBUG>=3 && DEBUG('downgrading SSL only, not closing socket' );
2037
+ $self->stop_SSL;
2038
+ } else {
2039
+ # kill socket
2040
+ $self->close
2041
+ }
2042
+ $SSL_ERROR = $saved_error if $saved_error;
2043
+ return;
2044
+ }
2045
+
2046
+ sub get_ssleay_error {
2047
+ #Net::SSLeay will print out the errors itself unless we explicitly
2048
+ #undefine $Net::SSLeay::trace while running print_errs()
2049
+ local $Net::SSLeay::trace;
2050
+ return Net::SSLeay::print_errs('SSL error: ') || '';
2051
+ }
2052
+
2053
+ # internal errors, e.g. unsupported features, hostname check failed etc
2054
+ # _SSL_last_err contains severity so that on error chains we can decide if one
2055
+ # error should replace the previous one or if this is just a less specific
2056
+ # follow-up error, e.g. configuration failed because certificate failed because
2057
+ # hostname check went wrong:
2058
+ # 0 - fallback errors
2059
+ # 4 - errors bubbled up from OpenSSL (sub error, r/w error)
2060
+ # 5 - hostname or OCSP verification failed
2061
+ # 9 - fatal problems, e.g. missing feature, no fileno...
2062
+ # _SSL_last_err and SSL_ERROR are only replaced if the error has a higher
2063
+ # severity than the previous one
2064
+
2065
+ sub _internal_error {
2066
+ my ($self, $error, $severity) = @_;
2067
+ $error = dualvar( -1, $error );
2068
+ $self = $CURRENT_SSL_OBJECT if !ref($self) && $CURRENT_SSL_OBJECT;
2069
+ if (ref($self)) {
2070
+ my $oe = ${*$self}{_SSL_last_err};
2071
+ if (!$oe || $oe->[1] <= $severity) {
2072
+ ${*$self}{_SSL_last_err} = [$error,$severity];
2073
+ $SSL_ERROR = $error;
2074
+ $DEBUG && DEBUG("local error: $error");
2075
+ } else {
2076
+ $DEBUG && DEBUG("ignoring less severe local error '$error', keep '$oe->[0]'");
2077
+ }
2078
+ } else {
2079
+ $SSL_ERROR = $error;
2080
+ $DEBUG && DEBUG("global error: $error");
2081
+ }
2082
+ return;
2083
+ }
2084
+
2085
+ # OpenSSL errors
2086
+ sub error {
2087
+ my ($self, $error) = @_;
2088
+ my @err;
2089
+ while ( my $err = Net::SSLeay::ERR_get_error()) {
2090
+ push @err, Net::SSLeay::ERR_error_string($err);
2091
+ $DEBUG>=2 && DEBUG( $error."\n".$self->get_ssleay_error());
2092
+ }
2093
+ $error .= ' '.join(' ',@err) if @err;
2094
+ return $self->_internal_error($error,4) if $error;
2095
+ return;
2096
+ }
2097
+
2098
+ sub _errstack {
2099
+ my @err;
2100
+ while (my $err = Net::SSLeay::ERR_get_error()) {
2101
+ push @err, Net::SSLeay::ERR_error_string($err);
2102
+ }
2103
+ return @err;
2104
+ }
2105
+
2106
+ sub can_client_sni { return $can_client_sni }
2107
+ sub can_server_sni { return $can_server_sni }
2108
+ sub can_multi_cert { return $can_multi_cert }
2109
+ sub can_npn { return $can_npn }
2110
+ sub can_alpn { return $can_alpn }
2111
+ sub can_ecdh { return $can_ecdh }
2112
+ sub can_ipv6 { return CAN_IPV6 }
2113
+ sub can_ocsp { return $can_ocsp }
2114
+ sub can_ticket_keycb { return $can_tckt_keycb }
2115
+ sub can_pha { return $can_pha }
2116
+ sub can_partial_chain { return $check_partial_chain && 1 }
2117
+
2118
+ sub DESTROY {
2119
+ my $self = shift or return;
2120
+ if (my $ssl = ${*$self}{_SSL_object}) {
2121
+ delete $SSL_OBJECT{$ssl};
2122
+ if (!$use_threads or delete $CREATED_IN_THIS_THREAD{$ssl}) {
2123
+ $self->close(_SSL_in_DESTROY => 1, SSL_no_shutdown => 1);
2124
+ }
2125
+ }
2126
+ delete @{*$self}{@all_my_keys};
2127
+ }
2128
+
2129
+
2130
+ #######Extra Backwards Compatibility Functionality#######
2131
+ sub socket_to_SSL { IO::Socket::SSL->start_SSL(@_); }
2132
+ sub socketToSSL { IO::Socket::SSL->start_SSL(@_); }
2133
+ sub kill_socket { shift->close }
2134
+
2135
+ sub issuer_name { return(shift()->peer_certificate("issuer")) }
2136
+ sub subject_name { return(shift()->peer_certificate("subject")) }
2137
+ sub get_peer_certificate { return shift() }
2138
+
2139
+ sub context_init {
2140
+ return($GLOBAL_SSL_ARGS = (ref($_[0]) eq 'HASH') ? $_[0] : {@_});
2141
+ }
2142
+
2143
+ sub set_default_context {
2144
+ $GLOBAL_SSL_ARGS->{'SSL_reuse_ctx'} = shift;
2145
+ }
2146
+
2147
+ sub set_default_session_cache {
2148
+ $GLOBAL_SSL_ARGS->{SSL_session_cache} = shift;
2149
+ }
2150
+
2151
+
2152
+ {
2153
+ my $set_defaults = sub {
2154
+ my $args = shift;
2155
+ for(my $i=0;$i<@$args;$i+=2 ) {
2156
+ my ($k,$v) = @{$args}[$i,$i+1];
2157
+ if ( $k =~m{^SSL_} ) {
2158
+ $_->{$k} = $v for(@_);
2159
+ } elsif ( $k =~m{^(name|scheme)$} ) {
2160
+ $_->{"SSL_verifycn_$k"} = $v for (@_);
2161
+ } elsif ( $k =~m{^(callback|mode)$} ) {
2162
+ $_->{"SSL_verify_$k"} = $v for(@_);
2163
+ } else {
2164
+ $_->{"SSL_$k"} = $v for(@_);
2165
+ }
2166
+ }
2167
+ };
2168
+ sub set_defaults {
2169
+ my %args = @_;
2170
+ $set_defaults->(\@_,
2171
+ $GLOBAL_SSL_ARGS,
2172
+ $GLOBAL_SSL_CLIENT_ARGS,
2173
+ $GLOBAL_SSL_SERVER_ARGS
2174
+ );
2175
+ }
2176
+ { # deprecated API
2177
+ no warnings;
2178
+ *set_ctx_defaults = \&set_defaults;
2179
+ }
2180
+ sub set_client_defaults {
2181
+ my %args = @_;
2182
+ $set_defaults->(\@_, $GLOBAL_SSL_CLIENT_ARGS );
2183
+ }
2184
+ sub set_server_defaults {
2185
+ my %args = @_;
2186
+ $set_defaults->(\@_, $GLOBAL_SSL_SERVER_ARGS );
2187
+ }
2188
+ }
2189
+
2190
+ sub set_args_filter_hack {
2191
+ my $sub = shift;
2192
+ if ( ref $sub ) {
2193
+ $FILTER_SSL_ARGS = $sub;
2194
+ } elsif ( $sub eq 'use_defaults' ) {
2195
+ # override args with defaults
2196
+ $FILTER_SSL_ARGS = sub {
2197
+ my ($is_server,$args) = @_;
2198
+ %$args = ( %$args, $is_server
2199
+ ? ( %DEFAULT_SSL_SERVER_ARGS, %$GLOBAL_SSL_SERVER_ARGS )
2200
+ : ( %DEFAULT_SSL_CLIENT_ARGS, %$GLOBAL_SSL_CLIENT_ARGS )
2201
+ );
2202
+ }
2203
+ }
2204
+ }
2205
+
2206
+ sub next_proto_negotiated {
2207
+ my $self = shift;
2208
+ return $self->_internal_error("NPN not supported in Net::SSLeay",9) if ! $can_npn;
2209
+ my $ssl = $self->_get_ssl_object || return;
2210
+ return Net::SSLeay::P_next_proto_negotiated($ssl);
2211
+ }
2212
+
2213
+ sub alpn_selected {
2214
+ my $self = shift;
2215
+ return $self->_internal_error("ALPN not supported in Net::SSLeay",9) if ! $can_alpn;
2216
+ my $ssl = $self->_get_ssl_object || return;
2217
+ return Net::SSLeay::P_alpn_selected($ssl);
2218
+ }
2219
+
2220
+ sub opened {
2221
+ my $self = shift;
2222
+ return IO::Handle::opened($self) && ${*$self}{'_SSL_opened'};
2223
+ }
2224
+
2225
+ sub opening {
2226
+ my $self = shift;
2227
+ return ${*$self}{'_SSL_opening'};
2228
+ }
2229
+
2230
+ sub want_read { shift->errstr == SSL_WANT_READ }
2231
+ sub want_write { shift->errstr == SSL_WANT_WRITE }
2232
+
2233
+
2234
+ #Redundant IO::Handle functionality
2235
+ sub getline { return(scalar shift->readline()) }
2236
+ sub getlines {
2237
+ return(shift->readline()) if wantarray();
2238
+ croak("Use of getlines() not allowed in scalar context");
2239
+ }
2240
+
2241
+ #Useless IO::Handle functionality
2242
+ sub truncate { croak("Use of truncate() not allowed with SSL") }
2243
+ sub stat { croak("Use of stat() not allowed with SSL" ) }
2244
+ sub setbuf { croak("Use of setbuf() not allowed with SSL" ) }
2245
+ sub setvbuf { croak("Use of setvbuf() not allowed with SSL" ) }
2246
+ sub fdopen { croak("Use of fdopen() not allowed with SSL" ) }
2247
+
2248
+ #Unsupported socket functionality
2249
+ sub ungetc { croak("Use of ungetc() not implemented in IO::Socket::SSL") }
2250
+ sub send { croak("Use of send() not implemented in IO::Socket::SSL; use print/printf/syswrite instead") }
2251
+ sub recv { croak("Use of recv() not implemented in IO::Socket::SSL; use read/sysread instead") }
2252
+
2253
+ package IO::Socket::SSL::SSL_HANDLE;
2254
+ use strict;
2255
+ use Errno 'EBADF';
2256
+ *weaken = *IO::Socket::SSL::weaken;
2257
+
2258
+ sub TIEHANDLE {
2259
+ my ($class, $handle) = @_;
2260
+ weaken($handle);
2261
+ bless \$handle, $class;
2262
+ }
2263
+
2264
+ sub READ { ${shift()}->sysread(@_) }
2265
+ sub READLINE { ${shift()}->readline(@_) }
2266
+ sub GETC { ${shift()}->getc(@_) }
2267
+
2268
+ sub PRINT { ${shift()}->print(@_) }
2269
+ sub PRINTF { ${shift()}->printf(@_) }
2270
+ sub WRITE { ${shift()}->syswrite(@_) }
2271
+
2272
+ sub FILENO { ${shift()}->fileno(@_) }
2273
+
2274
+ sub TELL { $! = EBADF; return -1 }
2275
+ sub BINMODE { return 0 } # not perfect, but better than not implementing the method
2276
+
2277
+ sub CLOSE { #<---- Do not change this function!
2278
+ my $ssl = ${$_[0]};
2279
+ local @_;
2280
+ $ssl->close();
2281
+ }
2282
+
2283
+
2284
+ package IO::Socket::SSL::SSL_Context;
2285
+ use Carp;
2286
+ use strict;
2287
+
2288
+ my %CTX_CREATED_IN_THIS_THREAD;
2289
+ *DEBUG = *IO::Socket::SSL::DEBUG;
2290
+ *_errstack = \&IO::Socket::SSL::_errstack;
2291
+
2292
+ use constant SSL_MODE_ENABLE_PARTIAL_WRITE => 1;
2293
+ use constant SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER => 2;
2294
+
2295
+ use constant FILETYPE_PEM => Net::SSLeay::FILETYPE_PEM();
2296
+ use constant FILETYPE_ASN1 => Net::SSLeay::FILETYPE_ASN1();
2297
+
2298
+ my $DEFAULT_SSL_OP = &Net::SSLeay::OP_ALL
2299
+ | &Net::SSLeay::OP_SINGLE_DH_USE
2300
+ | ($can_ecdh ? &Net::SSLeay::OP_SINGLE_ECDH_USE : 0);
2301
+
2302
+ # Note that the final object will actually be a reference to the scalar
2303
+ # (C-style pointer) returned by Net::SSLeay::CTX_*_new() so that
2304
+ # it can be blessed.
2305
+ sub new {
2306
+ my $class = shift;
2307
+ #DEBUG( "$class @_" );
2308
+ my $arg_hash = (ref($_[0]) eq 'HASH') ? $_[0] : {@_};
2309
+
2310
+ my $is_server = $arg_hash->{SSL_server};
2311
+ my %defaults = $is_server
2312
+ ? (%DEFAULT_SSL_SERVER_ARGS, %$GLOBAL_SSL_ARGS, %$GLOBAL_SSL_SERVER_ARGS)
2313
+ : (%DEFAULT_SSL_CLIENT_ARGS, %$GLOBAL_SSL_ARGS, %$GLOBAL_SSL_CLIENT_ARGS);
2314
+ if ( $defaults{SSL_reuse_ctx} ) {
2315
+ # ignore default context if there are args to override it
2316
+ delete $defaults{SSL_reuse_ctx}
2317
+ if grep { m{^SSL_(?!verifycn_name|hostname)$} } keys %$arg_hash;
2318
+ }
2319
+ %$arg_hash = ( %defaults, %$arg_hash ) if %defaults;
2320
+
2321
+ if (my $ctx = $arg_hash->{'SSL_reuse_ctx'}) {
2322
+ if ($ctx->isa('IO::Socket::SSL::SSL_Context') and
2323
+ $ctx->{context}) {
2324
+ # valid context
2325
+ } elsif ( $ctx = ${*$ctx}{_SSL_ctx} ) {
2326
+ # reuse context from existing SSL object
2327
+ }
2328
+ return $ctx
2329
+ }
2330
+
2331
+ # common problem forgetting to set SSL_use_cert
2332
+ # if client cert is given by user but SSL_use_cert is undef, assume that it
2333
+ # should be set
2334
+ if ( ! $is_server && ! defined $arg_hash->{SSL_use_cert}
2335
+ && ( grep { $arg_hash->{$_} } qw(SSL_cert SSL_cert_file))
2336
+ && ( grep { $arg_hash->{$_} } qw(SSL_key SSL_key_file)) ) {
2337
+ $arg_hash->{SSL_use_cert} = 1
2338
+ }
2339
+
2340
+ # if any of SSL_ca* is set don't set the other SSL_ca*
2341
+ # from defaults
2342
+ if ( $arg_hash->{SSL_ca} ) {
2343
+ $arg_hash->{SSL_ca_file} ||= undef
2344
+ $arg_hash->{SSL_ca_path} ||= undef
2345
+ } elsif ( $arg_hash->{SSL_ca_path} ) {
2346
+ $arg_hash->{SSL_ca_file} ||= undef
2347
+ } elsif ( $arg_hash->{SSL_ca_file} ) {
2348
+ $arg_hash->{SSL_ca_path} ||= undef;
2349
+ }
2350
+
2351
+ # add library defaults
2352
+ $arg_hash->{SSL_use_cert} = $is_server if ! defined $arg_hash->{SSL_use_cert};
2353
+
2354
+
2355
+ # Avoid passing undef arguments to Net::SSLeay
2356
+ defined($arg_hash->{$_}) or delete($arg_hash->{$_}) for(keys %$arg_hash);
2357
+
2358
+ # check SSL CA, cert etc arguments
2359
+ # some apps set keys '' to signal that it is not set, replace with undef
2360
+ for (qw( SSL_cert SSL_cert_file SSL_key SSL_key_file
2361
+ SSL_ca SSL_ca_file SSL_ca_path
2362
+ SSL_fingerprint )) {
2363
+ $arg_hash->{$_} = undef if defined $arg_hash->{$_}
2364
+ and $arg_hash->{$_} eq '';
2365
+ }
2366
+ for(qw(SSL_cert_file SSL_key_file)) {
2367
+ defined( my $file = $arg_hash->{$_} ) or next;
2368
+ for my $f (ref($file) eq 'HASH' ? values(%$file):$file ) {
2369
+ die "$_ $f can't be used: $!" if ! open(my $fh,'<',$f)
2370
+ }
2371
+ }
2372
+
2373
+ my $verify_mode = $arg_hash->{SSL_verify_mode} || 0;
2374
+ if ( $verify_mode != $Net_SSLeay_VERIFY_NONE) {
2375
+ for (qw(SSL_ca_file SSL_ca_path)) {
2376
+ $CHECK_SSL_PATH->($_ => $arg_hash->{$_} || next);
2377
+ }
2378
+ } elsif ( $verify_mode ne '0' ) {
2379
+ # some users use the string 'SSL_VERIFY_PEER' instead of the constant
2380
+ die "SSL_verify_mode must be a number and not a string";
2381
+ }
2382
+
2383
+ my $self = bless {},$class;
2384
+
2385
+ my $vcn_scheme = delete $arg_hash->{SSL_verifycn_scheme};
2386
+ my $vcn_publicsuffix = delete $arg_hash->{SSL_verifycn_publicsuffix};
2387
+ if ( ! $is_server and $verify_mode & 0x01 and
2388
+ ! $vcn_scheme || $vcn_scheme ne 'none' ) {
2389
+
2390
+ # gets updated during configure_SSL
2391
+ my $verify_name;
2392
+ $self->{verify_name_ref} = \$verify_name;
2393
+
2394
+ my $vcb = $arg_hash->{SSL_verify_callback};
2395
+ $arg_hash->{SSL_verify_callback} = sub {
2396
+ my ($ok,$ctx_store,$certname,$error,$cert,$depth) = @_;
2397
+ $ok = $vcb->($ok,$ctx_store,$certname,$error,$cert,$depth) if $vcb;
2398
+ $ok or return 0;
2399
+
2400
+ return $ok if $depth != 0;
2401
+
2402
+ my $host = $verify_name || ref($vcn_scheme) && $vcn_scheme->{callback} && 'unknown';
2403
+ if ( ! $host ) {
2404
+ if ( $vcn_scheme ) {
2405
+ IO::Socket::SSL->_internal_error(
2406
+ "Cannot determine peer hostname for verification",8);
2407
+ return 0;
2408
+ }
2409
+ warn "Cannot determine hostname of peer for verification. ".
2410
+ "Disabling default hostname verification for now. ".
2411
+ "Please specify hostname with SSL_verifycn_name and better set SSL_verifycn_scheme too.\n";
2412
+ return $ok;
2413
+ }
2414
+
2415
+
2416
+ # verify name
2417
+ my $rv = IO::Socket::SSL::verify_hostname_of_cert(
2418
+ $host,$cert,$vcn_scheme,$vcn_publicsuffix );
2419
+ if ( ! $rv ) {
2420
+ IO::Socket::SSL->_internal_error(
2421
+ "hostname verification failed",5);
2422
+ }
2423
+ return $rv;
2424
+ };
2425
+ }
2426
+
2427
+ if ($is_server) {
2428
+ if ($arg_hash->{SSL_ticket_keycb} && !$can_tckt_keycb) {
2429
+ warn "Ticket Key Callback is not supported - ignoring option SSL_ticket_keycb\n";
2430
+ delete $arg_hash->{SSL_ticket_keycb};
2431
+ }
2432
+ }
2433
+
2434
+
2435
+ my $ssl_op = $DEFAULT_SSL_OP;
2436
+
2437
+ my $ver;
2438
+ for (split(/\s*:\s*/,$arg_hash->{SSL_version})) {
2439
+ m{^(!?)(?:(SSL(?:v2|v3|v23|v2/3))|(TLSv1(?:_?[123])?))$}i
2440
+ or croak("invalid SSL_version specified");
2441
+ my $not = $1;
2442
+ ( my $v = lc($2||$3) ) =~s{^(...)}{\U$1};
2443
+ if ( $not ) {
2444
+ $ssl_op |= $SSL_OP_NO{$v};
2445
+ } else {
2446
+ croak("cannot set multiple SSL protocols in SSL_version")
2447
+ if $ver && $v ne $ver;
2448
+ $ver = $v;
2449
+ $ver =~s{/}{}; # interpret SSLv2/3 as SSLv23
2450
+ $ver =~s{(TLSv1)(\d)}{$1\_$2}; # TLSv1_1
2451
+ }
2452
+ }
2453
+
2454
+ my $ctx_new_sub =
2455
+ $ver eq 'TLSv1_3' ? $CTX_tlsv1_3_new :
2456
+ UNIVERSAL::can( 'Net::SSLeay',
2457
+ $ver eq 'SSLv2' ? 'CTX_v2_new' :
2458
+ $ver eq 'SSLv3' ? 'CTX_v3_new' :
2459
+ $ver eq 'TLSv1' ? 'CTX_tlsv1_new' :
2460
+ $ver eq 'TLSv1_1' ? 'CTX_tlsv1_1_new' :
2461
+ $ver eq 'TLSv1_2' ? 'CTX_tlsv1_2_new' :
2462
+ 'CTX_new'
2463
+ )
2464
+ or return IO::Socket::SSL->_internal_error("SSL Version $ver not supported",9);
2465
+
2466
+ # For SNI in server mode we need a separate context for each certificate.
2467
+ my %ctx;
2468
+ if ($is_server) {
2469
+ my %sni;
2470
+ for my $opt (qw(SSL_key SSL_key_file SSL_cert SSL_cert_file)) {
2471
+ my $val = $arg_hash->{$opt} or next;
2472
+ if ( ref($val) eq 'HASH' ) {
2473
+ while ( my ($host,$v) = each %$val ) {
2474
+ $sni{lc($host)}{$opt} = $v;
2475
+ }
2476
+ }
2477
+ }
2478
+ while (my ($host,$v) = each %sni) {
2479
+ $ctx{$host} = $host =~m{%} ? $v : { %$arg_hash, %$v };
2480
+ }
2481
+ }
2482
+ $ctx{''} = $arg_hash if ! %ctx;
2483
+
2484
+ for my $host (sort keys %ctx) {
2485
+ my $arg_hash = delete $ctx{$host};
2486
+ my $ctx;
2487
+ if ($host =~m{^([^%]*)%}) {
2488
+ $ctx = $ctx{$1} or return IO::Socket::SSL->error(
2489
+ "SSL Context init for $host failed - no config for $1");
2490
+ if (my @k = grep { !m{^SSL_(?:cert|key)(?:_file)?$} }
2491
+ keys %$arg_hash) {
2492
+ return IO::Socket::SSL->error(
2493
+ "invalid keys @k in configuration '$host' of additional certs");
2494
+ }
2495
+ $can_multi_cert or return IO::Socket::SSL->error(
2496
+ "no support for both RSA and ECC certificate in same context");
2497
+ $host = $1;
2498
+ goto just_configure_certs;
2499
+ }
2500
+
2501
+ $ctx = $ctx_new_sub->() or return
2502
+ IO::Socket::SSL->error("SSL Context init failed");
2503
+ $CTX_CREATED_IN_THIS_THREAD{$ctx} = 1 if $use_threads;
2504
+ $ctx{$host} = $ctx; # replace value in %ctx with real context
2505
+
2506
+ # SSL_OP_CIPHER_SERVER_PREFERENCE
2507
+ $ssl_op |= 0x00400000 if $arg_hash->{SSL_honor_cipher_order};
2508
+
2509
+ if ($ver eq 'SSLv23' && !($ssl_op & $SSL_OP_NO{SSLv3})) {
2510
+ # At least LibreSSL disables SSLv3 by default in SSL_CTX_new.
2511
+ # If we really want SSL3.0 we need to explicitly allow it with
2512
+ # SSL_CTX_clear_options.
2513
+ Net::SSLeay::CTX_clear_options($ctx,$SSL_OP_NO{SSLv3});
2514
+ }
2515
+
2516
+ Net::SSLeay::CTX_set_options($ctx,$ssl_op);
2517
+
2518
+ # enable X509_V_FLAG_PARTIAL_CHAIN if possible (OpenSSL 1.1.0+)
2519
+ $check_partial_chain && $check_partial_chain->($ctx);
2520
+
2521
+ # if we don't set session_id_context if client certificate is expected
2522
+ # client session caching will fail
2523
+ # if user does not provide explicit id just use the stringification
2524
+ # of the context
2525
+ if($arg_hash->{SSL_server} and my $id =
2526
+ $arg_hash->{SSL_session_id_context} ||
2527
+ ( $arg_hash->{SSL_verify_mode} & 0x01 ) && "$ctx" ) {
2528
+ Net::SSLeay::CTX_set_session_id_context($ctx,$id,length($id));
2529
+ }
2530
+
2531
+ # SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER makes syswrite return if at least one
2532
+ # buffer was written and not block for the rest
2533
+ # SSL_MODE_ENABLE_PARTIAL_WRITE can be necessary for non-blocking because we
2534
+ # cannot guarantee, that the location of the buffer stays constant
2535
+ Net::SSLeay::CTX_set_mode( $ctx,
2536
+ SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER |
2537
+ SSL_MODE_ENABLE_PARTIAL_WRITE |
2538
+ ($arg_hash->{SSL_mode_release_buffers} ? $ssl_mode_release_buffers : 0)
2539
+ );
2540
+
2541
+ if ( my $proto_list = $arg_hash->{SSL_npn_protocols} ) {
2542
+ return IO::Socket::SSL->_internal_error("NPN not supported in Net::SSLeay",9)
2543
+ if ! $can_npn;
2544
+ if($arg_hash->{SSL_server}) {
2545
+ # on server side SSL_npn_protocols means a list of advertised protocols
2546
+ Net::SSLeay::CTX_set_next_protos_advertised_cb($ctx, $proto_list);
2547
+ } else {
2548
+ # on client side SSL_npn_protocols means a list of preferred protocols
2549
+ # negotiation algorithm used is "as-openssl-implements-it"
2550
+ Net::SSLeay::CTX_set_next_proto_select_cb($ctx, $proto_list);
2551
+ }
2552
+ }
2553
+
2554
+ if ( my $proto_list = $arg_hash->{SSL_alpn_protocols} ) {
2555
+ return IO::Socket::SSL->_internal_error("ALPN not supported in Net::SSLeay",9)
2556
+ if ! $can_alpn;
2557
+ if($arg_hash->{SSL_server}) {
2558
+ Net::SSLeay::CTX_set_alpn_select_cb($ctx, $proto_list);
2559
+ } else {
2560
+ Net::SSLeay::CTX_set_alpn_protos($ctx, $proto_list);
2561
+ }
2562
+ }
2563
+
2564
+ if ($arg_hash->{SSL_ticket_keycb}) {
2565
+ my $cb = $arg_hash->{SSL_ticket_keycb};
2566
+ ($cb,my $arg) = ref($cb) eq 'CODE' ? ($cb):@$cb;
2567
+ Net::SSLeay::CTX_set_tlsext_ticket_getkey_cb($ctx,$cb,$arg);
2568
+ }
2569
+
2570
+ # Try to apply SSL_ca even if SSL_verify_mode is 0, so that they can be
2571
+ # used to verify OCSP responses.
2572
+ # If applying fails complain only if verify_mode != VERIFY_NONE.
2573
+ if ( $arg_hash->{SSL_ca}
2574
+ || defined $arg_hash->{SSL_ca_file}
2575
+ || defined $arg_hash->{SSL_ca_path} ) {
2576
+ my $file = $arg_hash->{SSL_ca_file};
2577
+ $file = undef if ref($file) eq 'SCALAR' && ! $$file;
2578
+ my $dir = $arg_hash->{SSL_ca_path};
2579
+ $dir = undef if ref($dir) eq 'SCALAR' && ! $$dir;
2580
+ if ( $arg_hash->{SSL_ca} ) {
2581
+ my $store = Net::SSLeay::CTX_get_cert_store($ctx);
2582
+ for (@{$arg_hash->{SSL_ca}}) {
2583
+ Net::SSLeay::X509_STORE_add_cert($store,$_) or
2584
+ return IO::Socket::SSL->error(
2585
+ "Failed to add certificate to CA store");
2586
+ }
2587
+ }
2588
+ $dir = join($OPENSSL_LIST_SEPARATOR,@$dir) if ref($dir);
2589
+ if ( $file || $dir and ! Net::SSLeay::CTX_load_verify_locations(
2590
+ $ctx, $file || '', $dir || '')) {
2591
+ return IO::Socket::SSL->error(
2592
+ "Invalid certificate authority locations")
2593
+ if $verify_mode != $Net_SSLeay_VERIFY_NONE;
2594
+ }
2595
+ } elsif ( my %ca = IO::Socket::SSL::default_ca()) {
2596
+ # no CA path given, continue with system defaults
2597
+ my $dir = $ca{SSL_ca_path};
2598
+ $dir = join($OPENSSL_LIST_SEPARATOR,@$dir) if ref($dir);
2599
+ if (! Net::SSLeay::CTX_load_verify_locations( $ctx,
2600
+ $ca{SSL_ca_file} || '',$dir || '')
2601
+ && $verify_mode != $Net_SSLeay_VERIFY_NONE) {
2602
+ return IO::Socket::SSL->error(
2603
+ "Invalid default certificate authority locations")
2604
+ }
2605
+ }
2606
+
2607
+ if ($is_server && ($verify_mode & $Net_SSLeay_VERIFY_PEER)) {
2608
+ if ($arg_hash->{SSL_client_ca}) {
2609
+ for (@{$arg_hash->{SSL_client_ca}}) {
2610
+ return IO::Socket::SSL->error(
2611
+ "Failed to add certificate to client CA list") if
2612
+ ! Net::SSLeay::CTX_add_client_CA($ctx,$_);
2613
+ }
2614
+ }
2615
+ if ($arg_hash->{SSL_client_ca_file}) {
2616
+ my $list = Net::SSLeay::load_client_CA_file(
2617
+ $arg_hash->{SSL_client_ca_file}) or
2618
+ return IO::Socket::SSL->error(
2619
+ "Failed to load certificate to client CA list");
2620
+ Net::SSLeay::CTX_set_client_CA_list($ctx,$list);
2621
+ }
2622
+ }
2623
+
2624
+ my $X509_STORE_flags = $DEFAULT_X509_STORE_flags;
2625
+ if ($arg_hash->{'SSL_check_crl'}) {
2626
+ $X509_STORE_flags |= Net::SSLeay::X509_V_FLAG_CRL_CHECK();
2627
+ if ($arg_hash->{'SSL_crl_file'}) {
2628
+ my $bio = Net::SSLeay::BIO_new_file($arg_hash->{'SSL_crl_file'}, 'r');
2629
+ my $crl = Net::SSLeay::PEM_read_bio_X509_CRL($bio);
2630
+ Net::SSLeay::BIO_free($bio);
2631
+ if ( $crl ) {
2632
+ Net::SSLeay::X509_STORE_add_crl(Net::SSLeay::CTX_get_cert_store($ctx), $crl);
2633
+ Net::SSLeay::X509_CRL_free($crl);
2634
+ } else {
2635
+ return IO::Socket::SSL->error("Invalid certificate revocation list");
2636
+ }
2637
+ }
2638
+ }
2639
+
2640
+ Net::SSLeay::X509_STORE_set_flags(
2641
+ Net::SSLeay::CTX_get_cert_store($ctx),
2642
+ $X509_STORE_flags
2643
+ ) if $X509_STORE_flags;
2644
+
2645
+ Net::SSLeay::CTX_set_default_passwd_cb($ctx,$arg_hash->{SSL_passwd_cb})
2646
+ if $arg_hash->{SSL_passwd_cb};
2647
+
2648
+ just_configure_certs:
2649
+ my ($havekey,$havecert);
2650
+ if ( my $x509 = $arg_hash->{SSL_cert} ) {
2651
+ # binary, e.g. X509*
2652
+ # we have either a single certificate or a list with
2653
+ # a chain of certificates
2654
+ my @x509 = ref($x509) eq 'ARRAY' ? @$x509: ($x509);
2655
+ my $cert = shift @x509;
2656
+ Net::SSLeay::CTX_use_certificate( $ctx,$cert )
2657
+ || return IO::Socket::SSL->error("Failed to use Certificate");
2658
+ foreach my $ca (@x509) {
2659
+ Net::SSLeay::CTX_add_extra_chain_cert( $ctx,$ca )
2660
+ || return IO::Socket::SSL->error("Failed to use Certificate");
2661
+ }
2662
+ $havecert = 'OBJ';
2663
+ } elsif ( my $f = $arg_hash->{SSL_cert_file} ) {
2664
+ # try to load chain from PEM or certificate from ASN1
2665
+ my @err;
2666
+ if (Net::SSLeay::CTX_use_certificate_chain_file($ctx,$f)) {
2667
+ $havecert = 'PEM';
2668
+ } elsif (do {
2669
+ push @err, [ PEM => _errstack() ];
2670
+ Net::SSLeay::CTX_use_certificate_file($ctx,$f,FILETYPE_ASN1)
2671
+ }) {
2672
+ $havecert = 'DER';
2673
+ } else {
2674
+ push @err, [ DER => _errstack() ];
2675
+ # try to load certificate, key and chain from PKCS12 file
2676
+ my ($key,$cert,@chain) = Net::SSLeay::P_PKCS12_load_file($f,1);
2677
+ if (!$cert and $arg_hash->{SSL_passwd_cb}
2678
+ and defined( my $pw = $arg_hash->{SSL_passwd_cb}->(0))) {
2679
+ ($key,$cert,@chain) = Net::SSLeay::P_PKCS12_load_file($f,1,$pw);
2680
+ }
2681
+ PKCS12: while ($cert) {
2682
+ Net::SSLeay::CTX_use_certificate($ctx,$cert) or last;
2683
+ # Net::SSLeay::P_PKCS12_load_file is implemented using
2684
+ # OpenSSL PKCS12_parse which according to the source code
2685
+ # returns the chain with the last CA certificate first (i.e.
2686
+ # reverse order as in the PKCS12 file). This is not
2687
+ # documented but given the age of this function we'll assume
2688
+ # that this will stay this way in the future.
2689
+ while (my $ca = pop @chain) {
2690
+ Net::SSLeay::CTX_add_extra_chain_cert($ctx,$ca)
2691
+ or last PKCS12;
2692
+ }
2693
+ last if $key && ! Net::SSLeay::CTX_use_PrivateKey($ctx,$key);
2694
+ $havecert = 'PKCS12';
2695
+ last;
2696
+ }
2697
+ $havekey = 'PKCS12' if $key;
2698
+ Net::SSLeay::X509_free($cert) if $cert;
2699
+ Net::SSLeay::EVP_PKEY_free($key) if $key;
2700
+ # don't free @chain, because CTX_add_extra_chain_cert
2701
+ # did not duplicate the certificates
2702
+ }
2703
+ if (!$havecert) {
2704
+ push @err, [ PKCS12 => _errstack() ];
2705
+ my $err = "Failed to load certificate from file $f:";
2706
+ for(@err) {
2707
+ my ($type,@e) = @$_;
2708
+ $err .= " [format:$type] @e **" if @e;
2709
+ }
2710
+ return IO::Socket::SSL->error($err);
2711
+ }
2712
+ }
2713
+
2714
+ if (!$havecert || $havekey) {
2715
+ # skip SSL_key_*
2716
+ } elsif ( my $pkey = $arg_hash->{SSL_key} ) {
2717
+ # binary, e.g. EVP_PKEY*
2718
+ Net::SSLeay::CTX_use_PrivateKey($ctx, $pkey)
2719
+ || return IO::Socket::SSL->error("Failed to use Private Key");
2720
+ $havekey = 'MEM';
2721
+ } elsif ( my $f = $arg_hash->{SSL_key_file}
2722
+ || (($havecert eq 'PEM') ? $arg_hash->{SSL_cert_file}:undef) ) {
2723
+ for my $ft ( FILETYPE_PEM, FILETYPE_ASN1 ) {
2724
+ if (Net::SSLeay::CTX_use_PrivateKey_file($ctx,$f,$ft)) {
2725
+ $havekey = ($ft == FILETYPE_PEM) ? 'PEM':'DER';
2726
+ last;
2727
+ }
2728
+ }
2729
+ $havekey or return IO::Socket::SSL->error(
2730
+ "Failed to load key from file (no PEM or DER)");
2731
+ }
2732
+
2733
+ Net::SSLeay::CTX_set_post_handshake_auth($ctx,1)
2734
+ if (!$is_server && $can_pha && $havecert && $havekey);
2735
+ }
2736
+
2737
+ if ($arg_hash->{SSL_server}) {
2738
+
2739
+ if ( my $f = $arg_hash->{SSL_dh_file} ) {
2740
+ my $bio = Net::SSLeay::BIO_new_file( $f,'r' )
2741
+ || return IO::Socket::SSL->error( "Failed to open DH file $f" );
2742
+ my $dh = Net::SSLeay::PEM_read_bio_DHparams($bio);
2743
+ Net::SSLeay::BIO_free($bio);
2744
+ $dh || return IO::Socket::SSL->error( "Failed to read PEM for DH from $f - wrong format?" );
2745
+ my $rv;
2746
+ for (values (%ctx)) {
2747
+ $rv = Net::SSLeay::CTX_set_tmp_dh( $_,$dh ) or last;
2748
+ }
2749
+ Net::SSLeay::DH_free( $dh );
2750
+ $rv || return IO::Socket::SSL->error( "Failed to set DH from $f" );
2751
+ } elsif ( my $dh = $arg_hash->{SSL_dh} ) {
2752
+ # binary, e.g. DH*
2753
+
2754
+ for( values %ctx ) {
2755
+ Net::SSLeay::CTX_set_tmp_dh( $_,$dh ) || return
2756
+ IO::Socket::SSL->error( "Failed to set DH from SSL_dh" );
2757
+ }
2758
+ }
2759
+ }
2760
+
2761
+ if ( my $curve = $arg_hash->{SSL_ecdh_curve} ) {
2762
+ return IO::Socket::SSL->_internal_error(
2763
+ "ECDH curve needs Net::SSLeay>=1.56 and OpenSSL>=1.0",9)
2764
+ if ! $can_ecdh;
2765
+
2766
+ for(values %ctx) {
2767
+ if ($arg_hash->{SSL_server} and $curve eq 'auto') {
2768
+ if ($can_ecdh eq 'can_auto') {
2769
+ Net::SSLeay::CTX_set_ecdh_auto($_,1) or
2770
+ return IO::Socket::SSL->error(
2771
+ "failed to set ECDH curve context");
2772
+ } elsif ($can_ecdh eq 'auto') {
2773
+ # automatically enabled anyway
2774
+ } else {
2775
+ return IO::Socket::SSL->error(
2776
+ "SSL_CTX_set_ecdh_auto not implemented");
2777
+ }
2778
+
2779
+ } elsif ($set_groups_list) {
2780
+ $set_groups_list->($_,$curve) or return IO::Socket::SSL->error(
2781
+ "failed to set ECDH groups/curves on context");
2782
+ # needed for OpenSSL 1.0.2 if ($can_ecdh eq 'can_auto') {
2783
+ Net::SSLeay::CTX_set_ecdh_auto($_,1) if $can_ecdh eq 'can_auto';
2784
+ } elsif ($curve =~m{:}) {
2785
+ return IO::Socket::SSL->error(
2786
+ "SSL_CTX_groups_list or SSL_CTX_curves_list not implemented");
2787
+
2788
+ } elsif ($arg_hash->{SSL_server}) {
2789
+ if ( $curve !~ /^\d+$/ ) {
2790
+ # name of curve, find NID
2791
+ $curve = Net::SSLeay::OBJ_txt2nid($curve)
2792
+ || return IO::Socket::SSL->error(
2793
+ "cannot find NID for curve name '$curve'");
2794
+ }
2795
+ my $ecdh = Net::SSLeay::EC_KEY_new_by_curve_name($curve) or
2796
+ return IO::Socket::SSL->error(
2797
+ "cannot create curve for NID $curve");
2798
+ for( values %ctx ) {
2799
+ Net::SSLeay::CTX_set_tmp_ecdh($_,$ecdh) or
2800
+ return IO::Socket::SSL->error(
2801
+ "failed to set ECDH curve context");
2802
+ }
2803
+ Net::SSLeay::EC_KEY_free($ecdh);
2804
+ }
2805
+ }
2806
+ }
2807
+
2808
+ my $verify_cb = $arg_hash->{SSL_verify_callback};
2809
+ my @accept_fp;
2810
+ if ( my $fp = $arg_hash->{SSL_fingerprint} ) {
2811
+ for( ref($fp) ? @$fp : $fp) {
2812
+ my ($algo,$pubkey,$digest) = m{^(?:([\w-]+)\$)?(pub\$)?([a-f\d:]+)$}i
2813
+ or return IO::Socket::SSL->_internal_error("invalid fingerprint '$_'",9);
2814
+ ( $digest = lc($digest) ) =~s{:}{}g;
2815
+ $algo ||=
2816
+ length($digest) == 32 ? 'md5' :
2817
+ length($digest) == 40 ? 'sha1' :
2818
+ length($digest) == 64 ? 'sha256' :
2819
+ return IO::Socket::SSL->_internal_error(
2820
+ "cannot detect hash algorithm from fingerprint '$_'",9);
2821
+ $algo = lc($algo);
2822
+ push @accept_fp,[ $algo, $pubkey || '', pack('H*',$digest) ]
2823
+ }
2824
+ }
2825
+ my $verify_fingerprint = @accept_fp && do {
2826
+ my $fail;
2827
+ sub {
2828
+ my ($ok,$cert,$depth) = @_;
2829
+ $fail = 1 if ! $ok;
2830
+ return 1 if $depth>0; # to let us continue with verification
2831
+ # Check fingerprint only from top certificate.
2832
+ my %fp;
2833
+ for(@accept_fp) {
2834
+ my $fp = $fp{$_->[0],$_->[1]} ||= $_->[1]
2835
+ ? Net::SSLeay::X509_pubkey_digest($cert,$algo2digest->($_->[0]))
2836
+ : Net::SSLeay::X509_digest($cert,$algo2digest->($_->[0]));
2837
+ next if $fp ne $_->[2];
2838
+ return 1;
2839
+ }
2840
+ return ! $fail;
2841
+ }
2842
+ };
2843
+ my $verify_callback = ( $verify_cb || @accept_fp ) && sub {
2844
+ my ($ok, $ctx_store) = @_;
2845
+ my ($certname,$cert,$error,$depth);
2846
+ if ($ctx_store) {
2847
+ $cert = Net::SSLeay::X509_STORE_CTX_get_current_cert($ctx_store);
2848
+ $error = Net::SSLeay::X509_STORE_CTX_get_error($ctx_store);
2849
+ $depth = Net::SSLeay::X509_STORE_CTX_get_error_depth($ctx_store);
2850
+ $certname =
2851
+ Net::SSLeay::X509_NAME_oneline(Net::SSLeay::X509_get_issuer_name($cert)).
2852
+ Net::SSLeay::X509_NAME_oneline(Net::SSLeay::X509_get_subject_name($cert));
2853
+ $error &&= Net::SSLeay::ERR_error_string($error);
2854
+ }
2855
+ $DEBUG>=3 && DEBUG( "ok=$ok [$depth] $certname" );
2856
+ $ok = $verify_cb->($ok,$ctx_store,$certname,$error,$cert,$depth) if $verify_cb;
2857
+ $ok = $verify_fingerprint->($ok,$cert,$depth) if $verify_fingerprint && $cert;
2858
+ return $ok;
2859
+ };
2860
+
2861
+ if ( $^O eq 'darwin' ) {
2862
+ # explicitly set error code to disable use of apples TEA patch
2863
+ # https://hynek.me/articles/apple-openssl-verification-surprises/
2864
+ my $vcb = $verify_callback;
2865
+ $verify_callback = sub {
2866
+ my $rv = $vcb ? &$vcb : $_[0];
2867
+ if ( $rv != 1 ) {
2868
+ # 50 - X509_V_ERR_APPLICATION_VERIFICATION: application verification failure
2869
+ Net::SSLeay::X509_STORE_CTX_set_error($_[1], 50);
2870
+ }
2871
+ return $rv;
2872
+ };
2873
+ }
2874
+ Net::SSLeay::CTX_set_verify($_, $verify_mode, $verify_callback)
2875
+ for (values %ctx);
2876
+
2877
+ my $staple_callback = $arg_hash->{SSL_ocsp_staple_callback};
2878
+ if ( !$is_server && $can_ocsp_staple && ! $verify_fingerprint) {
2879
+ $self->{ocsp_cache} = $arg_hash->{SSL_ocsp_cache};
2880
+ my $status_cb = sub {
2881
+ my ($ssl,$resp) = @_;
2882
+ my $iossl = $SSL_OBJECT{$ssl} or
2883
+ die "no IO::Socket::SSL object found for SSL $ssl";
2884
+ $iossl->[1] and do {
2885
+ # we must return with 1 or it will be called again
2886
+ # and because we have no SSL object we must make the error global
2887
+ Carp::cluck($IO::Socket::SSL::SSL_ERROR
2888
+ = "OCSP callback on server side");
2889
+ return 1;
2890
+ };
2891
+ $iossl = $iossl->[0];
2892
+
2893
+ # if we have a callback use this
2894
+ # callback must not free or copy $resp !!
2895
+ if ( $staple_callback ) {
2896
+ $staple_callback->($iossl,$resp);
2897
+ return 1;
2898
+ }
2899
+
2900
+ # default callback does verification
2901
+ if ( ! $resp ) {
2902
+ $DEBUG>=3 && DEBUG("did not get stapled OCSP response");
2903
+ return 1;
2904
+ }
2905
+ $DEBUG>=3 && DEBUG("got stapled OCSP response");
2906
+ my $status = Net::SSLeay::OCSP_response_status($resp);
2907
+ if ($status != Net::SSLeay::OCSP_RESPONSE_STATUS_SUCCESSFUL()) {
2908
+ $DEBUG>=3 && DEBUG("bad status of stapled OCSP response: ".
2909
+ Net::SSLeay::OCSP_response_status_str($status));
2910
+ return 1;
2911
+ }
2912
+ if (!eval { Net::SSLeay::OCSP_response_verify($ssl,$resp) }) {
2913
+ $DEBUG>=3 && DEBUG("verify of stapled OCSP response failed");
2914
+ return 1;
2915
+ }
2916
+ my (@results,$hard_error);
2917
+ my @chain = $iossl->peer_certificates;
2918
+ for my $cert (@chain) {
2919
+ my $certid = eval { Net::SSLeay::OCSP_cert2ids($ssl,$cert) };
2920
+ if (!$certid) {
2921
+ $DEBUG>=3 && DEBUG("cannot create OCSP_CERTID: $@");
2922
+ push @results,[-1,$@];
2923
+ last;
2924
+ }
2925
+ ($status) = Net::SSLeay::OCSP_response_results($resp,$certid);
2926
+ if ($status && $status->[2]) {
2927
+ my $cache = ${*$iossl}{_SSL_ctx}{ocsp_cache};
2928
+ if (!$status->[1]) {
2929
+ push @results,[1,$status->[2]{nextUpdate}];
2930
+ $cache && $cache->put($certid,$status->[2]);
2931
+ } elsif ( $status->[2]{statusType} ==
2932
+ Net::SSLeay::V_OCSP_CERTSTATUS_GOOD()) {
2933
+ push @results,[1,$status->[2]{nextUpdate}];
2934
+ $cache && $cache->put($certid,{
2935
+ %{$status->[2]},
2936
+ expire => time()+120,
2937
+ soft_error => $status->[1],
2938
+ });
2939
+ } else {
2940
+ push @results,($hard_error = [0,$status->[1]]);
2941
+ $cache && $cache->put($certid,{
2942
+ %{$status->[2]},
2943
+ hard_error => $status->[1],
2944
+ });
2945
+ }
2946
+ }
2947
+ }
2948
+ # return result of lead certificate, this should be in chain[0] and
2949
+ # thus result[0], but we better check. But if we had any hard_error
2950
+ # return this instead
2951
+ if ($hard_error) {
2952
+ ${*$iossl}{_SSL_ocsp_verify} = $hard_error;
2953
+ } elsif (@results and $chain[0] == $iossl->peer_certificate) {
2954
+ ${*$iossl}{_SSL_ocsp_verify} = $results[0];
2955
+ }
2956
+ return 1;
2957
+ };
2958
+ Net::SSLeay::CTX_set_tlsext_status_cb($_,$status_cb) for (values %ctx);
2959
+ }
2960
+
2961
+ if ( my $cl = $arg_hash->{SSL_cipher_list} ) {
2962
+ for (keys %ctx) {
2963
+ Net::SSLeay::CTX_set_cipher_list($ctx{$_}, ref($cl)
2964
+ ? $cl->{$_} || $cl->{''} || $DEFAULT_SSL_ARGS{SSL_cipher_list} || next
2965
+ : $cl
2966
+ ) || return IO::Socket::SSL->error("Failed to set SSL cipher list");
2967
+ }
2968
+ }
2969
+ if ( my $cl = $arg_hash->{SSL_ciphersuites} ) {
2970
+ return IO::Socket::SSL->error("no support for SSL_ciphersuites in Net::SSLeay")
2971
+ if ! $can_ciphersuites;
2972
+ for (keys %ctx) {
2973
+ Net::SSLeay::CTX_set_ciphersuites($ctx{$_}, ref($cl)
2974
+ ? $cl->{$_} || $cl->{''} || $DEFAULT_SSL_ARGS{SSL_cipher_list} || next
2975
+ : $cl
2976
+ ) || return IO::Socket::SSL->error("Failed to set SSL cipher list");
2977
+ }
2978
+ }
2979
+
2980
+ # Main context is default context or any other if no default context.
2981
+ my $ctx = $ctx{''} || (values %ctx)[0];
2982
+ if (keys(%ctx) > 1 || ! exists $ctx{''}) {
2983
+ $can_server_sni or return IO::Socket::SSL->_internal_error(
2984
+ "Server side SNI not supported for this openssl/Net::SSLeay",9);
2985
+
2986
+ Net::SSLeay::CTX_set_tlsext_servername_callback($ctx, sub {
2987
+ my $ssl = shift;
2988
+ my $host = Net::SSLeay::get_servername($ssl);
2989
+ $host = '' if ! defined $host;
2990
+ my $snictx = $ctx{lc($host)} || $ctx{''} or do {
2991
+ $DEBUG>1 and DEBUG(
2992
+ "cannot get context from servername '$host'");
2993
+ return 2; # SSL_TLSEXT_ERR_ALERT_FATAL
2994
+ };
2995
+ $DEBUG>1 and DEBUG("set context from servername $host");
2996
+ Net::SSLeay::set_SSL_CTX($ssl,$snictx) if $snictx != $ctx;
2997
+ return 0; # SSL_TLSEXT_ERR_OK
2998
+ });
2999
+ }
3000
+
3001
+ if ( my $cb = $arg_hash->{SSL_create_ctx_callback} ) {
3002
+ $cb->($_) for values (%ctx);
3003
+ }
3004
+
3005
+ $self->{context} = $ctx;
3006
+ $self->{verify_mode} = $arg_hash->{SSL_verify_mode};
3007
+ $self->{ocsp_mode} =
3008
+ defined($arg_hash->{SSL_ocsp_mode}) ? $arg_hash->{SSL_ocsp_mode} :
3009
+ $self->{verify_mode} ? IO::Socket::SSL::SSL_OCSP_TRY_STAPLE() :
3010
+ 0;
3011
+ $DEBUG>=3 && DEBUG( "new ctx $ctx" );
3012
+
3013
+ if ( my $cache = $arg_hash->{SSL_session_cache} ) {
3014
+ # use predefined cache
3015
+ $self->{session_cache} = $cache
3016
+ } elsif ( my $size = $arg_hash->{SSL_session_cache_size}) {
3017
+ $self->{session_cache} = IO::Socket::SSL::Session_Cache->new( $size );
3018
+ }
3019
+
3020
+
3021
+ if ($self->{session_cache} and %sess_cb) {
3022
+ Net::SSLeay::CTX_set_session_cache_mode($ctx,
3023
+ Net::SSLeay::SESS_CACHE_CLIENT());
3024
+ my $cache = $self->{session_cache};
3025
+ $sess_cb{new}($ctx, sub {
3026
+ my ($ssl,$session) = @_;
3027
+ my $self = ($SSL_OBJECT{$ssl} || do {
3028
+ warn "callback session new: no known SSL object for $ssl";
3029
+ return;
3030
+ })->[0];
3031
+ my $args = ${*$self}{_SSL_arguments};
3032
+ my $key = $args->{SSL_session_key} or do {
3033
+ warn "callback session new: no known SSL_session_key for $ssl";
3034
+ return;
3035
+ };
3036
+ $DEBUG>=3 && DEBUG("callback session new <$key> $session");
3037
+ Net::SSLeay::SESSION_up_ref($session);
3038
+ $cache->add_session($key,$session);
3039
+ });
3040
+ $sess_cb{remove}($ctx, sub {
3041
+ my ($ctx,$session) = @_;
3042
+ $DEBUG>=3 && DEBUG("callback session remove $session");
3043
+ $cache->del_session(undef,$session);
3044
+ });
3045
+ }
3046
+
3047
+ return $self;
3048
+ }
3049
+
3050
+
3051
+ sub has_session_cache {
3052
+ return defined shift->{session_cache};
3053
+ }
3054
+
3055
+
3056
+ sub CLONE { %CTX_CREATED_IN_THIS_THREAD = (); }
3057
+ sub DESTROY {
3058
+ my $self = shift;
3059
+ if ( my $ctx = $self->{context} ) {
3060
+ $DEBUG>=3 && DEBUG("free ctx $ctx open=".join( " ",keys %CTX_CREATED_IN_THIS_THREAD ));
3061
+ if (!$use_threads or delete $CTX_CREATED_IN_THIS_THREAD{$ctx} ) {
3062
+ # remove any verify callback for this context
3063
+ if ( $self->{verify_mode}) {
3064
+ $DEBUG>=3 && DEBUG("free ctx $ctx callback" );
3065
+ Net::SSLeay::CTX_set_verify($ctx, 0,undef);
3066
+ }
3067
+ if ( $self->{ocsp_error_ref}) {
3068
+ $DEBUG>=3 && DEBUG("free ctx $ctx tlsext_status_cb" );
3069
+ Net::SSLeay::CTX_set_tlsext_status_cb($ctx,undef);
3070
+ }
3071
+ $DEBUG>=3 && DEBUG("OK free ctx $ctx" );
3072
+ Net::SSLeay::CTX_free($ctx);
3073
+ }
3074
+ }
3075
+ delete(@{$self}{'context','session_cache'});
3076
+ }
3077
+
3078
+ package IO::Socket::SSL::Session_Cache;
3079
+ *DEBUG = *IO::Socket::SSL::DEBUG;
3080
+ use constant {
3081
+ SESSION => 0,
3082
+ KEY => 1,
3083
+ GNEXT => 2,
3084
+ GPREV => 3,
3085
+ SNEXT => 4,
3086
+ SPREV => 5,
3087
+ };
3088
+
3089
+ sub new {
3090
+ my ($class, $size) = @_;
3091
+ $size>0 or return;
3092
+ return bless {
3093
+ room => $size,
3094
+ ghead => undef,
3095
+ shead => {},
3096
+ }, $class;
3097
+ }
3098
+
3099
+ sub add_session {
3100
+ my ($self, $key, $session) = @_;
3101
+
3102
+ # create new
3103
+ my $v = [];
3104
+ $v->[SESSION] = $session;
3105
+ $v->[KEY] = $key;
3106
+ $DEBUG>=3 && DEBUG("add_session($key,$session)");
3107
+ _add_entry($self,$v);
3108
+ }
3109
+
3110
+ sub replace_session {
3111
+ my ($self, $key, $session) = @_;
3112
+ $self->del_session($key);
3113
+ $self->add_session($key, $session);
3114
+ }
3115
+
3116
+ sub del_session {
3117
+ my ($self, $key, $session) = @_;
3118
+ my ($head,$inext) = $key
3119
+ ? ($self->{shead}{$key},SNEXT) : ($self->{ghead},GNEXT);
3120
+ my $v = $head;
3121
+ my @del;
3122
+ while ($v) {
3123
+ if (!$session) {
3124
+ push @del,$v
3125
+ } elsif ($v->[SESSION] == $session) {
3126
+ push @del, $v;
3127
+ last;
3128
+ }
3129
+ $v = $v->[$inext];
3130
+ last if $v == $head;
3131
+ }
3132
+ $DEBUG>=3 && DEBUG("del_session("
3133
+ . ($key ? $key : "undef")
3134
+ . ($session ? ",$session) -> " : ") -> ")
3135
+ . (~~@del || 'none'));
3136
+ for (@del) {
3137
+ _del_entry($self,$_);
3138
+ Net::SSLeay::SESSION_free($_->[SESSION]) if $_->[SESSION];
3139
+ @$_ = ();
3140
+ }
3141
+ return ~~@del;
3142
+ }
3143
+
3144
+ sub get_session {
3145
+ my ($self, $key, $session) = @_;
3146
+ my $v = $self->{shead}{$key};
3147
+ if ($session) {
3148
+ my $shead = $v;
3149
+ while ($v) {
3150
+ $DEBUG>=3 && DEBUG("check $session - $v->[SESSION]");
3151
+ last if $v->[SESSION] == $session;
3152
+ $v = $v->[SNEXT];
3153
+ $v = undef if $v == $shead; # session not found
3154
+ }
3155
+ }
3156
+ if ($v) {
3157
+ _del_entry($self, $v); # remove
3158
+ _add_entry($self, $v); # and add back on top
3159
+ }
3160
+ $DEBUG>=3 && DEBUG("get_session($key"
3161
+ . ( $session ? ",$session) -> " : ") -> ")
3162
+ . ($v? $v->[SESSION]:"none"));
3163
+ return $v && $v->[SESSION];
3164
+ }
3165
+
3166
+ sub _add_entry {
3167
+ my ($self,$v) = @_;
3168
+ for(
3169
+ [ SNEXT, SPREV, \$self->{shead}{$v->[KEY]} ],
3170
+ [ GNEXT, GPREV, \$self->{ghead} ],
3171
+ ) {
3172
+ my ($inext,$iprev,$rhead) = @$_;
3173
+ if ($$rhead) {
3174
+ $v->[$inext] = $$rhead;
3175
+ $v->[$iprev] = ${$rhead}->[$iprev];
3176
+ ${$rhead}->[$iprev][$inext] = $v;
3177
+ ${$rhead}->[$iprev] = $v;
3178
+ } else {
3179
+ $v->[$inext] = $v->[$iprev] = $v;
3180
+ }
3181
+ $$rhead = $v;
3182
+ }
3183
+
3184
+ $self->{room}--;
3185
+
3186
+ # drop old entries if necessary
3187
+ if ($self->{room}<0) {
3188
+ my $l = $self->{ghead}[GPREV];
3189
+ _del_entry($self,$l);
3190
+ Net::SSLeay::SESSION_free($l->[SESSION]) if $l->[SESSION];
3191
+ @$l = ();
3192
+ }
3193
+ }
3194
+
3195
+ sub _del_entry {
3196
+ my ($self,$v) = @_;
3197
+ for(
3198
+ [ SNEXT, SPREV, \$self->{shead}{$v->[KEY]} ],
3199
+ [ GNEXT, GPREV, \$self->{ghead} ],
3200
+ ) {
3201
+ my ($inext,$iprev,$rhead) = @$_;
3202
+ $$rhead or return;
3203
+ $v->[$inext][$iprev] = $v->[$iprev];
3204
+ $v->[$iprev][$inext] = $v->[$inext];
3205
+ if ($v != $$rhead) {
3206
+ # not removed from top of list
3207
+ } elsif ($v->[$inext] == $v) {
3208
+ # was only element on list, drop list
3209
+ if ($inext == SNEXT) {
3210
+ delete $self->{shead}{$v->[KEY]};
3211
+ } else {
3212
+ $$rhead = undef;
3213
+ }
3214
+ } else {
3215
+ # was top element, keep others
3216
+ $$rhead = $v->[$inext];
3217
+ }
3218
+ }
3219
+ $self->{room}++;
3220
+ }
3221
+
3222
+ sub _dump {
3223
+ my $self = shift;
3224
+
3225
+ my %v2i;
3226
+ my $v = $self->{ghead};
3227
+ while ($v) {
3228
+ exists $v2i{$v} and die;
3229
+ $v2i{$v} = int(keys %v2i);
3230
+ $v = $v->[GNEXT];
3231
+ last if $v == $self->{ghead};
3232
+ }
3233
+
3234
+ my $out = "room: $self->{room}\nghead:\n";
3235
+ $v = $self->{ghead};
3236
+ while ($v) {
3237
+ $out .= sprintf(" - [%d] <%d,%d> '%s' <%s>\n",
3238
+ $v2i{$v}, $v2i{$v->[GPREV]}, $v2i{$v->[GNEXT]},
3239
+ $v->[KEY], $v->[SESSION]);
3240
+ $v = $v->[GNEXT];
3241
+ last if $v == $self->{ghead};
3242
+ }
3243
+ $out .= "shead:\n";
3244
+ for my $key (sort keys %{$self->{shead}}) {
3245
+ $out .= " - '$key'\n";
3246
+ my $shead = $self->{shead}{$key};
3247
+ my $v = $shead;
3248
+ while ($v) {
3249
+ $out .= sprintf(" - [%d] <%d,%d> '%s' <%s>\n",
3250
+ $v2i{$v}, $v2i{$v->[SPREV]}, $v2i{$v->[SNEXT]},
3251
+ $v->[KEY], $v->[SESSION]);
3252
+ $v = $v->[SNEXT];
3253
+ last if $v == $shead;
3254
+ }
3255
+ }
3256
+ return $out;
3257
+ }
3258
+
3259
+ sub DESTROY {
3260
+ my $self = shift;
3261
+ delete $self->{shead};
3262
+ my $v = delete $self->{ghead};
3263
+ while ($v) {
3264
+ Net::SSLeay::SESSION_free($v->[SESSION]) if $v->[SESSION];
3265
+ my $next = $v->[GNEXT];
3266
+ @$v = ();
3267
+ $v = $next;
3268
+ }
3269
+ }
3270
+
3271
+
3272
+
3273
+ package IO::Socket::SSL::OCSP_Cache;
3274
+
3275
+ sub new {
3276
+ my ($class,$size) = @_;
3277
+ return bless {
3278
+ '' => { _lru => 0, size => $size || 100 }
3279
+ },$class;
3280
+ }
3281
+ sub get {
3282
+ my ($self,$id) = @_;
3283
+ my $e = $self->{$id} or return;
3284
+ $e->{_lru} = $self->{''}{_lru}++;
3285
+ if ( $e->{expire} && time()<$e->{expire}) {
3286
+ delete $self->{$id};
3287
+ return;
3288
+ }
3289
+ if ( $e->{nextUpdate} && time()<$e->{nextUpdate} ) {
3290
+ delete $self->{$id};
3291
+ return;
3292
+ }
3293
+ return $e;
3294
+ }
3295
+
3296
+ sub put {
3297
+ my ($self,$id,$e) = @_;
3298
+ $self->{$id} = $e;
3299
+ $e->{_lru} = $self->{''}{_lru}++;
3300
+ my $del = keys(%$self) - $self->{''}{size};
3301
+ if ($del>0) {
3302
+ my @k = sort { $self->{$a}{_lru} <=> $self->{$b}{_lru} } keys %$self;
3303
+ delete @{$self}{ splice(@k,0,$del) };
3304
+ }
3305
+ return $e;
3306
+ }
3307
+
3308
+ package IO::Socket::SSL::OCSP_Resolver;
3309
+ *DEBUG = *IO::Socket::SSL::DEBUG;
3310
+
3311
+ # create a new resolver
3312
+ # $ssl - the ssl object
3313
+ # $cache - OCSP_Cache object (put,get)
3314
+ # $failhard - flag if we should fail hard on OCSP problems
3315
+ # $certs - list of certs to verify
3316
+ sub new {
3317
+ my ($class,$ssl,$cache,$failhard,$certs) = @_;
3318
+ my (%todo,$done,$hard_error,@soft_error);
3319
+ for my $cert (@$certs) {
3320
+ # skip entries which have no OCSP uri or where we cannot get a certid
3321
+ # (e.g. self-signed or where we don't have the issuer)
3322
+ my $subj = Net::SSLeay::X509_NAME_oneline(Net::SSLeay::X509_get_subject_name($cert));
3323
+ my $uri = Net::SSLeay::P_X509_get_ocsp_uri($cert) or do {
3324
+ $DEBUG>2 && DEBUG("no URI for certificate $subj");
3325
+ push @soft_error,"no ocsp_uri for $subj";
3326
+ next;
3327
+ };
3328
+ my $certid = eval { Net::SSLeay::OCSP_cert2ids($ssl,$cert) } or do {
3329
+ $DEBUG>2 && DEBUG("no OCSP_CERTID for certificate $subj: $@");
3330
+ push @soft_error,"no certid for $subj: $@";
3331
+ next;
3332
+ };
3333
+ if (!($done = $cache->get($certid))) {
3334
+ push @{ $todo{$uri}{ids} }, $certid;
3335
+ push @{ $todo{$uri}{subj} }, $subj;
3336
+ } elsif ( $done->{hard_error} ) {
3337
+ # one error is enough to fail validation
3338
+ $hard_error = $done->{hard_error};
3339
+ %todo = ();
3340
+ last;
3341
+ } elsif ( $done->{soft_error} ) {
3342
+ push @soft_error,$done->{soft_error};
3343
+ }
3344
+ }
3345
+ while ( my($uri,$v) = each %todo) {
3346
+ my $ids = $v->{ids};
3347
+ $v->{req} = Net::SSLeay::i2d_OCSP_REQUEST(
3348
+ Net::SSLeay::OCSP_ids2req(@$ids));
3349
+ }
3350
+ $hard_error ||= '' if ! %todo;
3351
+ return bless {
3352
+ ssl => $ssl,
3353
+ cache => $cache,
3354
+ failhard => $failhard,
3355
+ hard_error => $hard_error,
3356
+ soft_error => @soft_error ? join("; ",@soft_error) : undef,
3357
+ todo => \%todo,
3358
+ },$class;
3359
+ }
3360
+
3361
+ # return current result, e.g. '' for no error, else error
3362
+ # if undef we have no final result yet
3363
+ sub hard_error { return shift->{hard_error} }
3364
+ sub soft_error { return shift->{soft_error} }
3365
+
3366
+ # return hash with uri => ocsp_request_data for open requests
3367
+ sub requests {
3368
+ my $todo = shift()->{todo};
3369
+ return map { ($_,$todo->{$_}{req}) } keys %$todo;
3370
+ }
3371
+
3372
+ # add new response
3373
+ sub add_response {
3374
+ my ($self,$uri,$resp) = @_;
3375
+ my $todo = delete $self->{todo}{$uri};
3376
+ return $self->{error} if ! $todo || $self->{error};
3377
+
3378
+ my ($req,@soft_error,@hard_error);
3379
+
3380
+ # do we have a response
3381
+ if (!$resp) {
3382
+ @soft_error = "http request for OCSP failed; subject: ".
3383
+ join("; ",@{$todo->{subj}});
3384
+
3385
+ # is it a valid OCSP_RESPONSE
3386
+ } elsif ( ! eval { $resp = Net::SSLeay::d2i_OCSP_RESPONSE($resp) }) {
3387
+ @soft_error = "invalid response (no OCSP_RESPONSE); subject: ".
3388
+ join("; ",@{$todo->{subj}});
3389
+ # hopefully short-time error
3390
+ $self->{cache}->put($_,{
3391
+ soft_error => "@soft_error",
3392
+ expire => time()+10,
3393
+ }) for (@{$todo->{ids}});
3394
+ # is the OCSP response status success
3395
+ } elsif (
3396
+ ( my $status = Net::SSLeay::OCSP_response_status($resp))
3397
+ != Net::SSLeay::OCSP_RESPONSE_STATUS_SUCCESSFUL()
3398
+ ){
3399
+ @soft_error = "OCSP response failed: ".
3400
+ Net::SSLeay::OCSP_response_status_str($status).
3401
+ "; subject: ".join("; ",@{$todo->{subj}});
3402
+ # hopefully short-time error
3403
+ $self->{cache}->put($_,{
3404
+ soft_error => "@soft_error",
3405
+ expire => time()+10,
3406
+ }) for (@{$todo->{ids}});
3407
+
3408
+ # does nonce match the request and can the signature be verified
3409
+ } elsif ( ! eval {
3410
+ $req = Net::SSLeay::d2i_OCSP_REQUEST($todo->{req});
3411
+ Net::SSLeay::OCSP_response_verify($self->{ssl},$resp,$req);
3412
+ }) {
3413
+ if ($@) {
3414
+ @soft_error = $@
3415
+ } else {
3416
+ my @err;
3417
+ while ( my $err = Net::SSLeay::ERR_get_error()) {
3418
+ push @soft_error, Net::SSLeay::ERR_error_string($err);
3419
+ }
3420
+ @soft_error = 'failed to verify OCSP response; subject: '.
3421
+ join("; ",@{$todo->{subj}}) if ! @soft_error;
3422
+ }
3423
+ # configuration problem or we don't know the signer
3424
+ $self->{cache}->put($_,{
3425
+ soft_error => "@soft_error",
3426
+ expire => time()+120,
3427
+ }) for (@{$todo->{ids}});
3428
+
3429
+ # extract results from response
3430
+ } elsif ( my @result =
3431
+ Net::SSLeay::OCSP_response_results($resp,@{$todo->{ids}})) {
3432
+ my (@found,@miss);
3433
+ for my $rv (@result) {
3434
+ if ($rv->[2]) {
3435
+ push @found,$rv->[0];
3436
+ if (!$rv->[1]) {
3437
+ # no error
3438
+ $self->{cache}->put($rv->[0],$rv->[2]);
3439
+ } elsif ( $rv->[2]{statusType} ==
3440
+ Net::SSLeay::V_OCSP_CERTSTATUS_GOOD()) {
3441
+ # soft error, like response after nextUpdate
3442
+ push @soft_error,$rv->[1]."; subject: ".
3443
+ join("; ",@{$todo->{subj}});
3444
+ $self->{cache}->put($rv->[0],{
3445
+ %{$rv->[2]},
3446
+ soft_error => "@soft_error",
3447
+ expire => time()+120,
3448
+ });
3449
+ } else {
3450
+ # hard error
3451
+ $self->{cache}->put($rv->[0],$rv->[2]);
3452
+ push @hard_error, $rv->[1]."; subject: ".
3453
+ join("; ",@{$todo->{subj}});
3454
+ }
3455
+ } else {
3456
+ push @miss,$rv->[0];
3457
+ }
3458
+ }
3459
+ if (@miss && @found) {
3460
+ # we sent multiple responses, but server answered only to one
3461
+ # try again
3462
+ $self->{todo}{$uri} = $todo;
3463
+ $todo->{ids} = \@miss;
3464
+ $todo->{req} = Net::SSLeay::i2d_OCSP_REQUEST(
3465
+ Net::SSLeay::OCSP_ids2req(@miss));
3466
+ $DEBUG>=2 && DEBUG("$uri just answered ".@found." of ".(@found+@miss)." requests");
3467
+ }
3468
+ } else {
3469
+ @soft_error = "no data in response; subject: ".
3470
+ join("; ",@{$todo->{subj}});
3471
+ # probably configuration problem
3472
+ $self->{cache}->put($_,{
3473
+ soft_error => "@soft_error",
3474
+ expire => time()+120,
3475
+ }) for (@{$todo->{ids}});
3476
+ }
3477
+
3478
+ Net::SSLeay::OCSP_REQUEST_free($req) if $req;
3479
+ if ($self->{failhard}) {
3480
+ push @hard_error,@soft_error;
3481
+ @soft_error = ();
3482
+ }
3483
+ if (@soft_error) {
3484
+ $self->{soft_error} .= "; " if $self->{soft_error};
3485
+ $self->{soft_error} .= "$uri: ".join('; ',@soft_error);
3486
+ }
3487
+ if (@hard_error) {
3488
+ $self->{hard_error} = "$uri: ".join('; ',@hard_error);
3489
+ %{$self->{todo}} = ();
3490
+ } elsif ( ! %{$self->{todo}} ) {
3491
+ $self->{hard_error} = ''
3492
+ }
3493
+ return $self->{hard_error};
3494
+ }
3495
+
3496
+ # make all necessary requests to get OCSP responses blocking
3497
+ sub resolve_blocking {
3498
+ my ($self,%args) = @_;
3499
+ while ( my %todo = $self->requests ) {
3500
+ eval { require HTTP::Tiny } or die "need HTTP::Tiny installed";
3501
+ # OCSP responses have their own signature, so we don't need SSL verification
3502
+ my $ua = HTTP::Tiny->new(verify_SSL => 0,%args);
3503
+ while (my ($uri,$reqdata) = each %todo) {
3504
+ $DEBUG && DEBUG("sending OCSP request to $uri");
3505
+ my $resp = $ua->request('POST',$uri, {
3506
+ headers => { 'Content-type' => 'application/ocsp-request' },
3507
+ content => $reqdata
3508
+ });
3509
+ $DEBUG && DEBUG("got OCSP response from $uri code=$resp->{status}");
3510
+ defined ($self->add_response($uri,
3511
+ $resp->{success} && $resp->{content}))
3512
+ && last;
3513
+ }
3514
+ }
3515
+ $DEBUG>=2 && DEBUG("no more open OCSP requests");
3516
+ return $self->{hard_error};
3517
+ }
3518
+
3519
+ package IO::Socket::SSL::Trace;
3520
+ *DEBUG = *IO::Socket::SSL::DEBUG;
3521
+
3522
+ # Exhaustive list of constants we need for tracing
3523
+ my %trace_constants = map { $_ => eval { Net::SSLeay->$_ } || -1 } qw(
3524
+ SSL2_VERSION
3525
+ SSL3_VERSION
3526
+ TLS1_VERSION
3527
+ TLS1_1_VERSION
3528
+ TLS1_2_VERSION
3529
+ TLS1_3_VERSION
3530
+ DTLS1_VERSION
3531
+ DTLS1_2_VERSION
3532
+ DTLS1_BAD_VER
3533
+ SSL3_RT_INNER_CONTENT_TYPE
3534
+ SSL3_RT_CHANGE_CIPHER_SPEC
3535
+ SSL3_RT_ALERT
3536
+ SSL3_RT_HEADER
3537
+ SSL3_RT_HANDSHAKE
3538
+ SSL3_RT_APPLICATION_DATA
3539
+ SSL2_MT_ERROR
3540
+ SSL2_MT_CLIENT_HELLO
3541
+ SSL2_MT_CLIENT_MASTER_KEY
3542
+ SSL2_MT_CLIENT_FINISHED
3543
+ SSL2_MT_SERVER_HELLO
3544
+ SSL2_MT_SERVER_VERIFY
3545
+ SSL2_MT_SERVER_FINISHED
3546
+ SSL2_MT_REQUEST_CERTIFICATE
3547
+ SSL2_MT_CLIENT_CERTIFICATE
3548
+ SSL3_MT_HELLO_REQUEST
3549
+ SSL3_MT_CLIENT_HELLO
3550
+ SSL3_MT_SERVER_HELLO
3551
+ SSL3_MT_NEWSESSION_TICKET
3552
+ SSL3_MT_CERTIFICATE
3553
+ SSL3_MT_SERVER_KEY_EXCHANGE
3554
+ SSL3_MT_CLIENT_KEY_EXCHANGE
3555
+ SSL3_MT_CERTIFICATE_REQUEST
3556
+ SSL3_MT_SERVER_DONE
3557
+ SSL3_MT_CERTIFICATE_VERIFY
3558
+ SSL3_MT_FINISHED
3559
+ SSL3_MT_CERTIFICATE_STATUS
3560
+ SSL3_MT_ENCRYPTED_EXTENSIONS
3561
+ SSL3_MT_SUPPLEMENTAL_DATA
3562
+ SSL3_MT_END_OF_EARLY_DATA
3563
+ SSL3_MT_KEY_UPDATE
3564
+ SSL3_MT_NEXT_PROTO
3565
+ SSL3_MT_MESSAGE_HASH
3566
+ );
3567
+
3568
+ #
3569
+ # Major versions
3570
+ #
3571
+ $trace_constants{SSL2_VERSION_MAJOR} = $trace_constants{SSL2_VERSION} >> 8;
3572
+ $trace_constants{SSL3_VERSION_MAJOR} = $trace_constants{SSL3_VERSION} >> 8;
3573
+
3574
+ #
3575
+ # Mapping between trace constant and version string
3576
+ #
3577
+ my %tc_ver2s;
3578
+ for (
3579
+ [ SSL2_VERSION => "SSLv2" ],
3580
+ [ SSL2_VERSION => "SSLv2" ],
3581
+ [ SSL3_VERSION => "SSLv3" ],
3582
+ [ TLS1_VERSION => "TLSv1.0" ],
3583
+ [ TLS1_1_VERSION => "TLSv1.1" ],
3584
+ [ TLS1_2_VERSION => "TLSv1.2" ],
3585
+ [ TLS1_3_VERSION => "TLSv1.3" ],
3586
+ [ DTLS1_VERSION => "DTLSv1.0" ],
3587
+ [ DTLS1_2_VERSION => "DTLSv1.2" ],
3588
+ [ DTLS1_BAD_VER => "DTLSv1.0 (bad)" ]
3589
+ ) {
3590
+ next if $trace_constants{$_->[0]} == -1;
3591
+ $tc_ver2s{$trace_constants{$_->[0]}} = $_->[1];
3592
+ }
3593
+
3594
+ my %tc_type2s;
3595
+ for (
3596
+ [ SSL3_RT_HEADER => "TLS header" ],
3597
+ [ SSL3_RT_CHANGE_CIPHER_SPEC => "TLS change cipher" ],
3598
+ [ SSL3_RT_ALERT => "TLS alert" ],
3599
+ [ SSL3_RT_HANDSHAKE => "TLS handshake" ],
3600
+ [ SSL3_RT_APPLICATION_DATA => "TLS app data" ]
3601
+ ) {
3602
+ next if $trace_constants{$_->[0]} == -1;
3603
+ $tc_type2s{$trace_constants{$_->[0]}} = $_->[1];
3604
+ }
3605
+
3606
+ my %tc_msgtype2s;
3607
+ for(
3608
+ [ SSL2_MT_ERROR => "Error" ],
3609
+ [ SSL2_MT_CLIENT_HELLO => "Client hello" ],
3610
+ [ SSL2_MT_CLIENT_MASTER_KEY => "Client key" ],
3611
+ [ SSL2_MT_CLIENT_FINISHED => "Client finished" ],
3612
+ [ SSL2_MT_SERVER_HELLO => "Server hello" ],
3613
+ [ SSL2_MT_SERVER_VERIFY => "Server verify" ],
3614
+ [ SSL2_MT_SERVER_FINISHED => "Server finished" ],
3615
+ [ SSL2_MT_REQUEST_CERTIFICATE => "Request CERT" ],
3616
+ [ SSL2_MT_REQUEST_CERTIFICATE => "Client CERT" ]
3617
+ ) {
3618
+ next if $trace_constants{$_->[0]} == -1;
3619
+ $tc_msgtype2s{$trace_constants{SSL2_VERSION_MAJOR}, $trace_constants{$_->[0]}} = $_->[1];
3620
+ }
3621
+ for(
3622
+ [ SSL3_MT_HELLO_REQUEST => "Hello request" ],
3623
+ [ SSL3_MT_CLIENT_HELLO => "Client hello" ],
3624
+ [ SSL3_MT_SERVER_HELLO => "Server hello" ],
3625
+ [ SSL3_MT_NEWSESSION_TICKET => "Newsession Ticket" ],
3626
+ [ SSL3_MT_CERTIFICATE => "Certificate" ],
3627
+ [ SSL3_MT_SERVER_KEY_EXCHANGE => "Server key exchange" ],
3628
+ [ SSL3_MT_CLIENT_KEY_EXCHANGE => "Client key exchange" ],
3629
+ [ SSL3_MT_CERTIFICATE_REQUEST => "Request CERT" ],
3630
+ [ SSL3_MT_SERVER_DONE => "Server finished" ],
3631
+ [ SSL3_MT_CERTIFICATE_VERIFY => "CERT verify" ],
3632
+ [ SSL3_MT_FINISHED => "Finished" ],
3633
+ [ SSL3_MT_CERTIFICATE_STATUS => "Certificate Status" ],
3634
+ [ SSL3_MT_ENCRYPTED_EXTENSIONS => "Encrypted Extensions" ],
3635
+ [ SSL3_MT_SUPPLEMENTAL_DATA => "Supplemental data" ],
3636
+ [ SSL3_MT_END_OF_EARLY_DATA => "End of early data" ],
3637
+ [ SSL3_MT_KEY_UPDATE => "Key update" ],
3638
+ [ SSL3_MT_NEXT_PROTO => "Next protocol" ],
3639
+ [ SSL3_MT_MESSAGE_HASH => "Message hash" ]
3640
+ ) {
3641
+ next if $trace_constants{$_->[0]} == -1;
3642
+ $tc_msgtype2s{$trace_constants{SSL3_VERSION_MAJOR}, $trace_constants{$_->[0]}} = $_->[1];
3643
+ }
3644
+
3645
+ #
3646
+ # Translation of curl ossl_trace
3647
+ #
3648
+
3649
+ sub ossl_trace {
3650
+ $DEBUG>=2 or return;
3651
+ my ($direction, $ssl_ver, $content_type, $buf, $len, $ssl) = @_;
3652
+
3653
+ my $verstr = $tc_ver2s{$ssl_ver} || "(version=$ssl_ver)";
3654
+
3655
+ # Log progress for interesting records only (like Handshake or Alert), skip
3656
+ # all raw record headers (content_type == SSL3_RT_HEADER or ssl_ver == 0).
3657
+ # For TLS 1.3, skip notification of the decrypted inner Content-Type.
3658
+
3659
+ if ($ssl_ver
3660
+ && ($content_type != $trace_constants{SSL3_RT_HEADER})
3661
+ && ($content_type != $trace_constants{SSL3_RT_INNER_CONTENT_TYPE})
3662
+ ) {
3663
+
3664
+ # the info given when the version is zero is not that useful for us
3665
+ $ssl_ver >>= 8; # check the upper 8 bits only below */
3666
+
3667
+ # SSLv2 doesn't seem to have TLS record-type headers, so OpenSSL
3668
+ # always pass-up content-type as 0. But the interesting message-type
3669
+ # is at 'buf[0]'.
3670
+
3671
+ my $tls_rt_name = ($ssl_ver == $trace_constants{SSL3_VERSION_MAJOR} && $content_type)
3672
+ ? $tc_type2s{$content_type} || "TLS Unknown (type=$content_type)"
3673
+ : "";
3674
+
3675
+ my $msg_type;
3676
+ my $msg_name;
3677
+ if ($content_type == $trace_constants{SSL3_RT_CHANGE_CIPHER_SPEC}) {
3678
+ $msg_type = unpack('c1', $buf);
3679
+ $msg_name = "Change cipher spec";
3680
+ } elsif ($content_type == $trace_constants{SSL3_RT_ALERT}) {
3681
+ my @c = unpack('c2', $buf);
3682
+ $msg_type = ($c[0] << 8) + $c[1];
3683
+ $msg_name = eval { Net::SSLeay::SSL_alert_desc_string_long($msg_type) } || "Unknown alert";
3684
+ } else {
3685
+ $msg_type = unpack('c1', $buf);
3686
+ $msg_name = $tc_msgtype2s{$ssl_ver, $msg_type} || "Unknown (ssl_ver=$ssl_ver, msg=$msg_type)";
3687
+ }
3688
+ DEBUG(sprintf("* %s (%s), %s, %s (%d)",
3689
+ $verstr, $direction ? "OUT" : "IN", $tls_rt_name, $msg_name, $msg_type));
3690
+ }
3691
+
3692
+ #
3693
+ # Here one might want to hexdump $buf (?)
3694
+ #
3695
+ # $DEBUG>=4 && printf STDERR "%s", hexdump($buf);
3696
+ }
3697
+
3698
+
3699
+ 1;
3700
+
3701
+ __END__