asn1-diag 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/asn1-diag.gemspec +18 -0
  3. data/lib/asn1-pure.rb +166 -0
  4. metadata +73 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 22eab7283eee7b3cee7b2f88ecd035199a16bed9
4
+ data.tar.gz: 137ab6083224d66c054215f4d8df09b711e37c12
5
+ SHA512:
6
+ metadata.gz: 86afff5f012d295130a478f49d157fe0770be13fc6c83d64aed044a8a513251d4fdeb6e53e1fa90452ea23a0afc1e848bcd508e874cbc78d23367696d47b3d8b
7
+ data.tar.gz: 665e01ce13414356ad3e1aa5e248123c2ea3c399bff59b9e8aa4f1fe04ac67926d99d7e19e50470aba16fcff340e4d878fe175d69419584be5780a28bb11e1e6
data/asn1-diag.gemspec ADDED
@@ -0,0 +1,18 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "asn1-diag"
3
+ s.version = "0.0.1"
4
+ s.summary = "ASN1 BER/DER diagnostics"
5
+ s.description = %q{asn1-diag implements some diagnostics for ASN1 BER (X.690) and DER}
6
+ s.author = "Carsten Bormann"
7
+ s.email = "cabo@tzi.org"
8
+ s.license = "Apache-2.0"
9
+ s.has_rdoc = false
10
+ s.files = Dir['lib/**/*.rb'] + %w(asn1-diag.gemspec) + Dir['bin/**/*.rb']
11
+ s.executables = Dir['bin/**/*.rb'].map {|x| File.basename(x)}
12
+ s.required_ruby_version = '>= 2.4.1'
13
+
14
+ s.require_paths = ["lib"]
15
+
16
+ s.add_development_dependency 'bundler', '~>1'
17
+ s.add_dependency 'json'
18
+ end
data/lib/asn1-pure.rb ADDED
@@ -0,0 +1,166 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module ASN1
4
+ class OutOfBytesError < RuntimeError
5
+ def initialize(bytes)
6
+ @bytes = bytes
7
+ end
8
+
9
+ def to_s
10
+ "Out of bytes to decode: #{@bytes}"
11
+ end
12
+ attr_reader :bytes
13
+ end
14
+
15
+ def self.encode(d)
16
+ Buffer.new.add(d).buffer
17
+ end
18
+ def self.encode_seq(ds)
19
+ out = Buffer.new
20
+ ds.each do |d|
21
+ out.add(d)
22
+ end
23
+ out.buffer
24
+ end
25
+ def self.decode(s)
26
+ Buffer.new(s).decode_item_final
27
+ end
28
+ def self.decode_with_rest(s)
29
+ Buffer.new(s).decode_item_with_rest
30
+ end
31
+ def self.decode_seq(s)
32
+ Buffer.new(s).decode_items
33
+ end
34
+
35
+ class Buffer
36
+
37
+ attr_reader :buffer
38
+ def initialize(s = String.new)
39
+ @buffer = s
40
+ @pos = 0
41
+ end
42
+
43
+ def atleast(n)
44
+ left = @buffer.bytesize - @pos
45
+ raise OutOfBytesError.new(n - left) if n > left
46
+ end
47
+
48
+ def take(n)
49
+ opos = @pos
50
+ @pos += n
51
+ raise OutOfBytesError.new(@pos - @buffer.bytesize) if @pos > @buffer.bytesize
52
+ @buffer[opos, n]
53
+ end
54
+
55
+ def decode_sdnv
56
+ res = 0
57
+ while (b = take(1).ord
58
+ res = (res << 7) + (b & 0x7f)
59
+ (b & 0x80) != 0)
60
+ ;
61
+ end
62
+ res
63
+ end
64
+
65
+ def self.oid_print(s)
66
+ bu = Buffer.new(s)
67
+ a = []
68
+ while !bu.done
69
+ a << bu.decode_sdnv
70
+ end
71
+ ia = a[0]
72
+ ia1 = [a[0]/40, 2].min
73
+ a[0..0] = [ia1, ia - 40 * ia1]
74
+ a.join(".")
75
+ end
76
+
77
+ def self.be_decode(s)
78
+ ret = 0
79
+ s.each_byte do |b|
80
+ ret = (ret << 8) + b
81
+ end
82
+ ret
83
+ end
84
+ define_method :be_decode, &method(:be_decode)
85
+
86
+ READABLE = Hash.new {|h, k| [k]}
87
+ READABLE[[0x30, 0x10]] = :seq
88
+ READABLE[[0x31, 0x11]] = :set
89
+ READABLE[[2, 2]] = :int, ->(s) {be_decode(s)}
90
+ READABLE[[3, 3]] = :bits
91
+ READABLE[[4, 4]] = :b
92
+ READABLE[[5, 5]] = :null, ->(s) {:null}
93
+ READABLE[[6, 6]] = :oid, ->(s) {oid_print(s)}
94
+ READABLE[[12, 12]] = :u
95
+ READABLE[[19, 19]] = :s
96
+ READABLE[[22, 22]] = :ia5
97
+ READABLE[[23, 23]] = :t # time
98
+ (0..15).each do |i|
99
+ READABLE[[0xA0 + i, i]] = :"exp#{i}"
100
+ end
101
+
102
+ def decode_item
103
+ ib = take(1).ord
104
+ cons = ib & 0x20
105
+ tag = decode_sdnv if (tag = ib & 0x1f) == 0x1f
106
+ case len = take(1).ord
107
+ when 0..127
108
+ when 128
109
+ len = false # indefinite
110
+ when 255
111
+ fail "reserved length @pos"
112
+ else
113
+ len = be_decode(take(len - 128))
114
+ end
115
+ rtag, rproc = READABLE[[ib, tag]]
116
+ if cons != 0
117
+ nest = []
118
+ if len
119
+ limit = @pos + len
120
+ while @pos < limit
121
+ nest << decode_item
122
+ end
123
+ else
124
+ while (a = decode_item
125
+ if a != [0, 0, ""]
126
+ nest << a
127
+ end)
128
+ ;
129
+ end
130
+ fail "no indef yet @pos"
131
+ end
132
+ fail [@pos, limit] if @pos != limit
133
+ else
134
+ nest = take(len)
135
+ end
136
+ rproc ? rproc.(nest) : {rtag => nest}
137
+ end
138
+
139
+ def decode_item_final
140
+ val = decode_item
141
+ raise "extra bytes follow after a deserialized object" if @pos != @buffer.size
142
+ val
143
+ end
144
+
145
+ def decode_item_with_rest
146
+ val = decode_item
147
+ [val, @buffer[@pos..-1]]
148
+ end
149
+
150
+ def done
151
+ @pos == buffer.size
152
+ end
153
+
154
+ def decode_items
155
+ ret = []
156
+ while @pos != buffer.size
157
+ ret << decode_item
158
+ end
159
+ ret
160
+ end
161
+
162
+
163
+ end
164
+
165
+
166
+ end
metadata ADDED
@@ -0,0 +1,73 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: asn1-diag
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Carsten Bormann
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-08-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: json
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: asn1-diag implements some diagnostics for ASN1 BER (X.690) and DER
42
+ email: cabo@tzi.org
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files: []
46
+ files:
47
+ - asn1-diag.gemspec
48
+ - lib/asn1-pure.rb
49
+ homepage:
50
+ licenses:
51
+ - Apache-2.0
52
+ metadata: {}
53
+ post_install_message:
54
+ rdoc_options: []
55
+ require_paths:
56
+ - lib
57
+ required_ruby_version: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 2.4.1
62
+ required_rubygems_version: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ requirements: []
68
+ rubyforge_project:
69
+ rubygems_version: 2.6.11
70
+ signing_key:
71
+ specification_version: 4
72
+ summary: ASN1 BER/DER diagnostics
73
+ test_files: []