Module: OpenSSL::X509::Name::RFC2253DN

Defined in:
lib/jopenssl21/openssl/x509.rb,
lib/jopenssl22/openssl/x509.rb,
lib/jopenssl23/openssl/x509.rb,
lib/jopenssl18/openssl/x509-internal.rb,
lib/jopenssl19/openssl/x509-internal.rb

Constant Summary collapse

Special =
',=+<>#;'
HexChar =
/[0-9a-fA-F]/
HexPair =
/#{HexChar}#{HexChar}/
HexString =
/#{HexPair}+/
Pair =
/\\(?:[#{Special}]|\\|"|#{HexPair})/
StringChar =
/[^#{Special}\\"]/
QuoteChar =
/[^\\"]/
AttributeType =
/[a-zA-Z][0-9a-zA-Z]*|[0-9]+(?:\.[0-9]+)*/
AttributeValue =
/
  (?!["#])((?:#{StringChar}|#{Pair})*)|
  \#(#{HexString})|
  "((?:#{QuoteChar}|#{Pair})*)"
/x
TypeAndValue =
/\A(#{AttributeType})=#{AttributeValue}/

Class Method Summary collapse

Class Method Details

.expand_hexstring(str) ⇒ Object



54
55
56
57
58
59
# File 'lib/jopenssl21/openssl/x509.rb', line 54

def expand_hexstring(str)
  return nil unless str
  der = str.gsub(HexPair){$&.to_i(16).chr }
  a1 = OpenSSL::ASN1.decode(der)
  return a1.value, a1.tag
end

.expand_pair(str) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
# File 'lib/jopenssl21/openssl/x509.rb', line 42

def expand_pair(str)
  return nil unless str
  return str.gsub(Pair){
    pair = $&
    case pair.size
    when 2 then pair[1,1]
    when 3 then Integer("0x#{pair[1,2]}").chr
    else raise OpenSSL::X509::NameError, "invalid pair: #{str}"
    end
  }
end

.expand_value(str1, str2, str3) ⇒ Object



61
62
63
64
65
66
# File 'lib/jopenssl21/openssl/x509.rb', line 61

def expand_value(str1, str2, str3)
  value = expand_pair(str1)
  value, tag = expand_hexstring(str2) unless value
  value = expand_pair(str3) unless value
  return value, tag
end

.scan(dn) ⇒ Object



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/jopenssl21/openssl/x509.rb', line 68

def scan(dn)
  str = dn
  ary = []
  while true
    if md = TypeAndValue.match(str)
      remain = md.post_match
      type = md[1]
      value, tag = expand_value(md[2], md[3], md[4]) rescue nil
      if value
        type_and_value = [type, value]
        type_and_value.push(tag) if tag
        ary.unshift(type_and_value)
        if remain.length > 2 && remain[0] == ?,
          str = remain[1..-1]
          next
        elsif remain.length > 2 && remain[0] == ?+
          raise OpenSSL::X509::NameError,
            "multi-valued RDN is not supported: #{dn}"
        elsif remain.empty?
          break
        end
      end
    end
    msg_dn = dn[0, dn.length - str.length] + " =>" + str
    raise OpenSSL::X509::NameError, "malformed RDN: #{msg_dn}"
  end
  return ary
end