4. 表示语言
本协议使用与 RFC 2246 [TLS1.0] 中定义的相同的表示语言来表示。本备忘录对前述表示语言进行了一些修改。我们将在本节中描述这些变化。
4.1. 基本块大小
本节介绍 TLS 协议使用的基本块大小。所有数据项都是显式对齐的。以下基本块大小(以位为单位)用于本协议:
| 类型 | 大小 |
|---|---|
| uint8 | 8 位 |
| uint16 | 16 位 |
| uint24 | 24 位 |
| uint32 | 32 位 |
| uint64 | 64 位 |
在本协议中,数字类型以"网络字节顺序"存储,即,作为大端字节序的 8 位字节序列。例如,uint16 数字 37(十进制)被存储为两个 8 位字节:0x00 0x25。uint32 数字 11(十进制)被存储为四个 8 位字节:0x00 0x00 0x00 0x0B。
注意,在计算机系统中,uint64 类型在 IEEE 754 中用于表示浮点数。TLS 协议不使用浮点数,因此 uint64 类型仅用于存储整数。
4.2. 向量(MBS 变体)
向量是由同一类型的元素组成的有序列表。向量的两个属性是长度和元素的内容。在 TLS 中,向量可能具有不同的长度;一些向量在握手期间具有固定长度,而另一些向量则具有可变长度。
TLS 协议定义了三种类型的向量:
- 定长向量:其长度在编译时已知。
- 变长向量:其长度在运行时确定,由显式长度字段指定。
- 不透明向量:其元素是未指定类型的不透明字节。
变长向量的语法表示为:
T T'<n..m>;
这表示向量 T 的长度在 n 到 m 之间(含)。变长向量的长度由明确指出其长度的字段指定。实际长度字段消耗与向量最大可能长度必要的位数相同的位数。变长向量以显式长度字段开始,该字段指定紧接着的向量元素所消耗的 8 位字节数。
opaque D<1..2^16-1>;
在此示例中,D 向量包含 1 到 2^16-1 个不透明字节。D 向量的长度字段占用 2 个 8 位字节。实际长度字段为 0 的变长向量可以出现,并且它的解释如同其长度为 0。
注意:变长向量在以下情况下不携带长度字段:向量的长度在编译时已知,或者由其他字段(例如,握手消息中的长度字段)隐含指定。
4.3. 数字(MBS 变体)
TLS 协议使用固定精度的数字。所有数字都用固定的位数表示,与底层计算机体系结构无关。这使得数字可以跨不同体系结构进行一致传输和解释。
本协议中使用了以下数字类型:
- uint8:8 位无符号整数
- uint16:16 位无符号整数
- uint24:24 位无符号整数
- uint32:32 位无符号整数
- uint64:64 位无符号整数
所有数字都采用网络字节顺序(大端字节序)进行传输。
4.4. 枚举(MBS 变体)
枚举类型是一种定义一组命名值的数据类型。枚举值由标识符表示,并由实现分配一个数值。
enum { e1(v1), e2(v2), ... , en(vn), (n) } Te;
在此示例中,Te 是一个枚举类型,其值 e1 到 en 分别分配数值 v1 到 vn。括号中的最终值 (n) 指定枚举的大小。
枚举可以包含保留值,用于未来扩展。这些保留值用 _RESERVED 后缀表示,并且不得由符合规范的实现发送或接收。
4.5. 构造类型
TLS 协议使用构造类型来定义更复杂的数据结构。构造类型是从基本类型或其他构造类型构建的。
4.5.1. 构造类型(变体)
变体类型允许通过选择(select)机制在同一内存位置表示不同类型的数据。选择的判别式通常是枚举类型。
struct {
T1 f1;
T2 f2;
....
Tn fn;
select (E) {
case e1: Te1;
case e2: Te2;
....
case en: Ten;
} [[data]];
} T;
在此示例中,T 是一个构造类型,其字段为 f1 到 fn,后跟由枚举 E 的值选择的一个变体字段。
4.5.2. 构造体
构造体是一种聚合多个字段的数据类型。每个字段具有名称和类型。构造体中的字段按照它们定义的顺序传输。
struct {
T1 f1;
T2 f2;
...
Tn fn;
} T;
4.5.3. 常量
常量用于定义具有特定值的数据项。它们通常用于表示协议版本、内容类型或固定值。
const uint8 one = 1;
4.5.4. 变体类型
变体类型(见第 4.5.1 节)允许根据判别式的值表示不同的数据结构。
4.5.5. 尾随数据
某些结构可能在其定义字段之后包含尾随数据。这些数据通常是不透明字节,其含义由上下文决定。
4.6. 密码学属性
TLS 协议定义了多种具有密码学意义的数据类型。这些数据类型用于指定密钥、初始化向量(IV)、随机数和其他密码学参数。
opaque client_random[32];
opaque server_random[32];
opaque session_id<0..32>;
这些数据项在握手和记录协议中使用,用于建立和维护安全连接。
注意:在 TLS 1.2 中,PRF 和 MAC 计算使用 SHA-256 作为默认哈希函数,而在早期版本中默认使用 MD5 和 SHA-1 的组合。