cjdns whitepaper / cjdns whitepaper: The CryptoAuth
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
CryptoAuth - это, своего рода, оболочка для интерфейсов. Вы используете его совместно с интерфейсом и(опционально) с ключем и получаете новый интерфейс, позволяющий отправлять пакеты тем, у кого есть указанный вами ключ. Как и остальные модули cjdns, этот модуль наилучшим образом оптимизирован для транзита данных. Установка соединения в CryptoAuth основана на использовании заголовков поверх обычных пакетов и пока траффик при установке соединения зашифрован и аутентифицирован. Он не имеет защиты от атак с повтором и не имеет прямой секретности, если приватный ключ скомпрометирован. Модуль CryptoAuth добавляет к пакету свой заголовок - 120 байт накладных расходов в каждом пакете, в результате чего колеблется MTU. vebeer 04.02.14 в 06:08 |
|
|
5 возможных заголовков CryptoAuth: vebeer 04.02.14 в 05:01 |
||
|
Connect To Me - Используется для установки соединения, не зная ключ другого узла. vebeer 04.02.14 в 06:59 |
||
|
Структура "Handshake" - пакета vebeer 04.02.14 в 05:02 |
||
|
Session State - Состояние сессии vebeer 04.02.14 в 05:43 |
||
|
Пакет "Connect To Me" vebeer 04.02.14 в 05:02 |
||
|
Если "Session State" содержит только нули, это значит, что отправитель запрашивает установку соединения получателем. Это происходит в тех случаях, когда отправитель(он же инициатор соединения) не знает ключ получателя. Если весь заголовок отсутствует, получатель должнен отбросить этот пакет, при этом прочитав единственное поле - "Permanent Public Key", остальные поля нужно проигнорировать. Получив пакет без этого заголовка, узел должен отправить отправителю "hello"-пакет, если соединение не установлено. Если же соединение установлено, получатель не должен отвечать, но может уменьшить тайм-аут подключения. vebeer 05.02.14 в 00:01 |
||
|
"Hello"-пакет vebeer 04.02.14 в 05:02 |
||
|
Если значение поля "Session State" равно единице или двойке, это значит, что пакет является "hello"-пакетом или повторно отправленным "hello"-пакетом. Если соединение при это не устанвоелно, получатель может отправить "Key"-пакет, но рекомендуется подождать того момента, когда у получателя будт информация, которую он должен будет отправить первым. Узел, отправивший "hello"-пакет и не получивший ответ на него, но желающий передать данные дальше, должен послать эти данные, оформленные в виде повторного "hello"-пакета. Временный открытый ключ и содержимое при этом шифруются постоянными открытыми ключами двух узлов и случайным кодом, указанным в заголовке. Содержимое и временный ключ зашифрованы с помощью функции crypto_box_curve25519poly1305xsalsa20(). vebeer 05.02.14 в 00:24 |
||
|
"Key" - пакет vebeer 04.02.14 в 05:03 |
||
|
Если значение поля "Session State" равно двум или трем, то перед нами "key"-пакет. Эти пакеты являются ответами на "hello"-пакеты, они содержат временный открытый ключ, зашифрованный и авторизованный вместе с передаваемой информацией. После того, как узел получит "Key"-пакет, он может начать передачу "Data"-пакетов. Если узел получил "hello", отправил в ответ на него "key" и не получил на него ответ, но хочет начать отправку данных, он должен повторить "key"-пакет. vebeer 05.02.14 в 00:42 |
||
|
Пакет с данными vebeer 04.02.14 в 05:03 |
||
|
Обычный "Data"-пакет имеет заголовок 4 байта, который является одноразовым ключем, использующимся для шифрования пакета с помощью функции crypto_stream_salsa20_xor(). Для криптографических преобразований, байты данного ключа записываются в обратном порядке, при этом если узел - иницитор соединения, то эти байты записываются в первые 4 байта случайного ключа, необходимого для crypto_stream_salsa20_xor(), если узел - не инициатор, то данные байты записываются во вторые 4 байта, что позволяет за одну сессию передать 2^32 пакетов в одном направлении. vebeer 05.02.14 в 00:54 |
||
|
Аутентифицированный пакет vebeer 04.02.14 в 05:03 |
||
|
Аутентифицированный пакет отправляется если была предложена аутентификация Poly1305, либо во время устанвоки соединения. Как и в пакете данных, тут первые 4 байта являются одноразовым ключем, в данном случае, это одноразовая 24-байтная последовательность и crypto_box_curve25519poly1305xsalsa20(). Принцип у шифрования и дешифровки один и тот же. vebeer 05.02.14 в 01:45 |
+1 | |
|
Если пакет не прошел проверку подлинности, он должен быть отброшен. vebeer 04.02.14 в 05:04 |
||
|
Защита от повторов vebeer 04.02.14 в 05:04 |
||
|
Если аутентификация пакетов включена, то пакет проверяется на повтор(случайный или намеренный). Проверка осуществляется смещением на 32 бита и 32-битным полем, использующимися для создания "раздвижных окон". vebeer 05.02.14 в 01:50 |
+1 | |
