PageRenderTime 47ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 0ms

/projects/jruby-1.7.3/test/externals/ruby1.9/openssl/test_asn1.rb

https://gitlab.com/essere.lab.public/qualitas.class-corpus
Ruby | 589 lines | 538 code | 50 blank | 1 comment | 2 complexity | dfd0d998fc7d348cc9cfb9ef0eff430b MD5 | raw file
  1. require_relative 'utils'
  2. class OpenSSL::TestASN1 < Test::Unit::TestCase
  3. def test_decode
  4. subj = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=TestCA")
  5. key = OpenSSL::TestUtils::TEST_KEY_RSA1024
  6. now = Time.at(Time.now.to_i) # suppress usec
  7. s = 0xdeadbeafdeadbeafdeadbeafdeadbeaf
  8. exts = [
  9. ["basicConstraints","CA:TRUE,pathlen:1",true],
  10. ["keyUsage","keyCertSign, cRLSign",true],
  11. ["subjectKeyIdentifier","hash",false],
  12. ]
  13. dgst = OpenSSL::Digest::SHA1.new
  14. cert = OpenSSL::TestUtils.issue_cert(
  15. subj, key, s, now, now+3600, exts, nil, nil, dgst)
  16. asn1 = OpenSSL::ASN1.decode(cert)
  17. assert_equal(OpenSSL::ASN1::Sequence, asn1.class)
  18. assert_equal(3, asn1.value.size)
  19. tbs_cert, sig_alg, sig_val = *asn1.value
  20. assert_equal(OpenSSL::ASN1::Sequence, tbs_cert.class)
  21. assert_equal(8, tbs_cert.value.size)
  22. version = tbs_cert.value[0]
  23. assert_equal(:CONTEXT_SPECIFIC, version.tag_class)
  24. assert_equal(0, version.tag)
  25. assert_equal(1, version.value.size)
  26. assert_equal(OpenSSL::ASN1::Integer, version.value[0].class)
  27. assert_equal(2, version.value[0].value)
  28. serial = tbs_cert.value[1]
  29. assert_equal(OpenSSL::ASN1::Integer, serial.class)
  30. assert_equal(0xdeadbeafdeadbeafdeadbeafdeadbeaf, serial.value)
  31. sig = tbs_cert.value[2]
  32. assert_equal(OpenSSL::ASN1::Sequence, sig.class)
  33. assert_equal(2, sig.value.size)
  34. assert_equal(OpenSSL::ASN1::ObjectId, sig.value[0].class)
  35. assert_equal("1.2.840.113549.1.1.5", sig.value[0].oid)
  36. assert_equal(OpenSSL::ASN1::Null, sig.value[1].class)
  37. dn = tbs_cert.value[3] # issuer
  38. assert_equal(subj.hash, OpenSSL::X509::Name.new(dn).hash)
  39. assert_equal(OpenSSL::ASN1::Sequence, dn.class)
  40. assert_equal(3, dn.value.size)
  41. assert_equal(OpenSSL::ASN1::Set, dn.value[0].class)
  42. assert_equal(OpenSSL::ASN1::Set, dn.value[1].class)
  43. assert_equal(OpenSSL::ASN1::Set, dn.value[2].class)
  44. assert_equal(1, dn.value[0].value.size)
  45. assert_equal(1, dn.value[1].value.size)
  46. assert_equal(1, dn.value[2].value.size)
  47. assert_equal(OpenSSL::ASN1::Sequence, dn.value[0].value[0].class)
  48. assert_equal(OpenSSL::ASN1::Sequence, dn.value[1].value[0].class)
  49. assert_equal(OpenSSL::ASN1::Sequence, dn.value[2].value[0].class)
  50. assert_equal(2, dn.value[0].value[0].value.size)
  51. assert_equal(2, dn.value[1].value[0].value.size)
  52. assert_equal(2, dn.value[2].value[0].value.size)
  53. oid, value = *dn.value[0].value[0].value
  54. assert_equal(OpenSSL::ASN1::ObjectId, oid.class)
  55. assert_equal("0.9.2342.19200300.100.1.25", oid.oid)
  56. assert_equal(OpenSSL::ASN1::IA5String, value.class)
  57. assert_equal("org", value.value)
  58. oid, value = *dn.value[1].value[0].value
  59. assert_equal(OpenSSL::ASN1::ObjectId, oid.class)
  60. assert_equal("0.9.2342.19200300.100.1.25", oid.oid)
  61. assert_equal(OpenSSL::ASN1::IA5String, value.class)
  62. assert_equal("ruby-lang", value.value)
  63. oid, value = *dn.value[2].value[0].value
  64. assert_equal(OpenSSL::ASN1::ObjectId, oid.class)
  65. assert_equal("2.5.4.3", oid.oid)
  66. assert_equal(OpenSSL::ASN1::UTF8String, value.class)
  67. assert_equal("TestCA", value.value)
  68. validity = tbs_cert.value[4]
  69. assert_equal(OpenSSL::ASN1::Sequence, validity.class)
  70. assert_equal(2, validity.value.size)
  71. assert_equal(OpenSSL::ASN1::UTCTime, validity.value[0].class)
  72. assert_equal(now, validity.value[0].value)
  73. assert_equal(OpenSSL::ASN1::UTCTime, validity.value[1].class)
  74. assert_equal(now+3600, validity.value[1].value)
  75. dn = tbs_cert.value[5] # subject
  76. assert_equal(subj.hash, OpenSSL::X509::Name.new(dn).hash)
  77. assert_equal(OpenSSL::ASN1::Sequence, dn.class)
  78. assert_equal(3, dn.value.size)
  79. assert_equal(OpenSSL::ASN1::Set, dn.value[0].class)
  80. assert_equal(OpenSSL::ASN1::Set, dn.value[1].class)
  81. assert_equal(OpenSSL::ASN1::Set, dn.value[2].class)
  82. assert_equal(1, dn.value[0].value.size)
  83. assert_equal(1, dn.value[1].value.size)
  84. assert_equal(1, dn.value[2].value.size)
  85. assert_equal(OpenSSL::ASN1::Sequence, dn.value[0].value[0].class)
  86. assert_equal(OpenSSL::ASN1::Sequence, dn.value[1].value[0].class)
  87. assert_equal(OpenSSL::ASN1::Sequence, dn.value[2].value[0].class)
  88. assert_equal(2, dn.value[0].value[0].value.size)
  89. assert_equal(2, dn.value[1].value[0].value.size)
  90. assert_equal(2, dn.value[2].value[0].value.size)
  91. oid, value = *dn.value[0].value[0].value
  92. assert_equal(OpenSSL::ASN1::ObjectId, oid.class)
  93. assert_equal("0.9.2342.19200300.100.1.25", oid.oid)
  94. assert_equal(OpenSSL::ASN1::IA5String, value.class)
  95. assert_equal("org", value.value)
  96. oid, value = *dn.value[1].value[0].value
  97. assert_equal(OpenSSL::ASN1::ObjectId, oid.class)
  98. assert_equal("0.9.2342.19200300.100.1.25", oid.oid)
  99. assert_equal(OpenSSL::ASN1::IA5String, value.class)
  100. assert_equal("ruby-lang", value.value)
  101. oid, value = *dn.value[2].value[0].value
  102. assert_equal(OpenSSL::ASN1::ObjectId, oid.class)
  103. assert_equal("2.5.4.3", oid.oid)
  104. assert_equal(OpenSSL::ASN1::UTF8String, value.class)
  105. assert_equal("TestCA", value.value)
  106. pkey = tbs_cert.value[6]
  107. assert_equal(OpenSSL::ASN1::Sequence, pkey.class)
  108. assert_equal(2, pkey.value.size)
  109. assert_equal(OpenSSL::ASN1::Sequence, pkey.value[0].class)
  110. assert_equal(2, pkey.value[0].value.size)
  111. assert_equal(OpenSSL::ASN1::ObjectId, pkey.value[0].value[0].class)
  112. assert_equal("1.2.840.113549.1.1.1", pkey.value[0].value[0].oid)
  113. assert_equal(OpenSSL::ASN1::BitString, pkey.value[1].class)
  114. assert_equal(0, pkey.value[1].unused_bits)
  115. spkey = OpenSSL::ASN1.decode(pkey.value[1].value)
  116. assert_equal(OpenSSL::ASN1::Sequence, spkey.class)
  117. assert_equal(2, spkey.value.size)
  118. assert_equal(OpenSSL::ASN1::Integer, spkey.value[0].class)
  119. assert_equal(143085709396403084580358323862163416700436550432664688288860593156058579474547937626086626045206357324274536445865308750491138538454154232826011964045825759324933943290377903384882276841880081931690695505836279972214003660451338124170055999155993192881685495391496854691199517389593073052473319331505702779271, spkey.value[0].value)
  120. assert_equal(OpenSSL::ASN1::Integer, spkey.value[1].class)
  121. assert_equal(65537, spkey.value[1].value)
  122. extensions = tbs_cert.value[7]
  123. assert_equal(:CONTEXT_SPECIFIC, extensions.tag_class)
  124. assert_equal(3, extensions.tag)
  125. assert_equal(1, extensions.value.size)
  126. assert_equal(OpenSSL::ASN1::Sequence, extensions.value[0].class)
  127. assert_equal(3, extensions.value[0].value.size)
  128. ext = extensions.value[0].value[0] # basicConstraints
  129. assert_equal(OpenSSL::ASN1::Sequence, ext.class)
  130. assert_equal(3, ext.value.size)
  131. assert_equal(OpenSSL::ASN1::ObjectId, ext.value[0].class)
  132. assert_equal("2.5.29.19", ext.value[0].oid)
  133. assert_equal(OpenSSL::ASN1::Boolean, ext.value[1].class)
  134. assert_equal(true, ext.value[1].value)
  135. assert_equal(OpenSSL::ASN1::OctetString, ext.value[2].class)
  136. extv = OpenSSL::ASN1.decode(ext.value[2].value)
  137. assert_equal(OpenSSL::ASN1::Sequence, extv.class)
  138. assert_equal(2, extv.value.size)
  139. assert_equal(OpenSSL::ASN1::Boolean, extv.value[0].class)
  140. assert_equal(true, extv.value[0].value)
  141. assert_equal(OpenSSL::ASN1::Integer, extv.value[1].class)
  142. assert_equal(1, extv.value[1].value)
  143. ext = extensions.value[0].value[1] # keyUsage
  144. assert_equal(OpenSSL::ASN1::Sequence, ext.class)
  145. assert_equal(3, ext.value.size)
  146. assert_equal(OpenSSL::ASN1::ObjectId, ext.value[0].class)
  147. assert_equal("2.5.29.15", ext.value[0].oid)
  148. assert_equal(OpenSSL::ASN1::Boolean, ext.value[1].class)
  149. assert_equal(true, ext.value[1].value)
  150. assert_equal(OpenSSL::ASN1::OctetString, ext.value[2].class)
  151. extv = OpenSSL::ASN1.decode(ext.value[2].value)
  152. assert_equal(OpenSSL::ASN1::BitString, extv.class)
  153. str = "\000"; str[0] = 0b00000110.chr
  154. assert_equal(str, extv.value)
  155. ext = extensions.value[0].value[2] # subjetKeyIdentifier
  156. assert_equal(OpenSSL::ASN1::Sequence, ext.class)
  157. assert_equal(2, ext.value.size)
  158. assert_equal(OpenSSL::ASN1::ObjectId, ext.value[0].class)
  159. assert_equal("2.5.29.14", ext.value[0].oid)
  160. assert_equal(OpenSSL::ASN1::OctetString, ext.value[1].class)
  161. extv = OpenSSL::ASN1.decode(ext.value[1].value)
  162. assert_equal(OpenSSL::ASN1::OctetString, extv.class)
  163. sha1 = OpenSSL::Digest::SHA1.new
  164. sha1.update(pkey.value[1].value)
  165. assert_equal(sha1.digest, extv.value)
  166. assert_equal(OpenSSL::ASN1::Sequence, sig_alg.class)
  167. assert_equal(2, sig_alg.value.size)
  168. assert_equal(OpenSSL::ASN1::ObjectId, pkey.value[0].value[0].class)
  169. assert_equal("1.2.840.113549.1.1.1", pkey.value[0].value[0].oid)
  170. assert_equal(OpenSSL::ASN1::Null, pkey.value[0].value[1].class)
  171. assert_equal(OpenSSL::ASN1::BitString, sig_val.class)
  172. cululated_sig = key.sign(OpenSSL::Digest::SHA1.new, tbs_cert.to_der)
  173. assert_equal(cululated_sig, sig_val.value)
  174. end
  175. def test_encode_boolean
  176. encode_decode_test(OpenSSL::ASN1::Boolean, [true, false])
  177. end
  178. def test_encode_integer
  179. encode_decode_test(OpenSSL::ASN1::Integer, [72, -127, -128, 128, -1, 0, 1, -(2**12345), 2**12345])
  180. end
  181. def encode_decode_test(type, values)
  182. values.each do |v|
  183. assert_equal(v, OpenSSL::ASN1.decode(type.new(v).to_der).value)
  184. end
  185. end
  186. def test_decode_pem #should fail gracefully (cf. [ruby-dev:44542])
  187. pem = <<-_EOS_
  188. -----BEGIN CERTIFICATE-----
  189. MIIC8zCCAdugAwIBAgIBATANBgkqhkiG9w0BAQUFADA9MRMwEQYKCZImiZPyLGQB
  190. GRYDb3JnMRkwFwYKCZImiZPyLGQBGRYJcnVieS1sYW5nMQswCQYDVQQDDAJDQTAe
  191. Fw0xMTA5MjUxMzQ4MjZaFw0xMTA5MjUxNDQ4MjZaMD0xEzARBgoJkiaJk/IsZAEZ
  192. FgNvcmcxGTAXBgoJkiaJk/IsZAEZFglydWJ5LWxhbmcxCzAJBgNVBAMMAkNBMIIB
  193. IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuV9ht9J7k4NBs38jOXvvTKY9
  194. gW8nLICSno5EETR1cuF7i4pNs9I1QJGAFAX0BEO4KbzXmuOvfCpD3CU+Slp1enen
  195. fzq/t/e/1IRW0wkJUJUFQign4CtrkJL+P07yx18UjyPlBXb81ApEmAB5mrJVSrWm
  196. qbjs07JbuS4QQGGXLc+Su96DkYKmSNVjBiLxVVSpyZfAY3hD37d60uG+X8xdW5v6
  197. 8JkRFIhdGlb6JL8fllf/A/blNwdJOhVr9mESHhwGjwfSeTDPfd8ZLE027E5lyAVX
  198. 9KZYcU00mOX+fdxOSnGqS/8JDRh0EPHDL15RcJjV2J6vZjPb0rOYGDoMcH+94wID
  199. AQABMA0GCSqGSIb3DQEBBQUAA4IBAQAiAtrIr1pLX4GYN5klviWKb8HC9ICYuAFI
  200. NfE3FwqzErEVXotuMe3yPVyB3Bv6rjYY/x5EtS5+WPTbHlvHZTkfcsnTpizcn4mW
  201. dJ6dDRaFCHt1YKKjUxqBt9lvvrc3nReYZN/P+s1mrDhWzGf8iPZgf8sFUHgnaK7W
  202. CXRVXmPFgCDRNpDDVQ0MQkr509yYfTH+dujNzqTCwSvkyZFyQ7Oe8Yj0VR6kquG3
  203. rEzBQ0F9dUyqQ9gyRg8KHhDfv9HzT1d/rnUZMkoombwYBRIUChGCYV0GnJcan2Zm
  204. /93PnPG1IvPjYNd5VlV+sXSnaxQn974HRCsMv7jA8BD6IgSaX6WK
  205. -----END CERTIFICATE-----
  206. _EOS_
  207. assert_raise(OpenSSL::ASN1::ASN1Error) { OpenSSL::ASN1.decode(pem) }
  208. assert_raise(OpenSSL::ASN1::ASN1Error) { OpenSSL::ASN1.decode_all(pem) }
  209. end
  210. def test_primitive_cannot_set_infinite_length
  211. begin
  212. prim = OpenSSL::ASN1::Integer.new(50)
  213. assert_equal(false, prim.infinite_length)
  214. prim.infinite_length = true
  215. flunk('Could set infinite length on primitive value')
  216. rescue NoMethodError => e
  217. #ok
  218. end
  219. end
  220. def test_decode_all
  221. expected = %w{ 02 01 01 02 01 02 02 01 03 }
  222. raw = [expected.join('')].pack('H*')
  223. ary = OpenSSL::ASN1.decode_all(raw)
  224. assert_equal(3, ary.size)
  225. ary.each_with_index do |asn1, i|
  226. assert_universal(OpenSSL::ASN1::INTEGER, asn1)
  227. assert_equal(i + 1, asn1.value)
  228. end
  229. end
  230. def test_create_inf_length_primitive
  231. expected = %w{ 24 80 04 01 61 00 00 }
  232. raw = [expected.join('')].pack('H*')
  233. val = OpenSSL::ASN1::OctetString.new('a')
  234. cons = OpenSSL::ASN1::Constructive.new([val,
  235. OpenSSL::ASN1::EndOfContent.new],
  236. OpenSSL::ASN1::OCTET_STRING,
  237. nil,
  238. :UNIVERSAL)
  239. cons.infinite_length = true
  240. assert_equal(nil, cons.tagging)
  241. assert_equal(raw, cons.to_der)
  242. asn1 = OpenSSL::ASN1.decode(raw)
  243. assert(asn1.infinite_length)
  244. assert_equal(raw, asn1.to_der)
  245. end
  246. def test_cons_without_inf_length_forbidden
  247. assert_raise(OpenSSL::ASN1::ASN1Error) do
  248. val = OpenSSL::ASN1::OctetString.new('a')
  249. cons = OpenSSL::ASN1::Constructive.new([val],
  250. OpenSSL::ASN1::OCTET_STRING,
  251. nil,
  252. :UNIVERSAL)
  253. cons.to_der
  254. end
  255. end
  256. def test_cons_without_array_forbidden
  257. assert_raise(OpenSSL::ASN1::ASN1Error) do
  258. val = OpenSSL::ASN1::OctetString.new('a')
  259. cons = OpenSSL::ASN1::Constructive.new(val,
  260. OpenSSL::ASN1::OCTET_STRING,
  261. nil,
  262. :UNIVERSAL)
  263. cons.infinite_length = true
  264. cons.to_der
  265. end
  266. end
  267. def test_parse_empty_sequence
  268. expected = %w{ A0 07 30 02 30 00 02 01 00 }
  269. raw = [expected.join('')].pack('H*')
  270. asn1 = OpenSSL::ASN1.decode(raw)
  271. assert_equal(raw, asn1.to_der)
  272. assert_equal(2, asn1.value.size)
  273. seq = asn1.value[0]
  274. assert_equal(1, seq.value.size)
  275. inner_seq = seq.value[0]
  276. assert_equal(0, inner_seq.value.size)
  277. end
  278. def test_parse_tagged_0_infinite
  279. expected = %w{ 30 80 02 01 01 80 01 02 00 00 }
  280. raw = [expected.join('')].pack('H*')
  281. asn1 = OpenSSL::ASN1.decode(raw)
  282. assert_equal(3, asn1.value.size)
  283. int = asn1.value[0]
  284. assert_universal(OpenSSL::ASN1::INTEGER, int)
  285. tagged = asn1.value[1]
  286. assert_equal(0, tagged.tag)
  287. assert_universal(OpenSSL::ASN1::EOC, asn1.value[2])
  288. assert_equal(raw, asn1.to_der)
  289. end
  290. def test_seq_infinite_length
  291. begin
  292. content = [ OpenSSL::ASN1::Null.new(nil),
  293. OpenSSL::ASN1::EndOfContent.new ]
  294. cons = OpenSSL::ASN1::Sequence.new(content)
  295. cons.infinite_length = true
  296. expected = %w{ 30 80 05 00 00 00 }
  297. raw = [expected.join('')].pack('H*')
  298. assert_equal(raw, cons.to_der)
  299. assert_equal(raw, OpenSSL::ASN1.decode(raw).to_der)
  300. end
  301. end
  302. def test_set_infinite_length
  303. begin
  304. content = [ OpenSSL::ASN1::Null.new(nil),
  305. OpenSSL::ASN1::EndOfContent.new() ]
  306. cons = OpenSSL::ASN1::Set.new(content)
  307. cons.infinite_length = true
  308. expected = %w{ 31 80 05 00 00 00 }
  309. raw = [expected.join('')].pack('H*')
  310. assert_equal(raw, cons.to_der)
  311. assert_equal(raw, OpenSSL::ASN1.decode(raw).to_der)
  312. end
  313. end
  314. def test_octet_string_infinite_length
  315. begin
  316. octets = [ OpenSSL::ASN1::OctetString.new('aaa'),
  317. OpenSSL::ASN1::EndOfContent.new() ]
  318. cons = OpenSSL::ASN1::Constructive.new(
  319. octets,
  320. OpenSSL::ASN1::OCTET_STRING,
  321. nil,
  322. :UNIVERSAL)
  323. cons.infinite_length = true
  324. expected = %w{ 24 80 04 03 61 61 61 00 00 }
  325. raw = [expected.join('')].pack('H*')
  326. assert_equal(raw, cons.to_der)
  327. assert_equal(raw, OpenSSL::ASN1.decode(raw).to_der)
  328. end
  329. end
  330. def test_prim_explicit_tagging
  331. begin
  332. oct_str = OpenSSL::ASN1::OctetString.new("a", 0, :EXPLICIT)
  333. expected = %w{ A0 03 04 01 61 }
  334. raw = [expected.join('')].pack('H*')
  335. assert_equal(raw, oct_str.to_der)
  336. assert_equal(raw, OpenSSL::ASN1.decode(raw).to_der)
  337. end
  338. end
  339. def test_prim_explicit_tagging_tag_class
  340. begin
  341. oct_str = OpenSSL::ASN1::OctetString.new("a", 0, :EXPLICIT)
  342. oct_str2 = OpenSSL::ASN1::OctetString.new(
  343. "a",
  344. 0,
  345. :EXPLICIT,
  346. :CONTEXT_SPECIFIC)
  347. assert_equal(oct_str.to_der, oct_str2.to_der)
  348. end
  349. end
  350. def test_prim_implicit_tagging
  351. begin
  352. int = OpenSSL::ASN1::Integer.new(1, 0, :IMPLICIT)
  353. expected = %w{ 80 01 01 }
  354. raw = [expected.join('')].pack('H*')
  355. assert_equal(raw, int.to_der)
  356. assert_equal(raw, OpenSSL::ASN1.decode(raw).to_der)
  357. end
  358. end
  359. def test_prim_implicit_tagging_tag_class
  360. begin
  361. int = OpenSSL::ASN1::Integer.new(1, 0, :IMPLICIT)
  362. int2 = OpenSSL::ASN1::Integer.new(1, 0, :IMPLICIT, :CONTEXT_SPECIFIC);
  363. assert_equal(int.to_der, int2.to_der)
  364. end
  365. end
  366. def test_cons_explicit_tagging
  367. begin
  368. content = [ OpenSSL::ASN1::PrintableString.new('abc') ]
  369. seq = OpenSSL::ASN1::Sequence.new(content, 2, :EXPLICIT)
  370. expected = %w{ A2 07 30 05 13 03 61 62 63 }
  371. raw = [expected.join('')].pack('H*')
  372. assert_equal(raw, seq.to_der)
  373. assert_equal(raw, OpenSSL::ASN1.decode(raw).to_der)
  374. end
  375. end
  376. def test_cons_explicit_tagging_inf_length
  377. begin
  378. content = [ OpenSSL::ASN1::PrintableString.new('abc') ,
  379. OpenSSL::ASN1::EndOfContent.new() ]
  380. seq = OpenSSL::ASN1::Sequence.new(content, 2, :EXPLICIT)
  381. seq.infinite_length = true
  382. expected = %w{ A2 80 30 80 13 03 61 62 63 00 00 00 00 }
  383. raw = [expected.join('')].pack('H*')
  384. assert_equal(raw, seq.to_der)
  385. assert_equal(raw, OpenSSL::ASN1.decode(raw).to_der)
  386. end
  387. end
  388. def test_cons_implicit_tagging
  389. begin
  390. content = [ OpenSSL::ASN1::Null.new(nil) ]
  391. seq = OpenSSL::ASN1::Sequence.new(content, 1, :IMPLICIT)
  392. expected = %w{ A1 02 05 00 }
  393. raw = [expected.join('')].pack('H*')
  394. assert_equal(raw, seq.to_der)
  395. assert_equal(raw, OpenSSL::ASN1.decode(raw).to_der)
  396. end
  397. end
  398. def test_cons_implicit_tagging_inf_length
  399. begin
  400. content = [ OpenSSL::ASN1::Null.new(nil),
  401. OpenSSL::ASN1::EndOfContent.new() ]
  402. seq = OpenSSL::ASN1::Sequence.new(content, 1, :IMPLICIT)
  403. seq.infinite_length = true
  404. expected = %w{ A1 80 05 00 00 00 }
  405. raw = [expected.join('')].pack('H*')
  406. assert_equal(raw, seq.to_der)
  407. assert_equal(raw, OpenSSL::ASN1.decode(raw).to_der)
  408. end
  409. end
  410. def test_octet_string_infinite_length_explicit_tagging
  411. begin
  412. octets = [ OpenSSL::ASN1::OctetString.new('aaa'),
  413. OpenSSL::ASN1::EndOfContent.new() ]
  414. cons = OpenSSL::ASN1::Constructive.new(
  415. octets,
  416. 1,
  417. :EXPLICIT)
  418. cons.infinite_length = true
  419. expected = %w{ A1 80 24 80 04 03 61 61 61 00 00 00 00 }
  420. raw = [expected.join('')].pack('H*')
  421. assert_equal(raw, cons.to_der)
  422. assert_equal(raw, OpenSSL::ASN1.decode(raw).to_der)
  423. end
  424. end
  425. def test_octet_string_infinite_length_implicit_tagging
  426. begin
  427. octets = [ OpenSSL::ASN1::OctetString.new('aaa'),
  428. OpenSSL::ASN1::EndOfContent.new() ]
  429. cons = OpenSSL::ASN1::Constructive.new(
  430. octets,
  431. 0,
  432. :IMPLICIT)
  433. cons.infinite_length = true
  434. expected = %w{ A0 80 04 03 61 61 61 00 00 }
  435. raw = [expected.join('')].pack('H*')
  436. assert_equal(raw, cons.to_der)
  437. assert_equal(raw, OpenSSL::ASN1.decode(raw).to_der)
  438. end
  439. end
  440. def test_recursive_octet_string_infinite_length
  441. begin
  442. octets_sub1 = [ OpenSSL::ASN1::OctetString.new("\x01"),
  443. OpenSSL::ASN1::EndOfContent.new() ]
  444. octets_sub2 = [ OpenSSL::ASN1::OctetString.new("\x02"),
  445. OpenSSL::ASN1::EndOfContent.new() ]
  446. container1 = OpenSSL::ASN1::Constructive.new(
  447. octets_sub1,
  448. OpenSSL::ASN1::OCTET_STRING,
  449. nil,
  450. :UNIVERSAL)
  451. container1.infinite_length = true
  452. container2 = OpenSSL::ASN1::Constructive.new(
  453. octets_sub2,
  454. OpenSSL::ASN1::OCTET_STRING,
  455. nil,
  456. :UNIVERSAL)
  457. container2.infinite_length = true
  458. octets3 = OpenSSL::ASN1::OctetString.new("\x03")
  459. octets = [ container1, container2, octets3,
  460. OpenSSL::ASN1::EndOfContent.new() ]
  461. cons = OpenSSL::ASN1::Constructive.new(
  462. octets,
  463. OpenSSL::ASN1::OCTET_STRING,
  464. nil,
  465. :UNIVERSAL)
  466. cons.infinite_length = true
  467. expected = %w{ 24 80 24 80 04 01 01 00 00 24 80 04 01 02 00 00 04 01 03 00 00 }
  468. raw = [expected.join('')].pack('H*')
  469. assert_equal(raw, cons.to_der)
  470. assert_equal(raw, OpenSSL::ASN1.decode(raw).to_der)
  471. end
  472. end
  473. def test_bit_string_infinite_length
  474. begin
  475. content = [ OpenSSL::ASN1::BitString.new("\x01"),
  476. OpenSSL::ASN1::EndOfContent.new() ]
  477. cons = OpenSSL::ASN1::Constructive.new(
  478. content,
  479. OpenSSL::ASN1::BIT_STRING,
  480. nil,
  481. :UNIVERSAL)
  482. cons.infinite_length = true
  483. expected = %w{ 23 80 03 02 00 01 00 00 }
  484. raw = [expected.join('')].pack('H*')
  485. assert_equal(raw, cons.to_der)
  486. assert_equal(raw, OpenSSL::ASN1.decode(raw).to_der)
  487. end
  488. end
  489. def test_primitive_inf_length
  490. assert_raises(OpenSSL::ASN1::ASN1Error) do
  491. spec = %w{ 02 80 02 01 01 00 00 }
  492. raw = [spec.join('')].pack('H*')
  493. OpenSSL::ASN1.decode(raw)
  494. OpenSSL::ASN1.decode_all(raw)
  495. end
  496. end
  497. def test_recursive_octet_string_parse
  498. test = %w{ 24 80 24 80 04 01 01 00 00 24 80 04 01 02 00 00 04 01 03 00 00 }
  499. raw = [test.join('')].pack('H*')
  500. asn1 = OpenSSL::ASN1.decode(raw)
  501. assert_equal(OpenSSL::ASN1::Constructive, asn1.class)
  502. assert_universal(OpenSSL::ASN1::OCTET_STRING, asn1)
  503. assert_equal(true, asn1.infinite_length)
  504. assert_equal(4, asn1.value.size)
  505. nested1 = asn1.value[0]
  506. assert_equal(OpenSSL::ASN1::Constructive, nested1.class)
  507. assert_universal(OpenSSL::ASN1::OCTET_STRING, nested1)
  508. assert_equal(true, nested1.infinite_length)
  509. assert_equal(2, nested1.value.size)
  510. oct1 = nested1.value[0]
  511. assert_universal(OpenSSL::ASN1::OCTET_STRING, oct1)
  512. assert_equal(false, oct1.infinite_length)
  513. assert_universal(OpenSSL::ASN1::EOC, nested1.value[1])
  514. assert_equal(false, nested1.value[1].infinite_length)
  515. nested2 = asn1.value[1]
  516. assert_equal(OpenSSL::ASN1::Constructive, nested2.class)
  517. assert_universal(OpenSSL::ASN1::OCTET_STRING, nested2)
  518. assert_equal(true, nested2.infinite_length)
  519. assert_equal(2, nested2.value.size)
  520. oct2 = nested2.value[0]
  521. assert_universal(OpenSSL::ASN1::OCTET_STRING, oct2)
  522. assert_equal(false, oct2.infinite_length)
  523. assert_universal(OpenSSL::ASN1::EOC, nested2.value[1])
  524. assert_equal(false, nested2.value[1].infinite_length)
  525. oct3 = asn1.value[2]
  526. assert_universal(OpenSSL::ASN1::OCTET_STRING, oct3)
  527. assert_equal(false, oct3.infinite_length)
  528. assert_universal(OpenSSL::ASN1::EOC, asn1.value[3])
  529. assert_equal(false, asn1.value[3].infinite_length)
  530. end
  531. private
  532. def assert_universal(tag, asn1)
  533. assert_equal(tag, asn1.tag)
  534. if asn1.respond_to?(:tagging)
  535. assert_nil(asn1.tagging)
  536. end
  537. assert_equal(:UNIVERSAL, asn1.tag_class)
  538. end
  539. end if defined?(OpenSSL)