rasn1 0.12.1 → 0.13.1

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: e7f6fe2fadbdb5b72ec51995e911ac9adc7efbf497708ca581c2870ed3622b31
4
+ data.tar.gz: 6b68a59752a7ee439a7401b51415070b51ef3241f65864d263c1da9bfcdb2290
5
5
  SHA512:
6
- metadata.gz: fee544874a10b10618cd596b1c30edd4ad70185a783eeadbe23a86fa2439339d7d025784be5adc76904e05856ac8791817a768c0603ece0141e38d2975e588ad
7
- data.tar.gz: 39428eb166401712d44eb60c4413bcd919d4fca380213acbe1dc29c32425c03a8852e1f0afa8934f5a04c604b376ac3c47424754b358cae96cc685029c467da7
6
+ metadata.gz: d67a67c02d381d92ca93552834cdfc5bce175dc31794020c1d39b3fcea6301a50393f1c964c94d04ef7e14b5593275e5f72873bc89097118ce1abe0c6e4c582a
7
+ data.tar.gz: 5f2a8486a6ec2709ab3ecae6b664a4a731394ee5ada28f8c5908734aaf20b3e485eb6f4f0d74dc25d238191875732e02299eda3ad5d765dd870b39bf880c3e3a
data/LICENSE CHANGED
@@ -1,6 +1,7 @@
1
1
  MIT License
2
2
 
3
3
  Copyright (c) 2017 Sylvain Daubert
4
+ Copyright (c) 2024 LemonTree55
4
5
 
