rasn2 0.16.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 +7 -0
- data/LICENSE +22 -0
- data/README.md +4 -0
- data/lib/rasn1/errors.rb +55 -0
- data/lib/rasn1/helpers/colorize.rb +76 -0
- data/lib/rasn1/model.rb +831 -0
- data/lib/rasn1/schema_parser.rb +470 -0
- data/lib/rasn1/tracer.rb +200 -0
- data/lib/rasn1/types/any.rb +98 -0
- data/lib/rasn1/types/base.rb +675 -0
- data/lib/rasn1/types/bit_string.rb +100 -0
- data/lib/rasn1/types/bmp_string.rb +22 -0
- data/lib/rasn1/types/boolean.rb +57 -0
- data/lib/rasn1/types/choice.rb +158 -0
- data/lib/rasn1/types/constrained.rb +51 -0
- data/lib/rasn1/types/constructed.rb +51 -0
- data/lib/rasn1/types/enumerated.rb +44 -0
- data/lib/rasn1/types/generalized_time.rb +156 -0
- data/lib/rasn1/types/ia5_string.rb +21 -0
- data/lib/rasn1/types/integer.rb +166 -0
- data/lib/rasn1/types/null.rb +43 -0
- data/lib/rasn1/types/numeric_string.rb +41 -0
- data/lib/rasn1/types/object_id.rb +64 -0
- data/lib/rasn1/types/octet_string.rb +52 -0
- data/lib/rasn1/types/primitive.rb +13 -0
- data/lib/rasn1/types/printable_string.rb +42 -0
- data/lib/rasn1/types/sequence.rb +105 -0
- data/lib/rasn1/types/sequence_of.rb +199 -0
- data/lib/rasn1/types/set.rb +28 -0
- data/lib/rasn1/types/set_of.rb +18 -0
- data/lib/rasn1/types/tag.rb +189 -0
- data/lib/rasn1/types/universal_string.rb +22 -0
- data/lib/rasn1/types/utc_time.rb +67 -0
- data/lib/rasn1/types/utf8_string.rb +21 -0
- data/lib/rasn1/types/visible_string.rb +30 -0
- data/lib/rasn1/types.rb +149 -0
- data/lib/rasn1/value_notation.rb +256 -0
- data/lib/rasn1/version.rb +6 -0
- data/lib/rasn1/wrapper.rb +279 -0
- data/lib/rasn1.rb +51 -0
- metadata +123 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RASN1
|
|
4
|
+
module Types
|
|
5
|
+
# ASN.1 ANY: accepts any types
|
|
6
|
+
#
|
|
7
|
+
# If `any#value` is `nil` and Any object is not {#optional?}, `any` will be encoded as a {Null} object.
|
|
8
|
+
# @author Sylvain Daubert
|
|
9
|
+
class Any < Base
|
|
10
|
+
# @return [String] DER-formated string
|
|
11
|
+
def to_der
|
|
12
|
+
if value?
|
|
13
|
+
case @value
|
|
14
|
+
when Base, Model
|
|
15
|
+
@value.to_der
|
|
16
|
+
else
|
|
17
|
+
@value.to_s
|
|
18
|
+
end
|
|
19
|
+
else
|
|
20
|
+
optional? ? '' : Null.new.to_der
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def can_build?
|
|
25
|
+
value? || !optional?
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Parse a DER string. This method updates object: {#value} will be a DER
|
|
29
|
+
# string.
|
|
30
|
+
# @param [String] der DER string
|
|
31
|
+
# @param [Boolean] ber if +true+, accept BER encoding
|
|
32
|
+
# @return [Integer] total number of parsed bytes
|
|
33
|
+
def parse!(der, ber: false)
|
|
34
|
+
total_length, _data = do_parse(der, ber: ber)
|
|
35
|
+
total_length
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# @param [::Integer] level
|
|
39
|
+
# @return [String]
|
|
40
|
+
def inspect(level=0)
|
|
41
|
+
str = common_inspect(level)
|
|
42
|
+
str << if !value?
|
|
43
|
+
'NULL'
|
|
44
|
+
elsif @value.is_a?(OctetString) || @value.is_a?(BitString)
|
|
45
|
+
"#{@value.type}: #{value.value.inspect}"
|
|
46
|
+
elsif @value.class < Base
|
|
47
|
+
"#{@value.type}: #{value.value}"
|
|
48
|
+
else
|
|
49
|
+
value.to_s.inspect
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# @private Tracer private API
|
|
54
|
+
# @return [String]
|
|
55
|
+
def trace
|
|
56
|
+
return trace_any if value?
|
|
57
|
+
|
|
58
|
+
msg_type(no_id: true) << " #{colorize_nil}"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
private
|
|
62
|
+
|
|
63
|
+
def common_inspect(level)
|
|
64
|
+
lvl = [0, level].max
|
|
65
|
+
str = ' ' * lvl
|
|
66
|
+
str << "#{@name} " unless @name.nil?
|
|
67
|
+
str << asn1_class.to_s.upcase << ' ' unless asn1_class == :universal
|
|
68
|
+
str << "[#{id}] EXPLICIT " if explicit?
|
|
69
|
+
str << "[#{id}] IMPLICIT " if implicit?
|
|
70
|
+
str << '(ANY) '
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# @private
|
|
74
|
+
# @see Types::Base#do_parse
|
|
75
|
+
def do_parse(der, ber: false)
|
|
76
|
+
if der.empty?
|
|
77
|
+
return [0, ''] if optional?
|
|
78
|
+
|
|
79
|
+
raise ASN1Error, 'Expected ANY but get nothing'
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
id_size = Types.decode_identifier_octets(der).last
|
|
83
|
+
total_length, = get_data(der[id_size..], ber)
|
|
84
|
+
total_length += id_size
|
|
85
|
+
|
|
86
|
+
@no_value = false
|
|
87
|
+
real_value = der[0, total_length].to_s
|
|
88
|
+
@value = real_value
|
|
89
|
+
|
|
90
|
+
[total_length, real_value]
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def trace_any
|
|
94
|
+
msg_type(no_id: true) << trace_data(value)
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|