=begin
= $RCSfile$ -- Ruby-space definitions that completes C-space funcs for X509 and subclasses
= Info
'OpenSSL for Ruby 2' project
Copyright (C) 2002 Michal Rokos <m.rokos@sh.cvut.cz>
All rights reserved.
= Licence
This program is licenced under the same licence as Ruby.
(See the file 'LICENCE'.)
= Version
$Id: x509-internal.rb 32663 2011-07-25 04:51:26Z nahi $
=endmoduleOpenSSLmoduleX509classExtensionFactorydefcreate_extension(*arg)ifarg.size>1create_ext(*arg)elsesend("create_ext_from_"+arg[0].class.name.downcase,arg[0])endenddefcreate_ext_from_array(ary)raiseExtensionError,"unexpected array form"ifary.size>3create_ext(ary[0],ary[1],ary[2])enddefcreate_ext_from_string(str)# "oid = critical, value"oid,value=str.split(/=/,2)oid.strip!value.strip!create_ext(oid,value)enddefcreate_ext_from_hash(hash)create_ext(hash["oid"],hash["value"],hash["critical"])endendclassExtensiondefto_s# "oid = critical, value"str=self.oidstr<<" = "str<<"critical, "ifself.critical?str<<self.value.gsub(/\n/,", ")enddefto_h# {"oid"=>sn|ln, "value"=>value, "critical"=>true|false}{"oid"=>self.oid,"value"=>self.value,"critical"=>self.critical?}enddefto_a[self.oid,self.value,self.critical?]endendclassNamemoduleRFC2253DNSpecial=',=+<>#;'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})*)"
/xTypeAndValue=/\A(#{AttributeType})=#{AttributeValue}/module_functiondefexpand_pair(str)returnnilunlessstrreturnstr.gsub(Pair){pair=$&casepair.sizewhen2thenpair[1,1]when3thenInteger("0x#{pair[1,2]}").chrelseraiseOpenSSL::X509::NameError,"invalid pair: #{str}"end}enddefexpand_hexstring(str)returnnilunlessstrder=str.gsub(HexPair){$&.to_i(16).chr}a1=OpenSSL::ASN1.decode(der)returna1.value,a1.tagenddefexpand_value(str1,str2,str3)value=expand_pair(str1)value,tag=expand_hexstring(str2)unlessvaluevalue=expand_pair(str3)unlessvaluereturnvalue,tagenddefscan(dn)str=dnary=[]whiletrueifmd=TypeAndValue.match(str)remain=md.post_matchtype=md[1]value,tag=expand_value(md[2],md[3],md[4])rescuenilifvaluetype_and_value=[type,value]type_and_value.push(tag)iftagary.unshift(type_and_value)ifremain.length>2&&remain[0]==?,str=remain[1..-1]nextelsifremain.length>2&&remain[0]==?+raiseOpenSSL::X509::NameError,"multi-valued RDN is not supported: #{dn}"elsifremain.empty?breakendendendmsg_dn=dn[0,dn.length-str.length]+" =>"+strraiseOpenSSL::X509::NameError,"malformed RDN: #{msg_dn}"endreturnaryendendclass<<selfdefparse_rfc2253(str,template=OBJECT_TYPE_TEMPLATE)ary=OpenSSL::X509::Name::RFC2253DN.scan(str)self.new(ary,template)enddefparse_openssl(str,template=OBJECT_TYPE_TEMPLATE)ary=str.scan(/\s*([^\/,]+)\s*/).collect{|i|i[0].split("=",2)}self.new(ary,template)endaliasparseparse_opensslendendclassStoreContextdefcleanupwarn"(#{caller.first}) OpenSSL::X509::StoreContext#cleanup is deprecated with no replacement"if$VERBOSEendendendend