rasn1 0.12.1 → 0.13.1

Sign up to get free protection for your applications and to get access to all the features.
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: []