cddlc 0.1.0 → 0.1.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 +4 -4
- data/bin/cddlc +49 -25
- data/cddlc.gemspec +2 -2
- data/data/rfc9052.cddl +154 -0
- data/lib/cddlc.rb +4 -1
- data/lib/processor/cddl-undefined.rb +29 -0
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 446e27ac8733454e0a3a9a9e2f24a43f600f60a414400419287fe147649a7a1f
|
4
|
+
data.tar.gz: 1a4e7b41949419befd15479d0373bf3c316e22c62a6796c6453db6c3467f2b5d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5fce60c859d8b361973c52a9e4d0a4e18908a7978d938a91c0e50125d64db3a5d704a9cc7f6ad8d17fb7f242bed3f31bb5df2107459d9fdacc57afae9f8df53e
|
7
|
+
data.tar.gz: 2c8a8e5f3653125cb719d6aeb7f46642643b561702824a4fcdd404dd40bcdf3ae362ca5cda5323b97f6da521dc555677d8f5139774a12ef9b2f599539b08850e
|
data/bin/cddlc
CHANGED
@@ -58,6 +58,9 @@ begin
|
|
58
58
|
opts.on("-u", "--[no-]undefined", "Note undefined names") do |v|
|
59
59
|
$options.note_undefined = v
|
60
60
|
end
|
61
|
+
opts.on("-2", "--[no-]cddl2", "Perform some CDDL 2.0 processing") do |v|
|
62
|
+
$options.cddl2 = v
|
63
|
+
end
|
61
64
|
opts.on("-tFMT", "--to=FMT", [:basic, :neat, :json, :yaml, :enum, :cddl], "Target format") do |v|
|
62
65
|
$options.target = v
|
63
66
|
end
|
@@ -88,6 +91,46 @@ result = if $options.rules
|
|
88
91
|
|
89
92
|
warn "** can't note undefined for target != cddl" if $options.note_undefined && $options.target != :cddl
|
90
93
|
|
94
|
+
if $options.cddl2
|
95
|
+
require_relative '../lib/processor/cddl-undefined.rb'
|
96
|
+
directives = cddl_file.lines.grep(/^;# /).map(&:chomp).map{|l| l.sub(/^;#\s+/, '')}
|
97
|
+
# puts "** Directives: <<"
|
98
|
+
# puts directives
|
99
|
+
directives.each do |di|
|
100
|
+
case di
|
101
|
+
when /\Ainclude\s+([-._a-zA-Z0-9]+)(?:\s+as\s+([-._a-zA-Z0-9]+))?\s*\z/
|
102
|
+
docref = $1
|
103
|
+
explicit_preferred_tag = $2
|
104
|
+
preferred_tag = explicit_preferred_tag || docref
|
105
|
+
puts "PREFERRED_TAG #{preferred_tag}" if $options.verbose
|
106
|
+
puts "DOCREF #{docref}" if $options.verbose
|
107
|
+
fn = docref.downcase << ".cddl"
|
108
|
+
io = File.open(fn) rescue File.open(CDDL::DATA_DIR + fn) # XXX CDDL_PATH
|
109
|
+
include_file = io.read
|
110
|
+
# XXX: processing directives recursively!
|
111
|
+
included_cddl = CDDL.from_cddl(include_file)
|
112
|
+
# XXX: Should namespace that thing now! all names -> preferred_tag.name
|
113
|
+
p included_cddl.rules.keys
|
114
|
+
# XXX: do once, first, to rename COSE_Key to RFC9052.COSE_Key
|
115
|
+
loop do
|
116
|
+
undef_rule, _undef_gen = cddl.cddl_undefined # ignore undef_gen for now
|
117
|
+
# p undef_rule
|
118
|
+
got_more = false
|
119
|
+
undef_rule.each do |name|
|
120
|
+
if rule = included_cddl.rules[name]
|
121
|
+
cddl.rules[name] = rule # XXX must be namespaced!
|
122
|
+
puts "IMPORTED #{name} from #{fn}" # ...: #{rule}... if $options.verbose
|
123
|
+
got_more = true
|
124
|
+
end
|
125
|
+
end
|
126
|
+
break unless got_more
|
127
|
+
end
|
128
|
+
else
|
129
|
+
warn "** unknown directive '#{di}' ignored"
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
91
134
|
case $options.target
|
92
135
|
when :basic, nil
|
93
136
|
pp result
|
@@ -116,32 +159,13 @@ when :enum
|
|
116
159
|
when :cddl
|
117
160
|
require_relative '../lib/writer/cddl-writer.rb'
|
118
161
|
if $options.note_undefined
|
119
|
-
require_relative
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
cddl.rules.each do |k, v|
|
124
|
-
def_gen[k[0]] = true if Array === k
|
125
|
-
cddl.visit(v) do |p, &block|
|
126
|
-
case p
|
127
|
-
in ["gen", name, *_gen_args]
|
128
|
-
gen_used[name] = true
|
129
|
-
in ["name", name]
|
130
|
-
used[name] = true
|
131
|
-
else
|
132
|
-
false
|
133
|
-
end
|
134
|
-
end
|
162
|
+
require_relative '../lib/processor/cddl-undefined.rb'
|
163
|
+
undef_rule, undef_gen = cddl.cddl_undefined
|
164
|
+
undef_rule.each do |k|
|
165
|
+
puts ";;; *** undefined: #{k}"
|
135
166
|
end
|
136
|
-
|
137
|
-
|
138
|
-
puts ";;; *** undefined: #{k}"
|
139
|
-
end
|
140
|
-
end
|
141
|
-
gen_used.each do |k, v|
|
142
|
-
unless def_gen[k]
|
143
|
-
puts ";;; *** undefined: #{k}<>"
|
144
|
-
end
|
167
|
+
undef_gen.each do |k|
|
168
|
+
puts ";;; *** undefined: #{k}<>"
|
145
169
|
end
|
146
170
|
end
|
147
171
|
puts cddl.to_s
|
data/cddlc.gemspec
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "cddlc"
|
3
|
-
s.version = "0.1.
|
3
|
+
s.version = "0.1.1"
|
4
4
|
s.summary = "CDDL (Concise Data Definition Language) converters and miscellaneous tools"
|
5
5
|
s.description = %q{cddlc implements converters and miscellaneous tools for CDDL, RFC 8610}
|
6
6
|
s.author = "Carsten Bormann"
|
7
7
|
s.email = "cabo@tzi.org"
|
8
8
|
s.license = "MIT"
|
9
9
|
s.homepage = "http://github.com/cabo/cddlc"
|
10
|
-
s.files = Dir['lib/**/*.rb'] + %w(cddlc.gemspec data
|
10
|
+
s.files = Dir['lib/**/*.rb'] + %w(cddlc.gemspec) + Dir['data/*.cddl'] + Dir['bin/**/*.rb']
|
11
11
|
s.executables = Dir['bin/*'].map {|x| File.basename(x)}
|
12
12
|
s.required_ruby_version = '>= 1.9.2'
|
13
13
|
|
data/data/rfc9052.cddl
ADDED
@@ -0,0 +1,154 @@
|
|
1
|
+
|
2
|
+
start = COSE_Messages / COSE_Key / COSE_KeySet / Internal_Types
|
3
|
+
|
4
|
+
; This is defined to make the tool quieter:
|
5
|
+
Internal_Types = Sig_structure / Enc_structure / MAC_structure
|
6
|
+
|
7
|
+
|
8
|
+
label = int / tstr
|
9
|
+
values = any
|
10
|
+
|
11
|
+
|
12
|
+
COSE_Messages = COSE_Untagged_Message / COSE_Tagged_Message
|
13
|
+
|
14
|
+
COSE_Untagged_Message = COSE_Sign / COSE_Sign1 /
|
15
|
+
COSE_Encrypt / COSE_Encrypt0 /
|
16
|
+
COSE_Mac / COSE_Mac0
|
17
|
+
|
18
|
+
COSE_Tagged_Message = COSE_Sign_Tagged / COSE_Sign1_Tagged /
|
19
|
+
COSE_Encrypt_Tagged / COSE_Encrypt0_Tagged /
|
20
|
+
COSE_Mac_Tagged / COSE_Mac0_Tagged
|
21
|
+
|
22
|
+
|
23
|
+
Headers = (
|
24
|
+
protected : empty_or_serialized_map,
|
25
|
+
unprotected : header_map
|
26
|
+
)
|
27
|
+
|
28
|
+
header_map = {
|
29
|
+
Generic_Headers,
|
30
|
+
* label => values
|
31
|
+
}
|
32
|
+
|
33
|
+
empty_or_serialized_map = bstr .cbor header_map / bstr .size 0
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
Generic_Headers = (
|
38
|
+
? 1 => int / tstr, ; algorithm identifier
|
39
|
+
? 2 => [+label], ; criticality
|
40
|
+
? 3 => tstr / int, ; content type
|
41
|
+
? 4 => bstr, ; key identifier
|
42
|
+
? ( 5 => bstr // ; IV
|
43
|
+
6 => bstr ) ; Partial IV
|
44
|
+
)
|
45
|
+
|
46
|
+
|
47
|
+
COSE_Sign_Tagged = #6.98(COSE_Sign)
|
48
|
+
|
49
|
+
|
50
|
+
COSE_Sign = [
|
51
|
+
Headers,
|
52
|
+
payload : bstr / nil,
|
53
|
+
signatures : [+ COSE_Signature]
|
54
|
+
]
|
55
|
+
|
56
|
+
|
57
|
+
COSE_Signature = [
|
58
|
+
Headers,
|
59
|
+
signature : bstr
|
60
|
+
]
|
61
|
+
|
62
|
+
|
63
|
+
COSE_Sign1_Tagged = #6.18(COSE_Sign1)
|
64
|
+
|
65
|
+
|
66
|
+
COSE_Sign1 = [
|
67
|
+
Headers,
|
68
|
+
payload : bstr / nil,
|
69
|
+
signature : bstr
|
70
|
+
]
|
71
|
+
|
72
|
+
|
73
|
+
Sig_structure = [
|
74
|
+
context : "Signature" / "Signature1",
|
75
|
+
body_protected : empty_or_serialized_map,
|
76
|
+
? sign_protected : empty_or_serialized_map,
|
77
|
+
external_aad : bstr,
|
78
|
+
payload : bstr
|
79
|
+
]
|
80
|
+
|
81
|
+
|
82
|
+
COSE_Encrypt_Tagged = #6.96(COSE_Encrypt)
|
83
|
+
|
84
|
+
|
85
|
+
COSE_Encrypt = [
|
86
|
+
Headers,
|
87
|
+
ciphertext : bstr / nil,
|
88
|
+
recipients : [+COSE_recipient]
|
89
|
+
]
|
90
|
+
|
91
|
+
|
92
|
+
COSE_recipient = [
|
93
|
+
Headers,
|
94
|
+
ciphertext : bstr / nil,
|
95
|
+
? recipients : [+COSE_recipient]
|
96
|
+
]
|
97
|
+
|
98
|
+
|
99
|
+
COSE_Encrypt0_Tagged = #6.16(COSE_Encrypt0)
|
100
|
+
|
101
|
+
|
102
|
+
COSE_Encrypt0 = [
|
103
|
+
Headers,
|
104
|
+
ciphertext : bstr / nil,
|
105
|
+
]
|
106
|
+
|
107
|
+
|
108
|
+
Enc_structure = [
|
109
|
+
context : "Encrypt" / "Encrypt0" / "Enc_Recipient" /
|
110
|
+
"Mac_Recipient" / "Rec_Recipient",
|
111
|
+
protected : empty_or_serialized_map,
|
112
|
+
external_aad : bstr
|
113
|
+
]
|
114
|
+
|
115
|
+
|
116
|
+
COSE_Mac_Tagged = #6.97(COSE_Mac)
|
117
|
+
|
118
|
+
|
119
|
+
COSE_Mac = [
|
120
|
+
Headers,
|
121
|
+
payload : bstr / nil,
|
122
|
+
tag : bstr,
|
123
|
+
recipients : [+COSE_recipient]
|
124
|
+
]
|
125
|
+
|
126
|
+
|
127
|
+
COSE_Mac0_Tagged = #6.17(COSE_Mac0)
|
128
|
+
|
129
|
+
|
130
|
+
COSE_Mac0 = [
|
131
|
+
Headers,
|
132
|
+
payload : bstr / nil,
|
133
|
+
tag : bstr,
|
134
|
+
]
|
135
|
+
|
136
|
+
|
137
|
+
MAC_structure = [
|
138
|
+
context : "MAC" / "MAC0",
|
139
|
+
protected : empty_or_serialized_map,
|
140
|
+
external_aad : bstr,
|
141
|
+
payload : bstr
|
142
|
+
]
|
143
|
+
|
144
|
+
|
145
|
+
COSE_Key = {
|
146
|
+
1 => tstr / int, ; kty
|
147
|
+
? 2 => bstr, ; kid
|
148
|
+
? 3 => tstr / int, ; alg
|
149
|
+
? 4 => [+ (tstr / int) ], ; key_ops
|
150
|
+
? 5 => bstr, ; Base IV
|
151
|
+
* label => values
|
152
|
+
}
|
153
|
+
|
154
|
+
COSE_KeySet = [+COSE_Key]
|
data/lib/cddlc.rb
CHANGED
@@ -66,9 +66,12 @@ class CDDL
|
|
66
66
|
@rules
|
67
67
|
end
|
68
68
|
|
69
|
+
DATA_DIR = Pathname.new(__FILE__) + "../../data/"
|
70
|
+
|
69
71
|
def prelude
|
70
72
|
if @prelude.nil?
|
71
|
-
@prelude = CDDL.from_cddl(File.read(
|
73
|
+
@prelude = CDDL.from_cddl(File.read(DATA_DIR + "prelude.cddl"))
|
74
|
+
|
72
75
|
end
|
73
76
|
@prelude
|
74
77
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require_relative "../cddlc.rb"
|
2
|
+
require_relative "./cddl-visitor.rb"
|
3
|
+
require_relative "./cddl-expander.rb"
|
4
|
+
|
5
|
+
class CDDL
|
6
|
+
def cddl_undefined
|
7
|
+
# currently only works on expanded...
|
8
|
+
cddl2 = self
|
9
|
+
cddl2.expand_generics
|
10
|
+
used = {}
|
11
|
+
gen_used = {}
|
12
|
+
def_gen = {}
|
13
|
+
cddl2.rules.each do |k, v|
|
14
|
+
def_gen[k[0]] = true if Array === k
|
15
|
+
cddl2.visit(v) do |p, &block|
|
16
|
+
case p
|
17
|
+
in ["gen", name, *_gen_args]
|
18
|
+
gen_used[name] = true
|
19
|
+
in ["name", name]
|
20
|
+
used[name] = true
|
21
|
+
else
|
22
|
+
false
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
[used.keys.reject {|name| cddl2.rules[name] || prelude.rules[name]},
|
27
|
+
gen_used.keys.reject {|name| def_gen[name] }]
|
28
|
+
end
|
29
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cddlc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Carsten Bormann
|
@@ -76,10 +76,12 @@ files:
|
|
76
76
|
- bin/cddlc
|
77
77
|
- cddlc.gemspec
|
78
78
|
- data/prelude.cddl
|
79
|
+
- data/rfc9052.cddl
|
79
80
|
- lib/cddlc.rb
|
80
81
|
- lib/parser/cddl-util.rb
|
81
82
|
- lib/parser/cddlgrammar.rb
|
82
83
|
- lib/processor/cddl-expander.rb
|
84
|
+
- lib/processor/cddl-undefined.rb
|
83
85
|
- lib/processor/cddl-visitor.rb
|
84
86
|
- lib/writer/cddl-writer.rb
|
85
87
|
homepage: http://github.com/cabo/cddlc
|