redcar 0.3.2dev → 0.3.3

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 (485) hide show
  1. data/CHANGES +49 -2
  2. data/README.md +2 -7
  3. data/ROADMAP.md +8 -9
  4. data/Rakefile +29 -44
  5. data/bin/redcar +11 -2
  6. data/lib/openssl/History.txt +75 -0
  7. data/lib/openssl/License.txt +30 -0
  8. data/lib/openssl/Manifest.txt +99 -0
  9. data/lib/openssl/README.txt +24 -0
  10. data/lib/openssl/Rakefile +71 -0
  11. data/lib/openssl/build.properties.SAMPLE +7 -0
  12. data/lib/openssl/build.xml +57 -0
  13. data/lib/openssl/lib/jopenssl/version.rb +5 -0
  14. data/lib/openssl/lib/openssl.rb +24 -0
  15. data/lib/openssl/lib/openssl/bn.rb +33 -0
  16. data/lib/openssl/lib/openssl/buffering.rb +239 -0
  17. data/lib/openssl/lib/openssl/cipher.rb +56 -0
  18. data/lib/openssl/lib/openssl/digest.rb +46 -0
  19. data/lib/openssl/lib/openssl/dummy.rb +34 -0
  20. data/lib/openssl/lib/openssl/dummyssl.rb +13 -0
  21. data/lib/openssl/lib/openssl/ssl.rb +135 -0
  22. data/lib/openssl/lib/openssl/x509.rb +154 -0
  23. data/lib/openssl/mocha/COPYING +3 -0
  24. data/lib/openssl/mocha/MIT-LICENSE +7 -0
  25. data/lib/openssl/mocha/README +35 -0
  26. data/lib/openssl/mocha/RELEASE +171 -0
  27. data/lib/openssl/mocha/Rakefile +147 -0
  28. data/lib/openssl/mocha/TODO +48 -0
  29. data/lib/openssl/mocha/examples/misc.rb +36 -0
  30. data/lib/openssl/mocha/examples/mocha.rb +26 -0
  31. data/lib/openssl/mocha/examples/stubba.rb +65 -0
  32. data/lib/openssl/mocha/init.rb +3 -0
  33. data/lib/openssl/mocha/lib/mocha.rb +19 -0
  34. data/lib/openssl/mocha/lib/mocha/any_instance_method.rb +35 -0
  35. data/lib/openssl/mocha/lib/mocha/auto_verify.rb +111 -0
  36. data/lib/openssl/mocha/lib/mocha/central.rb +35 -0
  37. data/lib/openssl/mocha/lib/mocha/class_method.rb +62 -0
  38. data/lib/openssl/mocha/lib/mocha/deprecation.rb +22 -0
  39. data/lib/openssl/mocha/lib/mocha/exception_raiser.rb +17 -0
  40. data/lib/openssl/mocha/lib/mocha/expectation.rb +382 -0
  41. data/lib/openssl/mocha/lib/mocha/expectation_error.rb +6 -0
  42. data/lib/openssl/mocha/lib/mocha/expectation_list.rb +45 -0
  43. data/lib/openssl/mocha/lib/mocha/infinite_range.rb +25 -0
  44. data/lib/openssl/mocha/lib/mocha/inspect.rb +39 -0
  45. data/lib/openssl/mocha/lib/mocha/instance_method.rb +8 -0
  46. data/lib/openssl/mocha/lib/mocha/is_a.rb +9 -0
  47. data/lib/openssl/mocha/lib/mocha/metaclass.rb +7 -0
  48. data/lib/openssl/mocha/lib/mocha/missing_expectation.rb +27 -0
  49. data/lib/openssl/mocha/lib/mocha/mock.rb +200 -0
  50. data/lib/openssl/mocha/lib/mocha/multiple_yields.rb +20 -0
  51. data/lib/openssl/mocha/lib/mocha/no_yields.rb +11 -0
  52. data/lib/openssl/mocha/lib/mocha/object.rb +110 -0
  53. data/lib/openssl/mocha/lib/mocha/parameter_matchers.rb +9 -0
  54. data/lib/openssl/mocha/lib/mocha/parameter_matchers/all_of.rb +39 -0
  55. data/lib/openssl/mocha/lib/mocha/parameter_matchers/any_of.rb +44 -0
  56. data/lib/openssl/mocha/lib/mocha/parameter_matchers/anything.rb +30 -0
  57. data/lib/openssl/mocha/lib/mocha/parameter_matchers/has_entry.rb +39 -0
  58. data/lib/openssl/mocha/lib/mocha/parameter_matchers/has_key.rb +39 -0
  59. data/lib/openssl/mocha/lib/mocha/parameter_matchers/has_value.rb +39 -0
  60. data/lib/openssl/mocha/lib/mocha/parameter_matchers/includes.rb +37 -0
  61. data/lib/openssl/mocha/lib/mocha/parameter_matchers/instance_of.rb +39 -0
  62. data/lib/openssl/mocha/lib/mocha/parameter_matchers/kind_of.rb +39 -0
  63. data/lib/openssl/mocha/lib/mocha/pretty_parameters.rb +28 -0
  64. data/lib/openssl/mocha/lib/mocha/return_values.rb +31 -0
  65. data/lib/openssl/mocha/lib/mocha/setup_and_teardown.rb +23 -0
  66. data/lib/openssl/mocha/lib/mocha/single_return_value.rb +24 -0
  67. data/lib/openssl/mocha/lib/mocha/single_yield.rb +18 -0
  68. data/lib/openssl/mocha/lib/mocha/standalone.rb +32 -0
  69. data/lib/openssl/mocha/lib/mocha/stub.rb +18 -0
  70. data/lib/openssl/mocha/lib/mocha/test_case_adapter.rb +49 -0
  71. data/lib/openssl/mocha/lib/mocha/yield_parameters.rb +31 -0
  72. data/lib/openssl/mocha/lib/mocha_standalone.rb +2 -0
  73. data/lib/openssl/mocha/lib/stubba.rb +2 -0
  74. data/lib/openssl/mocha/templates/html_with_google_analytics.rb +742 -0
  75. data/lib/openssl/mocha/test/acceptance/expected_invocation_count_acceptance_test.rb +187 -0
  76. data/lib/openssl/mocha/test/acceptance/mocha_acceptance_test.rb +98 -0
  77. data/lib/openssl/mocha/test/acceptance/mocked_methods_dispatch_acceptance_test.rb +71 -0
  78. data/lib/openssl/mocha/test/acceptance/parameter_matcher_acceptance_test.rb +63 -0
  79. data/lib/openssl/mocha/test/acceptance/standalone_acceptance_test.rb +131 -0
  80. data/lib/openssl/mocha/test/acceptance/stubba_acceptance_test.rb +102 -0
  81. data/lib/openssl/mocha/test/active_record_test_case.rb +36 -0
  82. data/lib/openssl/mocha/test/deprecation_disabler.rb +15 -0
  83. data/lib/openssl/mocha/test/execution_point.rb +34 -0
  84. data/lib/openssl/mocha/test/integration/mocha_test_result_integration_test.rb +105 -0
  85. data/lib/openssl/mocha/test/integration/stubba_integration_test.rb +89 -0
  86. data/lib/openssl/mocha/test/integration/stubba_test_result_integration_test.rb +85 -0
  87. data/lib/openssl/mocha/test/method_definer.rb +18 -0
  88. data/lib/openssl/mocha/test/test_helper.rb +12 -0
  89. data/lib/openssl/mocha/test/test_runner.rb +31 -0
  90. data/lib/openssl/mocha/test/unit/any_instance_method_test.rb +124 -0
  91. data/lib/openssl/mocha/test/unit/array_inspect_test.rb +16 -0
  92. data/lib/openssl/mocha/test/unit/auto_verify_test.rb +122 -0
  93. data/lib/openssl/mocha/test/unit/central_test.rb +124 -0
  94. data/lib/openssl/mocha/test/unit/class_method_test.rb +196 -0
  95. data/lib/openssl/mocha/test/unit/date_time_inspect_test.rb +21 -0
  96. data/lib/openssl/mocha/test/unit/expectation_list_test.rb +69 -0
  97. data/lib/openssl/mocha/test/unit/expectation_raiser_test.rb +28 -0
  98. data/lib/openssl/mocha/test/unit/expectation_test.rb +399 -0
  99. data/lib/openssl/mocha/test/unit/hash_inspect_test.rb +16 -0
  100. data/lib/openssl/mocha/test/unit/infinite_range_test.rb +53 -0
  101. data/lib/openssl/mocha/test/unit/metaclass_test.rb +22 -0
  102. data/lib/openssl/mocha/test/unit/missing_expectation_test.rb +45 -0
  103. data/lib/openssl/mocha/test/unit/mock_test.rb +316 -0
  104. data/lib/openssl/mocha/test/unit/multiple_yields_test.rb +18 -0
  105. data/lib/openssl/mocha/test/unit/no_yield_test.rb +18 -0
  106. data/lib/openssl/mocha/test/unit/object_inspect_test.rb +35 -0
  107. data/lib/openssl/mocha/test/unit/object_test.rb +165 -0
  108. data/lib/openssl/mocha/test/unit/parameter_matchers/all_of_test.rb +26 -0
  109. data/lib/openssl/mocha/test/unit/parameter_matchers/any_of_test.rb +26 -0
  110. data/lib/openssl/mocha/test/unit/parameter_matchers/anything_test.rb +21 -0
  111. data/lib/openssl/mocha/test/unit/parameter_matchers/has_entry_test.rb +25 -0
  112. data/lib/openssl/mocha/test/unit/parameter_matchers/has_key_test.rb +25 -0
  113. data/lib/openssl/mocha/test/unit/parameter_matchers/has_value_test.rb +25 -0
  114. data/lib/openssl/mocha/test/unit/parameter_matchers/includes_test.rb +25 -0
  115. data/lib/openssl/mocha/test/unit/parameter_matchers/instance_of_test.rb +25 -0
  116. data/lib/openssl/mocha/test/unit/parameter_matchers/kind_of_test.rb +25 -0
  117. data/lib/openssl/mocha/test/unit/parameter_matchers/stub_matcher.rb +22 -0
  118. data/lib/openssl/mocha/test/unit/pretty_parameters_test.rb +32 -0
  119. data/lib/openssl/mocha/test/unit/return_values_test.rb +63 -0
  120. data/lib/openssl/mocha/test/unit/setup_and_teardown_test.rb +76 -0
  121. data/lib/openssl/mocha/test/unit/single_return_value_test.rb +33 -0
  122. data/lib/openssl/mocha/test/unit/single_yield_test.rb +18 -0
  123. data/lib/openssl/mocha/test/unit/string_inspect_test.rb +11 -0
  124. data/lib/openssl/mocha/test/unit/stub_test.rb +24 -0
  125. data/lib/openssl/mocha/test/unit/yield_parameters_test.rb +93 -0
  126. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/FOLDERS +53 -0
  127. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/LICENSE +340 -0
  128. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/README +117 -0
  129. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/bin/coderay +77 -0
  130. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/bin/coderay_stylesheet +4 -0
  131. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay.rb +319 -0
  132. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/duo.rb +29 -0
  133. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoder.rb +173 -0
  134. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/_map.rb +8 -0
  135. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/count.rb +21 -0
  136. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/debug.rb +46 -0
  137. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/div.rb +20 -0
  138. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/html.rb +260 -0
  139. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/html/classes.rb +77 -0
  140. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/html/css.rb +65 -0
  141. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/html/numerization.rb +122 -0
  142. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/html/output.rb +195 -0
  143. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/null.rb +26 -0
  144. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/page.rb +21 -0
  145. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/span.rb +20 -0
  146. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/statistic.rb +81 -0
  147. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/text.rb +33 -0
  148. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/tokens.rb +44 -0
  149. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/xml.rb +71 -0
  150. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/encoders/yaml.rb +22 -0
  151. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/helpers/file_type.rb +182 -0
  152. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/helpers/gzip_simple.rb +122 -0
  153. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/helpers/plugin.rb +326 -0
  154. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/helpers/word_list.rb +119 -0
  155. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/scanner.rb +238 -0
  156. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/scanners/_map.rb +15 -0
  157. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/scanners/c.rb +163 -0
  158. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/scanners/debug.rb +60 -0
  159. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/scanners/delphi.rb +149 -0
  160. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/scanners/html.rb +177 -0
  161. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/scanners/nitro_xhtml.rb +133 -0
  162. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/scanners/plaintext.rb +16 -0
  163. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/scanners/rhtml.rb +73 -0
  164. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/scanners/ruby.rb +367 -0
  165. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/scanners/ruby/patterns.rb +230 -0
  166. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/scanners/xml.rb +18 -0
  167. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/style.rb +20 -0
  168. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/styles/_map.rb +7 -0
  169. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/styles/cycnus.rb +125 -0
  170. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/styles/murphy.rb +119 -0
  171. data/lib/openssl/mocha/vendor/coderay-0.7.4.215/lib/coderay/tokens.rb +368 -0
  172. data/lib/openssl/mocha/vendor/meta_project-0.4.15/CHANGES +295 -0
  173. data/lib/openssl/mocha/vendor/meta_project-0.4.15/MIT-LICENSE +21 -0
  174. data/lib/openssl/mocha/vendor/meta_project-0.4.15/README +129 -0
  175. data/lib/openssl/mocha/vendor/meta_project-0.4.15/Rakefile +152 -0
  176. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project.rb +19 -0
  177. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/core_ext/open_uri.rb +22 -0
  178. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/core_ext/pathname.rb +36 -0
  179. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/core_ext/string.rb +5 -0
  180. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/http/multipart.rb +32 -0
  181. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/patois.rb +1 -0
  182. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/patois/parser.rb +99 -0
  183. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/project.rb +4 -0
  184. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/project/base.rb +9 -0
  185. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/project/codehaus.rb +1 -0
  186. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/project/codehaus/codehaus_project_svn.rb +31 -0
  187. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/project/trac.rb +1 -0
  188. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/project/trac/trac_project.rb +54 -0
  189. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/project/xforge.rb +5 -0
  190. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/project/xforge/ruby_forge.rb +47 -0
  191. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/project/xforge/session.rb +177 -0
  192. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/project/xforge/source_forge.rb +50 -0
  193. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/project/xforge/xfile.rb +45 -0
  194. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/project/xforge/xforge_base.rb +85 -0
  195. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/project_analyzer.rb +36 -0
  196. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/release/freshmeat.rb +267 -0
  197. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/release/raa.rb +572 -0
  198. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/scm_web.rb +2 -0
  199. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/scm_web/browser.rb +112 -0
  200. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/scm_web/pathname.rb +89 -0
  201. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/tracker.rb +6 -0
  202. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/tracker/base.rb +24 -0
  203. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/tracker/digit_issues.rb +34 -0
  204. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/tracker/issue.rb +57 -0
  205. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/tracker/jira.rb +2 -0
  206. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/tracker/jira/jira_issues.rb +35 -0
  207. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/tracker/jira/jira_tracker.rb +149 -0
  208. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/tracker/trac.rb +1 -0
  209. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/tracker/trac/trac_tracker.rb +33 -0
  210. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/tracker/xforge.rb +3 -0
  211. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/tracker/xforge/ruby_forge_tracker.rb +17 -0
  212. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/tracker/xforge/source_forge_tracker.rb +17 -0
  213. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/tracker/xforge/xforge_tracker.rb +191 -0
  214. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/meta_project/version_parser.rb +52 -0
  215. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/rake/contrib/xforge.rb +3 -0
  216. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/rake/contrib/xforge/base.rb +64 -0
  217. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/rake/contrib/xforge/news_publisher.rb +97 -0
  218. data/lib/openssl/mocha/vendor/meta_project-0.4.15/lib/rake/contrib/xforge/release.rb +134 -0
  219. data/lib/openssl/nbproject/genfiles.properties +5 -0
  220. data/lib/openssl/nbproject/jdk.xml +157 -0
  221. data/lib/openssl/nbproject/nbjdk.properties +1 -0
  222. data/lib/openssl/nbproject/nbjdk.xml +16 -0
  223. data/lib/openssl/nbproject/project.xml +117 -0
  224. data/lib/openssl/src/java/JopensslService.java +41 -0
  225. data/lib/openssl/src/java/org/jruby/ext/openssl/ASN1.java +930 -0
  226. data/lib/openssl/src/java/org/jruby/ext/openssl/Attribute.java +132 -0
  227. data/lib/openssl/src/java/org/jruby/ext/openssl/BN.java +769 -0
  228. data/lib/openssl/src/java/org/jruby/ext/openssl/BouncyCastlePEMHandler.java +69 -0
  229. data/lib/openssl/src/java/org/jruby/ext/openssl/Callable.java +10 -0
  230. data/lib/openssl/src/java/org/jruby/ext/openssl/Cipher.java +661 -0
  231. data/lib/openssl/src/java/org/jruby/ext/openssl/CipherStrings.java +1827 -0
  232. data/lib/openssl/src/java/org/jruby/ext/openssl/Config.java +49 -0
  233. data/lib/openssl/src/java/org/jruby/ext/openssl/DefaultPEMHandler.java +44 -0
  234. data/lib/openssl/src/java/org/jruby/ext/openssl/Digest.java +207 -0
  235. data/lib/openssl/src/java/org/jruby/ext/openssl/HMAC.java +183 -0
  236. data/lib/openssl/src/java/org/jruby/ext/openssl/NetscapeSPKI.java +212 -0
  237. data/lib/openssl/src/java/org/jruby/ext/openssl/OpenSSLImpl.java +341 -0
  238. data/lib/openssl/src/java/org/jruby/ext/openssl/OpenSSLReal.java +113 -0
  239. data/lib/openssl/src/java/org/jruby/ext/openssl/PEMHandler.java +40 -0
  240. data/lib/openssl/src/java/org/jruby/ext/openssl/PKCS10CertificationRequestExt.java +159 -0
  241. data/lib/openssl/src/java/org/jruby/ext/openssl/PKCS7.java +642 -0
  242. data/lib/openssl/src/java/org/jruby/ext/openssl/PKey.java +154 -0
  243. data/lib/openssl/src/java/org/jruby/ext/openssl/PKeyDH.java +401 -0
  244. data/lib/openssl/src/java/org/jruby/ext/openssl/PKeyDSA.java +419 -0
  245. data/lib/openssl/src/java/org/jruby/ext/openssl/PKeyRSA.java +762 -0
  246. data/lib/openssl/src/java/org/jruby/ext/openssl/Random.java +103 -0
  247. data/lib/openssl/src/java/org/jruby/ext/openssl/Request.java +336 -0
  248. data/lib/openssl/src/java/org/jruby/ext/openssl/SSL.java +71 -0
  249. data/lib/openssl/src/java/org/jruby/ext/openssl/SSLContext.java +358 -0
  250. data/lib/openssl/src/java/org/jruby/ext/openssl/SSLSocket.java +561 -0
  251. data/lib/openssl/src/java/org/jruby/ext/openssl/SimpleSecretKey.java +53 -0
  252. data/lib/openssl/src/java/org/jruby/ext/openssl/Utils.java +60 -0
  253. data/lib/openssl/src/java/org/jruby/ext/openssl/X509.java +108 -0
  254. data/lib/openssl/src/java/org/jruby/ext/openssl/X509CRL.java +446 -0
  255. data/lib/openssl/src/java/org/jruby/ext/openssl/X509Cert.java +520 -0
  256. data/lib/openssl/src/java/org/jruby/ext/openssl/X509Extensions.java +751 -0
  257. data/lib/openssl/src/java/org/jruby/ext/openssl/X509Name.java +405 -0
  258. data/lib/openssl/src/java/org/jruby/ext/openssl/X509Revoked.java +111 -0
  259. data/lib/openssl/src/java/org/jruby/ext/openssl/X509Store.java +282 -0
  260. data/lib/openssl/src/java/org/jruby/ext/openssl/X509StoreCtx.java +206 -0
  261. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/ASN1Registry.java +5135 -0
  262. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/Attribute.java +79 -0
  263. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/BIO.java +345 -0
  264. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/BIOFilter.java +38 -0
  265. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/Base64BIOFilter.java +84 -0
  266. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/CipherBIOFilter.java +157 -0
  267. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/Digest.java +126 -0
  268. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/EVP.java +136 -0
  269. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/EncContent.java +178 -0
  270. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/Encrypt.java +77 -0
  271. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/Envelope.java +169 -0
  272. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/IssuerAndSerial.java +35 -0
  273. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/MemBIO.java +117 -0
  274. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/MessageDigestBIOFilter.java +76 -0
  275. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/Mime.java +245 -0
  276. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/MimeHeader.java +103 -0
  277. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/MimeParam.java +69 -0
  278. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/NotVerifiedPKCS7Exception.java +38 -0
  279. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/NullSinkBIO.java +52 -0
  280. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/PKCS7.java +1276 -0
  281. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/PKCS7Data.java +168 -0
  282. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/PKCS7DataData.java +88 -0
  283. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/PKCS7DataDigest.java +64 -0
  284. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/PKCS7DataEncrypted.java +61 -0
  285. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/PKCS7DataEnveloped.java +85 -0
  286. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/PKCS7DataSigned.java +127 -0
  287. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/PKCS7DataSignedAndEnveloped.java +91 -0
  288. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/PKCS7Exception.java +68 -0
  289. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/RecipInfo.java +244 -0
  290. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/SMIME.java +281 -0
  291. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/SignEnvelope.java +202 -0
  292. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/Signed.java +345 -0
  293. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/SignerInfoWithPkey.java +365 -0
  294. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/TypeDiscriminating.java +34 -0
  295. data/lib/openssl/src/java/org/jruby/ext/openssl/impl/utils/Base64.java +1809 -0
  296. data/lib/openssl/src/java/org/jruby/ext/openssl/util/Base64Coder.java +103 -0
  297. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/CRL.java +59 -0
  298. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/Certificate.java +57 -0
  299. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/CertificateFile.java +46 -0
  300. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/CertificateHashDir.java +46 -0
  301. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/Function0.java +43 -0
  302. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/Function1.java +43 -0
  303. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/Function2.java +43 -0
  304. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/Function3.java +43 -0
  305. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/Function4.java +43 -0
  306. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/Function5.java +43 -0
  307. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/Lookup.java +560 -0
  308. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/LookupMethod.java +84 -0
  309. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/Name.java +85 -0
  310. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/PEMInputOutput.java +1210 -0
  311. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/PKey.java +41 -0
  312. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/PolicyTree.java +36 -0
  313. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/Purpose.java +475 -0
  314. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/Store.java +377 -0
  315. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/StoreContext.java +1356 -0
  316. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/Trust.java +279 -0
  317. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/VerifyParameter.java +324 -0
  318. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/X509Aux.java +43 -0
  319. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/X509AuxCertificate.java +170 -0
  320. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/X509Error.java +70 -0
  321. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/X509Object.java +88 -0
  322. data/lib/openssl/src/java/org/jruby/ext/openssl/x509store/X509Utils.java +541 -0
  323. data/lib/openssl/test/cert_with_ec_pk.cer +27 -0
  324. data/lib/openssl/test/fixture/ca_path/72fa7371.0 +19 -0
  325. data/lib/openssl/test/fixture/ca_path/verisign.pem +19 -0
  326. data/lib/openssl/test/fixture/cacert.pem +23 -0
  327. data/lib/openssl/test/fixture/cert_localhost.pem +19 -0
  328. data/lib/openssl/test/fixture/common.pem +48 -0
  329. data/lib/openssl/test/fixture/localhost_keypair.pem +18 -0
  330. data/lib/openssl/test/fixture/max.pem +29 -0
  331. data/lib/openssl/test/fixture/purpose/b70a5bc1.0 +24 -0
  332. data/lib/openssl/test/fixture/purpose/ca/PASSWD_OF_CA_KEY_IS_1234 +0 -0
  333. data/lib/openssl/test/fixture/purpose/ca/ca_config.rb +37 -0
  334. data/lib/openssl/test/fixture/purpose/ca/cacert.pem +24 -0
  335. data/lib/openssl/test/fixture/purpose/ca/newcerts/2_cert.pem +19 -0
  336. data/lib/openssl/test/fixture/purpose/ca/newcerts/3_cert.pem +19 -0
  337. data/lib/openssl/test/fixture/purpose/ca/private/cakeypair.pem +30 -0
  338. data/lib/openssl/test/fixture/purpose/ca/serial +1 -0
  339. data/lib/openssl/test/fixture/purpose/cacert.pem +24 -0
  340. data/lib/openssl/test/fixture/purpose/scripts/gen_cert.rb +127 -0
  341. data/lib/openssl/test/fixture/purpose/scripts/gen_csr.rb +50 -0
  342. data/lib/openssl/test/fixture/purpose/scripts/init_ca.rb +66 -0
  343. data/lib/openssl/test/fixture/purpose/sslclient.pem +19 -0
  344. data/lib/openssl/test/fixture/purpose/sslclient/csr.pem +10 -0
  345. data/lib/openssl/test/fixture/purpose/sslclient/keypair.pem +15 -0
  346. data/lib/openssl/test/fixture/purpose/sslclient/sslclient.pem +19 -0
  347. data/lib/openssl/test/fixture/purpose/sslserver.pem +19 -0
  348. data/lib/openssl/test/fixture/purpose/sslserver/csr.pem +10 -0
  349. data/lib/openssl/test/fixture/purpose/sslserver/keypair.pem +15 -0
  350. data/lib/openssl/test/fixture/purpose/sslserver/sslserver.pem +19 -0
  351. data/lib/openssl/test/fixture/verisign.pem +19 -0
  352. data/lib/openssl/test/fixture/verisign_c3.pem +14 -0
  353. data/lib/openssl/test/openssl/ssl_server.rb +99 -0
  354. data/lib/openssl/test/openssl/test_asn1.rb +199 -0
  355. data/lib/openssl/test/openssl/test_cipher.rb +196 -0
  356. data/lib/openssl/test/openssl/test_digest.rb +88 -0
  357. data/lib/openssl/test/openssl/test_hmac.rb +44 -0
  358. data/lib/openssl/test/openssl/test_ns_spki.rb +69 -0
  359. data/lib/openssl/test/openssl/test_pair.rb +149 -0
  360. data/lib/openssl/test/openssl/test_pkcs7.rb +160 -0
  361. data/lib/openssl/test/openssl/test_pkey_rsa.rb +49 -0
  362. data/lib/openssl/test/openssl/test_ssl.rb +413 -0
  363. data/lib/openssl/test/openssl/test_x509cert.rb +236 -0
  364. data/lib/openssl/test/openssl/test_x509crl.rb +234 -0
  365. data/lib/openssl/test/openssl/test_x509ext.rb +95 -0
  366. data/lib/openssl/test/openssl/test_x509name.rb +281 -0
  367. data/lib/openssl/test/openssl/test_x509req.rb +178 -0
  368. data/lib/openssl/test/openssl/test_x509store.rb +245 -0
  369. data/lib/openssl/test/openssl/utils.rb +135 -0
  370. data/lib/openssl/test/pkcs7_mime_enveloped.message +19 -0
  371. data/lib/openssl/test/pkcs7_mime_signed.message +30 -0
  372. data/lib/openssl/test/pkcs7_multipart_signed.message +45 -0
  373. data/lib/openssl/test/ref/compile.rb +8 -0
  374. data/lib/openssl/test/ref/pkcs1 +0 -0
  375. data/lib/openssl/test/ref/pkcs1.c +21 -0
  376. data/lib/openssl/test/test_cipher.rb +95 -0
  377. data/lib/openssl/test/test_integration.rb +139 -0
  378. data/lib/openssl/test/test_java.rb +98 -0
  379. data/lib/openssl/test/test_java_attribute.rb +25 -0
  380. data/lib/openssl/test/test_java_bio.rb +42 -0
  381. data/lib/openssl/test/test_java_mime.rb +173 -0
  382. data/lib/openssl/test/test_java_pkcs7.rb +769 -0
  383. data/lib/openssl/test/test_java_smime.rb +177 -0
  384. data/lib/openssl/test/test_openssl.rb +34 -0
  385. data/lib/openssl/test/test_openssl_x509.rb +34 -0
  386. data/lib/openssl/test/test_parse_certificate.rb +20 -0
  387. data/lib/openssl/test/test_pkey.rb +46 -0
  388. data/lib/openssl/test/test_x509store.rb +155 -0
  389. data/lib/openssl/test/ut_eof.rb +128 -0
  390. data/lib/redcar.rb +134 -8
  391. data/lib/redcar/installer.rb +46 -11
  392. data/lib/redcar/runner.rb +2 -1
  393. data/lib/redcar/usage.rb +12 -5
  394. data/lib/redcar_quick_start.rb +37 -0
  395. data/plugins/application/features/support/env.rb +9 -1
  396. data/plugins/application/icons/redcar_icon_beta.png +0 -0
  397. data/plugins/application/lib/application.rb +113 -43
  398. data/plugins/application/lib/application/clipboard.rb +28 -4
  399. data/plugins/application/lib/application/command.rb +4 -12
  400. data/plugins/application/lib/application/command/executor.rb +2 -2
  401. data/plugins/application/lib/application/keymap.rb +39 -0
  402. data/plugins/application/lib/application/keymap/builder.rb +19 -0
  403. data/plugins/application/lib/application/speedbar.rb +33 -24
  404. data/plugins/application/lib/application/tab.rb +15 -0
  405. data/plugins/application/lib/application/window.rb +28 -5
  406. data/plugins/application/spec/application/clipboard_spec.rb +20 -1
  407. data/plugins/application/spec/application/command/executor_spec.rb +7 -2
  408. data/plugins/application/spec/application/command_spec.rb +0 -5
  409. data/plugins/application/spec/application/keymap/builder_spec.rb +17 -0
  410. data/plugins/application/spec/application/menu_spec.rb +30 -0
  411. data/plugins/application/spec/application/speedbar_spec.rb +30 -6
  412. data/plugins/application/spec/application/window_spec.rb +2 -2
  413. data/plugins/application/spec/spec_helper.rb +1 -1
  414. data/plugins/application_swt/lib/application_swt.rb +3 -0
  415. data/plugins/application_swt/lib/application_swt/dialogs/filter_list_dialog_controller.rb +10 -1
  416. data/plugins/application_swt/lib/application_swt/html_tab.rb +1 -0
  417. data/plugins/application_swt/lib/application_swt/menu.rb +4 -3
  418. data/plugins/application_swt/lib/application_swt/menu/binding_translator.rb +12 -4
  419. data/plugins/application_swt/lib/application_swt/speedbar.rb +105 -19
  420. data/plugins/application_swt/lib/application_swt/swt_wrapper.rb +2 -0
  421. data/plugins/application_swt/lib/application_swt/window.rb +55 -23
  422. data/plugins/application_swt/spec/spec_helper.rb +0 -1
  423. data/plugins/auto_completer/lib/auto_completer.rb +57 -3
  424. data/plugins/auto_indenter/lib/auto_indenter.rb +1 -1
  425. data/plugins/core/lib/core.rb +5 -3
  426. data/plugins/core/lib/core/interface.rb +73 -0
  427. data/plugins/core/lib/core/model.rb +2 -0
  428. data/plugins/core/lib/core/observable.rb +12 -1
  429. data/plugins/core/lib/core/observable_struct.rb +34 -0
  430. data/plugins/core/lib/core/plugin/storage.rb +16 -3
  431. data/plugins/core/lib/core/reentry_helpers.rb +13 -0
  432. data/plugins/core/spec/core/observable_spec.rb +13 -0
  433. data/plugins/core/spec/core/storage_spec.rb +18 -0
  434. data/plugins/core/spec/spec_helper.rb +1 -0
  435. data/plugins/edit_view/features/cut_and_paste.feature +4 -2
  436. data/plugins/edit_view/features/soft_tabs.feature +243 -0
  437. data/plugins/edit_view/features/step_definitions/editing_steps.rb +91 -2
  438. data/plugins/edit_view/features/step_definitions/tab_steps.rb +1 -1
  439. data/plugins/edit_view/features/tabs.feature +146 -0
  440. data/plugins/edit_view/lib/edit_view.rb +197 -8
  441. data/plugins/edit_view/lib/edit_view/actions/arrow_keys.rb +121 -0
  442. data/plugins/edit_view/lib/edit_view/actions/deletion.rb +30 -0
  443. data/plugins/edit_view/lib/edit_view/actions/tab.rb +66 -0
  444. data/plugins/edit_view/lib/edit_view/command.rb +0 -2
  445. data/plugins/edit_view/lib/edit_view/document.rb +62 -27
  446. data/plugins/edit_view/lib/edit_view/document/command.rb +11 -0
  447. data/plugins/edit_view/lib/edit_view/edit_tab.rb +2 -1
  448. data/plugins/edit_view/lib/edit_view/info_speedbar.rb +69 -0
  449. data/plugins/edit_view/lib/edit_view/tab_settings.rb +40 -0
  450. data/plugins/edit_view/spec/edit_view/document_spec.rb +26 -0
  451. data/plugins/edit_view/spec/spec_helper.rb +0 -1
  452. data/plugins/edit_view_swt/lib/edit_view_swt.rb +57 -69
  453. data/plugins/edit_view_swt/lib/edit_view_swt/document.rb +24 -3
  454. data/plugins/edit_view_swt/lib/edit_view_swt/edit_tab.rb +23 -6
  455. data/plugins/edit_view_swt/spec/spec_helper.rb +0 -1
  456. data/plugins/edit_view_swt/vendor/java-mateview.rb +19 -2
  457. data/plugins/encryption/encryption.rb +38 -0
  458. data/plugins/encryption/ezcrypto.rb +652 -0
  459. data/plugins/encryption/jarmor-1.1.jar +0 -0
  460. data/plugins/encryption/plugin.rb +9 -0
  461. data/plugins/execute_current_tab/lib/execute_current_tab.rb +56 -0
  462. data/plugins/execute_current_tab/plugin.rb +8 -0
  463. data/plugins/html_view/lib/html_view.rb +16 -11
  464. data/plugins/plugin_manager_ui/lib/plugin_manager_ui.rb +2 -1
  465. data/plugins/plugin_manager_ui/views/index.html.erb +22 -4
  466. data/plugins/project/lib/project.rb +140 -26
  467. data/plugins/project/lib/project/drb_service.rb +75 -0
  468. data/plugins/project/lib/project/file_mirror.rb +5 -5
  469. data/plugins/project/lib/project/find_file_dialog.rb +123 -32
  470. data/plugins/project/spec/project/file_mirror_spec.rb +10 -1
  471. data/plugins/project/spec/spec_helper.rb +0 -1
  472. data/plugins/redcar/plugin.rb +1 -1
  473. data/plugins/redcar/redcar.rb +204 -109
  474. data/plugins/redcar/spec/redcar/redcar_spec.rb +70 -0
  475. data/plugins/redcar/spec/spec_helper.rb +4 -0
  476. data/plugins/repl/lib/repl.rb +14 -7
  477. data/plugins/repl/lib/repl/internal_mirror.rb +43 -22
  478. data/plugins/repl/spec/repl/internal_mirror_spec.rb +34 -7
  479. data/plugins/repl/spec/spec_helper.rb +0 -1
  480. data/plugins/tree/spec/spec_helper.rb +0 -1
  481. data/plugins/tree_view_swt/lib/tree_view_swt.rb +1 -1
  482. data/textmate/Bundles/RedcarRepl.tmbundle/Syntaxes/InternalRuby.plist +2 -18
  483. data/textmate/Bundles/asciidoc.tmbundle/Syntaxes/AsciiDoc.tmLanguage +428 -0
  484. metadata +790 -371
  485. data/lib/redcar/boot.rb +0 -108