5
6
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
7
  of this software and associated documentation files (the "Software"), to deal
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/lemontree55/rasn1/workflows/ci/badge.svg?branch=master)](https://github.com/lemontree55/rasn1/actions?query=workflow%3Aci)
2
3
 
3
4
  # Rasn1
4
5
 
data/lib/rasn1/model.rb CHANGED
@@ -68,7 +68,7 @@ module RASN1
68
68
  Elem = Struct.new(:name, :proc_or_class, :content) do
69
69
  # @param [String,Symbol] name
70
70
  # @param [Proc,Class] proc_or_class
71
- # @param [Hash,nil] content
71
+ # @param [Array,nil] content
72
72
  def initialize(name, proc_or_class, content)
73
73
  if content.is_a?(Array)
74
74
  duplicate_names = find_all_duplicate_names(content.map(&:name) + [name])
@@ -278,7 +278,7 @@ module RASN1
278
278
  # @return [Elem]
279
279
  # @see Types::SetOf#initialize
280
280
  %w[sequence set].each do |type|
281
- define_type_accel_of(type, Types.const_get("#{type.capitalize}Of"))
281
+ define_type_accel_of(type, Types.const_get(:"#{type.capitalize}Of"))
282
282
  end
283
283
 
284
284
  # @!method boolean(name, options)
@@ -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
@@ -449,6 +461,7 @@ module RASN1
449
461
  root.value
450
462
  else
451
463
  elt = by_name(name)
464
+ return nil if elt.nil?
452
465
 
453
466
  unless args.empty?
454
467
  args.each do |arg|
@@ -492,14 +505,15 @@ module RASN1
492
505
 
493
506
  # Give a (nested) element from its name
494
507
  # @param [String, Symbol] name
495
- # @return [Model, Types::Base]
508
+ # @return [Model, Types::Base, nil]
496
509
  def by_name(name)
497
510
  elt = self[name]
498
511
  return elt unless elt.nil?
499
512
 
500
513
  @elements.each_key do |subelt_name|
501
- if self[subelt_name].is_a?(Model)
502
- elt = self[subelt_name][name]
514
+ subelt = self[subelt_name]
515
+ if subelt.is_a?(Model)
516
+ elt = subelt[name]
503
517
  return elt unless elt.nil?
504
518
  end
505
519
  end
@@ -529,7 +543,12 @@ module RASN1
529
543
  class_element = self.class.class_eval { @root }
530
544
  @root_name = class_element.name
531
545
  @elements = {}
532
- @elements[@root_name] = get_type(class_element.proc_or_class, self.class.options || {})
546
+ @elements[@root_name] = case class_element
547
+ when WrapElem
548
+ generate_wrapper(class_element)
549
+ else
550
+ get_type(class_element.proc_or_class, self.class.options || {})
551
+ end
533
552
  class_element
534
553
  end
535
554
 
@@ -565,17 +584,18 @@ module RASN1
565
584
 
566
585
  def initialize_elements(obj, args)
567
586
  args.each do |name, value|
568
- next unless obj[name]
587
+ subobj = obj[name]
588
+ next unless subobj
569
589
 
570
590
  case value
571
591
  when Hash
572
- raise ArgumentError, "element #{name}: may only pass a Hash for Model elements" unless obj[name].is_a?(Model)
592
+ raise ArgumentError, "element #{name}: may only pass a Hash for Model elements" unless subobj.is_a?(Model)
573
593
 
574
- initialize_elements obj[name], value
594
+ initialize_elements(subobj, value)
575
595
  when Array
576
- initialize_element_from_array(obj[name], value)
596
+ initialize_element_from_array(subobj, value)
577
597
  else
578
- obj[name].value = value
598
+ subobj.value = value
579
599
  end
580
600
  end
581
601
  end
@@ -644,12 +664,13 @@ module RASN1
644
664
  end
645
665
 
646
666
  def wrapper_to_h(wrap)
647
- case wrap.element
667
+ el = wrap.element
668
+ case el
648
669
  when Model
649
- hsh = wrap.element.to_h
670
+ hsh = el.to_h
650
671
  hsh[hsh.keys.first]
651
672
  else
652
- private_to_h(wrap.element)
673
+ private_to_h(el)
653
674
  end
654
675
  end
655
676
  end
data/lib/rasn1/tracer.rb CHANGED
@@ -75,8 +75,8 @@ module RASN1
75
75
  # @private
76
76
  # Unpatch {#do_parse} to remove tracing ability
77
77
  def stop_tracing
78
- alias_method :do_parse, :do_parse_without_tracing # rubocop:disable Lint/DuplicateMethods
79
- alias_method :do_parse_explicit, :do_parse_explicit_without_tracing # rubocop:disable Lint/DuplicateMethods
78
+ alias_method :do_parse, :do_parse_without_tracing
79
+ alias_method :do_parse_explicit, :do_parse_explicit_without_tracing
80
80
  end
81
81
  end
82
82
 
@@ -108,7 +108,7 @@ module RASN1
108
108
  # @private
109
109
  # Unpatch {#parse!} to remove tracing ability
110
110
  def stop_tracing
111
- alias_method :parse!, :parse_without_tracing # rubocop:disable Lint/DuplicateMethods
111
+ alias_method :parse!, :parse_without_tracing
112
112
  end
113
113
  end
114
114
 
@@ -133,7 +133,7 @@ module RASN1
133
133
  # @private
134
134
  # Unpatch {#der_to_value!} to remove tracing ability
135
135
  def stop_tracing
136
- alias_method :der_to_value, :der_to_value_without_tracing # rubocop:disable Lint/DuplicateMethods
136
+ alias_method :der_to_value, :der_to_value_without_tracing
137
137
  end
138
138
  end
139
139
 
@@ -158,7 +158,7 @@ module RASN1
158
158
  # @private
159
159
  # Unpatch {#der_to_value!} to remove tracing ability
160
160
  def stop_tracing
161
- alias_method :der_to_value, :der_to_value_without_tracing # rubocop:disable Lint/DuplicateMethods
161
+ alias_method :der_to_value, :der_to_value_without_tracing
162
162
  end
163
163
  end
164
164
 
@@ -61,7 +61,7 @@ module RASN1
61
61
  private
62
62
 
63
63
  def common_inspect(level)
64
- lvl = level >= 0 ? level : 0
64
+ lvl = [0, level].max
65
65
  str = ' ' * lvl
66
66
  str << "#{@name} " unless @name.nil?
67
67
  str << asn1_class.to_s.upcase << ' ' unless asn1_class == :universal
@@ -82,9 +82,10 @@ module RASN1
82
82
  total_length += id_size
83
83
 
84
84
  @no_value = false
85
- @value = der[0, total_length]
85
+ real_value = der[0, total_length].to_s
86
+ @value = real_value
86
87
 
87
- [total_length, @value]
88
+ [total_length, real_value]
88
89
  end
89
90
 
90
91
  def trace_any
@@ -374,7 +374,7 @@ module RASN1
374
374
  end
375
375
 
376
376
  def common_inspect(level)
377
- lvl = level >= 0 ? level : 0
377
+ lvl = [level, 0].max
378
378
  str = ' ' * lvl
379
379
  str << "#{@name} " unless @name.nil?
380
380
  str << asn1_class_to_s
@@ -427,7 +427,7 @@ module RASN1
427
427
  when nil
428
428
  @asn1_class = :universal
429
429
  when Symbol
430
- raise ClassError unless CLASSES.key? asn1_class
430
+ raise ClassError unless CLASSES.key?(asn1_class)
431
431
 
432
432
  @asn1_class = asn1_class
433
433
  else
@@ -621,7 +621,7 @@ module RASN1
621
621
  def find_type(id)
622
622
  Types.constants.map { |c| Types.const_get(c) }
623
623
  .select { |klass| klass < Primitive || klass < Constructed }
624
- .find { |klass| klass::ID == id }
624
+ .find { |klass| id == klass::ID }
625
625
  end
626
626
 
627
627
  def bin2hex(str)
@@ -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!'
@@ -9,12 +9,8 @@ module RASN1
9
9
  module Constrained
10
10
  # Define class/module methods for {Constrained} module
11
11
  module ClassMethods
12
- # Setter for constraint
13
- # @param [Proc,nil] constraint
14
- # @return [Proc,nil]
15
- def constraint=(constraint)
16
- @constraint = constraint
17
- end
12
+ # @return [Proc] proc to check constraints
13
+ attr_accessor :constraint
18
14
 
19
15
  # Check if a constraint is really defined
20
16
  # @return [Boolean]
@@ -31,15 +27,7 @@ module RASN1
31
27
  end
32
28
  end
33
29
 
34
- class << self
35
- # @return [Proc] proc to check constraints
36
- attr_reader :constraint
37
-
38
- # Extend +base+ with {ClassMethods}
39
- def included(base)
40
- base.extend ClassMethods
41
- end
42
- end
30
+ extend ClassMethods
43
31
 
44
32
  # Redefined +#value=+ to check constraint before assigning +val+
45
33
  # @see Types::Base#value=
@@ -71,19 +71,32 @@ 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')
78
- end
79
-
80
- value_from(date_hour)
74
+ # Ruby 3.0: special handle for timezone
75
+ # From 3.1: "Z" and "-0100" are supported
76
+ # Below 3.1: should be "-01:00" or "+00:00"
77
+ tz = if date_hour[-1] == 'Z'
78
+ date_hour.slice!(-1, 1)
79
+ '+00:00' # Ruby 3.0: to remove after end-of support of ruby 3.0
80
+ elsif date_hour.match?(/[+-]\d+$/)
81
+ # Ruby 3.0
82
+ # date_hour.slice!(-5, 5)
83
+ zone = date_hour.slice!(-5, 5).to_s
84
+ "#{zone[0, 3]}:#{zone[3, 2]}"
85
+ end
86
+ year = date_hour.slice!(0, 4).to_i
87
+ month = date_hour.slice!(0, 2).to_i
88
+ day = date_hour.slice!(0, 2).to_i
89
+ hour = date_hour.slice!(0, 2).to_i
90
+ minute = date_hour.slice!(0, 2).to_i
91
+ second = date_hour.slice!(0, 2).to_i
92
+ @value = Time.new(year, month, day, hour, minute, second, tz)
81
93
  end
82
94
 
83
95
  def value_when_fraction_ends_with_z(date_hour, fraction)
84
96
  fraction = fraction[0...-1]
85
97
  date_hour << 'Z'
86
- frac_base = value_from(date_hour)
98
+ frac_base = compute_frac_base(date_hour)
99
+ value_when_fraction_empty(date_hour)
87
100
  fix_value(fraction, frac_base)
88
101
  end
89
102
 
@@ -93,42 +106,32 @@ module RASN1
93
106
  # fraction contains fraction and timezone info. Split them
94
107
  fraction = match[1]
95
108
  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
109
  end
102
110
 
103
- frac_base = value_from(date_hour)
111
+ frac_base = compute_frac_base(date_hour)
112
+ value_when_fraction_empty(date_hour)
104
113
  fix_value(fraction, frac_base)
105
114
  end
106
115
 
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
116
  def fix_value(fraction, frac_base)
114
117
  frac = ".#{fraction}".to_r * frac_base
115
118
  @value = (@value + frac) unless fraction.nil?
116
119
  end
117
120
 
118
- def strformat(date_hour)
121
+ def compute_frac_base(date_hour)
119
122
  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]
