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.
This commit is contained in:
31
src/ayla/envelope.hpp
Normal file
31
src/ayla/envelope.hpp
Normal file
@@ -0,0 +1,31 @@
|
||||
// Защищённый конверт 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
|
||||
Reference in New Issue
Block a user