rasn1 0.6.7 → 0.6.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +0 -1
- data/lib/rasn1/model.rb +5 -3
- data/lib/rasn1/types/any.rb +8 -2
- data/lib/rasn1/types/base.rb +16 -9
- data/lib/rasn1/types/choice.rb +3 -3
- data/lib/rasn1/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1889a0ada74e2d9255ce6af799caa441fd2d2cacfaf0097b5afd1730ed9a9fd9
|
4
|
+
data.tar.gz: e0453969129814385bd272c362373b12ae0e38201145280c360ac3696dd95cb1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4dc47229a202f0bfa7d56a129cd5e1807009b9147da6e844d5a47589fbf0e8eab9bebbb51f81866a0222eb4a6dbf953d381f266ec332e697b6caf1b894fa6c18
|
7
|
+
data.tar.gz: 4fc5127882d478d111452dff0cac6e226d270f47b4798b6a365f735c0bb1402ec417640b48be9839f7336fcf6d526f2a771d90bdc6ed64b0cefc3258d9e22bff
|
data/.rubocop.yml
CHANGED
data/lib/rasn1/model.rb
CHANGED
@@ -60,6 +60,8 @@ module RASN1
|
|
60
60
|
class Model
|
61
61
|
|
62
62
|
class << self
|
63
|
+
# @return [Hash]
|
64
|
+
attr_reader :options
|
63
65
|
|
64
66
|
# Use another model in this model
|
65
67
|
# @param [String,Symbol] name
|
@@ -90,7 +92,7 @@ module RASN1
|
|
90
92
|
# @return [void]
|
91
93
|
def inherited(klass)
|
92
94
|
super
|
93
|
-
root = @root
|
95
|
+
root = defined?(@root )? @root : nil
|
94
96
|
klass.class_eval { @root = root }
|
95
97
|
end
|
96
98
|
|
@@ -218,7 +220,7 @@ module RASN1
|
|
218
220
|
# Give type name (aka class name)
|
219
221
|
# @return [String]
|
220
222
|
def type
|
221
|
-
return @type if @type
|
223
|
+
return @type if defined? @type
|
222
224
|
@type = self.to_s.gsub(/.*::/, '')
|
223
225
|
end
|
224
226
|
|
@@ -347,7 +349,7 @@ module RASN1
|
|
347
349
|
root = self.class.class_eval { @root }
|
348
350
|
@root = root[0]
|
349
351
|
@elements = {}
|
350
|
-
@elements[@root] = get_type(root[1], self.class.
|
352
|
+
@elements[@root] = get_type(root[1], self.class.options || {})
|
351
353
|
root
|
352
354
|
end
|
353
355
|
|
data/lib/rasn1/types/any.rb
CHANGED
@@ -3,7 +3,7 @@ module RASN1
|
|
3
3
|
|
4
4
|
# ASN.1 ANY: accepts any types
|
5
5
|
#
|
6
|
-
# If `any#value` is `nil
|
6
|
+
# If `any#value` is `nil` and Any object is not {#optional?}, `any` will be encoded as a {Null} object.
|
7
7
|
# @author Sylvain Daubert
|
8
8
|
class Any < Base
|
9
9
|
|
@@ -13,7 +13,7 @@ module RASN1
|
|
13
13
|
when Base, Model
|
14
14
|
@value.to_der
|
15
15
|
when nil
|
16
|
-
Null.new.to_der
|
16
|
+
optional? ? '' : Null.new.to_der
|
17
17
|
else
|
18
18
|
@value.to_s
|
19
19
|
end
|
@@ -25,6 +25,12 @@ module RASN1
|
|
25
25
|
# @param [Boolean] ber if +true+, accept BER encoding
|
26
26
|
# @return [Integer] total number of parsed bytes
|
27
27
|
def parse!(der, ber: false)
|
28
|
+
if der.nil? or der.empty?
|
29
|
+
return 0 if optional?
|
30
|
+
|
31
|
+
raise ASN1Error, "Expected ANY but get nothing"
|
32
|
+
end
|
33
|
+
|
28
34
|
total_length, = get_data(der, ber)
|
29
35
|
@value = der[0, total_length]
|
30
36
|
total_length
|
data/lib/rasn1/types/base.rb
CHANGED
@@ -70,7 +70,7 @@ module RASN1
|
|
70
70
|
# Get ASN.1 type
|
71
71
|
# @return [String]
|
72
72
|
def self.type
|
73
|
-
return @type if @type
|
73
|
+
return @type if defined? @type
|
74
74
|
@type = self.to_s.gsub(/.*::/, '').gsub(/([a-z0-9])([A-Z])/, '\1 \2').upcase
|
75
75
|
end
|
76
76
|
|
@@ -168,14 +168,14 @@ module RASN1
|
|
168
168
|
# @return [::Boolean,nil] return +nil+ if not tagged, return +true+
|
169
169
|
# if explicit, else +false+
|
170
170
|
def explicit?
|
171
|
-
@tag
|
171
|
+
!defined?(@tag) ? nil : @tag == :explicit
|
172
172
|
end
|
173
173
|
|
174
174
|
# Say if a tagged type is implicit
|
175
175
|
# @return [::Boolean,nil] return +nil+ if not tagged, return +true+
|
176
176
|
# if implicit, else +false+
|
177
177
|
def implicit?
|
178
|
-
@tag
|
178
|
+
!defined?(@tag) ? nil : @tag == :implicit
|
179
179
|
end
|
180
180
|
|
181
181
|
# @abstract This method SHOULD be partly implemented by subclasses, which
|
@@ -211,7 +211,7 @@ module RASN1
|
|
211
211
|
else # false
|
212
212
|
0
|
213
213
|
end
|
214
|
-
|
214
|
+
tag_value | CLASSES[@asn1_class] | pc
|
215
215
|
end
|
216
216
|
|
217
217
|
# @abstract This method SHOULD be partly implemented by subclasses to parse
|
@@ -326,7 +326,7 @@ module RASN1
|
|
326
326
|
@constructed = options[:constructed]
|
327
327
|
end
|
328
328
|
|
329
|
-
@asn1_class = :context if @tag
|
329
|
+
@asn1_class = :context if defined?(@tag) && (@asn1_class == :universal)
|
330
330
|
end
|
331
331
|
|
332
332
|
def build_tag?
|
@@ -349,8 +349,14 @@ module RASN1
|
|
349
349
|
end
|
350
350
|
end
|
351
351
|
|
352
|
+
def tag_value
|
353
|
+
return @tag_value if defined? @tag_value
|
354
|
+
|
355
|
+
self.class::TAG
|
356
|
+
end
|
357
|
+
|
352
358
|
def encode_tag
|
353
|
-
if
|
359
|
+
if tag_value <= MAX_TAG
|
354
360
|
[tag].pack('C')
|
355
361
|
else
|
356
362
|
raise ASN1Error, 'multi-byte tag value are not supported'
|
@@ -426,7 +432,8 @@ module RASN1
|
|
426
432
|
end
|
427
433
|
|
428
434
|
def raise_tag_error(tag)
|
429
|
-
msg =
|
435
|
+
msg = name.nil? ? '' : "#{name}: "
|
436
|
+
msg << "Expected #{self2name} but get #{tag2name(tag)}"
|
430
437
|
raise ASN1Error, msg
|
431
438
|
end
|
432
439
|
|
@@ -434,7 +441,7 @@ module RASN1
|
|
434
441
|
name = CLASSES.key(tag & 0xc0).to_s.upcase
|
435
442
|
name << " #{tag & Constructed::ASN1_PC > 0 ? 'CONSTRUCTED' : 'PRIMITIVE'}"
|
436
443
|
if implicit? || explicit?
|
437
|
-
name << ' 0x%02X' %
|
444
|
+
name << ' 0x%02X (0x%02X)' % [tag & 0x1f, tag]
|
438
445
|
else
|
439
446
|
name << ' ' << self.class.type
|
440
447
|
end
|
@@ -449,7 +456,7 @@ module RASN1
|
|
449
456
|
type = Types.constants.map { |c| Types.const_get(c) }.
|
450
457
|
select { |klass| klass < Primitive || klass < Constructed }.
|
451
458
|
find { |klass| klass::TAG == itag & 0x1f }
|
452
|
-
name << " #{type.nil? ? "0x%02X" %
|
459
|
+
name << " #{type.nil? ? "0x%02X (0x%02X)" % [itag & 0x1f, itag] : type.encode_type }"
|
453
460
|
end
|
454
461
|
end
|
455
462
|
end
|
data/lib/rasn1/types/choice.rb
CHANGED
@@ -95,7 +95,7 @@ module RASN1
|
|
95
95
|
str << ' ' * level if level > 0
|
96
96
|
str << "#{name} " if name
|
97
97
|
str << "#{type}:"
|
98
|
-
if @chosen
|
98
|
+
if !defined? @chosen
|
99
99
|
str << ' not chosen!'
|
100
100
|
else
|
101
101
|
str << "\n#{@value[@chosen].inspect(level+1)}"
|
@@ -105,10 +105,10 @@ module RASN1
|
|
105
105
|
private
|
106
106
|
|
107
107
|
def check_chosen
|
108
|
-
raise ChoiceError if @chosen.nil?
|
108
|
+
raise ChoiceError if !defined?(@chosen) || @chosen.nil?
|
109
109
|
end
|
110
110
|
end
|
111
111
|
end
|
112
112
|
end
|
113
113
|
|
114
|
-
|
114
|
+
|
data/lib/rasn1/version.rb
CHANGED
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.6.
|
4
|
+
version: 0.6.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sylvain Daubert
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-11-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: yard
|