cjdns whitepaper / cjdns whitepaper: The CryptoAuth

Английский оригинал Перевод на русский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

CryptoAuth - это, своего рода, оболочка для интерфейсов. Вы используете его совместно с интерфейсом и(опционально) с ключем и получаете новый интерфейс, позволяющий отправлять пакеты тем, у кого есть указанный вами ключ. Как и остальные модули cjdns, этот модуль наилучшим образом оптимизирован для транзита данных. Установка соединения в CryptoAuth основана на использовании заголовков поверх обычных пакетов и пока траффик при установке соединения зашифрован и аутентифицирован. Он не имеет защиты от атак с повтором и не имеет прямой секретности, если приватный ключ скомпрометирован. Модуль CryptoAuth добавляет к пакету свой заголовок - 120 байт накладных расходов в каждом пакете, в результате чего колеблется MTU.

vebeer 04.02.14 в 06:08

0

5 возможных заголовков CryptoAuth:

vebeer 04.02.14 в 05:01

0

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", в зависимости от того, что было предложено во время установки соединения.

vebeer 04.02.14 в 06:59

0

Структура "Handshake" - пакета

vebeer 04.02.14 в 05:02

0

Session State - Состояние сессии
Auth Challenge - Требование авторизации
Random Nonce - Случайный код
Permanent Public Key - постоянный открытый ключ
Poly1305 Authenticator - Аутентификатор Poly1305
Encrypted/Authenticated Temporary Public Key - Зашифрованный/Проверенный публичный ключ
Variable Length Encrypted/Authenticated Content - Поле переменной длины, содержащее зашифрованную информацию

vebeer 04.02.14 в 05:43

0

Пакет "Connect To Me"

vebeer 04.02.14 в 05:02

0

Если "Session State" содержит только нули, это значит, что отправитель запрашивает установку соединения получателем. Это происходит в тех случаях, когда отправитель(он же инициатор соединения) не знает ключ получателя. Если весь заголовок отсутствует, получатель должнен отбросить этот пакет, при этом прочитав единственное поле - "Permanent Public Key", остальные поля нужно проигнорировать. Получив пакет без этого заголовка, узел должен отправить отправителю "hello"-пакет, если соединение не установлено. Если же соединение установлено, получатель не должен отвечать, но может уменьшить тайм-аут подключения.

vebeer 05.02.14 в 00:01

0

"Hello"-пакет

vebeer 04.02.14 в 05:02

0

Если значение поля "Session State" равно единице или двойке, это значит, что пакет является "hello"-пакетом или повторно отправленным "hello"-пакетом. Если соединение при это не устанвоелно, получатель может отправить "Key"-пакет, но рекомендуется подождать того момента, когда у получателя будт информация, которую он должен будет отправить первым. Узел, отправивший "hello"-пакет и не получивший ответ на него, но желающий передать данные дальше, должен послать эти данные, оформленные в виде повторного "hello"-пакета. Временный открытый ключ и содержимое при этом шифруются постоянными открытыми ключами двух узлов и случайным кодом, указанным в заголовке. Содержимое и временный ключ зашифрованы с помощью функции crypto_box_curve25519poly1305xsalsa20().

vebeer 05.02.14 в 00:24

0

"Key" - пакет

vebeer 04.02.14 в 05:03

0

Если значение поля "Session State" равно двум или трем, то перед нами "key"-пакет. Эти пакеты являются ответами на "hello"-пакеты, они содержат временный открытый ключ, зашифрованный и авторизованный вместе с передаваемой информацией. После того, как узел получит "Key"-пакет, он может начать передачу "Data"-пакетов. Если узел получил "hello", отправил в ответ на него "key" и не получил на него ответ, но хочет начать отправку данных, он должен повторить "key"-пакет.

vebeer 05.02.14 в 00:42

0

Пакет с данными

vebeer 04.02.14 в 05:03

0

Обычный "Data"-пакет имеет заголовок 4 байта, который является одноразовым ключем, использующимся для шифрования пакета с помощью функции crypto_stream_salsa20_xor(). Для криптографических преобразований, байты данного ключа записываются в обратном порядке, при этом если узел - иницитор соединения, то эти байты записываются в первые 4 байта случайного ключа, необходимого для crypto_stream_salsa20_xor(), если узел - не инициатор, то данные байты записываются во вторые 4 байта, что позволяет за одну сессию передать 2^32 пакетов в одном направлении.

vebeer 05.02.14 в 00:54

0

Аутентифицированный пакет

vebeer 04.02.14 в 05:03

0

Аутентифицированный пакет отправляется если была предложена аутентификация Poly1305, либо во время устанвоки соединения. Как и в пакете данных, тут первые 4 байта являются одноразовым ключем, в данном случае, это одноразовая 24-байтная последовательность и crypto_box_curve25519poly1305xsalsa20(). Принцип у шифрования и дешифровки один и тот же.

vebeer 05.02.14 в 01:45

0
+1

Если пакет не прошел проверку подлинности, он должен быть отброшен.

vebeer 04.02.14 в 05:04

0

Защита от повторов

vebeer 04.02.14 в 05:04

0

Если аутентификация пакетов включена, то пакет проверяется на повтор(случайный или намеренный). Проверка осуществляется смещением на 32 бита и 32-битным полем, использующимися для создания "раздвижных окон".

vebeer 05.02.14 в 01:50

0
+1
Минутку...