123
+ when 10, 11
124
+ HOUR_TO_SEC
125
+ when 12, 13, 17
126
+ MINUTE_TO_SEC
124
127
  when 15
125
128
  if date_hour[-1] == 'Z'
126
- ['%Y%m%d%H%M%S%z', SECOND_TO_SEC]
129
+ SECOND_TO_SEC
127
130
  else
128
- ['%Y%m%d%H%z', HOUR_TO_SEC]
131
+ HOUR_TO_SEC
129
132
  end
130
- when 19
131
- ['%Y%m%d%H%M%S%z', SECOND_TO_SEC]
133
+ when 14, 19
134
+ SECOND_TO_SEC
132
135
  else
133
136
  prefix = @name.nil? ? type : "tag #{@name}"
134
137
  raise ASN1Error, "#{prefix}: unrecognized format: #{date_hour}"
@@ -45,10 +45,12 @@ module RASN1
45
45
  # Integer value
46
46
  # @return [Integer]
47
47
  def to_i
48
- if @enum.empty?
49
- value? ? @value : @default || 0
48
+ val = value? ? @value : @default
49
+ case val
50
+ when String, Symbol
51
+ @enum[val]
50
52
  else
51
- @enum[value? ? @value : @default] || 0
53
+ val || 0
52
54
  end
