Криптографічні хеш-функції та коди автентифікації повідомлень (MAC) становлять фундаментальну основу захищених мережевих тунелів. У той час як симетричні шифри відповідають за збереження конфіденційності даних, хешування вирішує комплекс базових завдань: формування довіри до сесії, прив'язку тимчасових ідентифікаторів, захист цілісності протоколу узгодження та фільтрацію сфальсифікованих пакетів перед виконанням асиметричних обчислень. Протягом десятиліть класичні протоколи, зокрема IPsec та OpenVPN, спиралися на сімейство SHA-2 (SHA-256 та SHA-512) за стандартом NIST FIPS 180-4. Однак програмне виконання SHA-256 на 32-бітних маршрутизаторах та енергоефективному обладнанні створює помітні апаратні затримки.

Протокол WireGuard відмовився від застарілих конструкцій хешування на користь алгоритму BLAKE2s, стандартизованого в RFC 7693. Працюючи у поєднанні з Curve25519 та ChaCha20-Poly1305, BLAKE2s забезпечує криптографічну стійкість на рівні SHA-256 та SHA-3, споживаючи значно менше процесорних тактів. Завдяки впровадженню вбудованого режиму хешування з ключем у структуру рукостискання Noise_IKpsk2 та механізму захисту від атак відмови в обслуговуванні (DoS) без збереження стану, WireGuard поєднує математичну простоту та стійкість до атак сторонніми каналами.

Обмеження SHA-256 та атака подовженням повідомлення

Для оцінки технічних переваг BLAKE2s необхідно проаналізувати вразливості традиційних хеш-функцій:

  1. Структура Меркла — Дамґора: Традиційні алгоритми ділять потік даних на блоки фіксованого розміру (512 бітів у SHA-256) і циклічно обробляють їх функцією стискання. Внутрішній вектор стану після фінального блоку безпосередньо виводиться як результат хешування.
  2. Атака подовженням повідомлення (Length Extension Attack): Оскільки вихідне значення SHA-256 повністю відтворює стан компресора, спостерігач, знаючи хеш $H(M)$ та довжину повідомлення $M$, може дописати довільний фрагмент $M'$ та коректно порахувати дійсний хеш $H(M \mathbin{\Vert} \text{pad} \mathbin{\Vert} M')$ без знання секретного ключа або змісту $M$. Через це проста схема автентифікації вигляду $H(\text{Key} \mathbin{\Vert} \text{Message})$ є вразливою.
  3. Обчислювальне навантаження HMAC: Щоб усунути загрозу подовження, було стандартизовано конструкцію HMAC (RFC 2104). Цей підхід використовує подвійне вкладене хешування:

$$\text{HMAC}(K, M) = H\big((K \oplus \text{opad}) \mathbin{\Vert} H((K \oplus \text{ipad}) \mathbin{\Vert} M)\big)$$

Хоча HMAC захищає від атак подовження, він змушує ядро системи обробляти два додаткові блоки заповнення (ipad та opad) для кожного коду автентифікації. У випадку коротких службових пакетів це призводить до суттєвих непродуктивних витрат процесорного часу.

Архітектура BLAKE2s: 32-бітний ARX та ітераційна схема HAIFA

Створений Жаном-Філіппом Омассоном, Самуелем Невешем, Зуко Вілкокс-О'Хірном та Крістіаном Віннерляйном, алгоритм BLAKE2s оптимізований для 32-бітних процесорів та формує дайджести довжиною до 256 бітів із 512-бітних вхідних блоків.

Каркас HAIFA та захист від атак подовження

На відміну від схеми Меркла — Дамґора, BLAKE2s спирається на ітераційну концепцію HAIFA (HAsh Iterative FrAmework). У кожен цикл стискання додаються чіткі метадані:

  • Лічильник байтів ($t_0, t_1$): 64-бітне ціле число, що фіксує сумарну кількість оброблених корисних байтів до поточного блоку включно.
  • Прапорець завершення ($f_0, f_1$): Службове машинне слово, яке набуває значення 0xFFFFFFFF виключно під час обробки останнього блоку повідомлення.

Функція стискання оперує чотирма параметрами: 256-бітним вектором стану $h$, 512-бітним блоком повідомлення $m$, лічильником зміщення $t$ та прапорцем завершення $f$. Оскільки фінальний блок накладає інвертовану бітову маску на матрицю стискання, отриманий результат неможливо використати як проміжний стан для дописування нових фрагментів. Атаки подовженням виключаються математично, що дозволяє застосовувати BLAKE2s як псевдовипадкову функцію (PRF) та код MAC безпосередньо.

Матриця стану 4x4 та функція Quarter-Round

Внутрішня робоча матриця BLAKE2s складається з 16 слів по 32 біти ($v_0 \dots v_{15}$, разом 512 бітів). Верхні вісім слів містять поточні значення вектора зв'язування $h_0 \dots h_7$, а нижні вісім слів отримують константи ініціалізації (IV), змішані з лічильником байтів та прапорцями завершення:

Індекс рядка Стовпець 0 Стовпець 1 Стовпець 2 Стовпець 3
Рядок 0 $h_0$ $h_1$ $h_2$ $h_3$
Рядок 1 $h_4$ $h_5$ $h_6$ $h_7$
Рядок 2 $IV_0$ $IV_1$ $IV_2$ $IV_3$
Рядок 3 $IV_4 \oplus t_0$ $IV_5 \oplus t_1$ $IV_6 \oplus f_0$ $IV_7 \oplus f_1$

