119 lines
4.2 KiB
Protocol Buffer
119 lines
4.2 KiB
Protocol Buffer
// Protobuf схема для Hidden Services
|
||
// Файл: protos/hidden_service.proto
|
||
// Версия: 1.0
|
||
// Дата: 23 ноября 2025
|
||
|
||
syntax = "proto3";
|
||
|
||
package phantom;
|
||
|
||
// Дескриптор сервиса - публикуется в DHT
|
||
message ServiceDescriptor {
|
||
// Публичный ключ сервиса (Ed25519, 32 байта)
|
||
// Используется для проверки подписи и генерации .phantom адреса
|
||
bytes public_key = 1;
|
||
|
||
// Список точек входа (Introduction Points)
|
||
// Рекомендуется 3-5 точек для надежности
|
||
repeated IntroductionPoint introduction_points = 2;
|
||
|
||
// Версия протокола (текущая: 1)
|
||
uint32 protocol_version = 3;
|
||
|
||
// Временная метка создания (Unix timestamp в секундах)
|
||
// Используется для определения свежести дескриптора
|
||
uint64 timestamp = 4;
|
||
|
||
// Подпись всех полей выше (Ed25519)
|
||
// signature = Ed25519_sign(identity_key, serialize(public_key, introduction_points, protocol_version, timestamp))
|
||
bytes signature = 5;
|
||
|
||
// TTL (Time To Live) в секундах
|
||
// Рекомендуется 3600 (1 час)
|
||
uint32 ttl = 6;
|
||
}
|
||
|
||
// Точка входа (Introduction Point)
|
||
message IntroductionPoint {
|
||
// Фантомный адрес узла (32 байта)
|
||
bytes address = 1;
|
||
|
||
// Публичный ключ для шифрования сообщений от клиента (X25519, 32 байта)
|
||
// Используется для шифрования Introduce1
|
||
bytes encryption_key = 2;
|
||
|
||
// Порт (опционально, если используется)
|
||
uint32 port = 3;
|
||
}
|
||
|
||
// Сообщение о рандеву от клиента к точке входа
|
||
// Зашифровано для публичного ключа сервиса
|
||
message Introduce1 {
|
||
// Фантомный адрес точки рандеву (32 байта)
|
||
bytes rendezvous_address = 1;
|
||
|
||
// Одноразовый секрет (cookie, 32 байта)
|
||
// Генерируется клиентом случайным образом
|
||
bytes rendezvous_cookie = 2;
|
||
|
||
// Публичный ключ клиента для DH-обмена (X25519, 32 байта)
|
||
// Используется для установки сквозного шифрования
|
||
bytes client_dh_public_key = 3;
|
||
|
||
// Временная метка создания (Unix timestamp)
|
||
uint64 timestamp = 4;
|
||
|
||
// Proof-of-work (опционально, для защиты от DoS)
|
||
// Формат: nonce, который при хэшировании с другими полями дает N нулевых бит
|
||
bytes proof_of_work = 5;
|
||
}
|
||
|
||
// Сообщение от сервиса к точке рандеву
|
||
message Rendezvous1 {
|
||
// Тот же одноразовый секрет, что и в Introduce1
|
||
bytes rendezvous_cookie = 1;
|
||
|
||
// Публичный ключ сервиса для DH-обмена (X25519, 32 байта)
|
||
bytes service_dh_public_key = 2;
|
||
|
||
// Временная метка создания (Unix timestamp)
|
||
uint64 timestamp = 3;
|
||
}
|
||
|
||
// Подтверждение от точки рандеву клиенту
|
||
message RendezvousEstablished {
|
||
// Статус установки соединения
|
||
enum Status {
|
||
SUCCESS = 0;
|
||
TIMEOUT = 1;
|
||
INVALID_COOKIE = 2;
|
||
}
|
||
|
||
Status status = 1;
|
||
|
||
// Публичный ключ сервиса для DH-обмена (если успешно)
|
||
bytes service_dh_public_key = 2;
|
||
}
|
||
|
||
// Запрос дескриптора из DHT
|
||
message GetServiceDescriptor {
|
||
// Хэш публичного ключа сервиса (32 байта)
|
||
// Вычисляется из .phantom адреса
|
||
bytes service_id = 1;
|
||
}
|
||
|
||
// Ответ с дескриптором из DHT
|
||
message ServiceDescriptorResponse {
|
||
// Статус запроса
|
||
enum Status {
|
||
FOUND = 0;
|
||
NOT_FOUND = 1;
|
||
EXPIRED = 2;
|
||
}
|
||
|
||
Status status = 1;
|
||
|
||
// Дескриптор (если найден)
|
||
ServiceDescriptor descriptor = 2;
|
||
}
|