cddl 0.8.17 → 0.8.22

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: e57d91298d6da2ed2f30060754b3c54f36ebdbf967e6e4e5f3e164fd8dfe2004
4
- data.tar.gz: c1f33e309cee195a2438d4e840fcef8748de4f50625f55ec15dbb154e1b43994
3
+ metadata.gz: 72490cb2a368cfaec3e71cae79f323665fc64f0049feeb30050a6e8275566cda
4
+ data.tar.gz: 6ad8a0c69b34745dcd41f7c5627c57e9a4292539115f4d63c502d4c0a3cd0218
5
5
  SHA512:
6
- metadata.gz: 871fba7d4ec1b1d94a28149c3c9f9c9cdc4e60ddadb9d503f9ada96b35809534ed576865133f5a78c8645f1cce67f03ef04c799528c5dfa18752398d7e193302
7
- data.tar.gz: df38f1006d6c36782609681c994fd09c8b0eb8a23d35d8de57dcd6b252a18d97d05ef42b776b276b56359e8ee212b25e923e6b337c0944a7646e7770d36b6696
6
+ metadata.gz: 1fcbc5a8d49391656566b9f4b7d03392a579b5e999d301b2dab877aa25ff6d31c4575a94a771bdf8df0d0c3b88dd086bafe952359bb297690325204fbf732c11
7
+ data.tar.gz: 15ce2e416c02c834d3853520ca2fc8baa8b26359623dff75f6615a755a6ef4007abc2fb0170248ae5b57783e52fd779bc5c88be9cea70e7534ac9104cbfc67a8
data/bin/cddl CHANGED
@@ -14,8 +14,8 @@ def usage
14
14
  warn "Usage:"
15
15
  warn "#$0 spec.cddl generate [n]"
16
16
  warn "#$0 spec.cddl json-generate [n]"
17
- warn "#$0 spec.cddl validate instance.cbor"
18
- warn "#$0 spec.cddl validate instance.json"
17
+ warn "#$0 spec.cddl validate instance.cbor..."
18
+ warn "#$0 spec.cddl validate instance.json..."
19
19
  exit EX_USAGE
20
20
  end
21
21
 
@@ -48,6 +48,8 @@ def my_diag(v)
48
48
  end
49
49
  end
50
50
 
51
+ retcode = 0
52
+
51
53
  begin
52
54
  case ARGV[1]
53
55
  when /\A..*p/
@@ -85,19 +87,25 @@ begin
85
87
  g = parser.generate
86
88
  puts JSON.pretty_generate(g)
87
89
  end
88
- when /\Av/
89
- instance = read_arg(ARGV[2])
90
- instance = if $sequence
91
- CBOR.decode("\x9f".b << instance.b << "\xff".b)
92
- else
93
- CBOR.decode(instance.b) rescue JSON.load(instance)
90
+ when /\Av(v)?/
91
+ verbose = $1
92
+ ARGV[2..-1].each do |fn|
93
+ instance = read_arg(fn)
94
+ instance = if $sequence
95
+ CBOR.decode("\x9f".b << instance.b << "\xff".b)
96
+ else
97
+ CBOR.decode(instance.b) rescue JSON.load(instance)
98
+ end
99
+ instance = instance.cbor_clone if $annotate && ENV["EXPERIMENTAL_ANNOTATE"]
100
+ warn "#{fn}:" if verbose
101
+ ann = parser.validate(instance)
102
+ # my_pp ann
103
+ instance.cbor_add_annotations_from(ann) rescue nil
104
+ my_diag(instance) if $annotate
105
+ unless ann
106
+ retcode = 1
107
+ end
94
108
  end
95
- instance = instance.cbor_clone if $annotate && ENV["EXPERIMENTAL_ANNOTATE"]
96
- ann = parser.validate(instance)
97
- # my_pp ann
98
- instance.cbor_add_annotations_from(ann) rescue nil
99
- my_diag(instance) if $annotate
100
- exit 1 unless ann
101
109
  else
102
110
  usage
103
111
  end
@@ -105,3 +113,5 @@ rescue CDDL::ParseError => e
105
113
  warn e.message
106
114
  exit EX_DATAERR
107
115
  end
