rasn1 0.12.1 → 0.13.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 884fa6f74d0b3074ef074d061301092d55df580b663714c4a962a7b8503d777d
4
- data.tar.gz: 77cc3c5d7bf926463464ca4d37237f0cddc358e0d7b9aa3e85c15982ab3f3fc1
3
+ metadata.gz: 50b3f9ddc3a11279f36c21d14768a908b0fe4f22ff75d650791a7a58ac47eaa7
4
+ data.tar.gz: d229ea04a626e34d8411e3787101ace2c55e3cef7178b617073ed6b65fefb867
5
5
  SHA512:
6
- metadata.gz: fee544874a10b10618cd596b1c30edd4ad70185a783eeadbe23a86fa2439339d7d025784be5adc76904e05856ac8791817a768c0603ece0141e38d2975e588ad
7
- data.tar.gz: 39428eb166401712d44eb60c4413bcd919d4fca380213acbe1dc29c32425c03a8852e1f0afa8934f5a04c604b376ac3c47424754b358cae96cc685029c467da7
6
+ metadata.gz: 37ea433265c6229a89d896e47918c242b2edc48c24ffa585873e3706dfc3eaf73628b76c91bad3e15e1d969a5caf52237c92336aefdba2668f63f9468e7e2004
7
+ data.tar.gz: 0035453de20ea4873999ec18eb3065afa9f1fdddc2927f446ecd2b1851a3a0d1bef32b5bbc2d9029f804a57cd71fefbf95dae4cd4babae5f8491f1e9ea8057ad
data/README.md CHANGED
@@ -1,4 +1,5 @@
1
1
  [![Gem Version](https://badge.fury.io/rb/rasn1.svg)](https://badge.fury.io/rb/rasn1)
2
+ [![Action status](https://github.com/sdaubert/rasn1/workflows/ci/badge.svg?branch=master)](https://github.com/sdaubert/rasn1/actions?query=workflow%3Aci)
2
3
 
3
4
  # Rasn1
4
5
 
data/lib/rasn1/model.rb CHANGED
@@ -299,6 +299,12 @@ module RASN1
299
299
  # @param [Hash] options
300
300
  # @return [Elem]
301
301
  # @see Types::BitString#initialize
302
+ # @!method bmp_string(name, options)
303
+ # @!scope class
304
+ # @param [Symbol,String] name name of object in model
305
+ # @param [Hash] options
306
+ # @return [Elem]
307
+ # @see Types::BmpString#initialize
302
308
  # @!method octet_string(name, options)
303
309
  # @!scope class
304
310
  # @param [Symbol,String] name name of object in model
@@ -317,6 +323,12 @@ module RASN1
317
323
  # @param [Hash] options
318
324
  # @return [Elem]
319
325
  # @see Types::Enumerated#initialize
326
+ # @!method universal_string(name, options)
327
+ # @!scope class
328
+ # @param [Symbol,String] name name of object in model
329
+ # @param [Hash] options
330
+ # @return [Elem]
331
+ # @see Types::UniversalString#initialize
320
332
  # @!method utf8_string(name, options)
321
333
  # @!scope class
322
334
  # @param [Symbol,String] name name of object in model
@@ -75,24 +75,27 @@ module RASN1
75
75
  # @return [Integer] total number of parsed bytes
76
76
  # @raise [ASN1Error] error on parsing
77
77
  def parse!(der, ber: false)
78
- parsed = false
79
78
  @value.each_with_index do |element, i|
80
79
  @chosen = i
81
80
  nb_bytes = element.parse!(der, ber: ber)
82
- parsed = true
83
81
  return nb_bytes
84
82
  rescue ASN1Error
85
83
  @chosen = nil
86
84
  next
87
85
  end
88
- raise ASN1Error, "CHOICE #{@name}: no type matching #{der.inspect}" unless parsed
86
+
87
+ @no_value = true
88
+ @value = void_value
89
+ raise ASN1Error, "CHOICE #{@name}: no type matching #{der.inspect}" unless optional?
90
+
91
+ 0
89
92
  end
90
93
 
91
94
  # @param [::Integer] level
92
95
  # @return [String]
93
96
  def inspect(level=0)
94
97
  str = common_inspect(level)
95
- str << if defined? @chosen
98
+ str << if defined?(@chosen) && value?
96
99
  "\n#{@value[@chosen].inspect(level + 1)}"
97
100
  else
98
101
  ' not chosen!'
@@ -71,19 +71,33 @@ module RASN1
71
71
  end
72
72
 
73
73
  def value_when_fraction_empty(date_hour)
74
- if (date_hour[-1] != 'Z') && (date_hour !~ /[+-]\d+$/)
75
- # If not UTC, have to add offset with UTC to force
76
- # Strptime to generate a local time.
77
- date_hour << Time.now.strftime('%z')
74
+ tz = if date_hour[-1] == 'Z'
75
+ date_hour.slice!(-1, 1)
76
+ '+00:00' # Ruby 3.0: to remove after end-of support of ruby 3.0
77
+ elsif date_hour.match?(/[+-]\d+$/)
78
+ # Ruby 3.0
79
+ # date_hour.slice!(-5, 5)
80
+ zone = date_hour.slice!(-5, 5)
81
+ zone[0, 3] << ':' << zone[3, 2]
82
+ end
83
+ year = date_hour.slice!(0, 4).to_i
84
+ others = date_hour.scan(/../).map(&:to_i)
85
+ # Ruby 3.0
86
+ # From 3.1: "Z" and "-0100" are supported
87
+ # Below 3.1: should be "-01:00" or "+00:00"
88
+ unless tz.nil?
89
+ others += [0] * (5 - others.size)
90
+ others << tz
78
91
  end
79
-
80
- value_from(date_hour)
92
+ @value = Time.new(year, *others)
93
+ # From 3.1: replace all this code by: Time.new(year, *others, in: tz)
81
94
  end
82
95
 
83
96
  def value_when_fraction_ends_with_z(date_hour, fraction)
84
97
  fraction = fraction[0...-1]
85
98
  date_hour << 'Z'
86
- frac_base = value_from(date_hour)
99
+ frac_base = compute_frac_base(date_hour)
100
+ value_when_fraction_empty(date_hour)
87
101
  fix_value(fraction, frac_base)
88
102
  end
89
103
 
@@ -93,42 +107,32 @@ module RASN1
93
107
  # fraction contains fraction and timezone info. Split them
94
108
  fraction = match[1]
95
109
  date_hour << match[2]
96
- else
97
- # fraction only contains fraction.
98
- # Have to add offset with UTC to force Strptime to
99
- # generate a local time.
100
- date_hour << Time.now.strftime('%z')
101
110
  end
102
111
 
103
- frac_base = value_from(date_hour)
112
+ frac_base = compute_frac_base(date_hour)
113
+ value_when_fraction_empty(date_hour)
104
114
  fix_value(fraction, frac_base)
105
115
  end
106
116
 
107
- def value_from(date_hour)
108
- format, frac_base = strformat(date_hour)
109
- @value = Strptime.new(format).exec(date_hour)
110
- frac_base
111
- end
112
-
113
117
  def fix_value(fraction, frac_base)
114
118
  frac = ".#{fraction}".to_r * frac_base
115
119
  @value = (@value + frac) unless fraction.nil?
116
120
  end
117
121
 
118
- def strformat(date_hour)
122
+ def compute_frac_base(date_hour)
119
123
  case date_hour.size
120
- when 11
121
- ['%Y%m%d%H%z', HOUR_TO_SEC]
122
- when 13, 17
123
- ['%Y%m%d%H%M%z', MINUTE_TO_SEC]
124
+ when 10, 11
125
+ HOUR_TO_SEC
126
+ when 12, 13, 17
127
+ MINUTE_TO_SEC
124
128
  when 15
125
129
  if date_hour[-1] == 'Z'
126
- ['%Y%m%d%H%M%S%z', SECOND_TO_SEC]
130
+ SECOND_TO_SEC
127
131
  else
128
- ['%Y%m%d%H%z', HOUR_TO_SEC]
132
+ HOUR_TO_SEC
129
133
  end
130
- when 19
131
- ['%Y%m%d%H%M%S%z', SECOND_TO_SEC]
134
+ when 14, 19
135
+ SECOND_TO_SEC
132
136
  else
133
137
  prefix = @name.nil? ? type : "tag #{@name}"
134
138
  raise ASN1Error, "#{prefix}: unrecognized format: #{date_hour}"
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RASN1
4
+ module Types
5
+ # ASN.1 UniversalString
6
+ # @since 0.13.0
7
+ # @author zeroSteiner
8
+ class UniversalString < OctetString
9
+ # UniversalString id value
10
+ ID = 28
11
+
12
+ # Get ASN.1 type
13
+ # @return [String]
14
+ def self.type
15
+ 'UniversalString'
16
+ end
17
+
18
+ private
19
+
20
+ def value_to_der
21
+ @value.to_s.dup.encode('UTF-32BE').b
22
+ end
23
+
24
+ def der_to_value(der, ber: false)
25
+ super
26
+ @value = der.to_s.dup.force_encoding('UTF-32BE')
27
+ end
28
+ end
29
+ end
30
+ end
data/lib/rasn1/types.rb CHANGED
@@ -128,6 +128,7 @@ require_relative 'types/null'
128
128
  require_relative 'types/object_id'
129
129
  require_relative 'types/enumerated'
130
130
  require_relative 'types/bmp_string'
131
+ require_relative 'types/universal_string'
131
132
  require_relative 'types/utf8_string'
132
133
  require_relative 'types/numeric_string'
133
134
  require_relative 'types/printable_string'
data/lib/rasn1/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RASN1
4
- VERSION = '0.12.1'
4
+ VERSION = '0.13.0'
5
5
  end
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.12.1
4
+ version: 0.13.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sylvain Daubert
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-12-23 00:00:00.000000000 Z
11
+ date: 2024-01-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: strptime
@@ -64,6 +64,7 @@ files:
64
64
  - lib/rasn1/types/sequence_of.rb
65
65
  - lib/rasn1/types/set.rb
66
66
  - lib/rasn1/types/set_of.rb
67
+ - lib/rasn1/types/universal_string.rb
67
68
  - lib/rasn1/types/utc_time.rb
68
69
  - lib/rasn1/types/utf8_string.rb
69
70
  - lib/rasn1/types/visible_string.rb
@@ -77,7 +78,7 @@ metadata:
77
78
  source_code_uri: https://github.com/sdaubert/rasn1
78
79
  bug_tracker_uri: https://github.com/sdaubert/rasn1/issues
79
80
  documentation_uri: https://www.rubydoc.info/gems/rasn1
80
- post_install_message:
81
+ post_install_message:
81
82
  rdoc_options:
82
83
  - "--title"
83
84
  - RASN1 - A pure ruby ASN.1 library
@@ -91,15 +92,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
91
92
  requirements:
92
93
  - - ">="
93
94
  - !ruby/object:Gem::Version
94
- version: 2.5.0
95
+ version: 2.7.0
95
96
  required_rubygems_version: !ruby/object:Gem::Requirement
96
97
  requirements:
97
98
  - - ">="
98
99
  - !ruby/object:Gem::Version
99
100
  version: '0'
100
101
  requirements: []
101
- rubygems_version: 3.2.5
102
- signing_key:
102
+ rubygems_version: 3.3.15
103
+ signing_key:
103
104
  specification_version: 4
104
105
  summary: Ruby ASN.1 library
105
106
  test_files: []