53
55
  end
54
56
 
@@ -135,10 +137,12 @@ module RASN1
135
137
  end
136
138
 
137
139
  def der_to_value(der, ber: false)
138
- @value = der_to_int_value(der, ber: ber)
139
- return if @enum.empty?
140
-
141
- @value = int_to_enum(@value)
140
+ int_value = der_to_int_value(der, ber: ber)
141
+ @value = if @enum.empty?
142
+ int_value
143
+ else
144
+ int_to_enum(int_value)
145
+ end
142
146
  end
143
147
 
144
148
  def explicit_type
@@ -11,18 +11,21 @@ module RASN1
11
11
  private
12
12
 
13
13
  def value_to_der
14
- ids = @value.to_s.split('.').map!(&:to_i)
14
+ ids = @value.to_s.split('.').map(&:to_i)
15
15
 
16
16
  raise ASN1Error, "OBJECT ID #{@name}: first subidentifier should be less than 3" if ids[0] > 2
17
17
  raise ASN1Error, "OBJECT ID #{@name}: second subidentifier should be less than 40" if (ids[0] < 2) && (ids[1] > 39)
18
18
 
19
19
  ids[0, 2] = ids[0] * 40 + ids[1]
20
- ids.map! do |v|
21
- next v if v < 128
22
-
23
- unsigned_to_chained_octets(v)
20
+ octets = []
21
+ ids.each do |v|
22
+ if v < 128
23
+ octets << v
24
+ else
25
+ octets.concat(unsigned_to_chained_octets(v))
26
+ end
24
27
  end
25
- ids.flatten.pack('C*')
28
+ octets.pack('C*')
26
29
  end
27
30
 
28
31
  def der_to_value(der, ber: false) # rubocop:disable Lint/UnusedMethodArgument
@@ -144,11 +144,7 @@ module RASN1
144
144
  nb_bytes = 0
