Каталог

ПРОТОКОЛ ОТКРЫТОГО РАСПРЕДЕЛЕНИЯ КЛЮЧЕЙ ZRTP (Z REAL-TIME TRANSPORT PROTOCOL) Протокол ZRTP
Протокол распределения ключей Протокол открытого распределения ключей

 

Постановка задачи

Пусть A (Alice) и B (Bob) - пользователи открытой сети связи. A и B хотят получить общий секретный ключ, используя открытый канал связи, для шифрования дальнейшего обмена с помощью алгоритмов симметричного шифрования.

Описание протокола

Данное описание протокола не является завершенным, находится в процессе обработки.

 

Протокол ZRTP — криптографический протокол согласования ключей шифрования, используемый в системах передачи голоса по IP-сетям (VoIP). ZRTP описывает метод получения ключей по алгоритму Диффи — Хеллмана для организации Secure Real-time Transport Protocol (SRTP). ZRTP осуществляет согласование ключей в том же потоке RTP, по которому установлена аудио/видео связь, то есть не требует отдельного канала связи. Разработан Филипом Циммерманом (Phil Zimmermann, автор Pretty Good Privacy), Джоном Калласом (Jon Callas) и Аланом Джонстоном (Alan Johnston) в 2006 году. Описание протокола было подано в IETF 5-го марта 2006. 

Режим Диффи-Хеллмана.

Выполнение протокола ZRTP начинается после того, как пользователи $ A$ и $ B$ успешно выполнили протокол сигнализации (например, SIP) и готовы обмениваться медиа-информацией. После успешного выполнения протокола ZRTP начинается передача медиа-трафика по протоколу SRTP с использованием ключевого материала, полученного в результате работы протокола ZRTP.

1) Пользователь $ A$ отправляет пользователю $ B$ сообщение Hello. Сообщение Hello может быть повторно отправлено 20 раз, используя таймер Т1. При этом начальное значение Т1, равное 50 мс, при повторных передачах удваивается, пока не достигнет 200 мс. Таким образом, максимальное время для успешного отправления сообщения Hello, без учета времени формирования, переноса и обработки сообщения, будет составлять 50+100+18*200 (мс) = 3,75 с. Повторная передача сообщения Hello прекращается, только если принято ответное сообщение HelloACK или сообщение Commit. 

Сообщение Hello состоит из следующих 32-битных (4-байтовых) слов: 

Заголовок сообщения:

1. 0x1000 $ vertvert$ порядковый номер (Sequence Number, 16 бит) (1 слово)

Порядковый номер является счетчиком, который увеличивается для каждого отправленного сообщения (ZRTP-пакета).

2. 0x5a525450 (ZRTP Magic Cookie, в ASCII соответствует слову "ZRTP") (1 слово)

3. Идентификатор источника (Source Identifier) (1 слово)

Идентификатор источника является 32-битным числовым SSRC-идентификатором источника потока RTP-пакетов, к которому относится сообщение (ZRTP-пакет).

Сообщение:

4. 0x505a (preamble value, преамбула) $ vertvert$ длина сообщения (16 бит) (1 слово)

Длина сообщения является количеством 32-битных слов в сообщении, исключая заголовок (слова 1-3) и контрольную сумму CRC в конце сообщения.

5. 0x48656c6c6f202020 (Message Type Block, в ASCII соответствует слову "Hello " (Hello с тремя пробелами), 64 бит) (2 слова)

6. Версия ZRTP-протокола (version), например 0x312e3130, что в ASCII соответствует слову "1.10" (1 слово)

7. Идентификатор клиента cid (Client Identifier, 128 бит) (4 слова)

Идентификатор клиента определяет производителя и версию программного обеспечения ZRTP.

8. Хэш-образ H3 (Hash image, 256 бит) (8 слов)

Вычисление хэш-образа H3 проводится перед каждой сессией следующим образом:

Отправитель сообщения, т.е. пользователь $ A$, генерирует непредсказуемый случайный одноразовый код H0, уникальный в рамках сессии.

Вычисляется H1=H(H0), где H - поддерживаемая протоколом хэш-функция SHA-256, значение которой усечено до 256 бит.

