Готовый перевод cjdns whitepaper / cjdns whitepaper: The CryptoAuth
CryptoAuth - это, своего рода, оболочка для интерфейсов. Вы используете его совместно с интерфейсом и(опционально) с ключем и получаете новый интерфейс, позволяющий отправлять пакеты тем, у кого есть указанный вами ключ. Как и остальные модули cjdns, этот модуль наилучшим образом оптимизирован для транзита данных. Установка соединения в CryptoAuth основана на использовании заголовков поверх обычных пакетов и пока траффик при установке соединения зашифрован и аутентифицирован. Он не имеет защиты от атак с повтором и не имеет прямой секретности, если приватный ключ скомпрометирован. Модуль CryptoAuth добавляет к пакету свой заголовок - 120 байт накладных расходов в каждом пакете, в результате чего колеблется MTU.
5 возможных заголовков CryptoAuth:
Connect To Me - Используется для установки соединения, не зная ключ другого узла.
Hello Packet - Первое сообщение при начале сессии.
Key Packet - Второе сообщение в сессии.
Data Packet - Обычный пакет, содержащий пользовательский траффик.
Authenticated - пакет данных с проверкой подлинности по алгоритму Poly1305.
Все заголовки CryptoAuth имеют длинну 120 байт, кроме заголовка Data Packet, в котором к 4 первым байтам добавляется опозновательный заголовок длиной 20 байт. Первые же 4 байта любого CryptoAuth-заголовка - это число, записанное в обратном порядке, используемое для определения типа пакета, так называемое "Session State" - число. Если это инверсия нуля - то это заголовок "Connect To Me", если это один или два - это "Hello Packet" или повтор "Hello Packet", если три или четыре - "Key Packet" или повтор "Key Packet", если любое другое число, больше четырех - это или "Data Packet", или "Authenticated packet", в зависимости от того, что было предложено во время установки соединения.
Структура "Handshake" - пакета
Session State - Состояние сессии
Auth Challenge - Требование авторизации
Random Nonce - Случайный код
Permanent Public Key - постоянный открытый ключ
Poly1305 Authenticator - Аутентификатор Poly1305
Encrypted/Authenticated Temporary Public Key - Зашифрованный/Проверенный публичный ключ
Variable Length Encrypted/Authenticated Content - Поле переменной длины, содержащее зашифрованную информацию
Пакет "Connect To Me"
Если "Session State" содержит только нули, это значит, что отправитель запрашивает установку соединения получателем. Это происходит в тех случаях, когда отправитель(он же инициатор соединения) не знает ключ получателя. Если весь заголовок отсутствует, получатель должнен отбросить этот пакет, при этом прочитав единственное поле - "Permanent Public Key", остальные поля нужно проигнорировать. Получив пакет без этого заголовка, узел должен отправить отправителю "hello"-пакет, если соединение не установлено. Если же соединение установлено, получатель не должен отвечать, но может уменьшить тайм-аут подключения.
"Hello"-пакет
Если значение поля "Session State" равно единице или двойке, это значит, что пакет является "hello"-пакетом или повторно отправленным "hello"-пакетом. Если соединение при это не устанвоелно, получатель может отправить "Key"-пакет, но рекомендуется подождать того момента, когда у получателя будт информация, которую он должен будет отправить первым. Узел, отправивший "hello"-пакет и не получивший ответ на него, но желающий передать данные дальше, должен послать эти данные, оформленные в виде повторного "hello"-пакета. Временный открытый ключ и содержимое при этом шифруются постоянными открытыми ключами двух узлов и случайным кодом, указанным в заголовке. Содержимое и временный ключ зашифрованы с помощью функции crypto_box_curve25519poly1305xsalsa20().
"Key" - пакет
Если значение поля "Session State" равно двум или трем, то перед нами "key"-пакет. Эти пакеты являются ответами на "hello"-пакеты, они содержат временный открытый ключ, зашифрованный и авторизованный вместе с передаваемой информацией. После того, как узел получит "Key"-пакет, он может начать передачу "Data"-пакетов. Если узел получил "hello", отправил в ответ на него "key" и не получил на него ответ, но хочет начать отправку данных, он должен повторить "key"-пакет.
Пакет с данными
Обычный "Data"-пакет имеет заголовок 4 байта, который является одноразовым ключем, использующимся для шифрования пакета с помощью функции crypto_stream_salsa20_xor(). Для криптографических преобразований, байты данного ключа записываются в обратном порядке, при этом если узел - иницитор соединения, то эти байты записываются в первые 4 байта случайного ключа, необходимого для crypto_stream_salsa20_xor(), если узел - не инициатор, то данные байты записываются во вторые 4 байта, что позволяет за одну сессию передать 2^32 пакетов в одном направлении.
Аутентифицированный пакет
Аутентифицированный пакет отправляется если была предложена аутентификация Poly1305, либо во время устанвоки соединения. Как и в пакете данных, тут первые 4 байта являются одноразовым ключем, в данном случае, это одноразовая 24-байтная последовательность и crypto_box_curve25519poly1305xsalsa20(). Принцип у шифрования и дешифровки один и тот же.
Если пакет не прошел проверку подлинности, он должен быть отброшен.
Защита от повторов
Если аутентификация пакетов включена, то пакет проверяется на повтор(случайный или намеренный). Проверка осуществляется смещением на 32 бита и 32-битным полем, использующимися для создания "раздвижных окон".
Внимание! Этот перевод, возможно, ещё не готов.
Его статус: идёт перевод
Переведено на Нотабеноиде
http://notabenoid.org/book/43467/170649
Переводчики: vebeer
Настройки
Готово:
