DVeProto

DVeProto

DVeProto — протокол распределённого проверяемого шифрования

Server.System company

Протокол шифрования полезной нагрузки поверх WebSocket на базе X25519, HKDF-SHA256 и AES-256-GCM. Общее рукопожатие, компактный бинарный обмен и эталонные реализации для Python и браузера.

Протокол шифрования полезной нагрузки

X25519 · HKDF-SHA256 · AES-256-GCM. 1.5 LTS — финал 1.x (wire 1.4 / ver=0x14). DVeNet/DVeVPN — в 2.0.

spec.json reference.py reference-client.js

Криптография (общая)

Одинакова для wire 1.0–1.4 (на 1.3+ AEAD использует AAD). Меняется формат кадра после рукопожатия. Кадр транспортно-агностичен: сегодня WebSocket, в 2.0 — также UDP/TCP.

  • ECDH — X25519, свежая пара ключей на сессию
  • KDF — HKDF-SHA256, salt пустой; info DVeProto-v1/c2s и DVeProto-v1/s2c
  • AEAD — AES-256-GCM, nonce 12 байт на каждое сообщение
  • Клиент → сервер: ключ c2s. Сервер → клиент: ключ s2c.

Рукопожатие

Всегда UTF-8 JSON, одинаково для обеих версий. Поле v рукопожатия = 1.

  1. Сервер: dve_hello с server_pk, опционально offer: ["1.0"…"1.5"] и caps.
  2. Клиент считает shared secret X25519 и ключи HKDF (или resume из ticket).
  3. Клиент: dve_client_ack с client_pk и select до "1.5", либо resume. Без select → 1.0. select "1.5" ≡ wire 1.4.
  4. Дальше только выбранный wire-формат.
{
  "type": "dve_hello",
  "proto": "DVeProto",
  "v": 1,
  "server_pk": "<base64 32 bytes>",
  "offer": ["1.0", "1.1", "1.2", "1.3", "1.4", "1.5"],
  "caps": 2111
}

{
  "type": "dve_client_ack",
  "proto": "DVeProto",
  "v": 1,
  "client_pk": "<base64 32 bytes>",
  "select": "1.5",
  "caps": 2111
}

Версии

1.0–1.5 LTS — поколение 1.x. 2.0 — отдельная линия (Handshake 2.0 / Wire 2.0).

Package 1.5 LTS — Wire Freeze

reference-1.5.py · reference-1.5.js · reference.py

Финальный релиз поколения 1.x. Binary wire = 1.4 (ver=0x14). select "1.5" — LTS-метка того же кадра.

  • Wire Format Freeze: макет кадра и карта ptype заморожены; изменения — только в 2.x
  • Session Ticket Store + auto Resume; Production API: send / receive / stats / close / rekey
  • Security limits: max frame/lifetime, soft idle, replay window, ticket TTL clamp
  • Векторы: test_vectors.json · smoke: interop_smoke.py
select "1.5"  ≡  wire 1.4 / ver=0x14
package       =  1.5 LTS
next major    =  2.0 (DVeNet / DVeVPN / UDP+TCP)

DVeProto 1.5 LTS is the final release of the first-generation
transport protocol. Future network-layer features are developed
in DVeProto 2.x.

Эталонный код

Референс-реализации в этой же папке — без привязки к конкретному продукту.

Python

  • DVeClientSession.from_server_hello_text → session + ack JSON
  • pack_outgoing / unpack_incomingstr (1.0) или bytes (1.1/1.2)
  • Хелперы pack_file_* · pip install cryptography
session, ack = DVeClientSession.from_server_hello_text(hello_text, prefer="1.5")
frame = session.pack_outgoing({"dve_op": "ping"})
print(session.stats())

Браузер (ESM)

  • dveDeveloperHandshake{ session, clientAckJson, wire }
  • Для 1.1–1.3 encryptOutgoingUint8Array
import { dveDeveloperHandshake } from './reference-client.js';
const { session, clientAckJson, wire } = await dveDeveloperHandshake(hello);
const out = await session.encryptOutgoing({ dve_op: 'ping' });

Конвенция APP_JSON

  • dve_op — имя операции / RPC
  • dve_seq — опциональный монотонный счётчик (DVeSeq)

DVeProto 1.5 LTS is the final release of the first-generation transport protocol. Future network-layer features are developed in DVeProto 2.x.

Совместимость

Клиенты без select работают на 1.0. Выбирается высший общий wire (до 1.4). 1.5 LTS — тот же binary, что 1.4; после LTS wire 1.x замораживается.

Security Considerations

  • Nonce 1.3+: prefix(4)||counter u64 — без повторного (key, nonce); переполнение → закрытие сессии.
  • pkt_seq в AAD (1.4); дубликаты/окно — на усмотрение реализации, без reuse nonce.
  • SESSION_TICKET TTL по умолчанию 24ч; привязка к identity; expired/bad → dve_resume_reject.
  • AEAD + counter nonce ограничивают replay; после Resume ключи новые (resume HKDF).
  • Клиенты, требующие 1.4+, обязаны прервать сессию при более низком select.

Тестовые векторы: test_vectors.json · gen_test_vectors.py.