Вычисляется H2=H(H1).

Вычисляется H3=H(H2).

9. Уникальный идентификатор ZID пользователя $ A$ (ZRTP ID, 96 бит) (3 слова)

ZID случайным образом генерируется программным обеспечением во время инсталляции или инициализации.

10. 0 $ vertvert$ флаг, поддерживающий подпись, (S) (Signature-capable flag (S), 1 бит) $ vertvert$ флаг "человек по середине" (M) (MiTM flag (M), 1 бит) $ vertvert$ пассивный флаг (P) (Passive flag (P), 1 бит) $ vertvert$ 0x00 $ vertvert$ количество алгоритмов хеширования hc (hash count, 4 бит) $ vertvert$ количество алгоритмов шифрования cc (cipher count, 4 бит) $ vertvert$ количество типов аутентификационных тегов ac (auth tag count, 4 бит) $ vertvert$ количество протоколов согласования ключей kc (key agreement count, 4 бит) $ vertvert$ количество типов SAS sc (sas count, 4 бит) (1 слово)

S=1, если пользователь способен обрабатывать и проверять цифровые подписи. S=0, если цифровые подписи не поддерживаются.

M=1, если пользователь имеет возможность отправлять сообщение SASrelay, в противном случае M=0.

P=1, если пользователь не имеет возможности отправлять сообщение Commit, т.е. пользователь не может быть инициатором безопасного сеанса, а только респондентом, в противном случае P=0.

hc=0 (cc=0, ac=0, kc=0, sc=0), если поддерживаются только обязательные к реализации алгоритмы. Обязательные алгоритмы могут быть включены в список. Порядок списка указывает на предпочтения пользователя. Если обязательный алгоритм не включен в список, то он неявно добавляется в конец списка предпочтений.

11. Поддерживаемые алгоритмы хеширования (Hash algorithms) (0-7 слов)

Например, 0x53323536, что в ASCII соответствует слову "S256" (хэш-функция SHA-256, определяемая в стандарте NIST FIPS PUB 180-3, поддерживается протоколом в обязательном порядке).

0x53333834, что в ASCII соответствует слову "S384" (хэш-функция SHA-384, рекомендуется протоколом, а в случае использования ECDH-384, алгоритма Диффи-Хеллмана на эллиптических кривых, поддерживается протоколом в обязательном порядке).

0x4e323536, что в ASCII соответствует слову "N256" (256-битная хэш-функция SHA-3, определяемая в проекте стандарта NIST, может дополнительно использоваться).

0x4e333834, что в ASCII соответствует слову "N384" (384-битная хэш-функция SHA-3, определяемая в проекте стандарта NIST, может дополнительно использоваться).

Возможно использование других хэш-функций.

12. Поддерживаемые алгоритмы шифрования (Cipher algorithms) (0-7 слов)

Например, 0x41455331, что в ASCII соответствует слову "AES1" (алгоритм шифрования AES-128, определяемый в стандарте NIST FIPS PUB 197, поддерживается протоколом в обязательном порядке).

0x41455332, что в ASCII соответствует слову "AES2" (алгоритм шифрования AES-192, может использоваться).

0x41455333, что в ASCII соответствует слову "AES3" (алгоритм шифрования AES-256, может использоваться).

0x32465331, что в ASCII соответствует слову "2FS1" (алгоритм шифрования TwoFish с 128-битными ключами, может использоваться).

0x32465332, что в ASCII соответствует слову "2FS2" (алгоритм шифрования TwoFish с 192-битными ключами, может использоваться).

0x32465333, что в ASCII соответствует слову "2FS3" (алгоритм шифрования TwoFish с 256-битными ключами, может использоваться).

Возможно использование других алгоритмов шифрования с такими же размерами блоков и длинами ключей.

13. Поддерживаемые типы аутентификационных тегов (SRTP Auth Tag Types) (0-7 слов)

Например, 0x48533332, что в ASCII соответствует слову "HS32" (32-бит аутентификационный тег, основанный на HMAC-SHA1, как определено в документе RFC 3711, поддерживается протоколом в обязательном порядке).

