Skip to content

Commit db501d7

Browse files
committed
[fix] escaping with OpenSSL::X509::Name::RFC2253
1 parent a16adad commit db501d7

File tree

2 files changed

+44
-14
lines changed

2 files changed

+44
-14
lines changed

src/main/java/org/jruby/ext/openssl/X509Name.java

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -435,11 +435,12 @@ private StringBuilder toFormat(final Ruby runtime, final int format) {
435435
final ASN1ObjectIdentifier oid = oidsIter.next();
436436
String oName = name(runtime, oid);
437437
if ( oName == null ) oName = oid.toString();
438-
final Object value = valuesIter.next();
438+
final Object value = valuesIter.next(); // ASN1String impl (getString() -> toString())
439439

440440
switch (format) {
441441
case RFC2253:
442-
str.append(sep).append(oName).append('=').append(value);
442+
str.append(sep).append(oName).append('=');
443+
appendValueRFC2253(str, value);
443444
sep = ",";
444445
break;
445446
case ONELINE:
@@ -464,6 +465,26 @@ private StringBuilder toFormat(final Ruby runtime, final int format) {
464465
return str;
465466
}
466467

468+
private static void appendValueRFC2253(final StringBuilder str, final Object value) {
469+
final String val = value.toString();
470+
for (int i = 0; i < val.length(); i++) {
471+
char c = val.charAt(i);
472+
switch (c) {
473+
case ',' :
474+
case '+' :
475+
case '"' :
476+
case '<' :
477+
case '>' :
478+
case ';' :
479+
case '\\' :
480+
str.append('\\').append(c);
481+
break;
482+
default :
483+
str.append(c);
484+
}
485+
}
486+
}
487+
467488
@JRubyMethod
468489
public IRubyObject to_utf8(ThreadContext context) {
469490
return StringHelper.newUTF8String(context.runtime, toFormat(context.runtime, RFC2253));

src/test/ruby/x509/test_x509name.rb

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
1+
# encoding: UTF-8
12
require File.expand_path('../test_helper', File.dirname(__FILE__))
23

34
class TestX509Name < TestCase
45

5-
def test_to_a_to_s
6+
def test_to_a_to_s_and_to_utf8
67
dn = [
78
["DC", "org"],
89
["DC", "jruby", 22],
910
["CN", "Karol Bucek"],
1011
["UID", "kares"],
1112
["emailAddress", "[email protected]"],
1213
["serialNumber", "1234567890"],
13-
["street", "Edelenyska"],
14+
["street", "Edelenska"],
1415
['2.5.4.44', 'X'],
15-
['2.5.4.65', 'BUBS'],
16-
['postalCode', '04801', 22],
17-
['postalAddress', 'Edelenyska 1, Roznava'],
16+
['2.5.4.65', 'B;BS'],
17+
['postalCode', '048+01', 22],
18+
['postalAddress', "Edelénska 2022/11, RV"],
1819
]
1920
name = OpenSSL::X509::Name.new
2021
dn.each { |attr| name.add_entry(*attr) }
@@ -27,20 +28,29 @@ def test_to_a_to_s
2728
["UID", "kares", 12],
2829
["emailAddress", "[email protected]", 22],
2930
["serialNumber", "1234567890", 19],
30-
["street", "Edelenyska", 12],
31+
["street", "Edelenska", 12],
3132
['generationQualifier', 'X', 12],
32-
['pseudonym', 'BUBS', 12],
33-
['postalCode', '04801', 22],
34-
['postalAddress', 'Edelenyska 1, Roznava', 12],
33+
['pseudonym', 'B;BS', 12],
34+
['postalCode', '048+01', 22],
35+
['postalAddress', "Edelénska 2022/11, RV", 12],
3536
]
3637

3738
assert_equal exp_to_a.size, ary.size
3839
exp_to_a.each_with_index do |el, i|
3940
assert_equal el, ary[i]
4041
end
4142

42-
str = exp_to_a.map { |arr| "#{arr[0]}=#{arr[1]}" }.join('/')
43-
assert_equal "/#{str}", name.to_s
43+
assert_equal "/DC=org/DC=jruby/CN=Karol Bucek/UID=kares/[email protected]/serialNumber=1234567890/street=Edelenska/generationQualifier=X/pseudonym=B;BS/postalCode=048+01/postalAddress=Edelénska 2022/11, RV",
44+
name.to_s
45+
# assert_equal Encoding::ASCII_8BIT, name.to_s.encoding # MRI behavior
46+
# assert_equal "DC=org, DC=jruby, CN=Karol Bucek/UID=kares/[email protected]/serialNumber=1234567890/street=Edelenska/generationQualifier=X/pseudonym=B;BS/postalCode=048+01/postalAddress=Edelénska 2022/11, RV",
47+
# name.to_s(OpenSSL::X509::Name::COMPAT)
48+
# assert_equal Encoding::ASCII_8BIT, name.to_s(OpenSSL::X509::Name::COMPAT).encoding # MRI behavior
49+
50+
assert_equal "postalAddress=Edelénska 2022/11\\, RV,postalCode=048\\+01,pseudonym=B\\;BS,generationQualifier=X,street=Edelenska,serialNumber=1234567890,[email protected],UID=kares,CN=Karol Bucek,DC=jruby,DC=org",
51+
name.to_s(OpenSSL::X509::Name::RFC2253)
52+
assert_equal "postalAddress=Edelénska 2022/11\\, RV,postalCode=048\\+01,pseudonym=B\\;BS,generationQualifier=X,street=Edelenska,serialNumber=1234567890,[email protected],UID=kares,CN=Karol Bucek,DC=jruby,DC=org",
53+
name.to_utf8
4454
end
4555

4656
def test_raise_on_invalid_field_name
@@ -76,7 +86,6 @@ def test_hash_multiple_spaces_mixed_case
7686
end
7787

7888
def test_hash_long_name
79-
puts 'test_hash_long_name'
8089
name = OpenSSL::X509::Name.new [['CN', 'a' * 255], ['DC', 'example']]
8190
assert_equal 214469118, name.hash
8291
end

0 commit comments

Comments
 (0)