Протокол SSL/TLS
Протокол Записи
Протокол Записи состоит из нескольких уровней. Протокол Записи фрагментирует сообщение на блоки нужной длины, осуществляет сжатие данных, вычисляет НМАС и зашифровывает их. На другом конце соединения полученные данные расшифровываются, проверяется их целостность, далее они декомпрессируются, дефрагментируются и передаются протоко-лам более высокого уровня.
Выше протокола Записи могут располагаться следующие протоколы: протокол Рукопожатия, Аlert-протокол, протокол изменения шифрования и прикладной протокол, безопасность которого обеспечивается.
Состояния соединения
В протоколе вводится понятие состояния соединения, которое определяет параметры выполнения протокола Записи. Такими параметрами являются алгоритм сжатия, алгоритм шифрования и МАС-алгоритм, а также параметры этих алгоритмов, т.е. секреты МАС, ключи алгоритма шифрования и инициализационные вектора. Для каждого направления (соответственно чтение или запись) параметры соединения могут различаться. Существует четыре состояния соединения: текущие состояния чтения и записи и ожидаемые состояния чтения и записи. Параметры безопасности для ожидаемых состояний устанавливаются протоколом Рукопожатия, а протокол изменения шифрования делает ожидаемое состояние текущим, в результате чего соответствующие параметры текущего состояния сбрасываются и заменяются параметрами ожидаемого состояния. Параметры ожидаемого состояния инициализируется пустыми значениями. Вначале текущее состояние всегда определяется без использования шифрования, сжатия и МАС.
Определены следующие параметры состояния:
Конец соединения | Каждый участник является либо "клиентом", либо "сервером" |
Алгоритм симметричного шифрования | Алгоритм, используемый для симметричного шифрования, и его параметры – длина ключа алгоритма, длина блока алгоритма, ключ шифрования, инициализационный вектор (IV) и др. |
МАС алгоритм | Алгоритм, используемый для проверки целостности сообщения, секрет МАС. |
Алгоритм сжатия | Алгоритм, используемый для сжатия данных. |
Мастер-секрет | 48-байтный секрет, разделяемый обоими участниками соединения. |
Случайное число клиента SecurityParameters.client_random | 32-байтное значение, создаваемое клиентом в протоколе Рукопожатия. |
Случайное число сервера SecurityParameters.server_random | 32-байтное значение, создаваемое сервером в протоколе Рукопожатия. |
Последовательный номер | Каждое состояние соединения содержит последовательный номер, который вычисляется независимо для состояний чтения и записи. Последовательный номер должен устанавливаться в ноль при инициализации состояния. Последовательные номера не могут быть больше 264 - 1. Последовательный номер возрастает после создания очередной записи. |
Из мастер-секрета создаются шесть ключей:
- client write MAC secret
- server write MAC secret
- client write key
- server write key
- client write IV
- server write IV
Ключи client write используются сервером, когда он получает сообщения и клиентом, когда тот посылает их. Ключи server write используются сервером, когда он посылает сообщения и клиентом, когда он получает их. После того как параметры безопасности установлены и ключи созданы, ожидаемые состояния соединения делаются текущими.
Вычисление ключей
Протокол Записи использует следующий алгоритм для создания ключей, инициализационных векторов и секретов МАС из параметров безопасности, создаваемых протоколом Рукопожатия.
НМАС и псевдослучайная функция
Для обеспечения целостности используется НМАС с хэш-функциями MD5 и SHA-1, обозначаемыми как HMAC_MD5 (secret,data) и HMAC_SHA (secret, data).
В алгоритме определена псевдослучайная функция PRF, которая расширяет секрет до нужной длины для создания всех необходимых ключей. Эта функция получает в качестве входа секрет, "зерно" (seed - значение, которое с одной стороны является случайным, а с другой стороны не явля-ется секретным, т.е. может стать известно оппоненту) и стандартное значение, и создает выход требуемой длины.
Сначала определяется функция расширения данных P_hash (secret, data), которая использует хэш-функцию для расширения секрета до нужной длины следующим образом:
P_hash (secret, seed) = HMAC_hash (secret, A(1) || seed) || HMAC_hash (secret, A(2) || seed) || HMAC_hash (secret, A(3) || seed) ||
А (i) определяется следующим образом:
А (0) = seed A (i) = HMAC_hash (secret, A (i - 1))
P_hash может иметь столько итераций, сколько необходимо для создания данных требуемой длины. Например, если P_SHA-1 используется для создания 64 байтов данных, то количество итераций должно быть равно 4, при этом будет создано 80 байтов данных; последние 16 байтов заключительной итерации будут отброшены, чтобы оставить только 64 байта выходных данных.
Для получения ключевого материала нужной длины секрет, вычисленный в протоколе Рукопожатия, делится на две половины, одна половина используется для создания данных с помощью P_MD5, а другая - для созда-ния данных с помощью P_SHA-1.
PRF определяется как результат сложения по модулю 2 результатов выполнения P_MD5 и P_SHA-1.
PRF (secret, label, seed) = P_MD5 (S1, label + seed) ⊕ P_SHA-1 (S2, label + seed)
Label является фиксированной текстовой строкой.
Заметим, что поскольку MD5 создает 16-байтные значения, а SHA-1 создает 20-байтные значения, то количество итераций каждой из функций будет разным. Например, для создания 80-байтного значения необходимо выполнить 5 итераций P_MD5 и 4 итерации P_SHA-1.
Для создания ключей вычисляется следующее значение:
key_block = PRF (SecurityParameters.master_secret, "key expansion", SecurityParameters.server_random + SecurityParame-ters.client_random)
Количество итерация в PRF определяется суммарной длиной ключей. Затем key_block разбивается на блоки для получения требуемых ключей.