0x48533830, что в ASCII соответствует слову "HS80" (80-бит аутентификационный тег, основанный на HMAC-SHA1, как определено в документе RFC 3711, поддерживается протоколом в обязательном порядке).

0x534b3332, что в ASCII соответствует слову "SK32" (32-бит аутентификационный тег, основанный на Skein-512-MAC, с 256-битным ключом и 32-битным МАС длиной, может использоваться).

0x534b3634, что в ASCII соответствует слову "SK64" (64-бит аутентификационный тег, основанный на Skein-512-MAC, с 256-битным ключом и 64-битным МАС длиной, может использоваться).

Возможно использование других аутентификационных тегов.

14. Поддерживаемые протоколы согласования ключей (Key Agreement Types) (0-7 слов)

Например, 0x4448336b, что в ASCII соответствует слову "DH3k" (протокол Диффи-Хеллмана с параметром p=3072 бит, как определено в документе RFC 3526, поддерживается протоколом в обязательном порядке).

0x4448326b, что в ASCII соответствует слову "DH2k" (протокол Диффи-Хеллмана с параметром p=2048 бит, как определено в документе RFC 3526, может использоваться).

0x45433235, что в ASCII соответствует слову "EC25" (протокол Диффи-Хеллмана на эллиптических кривых с параметром p=256 бит, как определено в документе RFC 5114, может использоваться).

0x45433338, что в ASCII соответствует слову "EC38" (протокол Диффи-Хеллмана на эллиптических кривых с параметром p=384 бит, как определено в документе RFC 5114, может использоваться).

0x45433532, что в ASCII соответствует слову "EC52" (протокол Диффи-Хеллмана на эллиптических кривых с параметром p=521 бит, как определено в документе RFC 5114, не рекомендуется протоколом из-за существеннного вычислительного замедления).

0x50727368, что в ASCII соответствует слову "Prsh" (режим предустановленного ключа, поддерживается протоколом в рекомендательном порядке).

0x4d756c74, что в ASCII соответствует слову "Mult" (многопоточный режим, поддерживается протоколом в обязательном порядке, если пользователь поддерживает несколько одновременных мультимедиа потоков).

15. Поддерживаемые типы SAS (SAS Types) (SAS (Short Authentication String) - короткая строка аутентификации) (0-7 слов)

Например, 0x42333220, что в ASCII соответствует слову "B32 " (B32 с одним пробелом) (SAS с кодировкой base32, поддерживается протоколом в обязательном порядке).

0x42323536, что в ASCII соответствует слову "B256" (SAS с кодировкой base256, может использоваться).

16. Код аутентичности сообщения MAC (message authentication code, 64 бит) (2 слова)

Для вычисления кода аутентичности сообщения используется алгоритм HMAC (hash-based message authentication code) на основе поддерживаемой протоколом хэш-функции H (SHA-256) и c секретным ключом $ K$, являющимся хэш-образом H2 отправителя сообщения, т.е. пользователя $ A$.

Вычисление проводится следующим образом:

Определяется $ B$-байтовый ключ $ K_0$, где $ B$ - длина блоков, на которые делится входное сообщение хэш-функции H (512 бит для SHA-256):

- если длина ключа $ K$ равна $ B$ байт, то $ K_0=K$,

- если длина ключа $ K$ больше $ B$ байт, то вычисляется хэш-функция от $ K$, и к полученной $ L$-байтовой строке добавляется $ B-L$ нулевых байтов, получая $ B$-байтовый ключ $ K_0$, т.е. $ K_0=H(K) vertvert$00...00,

- если длина ключа $ K$ меньше В байт, то в конце $ K$ добавляются нулевые байты до получения $ B$-байтового ключа $ K_0$.

Вычисляется $ K_0 oplus ipad$, где $ ipad$=0x3636...36 (байт 0x36 повторяется $ B$ раз).

Вычисляется $ (K_0 oplus ipad) vertvert text$, где $ text$ - передаваемое сообщение.

Вычисляется хэш-функция $ H((K_0 oplus ipad) vertvert text)$.

