rasn1 0.10.0 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rasn1/errors.rb +43 -0
- data/lib/rasn1/model.rb +137 -114
- data/lib/rasn1/types/base.rb +12 -1
- data/lib/rasn1/types/choice.rb +7 -9
- data/lib/rasn1/types/constrained.rb +55 -0
- data/lib/rasn1/types.rb +23 -0
- data/lib/rasn1/version.rb +1 -1
- data/lib/rasn1.rb +1 -24
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cc6eb3e3649f88dae027153d6136d5e5969135c74a527d4abbc42a42e03e2e73
|
4
|
+
data.tar.gz: a674238e2461230d7076ffb29250b3a222c229b7af484b586da25642ba87863a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dba48f620835a6ce4c9b6764d1538a2f96a94f21a7c8aa39b587783ba08b5c745c918eb885276372b3ae215f904596dfb3b5eab818c1a7416131e898c9c220eb
|
7
|
+
data.tar.gz: e397c4b1b78320a3b69e24aa9bbf46d29b04653b03aed76f9c906e5e47a03b027957d2d8d6a8f60793f13255b2492f5eb43e9f05a73d3e8dd9bde676cbbcdfe9
|
data/lib/rasn1/errors.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RASN1
|
4
|
+
# Base error class
|
5
|
+
class Error < StandardError; end
|
6
|
+
|
7
|
+
# ASN.1 encoding/decoding error
|
8
|
+
class ASN1Error < Error; end
|
9
|
+
|
10
|
+
# ASN.1 class error
|
11
|
+
class ClassError < Error
|
12
|
+
# @return [String]
|
13
|
+
def message
|
14
|
+
"Tag class should be a symbol among: #{Types::Base::CLASSES.keys.join(', ')}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# Enumerated error
|
19
|
+
class EnumeratedError < Error; end
|
20
|
+
|
21
|
+
# CHOICE error: #chosen not set
|
22
|
+
class ChoiceError < RASN1::Error
|
23
|
+
def message
|
24
|
+
"CHOICE #{@name}: #chosen not set"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Exception raised when a constraint is not verified on a constrained type.
|
29
|
+
# @version 0.11.0
|
30
|
+
# @author Sylvain Daubert
|
31
|
+
class ConstraintError < Error
|
32
|
+
# @param [Types::Base] object
|
33
|
+
def initialize(object)
|
34
|
+
@object = object
|
35
|
+
super()
|
36
|
+
end
|
37
|
+
|
38
|
+
# @return [String]
|
39
|
+
def message
|
40
|
+
"Constraint not verified on #{object.inspect}"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/rasn1/model.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative 'types/constrained'
|
4
|
+
|
3
5
|
module RASN1
|
4
6
|
# @abstract
|
5
7
|
# {Model} class is a base class to define ASN.1 models.
|
@@ -18,6 +20,8 @@ module RASN1
|
|
18
20
|
# integer(:house, explicit: 1, default: 0)])
|
19
21
|
# end
|
20
22
|
#
|
23
|
+
# In a model, each element must have a unique name.
|
24
|
+
#
|
21
25
|
# === Parse a DER-encoded string
|
22
26
|
# record = Record.parse(der_string)
|
23
27
|
# record[:id] # => RASN1::Types::Integer
|
@@ -53,16 +57,17 @@ module RASN1
|
|
53
57
|
#
|
54
58
|
# == Delegation
|
55
59
|
# {Model} may delegate some methods to its root element. Thus, if root element
|
56
|
-
# is, for example, a {
|
60
|
+
# is, for example, a {TypeInts::Choice}, model may delegate +#chosen+ and +#chosen_value+.
|
57
61
|
#
|
58
62
|
# All methods defined by root may be delegated by model, unless model also defines
|
59
63
|
# this method.
|
60
64
|
# @author Sylvain Daubert
|
61
|
-
class Model
|
65
|
+
class Model
|
62
66
|
# @private
|
63
67
|
Elem = Struct.new(:name, :proc_or_class, :content)
|
64
68
|
|
65
|
-
|
69
|
+
# @private
|
70
|
+
module Accel
|
66
71
|
# @return [Hash]
|
67
72
|
attr_reader :options
|
68
73
|
|
@@ -100,120 +105,39 @@ module RASN1
|
|
100
105
|
klass.class_eval { @root = root }
|
101
106
|
end
|
102
107
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
# @method choice(name, options)
|
114
|
-
# @param [Symbol,String] name name of object in model
|
115
|
-
# @param [Hash] options
|
116
|
-
# @return [Elem]
|
117
|
-
# @see Types::Choice#initialize
|
118
|
-
%w[sequence set choice].each do |type|
|
119
|
-
class_eval "def #{type}(name, options={})\n" \
|
120
|
-
" options.merge!(name: name)\n" \
|
121
|
-
" proc = proc do |opts|\n" \
|
122
|
-
" Types::#{type.capitalize}.new(options.merge(opts))\n" \
|
123
|
-
" end\n" \
|
124
|
-
" @root = Elem.new(name, proc, options[:content])\n" \
|
125
|
-
'end'
|
108
|
+
def define_type_accel_base(accel_name, klass)
|
109
|
+
singleton_class.class_eval(
|
110
|
+
"def #{accel_name}(name, options={})\n" \
|
111
|
+
" options[:name] = name\n" \
|
112
|
+
" proc = proc do |opts|\n" \
|
113
|
+
" #{klass}.new(options.merge(opts))\n" \
|
114
|
+
" end\n" \
|
115
|
+
" @root = Elem.new(name, proc, options[:content])\n" \
|
116
|
+
'end'
|
117
|
+
)
|
126
118
|
end
|
127
119
|
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
# @return [Elem]
|
139
|
-
# @see Types::SetOf#initialize
|
140
|
-
%w[sequence set].each do |type|
|
141
|
-
klass_name = "Types::#{type.capitalize}Of"
|
142
|
-
class_eval "def #{type}_of(name, type, options={})\n" \
|
143
|
-
" options.merge!(name: name)\n" \
|
144
|
-
" proc = proc do |opts|\n" \
|
145
|
-
" #{klass_name}.new(type, options.merge(opts))\n" \
|
146
|
-
" end\n" \
|
147
|
-
" @root = Elem.new(name, proc, nil)\n" \
|
148
|
-
'end'
|
120
|
+
def define_type_accel_of(accel_name, klass)
|
121
|
+
singleton_class.class_eval(
|
122
|
+
"def #{accel_name}_of(name, type, options={})\n" \
|
123
|
+
" options[:name] = name\n" \
|
124
|
+
" proc = proc do |opts|\n" \
|
125
|
+
" #{klass}.new(type, options.merge(opts))\n" \
|
126
|
+
" end\n" \
|
127
|
+
" @root = Elem.new(name, proc, nil)\n" \
|
128
|
+
'end'
|
129
|
+
)
|
149
130
|
end
|
150
131
|
|
151
|
-
#
|
152
|
-
#
|
153
|
-
#
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
# @see Types::Integer#initialize
|
161
|
-
# @method bit_string(name, options)
|
162
|
-
# @param [Symbol,String] name name of object in model
|
163
|
-
# @param [Hash] options
|
164
|
-
# @return [Elem]
|
165
|
-
# @see Types::BitString#initialize
|
166
|
-
# @method octet_string(name, options)
|
167
|
-
# @param [Symbol,String] name name of object in model
|
168
|
-
# @param [Hash] options
|
169
|
-
# @return [Elem]
|
170
|
-
# @see Types::OctetString#initialize
|
171
|
-
# @method null(name, options)
|
172
|
-
# @param [Symbol,String] name name of object in model
|
173
|
-
# @param [Hash] options
|
174
|
-
# @return [Elem]
|
175
|
-
# @see Types::Null#initialize
|
176
|
-
# @method enumerated(name, options)
|
177
|
-
# @param [Symbol,String] name name of object in model
|
178
|
-
# @param [Hash] options
|
179
|
-
# @return [Elem]
|
180
|
-
# @see Types::Enumerated#initialize
|
181
|
-
# @method utf8_string(name, options)
|
182
|
-
# @param [Symbol,String] name name of object in model
|
183
|
-
# @param [Hash] options
|
184
|
-
# @return [Elem]
|
185
|
-
# @see Types::Utf8String#initialize
|
186
|
-
# @method numeric_string(name, options)
|
187
|
-
# @param [Symbol,String] name name of object in model
|
188
|
-
# @param [Hash] options
|
189
|
-
# @return [Elem]
|
190
|
-
# @see Types::NumericString#initialize
|
191
|
-
# @method printable_string(name, options)
|
192
|
-
# @param [Symbol,String] name name of object in model
|
193
|
-
# @param [Hash] options
|
194
|
-
# @return [Elem]
|
195
|
-
# @see Types::PrintableString#initialize
|
196
|
-
# @method visible_string(name, options)
|
197
|
-
# @param [Symbol,String] name name of object in model
|
198
|
-
# @param [Hash] options
|
199
|
-
# @return [Elem]
|
200
|
-
# @see Types::VisibleString#initialize
|
201
|
-
# @method ia5_string(name, options)
|
202
|
-
# @param [Symbol,String] name name of object in model
|
203
|
-
# @param [Hash] options
|
204
|
-
# @return [Elem]
|
205
|
-
# @see Types::IA5String#initialize
|
206
|
-
Types.primitives.each do |prim|
|
207
|
-
next if prim == Types::ObjectId
|
208
|
-
|
209
|
-
method_name = prim.type.gsub(/([a-z0-9])([A-Z])/, '\1_\2').downcase.gsub(/\s+/, '_')
|
210
|
-
class_eval "def #{method_name}(name, options={})\n" \
|
211
|
-
" options.merge!(name: name)\n" \
|
212
|
-
" proc = proc do |opts|\n" \
|
213
|
-
" #{prim}.new(options.merge(opts))\n" \
|
214
|
-
" end\n" \
|
215
|
-
" @root = Elem.new(name, proc, nil)\n" \
|
216
|
-
'end'
|
132
|
+
# Define an accelarator to access a type in a model definition
|
133
|
+
# @param [String] accel_name
|
134
|
+
# @param [Class] klass
|
135
|
+
def define_type_accel(accel_name, klass)
|
136
|
+
if klass < Types::SequenceOf
|
137
|
+
define_type_accel_of(accel_name, klass)
|
138
|
+
else
|
139
|
+
define_type_accel_base(accel_name, klass)
|
140
|
+
end
|
217
141
|
end
|
218
142
|
|
219
143
|
# @param [Symbol,String] name name of object in model
|
@@ -258,6 +182,105 @@ module RASN1
|
|
258
182
|
end
|
259
183
|
end
|
260
184
|
|
185
|
+
extend Accel
|
186
|
+
|
187
|
+
# @method sequence(name, options)
|
188
|
+
# @param [Symbol,String] name name of object in model
|
189
|
+
# @param [Hash] options
|
190
|
+
# @return [Elem]
|
191
|
+
# @see Types::Sequence#initialize
|
192
|
+
# @method set(name, options)
|
193
|
+
# @param [Symbol,String] name name of object in model
|
194
|
+
# @param [Hash] options
|
195
|
+
# @return [Elem]
|
196
|
+
# @see Types::Set#initialize
|
197
|
+
# @method choice(name, options)
|
198
|
+
# @param [Symbol,String] name name of object in model
|
199
|
+
# @param [Hash] options
|
200
|
+
# @return [Elem]
|
201
|
+
# @see Types::Choice#initialize
|
202
|
+
%w[sequence set choice].each do |type|
|
203
|
+
self.define_type_accel_base(type, Types.const_get(type.capitalize))
|
204
|
+
end
|
205
|
+
|
206
|
+
# @method sequence_of(name, type, options)
|
207
|
+
# @param [Symbol,String] name name of object in model
|
208
|
+
# @param [Model, Types::Base] type type for SEQUENCE OF
|
209
|
+
# @param [Hash] options
|
210
|
+
# @return [Elem]
|
211
|
+
# @see Types::SequenceOf#initialize
|
212
|
+
# @method set_of(name, type, options)
|
213
|
+
# @param [Symbol,String] name name of object in model
|
214
|
+
# @param [Model, Types::Base] type type for SET OF
|
215
|
+
# @param [Hash] options
|
216
|
+
# @return [Elem]
|
217
|
+
# @see Types::SetOf#initialize
|
218
|
+
%w[sequence set].each do |type|
|
219
|
+
define_type_accel_of(type, Types.const_get("#{type.capitalize}Of"))
|
220
|
+
end
|
221
|
+
|
222
|
+
# @method boolean(name, options)
|
223
|
+
# @param [Symbol,String] name name of object in model
|
224
|
+
# @param [Hash] options
|
225
|
+
# @return [Elem]
|
226
|
+
# @see Types::Boolean#initialize
|
227
|
+
# @method integer(name, options)
|
228
|
+
# @param [Symbol,String] name name of object in model
|
229
|
+
# @param [Hash] options
|
230
|
+
# @return [Elem]
|
231
|
+
# @see Types::Integer#initialize
|
232
|
+
# @method bit_string(name, options)
|
233
|
+
# @param [Symbol,String] name name of object in model
|
234
|
+
# @param [Hash] options
|
235
|
+
# @return [Elem]
|
236
|
+
# @see Types::BitString#initialize
|
237
|
+
# @method octet_string(name, options)
|
238
|
+
# @param [Symbol,String] name name of object in model
|
239
|
+
# @param [Hash] options
|
240
|
+
# @return [Elem]
|
241
|
+
# @see Types::OctetString#initialize
|
242
|
+
# @method null(name, options)
|
243
|
+
# @param [Symbol,String] name name of object in model
|
244
|
+
# @param [Hash] options
|
245
|
+
# @return [Elem]
|
246
|
+
# @see Types::Null#initialize
|
247
|
+
# @method enumerated(name, options)
|
248
|
+
# @param [Symbol,String] name name of object in model
|
249
|
+
# @param [Hash] options
|
250
|
+
# @return [Elem]
|
251
|
+
# @see Types::Enumerated#initialize
|
252
|
+
# @method utf8_string(name, options)
|
253
|
+
# @param [Symbol,String] name name of object in model
|
254
|
+
# @param [Hash] options
|
255
|
+
# @return [Elem]
|
256
|
+
# @see Types::Utf8String#initialize
|
257
|
+
# @method numeric_string(name, options)
|
258
|
+
# @param [Symbol,String] name name of object in model
|
259
|
+
# @param [Hash] options
|
260
|
+
# @return [Elem]
|
261
|
+
# @see Types::NumericString#initialize
|
262
|
+
# @method printable_string(name, options)
|
263
|
+
# @param [Symbol,String] name name of object in model
|
264
|
+
# @param [Hash] options
|
265
|
+
# @return [Elem]
|
266
|
+
# @see Types::PrintableString#initialize
|
267
|
+
# @method visible_string(name, options)
|
268
|
+
# @param [Symbol,String] name name of object in model
|
269
|
+
# @param [Hash] options
|
270
|
+
# @return [Elem]
|
271
|
+
# @see Types::VisibleString#initialize
|
272
|
+
# @method ia5_string(name, options)
|
273
|
+
# @param [Symbol,String] name name of object in model
|
274
|
+
# @param [Hash] options
|
275
|
+
# @return [Elem]
|
276
|
+
# @see Types::IA5String#initialize
|
277
|
+
Types.primitives.each do |prim|
|
278
|
+
next if prim == Types::ObjectId
|
279
|
+
|
280
|
+
method_name = prim.type.gsub(/([a-z0-9])([A-Z])/, '\1_\2').downcase.gsub(/\s+/, '_')
|
281
|
+
self.define_type_accel_base(method_name, prim)
|
282
|
+
end
|
283
|
+
|
261
284
|
# Create a new instance of a {Model}
|
262
285
|
# @param [Hash] args
|
263
286
|
def initialize(args={})
|
@@ -425,7 +448,7 @@ module RASN1
|
|
425
448
|
when Proc
|
426
449
|
proc_or_class.call(options)
|
427
450
|
when Class
|
428
|
-
proc_or_class.new
|
451
|
+
proc_or_class.new(options)
|
429
452
|
end
|
430
453
|
end
|
431
454
|
|
data/lib/rasn1/types/base.rb
CHANGED
@@ -95,6 +95,13 @@ module RASN1
|
|
95
95
|
obj
|
96
96
|
end
|
97
97
|
|
98
|
+
# Say if a type is constrained.
|
99
|
+
# Always return +false+ for predefined types
|
100
|
+
# @return [Booleran]
|
101
|
+
def self.constrained?
|
102
|
+
false
|
103
|
+
end
|
104
|
+
|
98
105
|
# @param [Hash] options
|
99
106
|
# @option options [Symbol] :class ASN.1 class. Default value is +:universal+.
|
100
107
|
# If +:explicit+ or +:implicit:+ is defined, default value is +:context+.
|
@@ -110,8 +117,12 @@ module RASN1
|
|
110
117
|
def initialize(options={})
|
111
118
|
@constructed = nil
|
112
119
|
set_options options
|
120
|
+
specific_initializer
|
113
121
|
end
|
114
122
|
|
123
|
+
# @abstract To help subclass initialize itself. Default implementation do nothing.
|
124
|
+
def specific_initializer; end
|
125
|
+
|
115
126
|
# Used by +#dup+ and +#clone+. Deep copy @value and @default.
|
116
127
|
def initialize_copy(_other)
|
117
128
|
@value = @value.dup
|
@@ -455,7 +466,7 @@ module RASN1
|
|
455
466
|
def raise_on_indefinite_length(ber)
|
456
467
|
if primitive?
|
457
468
|
raise ASN1Error, "malformed #{type}: indefinite length " \
|
458
|
-
|
469
|
+
'forbidden for primitive types'
|
459
470
|
elsif ber
|
460
471
|
raise NotImplementedError, 'indefinite length not supported'
|
461
472
|
else
|
data/lib/rasn1/types/choice.rb
CHANGED
@@ -77,15 +77,13 @@ module RASN1
|
|
77
77
|
def parse!(der, ber: false)
|
78
78
|
parsed = false
|
79
79
|
@value.each_with_index do |element, i|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
next
|
88
|
-
end
|
80
|
+
@chosen = i
|
81
|
+
nb_bytes = element.parse!(der, ber: ber)
|
82
|
+
parsed = true
|
83
|
+
return nb_bytes
|
84
|
+
rescue ASN1Error
|
85
|
+
@chosen = nil
|
86
|
+
next
|
89
87
|
end
|
90
88
|
raise ASN1Error, "CHOICE #{@name}: no type matching #{der.inspect}" unless parsed
|
91
89
|
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RASN1
|
4
|
+
module Types
|
5
|
+
# Mixin to had constraints on a RASN1 type.
|
6
|
+
# Should not be used directly but through {Model.define_type}.
|
7
|
+
# @version 0.11.0
|
8
|
+
# @author Sylvain Daubert
|
9
|
+
module Constrained
|
10
|
+
module ClassMethods
|
11
|
+
# Setter for constraint
|
12
|
+
# @param [Proc,nil] constraint
|
13
|
+
# @return [Proc,nil]
|
14
|
+
def constraint=(constraint)
|
15
|
+
@constraint = constraint
|
16
|
+
end
|
17
|
+
|
18
|
+
# Check if a constraint is really defined
|
19
|
+
# @return [Boolean]
|
20
|
+
def constrained?
|
21
|
+
@constraint.is_a?(Proc)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Check constraint, if defined
|
25
|
+
# @param [Object] value the value of the type to check
|
26
|
+
# @raise [ConstraintError] constraint is not verified
|
27
|
+
def check_constraint(value)
|
28
|
+
return unless constrained?
|
29
|
+
raise ConstraintError.new(self) unless @constraint.call(value)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class << self
|
34
|
+
attr_reader :constraint
|
35
|
+
|
36
|
+
def included(base)
|
37
|
+
base.extend ClassMethods
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Redefined +#value=+ to check constraint before assigning +val+
|
42
|
+
# @see Types::Base#value=
|
43
|
+
# @raise [ConstraintError] constraint is not verified
|
44
|
+
def value=(val)
|
45
|
+
self.class.check_constraint(val)
|
46
|
+
super
|
47
|
+
end
|
48
|
+
|
49
|
+
def der_to_value(der, ber: false)
|
50
|
+
super
|
51
|
+
self.class.check_constraint(@value)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/lib/rasn1/types.rb
CHANGED
@@ -73,6 +73,29 @@ module RASN1
|
|
73
73
|
@id2types.default = Types::Base
|
74
74
|
@id2types.freeze
|
75
75
|
end
|
76
|
+
|
77
|
+
# Define a new ASN.1 type from a base one.
|
78
|
+
# This new type may have a constraint defines on it.
|
79
|
+
# @param [Symbol,String] name New type name. Must start with a capital letter.
|
80
|
+
# @param [Types::Base] from
|
81
|
+
# @return [Class] newly created class
|
82
|
+
def self.define_type(name, from:, &block)
|
83
|
+
constraint = block.nil? ? nil : block.to_proc
|
84
|
+
|
85
|
+
new_klass = Class.new(from) do
|
86
|
+
include Constrained
|
87
|
+
end
|
88
|
+
new_klass.constraint = constraint
|
89
|
+
|
90
|
+
self.const_set(name, new_klass)
|
91
|
+
Model.define_type_accel(name.downcase, new_klass)
|
92
|
+
|
93
|
+
# Empty type caches
|
94
|
+
@primitives = nil
|
95
|
+
@constructed = nil
|
96
|
+
|
97
|
+
new_klass
|
98
|
+
end
|
76
99
|
end
|
77
100
|
end
|
78
101
|
|
data/lib/rasn1/version.rb
CHANGED
data/lib/rasn1.rb
CHANGED
@@ -1,36 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'rasn1/version'
|
4
|
+
require 'rasn1/errors'
|
4
5
|
require 'rasn1/types'
|
5
6
|
require 'rasn1/model'
|
6
7
|
|
7
8
|
# Rasn1 is a pure ruby library to parse, decode and encode ASN.1 data.
|
8
9
|
# @author Sylvain Daubert
|
9
10
|
module RASN1
|
10
|
-
# Base error class
|
11
|
-
class Error < StandardError; end
|
12
|
-
|
13
|
-
# ASN.1 encoding/decoding error
|
14
|
-
class ASN1Error < Error; end
|
15
|
-
|
16
|
-
# ASN.1 class error
|
17
|
-
class ClassError < Error
|
18
|
-
# @return [String]
|
19
|
-
def message
|
20
|
-
"Tag class should be a symbol among: #{Types::Base::CLASSES.keys.join(', ')}"
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
# Enumerated error
|
25
|
-
class EnumeratedError < Error; end
|
26
|
-
|
27
|
-
# CHOICE error: #chosen not set
|
28
|
-
class ChoiceError < RASN1::Error
|
29
|
-
def message
|
30
|
-
"CHOICE #{@name}: #chosen not set"
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
11
|
# Parse a DER/BER string without checking a model
|
35
12
|
# @note If you want to check ASN.1 grammary, you should define a {Model}
|
36
13
|
# and use {Model#parse}.
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rasn1
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sylvain Daubert
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-10-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -66,6 +66,7 @@ files:
|
|
66
66
|
- LICENSE
|
67
67
|
- README.md
|
68
68
|
- lib/rasn1.rb
|
69
|
+
- lib/rasn1/errors.rb
|
69
70
|
- lib/rasn1/model.rb
|
70
71
|
- lib/rasn1/types.rb
|
71
72
|
- lib/rasn1/types/any.rb
|
@@ -73,6 +74,7 @@ files:
|
|
73
74
|
- lib/rasn1/types/bit_string.rb
|
74
75
|
- lib/rasn1/types/boolean.rb
|
75
76
|
- lib/rasn1/types/choice.rb
|
77
|
+
- lib/rasn1/types/constrained.rb
|
76
78
|
- lib/rasn1/types/constructed.rb
|
77
79
|
- lib/rasn1/types/enumerated.rb
|
78
80
|
- lib/rasn1/types/generalized_time.rb
|