1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
=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$
=end
##
# Should we care what if somebody require this file directly?
#require 'openssl'
module OpenSSL
module X509
class ExtensionFactory
def create_extension(*arg)
if arg.size == 1 then arg = arg[0] end
type = arg.class
while type
method = "create_ext_from_#{type.name.downcase}".intern
return send(method, arg) if respond_to? method
type = type.superclass
end
raise TypeError, "Don't how to create ext from #{arg.class}"
###send("create_ext_from_#{arg.class.name.downcase}", arg)
end
#
# create_ext_from_array is built-in
#
def create_ext_from_string(str) # "oid = critical, value"
unless str =~ /\s*=\s*/
raise ArgumentError, "string in format \"oid = value\" expected"
end
ary = []
ary << $`.sub(/^\s*/,"") # delete whitespaces from the beginning
rest = $'.sub(/\s*$/,"") # delete them from the end
if rest =~ /^critical,\s*/ # handle 'critical' option
ary << $'
ary << true
else
ary << rest
end
create_ext_from_array(ary)
end
#
# Create an extention from Hash
# {"oid"=>sn|ln, "value"=>value, "critical"=>true|false}
#
def create_ext_from_hash(hash)
unless (hash.has_key? "oid" and hash.has_key? "value")
raise ArgumentError,
"hash in format {\"oid\"=>..., \"value\"=>...} expected"
end
ary = []
ary << hash["oid"]
ary << hash["value"]
ary << hash["critical"] if hash.has_key? "critical"
create_ext_from_array(ary)
end
end # ExtensionFactory
class Extension
def to_s # "oid = critical, value"
str = self.oid
str << " = "
str << "critical, " if self.critical?
str << self.value.gsub(/\n/, ", ")
end
def to_h # {"oid"=>sn|ln, "value"=>value, "critical"=>true|false}
{"oid"=>self.oid,"value"=>self.value,"critical"=>self.critical?}
end
def to_a
[ self.oid, self.value, self.critical? ]
end
end # Extension
class Attribute
def self.new(arg)
type = arg.class
while type
method = "new_from_#{type.name.downcase}".intern
return Attribute::send(method, arg) if Attribute::respond_to? method
type = type.superclass
end
raise "Don't how to make new #{self} from #{arg.class}"
###Attribute::send("new_from_#{arg.class.name.downcase}", arg)
end
#
# Attribute::new_from_array(ary) is built-in method
#
def Attribute::new_from_string(str) # "oid = value"
unless str =~ /\s*=\s*/
raise ArgumentError, "string in format \"oid = value\" expected"
end
ary = []
ary << $`.sub(/^\s*/,"") # delete whitespaces from the beginning
ary << $'.sub(/\s*$/,"") # delete them from the end
Attribute::new_from_array(ary)
end
#
# Create an attribute from Hash
# {"oid"=>sn|ln, "value"=>value, "critical"=>true|false}
#
def Attribute::new_from_hash(hash) # {"oid"=>"...", "value"=>"..."}
unless (hash.has_key? "oid" and hash.has_key? "value")
raise ArgumentError,
"hash in format {\"oid\"=>..., \"value\"=>...} expected"
end
ary = []
ary << hash["oid"]
ary << hash["value"]
Attribute::new_from_array(ary)
end
end # Attribute
class Name
def self.parse(str)
ary = str.scan(/\s*([^\/,]+)\s*/).collect{|i| i[0].split("=") }
self.new(ary)
end
end # Name
end # X509
end # OpenSSL
|