Вычисляется $ K_0 oplus opad$, где $ opad$=0x5c5c...5c (байт 0x5c повторяется $ B$ раз).

Вычисляется $ (K_0 oplus opad) vertvert H((K_0 oplus ipad) vertvert text)$.

Вычисляется $ H((K_0 oplus opad) vertvert H((K_0 oplus ipad) vertvert text))$.

64 крайние левые биты полученной строки определяют код аутентичности сообщения MAC.

17. Контрольная сумма (Cyclic Redundancy Check (CRC), циклический избыточный код) (1 слово)

Для вычисления контрольной суммы используется 32-битный циклический избыточный код CRC-32с (Castagnoli) с порождающим многочленом G(x)=$ x^{32}+x^{28}+x^{27}+x^{26}+x^{25}+x^{23}+x^{22}+x^{20}+x^{19}+x^{18}+x^{14}+x^{13}+x^{11}+x^{10}+x^9+x^8+x^6+x^0$(0x11edc6f41).

Вычисление проводится следующим образом:

Передаваемое сообщение представляется в виде последовательности байтов, пронумерованных от 0 до N-1.

Биты этой последовательности рассматриваются как коэффициенты многочлена M(x) степени 8N-1. При этом наименее значащий бит байта j (0-ой бит) является коэффициентом при $ x^{8(N-j)-8)}$, а наиболее значащий бит байта j (7-ой бит) является коэффициентом при $ x^{8(N-j)-1)}$.

Многочлен M(x) умножается на $ x^{32}$ и делится на многочлен G(x), получая остаток R(x) степени меньше 32.

Коэффициенты многочлена R(x) рассматриваются как последовательность из 32 бит (последовательность из 4 байтов). При этом коэффициент при $ x^{31}$ является наиболее значащим битом наименее значащего байта (7-ым битом 0-го байта), коэффициент при $ x^{24}$ является наименее значащим битом наименее значащего байта (0-ым битом 0-го байта), коэффициент при $ x^{7}$ является наиболее значащим битом наиболее значащего байта (7-ым битом 3-го байта), коэффициент при $ x^{0}$ является наименее значащим битом наиболее значащего байта (0-ым битом 3-го байта).

Эта последовательность и определяет контрольную сумму CRC. 

2) В случае успешного получения и проверки сообщения Hello от пользователя $ A$пользователь $ B$ отправляет пользователю $ A$ ответное сообщение HelloACK. 

Сообщение HelloACK состоит из следующих 32-битных (4-байтовых) слов: 

Заголовок сообщения:

1. 0x1000 $ vertvert$ порядковый номер (Sequence Number, 16 бит) (1 слово)

2. 0x5a525450 (ZRTP Magic Cookie, в ASCII соответствует слову "ZRTP") (1 слово)

3. Идентификатор источника (Source Identifier) (1 слово)

Сообщение:

4. 0x505a (preamble value, преамбула) $ vertvert$ 0x0003 (длина = 3 слова) (1 слово)

5. 0x48656c6c6f41434b (Message Type Block, в ASCII соответствует слову "HelloACK", 64 бит) (2 слова)

6. Контрольная сумма (Cyclic Redundancy Check (CRC), циклический избыточный код) (1 слово) 

3) Пользователь $ B$ отправляет пользователю $ A$ сообщение Hello. 

4) В случае успешного получения и проверки сообщения Hello от пользователя $ B$пользователь $ A$ отправляет пользователю $ B$ ответное сообщение HelloACK. 

5) Пользователь $ B$ отправляет пользователю $ A$ сообщение Commit. Сообщение Commit служит для определения инициатора при выполнении дальнейших шагов протокола. Пользователь, посылающий это сообщение, выбирает роль инициатора. Сообщение Commit содержит значение hvi (hash value of initiator). В том случае, если оба пользователя выбирают роль инициатора и одновременно посылают Commit, значения hvi сравниваются, и тот, у кого hvi оказывается больше, принимает роль инициатора, а другой пользователь – респондента. Для определенности будем полагать, что роль инициатора принял пользователь $ B$. Сообщение Commit может быть повторно отправлено 10 раз, используя таймер Т2. При этом начальное значение Т1, равное 150 мс, при повторных передачах удваивается, пока не достигнет 1200 мс. Таким образом, максимальное время для успешного отправления сообщения Commit, без учета времени формирования, переноса и обработки сообщения, будет составлять 150+300+600+7*1200 (мс) = 9,45 с. Повторная передача сообщения Commit прекращается, только если принято сообщение DHPart1 или сообщение Confirm1. 