@@ -0,0 +1,751 @@
1
+ /***** BEGIN LICENSE BLOCK *****
2
+ * Version: CPL 1.0/GPL 2.0/LGPL 2.1
3
+ *
4
+ * The contents of this file are subject to the Common Public
5
+ * License Version 1.0 (the "License"); you may not use this file
6
+ * except in compliance with the License. You may obtain a copy of
7
+ * the License at http://www.eclipse.org/legal/cpl-v10.html
8
+ *
9
+ * Software distributed under the License is distributed on an "AS
10
+ * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
11
+ * implied. See the License for the specific language governing
12
+ * rights and limitations under the License.
13
+ *
14
+ * Copyright (C) 2006, 2007 Ola Bini <ola@ologix.com>
15
+ *
16
+ * Alternatively, the contents of this file may be used under the terms of
17
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
18
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
19
+ * in which case the provisions of the GPL or the LGPL are applicable instead
20
+ * of those above. If you wish to allow use of your version of this file only
21
+ * under the terms of either the GPL or the LGPL, and not to allow others to
22
+ * use your version of this file under the terms of the CPL, indicate your
23
+ * decision by deleting the provisions above and replace them with the notice
24
+ * and other provisions required by the GPL or the LGPL. If you do not delete
25
+ * the provisions above, a recipient may use your version of this file under
26
+ * the terms of any one of the CPL, the GPL or the LGPL.
27
+ ***** END LICENSE BLOCK *****/
28
+ package org.jruby.ext.openssl;
29
+
30
+
31
+ import java.io.IOException;
32
+ import java.security.MessageDigest;
33
+ import java.util.Iterator;
34
+ import java.util.List;
35
+ import org.bouncycastle.asn1.ASN1Encodable;
36
+ import org.bouncycastle.asn1.ASN1EncodableVector;
37
+ import org.bouncycastle.asn1.ASN1InputStream;
38
+ import org.bouncycastle.asn1.ASN1Sequence;
39
+ import org.bouncycastle.asn1.DERBitString;
40
+ import org.bouncycastle.asn1.DERBoolean;
41
+ import org.bouncycastle.asn1.DEREncodable;
42
+ import org.bouncycastle.asn1.DERIA5String;
43
+ import org.bouncycastle.asn1.DERInteger;
44
+ import org.bouncycastle.asn1.DERObject;
45
+ import org.bouncycastle.asn1.DERObjectIdentifier;
46
+ import org.bouncycastle.asn1.DEROctetString;
47
+ import org.bouncycastle.asn1.DERSequence;
48
+ import org.bouncycastle.asn1.DERString;
49
+ import org.bouncycastle.asn1.DERUnknownTag;
50
+ import org.bouncycastle.asn1.x509.GeneralName;
51
+ import org.bouncycastle.asn1.x509.GeneralNames;
52
+ import org.jruby.Ruby;
53
+ import org.jruby.RubyArray;
54
+ import org.jruby.RubyClass;
55
+ import org.jruby.RubyModule;
56
+ import org.jruby.RubyNumeric;
57
+ import org.jruby.RubyObject;
58
+ import org.jruby.RubyString;
59
+ import org.jruby.anno.JRubyMethod;
60
+ import org.jruby.exceptions.RaiseException;
61
+ import org.jruby.ext.openssl.impl.ASN1Registry;
62
+ import org.jruby.runtime.Block;
63
+ import org.jruby.runtime.ObjectAllocator;
64
+ import org.jruby.runtime.ThreadContext;
65
+ import org.jruby.runtime.builtin.IRubyObject;
66
+ import org.jruby.util.ByteList;
67
+
68
+ /**
69
+ * @author <a href="mailto:ola.bini@ki.se">Ola Bini</a>
70
+ */
71
+ public class X509Extensions {
72
+ public static void createX509Ext(Ruby runtime, RubyModule mX509) {
73
+ RubyClass cX509ExtFactory = mX509.defineClassUnder("ExtensionFactory",runtime.getObject(),ExtensionFactory.ALLOCATOR);
74
+ RubyClass openSSLError = runtime.getModule("OpenSSL").getClass("OpenSSLError");
75
+ mX509.defineClassUnder("ExtensionError",openSSLError,openSSLError.getAllocator());
76
+
77
+ cX509ExtFactory.attr_reader(runtime.getCurrentContext(), new IRubyObject[]{runtime.newString("issuer_certificate"),runtime.newString("subject_certificate"),
78
+ runtime.newString("subject_request"),runtime.newString("crl"),
79
+ runtime.newString("config")});
80
+
81
+ cX509ExtFactory.defineAnnotatedMethods(ExtensionFactory.class);
82
+
83
+ RubyClass cX509Ext = mX509.defineClassUnder("Extension",runtime.getObject(),Extension.ALLOCATOR);
84
+ cX509Ext.defineAnnotatedMethods(Extension.class);
85
+ }
86
+
87
+ public static class ExtensionFactory extends RubyObject {
88
+ public static ObjectAllocator ALLOCATOR = new ObjectAllocator() {
89
+ public IRubyObject allocate(Ruby runtime, RubyClass klass) {
90
+ return new ExtensionFactory(runtime, klass);
91
+ }
92
+ };
93
+
94
+ public ExtensionFactory(Ruby runtime, RubyClass type) {
95
+ super(runtime,type);
96
+ }
97
+
98
+ @JRubyMethod(rest=true,frame=true)
99
+ public IRubyObject initialize(IRubyObject[] args, Block unusedBlock) {
100
+ org.jruby.runtime.Arity.checkArgumentCount(getRuntime(),args,0,4);
101
+ if(args.length > 0 && !args[0].isNil()) {
102
+ set_issuer_cert(args[0]);
103
+ }
104
+ if(args.length > 1 && !args[1].isNil()) {
105
+ set_subject_cert(args[1]);
106
+ }
107
+ if(args.length > 2 && !args[2].isNil()) {
108
+ set_subject_req(args[2]);
109
+ }
110
+ if(args.length > 3 && !args[3].isNil()) {
111
+ set_crl(args[3]);
112
+ }
113
+ return this;
114
+ }
115
+
116
+ @JRubyMethod(name="issuer_certificate=")
117
+ public IRubyObject set_issuer_cert(IRubyObject arg) {
118
+ setInstanceVariable("@issuer_certificate",arg);
119
+ return arg;
120
+ }
121
+
122
+ @JRubyMethod(name="subject_certificate=")
123
+ public IRubyObject set_subject_cert(IRubyObject arg) {
124
+ setInstanceVariable("@subject_certificate",arg);
125
+ return arg;
126
+ }
127
+
128
+ @JRubyMethod(name="subject_request=")
129
+ public IRubyObject set_subject_req(IRubyObject arg) {
130
+ setInstanceVariable("@subject_request",arg);
131
+ return arg;
132
+ }
133
+
134
+ @JRubyMethod(name="crl=")
135
+ public IRubyObject set_crl(IRubyObject arg) {
136
+ setInstanceVariable("@crl",arg);
137
+ return arg;
138
+ }
139
+
140
+ @JRubyMethod(name="config=")
141
+ public IRubyObject set_config(IRubyObject arg) {
142
+ setInstanceVariable("@config",arg);
143
+ return arg;
144
+ }
145
+
146
+ private DERObjectIdentifier getObjectIdentifier(String nameOrOid) {
147
+ Object val1 = ASN1.getOIDLookup(getRuntime()).get(nameOrOid.toLowerCase());
148
+ if(null != val1) {
149
+ return (DERObjectIdentifier)val1;
150
+ }
151
+ DERObjectIdentifier val2 = new DERObjectIdentifier(nameOrOid);
152
+ return val2;
153
+ }
154
+
155
+ private static boolean isHexDigit(char c) {
156
+ return ('0'<=c && c<='9') || ('A'<= c && c <= 'F') || ('a'<= c && c <= 'f');
157
+ }
158
+
159
+ private boolean isHexString(String str ){
160
+ for(int i = 0; i< str.length(); i++) {
161
+ if (!isHexDigit(str.charAt(i))) return false;
162
+ }
163
+ return true;
164
+ }
165
+
166
+ @JRubyMethod(rest=true)
167
+ public IRubyObject create_ext(IRubyObject[] args) throws Exception {
168
+ IRubyObject critical = getRuntime().getFalse();
169
+ if(org.jruby.runtime.Arity.checkArgumentCount(getRuntime(),args,2,3) == 3 && !args[2].isNil()) {
170
+ critical = args[2];
171
+ }
172
+ String oid = args[0].toString();
173
+ String valuex = args[1].toString();
174
+ Object value = valuex;
175
+
176
+ DERObjectIdentifier r_oid = null;
177
+
178
+ try {
179
+ r_oid = getObjectIdentifier(oid);
180
+ } catch(IllegalArgumentException e) {
181
+ r_oid = null;
182
+ }
183
+ if(null == r_oid) {
184
+ throw new RaiseException(getRuntime(), (RubyClass)(((RubyModule)(getRuntime().getModule("OpenSSL").getConstant("X509"))).getConstant("ExtensionError")), "unknown OID `" + oid + "'", true);
185
+ }
186
+
187
+ ThreadContext tc = getRuntime().getCurrentContext();
188
+ Extension ext = (Extension)(((RubyClass)(((RubyModule)(getRuntime().getModule("OpenSSL").getConstant("X509"))).getConstant("Extension"))).callMethod(tc,"new"));
189
+
190
+ if(valuex.startsWith("critical,")) {
191
+ critical = getRuntime().getTrue();
192
+ value = valuex.substring(9).trim();
193
+ }
194
+
195
+ if(r_oid.equals(new DERObjectIdentifier("2.5.29.14"))) { //subjectKeyIdentifier
196
+ if("hash".equalsIgnoreCase(valuex)) {
197
+ IRubyObject pkey = getInstanceVariable("@subject_certificate").callMethod(tc,"public_key");
198
+ IRubyObject val = null;
199
+ if(pkey instanceof PKeyRSA) {
200
+ val = pkey.callMethod(tc,"to_der");
201
+ } else {
202
+ val = ASN1.decode(getRuntime().getModule("OpenSSL").getConstant("ASN1"),pkey.callMethod(tc,"to_der")).callMethod(tc,"value").callMethod(tc,"[]",getRuntime().newFixnum(1)).callMethod(tc,"value");
203
+ }
204
+ byte[] b = MessageDigest.getInstance("SHA-1",OpenSSLReal.PROVIDER).digest(val.convertToString().getBytes());
205
+ value = new String(ByteList.plain(new DEROctetString(b).getDEREncoded()));
206
+ } else if(valuex.length() == 20 || !isHexString(valuex)) {
207
+ value = new String(ByteList.plain(new DEROctetString(ByteList.plain(valuex)).getDEREncoded()));
208
+ } else {
209
+ StringBuffer nstr = new StringBuffer();
210
+ for(int i = 0; i < valuex.length(); i+=2) {
211
+ if(i+1 >= valuex.length()) {
212
+ throw new RaiseException(getRuntime(), (RubyClass)(((RubyModule)(getRuntime().getModule("OpenSSL").getConstant("X509"))).getConstant("ExtensionError")), oid + " = " + value + ": odd number of digits", true);
213
+ }
214
+
215
+ char c1 = valuex.charAt(i);
216
+ char c2 = valuex.charAt(i+1);
217
+ if(isHexDigit(c1) && isHexDigit(c2)) {
218
+ nstr.append(Character.toUpperCase(c1)).append(Character.toUpperCase(c2));
219
+ } else {
220
+ throw new RaiseException(getRuntime(), (RubyClass)(((RubyModule)(getRuntime().getModule("OpenSSL").getConstant("X509"))).getConstant("ExtensionError")), oid + " = " + value + ": illegal hex digit", true);
221
+ }
222
+ while((i+2) < valuex.length() && valuex.charAt(i+2) == ':') {
223
+ i++;
224
+ }
225
+ }
226
+ String v = nstr.toString();
227
+ byte[] arr = new byte[v.length()/2];
228
+ for(int i=0;i<v.length();i+=2) {
229
+ arr[i/2] = (byte)Integer.parseInt(v.substring(i,i+2),16);
230
+ }
231
+ value = new String(ByteList.plain(new DEROctetString(arr).getDEREncoded()));
232
+ }
233
+ } else if(r_oid.equals(new DERObjectIdentifier("2.5.29.35"))) { //authorityKeyIdentifier
234
+ String ourV = valuex;
235
+ ASN1EncodableVector asnv = new ASN1EncodableVector();
236
+
237
+ if(ourV.startsWith("keyid:always")) {
238
+ ourV = ourV.substring("keyid:always".length());
239
+ IRubyObject pkey = getInstanceVariable("@issuer_certificate").callMethod(tc,"public_key");
240
+ IRubyObject val = null;
241
+ if(pkey instanceof PKeyRSA) {
242
+ val = pkey.callMethod(tc,"to_der");
243
+ } else {
244
+ val = ASN1.decode(getRuntime().getModule("OpenSSL").getConstant("ASN1"),pkey.callMethod(tc,"to_der")).callMethod(tc,"value").callMethod(tc,"[]",getRuntime().newFixnum(1)).callMethod(tc,"value");
245
+ }
246
+ byte[] b = MessageDigest.getInstance("SHA-1",OpenSSLReal.PROVIDER).digest(val.convertToString().getBytes());
247
+ asnv.add(new DEROctetString(b));
248
+ } else if(ourV.startsWith("keyid")) {
249
+ ourV = ourV.substring("keyid".length());
250
+ IRubyObject pkey = getInstanceVariable("@issuer_certificate").callMethod(tc,"public_key");
251
+ IRubyObject val = null;
252
+ if(pkey instanceof PKeyRSA) {
253
+ val = pkey.callMethod(tc,"to_der");
254
+ } else {
255
+ val = ASN1.decode(getRuntime().getModule("OpenSSL").getConstant("ASN1"),pkey.callMethod(tc,"to_der")).callMethod(tc,"value").callMethod(tc,"[]",getRuntime().newFixnum(1)).callMethod(tc,"value");
256
+ }
257
+ byte[] b = MessageDigest.getInstance("SHA-1",OpenSSLReal.PROVIDER).digest(val.convertToString().getBytes());
258
+ asnv.add(new DEROctetString(b));
259
+ }
260
+ value = new String(ByteList.plain(new DERSequence(asnv).getDEREncoded()));
261
+ } else if(r_oid.equals(new DERObjectIdentifier("2.5.29.18"))) { //issuerAltName
262
+ if(valuex.startsWith("issuer:copy")) {
263
+ List exts = ((RubyArray)getInstanceVariable("@issuer_certificate").callMethod(tc,"extensions")).getList();
264
+ for(Iterator iter = exts.iterator();iter.hasNext();) {
265
+ Extension exta = (Extension)iter.next();
266
+ if(exta.getRealOid().equals(new DERObjectIdentifier("2.5.29.17"))) {
267
+ value = exta.getRealValue();
268
+ break;
269
+ }
270
+ }
271
+ }
272
+ } else if(r_oid.equals(new DERObjectIdentifier("2.5.29.19"))) { //basicConstraints
273
+ String[] spl = valuex.split(",");
274
+ for(int i=0;i<spl.length;i++) {
275
+ spl[i] = spl[i].trim();
276
+ }
277
+ ASN1EncodableVector asnv = new ASN1EncodableVector();
278
+ for(int i=0;i<spl.length;i++) {
279
+ if(spl[i].length() > 3 && spl[i].substring(0,3).equalsIgnoreCase("CA:")) {
280
+ asnv.add(new DERBoolean("TRUE".equalsIgnoreCase(spl[i].substring(3).trim())));
281
+ }
282
+ }
283
+ for(int i=0;i<spl.length;i++) {
284
+ if(spl[i].length() > 8 && spl[i].substring(0,8).equalsIgnoreCase("pathlen:")) {
285
+ asnv.add(new DERInteger(Integer.parseInt(spl[i].substring(8).trim())));
286
+ }
287
+ }
288
+ value = new String(ByteList.plain(new DERSequence(asnv).getDEREncoded()));
289
+ } else if(r_oid.equals(new DERObjectIdentifier("2.5.29.15"))) { //keyUsage
290
+ byte[] inp = null;
291
+ inp = null;
292
+ try {
293
+ String[] exx = valuex.split(":");
294
+ if(exx != null) {
295
+ inp = new byte[exx.length];
296
+ for(int i=0;i<exx.length;i++) {
297
+ inp[i] = (byte)Integer.parseInt(exx[i],16);
298
+ }
299
+ }
300
+ } catch(Exception e) {
301
+ inp = null;
302
+ }
303
+
304
+ if(null == inp && valuex.length()<3) {
305
+ inp = ByteList.plain(valuex);
306
+ }
307
+
308
+ if(inp == null) {
309
+ byte v1 = 0;
310
+ byte v2 = 0;
311
+ String[] spl = valuex.split(",");
312
+ for(int i=0;i<spl.length;i++) {
313
+ spl[i] = spl[i].trim();
314
+ }
315
+ for(int i=0;i<spl.length;i++) {
316
+ if("decipherOnly".equals(spl[i].trim()) || "Decipher Only".equals(spl[i].trim())) {
317
+ v2 |= (byte)128;
318
+ } else if("digitalSignature".equals(spl[i].trim()) || "Digital Signature".equals(spl[i].trim())) {
319
+ v1 |= (byte)128;
320
+ } else if("nonRepudiation".equals(spl[i].trim()) || "Non Repudiation".equals(spl[i].trim())) {
321
+ v1 |= (byte)64;
322
+ } else if("keyEncipherment".equals(spl[i].trim()) || "Key Encipherment".equals(spl[i].trim())) {
323
+ v1 |= (byte)32;
324
+ } else if("dataEncipherment".equals(spl[i].trim()) || "Data Encipherment".equals(spl[i].trim())) {
325
+ v1 |= (byte)16;
326
+ } else if("keyAgreement".equals(spl[i].trim()) || "Key Agreement".equals(spl[i].trim())) {
327
+ v1 |= (byte)8;
328
+ } else if("keyCertSign".equals(spl[i].trim()) || "Key Cert Sign".equals(spl[i].trim())) {
329
+ v1 |= (byte)4;
330
+ } else if("cRLSign".equals(spl[i].trim())) {
331
+ v1 |= (byte)2;
332
+ } else if("encipherOnly".equals(spl[i].trim()) || "Encipher Only".equals(spl[i].trim())) {
333
+ v1 |= (byte)1;
334
+ } else {
335
+ throw new RaiseException(getRuntime(), (RubyClass)(((RubyModule)(getRuntime().getModule("OpenSSL").getConstant("X509"))).getConstant("ExtensionError")), oid + " = " + valuex + ": unknown bit string argument", true);
336
+ }
337
+ }
338
+ if(v2 != 0) {
339
+ inp = new byte[]{v1,v2};
340
+ } else {
341
+ inp = new byte[]{v1};
342
+ }
343
+ }
344
+
345
+ int unused = 0;
346
+ for(int i = (inp.length-1); i>-1; i--) {
347
+ if(inp[i] == 0) {
348
+ unused += 8;
349
+ } else {
350
+ byte a2 = inp[i];
351
+ int x = 8;
352
+ while(a2 != 0) {
353
+ a2 <<= 1;
354
+ x--;
355
+ }
356
+ unused += x;
357
+ break;
358
+ }
359
+ }
360
+
361
+ value = new String(ByteList.plain(new DERBitString(inp,unused).getDEREncoded()));
362
+ } else if(r_oid.equals(new DERObjectIdentifier("2.16.840.1.113730.1.1"))) { //nsCertType
363
+ byte v = 0;
364
+ if (valuex.length() < 3) {
365
+ byte[] inp = ByteList.plain(valuex);
366
+ v = inp[0];
367
+ } else {
368
+ String[] spl = valuex.split(",");
369
+ for (int i = 0; i < spl.length; i++) {
370
+ spl[i] = spl[i].trim();
371
+ }
372
+ for (int i = 0; i < spl.length; i++) {
373
+ if ("SSL Client".equals(spl[i]) || "client".equals(spl[i])) {
374
+ v |= (byte) 128;
375
+ } else if ("SSL Server".equals(spl[i]) || "server".equals(spl[i])) {
376
+ v |= (byte) 64;
377
+ } else if ("S/MIME".equals(spl[i]) || "email".equals(spl[i])) {
378
+ v |= (byte) 32;
379
+ } else if ("Object Signing".equals(spl[i]) || "objsign".equals(spl[i])) {
380
+ v |= (byte) 16;
381
+ } else if ("Unused".equals(spl[i]) || "reserved".equals(spl[i])) {
382
+ v |= (byte) 8;
383
+ } else if ("SSL CA".equals(spl[i]) || "sslCA".equals(spl[i])) {
384
+ v |= (byte) 4;
385
+ } else if ("S/MIME CA".equals(spl[i]) || "emailCA".equals(spl[i])) {
386
+ v |= (byte) 2;
387
+ } else if ("Object Signing CA".equals(spl[i]) || "objCA".equals(spl[i])) {
388
+ v |= (byte) 1;
389
+ } else {
390
+ throw new RaiseException(getRuntime(), (RubyClass) (((RubyModule) (getRuntime().getModule("OpenSSL").getConstant("X509"))).getConstant("ExtensionError")), oid + " = " + valuex + ": unknown bit string argument", true);
391
+ }
392
+ }
393
+ }
394
+ int unused = 0;
395
+ if (v == 0) {
396
+ unused += 8;
397
+ } else {
398
+ byte a2 = v;
399
+ int x = 8;
400
+ while (a2 != 0) {
401
+ a2 <<= 1;
402
+ x--;
403
+ }
404
+ unused += x;
405
+ }
406
+ value = new DERBitString(new byte[] { v }, unused);
407
+ } else if(r_oid.equals(new DERObjectIdentifier("2.5.29.17"))) { //subjectAltName
408
+ if(valuex.startsWith("DNS:")) {
409
+ value = new String(ByteList.plain(new GeneralNames(new GeneralName(GeneralName.dNSName,new DERIA5String(valuex.substring(4)))).getDEREncoded()));
410
+ } else if(valuex.startsWith("IP:")) {
411
+ String[] numbers = valuex.substring(3).split("\\.");
412
+ byte[] bs = new byte[4];
413
+ bs[0] = (byte) (Integer.parseInt(numbers[0]) & 0xff);
414
+ bs[1] = (byte) (Integer.parseInt(numbers[1]) & 0xff);
415
+ bs[2] = (byte) (Integer.parseInt(numbers[2]) & 0xff);
416
+ bs[3] = (byte) (Integer.parseInt(numbers[3]) & 0xff);
417
+ value = new String(ByteList.plain(new GeneralNames(new GeneralName(GeneralName.iPAddress,new DEROctetString(bs))).getDEREncoded()));
418
+ } else if(valuex.startsWith("IP Address:")) {
419
+ String[] numbers = valuex.substring(11).split("\\.");
420
+ byte[] bs = new byte[4];
421
+ bs[0] = (byte) (Integer.parseInt(numbers[0]) & 0xff);
422
+ bs[1] = (byte) (Integer.parseInt(numbers[1]) & 0xff);
423
+ bs[2] = (byte) (Integer.parseInt(numbers[2]) & 0xff);
424
+ bs[3] = (byte) (Integer.parseInt(numbers[3]) & 0xff);
425
+ value = new String(ByteList.plain(new GeneralNames(new GeneralName(GeneralName.iPAddress,new DEROctetString(bs))).getDEREncoded()));
426
+ }
427
+ } else if(r_oid.equals(new DERObjectIdentifier("2.5.29.37"))) { //extendedKeyUsage
428
+ String[] spl = valuex.split(", ?");
429
+ ASN1EncodableVector vector = new ASN1EncodableVector();
430
+ for(String name : spl) {
431
+ vector.add(ASN1Registry.sym2oid(name));
432
+ }
433
+ value = new DERSequence(vector);
434
+ } else {
435
+ value = new DEROctetString(new DEROctetString(ByteList.plain(valuex)).getDEREncoded());
436
+ }
437
+
438
+ ext.setRealOid(r_oid);
439
+ ext.setRealValue(value);
440
+ ext.setRealCritical(critical.isTrue());
441
+
442
+ return ext;
443
+ }
444
+ }
445
+
446
+ public static class Extension extends RubyObject {
447
+ public static ObjectAllocator ALLOCATOR = new ObjectAllocator() {
448
+ public IRubyObject allocate(Ruby runtime, RubyClass klass) {
449
+ return new Extension(runtime, klass);
450
+ }
451
+ };
452
+
453
+ public Extension(Ruby runtime, RubyClass type) {
454
+ super(runtime,type);
455
+ }
456
+
457
+ private DERObjectIdentifier oid;
458
+ private Object value;
459
+ private boolean critical;
460
+
461
+ void setRealOid(DERObjectIdentifier oid) {
462
+ this.oid = oid;
463
+ }
464
+
465
+ void setRealValue(Object value) {
466
+ this.value = value;
467
+ }
468
+
469
+ void setRealCritical(boolean critical) {
470
+ this.critical = critical;
471
+ }
472
+
473
+ DERObjectIdentifier getRealOid() {
474
+ return oid;
475
+ }
476
+
477
+ Object getRealValue() {
478
+ return value;
479
+ }
480
+
481
+ byte[] getRealValueBytes() throws IOException {
482
+ if((value instanceof RubyString)) {
483
+ return ((RubyString) value).convertToString().getBytes();
484
+ } else if(value instanceof String) {
485
+ return ByteList.plain((String) value);
486
+ } else if(value instanceof DEROctetString) {
487
+ return ((DEROctetString)value).getOctets();
488
+ } else if(value instanceof DEREncodable) {
489
+ return ((ASN1Encodable)value).getEncoded();
490
+ } else {
491
+ return ((ASN1.ASN1Data)value).toASN1().getDEREncoded();
492
+ }
493
+ }
494
+
495
+ boolean getRealCritical() {
496
+ return critical;
497
+ }
498
+
499
+ DERObjectIdentifier getObjectIdentifier(String nameOrOid) {
500
+ Object val1 = ASN1.getOIDLookup(getRuntime()).get(nameOrOid.toLowerCase());
501
+ if(null != val1) {
502
+ return (DERObjectIdentifier)val1;
503
+ }
504
+ DERObjectIdentifier val2 = new DERObjectIdentifier(nameOrOid);
505
+ return val2;
506
+ }
507
+
508
+ @JRubyMethod(name="initialize", rest=true)
509
+ public IRubyObject _initialize(IRubyObject[] args) throws Exception {
510
+ byte[] octets = null;
511
+ if(args.length == 1) {
512
+ ASN1InputStream is = new ASN1InputStream(OpenSSLImpl.to_der_if_possible(args[0]).convertToString().getBytes());
513
+ Object obj = is.readObject();
514
+ ASN1Sequence seq = (ASN1Sequence)obj;
515
+ setRealOid((DERObjectIdentifier)(seq.getObjectAt(0)));
516
+ setRealCritical(((DERBoolean)(seq.getObjectAt(1))).isTrue());
517
+ octets = ((DEROctetString)(seq.getObjectAt(2))).getOctets();
518
+ } else if(args.length > 1) {
519
+ setRealOid(getObjectIdentifier(args[0].toString()));
520
+ setRealValue(args[1]);
521
+ }
522
+ if(args.length > 2) {
523
+ setRealCritical(args[2].isTrue());
524
+ }
525
+ if(args.length > 0 && octets != null) {
526
+ setRealValue(new String(ByteList.plain(octets)));
527
+ }
528
+
529
+ return this;
530
+ }
531
+
532
+ @JRubyMethod(name="oid=")
533
+ public IRubyObject set_oid(IRubyObject arg) {
534
+ System.err.println("WARNING: calling ext#oid=");
535
+ return getRuntime().getNil();
536
+ }
537
+
538
+ @JRubyMethod(name="value=")
539
+ public IRubyObject set_value(IRubyObject arg) {
540
+ System.err.println("WARNING: calling ext#value=");
541
+ return getRuntime().getNil();
542
+ }
543
+
544
+ @JRubyMethod(name="critical=")
545
+ public IRubyObject set_critical(IRubyObject arg) {
546
+ System.err.println("WARNING: calling ext#critical=");
547
+ return getRuntime().getNil();
548
+ }
549
+
550
+ @JRubyMethod
551
+ public IRubyObject oid() {
552
+ Object val = ASN1.getSymLookup(getRuntime()).get(oid);
553
+ if(null == val) {
554
+ val = oid.toString();
555
+ }
556
+ return getRuntime().newString((String)(val));
557
+ }
558
+
559
+ @JRubyMethod
560
+ public IRubyObject value() throws Exception {
561
+ if(getRealOid().equals(new DERObjectIdentifier("2.5.29.19"))) { //basicConstraints
562
+ ASN1Sequence seq2 = (ASN1Sequence)(new ASN1InputStream(getRealValueBytes()).readObject());
563
+ String c = "";
564
+ String path = "";
565
+ if(seq2.size()>0) {
566
+ c = "CA:" + (((DERBoolean)(seq2.getObjectAt(0))).isTrue() ? "TRUE" : "FALSE");
567
+ }
568
+ if(seq2.size()>1) {
569
+ path = ", pathlen:" + seq2.getObjectAt(1).toString();
570
+ }
571
+ return getRuntime().newString(c+path);
572
+ } else if(getRealOid().equals(new DERObjectIdentifier("2.5.29.15"))) { //keyUsage
573
+ byte[] bx = getRealValueBytes();
574
+ byte[] bs = new byte[bx.length-2];
575
+ System.arraycopy(bx,2,bs,0,bs.length);
576
+ byte b1 = 0;
577
+ byte b2 = bs[0];
578
+ if(bs.length>1) {
579
+ b1 = bs[1];
580
+ }
581
+ StringBuffer sbe = new StringBuffer();
582
+ String sep = "";
583
+ if((b2 & (byte)128) != 0) {
584
+ sbe.append(sep).append("Decipher Only");
585
+ sep = ", ";
586
+ }
587
+ if((b1 & (byte)128) != 0) {
588
+ sbe.append(sep).append("Digital Signature");
589
+ sep = ", ";
590
+ }
591
+ if((b1 & (byte)64) != 0) {
592
+ sbe.append(sep).append("Non Repudiation");
593
+ sep = ", ";
594
+ }
595
+ if((b1 & (byte)32) != 0) {
596
+ sbe.append(sep).append("Key Encipherment");
597
+ sep = ", ";
598
+ }
599
+ if((b1 & (byte)16) != 0) {
600
+ sbe.append(sep).append("Data Encipherment");
601
+ sep = ", ";
602
+ }
603
+ if((b1 & (byte)8) != 0) {
604
+ sbe.append(sep).append("Key Agreement");
605
+ sep = ", ";
606
+ }
607
+ if((b1 & (byte)4) != 0) {
608
+ sbe.append(sep).append("Key Cert Sign");
609
+ sep = ", ";
610
+ }
611
+ if((b1 & (byte)2) != 0) {
612
+ sbe.append(sep).append("cRLSign");
613
+ sep = ", ";
614
+ }
615
+ if((b1 & (byte)1) != 0) {
616
+ sbe.append(sep).append("Encipher Only");
617
+ }
618
+ return getRuntime().newString(sbe.toString());
619
+ } else if(getRealOid().equals(new DERObjectIdentifier("2.16.840.1.113730.1.1"))) { //nsCertType
620
+ byte[] bx = getRealValueBytes();
621
+ byte b = bx[0];
622
+ StringBuffer sbe = new StringBuffer();
623
+ String sep = "";
624
+ if((b & (byte)128) != 0) {
625
+ sbe.append(sep).append("SSL Client");
626
+ sep = ", ";
627
+ }
628
+ if((b & (byte)64) != 0) {
629
+ sbe.append(sep).append("SSL Servern");
630
+ sep = ", ";
631
+ }
632
+ if((b & (byte)32) != 0) {
633
+ sbe.append(sep).append("S/MIME");
634
+ sep = ", ";
635
+ }
636
+ if((b & (byte)16) != 0) {
637
+ sbe.append(sep).append("Object Signing");
638
+ sep = ", ";
639
+ }
640
+ if((b & (byte)8) != 0) {
641
+ sbe.append(sep).append("Unused");
642
+ sep = ", ";
643
+ }
644
+ if((b & (byte)4) != 0) {
645
+ sbe.append(sep).append("SSL CA");
646
+ sep = ", ";
647
+ }
648
+ if((b & (byte)2) != 0) {
649
+ sbe.append(sep).append("S/MIME CA");
650
+ sep = ", ";
651
+ }
652
+ if((b & (byte)1) != 0) {
653
+ sbe.append(sep).append("Object Signing CA");
654
+ }
655
+ return getRuntime().newString(sbe.toString());
656
+ } else if(getRealOid().equals(new DERObjectIdentifier("2.5.29.14"))) { //subjectKeyIdentifier
657
+ byte[] b1 = getRealValueBytes();
658
+ byte[] b2 = new byte[b1.length-2];
659
+ System.arraycopy(b1,2,b2,0,b2.length);
660
+ return getRuntime().newString(Utils.toHex(b2,':'));
661
+ } else if(getRealOid().equals(new DERObjectIdentifier("2.5.29.35"))) { // authorityKeyIdentifier
662
+ DERSequence seq = (DERSequence)(new ASN1InputStream(getRealValueBytes()).readObject());
663
+ StringBuffer out1 = new StringBuffer();
664
+ if(seq.size() > 0) {
665
+ out1.append("keyid:");
666
+ out1.append(Utils.toHex(((DEROctetString)seq.getObjectAt(0)).getOctets(),':'));
667
+ }
668
+ return getRuntime().newString(out1.toString());
669
+ } else if(getRealOid().equals(new DERObjectIdentifier("2.5.29.21"))) { // CRLReason
670
+ switch(RubyNumeric.fix2int(((IRubyObject)value).callMethod(getRuntime().getCurrentContext(),"value"))) {
671
+ case 0:
672
+ return getRuntime().newString("Unspecified");
673
+ case 1:
674
+ return getRuntime().newString("Key Compromise");
675
+ case 2:
676
+ return getRuntime().newString("CA Compromise");
677
+ case 3:
678
+ return getRuntime().newString("Affiliation Changed");
679
+ case 4:
680
+ return getRuntime().newString("Superseded");
681
+ case 5:
682
+ return getRuntime().newString("Cessation Of Operation");
683
+ case 6:
684
+ return getRuntime().newString("Certificate Hold");
685
+ case 8:
686
+ return getRuntime().newString("Remove From CRL");
687
+ case 9:
688
+ return getRuntime().newString("Privilege Withdrawn");
689
+ default:
690
+ return getRuntime().newString("Unspecified");
691
+ }
692
+ } else if(getRealOid().equals(new DERObjectIdentifier("2.5.29.17"))) { //subjectAltName
693
+ try {
694
+ DERObject seq = new ASN1InputStream(getRealValueBytes()).readObject();
695
+ GeneralName[] n1 = null;
696
+ if(seq instanceof DERUnknownTag) {
697
+ n1 = new GeneralName[]{GeneralName.getInstance(seq)};
698
+ } else if(seq instanceof org.bouncycastle.asn1.DERTaggedObject) {
699
+ n1 = new GeneralName[]{GeneralName.getInstance(seq)};
700
+ } else {
701
+ n1 = GeneralNames.getInstance(seq).getNames();
702
+ }
703
+ StringBuffer sbe = new StringBuffer();
704
+ String sep = "";
705
+ for(int i=0;i<n1.length;i++) {
706
+ sbe.append(sep);
707
+ if(n1[i].getTagNo() == GeneralName.dNSName) {
708
+ sbe.append("DNS:");
709
+ sbe.append(((DERString)n1[i].getName()).getString());
710
+ } else if(n1[i].getTagNo() == GeneralName.iPAddress) {
711
+ sbe.append("IP Address:");
712
+ byte[] bs = ((DEROctetString)n1[i].getName()).getOctets();
713
+ String sep2 = "";
714
+ for(int j=0;j<bs.length;j++) {
715
+ sbe.append(sep2);
716
+ sbe.append(((int)bs[j]) & 0xff);
717
+ sep2 = ".";
718
+ }
719
+ } else {
720
+ sbe.append(n1[i].toString());
721
+ }
722
+ sep = ", ";
723
+ }
724
+ return getRuntime().newString(sbe.toString());
725
+ } catch(Exception e) {
726
+ return getRuntime().newString(getRealValue().toString());
727
+ }
728
+ } else {
729
+ try {
730
+ return ASN1.decode(getRuntime().getModule("OpenSSL").getConstant("ASN1"),RubyString.newString(getRuntime(), getRealValueBytes())).callMethod(getRuntime().getCurrentContext(),"value").callMethod(getRuntime().getCurrentContext(),"to_s");
731
+ } catch(Exception e) {
732
+ return getRuntime().newString(getRealValue().toString());
733
+ }
734
+ }
735
+ }
736
+
737
+ @JRubyMethod(name="critical?")
738
+ public IRubyObject critical_p() {
739
+ return critical ? getRuntime().getTrue() : getRuntime().getFalse();
740
+ }
741
+
742
+ @JRubyMethod
743
+ public IRubyObject to_der() throws Exception {
744
+ ASN1EncodableVector all = new ASN1EncodableVector();
745
+ all.add(getRealOid());
746
+ all.add(getRealCritical() ? DERBoolean.TRUE : DERBoolean.FALSE);
747
+ all.add(new DEROctetString(getRealValueBytes()));
748
+ return RubyString.newString(getRuntime(), new DERSequence(all).getDEREncoded());
749
+ }
750
+ }
751
+ }// X509Extensions