#json #validate-json #cbor #cddl #data-structures

cddl-cat

解析CDDL模式并验证CBOR或JSON序列化数据

13个版本

0.6.2 2023年10月1日
0.6.1 2022年3月10日
0.5.0 2021年10月15日
0.4.0 2020年12月24日
0.3.2 2020年5月7日

#214 in 编码

Download history 2562/week @ 2024-04-08 2625/week @ 2024-04-15 2737/week @ 2024-04-22 3300/week @ 2024-04-29 2686/week @ 2024-05-06 1936/week @ 2024-05-13 1944/week @ 2024-05-20 2295/week @ 2024-05-27 1733/week @ 2024-06-03 2073/week @ 2024-06-10 2396/week @ 2024-06-17 3109/week @ 2024-06-24 2781/week @ 2024-07-01 2857/week @ 2024-07-08 1977/week @ 2024-07-15 1800/week @ 2024-07-22

9,798 每月下载量
4 个crate中使用了 (3 直接)

MIT 协议

175KB
3.5K SLoC

cddl-cat 是一个库,用于验证编码数据与描述数据预期结构的CDDL文档。

CDDL是一个由 RFC8610 描述的文本文档,用于描述数据结构。CDDL不依赖于任何特定的序列化或编码方法;它可以用于验证CBOR或JSON格式的数据。

此库的目标是使CBOR或JSON数据轻松地与CDDL模式描述进行验证。

cddl-cat 支持 Rust 1.48 及以上版本。

实现细节

  • 支持CBOR和JSON编码,由 serde_cborserde_json 功能控制。

  • 从CDDL AST构建一个“中间验证树” (ivt);这去除了部分CDDL语法细节,结果是一个可以更容易验证的简化树。IVT几乎完全由 Node 元素组成,允许递归验证。

  • 通过首先将传入的数据转换为通用形式,执行验证,因此大多数验证代码对序列化格式完全无感知。

  • 验证代码使用一个 LookupContext 对象来执行所有规则查找。这将允许堆叠CDDL文档或构建其他CDDL模式可使用的CDDL库。将来,可以通过更改 LookupContext 配置来自定义验证过程。

  • 全面测试(90%+覆盖率)。

示例

此示例验证JSON编码数据与CDDL模式

use cddl_cat::validate_json_str;

let cddl_input = "person = {name: tstr, age: int}";
let json_str = r#"{ "name": "Bob", "age": 43 }"#;

validate_json_str("person", cddl_input, &json_str).unwrap();

如果JSON数据没有预期的结构,将产生错误

use cddl_cat::validate_json_str;

let cddl_input = "person = {name: tstr, age: int}";
let json_str = r#"{ "name": "Bob", "age": "forty three" }"#;

assert!(validate_json_str("person", cddl_input, &json_str).is_err());

类似的示例,验证CBOR编码数据与CDDL模式

use cddl_cat::validate_cbor_bytes;
use serde::Serialize;

#[derive(Serialize)]
struct PersonStruct {
    name: String,
    age: u32,
}

let input = PersonStruct {
    name: "Bob".to_string(),
    age: 43,
};
let cbor_bytes = serde_cbor::to_vec(&input).unwrap();
let cddl_input = "person = {name: tstr, age: int}";
validate_cbor_bytes("person", cddl_input, &cbor_bytes).unwrap();

支持的预定义类型

  • any, uint, nint, int, bstr, bytes, tstr, text
  • floatfloat16float32float64float16-32float32-64
    注意:float的大小未进行验证。

支持CDDL功能

  • 基本预置类型(整数、浮点数、布尔值、nil、文本字符串、字节字符串)
  • 字面量int、float、bool、UTF-8文本字符串
  • UTF-8、十六进制或base64的字节字符串
  • 数组和映射
  • 按名称进行规则查找
  • 选择(使用///语法)
  • 出现次数(?*+m*n
  • 范围(例如1..71...8
  • 解包(~
  • 将组转换为选择(&
  • 使用裁剪语法(^ =>)的映射键
  • 泛型类型
  • 控制运算符.cbor.size.regexp

未实现的CDDL功能

  • 使用/=扩展类型
  • 使用//=扩展组
  • 使用$的类型插座
  • 使用$$的组插座
  • 除上述之外的其它控制运算符(例如.bits.lt.gt等)
  • 使用&的组枚举
  • 使用#的标记数据
  • 十六进制浮点字面量(例如0x1.921fb5p+1
  • 调用CBOR标记的预置类型(例如tdatebiguint

依赖项

~5-7MB
~126K SLoC