Сообщение Commit состоит из следующих 32-битных (4-байтовых) слов: 

Заголовок сообщения:

1. 0x1000 $ vertvert$ порядковый номер (Sequence Number, 16 бит) (1 слово)

2. 0x5a525450 (ZRTP Magic Cookie, в ASCII соответствует слову "ZRTP") (1 слово)

3. Идентификатор источника (Source Identifier) (1 слово)

Сообщение:

4. 0x505a (preamble value, преамбула) $ vertvert$ 0x001d (длина = 29 слов) (1 слово)

5. 0x436f6d6d69742020 (Message Type Block, в ASCII соответствует слову "Commit " (Commit с двумя пробелами), 64 бит) (2 слова)

6. Хэш-образ H2 (Hash image, 256 бит) (8 слов)

7. Уникальный идентификатор пользователя $ B$ (ZID, 96 бит) (3 слова)

ZID должен совпадать с ZID, указанным в сообщении Hello пользователя $ B$.

8. Алгоритм хеширования, выбранный пользователем $ B$ (Hash algorithm) (1 слово)

9. Алгоритм шифрования, выбранный пользователем $ B$ (Cipher algorithm) (1 слово)

10. Тип аутентификационного тега, выбранный пользователем $ B$ (SRTP Auth Tag Type) (1 слово)

11. Протокол согласования ключей, выбранный пользователем $ B$ (Key Agreement Type) (1 слово)

12. Тип SAS, выбранный пользователем $ B$ (SAS Type) (1 слово)

13. Хэш-значение hvi (hash value of initiator) (8 слов)

hvi = H(сообщение DHPart2 (без заголовка) пользователя $ B$, т.е инициатора || сообщение Hello (без заголовка) пользователя $ A$, т.е. респондента) (256 бит) (8 слов), где H - выбранная пользователем $ B$ хэш-функция, значение которой усечено до 256 бит.

14. Код аутентичности сообщения (MAC, 64 бит) (2 слова)

Для вычисления кода аутентичности сообщения используется алгоритм HMAC (hash-based message authentication code) на основе поддерживаемой протоколом хэш-функции H (SHA-256) и c секретным ключом $ K$, являющимся хэш-образом H1 отправителя сообщения, т.е. пользователя $ B$.

15. Контрольная сумма (Cyclic Redundancy Check (CRC), циклический избыточный код) (1 слово) 

6) В случае успешного получения и проверки сообщения Commit от пользователя $ B$(инициатора) пользователь $ A$ (респондент) генерирует свой собственный случайный секретный ключ $ svr$, вычисляет открытый ключ $ pvr$, и отправляет пользователю $ B$сообщение DHPart1. Если выбран (в сообщении Commit) протокол Диффи-Хеллмана DH3k или DH2k, то $ pvr = g^{svr} pmod p$, где $ g=2$ и $ p$ - заданные параметры протокола Диффи-Хеллмана, $ svr$ - сгенерированное пользователем $ A$ случайное значение. Длине $ svr$ следует быть вдвое больше, чем длина ключа используемого алгоритма шифрования. Если выбран протокол Диффи-Хеллмана на эллиптических кривых EC25, EC38 или EC52, то $ pvr$ вычисляется как указано в документе NIST SP 800-56A Revision 2. 

Сообщение DHPart1 состоит из следующих 32-битных (4-байтовых) слов: 

Заголовок сообщения:

1. 0x1000 $ vertvert$ порядковый номер (Sequence Number, 16 бит) (1 слово)

2. 0x5a525450 (ZRTP Magic Cookie, в ASCII соответствует слову "ZRTP") (1 слово)

