跳到主要内容

4. 表示语言

本协议使用与 RFC 2246 [TLS1.0] 中定义的相同的表示语言来表示。本备忘录对前述表示语言进行了一些修改。我们将在本节中描述这些变化。

4.1. 基本块大小​

本节介绍 TLS 协议使用的基本块大小。所有数据项都是显式对齐的。以下基本块大小(以位为单位)用于本协议:

类型大小
uint88 位
uint1616 位
uint2424 位
uint3232 位
uint6464 位

在本协议中,数字类型以"网络字节顺序"存储,即,作为大端字节序的 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 的组合。