Змішування здійснюється функцією $G$, успадкованою від шифру ChaCha. Працюючи з чотирма словами стану та двома словами повідомлення, $G(a, b, c, d, x, y)$ виконує виключно команди ARX (додавання за модулем $2^{32}$, циклічний зсув бітів та XOR):

$$a \leftarrow a + b + x; \quad d \leftarrow (d \oplus a) \lll 16;$$ $$c \leftarrow c + d; \quad b \leftarrow (b \oplus c) \lll 12;$$ $$a \leftarrow a + b + y; \quad d \leftarrow (d \oplus a) \lll 8;$$ $$c \leftarrow c + d; \quad b \leftarrow (b \oplus c) \lll 7;$$

Алгоритм виконує 10 раундів змішування. У кожному раунді чотири перетворення стовпців змінюються чотирма перетвореннями діагоналей матриці, вибираючи вхідні слова за фіксованими таблицями перестановок $\sigma_0 \dots \sigma_9$. Усі дії виконуються в арифметико-логічному пристрої (ALU) за константний час без звернення до таблиць пам'яті, що виключає витік інформації через процесорний кеш.

Вбудований режим з ключем: Однопрохідний MAC без HMAC

Важливою перевагою BLAKE2s є нативний режим роботи з ключем (Keyed Mode). Якщо функції передається секретний ключ (до 32 байтів), його розмір фіксується у початкових параметрах, а сам ключ записується у перший 512-бітний блок повідомлення з доповненням нулями.

Подальші байти повідомлення проходять через звичайні блоки стискання. Ця однопрохідна структура надає суттєві переваги:

  • Висока криптографічна надійність: Алгоритм працює як повноцінний генератор автентифікаційних міток без потреби у складних схемах HMAC.
  • Економія пам'яті: Обробка ключа здійснюється в загальному потоці даних без перемикання контексту.
  • Двократне прискорення: Для коротких повідомлень (заголовків або токенів cookie) перевірка завершується за один цикл стискання замість серії викликів.

Застосування BLAKE2s у протоколі WireGuard

WireGuard використовує BLAKE2s на кожному критичному етапі функціонування тунелю:

1. Фіксація стенограми рукостискання Noise_IKpsk2

Під час обміну ключами сторони мають гарантувати, що третя сторона не змінила ефемерні відкриті ключі, часові мітки або спільний ключ (PSK). Протокол підтримує дві змінні:

  • Ланцюговий ключ ($ck$): Оновлюється після кожного кроку через механізм HKDF на основі BLAKE2s.
  • Хеш рукостискання ($h$): Накопичувальне значення, що розраховується за формулою $h \leftarrow \text{BLAKE2s}(h \mathbin{\Vert} \text{дані})$. Усі передані параметри змішуються в $h$, забезпечуючи ідентичність запису переговорів на обох кінцях з'єднання.

2. Дворівневий захист від DoS-атак без збереження стану (MAC1 та MAC2)

Шлюзи на межі мережі регулярно зазнають атак підробленими пакетами, метою яких є вичерпання пам'яті та ресурсів CPU. WireGuard додає два 16-байтні поля MAC до кожного службового пакета:

  • MAC1: 128-бітний код автентифікації, що обчислюється від заголовка пакета за допомогою відкритого ключа сервера:

$$\text{MAC1} = \text{BLAKE2s-128}\big(\text{Hash}(\text{PublicKey сервера}), \text{msg}_{0..k}\big)$$

Наявність коректного MAC1 підтверджує, що пакет адресовано саме цьому серверу, дозволяючи ядру відкидати стороннє сміття без виділення пам'яті під нову сесію.

  • MAC2: У разі надмірного навантаження сервер відмовляється виконувати ресурсомісткі скалярні множення Curve25519, доки клієнт не підтвердить запит валідним cookie. Сервер повертає повідомлення із зашифрованим cookie. Клієнт повторно надсилає пакет із полем MAC2, розрахованим від усього вмісту (включно з MAC1) з використанням cookie як ключа:

$$\text{MAC2} = \text{BLAKE2s-128}\big(\text{Cookie}, \text{msg}_{0..k+16}\big)$$

Завдяки мікросекундній швидкості BLAKE2s сервер перевіряє правомірність вхідних запитів без збереження стану, ефективно відбиваючи масовані атаки.

Векторизація SIMD та інфраструктура RiceGuard

Матрична структура BLAKE2s чудово масштабується на сучасних векторних процесорах. Інструкції ARM NEON, Intel AVX2 та AVX-512 здатні обчислювати 4 функції $G$ паралельно за один векторний такт. На серверних вузлах обробка даних здійснюється зі швидкістю менше ніж 3 такти на байт.

У мережевій системі RiceGuard операції хешування виконуються з дотриманням жорстких вимог безпеки:

  • Диспетчеризація черг ядра (padata): Автентифікаційні розрахунки рівномірно розподіляються між процесорними ядрами без порушення вихідного порядку пакетів.
  • Порівняння міток за константний час: Перевірка MAC1 та MAC2 здійснюється функцією crypto_memneq, яка завжди зіставляє всі 16 байтів, запобігаючи витоку інформації за часом виконання.
  • Негайне стирання пам'яті: Проміжні хеші, ланцюгові ключі та тимчасові токени cookie видаляються з оперативної пам'яті одразу після розрахунків функцією memzero_explicit, що виключає їх збереження в кеші або дампах.

Поєднання 32-бітної структури ARX, математичного захисту від атак подовженням та однопрохідної автентифікації робить BLAKE2s надійним криптографічним фундаментом для високонавантажених віртуальних мереж.

Завантажити VPNRice