3. Идентификатор источника (Source Identifier) (1 слово)

Сообщение:

4. 0x505a (preamble value, преамбула) $ vertvert$ длина сообщения (16 бит) (1 слово)

Длина сообщения зависит от выбранного протокола согласования ключей.

Например, если выбран "DH3k", то длина = 117 слов.

Если выбран "DH2k", то длина = 85 слов.

Если выбран "EC25", то длина = 37 слов.

Если выбран "EC38", то длина = 45 слов.

Если выбран "EC52", то длина = 54 слова.

5. 0x4448506172743120 (Message Type Block, в ASCII соответствует слову "DHPart1 " (DHPart1 с одним пробелом), 64 бит) (2 слова)

6. Хэш-образ H1 (Hash image, 256 бит) (8 слов)

7. Необратимый хэш rs1IDr = MAC("Responder") (64 бит) (2 слова)

Для вычисления rs1IDr используется алгоритм HMAC (hash-based message authentication code) на основе согласованной (в сообщении Commit) хэш-функции H и c секретным ключом rs1, являющимся некоторым согласованным с пользователем $ B$ общим секретом, хранящимся в долгосрочном кэше пользователя $ A$.

8. Необратимый хэш rs2IDr = MAC("Responder") (64 бит) (2 слова)

Для вычисления rs2IDr используется алгоритм HMAC (hash-based message authentication code) на основе согласованной (в сообщении Commit) хэш-функции H и c секретным ключом rs2, являющимся некоторым согласованным с пользователем $ B$ общим секретом, хранящимся в долгосрочном кэше пользователя $ A$.

9. Необратимый хэш auxsecretIDr = MAC(H3 пользователя $ A$) (64 бит) (2 слова)

Для вычисления auxsecretIDr используется алгоритм HMAC (hash-based message authentication code) на основе согласованной (в сообщении Commit) хэш-функции H и c секретным ключом auxsecret, являющимся некоторым согласованным с пользователем $ B$общим секретом, хранящимся в долгосрочном кэше пользователя $ A$.

10. Необратимый хэш pbxsecretIDr = MAC("Responder") (64 бит) (2 слова)

Для вычисления pbxsecretIDr используется алгоритм HMAC (hash-based message authentication code) на основе согласованной (в сообщении Commit) хэш-функции H и c секретным ключом pbxsecret, являющимся некоторым вычисленным в предыдущей сессии, согласованным с пользователем $ B$ общим секретом, хранящимся в долгосрочном кэше пользователя $ A$.

11. Открытый ключ $ pvr$ (n слов)

Количество слов n зависит от выбранного протокола согласования ключей.

Например, если выбран "DH3k", то n = 96 слов.

Если выбран "DH2k", то n = 64 слова.

Если выбран "EC25", то n = 16 слов.

Если выбран "EC38", то n = 24 слова.

Если выбран "EC52", то n = 33 слова.

12. Код аутентичности сообщения (MAC, 64 бит) (2 слова)

Для вычисления кода аутентичности сообщения используется алгоритм HMAC (hash-based message authentication code) на основе поддерживаемой протоколом хэш-функции H (SHA-256) и c секретным ключом $ K$, являющимся хэш-образом H0 отправителя сообщения, т.е. пользователя $ A$.

13. Контрольная сумма (Cyclic Redundancy Check (CRC), циклический избыточный код) (1 слово) 

