rasn1 0.6.1 → 0.6.2

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
- SHA1:
3
- metadata.gz: 8afb668f624fee248cce8fe52bd51b57dc42a88f
4
- data.tar.gz: 041fe9c1bf42b220b616d4c751b7acef8e98afc8
2
+ SHA256:
3
+ metadata.gz: a9745a1fe5540da0693f4e9bf5048dd177c58e314917e6d606b1caa34fa0f138
4
+ data.tar.gz: 67f2bc01529e894be272fb905ded771a89f8bb6eb14bc1eac86178d3e7a72148
5
5
  SHA512:
6
- metadata.gz: 32f94898893e828e3bc37569bde1cea6e72c577e64748aa87e6c30ffca7065eeb0365c2f10c2d26db89ff71ca2d03f2d9c8281175544d3af0b87b6f263fec24a
7
- data.tar.gz: 5261798fa1336eb18234316d4224bfb12a55fe6a6583c36fe01cc2f40eeeb68cbcb839af83d5ccd3ec031c7eb72c2d50143568ce267ce03587dc28020e564f6f
6
+ metadata.gz: dc403f68a96560969a2221bc255e9f9f56dacb90f174977067054830dd0b85afc53dd8c25b130ddda3d38b6fc8e3d9d6341e9e5a805dda59ea4b478d3b960a78
7
+ data.tar.gz: 201e5f5255a2ebb2a2d26c9fe2a75d9fed7f72d5e32f6ceb712e4ff0d01c81b38a896c31ee6bf446f74b9065f5ef6bab5cecdbf55e236dc53b53015ee959ee58
data/.travis.yml CHANGED
@@ -1,8 +1,9 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.2.7
4
- - 2.3.4
5
- - 2.4.1
3
+ - 2.2
4
+ - 2.3
5
+ - 2.4
6
+ - 2.5
6
7
  install:
7
8
  - bundle install --path vendor/bundle --jobs=3 --retry=3
8
9
  script:
data/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  # Rasn1
5
5
 
6
- Rasn1 will be a ruby ASN.1 library to encode, parse and decode ASN.1 data in DER format.
6
+ Rasn1 is a ruby ASN.1 library to encode, parse and decode ASN.1 data in DER format.
7
7
 
8
8
  ## Installation
9
9
 
data/lib/rasn1/types.rb CHANGED
@@ -67,3 +67,5 @@ require_relative 'types/set'
67
67
  require_relative 'types/set_of'
68
68
  require_relative 'types/choice'
69
69
  require_relative 'types/any'
