rasn1 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/rasn1/model.rb +39 -0
- data/lib/rasn1/types/base.rb +6 -0
- data/lib/rasn1/types/choice.rb +7 -2
- data/lib/rasn1/types/ia5string.rb +27 -0
- data/lib/rasn1/types/numeric_string.rb +34 -0
- data/lib/rasn1/types/printable_string.rb +34 -0
- data/lib/rasn1/types/utf8_string.rb +8 -1
- data/lib/rasn1/types/visible_string.rb +10 -0
- data/lib/rasn1/types.rb +4 -0
- data/lib/rasn1/version.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0fc2ee81216604dd99cf1bd78ab08ddd732bf32f
|
4
|
+
data.tar.gz: 66c4bece600e0a18f447f596c467ed76f5e4bbbc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 93cc5dabca26821d3d9a44eab7099d9cd4f2011b250beb25ba97d44371db1eaa4b242b0b459a8bc4232fc0a5022bd762bcd1826edb6335688cae437738900601
|
7
|
+
data.tar.gz: dc6a6cb74e5b0bdb84c3fb3f6faff06a979d7221b0f8caa025a06a193c672ca7c1e2732d1a106f1b7f99ca8b60f7790089832fa5fa8ff845283ccb26ffc750f5
|
data/lib/rasn1/model.rb
CHANGED
@@ -49,6 +49,13 @@ module RASN1
|
|
49
49
|
# record2[:a_record][:room] = 43
|
50
50
|
# or like this:
|
51
51
|
# record2 = Record2.new(rented: true, a_record: { id: 65537, room: 43 })
|
52
|
+
#
|
53
|
+
# == Delegation
|
54
|
+
# {Model} may delegate some methods to its root element. Thus, if root element
|
55
|
+
# is, for example, a {Types::Choice}, model may delegate +#chosen+ and +#chosen_value+.
|
56
|
+
#
|
57
|
+
# All methods defined by root may be delegated by model, unless model also defines
|
58
|
+
# this method.
|
52
59
|
# @author Sylvain Daubert
|
53
60
|
class Model
|
54
61
|
|
@@ -128,6 +135,13 @@ module RASN1
|
|
128
135
|
@root = [name, proc]
|
129
136
|
end
|
130
137
|
|
138
|
+
# Give type name (aka class name)
|
139
|
+
# @return [String]
|
140
|
+
def type
|
141
|
+
return @type if @type
|
142
|
+
@type = self.to_s.gsub(/.*::/, '')
|
143
|
+
end
|
144
|
+
|
131
145
|
# Parse a DER/BER encoded string
|
132
146
|
# @param [String] str
|
133
147
|
# @param [Boolean] ber accept BER encoding or not
|
@@ -154,6 +168,15 @@ module RASN1
|
|
154
168
|
@elements[name]
|
155
169
|
end
|
156
170
|
|
171
|
+
# Set value of element +name+. Element should be a {Base}.
|
172
|
+
# @param [String,Symbol] name
|
173
|
+
# @param [Object] value
|
174
|
+
# @return [Object] value
|
175
|
+
def []=(name, value)
|
176
|
+
raise Error, "cannot set value for a Model" if @elements[name].is_a? Model
|
177
|
+
@elements[name].value = value
|
178
|
+
end
|
179
|
+
|
157
180
|
# Get name frm root type
|
158
181
|
# @return [String,Symbol]
|
159
182
|
def name
|
@@ -183,6 +206,12 @@ module RASN1
|
|
183
206
|
@elements[@root]
|
184
207
|
end
|
185
208
|
|
209
|
+
# Give type name (aka class name)
|
210
|
+
# @return [String]
|
211
|
+
def type
|
212
|
+
self.class.type
|
213
|
+
end
|
214
|
+
|
186
215
|
# Parse a DER/BER encoded string, and modify object in-place.
|
187
216
|
# @param [String] str
|
188
217
|
# @param [Boolean] ber accept BER encoding or not
|
@@ -191,6 +220,16 @@ module RASN1
|
|
191
220
|
@elements[@root].parse!(str.dup.force_encoding('BINARY'), ber: ber)
|
192
221
|
end
|
193
222
|
|
223
|
+
# Delegate some methods to root element
|
224
|
+
# @param [Symbol] meth
|
225
|
+
def method_missing(meth, *args)
|
226
|
+
if @elements[@root].respond_to? meth
|
227
|
+
@elements[@root].send meth, *args
|
228
|
+
else
|
229
|
+
super
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
194
233
|
private
|
195
234
|
|
196
235
|
def is_composed?(el)
|
data/lib/rasn1/types/base.rb
CHANGED
data/lib/rasn1/types/choice.rb
CHANGED
@@ -52,7 +52,12 @@ module RASN1
|
|
52
52
|
# @raise [ChoiceError] {#chosen} not set
|
53
53
|
def chosen_value
|
54
54
|
check_chosen
|
55
|
-
@value[@chosen]
|
55
|
+
case @value[@chosen]
|
56
|
+
when Base
|
57
|
+
@value[@chosen].value
|
58
|
+
when Model
|
59
|
+
@value[@chosen]
|
60
|
+
end
|
56
61
|
end
|
57
62
|
|
58
63
|
# @note {#chosen} MUST be set before calling this method
|
@@ -76,7 +81,7 @@ module RASN1
|
|
76
81
|
@chosen = i
|
77
82
|
nb_bytes = element.parse!(der)
|
78
83
|
parsed = true
|
79
|
-
|
84
|
+
return nb_bytes
|
80
85
|
rescue ASN1Error
|
81
86
|
@chosen = nil
|
82
87
|
next
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module RASN1
|
2
|
+
module Types
|
3
|
+
|
4
|
+
# ASN.1 IA5 String
|
5
|
+
# @author Sylvain Daubert
|
6
|
+
class IA5String < OctetString
|
7
|
+
TAG = 22
|
8
|
+
|
9
|
+
# Get ASN.1 type
|
10
|
+
# @return [String]
|
11
|
+
def self.type
|
12
|
+
self.to_s.gsub(/.*::/, '')
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def value_to_der
|
18
|
+
@value.to_s.force_encoding('US-ASCII').force_encoding('BINARY')
|
19
|
+
end
|
20
|
+
|
21
|
+
def der_to_value(der, ber:false)
|
22
|
+
super
|
23
|
+
@value.force_encoding('US-ASCII')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module RASN1
|
2
|
+
module Types
|
3
|
+
|
4
|
+
# ASN.1 Numeric String
|
5
|
+
# @author Sylvain Daubert
|
6
|
+
class NumericString < OctetString
|
7
|
+
TAG = 18
|
8
|
+
|
9
|
+
# Get ASN.1 type
|
10
|
+
# @return [String]
|
11
|
+
def self.type
|
12
|
+
'NumericString'
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def value_to_der
|
18
|
+
check_characters
|
19
|
+
@value.to_s.force_encoding('BINARY')
|
20
|
+
end
|
21
|
+
|
22
|
+
def der_to_value(der, ber:false)
|
23
|
+
super
|
24
|
+
check_characters
|
25
|
+
end
|
26
|
+
|
27
|
+
def check_characters
|
28
|
+
if @value.to_s =~ /([^0-9 ])/
|
29
|
+
raise ASN1Error, "NUMERIC STRING #@name: invalid character: '#{$1}'"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module RASN1
|
2
|
+
module Types
|
3
|
+
|
4
|
+
# ASN.1 Printable String
|
5
|
+
# @author Sylvain Daubert
|
6
|
+
class PrintableString < OctetString
|
7
|
+
TAG = 19
|
8
|
+
|
9
|
+
# Get ASN.1 type
|
10
|
+
# @return [String]
|
11
|
+
def self.type
|
12
|
+
'PrintableString'
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def value_to_der
|
18
|
+
check_characters
|
19
|
+
@value.to_s.force_encoding('BINARY')
|
20
|
+
end
|
21
|
+
|
22
|
+
def der_to_value(der, ber:false)
|
23
|
+
super
|
24
|
+
check_characters
|
25
|
+
end
|
26
|
+
|
27
|
+
def check_characters
|
28
|
+
if @value.to_s =~ /([^a-zA-Z0-9 '=\(\)\+,\-\.\/:\?])/
|
29
|
+
raise ASN1Error, "PRINTABLE STRING #@name: invalid character: '#{$1}'"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -6,6 +6,12 @@ module RASN1
|
|
6
6
|
class Utf8String < OctetString
|
7
7
|
TAG = 12
|
8
8
|
|
9
|
+
# Get ASN.1 type
|
10
|
+
# @return [String]
|
11
|
+
def self.type
|
12
|
+
'UTF8String'
|
13
|
+
end
|
14
|
+
|
9
15
|
private
|
10
16
|
|
11
17
|
def value_to_der
|
@@ -13,7 +19,8 @@ module RASN1
|
|
13
19
|
end
|
14
20
|
|
15
21
|
def der_to_value(der, ber:false)
|
16
|
-
|
22
|
+
super
|
23
|
+
@value.force_encoding('UTF-8')
|
17
24
|
end
|
18
25
|
end
|
19
26
|
end
|
data/lib/rasn1/types.rb
CHANGED
@@ -29,6 +29,10 @@ require_relative 'types/null'
|
|
29
29
|
require_relative 'types/object_id'
|
30
30
|
require_relative 'types/enumerated'
|
31
31
|
require_relative 'types/utf8_string'
|
32
|
+
require_relative 'types/numeric_string'
|
33
|
+
require_relative 'types/printable_string'
|
34
|
+
require_relative 'types/ia5string'
|
35
|
+
require_relative 'types/visible_string'
|
32
36
|
require_relative 'types/constructed'
|
33
37
|
require_relative 'types/sequence'
|
34
38
|
require_relative 'types/sequence_of'
|
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.
|
4
|
+
version: 0.3.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: 2017-08-
|
11
|
+
date: 2017-08-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: yard
|
@@ -102,17 +102,21 @@ files:
|
|
102
102
|
- lib/rasn1/types/choice.rb
|
103
103
|
- lib/rasn1/types/constructed.rb
|
104
104
|
- lib/rasn1/types/enumerated.rb
|
105
|
+
- lib/rasn1/types/ia5string.rb
|
105
106
|
- lib/rasn1/types/integer.rb
|
106
107
|
- lib/rasn1/types/null.rb
|
108
|
+
- lib/rasn1/types/numeric_string.rb
|
107
109
|
- lib/rasn1/types/object_id.rb
|
108
110
|
- lib/rasn1/types/octet_string.rb
|
109
111
|
- lib/rasn1/types/primitive.rb
|
112
|
+
- lib/rasn1/types/printable_string.rb
|
110
113
|
- lib/rasn1/types/sequence.rb
|
111
114
|
- lib/rasn1/types/sequence_of.rb
|
112
115
|
- lib/rasn1/types/set.rb
|
113
116
|
- lib/rasn1/types/set_of.rb
|
114
117
|
- lib/rasn1/types/set_spec.rb
|
115
118
|
- lib/rasn1/types/utf8_string.rb
|
119
|
+
- lib/rasn1/types/visible_string.rb
|
116
120
|
- lib/rasn1/version.rb
|
117
121
|
- rasn1.gemspec
|
118
122
|
homepage: https://github.com/sdaubert/rasn1
|