7) В случае успешного получения и проверки сообщения DHPart1 от пользователя $ A$(респондента) пользователь $ B$ (инициатор) проверяет открытый ключ пользователя $ A$(респондента) $ pvr$. Если $ pvr=1$ или $ p-1$ (в случае протокола Диффи-Хеллмана DH3k или DH2k) или $ pvr$ является первой координатой бесконечно удаленной точки (в случае протокола Диффи-Хеллмана на эллиптических кривых EC25, EC38 или EC52), то это сигнализирует об атаке, и протокол должен быть прерван. В противном случае, пользователь $ B$ генерирует свой собственный случайный секретный ключ $ svi$, вычисляет открытый ключ $ pvi$, вычисляет $ DHResult$, и отправляет пользователю $ A$ сообщение DHPart2. Если выбран (в сообщении Commit) протокол Диффи-Хеллмана DH3k или DH2k, то $ pvi = g^{svi} pmod p$ и $ DHResult = pvr^{svi} pmod p$. Длине $ svi$ следует быть вдвое больше, чем длина ключа используемого алгоритма шифрования. Если выбран (в сообщении Commit) протокол Диффи-Хеллмана на эллиптических кривых EC25, EC38 или EC52, то $ pvi$ и $ DHResult$ вычисляются как указано в документе NIST SP 800-56A Revision 2. Сообщение DHPart2 может быть повторно отправлено 10 раз, используя таймер Т2. При этом начальное значение Т1, равное 150 мс, при повторных передачах удваивается, пока не достигнет 1200 мс. Таким образом, максимальное время для успешного отправления сообщения DHPart2, без учета времени формирования, переноса и обработки сообщения, будет составлять 150+300+600+7*1200 (мс) = 9,45 с. Повторная передача сообщения DHPart2 прекращается, только если принято сообщение Confirm1. 

Сообщение DHPart2 состоит из следующих 32-битных (4-байтовых) слов: 

Заголовок сообщения:

1. 0x1000 $ vertvert$ порядковый номер (Sequence Number, 16 бит) (1 слово)

2. 0x5a525450 (ZRTP Magic Cookie, в ASCII соответствует слову "ZRTP") (1 слово)

3. Идентификатор источника (Source Identifier) (1 слово)

Сообщение:

4. 0x505a (preamble value, преамбула) $ vertvert$ длина сообщения (16 бит) (1 слово)

Длина сообщения зависит от выбранного протокола согласования ключей.

Например, если выбран "DH3k", то длина = 117 слов.

Если выбран "DH2k", то длина = 85 слов.

Если выбран "EC25", то длина = 37 слов.

Если выбран "EC38", то длина = 45 слов.

Если выбран "EC52", то длина = 54 слова.

5. 0x4448506172743220 (Message Type Block, в ASCII соответствует слову "DHPart2 " (DHPart2 с одним пробелом), 64 бит) (2 слова)

6. Хэш-образ H1 (Hash image, 256 бит) (8 слов)

7. Необратимый хэш rs1IDi = MAC("Initiator") (64 бит) (2 слова)

Для вычисления rs1IDi используется алгоритм HMAC (hash-based message authentication code) на основе согласованной (в сообщении Commit) хэш-функции H и c секретным ключом rs1, являющимся некоторым согласованным с пользователем $ A$ общим секретом, хранящимся в долгосрочном кэше пользователя $ B$.

8. Необратимый хэш rs2IDi = MAC("Initiator") (64 бит) (2 слова)

Для вычисления rs2IDi используется алгоритм HMAC (hash-based message authentication code) на основе согласованной (в сообщении Commit) хэш-функции H и c секретным ключом rs2, являющимся некоторым согласованным с пользователем $ A$ общим секретом, хранящимся в долгосрочном кэше пользователя $ B$.

9. Необратимый хэш auxsecretIDi = MAC(H3 пользователя $ B$) (64 бит) (2 слова)

Для вычисления auxsecretIDi используется алгоритм HMAC (hash-based message authentication code) на основе согласованной (в сообщении Commit) хэш-функции H и c секретным ключом auxsecret, являющимся некоторым согласованным с пользователем $ A$общим секретом, хранящимся в долгосрочном кэше пользователя $ B$.

10. Необратимый хэш pbxsecretIDi = MAC("Initiator") (64 бит) (2 слова)

Для вычисления pbxsecretIDi используется алгоритм HMAC (hash-based message authentication code) на основе согласованной (в сообщении Commit) хэш-функции H и c секретным ключом pbxsecret, являющимся некоторым вычисленным в предыдущей сессии, согласованным с пользователем $ A$ общим секретом, хранящимся в долгосрочном кэше пользователя $ B$.

11. Открытый ключ $ pvi$ (n слов)