70
+ require_relative 'types/utc_time'
71
+ require_relative 'types/generalized_time'
@@ -0,0 +1,111 @@
1
+ module RASN1
2
+ module Types
3
+
4
+ # ASN.1 GeneralizedTime
5
+ #
6
+ # +{#value} of a {GeneralizedTime} should be a ruby Time.
7
+ #
8
+ # ===Notes
9
+ # When encoding, resulting string is always a UTC time, appended with +Z+.
10
+ # Minutes and seconds are always generated. Fractions of second are generated
11
+ # if value Time object have them.
12
+ #
13
+ # On parsing, are supported:
14
+ # * UTC times (ending with +Z+),
15
+ # * local times (no suffix),
16
+ # * local times with difference between UTC and this local time (ending with
17
+ # +sHHMM+, where +s+ is +++ or +-+, and +HHMM+ is the time differential
18
+ # betwen UTC and local time).
19
+ # These times may include minutes and seconds. Fractions of hour, minute and
20
+ # second are supported.
21
+ # @author Sylvain Daubert
22
+ class GeneralizedTime < Primitive
23
+ TAG = 24
24
+
25
+ # Get ASN.1 type
26
+ # @return [String]
27
+ def self.type
28
+ 'GeneralizedTime'
29
+ end
30
+
31
+ private
32
+
33
+ def value_to_der
34
+ if @value.nsec > 0
35
+ der = @value.getutc.strftime('%Y%m%d%H%M%S.%9NZ')
36
+ der.sub(/0+Z/, 'Z')
37
+ else
38
+ @value.getutc.strftime('%Y%m%d%H%M%SZ')
39
+ end
40
+ end
41
+
42
+ def der_to_value(der, ber: false)
43
+ date_hour, fraction = der.split('.')
44
+ utc_offset_forced = false
45
+ if fraction.nil?
46
+ if date_hour[-1] != 'Z' and date_hour !~ /[+-]\d+$/
47
+ # If not UTC, have to add offset with UTC to force
48
+ # DateTime#strptime to generate a local time. But this difference
49
+ # may be errored because of DST.
50
+ date_hour << Time.now.strftime('%z')
51
+ utc_offset_forced = true
52
+ end
53
+ else
54
+ if fraction[-1] == 'Z'
55
+ fraction = fraction[0...-1]
56
+ date_hour << 'Z'
57
+ else
58
+ match = fraction.match(/(\d+)([+-]\d+)/)
59
+ if match
60
+ # fraction contains fraction and timezone info. Split them
61
+ fraction = match[1]
62
+ date_hour << match[2]
63
+ else
64
+ # fraction only contains fraction.
65
+ # Have to add offset with UTC to force DateTime#strptime to
66
+ # generate a local time. But this difference may be errored
67
+ # because of DST.
68
+ date_hour << Time.now.strftime('%z')
69
+ utc_offset_forced = true
70
+ end
71
+ end
72
+ end
73
+ format = case date_hour.size
74
+ when 11
75
+ frac_base = 60*60
76
+ '%Y%m%d%HZ'
77
+ when 13
78
+ frac_base = 60
79
+ '%Y%m%d%H%MZ'
80
+ when 15
81
+ if date_hour[-1] == 'Z'
82
+ frac_base = 1
83
+ '%Y%m%d%H%M%SZ'
84
+ else
85
+ frac_base = 60 * 60
86
+ '%Y%m%d%H%z'
87
+ end
88
+ when 17
89
+ frac_base = 60
90
+ '%Y%m%d%H%M%z'
91
+ when 19
92
+ frac_base = 1
93
+ '%Y%m%d%H%M%S%z'
94
+ else
95
+ prefix = @name.nil? ? type : "tag #{@name}"
96
+ raise ASN1Error, "#{prefix}: unrecognized format: #{der}"
97
+ end
98
+ @value = DateTime.strptime(date_hour, format).to_time
99
+ # local time format.
100
+ # Check DST. There may be a shift of one hour...
101
+ if utc_offset_forced
102
+ compare_time = Time.new(*@value.to_a[0..5].reverse)
103
+ if compare_time.utc_offset != @value.utc_offset
104
+ @value = compare_time
105
+ end
106
+ end
107
+ @value += ".#{fraction}".to_r * frac_base unless fraction.nil?
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,53 @@
1
+ require 'date'
2
+
3
+ module RASN1
4
+ module Types
5
+
6
+ # ASN.1 UTCTime
7
+ #
8
+ # +{#value} of a +UtcTime+ should be a ruby Time.
9
+ #
10
+ # ===Notes
11
+ # When encoding, resulting string is always a UTC time, appended with +Z+.
12
+ # Seconds are always generated.
13
+ #
14
+ # On parsing, UTC times (ending with +Z+) and local times (ending with
15
+ # +sHHMM+, where +s+ is +++ or +-+, and +HHMM+ is the time differential
16
+ # betwen UTC and local time) are both supported. Seconds may be present or
17
+ # not.
18
+ # @author Sylvain Daubert
19
+ class UtcTime < Primitive
20
+ TAG = 23
21
+
22
+ # Get ASN.1 type
23
+ # @return [String]
24
+ def self.type
25
+ 'UTCTime'
26
+ end
27
+
28
+ private
29
+
30
+ def value_to_der
31
+ @value.getutc.strftime('%y%m%d%H%M%SZ')
32
+ end
33
+
34
+ def der_to_value(der, ber: false)
35
+ format = case der.size
36
+ when 11
37
+ '%Y%m%d%H%MZ'
38
+ when 13
39
+ '%Y%m%d%H%M%SZ'
40
+ when 15
41
+ '%Y%m%d%H%M%z'
42
+ when 17
43
+ '%Y%m%d%H%M%S%z'
44
+ else
45
+ prefix = @name.nil? ? type : "tag #{@name}"
46
+ raise ASN1Error, "#{prefix}: unrecognized format: #{der}"
47
+ end
48
+ century = (Time.now.year / 100).to_s
49
+ @value = DateTime.strptime(century + der, format).to_time
50
+ end
51
+ end
52
+ end
53
+ end
data/lib/rasn1/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module RASN1
2
- VERSION = "0.6.1"
2
+ VERSION = "0.6.2"
3
3
  end
data/rasn1.gemspec CHANGED
@@ -11,7 +11,10 @@ Gem::Specification.new do |spec|
11
11
  spec.email = ['sylvain.daubert@laposte.net']
12
12
 
13
13
  spec.summary = %q{Ruby ASN.1 library}
14
- #spec.description = %q{TODO: Write a longer description or delete this line.}
14
+ spec.description = %q{
15
+ RASN1 is a pure ruby ASN.1 library. It may encode and decode DER and BER
16
+ encodings.
17
+ }
15
18
  spec.homepage = 'https://github.com/sdaubert/rasn1'
16
19
 
17
20
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
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.6.1
4
+ version: 0.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sylvain Daubert
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-23 00:00:00.000000000 Z
11
+ date: 2018-05-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: yard
@@ -80,7 +80,10 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0.14'
83
- description:
83
+ description: |2
84
+
85
+ RASN1 is a pure ruby ASN.1 library. It may encode and decode DER and BER
86
+ encodings.
84
87
  email:
85
88
  - sylvain.daubert@laposte.net
86
89
  executables: []
@@ -103,6 +106,7 @@ files:
103
106
  - lib/rasn1/types/choice.rb
104
107
  - lib/rasn1/types/constructed.rb
105
108
  - lib/rasn1/types/enumerated.rb
109
+ - lib/rasn1/types/generalized_time.rb
106
110
  - lib/rasn1/types/ia5string.rb
107
111
  - lib/rasn1/types/integer.rb
108
112
  - lib/rasn1/types/null.rb
@@ -115,6 +119,7 @@ files:
115
119
  - lib/rasn1/types/sequence_of.rb
116
120
  - lib/rasn1/types/set.rb
117
121
  - lib/rasn1/types/set_of.rb
122
+ - lib/rasn1/types/utc_time.rb
118
123
  - lib/rasn1/types/utf8_string.rb
119
124
  - lib/rasn1/types/visible_string.rb
120
125
  - lib/rasn1/version.rb
@@ -139,7 +144,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
139
144
  version: '0'
140
145
  requirements: []
141
146
  rubyforge_project:
142
- rubygems_version: 2.6.13
147
+ rubygems_version: 2.7.6
143
148
  signing_key:
144
149
  specification_version: 4
145
150
  summary: Ruby ASN.1 library