Files
fgl-aircon/src/ayla/envelope.hpp
Petr Polezhaev e91d4605b1 core(M1): ayla-криптография, конверт, JSON (jsmn), HTTP-клиент
- crypto: KDF Ayla (двойной HMAC, suffix 0x30/31/32; app/dev направления),
  AES-256-CBC с непрерывной цепочкой (iv обновляется mbedtls на месте),
  Java-паддинг >=1 NUL; mode-latch против misuse (encrypt|decrypt);
  zeroize ключей при повторном init; векторы из APK (4 сессии × 4 сообщения,
  включая legacy-приём без NUL) — scripts/gen_kdf_vectors.py.
- envelope: pack/unpack {"enc","sign"}; расшифровка (движение цепочки)
  ДО проверки подписи; сравнение подписи в константном времени;
  extract_seq_no — depth-1 сканер без лимита токенов (OOB после escape
  исправлен, регресс-тесты по ASan-репро ревьюера).
- json: Writer (фикс. буфер, стек глубин, escape, ok()=false при
  переполнении) + Doc на jsmn (64 токена, unescape, overflow-guard).
- httpc: блокирующий POST/PUT для local_reg (статус 200-599, дренаж,
  shutdown перед close).
- third_party/jsmn (MIT, JSMN_STATIC).
- CMake: mbedtls системный (/usr/include/mbedtls3) или FetchContent;
  IDF: PRIV_REQUIRES mbedtls.
- CI: 3 конфигурации — gcc-Release, gcc-Debug+ASan/UBSan, clang-Release;
  6/6 тестов стабильно; ESP-IDF esp32 build complete.
Ревью под-агентом: 3 круга (OOB-блокер + тестовые флаки закрыты), APPROVED.
2026-09-22 15:46:18 +03:00

32 lines
1.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Защищённый конверт Ayla LAN: {"enc":"<b64 AES-CBC>","sign":"<b64 HMAC>"},
// открытый текст: {"seq_no":N,"data":<json-объект>} (docs/PROTOCOL.md §3.3).
#pragma once
#include <cstddef>
#include <cstdint>
#include "ayla/crypto.hpp"
namespace fgl::ayla {
constexpr size_t kEnvelopeMaxPlain = 1024; // открытый текст конверта
constexpr size_t kEnvelopeMaxB64 = 1800; // base64 шифротекста с запасом
// Собирает открытый текст '{"seq_no":<seq>,"data":<data_json>}' и упаковывает
// в конверт (envelope). dir — направление ОТПРАВИТЕЛЯ (app); состояние
// CBC-цепочки направления ДВИГАЕТСЯ. out — строка NUL-terminated.
// data_json — готовый JSON-объект (обычно построен json::Writer).
bool envelope_pack(DirectionCrypto& dir, int64_t seq_no,
const char* data_json, char* out, size_t out_cap);
// Распаковывает конверт (enc_b64/sign_b64 — NUL-terminated) направлением dev:
// расшифровывает (цепочка движется даже при последующей ошибке подписи!),
// проверяет подпись. При успехе json_out содержит ОТКРЫТЫЙ ТЕКСТ
// ('{"seq_no":..,"data":..}') NUL-terminated, seq_no записан в *seq_no.
// Возвращает false при ошибке base64/расшифровки/подписи.
bool envelope_unpack(DirectionCrypto& dir, const char* enc_b64,
const char* sign_b64, char* json_out, size_t out_cap,
int64_t* seq_no);
} // namespace fgl::ayla