Skip to content

Commit 19c67cd

Browse files
committed
x509name: update regexp in OpenSSL::X509::Name.parse
Allow the attribute value to contain ',', just as the openssl utility's parse_name() function does. Fixes: #39
1 parent e96d9c0 commit 19c67cd

File tree

2 files changed

+22
-21
lines changed

2 files changed

+22
-21
lines changed

lib/openssl/x509.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,13 @@ def parse_rfc2253(str, template=OBJECT_TYPE_TEMPLATE)
139139
end
140140

141141
def parse_openssl(str, template=OBJECT_TYPE_TEMPLATE)
142-
ary = str.scan(/\s*([^\/,]+)\s*/).collect{|i| i[0].split("=", 2) }
142+
if str.start_with?("/")
143+
# /A=B/C=D format
144+
ary = str[1..-1].split("/").map { |i| i.split("=", 2) }
145+
else
146+
# Comma-separated
147+
ary = str.split(",").map { |i| i.strip.split("=", 2) }
148+
end
143149
self.new(ary, template)
144150
end
145151

test/test_x509name.rb

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -148,33 +148,28 @@ def test_unrecognized_oid_parse_encode_equality
148148
end
149149

150150
def test_s_parse
151-
dn = "/DC=org/DC=ruby-lang/CN=www.ruby-lang.org"
151+
dn = "/DC=org/DC=ruby-lang/CN=www.ruby-lang.org/1.2.3.4.5.6=A=BCD"
152152
name = OpenSSL::X509::Name.parse(dn)
153153
assert_equal(dn, name.to_s)
154154
ary = name.to_a
155-
assert_equal("DC", ary[0][0])
156-
assert_equal("DC", ary[1][0])
157-
assert_equal("CN", ary[2][0])
158-
assert_equal("org", ary[0][1])
159-
assert_equal("ruby-lang", ary[1][1])
160-
assert_equal("www.ruby-lang.org", ary[2][1])
161-
assert_equal(OpenSSL::ASN1::IA5STRING, ary[0][2])
162-
assert_equal(OpenSSL::ASN1::IA5STRING, ary[1][2])
163-
assert_equal(OpenSSL::ASN1::UTF8STRING, ary[2][2])
164-
165-
dn2 = "DC=org, DC=ruby-lang, CN=www.ruby-lang.org"
155+
assert_equal [
156+
["DC", "org", OpenSSL::ASN1::IA5STRING],
157+
["DC", "ruby-lang", OpenSSL::ASN1::IA5STRING],
158+
["CN", "www.ruby-lang.org", OpenSSL::ASN1::UTF8STRING],
159+
["1.2.3.4.5.6", "A=BCD", OpenSSL::ASN1::UTF8STRING],
160+
], ary
161+
162+
dn2 = "DC=org, DC=ruby-lang, CN=www.ruby-lang.org, 1.2.3.4.5.6=A=BCD"
166163
name = OpenSSL::X509::Name.parse(dn2)
167-
ary = name.to_a
168164
assert_equal(dn, name.to_s)
169-
assert_equal("org", ary[0][1])
170-
assert_equal("ruby-lang", ary[1][1])
171-
assert_equal("www.ruby-lang.org", ary[2][1])
165+
assert_equal ary, name.to_a
172166

173167
name = OpenSSL::X509::Name.parse(dn2, @obj_type_tmpl)
174168
ary = name.to_a
175169
assert_equal(OpenSSL::ASN1::IA5STRING, ary[0][2])
176170
assert_equal(OpenSSL::ASN1::IA5STRING, ary[1][2])
177171
assert_equal(OpenSSL::ASN1::PRINTABLESTRING, ary[2][2])
172+
assert_equal(OpenSSL::ASN1::PRINTABLESTRING, ary[3][2])
178173
end
179174

180175
def test_s_parse_rfc2253
@@ -357,15 +352,15 @@ def test_add_entry_placing
357352
end
358353

359354
def test_equals2
360-
n1 = OpenSSL::X509::Name.parse 'CN=a'
361-
n2 = OpenSSL::X509::Name.parse 'CN=a'
355+
n1 = OpenSSL::X509::Name.parse_rfc2253 'CN=a'
356+
n2 = OpenSSL::X509::Name.parse_rfc2253 'CN=a'
362357

363358
assert_equal n1, n2
364359
end
365360

366361
def test_spaceship
367-
n1 = OpenSSL::X509::Name.parse 'CN=a'
368-
n2 = OpenSSL::X509::Name.parse 'CN=b'
362+
n1 = OpenSSL::X509::Name.parse_rfc2253 'CN=a'
363+
n2 = OpenSSL::X509::Name.parse_rfc2253 'CN=b'
369364

370365
assert_equal(-1, n1 <=> n2)
371366
end

0 commit comments

Comments
 (0)