Количество слов n зависит от выбранного протокола согласования ключей.

Например, если выбран "DH3k", то n = 96 слов.

Если выбран "DH2k", то n = 64 слова.

Если выбран "EC25", то n = 16 слов.

Если выбран "EC38", то n = 24 слова.

Если выбран "EC52", то n = 33 слова.

12. Код аутентичности сообщения (MAC, 64 бит) (2 слова)

Для вычисления кода аутентичности сообщения используется алгоритм HMAC (hash-based message authentication code) на основе поддерживаемой протоколом хэш-функции H (SHA-256) и c секретным ключом $ K$, являющимся хэш-образом H0 отправителя сообщения, т.е. пользователя $ B$.

13. Контрольная сумма (Cyclic Redundancy Check (CRC), циклический избыточный код) (1 слово) 

8) В случае успешного получения и проверки сообщения DHPart2 от пользователя $ B$(инициатора) пользователь $ A$ (респондент) проверяет открытый ключ пользователя $ B$(инициатора) $ pvi$. Если $ pvi=1$ или $ p-1$ (в случае протокола Диффи-Хеллмана DH3k или DH2k) или $ pvi$ является первой координатой бесконечно удаленной точки (в случае протокола Диффи-Хеллмана на эллиптических кривых EC25, EC38 или EC52), то это сигнализирует об атаке, и протокол должен быть прерван. В противном случае, пользователь $ A$ вычисляет свое собственное значение hvi и сравнивает результат с hvi, полученным в сообщении Commit. Если они не совпадают, то это сигнализирует об атаке, и протокол должен быть прерван. В противном случае, пользователь $ A$ вычисляет $ DHResult$ (в случае протокола Диффи-Хеллмана DH3k или DH2k$ DHResult = pvi^{svr} pmod p$, в случае протокола Диффи-Хеллмана на эллиптических кривых EC25, EC38 или EC52 $ DHResult$ вычисляется как указано в документе NIST SP 800-56A Revision 2) и отправляет пользователю $ B$ сообщение Confirm1. 

Сообщение Confirm1 состоит из следующих 32-битных (4-байтовых) слов: 

Заголовок сообщения:

1. 0x1000 $ vertvert$ порядковый номер (Sequence Number, 16 бит) (1 слово)

2. 0x5a525450 (ZRTP Magic Cookie, в ASCII соответствует слову "ZRTP") (1 слово)

3. Идентификатор источника (Source Identifier) (1 слово)

Сообщение:

4. 0x505a (preamble value, преамбула) $ vertvert$ длина сообщения (зависит от того, что используется ли подпись для SAS или не используется, и если подпись не используется, то длина сообщения = 19 словам) (16 бит) (1 слово)

5. 0x436f6e6669726d31 (Message Type Block, в ASCII соответствует слову "Confirm1", 64 бит) (2 слова)

6. confirmmac = MAC(mackeyr, зашифрованная часть сообщения Confirm1) (64 бит) (2 слова)

7. Вектор инициализации (CFB Initialization Vector, 128 бит) (4 слова)

Следующая часть сообщения (слова 8-13) зашифровываются в режиме CFB с указанным вектором инициализации и ключом zrtpkeyr.

8. Хэш-прообраз H0 (Hash preimage, 256 бит) (8 слов)

9. x00 $ vertvert$ 0 0 0 0 0 0 0 $ vertvert$ длина подписи (signature length, 9 бит) $ vertvert$ 0 0 0 0 $ vertvert$ флаг PBX регистрации (E) (PBX Enrollment flag (E), 1 б

 

Основные сведения

 

Ссылки
  • P.Zimmermann, A.Johnston, J.Callas. ZRTP: Media Path Key Agreement for Unicast Secure RTP. – Internet Engineering Task Force, Request for Comments (RFC) 6189bis, November 2012.
  • National Institute of Standards and Technology, The Keyed-Hash Message Authentication Code (HMAC), Federal Information Processing Standards Publication 198-1, July 2008.
  • Stewart, R. Stream Control Transmission Protocol. – Internet Engineering Task Force, Request for Comments (RFC) 4960, September 2007