6.1. Состояния соединений
Состояние соединения TLS является операционной средой протокола записей TLS. Оно специфицирует алгоритмы сжатия, шифрования и MAC. Кроме того, известны параметры этих алгоритмов: секретный код MAC, а также ключи шифрования и IV соединения для направлений чтения и записи. Логически существует четыре состояния соединения: текущие состояния чтения и записи, и отложенные состояния чтения и записи. Все записи обрабатываются в текущих состояниях чтения или записи. Параметры безопасности для отложенных состояний могут быть установлены протоколом диалога TLS. Протокол диалога может селективно переводить любое отложенное состояние в текущее, при этом соответствующее текущее состояние становится отложенным. Не допускается формировать состояние, которое не инициализировано с учетом параметров безопасности текущего состояния. Исходное текущее состояние всегда специфицировано без компрессии, шифрования или MAC. Параметры безопасности для состояния чтения и записи соединения TLS задаются путем определения следующих величин:
Конец соединения | Клиент или сервер участник соединения |
Алгоритм массового шифрования | Алгоритм, используемый для массового шифрования. Эта спецификация включает размер ключа алгоритма, степень секретности ключа, является ли этот шифр блочным или поточным, размер блока и является ли шифр экспортным. |
Алгоритм MAC | Алгоритм аутентификации сообщений. Эта спецификация включает размер хэша, который возвращается алгоритмом MAC. |
Алгоритм сжатия | Алгоритм сжатия данных. Эта спецификация должна включать всю информацию, необходимую для выполнения компрессии. |
Секретный код сервера (master secret) | 48 байтовый секретный код, общий для обоих партеров в соединении. |
Случайный код клиента | 32 байтный код, предоставляемый клиентом. |
Случайный код сервера | 32 байтный код, предоставляемый сервером. |
Эти параметры определены в языке представления в виде:
enum { server, client } ConnectionEnd; enum { null, rc4, rc2, des, 3des, des40 } BulkCipherAlgorithm; enum { stream, block } CipherType; enum { true, false } IsExportable; enum { null, md5, sha } MACAlgorithm; enum { null(0), (255) } CompressionMethod; /* Алгоритмы, специфицированные в CompressionMethod, BulkCipherAlgorithm и MACAlgorithm могут быть добавлены. */ struct { ConnectionEnd entity; BulkCipherAlgorithm bulk_cipher_algorithm; CipherType cipher_type; uint8 key_size; uint8 key_material_length; IsExportable is_exportable; MACAlgorithm mac_algorithm; uint8 hash_size; CompressionMethod compression_algorithm; opaque master_secret[48]; opaque client_random[32]; opaque server_random[32]; } SecurityParameters;
Уровень записей будет использовать параметры безопасности для формирования следующих шести объектов:
- Секретный код MAC записи клиента
- Секретный код MAC записи сервера
- Ключ записи клиента
- Ключ записи сервера
- IV записи клиента (только для блочного шифра)
- IV записи сервера (только для блочного шифра)
Параметры записи клиента используются сервером при получении и обработке записей и наоборот. Алгоритм, использованный для генерирования этих объектов с помощью параметров безопасности, описан в разделе 6.3. Раз параметры безопасности определены и ключи сформированы, состояния соединения могут быть в любой момент реализованы путем перевода их в текущее состояние. Эти текущие состояния должны актуализоваться после обработки каждой записи. Каждое состояние соединения включает в себя следующие элементы:
- Состояние сжатия
- Текущее состояние алгоритма сжатия.
- Состояние шифра
- Текущее состояние алгоритма шифрования. Оно состоит из текущего ключа для данного соединения. Кроме того, для блочного шифра, работающего в режиме CBC (единственный режим, специфицированный в TLS), оно в исходный момент содержит IV для данного состояния соединения и должно актуализоваться, чтобы содержать текст последнего шифрованного или дешифрованного блока. Для поточных шифров, оно содержит всю необходимую информацию для продолжения шифрования или дешифрования данных.
- Секретный код MAC
- Секретный код MAC для данного соединения.
- Номер по порядку
- Каждое состояние соединения содержит номер по порядку, который поддерживается независимо для состояний чтения и записи. Номер по порядку должен быть установлен равным нулю, как только соединение переведено в активное состояние. Номера по порядку имеют тип uint64 и не может превышать 2^64-1. Номер по порядку инкрементируется после прихода каждой записи: в частности, первая запись, передаваемая через некоторое соединение, имеет порядковый номер 0.