PageRenderTime 67ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/test/openssl/test_x509name.rb

https://gitlab.com/klauer/ruby
Ruby | 276 lines | 251 code | 25 blank | 0 comment | 1 complexity | 3aeb700505e0fba413c2467862bf9364 MD5 | raw file
  1. require_relative 'utils'
  2. if defined?(OpenSSL)
  3. class OpenSSL::TestX509Name < Test::Unit::TestCase
  4. OpenSSL::ASN1::ObjectId.register(
  5. "1.2.840.113549.1.9.1", "emailAddress", "emailAddress")
  6. OpenSSL::ASN1::ObjectId.register(
  7. "2.5.4.5", "serialNumber", "serialNumber")
  8. def setup
  9. @obj_type_tmpl = Hash.new(OpenSSL::ASN1::PRINTABLESTRING)
  10. @obj_type_tmpl.update(OpenSSL::X509::Name::OBJECT_TYPE_TEMPLATE)
  11. end
  12. def teardown
  13. end
  14. def test_s_new
  15. dn = [ ["C", "JP"], ["O", "example"], ["CN", "www.example.jp"] ]
  16. name = OpenSSL::X509::Name.new(dn)
  17. ary = name.to_a
  18. assert_equal("/C=JP/O=example/CN=www.example.jp", name.to_s)
  19. assert_equal("C", ary[0][0])
  20. assert_equal("O", ary[1][0])
  21. assert_equal("CN", ary[2][0])
  22. assert_equal("JP", ary[0][1])
  23. assert_equal("example", ary[1][1])
  24. assert_equal("www.example.jp", ary[2][1])
  25. assert_equal(OpenSSL::ASN1::PRINTABLESTRING, ary[0][2])
  26. assert_equal(OpenSSL::ASN1::UTF8STRING, ary[1][2])
  27. assert_equal(OpenSSL::ASN1::UTF8STRING, ary[2][2])
  28. dn = [
  29. ["countryName", "JP"],
  30. ["organizationName", "example"],
  31. ["commonName", "www.example.jp"]
  32. ]
  33. name = OpenSSL::X509::Name.new(dn)
  34. ary = name.to_a
  35. assert_equal("/C=JP/O=example/CN=www.example.jp", name.to_s)
  36. assert_equal("C", ary[0][0])
  37. assert_equal("O", ary[1][0])
  38. assert_equal("CN", ary[2][0])
  39. assert_equal("JP", ary[0][1])
  40. assert_equal("example", ary[1][1])
  41. assert_equal("www.example.jp", ary[2][1])
  42. assert_equal(OpenSSL::ASN1::PRINTABLESTRING, ary[0][2])
  43. assert_equal(OpenSSL::ASN1::UTF8STRING, ary[1][2])
  44. assert_equal(OpenSSL::ASN1::UTF8STRING, ary[2][2])
  45. name = OpenSSL::X509::Name.new(dn, @obj_type_tmpl)
  46. ary = name.to_a
  47. assert_equal("/C=JP/O=example/CN=www.example.jp", name.to_s)
  48. assert_equal(OpenSSL::ASN1::PRINTABLESTRING, ary[0][2])
  49. assert_equal(OpenSSL::ASN1::PRINTABLESTRING, ary[1][2])
  50. assert_equal(OpenSSL::ASN1::PRINTABLESTRING, ary[2][2])
  51. dn = [
  52. ["countryName", "JP", OpenSSL::ASN1::PRINTABLESTRING],
  53. ["organizationName", "example", OpenSSL::ASN1::PRINTABLESTRING],
  54. ["commonName", "www.example.jp", OpenSSL::ASN1::PRINTABLESTRING]
  55. ]
  56. name = OpenSSL::X509::Name.new(dn)
  57. ary = name.to_a
  58. assert_equal("/C=JP/O=example/CN=www.example.jp", name.to_s)
  59. assert_equal(OpenSSL::ASN1::PRINTABLESTRING, ary[0][2])
  60. assert_equal(OpenSSL::ASN1::PRINTABLESTRING, ary[1][2])
  61. assert_equal(OpenSSL::ASN1::PRINTABLESTRING, ary[2][2])
  62. dn = [
  63. ["DC", "org"],
  64. ["DC", "ruby-lang"],
  65. ["CN", "GOTOU Yuuzou"],
  66. ["emailAddress", "gotoyuzo@ruby-lang.org"],
  67. ["serialNumber", "123"],
  68. ]
  69. name = OpenSSL::X509::Name.new(dn)
  70. ary = name.to_a
  71. assert_equal("/DC=org/DC=ruby-lang/CN=GOTOU Yuuzou/emailAddress=gotoyuzo@ruby-lang.org/serialNumber=123", name.to_s)
  72. assert_equal("DC", ary[0][0])
  73. assert_equal("DC", ary[1][0])
  74. assert_equal("CN", ary[2][0])
  75. assert_equal("emailAddress", ary[3][0])
  76. assert_equal("serialNumber", ary[4][0])
  77. assert_equal("org", ary[0][1])
  78. assert_equal("ruby-lang", ary[1][1])
  79. assert_equal("GOTOU Yuuzou", ary[2][1])
  80. assert_equal("gotoyuzo@ruby-lang.org", ary[3][1])
  81. assert_equal("123", ary[4][1])
  82. assert_equal(OpenSSL::ASN1::IA5STRING, ary[0][2])
  83. assert_equal(OpenSSL::ASN1::IA5STRING, ary[1][2])
  84. assert_equal(OpenSSL::ASN1::UTF8STRING, ary[2][2])
  85. assert_equal(OpenSSL::ASN1::IA5STRING, ary[3][2])
  86. assert_equal(OpenSSL::ASN1::PRINTABLESTRING, ary[4][2])
  87. name_from_der = OpenSSL::X509::Name.new(name.to_der)
  88. assert_equal(name_from_der.to_s, name.to_s)
  89. assert_equal(name_from_der.to_a, name.to_a)
  90. assert_equal(name_from_der.to_der, name.to_der)
  91. end
  92. def test_s_parse
  93. dn = "/DC=org/DC=ruby-lang/CN=www.ruby-lang.org"
  94. name = OpenSSL::X509::Name.parse(dn)
  95. assert_equal(dn, name.to_s)
  96. ary = name.to_a
  97. assert_equal("DC", ary[0][0])
  98. assert_equal("DC", ary[1][0])
  99. assert_equal("CN", ary[2][0])
  100. assert_equal("org", ary[0][1])
  101. assert_equal("ruby-lang", ary[1][1])
  102. assert_equal("www.ruby-lang.org", ary[2][1])
  103. assert_equal(OpenSSL::ASN1::IA5STRING, ary[0][2])
  104. assert_equal(OpenSSL::ASN1::IA5STRING, ary[1][2])
  105. assert_equal(OpenSSL::ASN1::UTF8STRING, ary[2][2])
  106. dn2 = "DC=org, DC=ruby-lang, CN=www.ruby-lang.org"
  107. name = OpenSSL::X509::Name.parse(dn2)
  108. ary = name.to_a
  109. assert_equal(dn, name.to_s)
  110. assert_equal("org", ary[0][1])
  111. assert_equal("ruby-lang", ary[1][1])
  112. assert_equal("www.ruby-lang.org", ary[2][1])
  113. name = OpenSSL::X509::Name.parse(dn2, @obj_type_tmpl)
  114. ary = name.to_a
  115. assert_equal(OpenSSL::ASN1::IA5STRING, ary[0][2])
  116. assert_equal(OpenSSL::ASN1::IA5STRING, ary[1][2])
  117. assert_equal(OpenSSL::ASN1::PRINTABLESTRING, ary[2][2])
  118. end
  119. def test_s_parse_rfc2253
  120. scanner = OpenSSL::X509::Name::RFC2253DN.method(:scan)
  121. assert_equal([["C", "JP"]], scanner.call("C=JP"))
  122. assert_equal([
  123. ["DC", "org"],
  124. ["DC", "ruby-lang"],
  125. ["CN", "GOTOU Yuuzou"],
  126. ["emailAddress", "gotoyuzo@ruby-lang.org"],
  127. ],
  128. scanner.call(
  129. "emailAddress=gotoyuzo@ruby-lang.org,CN=GOTOU Yuuzou,"+
  130. "DC=ruby-lang,DC=org")
  131. )
  132. u8 = OpenSSL::ASN1::UTF8STRING
  133. assert_equal([
  134. ["DC", "org"],
  135. ["DC", "ruby-lang"],
  136. ["O", ",=+<>#;"],
  137. ["O", ",=+<>#;"],
  138. ["OU", ""],
  139. ["OU", ""],
  140. ["L", "aaa=\"bbb, ccc\""],
  141. ["L", "aaa=\"bbb, ccc\""],
  142. ["CN", "\345\276\214\350\227\244\350\243\225\350\224\265"],
  143. ["CN", "\345\276\214\350\227\244\350\243\225\350\224\265"],
  144. ["CN", "\345\276\214\350\227\244\350\243\225\350\224\265"],
  145. ["CN", "\345\276\214\350\227\244\350\243\225\350\224\265", u8],
  146. ["2.5.4.3", "GOTOU, Yuuzou"],
  147. ["2.5.4.3", "GOTOU, Yuuzou"],
  148. ["2.5.4.3", "GOTOU, Yuuzou"],
  149. ["2.5.4.3", "GOTOU, Yuuzou"],
  150. ["CN", "GOTOU \"gotoyuzo\" Yuuzou"],
  151. ["CN", "GOTOU \"gotoyuzo\" Yuuzou"],
  152. ["1.2.840.113549.1.9.1", "gotoyuzo@ruby-lang.org"],
  153. ["emailAddress", "gotoyuzo@ruby-lang.org"],
  154. ],
  155. scanner.call(
  156. "emailAddress=gotoyuzo@ruby-lang.org," +
  157. "1.2.840.113549.1.9.1=gotoyuzo@ruby-lang.org," +
  158. 'CN=GOTOU \"gotoyuzo\" Yuuzou,' +
  159. 'CN="GOTOU \"gotoyuzo\" Yuuzou",' +
  160. '2.5.4.3=GOTOU\,\20Yuuzou,' +
  161. '2.5.4.3=GOTOU\, Yuuzou,' +
  162. '2.5.4.3="GOTOU, Yuuzou",' +
  163. '2.5.4.3="GOTOU\, Yuuzou",' +
  164. "CN=#0C0CE5BE8CE897A4E8A395E894B5," +
  165. 'CN=\E5\BE\8C\E8\97\A4\E8\A3\95\E8\94\B5,' +
  166. "CN=\"\xE5\xBE\x8C\xE8\x97\xA4\xE8\xA3\x95\xE8\x94\xB5\"," +
  167. "CN=\xE5\xBE\x8C\xE8\x97\xA4\xE8\xA3\x95\xE8\x94\xB5," +
  168. 'L=aaa\=\"bbb\, ccc\",' +
  169. 'L="aaa=\"bbb, ccc\"",' +
  170. 'OU=,' +
  171. 'OU="",' +
  172. 'O=\,\=\+\<\>\#\;,' +
  173. 'O=",=+<>#;",' +
  174. "DC=ruby-lang," +
  175. "DC=org")
  176. )
  177. [
  178. "DC=org+DC=jp",
  179. "DC=org,DC=ruby-lang+DC=rubyist,DC=www"
  180. ].each{|dn|
  181. ex = scanner.call(dn) rescue $!
  182. dn_r = Regexp.escape(dn)
  183. assert_match(/^multi-valued RDN is not supported: #{dn_r}/, ex.message)
  184. }
  185. [
  186. ["DC=org,DC=exapmle,CN", "CN"],
  187. ["DC=org,DC=example,", ""],
  188. ["DC=org,DC=exapmle,CN=www.example.org;", "CN=www.example.org;"],
  189. ["DC=org,DC=exapmle,CN=#www.example.org", "CN=#www.example.org"],
  190. ["DC=org,DC=exapmle,CN=#777777.example.org", "CN=#777777.example.org"],
  191. ["DC=org,DC=exapmle,CN=\"www.example\".org", "CN=\"www.example\".org"],
  192. ["DC=org,DC=exapmle,CN=www.\"example.org\"", "CN=www.\"example.org\""],
  193. ["DC=org,DC=exapmle,CN=www.\"example\".org", "CN=www.\"example\".org"],
  194. ].each{|dn, msg|
  195. ex = scanner.call(dn) rescue $!
  196. assert_match(/^malformed RDN: .*=>#{Regexp.escape(msg)}/, ex.message)
  197. }
  198. dn = "CN=www.ruby-lang.org,DC=ruby-lang,DC=org"
  199. name = OpenSSL::X509::Name.parse_rfc2253(dn)
  200. assert_equal(dn, name.to_s(OpenSSL::X509::Name::RFC2253))
  201. ary = name.to_a
  202. assert_equal("DC", ary[0][0])
  203. assert_equal("DC", ary[1][0])
  204. assert_equal("CN", ary[2][0])
  205. assert_equal("org", ary[0][1])
  206. assert_equal("ruby-lang", ary[1][1])
  207. assert_equal("www.ruby-lang.org", ary[2][1])
  208. assert_equal(OpenSSL::ASN1::IA5STRING, ary[0][2])
  209. assert_equal(OpenSSL::ASN1::IA5STRING, ary[1][2])
  210. assert_equal(OpenSSL::ASN1::UTF8STRING, ary[2][2])
  211. end
  212. def test_add_entry
  213. dn = [
  214. ["DC", "org"],
  215. ["DC", "ruby-lang"],
  216. ["CN", "GOTOU Yuuzou"],
  217. ["emailAddress", "gotoyuzo@ruby-lang.org"],
  218. ["serialNumber", "123"],
  219. ]
  220. name = OpenSSL::X509::Name.new
  221. dn.each{|attr| name.add_entry(*attr) }
  222. ary = name.to_a
  223. assert_equal("/DC=org/DC=ruby-lang/CN=GOTOU Yuuzou/emailAddress=gotoyuzo@ruby-lang.org/serialNumber=123", name.to_s)
  224. assert_equal("DC", ary[0][0])
  225. assert_equal("DC", ary[1][0])
  226. assert_equal("CN", ary[2][0])
  227. assert_equal("emailAddress", ary[3][0])
  228. assert_equal("serialNumber", ary[4][0])
  229. assert_equal("org", ary[0][1])
  230. assert_equal("ruby-lang", ary[1][1])
  231. assert_equal("GOTOU Yuuzou", ary[2][1])
  232. assert_equal("gotoyuzo@ruby-lang.org", ary[3][1])
  233. assert_equal("123", ary[4][1])
  234. assert_equal(OpenSSL::ASN1::IA5STRING, ary[0][2])
  235. assert_equal(OpenSSL::ASN1::IA5STRING, ary[1][2])
  236. assert_equal(OpenSSL::ASN1::UTF8STRING, ary[2][2])
  237. assert_equal(OpenSSL::ASN1::IA5STRING, ary[3][2])
  238. assert_equal(OpenSSL::ASN1::PRINTABLESTRING, ary[4][2])
  239. end
  240. def test_equals2
  241. n1 = OpenSSL::X509::Name.parse 'CN=a'
  242. n2 = OpenSSL::X509::Name.parse 'CN=a'
  243. assert_equal n1, n2
  244. end
  245. def test_spaceship
  246. n1 = OpenSSL::X509::Name.parse 'CN=a'
  247. n2 = OpenSSL::X509::Name.parse 'CN=b'
  248. assert_equal -1, n1 <=> n2
  249. end
  250. end
  251. end