syntax = "proto3";

package bridge_and_joins.crypto.v1;

option go_package    = "git.zetit.ru/zuevav/Bridge-and-Join-s/internal/cryptocli/cryptopb;cryptopb";
option java_package  = "ru.zetit.bridgeandjoins.crypto.v1";
option java_multiple_files = true;

// CryptoService — серверная криптография по ГОСТ через КриптоПро JCP.
// Слушает на Unix Domain Socket (по умолчанию /run/bj/crypto.sock).
service CryptoService {
  // Проверка XMLDSig-подписи (ГОСТ или RSA). Возвращает сведения о
  // подписанте: CN, ИНН (если есть), срок действия сертификата.
  rpc VerifyXMLDSig(VerifyRequest) returns (VerifyResponse);

  // Подпись XML по ГОСТ — для резервного канала WS ONYX и для
  // серверной подписи действий оператора в admin-ui.
  rpc SignXMLDSig(SignRequest) returns (SignResponse);

  // Health-check.
  rpc Health(HealthRequest) returns (HealthResponse);

  // Activate — переинициализирует провайдер Валидаты на указанный
  // профиль из pki1.conf. Если profile пуст — переходит в
  // VCERT_InitMinimal (без доступа к ПСП/ЛСП/ССС). Не требует
  // перезапуска сайдкара.
  rpc Activate(ActivateRequest) returns (ActivateResponse);

  // Shutdown — корректно завершает процесс сайдкара (System.exit(2)
  // после отправки ответа). systemd с Restart=on-failure поднимет
  // его снова через RestartSec секунд. Используется для UI-кнопки
  // «Перезапустить crypto-service» без sudo.
  rpc Shutdown(ShutdownRequest) returns (ShutdownResponse);
}

message ActivateRequest {
  // Имя профиля в pki1.conf. Пустая строка = minimal mode.
  string profile = 1;
}

message ActivateResponse {
  // true если провайдер успешно (пере)инициализирован.
  bool ok = 1;
  // Имя активного провайдера ("validata" / "stub").
  string provider = 2;
  // Имя активного профиля (пусто для minimal).
  string profile = 3;
  // Сообщение о результате (для UI).
  string message = 4;
}

message ShutdownRequest {}

message ShutdownResponse {
  // true означает «запрос принят, процесс завершится через ~500ms».
  bool ok = 1;
}

message VerifyRequest {
  // Целиком подписанный XML.
  bytes payload = 1;

  // Профиль ключей и сертификатов: "guest-gost" | "test3-gost" |
  // "prod-gost" | "guest-rsa" | ... — определяет хранилище и trust store.
  string profile = 2;
}

message VerifyResponse {
  // Прошла ли проверка.
  bool valid = 1;

  // CN из сертификата подписанта.
  string signer_cn = 2;

  // ИНН из сертификата (если присутствует в OID 1.2.643.3.131.1.1).
  string signer_inn = 3;

  // Серийный номер сертификата (hex).
  string serial = 4;

  // Срок действия сертификата (unix epoch, секунды).
  int64 not_before = 5;
  int64 not_after  = 6;

  // Тексты ошибок проверки (если valid=false).
  repeated string errors = 7;
}

message SignRequest {
  // Канонизированный XML, который нужно подписать.
  bytes payload = 1;

  // Алиас ключа в JCP-keystore.
  string key_alias = 2;

  // Профиль (тот же что у Verify).
  string profile = 3;
}

message SignResponse {
  // Подписанный XML (с детачированной или встроенной подписью —
  // зависит от профиля).
  bytes signed_xml = 1;
}

message HealthRequest {}

message HealthResponse {
  bool ok = 1;
  string version = 2;
  // Активный провайдер криптографии: "cryptopro" | "validata" | "vipnet" | "stub".
  string provider = 3;
}
