Слепо подписанные ваучеры и анонимные данные доступа
Проверенное описание VPN voucher и Blind Vault RFC 9474 admission с границами rollout, replay, issuer и приватности.
AeroNyx применяет blind signature в двух разных путях авторизации. Оба уменьшают identity linkage, но имеют разные rollout и replay guarantees. Здесь зафиксированы Rust main, deployment-controlled возможности и запрещённые выводы из credential.
Два пути credentials
VPN авторизует ClientHello finalized blind-signature credential. Blind Vault V2 создаёт random self-authenticating lease через RFC 9474. V1 — linkable one-time bearer для совместимости, не blind issuance.
| Путь | Текущее состояние | Replay/redemption |
|---|---|---|
| VPN ClientHello voucher | Реализовано; совместимый reject_invalid rollout | Нет one-time spend в VoucherVerifier |
| Blind Vault V2 admission | Реализовано в Rust; deployment controlled | Atomic spend и идемпотентный exact retry |
| Blind Vault V1 admission | Только совместимость; для нового V2 | Atomic spend, но issuance linkable |
Инвариант приватности
Цель — авторизация без передачи issuance identity redeeming node. Signer, entitlement backend, storage node и console остаются отдельными boundaries; объединение request-level records уничтожает unlinkability.
- Node проверяет права без wallet/account identity.
- Signer получает blinded bytes и key ID, не entitlement identity.
- Secrets, tokens, randomizers, spend/lease IDs и private keys не логируются.
- Aggregate counters не соединяются с per-user traffic.
- Это не wallet blind signing неизвестной transaction.
Voucher VPN handshake
Client отправляет bounded AVCH extension. Rust разбирает только fields, получает public key по epoch, кеширует час и проверяет randomized SHA-384 RSA-PSS без wallet/account ID.
ClientHello fixed frame
+ magic: AVCH
+ voucher_length: u16 little-endian
+ voucher JSON (maximum 2048 bytes)
{
"token": "base64-final-credential-message",
"signature": "base64-finalized-blind-signature",
"msg_randomizer": "base64-32-byte-randomizer",
"epoch": "issuer-key-epoch"
}
Flow является blind только если client ослепляет message до подписи. Обычная подпись identity-linked token не эквивалентна. Token, signature, randomizer, epoch — bearer secrets и не логируются.
Текущая граница rollout VPN
VPN работает в reject_invalid: malformed/invalid отклоняются, missing временно принимается для миграции старых clients. Это не mandatory enforcement.
mode = reject_invalid
valid | invalid | missing | malformed | total
valid_ratio | invalid_ratio | missing_ratio | malformed_ratio
last_observation | last_error
VoucherVerifier проверяет и агрегирует, но не делает atomic spend VPN token. Node one-time redemption отсутствует; sharing, replay, quota, expiry требуют versioned contract.
Blind Vault V2 admission
Blind Vault V2 получает node-signed epochs, blind RFC 9474 message, signature из isolated issuer, finalize локально и вызывает /api/vault/v1/lease. API работает только при включённом Blind Vault и pinned issuers.
GET /api/vault/v1/issuers
POST /api/vault/v1/lease
POST /api/vault/v1/put
POST /api/vault/v1/pull
POST /api/vault/v1/delete
Content-Type: application/vnd.aeronyx.blind-vault-v1
client blinds RFC 9474 admission message
-> entitlement backend authorizes issuance
-> isolated blind issuer signs blinded bytes only
-> client finalizes signature
-> node verifies active public epoch
-> atomic spend marker + random self-authenticating lease
-> ciphertext storage operations use lease-scoped keys/capabilities
Изоляция issuer и ротация ключей
Private operation находится в aeronyx-blind-issuer и получает version, public fingerprint, bounded blinded RSA bytes. Нет account model, storage DB, redemption visibility; custody interface подходит software и будущим HSM/KMS.
Epoch содержит canonical DER, SHA-256 key ID, validity и max lease TTL. Update требует отдельную pinned authority, monotonic generation, continuity и atomic persistence; rollback fail closed.
Atomic spend, идемпотентность и replay
V2 проверяет credential и commit spend ID плюс lease в одной immediate SQLite transaction. Spent credential не создаёт второй lease; exact retry идемпотентен.
V1/V2 используют общую spend table, но schemes разделены: V1 raw ticket linkable, V2 spend ID unlinkable. Эта replay protection не относится к VPN verifier.
Наблюдаемость и Nodeboard
Nodeboard показывает только aggregate validity, capacity, signer health и coarse buckets. Нельзя добавлять token, wallet, lease, request или per-user dimensions.
Разрешённые агрегаты:
- VPN
valid,invalid,missing,malformedtotals/ratios - issuer key, reload, capacity, rate, timeout, circuit counters
- Blind Vault aggregate leases, objects, bytes, expiry, cleanup
- mode, epoch availability, last observation, privacy boundary
Никогда не раскрывать:
- tokens, signatures, randomizers, blinded messages, spend IDs
- wallet, account, payment, membership, social identity
- per-user history, lease/object/capability/request IDs
- client IP, destination, DNS, route, message, browsing metadata
- private keys, provider errors, ciphertext, plaintext, wallet traffic
Угрозы и ограничения
Blind signature снижает linkage, но не timing, region, capacity, client compromise, issuer collection, theft, collusion и traffic correlation; нужны blind relay, encryption, bounded logs и separation.
- корреляция issuer collection и redemption timing
- theft, sharing, resale, client compromise
- VPN replay до versioned policy
- collusion issuer/backend/node/operator
- timing, region, capacity, traffic correlation
- key rollback или broken continuity
- aggregate telemetry превращается в per-user history
Карта исходного кода
Source разделён на VPN verification, signing, wire contracts, Blind Vault admission/API/config и reporting. Ownership boundaries намеренны.
| Слой | Путь репозитория | Роль |
|---|---|---|
| VPN verifier | crates/aeronyx-server/src/voucher_verifier.rs | Parse AVCH, discovery epochs, verify voucher, rollout metrics. |
| Blind signer | crates/aeronyx-blind-issuer/src/signer.rs | Identity-free RSA policy и custody abstraction. |
| Issuer API | crates/aeronyx-blind-issuer/src/api.rs | Authenticated bounded signing, epochs, pressure, health. |
| Wire contracts | crates/aeronyx-core/src/protocol/blind_vault.rs | RFC 9474 contracts, epochs, spend IDs, frames, signatures. |
| Blind Vault service | crates/aeronyx-server/src/services/blind_vault.rs | V1/V2 admission и atomic spend+lease. |
| Blind Vault API | crates/aeronyx-server/src/api/blind_vault.rs | Issuers/lease/put/pull/delete routes и coarse errors. |
| Blind Vault config | crates/aeronyx-server/src/config_blind_vault.rs | Pinned issuers/authority, TTL, monotonic rotation. |
| Health/reporting | crates/aeronyx-server/src/api/vpn_health.rs and management/reporter.rs | Aggregate status без secrets и wallet traffic. |
Правила разработки
Изменение завершено, когда crypto semantics, rollout, spend, observability, tests и языки совпадают. Лучше узкое правдивое утверждение.
- Разделять VPN и Blind Vault в names/code/telemetry/docs.
- Не заявлять mandatory VPN при accepted missing.
- Не заявлять one-time VPN без atomic spend.
- Не добавлять в signer account/wallet/lease/node/redemption context.
- Сохранять continuity, authority fail-closed и atomicity.
- Только aggregate health, без credential/identity dimensions.
- Обновлять tests, Nodeboard и переводы при изменении semantics.