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.
Files changed (41) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +22 -0
  3. data/README.md +4 -0
  4. data/lib/rasn1/errors.rb +55 -0
  5. data/lib/rasn1/helpers/colorize.rb +76 -0
  6. data/lib/rasn1/model.rb +831 -0
  7. data/lib/rasn1/schema_parser.rb +470 -0
  8. data/lib/rasn1/tracer.rb +200 -0
  9. data/lib/rasn1/types/any.rb +98 -0
  10. data/lib/rasn1/types/base.rb +675 -0
  11. data/lib/rasn1/types/bit_string.rb +100 -0
  12. data/lib/rasn1/types/bmp_string.rb +22 -0
  13. data/lib/rasn1/types/boolean.rb +57 -0
  14. data/lib/rasn1/types/choice.rb +158 -0
  15. data/lib/rasn1/types/constrained.rb +51 -0
  16. data/lib/rasn1/types/constructed.rb +51 -0
  17. data/lib/rasn1/types/enumerated.rb +44 -0
  18. data/lib/rasn1/types/generalized_time.rb +156 -0
  19. data/lib/rasn1/types/ia5_string.rb +21 -0
  20. data/lib/rasn1/types/integer.rb +166 -0
  21. data/lib/rasn1/types/null.rb +43 -0
  22. data/lib/rasn1/types/numeric_string.rb +41 -0
  23. data/lib/rasn1/types/object_id.rb +64 -0
  24. data/lib/rasn1/types/octet_string.rb +52 -0
  25. data/lib/rasn1/types/primitive.rb +13 -0
  26. data/lib/rasn1/types/printable_string.rb +42 -0
  27. data/lib/rasn1/types/sequence.rb +105 -0
  28. data/lib/rasn1/types/sequence_of.rb +199 -0
  29. data/lib/rasn1/types/set.rb +28 -0
  30. data/lib/rasn1/types/set_of.rb +18 -0
  31. data/lib/rasn1/types/tag.rb +189 -0
  32. data/lib/rasn1/types/universal_string.rb +22 -0
  33. data/lib/rasn1/types/utc_time.rb +67 -0
  34. data/lib/rasn1/types/utf8_string.rb +21 -0
  35. data/lib/rasn1/types/visible_string.rb +30 -0
  36. data/lib/rasn1/types.rb +149 -0
  37. data/lib/rasn1/value_notation.rb +256 -0
  38. data/lib/rasn1/version.rb +6 -0
  39. data/lib/rasn1/wrapper.rb +279 -0
  40. data/lib/rasn1.rb +51 -0
  41. 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