145
145
 
146
146
  while nb_bytes < der.length
147
- type = if composed_of_type? && !@of_type.is_a?(Class)
148
- @of_type.dup
149
- else
150
- of_type_class.new
151
- end
147
+ type = of_type_class.new
152
148
  nb_bytes += type.parse!(der[nb_bytes, der.length])
153
149
  @value << type
154
150
  end
@@ -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
@@ -32,18 +32,20 @@ module RASN1
32
32
  # ID and size of identifier octets
33
33
  def self.decode_identifier_octets(der)
34
34
  first_octet = der.unpack1('C').to_i
35
- asn1_class = Types::Base::CLASSES.key(first_octet & Types::Base::CLASS_MASK)
35
+ asn1_class = Types::Base::CLASSES.key(first_octet & Types::Base::CLASS_MASK) || :universal
36
36
  pc = (first_octet & Types::Constructed::ASN1_PC).positive? ? :constructed : :primitive
37
37
  id = first_octet & Types::Base::MULTI_OCTETS_ID
38
38
 
39
39
  size = if id == Types::Base::MULTI_OCTETS_ID
40
40
  id = 0
41
- der.bytes.each_with_index do |octet, i|
42
- next if i.zero?
41
+ count = 1
42
+ der[1..-1].to_s.bytes.each do |octet|
43
+ count += 1
43
44
 
44
45
  id = (id << 7) | (octet & 0x7f)
45
- break i + 1 if (octet & 0x80).zero?
46
+ break if (octet & 0x80).zero?
46
47
  end
48
+ count
47
49
  else
48
50
  1
49
51
  end
@@ -98,11 +100,11 @@ module RASN1
98
100
  # (value >= 0) && (value < 2**32)
99
101
  # end
100
102
  def self.define_type(name, from:, in_module: self, &block)
101
- constraint = block.nil? ? nil : block.to_proc
103
+ constraint = block&.to_proc
102
104
 
103
- new_klass = Class.new(from) do
104
- include Constrained
105
- end
105
+ new_klass = Class.new(from)
106
+ new_klass.include(Constrained)
107
+ new_klass.extend(Constrained::ClassMethods)
106
108
  new_klass.constraint = constraint
107
109
 
108
110
  in_module.const_set(name, new_klass)
@@ -128,6 +130,7 @@ require_relative 'types/null'
128
130
  require_relative 'types/object_id'
129
131
  require_relative 'types/enumerated'
130
132
  require_relative 'types/bmp_string'
133
+ require_relative 'types/universal_string'
131
134
  require_relative 'types/utf8_string'
132
135
  require_relative 'types/numeric_string'
133
136
  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.1'
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.1
5
5
  platform: ruby
6
6
  authors:
7
- - Sylvain Daubert
8
- autorequire:
7
+ - LemonTree55
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-12-23 00:00:00.000000000 Z
11
+ date: 2024-07-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: strptime
@@ -28,7 +28,7 @@ description: |
28
28
  RASN1 is a pure ruby ASN.1 library. It may encode and decode DER and BER
29
29
  encodings.
30
30
  email:
31
- - sylvain.daubert@laposte.net
31
+ - lenontree@proton.me
32
32
  executables: []
33
33
  extensions: []
34
34
  extra_rdoc_files:
@@ -64,20 +64,21 @@ 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
70
71
  - lib/rasn1/version.rb
71
72
  - lib/rasn1/wrapper.rb
72
- homepage: https://github.com/sdaubert/rasn1
73
+ homepage: https://github.com/lemontree55/rasn1
73
74
  licenses:
74
75
  - MIT
75
76
  metadata:
76
- homepage_uri: https://github.com/sdaubert/rasn1
77
- source_code_uri: https://github.com/sdaubert/rasn1
78
- bug_tracker_uri: https://github.com/sdaubert/rasn1/issues
77
+ homepage_uri: https://github.com/lemontree55/rasn1
78
+ source_code_uri: https://github.com/lemontree55/rasn1
79
+ bug_tracker_uri: https://github.com/lemontree55/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: []