#data #networking #protocols #format #byte-string #text-based

nettext

基于文本的加密网络协议数据格式

12个版本

0.4.1 2023年11月15日
0.4.0 2023年11月15日
0.3.3 2022年12月15日
0.2.3 2022年11月23日
0.1.1 2022年11月18日

#935 in 密码学

每月21次下载

AGPL-3.0

91KB
2K SLoC

NetText

基于文本的加密网络协议数据格式。

原理

  • 仅使用ASCII字符的一个有限子集
  • 具有一组基本的数据类型
  • 保留复杂数据结构的原始表示,用于哈希和加密签名
  • 最小值数据类型:一种只能用于表示标识符、数字和base64编码的字节字符串的字符串类型。

基本类型

一个术语可以是以下任何一种类型

  • 一个字符串,可能只包含ASCII字母数字字符和有限的ASCII字符子集,这些字符可能不用于表示其他类型的术语
  • 一个字典,将字符串(如上所述)映射到任何术语类型
  • 一个列表,可以包含任何数量和类型的术语(可以是混合的)
  • 一个序列,由上述至少两个组成(可以是混合的),仅由空格简单分隔;序列不能嵌套

字典表示如下

{
    key1 = value1;
    key2 = value2
}

列表表示如下

[ term1; term2 ]

序列表示如下

term1 term2 term3

因此,可以按照以下方式定义复杂的数据结构

SEND MESSAGE {
    topic = blah;
    to = [
        TOPIC hello;
        USER john
    ],
    body = blah blah
}

解析后的字典或序列的原始表示被保留用于哈希目的。它在字节的序列中,在编码的字符串中,从两端裁剪了空格,代表编码的字典或序列。

在上面的复杂结构示例中,以下是序列和字典及其原始表示

  • 顶级术语是一个序列,其原始表示是整个编码字符串(假设没有开头或结尾的空格)
  • 序列的第三个术语是一个字典,其原始表示从 { 开始,到 } 结束
  • 字典的第二个映射是一个列表,其原始表示从 [ 开始,到 ] 结束
  • 字典的第三个映射是一个序列,其原始表示正好是 blah blah

由于字符串不能包含空格,因此它们总是与其原始表示等价。

结构映射

术语可以根据上下文以多种不同的方式解释

  • RAW:术语被解释为其原始编码(见上述内容)
  • STRING:如果术语是一个字符串或仅由字符串组成的序列,则术语被解释为其原始编码
  • 版本:如果该术语是一个以字符串为第一个元素的序列,则将其解释为具有以下属性的版本
    • 一个判别器(第一个元素)
    • 一个值,如果只有两个项目,则为第二个项目,如果有超过两个项目,则为从第二个项目开始的序列
  • 字典:如果术语是字典,则将其解释为字典
  • 列表:如果术语是列表,则将其解释为列表
  • 序列:如果术语是字符串、列表或字典,则将其解释为由该单个术语组成的序列。否则,术语是一个序列,将其解释为术语序列。

数据映射

术语还根据不同的数据类型进行映射

  • INT:如果术语映射为字符串,则将其解码为十进制表示的整数
  • BYTES:如果术语映射为字符串,则使用base64解码。由于字符串不能为空,字符串-用于表示空字节字符串。
  • 加密数据类型(见下文)

加密数据类型

如密钥、哈希、签名等加密值以字符串编码,前缀表示所使用的算法,后跟":",然后是base64编码的值。

前缀如下

  • pk.box: NaCl box API的公钥
  • sk.box: NaCl box API的私钥
  • sk.sbox: NaCl secretbox API的私钥
  • h.sha256: sha256 哈希
  • h.sha512: sha512 哈希
  • h.sha3: sha3 哈希
  • h.b2: blake2b 哈希
  • h.b3: blake3 哈希
  • sig.ed25519: ed25519 签名
  • pk.ed25519: ed25519 公共签名密钥
  • sk.ed25519: ed25519 私有签名密钥

还可以添加更多。

  • HASH、PUBKEY、SECKEY、SIGNATURE、ENCKEY、DECKEY、SYMKEY:将BYTES解释为特定加密项的一组事物

依赖项

~5–6.5MB
~137K SLoC