summaryrefslogtreecommitdiff
path: root/ext/openssl/lib/openssl/x509.rb
blob: 8efe3701c8991c4612999d91851f0265f5df3a3c (plain)
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