116
+
117
+ exit retcode
data/cddl.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  spec = Gem::Specification.new do |s|
2
2
  s.name = 'cddl'
3
- s.version = '0.8.17'
3
+ s.version = '0.8.22'
4
4
  s.summary = "CDDL generator and validator."
5
5
  s.description = %{A parser, generator, and validator for CDDL}
6
6
  s.add_dependency('cbor-diag')
data/lib/cddl.rb CHANGED
@@ -56,6 +56,8 @@ module CDDL
56
56
  @ast = @abnf.ast?
57
57
  # our little argument stack for rule processing
58
58
  @insides = []
59
+ # collect error information
60
+ @last_message = ""
59
61
  end
60
62
 
61
63
  def apr # for debugging
@@ -244,6 +246,12 @@ module CDDL
244
246
  [rule[0], *rule[1]]
245
247
  end
246
248
 
249
+ def remove_indentation(s)
250
+ l = s.lines
251
+ indent = l.grep(/\S/).map {|l| l[/^\s*/].size}.min
252
+ l.map {|l| l.sub(/^ {0,#{indent}}/, "")}.join
253
+ end
254
+
247
255
  # Memoize a bit here
248
256
 
249
257
  REGEXP_FOR_STRING = Hash.new {|h, k|
@@ -255,6 +263,11 @@ module CDDL
255
263
  h[k] = ABNF.from_abnf(grammar)
256
264
  }
257
265
 
266
+ ABNF_ENCODING_FOR_CONOP = {
267
+ abnf: Encoding::UTF_8,
268
+ abnfb: Encoding::BINARY
269
+ }
270
+
258
271
  def generate
259
272
  @recursion = 0
260
273
  generate1(rules)
@@ -399,7 +412,7 @@ module CDDL
399
412
  when :anno
400
413
  target = where[2]
401
414
  control = where[3]
402
- case where[1]
415
+ case conop = where[1]
403
416
  when :size
404
417
  should_be_int = generate1(control)
405
418
  unless (Array === target && target[0] == :prim && [0, 2, 3].include?(target[1])) && Integer === should_be_int && should_be_int >= 0
@@ -447,9 +460,10 @@ module CDDL
447
460
  generate1(target, inmap)
448
461
  when :feature
449
462
  generate1(target, inmap)
450
- when :cat
463
+ when :cat, :det
451
464
  lhs = generate1(target, inmap)
452
465
  rhs = generate1(control)
466
+ rhs = remove_indentation(rhs) if conop == :det
453
467
  begin
454
468
  lhs + rhs
455
469
  rescue Exception => e
@@ -483,7 +497,7 @@ module CDDL
483
497
  content = Integer(content)
484
498
  case target[1]
485
499
  when 0
486
- case where[1]
500
+ case conop
487
501
  when :lt
488
502
  rand(0...content)
489
503
  when :le
@@ -510,18 +524,25 @@ module CDDL
510
524
  fail "Don't know yet how to generate #{where}"
511
525
  end
512
526
  REGEXP_FOR_STRING[regexp].random_example(max_repeater_variance: 5)
513
- when :abnf
527
+ when :abnf, :abnfb
514
528
  grammar = generate1(control)
515
- unless target == [:prim, 3] && String === grammar
529
+ bytes = true if target == [:prim, 2]
530
+ bytes = false if target == [:prim, 3]
531
+ unless !bytes.nil? && String === grammar
516
532
  fail "Don't know yet how to generate #{where}"
517
533
  end
518
- ABNF_PARSER_FOR_STRING[grammar].generate
534
+ out = ABNF_PARSER_FOR_STRING[grammar].generate
535
+ if conop == :abnfb
536
+ out = out.codepoints.pack("C*")
537
+ end
538
+ enc = bytes ? Encoding::BINARY : Encoding::UTF_8
539
+ out.force_encoding(enc)
519
540
  when :cbor, :cborseq
520
541
  unless target == [:prim, 2]
521
542
  fail "Don't know yet how to generate #{where}"
522
543
  end
523
544
  content = CBOR::encode(generate1(control))
524
- if where[1] == :cborseq
545
+ if conop == :cborseq
525
546
  # remove the first head
526
547
  n = case content.getbyte(0) - (4 << 5)
527
548
  when 0..23; 1
@@ -539,7 +560,7 @@ module CDDL
539
560
  content = generate1(target)
540
561
  if validate1(content, control)
541
562
  return content
542
- elsif where[1] == :within
563
+ elsif conop == :within
543
564
  warn "*** #{content.inspect} meets #{target.inspect} but not #{control.inspect}"
544
565
  end
545
566
  end
@@ -580,7 +601,7 @@ module CDDL
580
601
  elsif t[0] == :anno
581
602
  _, conop, target, control = t
582
603
  # warn ["EXV0", conop, target, control].inspect
583
- if conop == :cat || conop == :plus
604
+ if conop == :cat || conop == :plus || conop == :det
584
605
  ok1, v1, vt1 = extract_value(target)
585
606
  ok2, v2, vt2 = extract_value(control)
586
607
  # warn ["EXV", ok1, v1, vt1, ok2, v2, vt2].inspect
@@ -590,6 +611,7 @@ module CDDL
590
611
  elsif vt1 == Float
591
612
  [true, v1 + v2, vt1] if vt2 == Integer || vt2 == Float
592
613
  else
614
+ v2 = remove_indentation(v2) if conop == :det
593
615
  [true, v1 + v2, vt1] if vt1 == vt2
594
616
  end
595
617
  end rescue nil
@@ -634,7 +656,7 @@ module CDDL
634
656
 
635
657
  def validate_result(check)
636
658
  check || (
637
- @last_message = yield
659
+ @last_message << yield
638
660
  false
639
661
  )
640
662
  end
@@ -667,7 +689,9 @@ module CDDL
667
689
  ann.concat(ann2)
668
690
  end
669
691
  if occ < s
670
- @last_message = "occur not reached in array #{d} for #{where}"
692
+ # warn "*** lme #{@last_message.encoding} #{@last_message}"
693
+ # warn "*** #{"\noccur #{occ} < #{s}, not reached at #{i} in array #{d} for #{where}".encoding}"
694
+ @last_message << "\noccur #{occ} < #{s}, not reached at #{i} in array #{d} for #{where}"
671
695
  return [false, ann]
672
696
  end
673
697
  end
@@ -832,6 +856,7 @@ module CDDL
832
856
  # warn ["ANNO0", ok1, v1, vt1, ok2, v2, vt2, d].inspect
833
857
  if ok1 && ok2
834
858
  v2 = Integer(v2) if vt1 == Integer
859
+ v2 = remove_indentation(v2) if conop == :det
835
860
  # warn ["ANNO", ok1, v1, vt1, ok2, v2, vt2, d].inspect
836
861
  [] if d == v1 + v2 # XXX Focus ArgumentError
837
862
  end
@@ -908,17 +933,19 @@ module CDDL
908
933
  end
909
934
  end
910
935
  )
911
- when :abnf # XXX .abnf vs. .abnfb
936
+ when :abnf, :abnfb
912
937
  ann if (
913
938
  if String === d
914
939
  ok, v, vt = extract_value(control)
915
940
  if ok && vt == String
916
941
  begin
917
- ABNF_PARSER_FOR_STRING[v].validate(d)
942
+ ABNF_PARSER_FOR_STRING[v].validate(
943
+ d.dup.force_encoding(ABNF_ENCODING_FOR_CONOP[conop]).codepoints.pack("U*")
944
+ )
918
945
  true
919
946
  rescue => e
920
947
  # warn "*** #{e}" # XXX
921
- @last_message = e
948
+ @last_message = e.to_s.force_encoding(Encoding::UTF_8)
922
949
  nil
923
950
  end
924
951
  end
@@ -1278,7 +1305,8 @@ module CDDL
1278
1305
  BRACE = {"{" => :map, "[" => :array}
1279
1306
  RANGE_EXCLUDE_END = {".." => false, "..." => true}
1280
1307
  SUPPORTED_ANNOTATIONS = [:bits, :size, :regexp, :cbor, :cborseq, :within, :and,
1281
- :default, :lt, :le, :gt, :ge, :eq, :ne, :feature, :abnf, :cat, :plus]
1308
+ :default, :lt, :le, :gt, :ge, :eq, :ne,
1309
+ :feature, :abnf, :abnfb, :det, :cat, :plus]
1282
1310
 
1283
1311
  def type1(n, canbegroup = false)
1284
1312
  # puts "NVALUE #{n.value.inspect}"
@@ -0,0 +1,37 @@
1
+ start = [Tag0, Tag1004]
2
+
3
+ ; for draft-ietf-cbor-date-tag
4
+ Tag1004 = #6.1004(text .abnf full-date)
5
+ ; for RFC 7049
6
+ Tag0 = #6.0(text .abnf date-time)
7
+
8
+ full-date = "full-date" .cat rfc3339
9
+ date-time = "date-time" .cat rfc3339
10
+
11
+ ; Note the trick of idiomatically starting with a newline, separating
12
+ ; off the element in the .cat from the rule-list
13
+ rfc3339 = '
14
+ date-fullyear = 4DIGIT
15
+ date-month = 2DIGIT ; 01-12
16
+ date-mday = 2DIGIT ; 01-28, 01-29, 01-30, 01-31 based on
17
+ ; month/year
18
+ time-hour = 2DIGIT ; 00-23
19
+ time-minute = 2DIGIT ; 00-59
20
+ time-second = 2DIGIT ; 00-58, 00-59, 00-60 based on leap sec
21
+ ; rules
22
+ time-secfrac = "." 1*DIGIT
23
+ time-numoffset = ("+" / "-") time-hour ":" time-minute
24
+ time-offset = "Z" / time-numoffset
25
+
26
+ partial-time = time-hour ":" time-minute ":" time-second
27
+ [time-secfrac]
28
+ full-date = date-fullyear "-" date-month "-" date-mday
29
+ full-time = partial-time time-offset
30
+
31
+ date-time = full-date "T" full-time
32
+ ' .cat rfc5234-core
33
+
34
+ rfc5234-core = '
35
+ DIGIT = %x30-39 ; 0-9
36
+ ; abbreviated here
37
+ '
@@ -0,0 +1,32 @@
1
+ start = [tt, tb, bt, bb]
2
+
3
+
4
+ tt = text .abnf '4DIGIT 1FOO
5
+ DIGIT = %x30-39 ; 0-9
6
+ FOO = %xc0-cf
7
+ '
8
+ tb = text .abnfb '4DIGIT 1FOO
9
+ DIGIT = %x30-39 ; 0-9
10
+ FOO = %xc0-cf
11
+ '
12
+ bt = bytes .abnf '4DIGIT 1FOO
13
+ DIGIT = %x30-39 ; 0-9
14
+ FOO = %xc0-cf
15
+ '
16
+ bb = bytes .abnfb '4DIGIT 1FOO
17
+ DIGIT = %x30-39 ; 0-9
18
+ FOO = %xc0-cf
19
+ '
20
+
21
+ ; ["7408\xC6", "7073\xC3", h'30383131CD', h'32363738CD']
22
+ ; ["5892\u00ca", "2145\u00c6", h'33333338C38B', h'31343033C388']
23
+
24
+
25
+ ; ** ENCOED UTF-8
26
+ ; ** ENCOED UTF-8
27
+ ; ** ENCOED UTF-8
28
+ ; ** ENCOED UTF-8
29
+ ; ["5845\u00c6", "9329\u00cb", h'38393538C389', h'33343230C386']
30
+
31
+
32
+ ; ["1066\u00cc", "9253\xC9", h'38333533C38A', h'32373337C4']
@@ -0,0 +1,16 @@
1
+ start = [v1, v2, v3, v4]
2
+
3
+ v1 = "a" .bat "b"
4
+
5
+ v2 = "a" .bat " b"
6
+
7
+ v3 = "a" .bat '
8
+ oid = 1*arc
9
+ roid = *arc
10
+ arc = [nlsb] %x00-7f
11
+ nlsb = %x81-ff *%x80-ff
12
+ '
13
+
14
+ bbat<v1, v2> = ("" .bat v1) .bat v2
15
+
16
+ v4 = bbat<" a", " b">
@@ -0,0 +1,8 @@
1
+ oid = bytes .abnfb ("oid" .cat cbor-tags-oid)
2
+
3
+ cbor-tags-oid = '
4
+ oid = 1*arc
5
+ roid = *arc
6
+ arc = [nlsb] %x00-7f
7
+ nlsb = %x81-ff *%x80-ff
8
+ '
@@ -0,0 +1,8 @@
1
+ oid = bytes .abnfb ("oid" .bat cbor-tags-oid)
2
+
3
+ cbor-tags-oid = '
4
+ oid = 1*arc
5
+ roid = *arc
6
+ arc = [nlsb] %x00-7f
7
+ nlsb = %x81-ff *%x80-ff
8
+ '
@@ -0,0 +1,24 @@
1
+ message = text .abnfb ("message" .cat rfc4505)
2
+
3
+ rfc4505 = '
4
+ message = [ email / token ]
5
+ ;; to be prepared in accordance with Section 3
6
+
7
+ UTF1 = %x00-3F / %x41-7F ;; less "@" (U+0040)
8
+ UTF2 = %xC2-DF UTF0
9
+ UTF3 = %xE0 %xA0-BF UTF0 / %xE1-EC 2(UTF0) /
10
+ %xED %x80-9F UTF0 / %xEE-EF 2(UTF0)
11
+ UTF4 = %xF0 %x90-BF 2(UTF0) / %xF1-F3 3(UTF0) /
12
+ %xF4 %x80-8F 2(UTF0)
13
+ UTF0 = %x80-BF
14
+
15
+ TCHAR = UTF1 / UTF2 / UTF3 / UTF4
16
+ ;; any UTF-8 encoded Unicode character
17
+ ;; except "@" (U+0040)
18
+
19
+ email = "too@much.work"; for this example
20
+ ;email = addr-spec
21
+ ;; as defined in [IMAIL]
22
+
23
+ token = 1*255TCHAR
24
+ '
@@ -0,0 +1,95 @@
1
+ csr-template-schema = {
2
+ keyTypes: [ 1* $keyType ]
3
+ ? subject: distinguishedName
4
+ extensions: extensions
5
+ }
6
+
7
+ mandatory-wildcard = "**"
8
+ optional-wildcard = "*"
9
+ wildcard = mandatory-wildcard / optional-wildcard
10
+
11
+ ; regtext matches all text strings but "*" and "**"
12
+ regtext = text .regexp "([^\*].*)|([\*][^\*].*)|([\*][\*].+)"
13
+
14
+ regtext-or-wildcard = regtext / wildcard
15
+
16
+ distinguishedName = {
17
+ ? country: regtext-or-wildcard
18
+ ? stateOrProvince: regtext-or-wildcard
19
+ ? locality: regtext-or-wildcard
20
+ ? organization: regtext-or-wildcard
21
+ ? organizationalUnit: regtext-or-wildcard
22
+ ? emailAddress: regtext-or-wildcard
23
+ ? commonName: regtext-or-wildcard
24
+ }
25
+
26
+ $keyType /= rsaKeyType
27
+ $keyType /= ecdsaKeyType
28
+
29
+ rsaKeyType = {
30
+ PublicKeyType: "rsaEncryption" ; OID: 1.2.840.113549.1.1.1
31
+ PublicKeyLength: rsaKeySize
32
+ SignatureType: $rsaSignatureType
33
+ }
34
+
35
+ rsaKeySize = int .ge 2048
36
+
37
+ ; RSASSA-PKCS1-v1_5 with SHA-256
38
+ $rsaSignatureType /= "sha256WithRSAEncryption"
39
+ ; RSASSA-PCKS1-v1_5 with SHA-384
40
+ $rsaSignatureType /= "sha384WithRSAEncryption"
41
+ ; RSASSA-PCKS1-v1_5 with SHA-512
42
+ $rsaSignatureType /= "sha512WithRSAEncryption"
43
+ ; RSASSA-PSS with SHA-256, MGF-1 with SHA-256, and a 32 byte salt
44
+ $rsaSignatureType /= "sha256WithRSAandMGF1"
45
+ ; RSASSA-PSS with SHA-384, MGF-1 with SHA-384, and a 48 byte salt
46
+ $rsaSignatureType /= "sha384WithRSAandMGF1"
47
+ ; RSASSA-PSS with SHA-512, MGF-1 with SHA-512, and a 64 byte salt
48
+ $rsaSignatureType /= "sha512WithRSAandMGF1"
49
+
50
+ ecdsaKeyType = {
51
+ PublicKeyType: "id-ecPublicKey" ; OID: 1.2.840.10045.2.1
52
+ namedCurve: $ecdsaCurve
53
+ SignatureType: $ecdsaSignatureType
54
+ }
55
+
56
+ $ecdsaCurve /= "secp256r1" ; OID: 1.2.840.10045.3.1.7
57
+ $ecdsaCurve /= "secp384r1" ; OID: 1.3.132.0.34
58
+ $ecdsaCurve /= "secp521r1" ; OID: 1.3.132.0.3
59
+
60
+ $ecdsaSignatureType /= "ecdsa-with-SHA256" ; paired with secp256r1
61
+ $ecdsaSignatureType /= "ecdsa-with-SHA384" ; paired with secp384r1
62
+ $ecdsaSignatureType /= "ecdsa-with-SHA512" ; paired with secp521r1
63
+
64
+ subjectaltname = {
65
+ ? DNS: [ 1* regtext-or-wildcard ]
66
+ ? Email: [ 1* regtext ]
67
+ ? URI: [ 1* regtext ]
68
+ * $$subjectaltname-extension
69
+ }
70
+
71
+ extensions = {
72
+ ? keyUsage: [ 1* keyUsageType ]
73
+ ? extendedKeyUsage: [ 1* extendedKeyUsageType ]
74
+ subjectAltName: subjectaltname
75
+ }
76
+
77
+ keyUsageType /= "digitalSignature"
78
+ keyUsageType /= "nonRepudiation"
79
+ keyUsageType /= "keyEncipherment"
80
+ keyUsageType /= "dataEncipherment"
81
+ keyUsageType /= "keyAgreement"
82
+ keyUsageType /= "keyCertSign"
83
+ keyUsageType /= "cRLSign"
84
+ keyUsageType /= "encipherOnly"
85
+ keyUsageType /= "decipherOnly"
86
+
87
+ extendedKeyUsageType /= "serverAuth"
88
+ extendedKeyUsageType /= "clientAuth"
89
+ extendedKeyUsageType /= "codeSigning"
90
+ extendedKeyUsageType /= "emailProtection"
91
+ extendedKeyUsageType /= "timeStamping"
92
+ extendedKeyUsageType /= "OCSPSigning"
93
+ extendedKeyUsageType /= oid
94
+
95
+ oid = text .regexp "[0-9]+(\\.[0-9]+)*"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cddl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.17
4
+ version: 0.8.22
5
5
  platform: ruby
6
6
  authors:
7
7
  - Carsten Bormann
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-25 00:00:00.000000000 Z
11
+ date: 2021-03-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cbor-diag
@@ -115,10 +115,13 @@ files:
115
115
  - test-data/a.cddl
116
116
  - test-data/abignum.cddl
117
117
  - test-data/abnf1.cddl
118
+ - test-data/abnf2.cddl
119
+ - test-data/abnf3.cddl
118
120
  - test-data/ambig.cddl
119
121
  - test-data/b.cddl
120
122
  - test-data/badaddr.cddl
121
123
  - test-data/basic_syntax_example.cddl
124
+ - test-data/bat.cddl
122
125
  - test-data/bpv7.cddl
123
126
  - test-data/bpv7a.cddl
124
127
  - test-data/bpv7b.cddl
@@ -164,8 +167,11 @@ files:
164
167
  - test-data/mon-val.cddl
165
168
  - test-data/multipart-ct.cddl
166
169
  - test-data/named-group.cddl
170
+ - test-data/oid.cddl
171
+ - test-data/oidbat.cddl
167
172
  - test-data/patch1.cddl
168
173
  - test-data/reused_named_group.cddl
174
+ - test-data/sasl.cddl
169
175
  - test-data/sequence.cddl
170
176
  - test-data/structure.cddl
171
177
  - test-data/test-gen.cddl
@@ -177,6 +183,7 @@ files:
177
183
  - test-data/wrong2.cddl
178
184
  - test-data/wrong2a.cddl
179
185
  - test-data/xmlmig.cddl
186
+ - test-data/yaron1.cddl
180
187
  - test/test-cddl.rb
181
188
  homepage: http://github.com/cabo/cddl
182
189
  licenses: