跳到主要内容

4. 表示语言 (Presentation Language)

本文档处理数据外部表示的格式. 这里使用一种非常基础且相对宽松定义的表示语法. 该语法在形式上类似 C, 在语法和意图上也类似 XDR [XDR], 但它的目的仅是记录 TLS, 不具有超出该目标的一般用途.

4.1. 基本块大小 (Basic Block Size)

所有数据项的表示都被显式规定. 基本数据块大小为一个 byte, 即 8 bit. 多 byte 数据项按从左到右, 从上到下的顺序串接 byte. 从 byte stream 中形成多 byte 项时, 例如一个数字, 使用类似 C 的记法:

value = (byte[0] << 8*(n-1)) | (byte[1] << 8*(n-2)) |
... | byte[n-1];

这种多 byte 值的 byte ordering 是常见 network byte order, 即 big-endian format.

4.2. 杂项 (Miscellaneous)

comment 以 /* 开始, 以 */ 结束. optional component 用双中括号 [[ ]] 包围表示. 包含未解释数据的 single-byte entity 类型为 opaque.

4.3. 向量 (Vectors)

vector (一维数组) 是同质数据元素流. vector 大小可以在文档编写时指定, 也可以留到运行时指定. 无论哪种情况, length 声明的是 vector 中的 byte 数, 不是元素数.

固定长度 vector 类型 T' 的语法如下:

T T'[n];

variable-length vector 使用 <floor..ceiling> 记法指定合法 length 范围, 包含端点. 编码时, 实际 length 位于 vector 内容之前.

T T'<floor..ceiling>;

例如:

opaque mandatory<300..400>;
/* length field is 2 bytes, cannot be empty */
uint16 longer<0..800>;
/* zero to 400 16-bit unsigned integers */

4.4. 数字 (Numbers)

基本 numeric data type 是 unsigned byte (uint8). 所有更大的 numeric data type 都由固定长度 byte 序列按第 4.1 节描述串接形成, 并且也是 unsigned.

uint8 uint16[2];
uint8 uint24[3];
uint8 uint32[4];
uint8 uint64[8];

所有值均以 network byte (big-endian) order 存储. 十六进制 byte 01 02 03 04 表示的 uint32 等价于十进制 16909060.

某些情况下, 如 DH parameter, 需要将 integer 表示为 opaque vector. 此时它们表示为 unsigned integer, 不要求 leading zero octet, 即使最高有效 bit 已设置.

4.5. 枚举 (Enumerateds)

额外的稀疏数据类型称为 enum. enum 类型字段只能取定义中声明的值. 每个定义都是不同类型. 只有同一类型的 enumerated 才能赋值或比较. 每个 enumerated 元素都必须分配一个值.

enum { e1(v1), e2(v2), ... , en(vn) [[, (n)]] } Te;

enumerated 在 byte stream 中占用的空间与其最大已定义 ordinal value 所需空间相同.

enum { red(3), blue(5), white(7) } Color;
enum { sweet(1), sour(2), bitter(4), (32000) } Taste;

enumeration 元素名称作用域限定在所定义类型内. 如果赋值目标明确, 可以不使用完整限定名.

Color color = Color.blue;     /* overspecified, legal */
Color color = blue; /* correct, type implicit */

4.6. 构造类型 (Constructed Types)

structure type 可由 primitive type 构造以便使用. 每个 specification 都声明新的唯一类型. 定义语法类似 C.

struct {
T1 f1;
T2 f2;
...
Tn fn;
} [[T]];

structure 内的 field 可以使用 type name 限定, 语法类似 enumerated. structure definition 也可以嵌套.

4.6.1. 变体 (Variants)

已定义 structure 可以基于环境中的可用信息具有 variant. selector 必须是定义该 structure 可能 variant 的 enumerated type. select 中声明的每个 enumeration 元素都必须有一个 case arm. case arm 有有限 fall-through: 如果两个 case arm 紧邻且中间没有 field, 则它们包含相同 field.

4.7. 密码学属性 (Cryptographic Attributes)

五种 cryptographic operation 分别是 digital signing, stream cipher encryption, block cipher encryption, authenticated encryption with additional data (AEAD), public key encryption, 对应指定为 digitally-signed, stream-ciphered, block-ciphered, aead-ciphered, public-key-encrypted.

digitally-signed element 编码为 DigitallySigned 结构:

struct {
SignatureAndHashAlgorithm algorithm;
opaque signature`<0..2^16-1>`;
} DigitallySigned;

algorithm 字段指定使用的 algorithm. signature 是对元素内容使用这些 algorithm 生成的 digital signature. 内容本身不出现在 wire 上, 而只是用于计算. signature length 由 signing algorithm 和 key 指定.

RSA signing 使用 [PKCS1] 定义的 RSASSA-PKCS1-v1_5 signature scheme. DSA 则对 SHA-1 hash 的 20 byte 直接执行 Digital Signing Algorithm 并生成 r 和 s.

当前术语中, DSA 指 Digital Signature Algorithm, DSS 指 NIST standard. 原始 SSL 和 TLS 规范中普遍使用 "DSS". 本文档使用 "DSA" 指算法, 使用 "DSS" 指标准, 并在 code point definition 中为历史连续性保留 "DSS".

stream cipher encryption 将 plaintext 与密码学安全 keyed pseudorandom number generator 生成的同等长度输出做 exclusive-OR. block cipher encryption 中, 每个 plaintext block 加密为一个 ciphertext block. TLS 1.2 中 block cipher encryption 使用 CBC mode. AEAD encryption 同时加密并提供完整性保护. public key encryption 使用 public key algorithm 加密数据, 使其只能用匹配的 private key 解密.

4.8. 常量 (Constants)

typed constant 可以通过声明期望类型的 symbol 并赋值来定义. underspecified type, 如 opaque, variable-length vector, 以及包含 opaque 的 structure, 不能被赋值. multi-element structure 或 vector 的字段不能被省略.