- Add 12-02-SUMMARY.md with execution results - Update STATE.md: Phase 12 complete, 15/15 plans done - Update ROADMAP.md: Phase 12 progress to complete - Mark KEY-03, KEY-04, KEY-05, KEY-06 requirements complete Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
11 KiB
11 KiB
Requirements: Encrypted Archive
Defined: 2026-02-24 Core Value: Архив невозможно распаковать без знания формата — стандартные утилиты не распознают содержимое
v1.0 Requirements (Complete)
Format (Бинарный формат)
- FMT-01: Кастомный бинарный формат с нестандартными magic bytes (не распознаётся binwalk/file/7z)
- FMT-02: Поле версии формата (1 байт) для forward compatibility
- FMT-03: Таблица файлов с метаданными: имя файла, original size, compressed size, encrypted size, offset, IV, HMAC
- FMT-04: Little-endian для всех multi-byte полей
- FMT-05: Спецификация формата как документ (до начала реализации)
- FMT-06: XOR-обфускация заголовков с фиксированным ключом
- FMT-07: Зашифрованная таблица файлов (отдельный IV)
- FMT-08: Decoy padding (случайные данные между блоками)
Encryption (Шифрование)
- ENC-01: AES-256-CBC шифрование каждого файла отдельно
- ENC-02: HMAC-SHA256 аутентификация (encrypt-then-MAC) для каждого файла
- ENC-03: Случайный 16-байтный IV для каждого файла, хранится в cleartext
- ENC-04: Зашитый 32-байтный ключ (hardcoded во всех декодерах)
- ENC-05: PKCS7 padding для AES-CBC
Compression (Сжатие)
- CMP-01: Gzip (DEFLATE) сжатие каждого файла перед шифрованием
- CMP-02: Per-file флаг: сжатие или raw (пропуск для уже сжатых файлов типа APK)
Integrity (Целостность)
- INT-01: SHA-256 чексумма для каждого файла (верификация после декомпрессии)
- INT-02: Распакованные файлы byte-identical оригиналам (round-trip fidelity)
CLI Archiver (Архиватор)
- CLI-01: Rust CLI утилита для создания архивов (Linux/macOS)
- CLI-02: Упаковка нескольких файлов (тексты + APK) в один архив
- CLI-03: Подкоманды: pack, unpack (для тестирования), inspect (для отладки)
Kotlin Decoder (Kotlin декодер)
- KOT-01: Kotlin-код деархивации на Android 13 без native-библиотек
- KOT-02: Использование javax.crypto (AES/CBC/PKCS5Padding) и java.util.zip.GZIPInputStream
- KOT-03: Верификация HMAC перед дешифровкой
- KOT-04: Верификация SHA-256 чексуммы после декомпрессии
Shell Decoder (Shell декодер)
- SHL-01: Shell-скрипт деархивации через busybox (dd, xxd, openssl, gunzip)
- SHL-02: openssl enc -aes-256-cbc с -K/-iv/-nosalt для raw key mode
- SHL-03: Поддержка файлов с не-ASCII именами (кириллица)
Testing (Тестирование)
- TST-01: Round-trip тесты: архивация Rust → деархивация Rust
- TST-02: Golden test vectors: известный plaintext/key/IV → ожидаемый ciphertext
- TST-03: Базовые unit-тесты для каждого модуля pipeline
v1.1 Requirements
Format (Бинарный формат)
- FMT-09: Тип записи в TOC entry (файл/директория) — 1 байт
- FMT-10: Unix permission bits (mode) в TOC entry — 2 байта (u16)
- FMT-11: Относительные пути с
/разделителем вместо filename-only - FMT-12: Обновлённая спецификация FORMAT.md с новыми полями
Directory (Поддержка директорий)
- DIR-01:
packрекурсивно обходит директории и добавляет все файлы - DIR-02: Относительные пути сохраняются при архивации (dir/subdir/file.txt)
- DIR-03: Пустые директории сохраняются как записи типа "directory" в TOC
- DIR-04:
unpackсоздаёт полную иерархию директорий - DIR-05:
unpackвосстанавливает Unix mode bits для файлов и директорий
Kotlin Decoder
- KOT-05: Парсинг нового TOC с типом записи и permissions
- KOT-06: Создание иерархии директорий при извлечении
- KOT-07: Установка permissions (File.setReadable/setWritable/setExecutable)
Shell Decoder
- SHL-04: Парсинг нового TOC с типом записи и permissions
- SHL-05: mkdir -p для иерархии и пустых директорий
- SHL-06: chmod для восстановления permissions
Testing
- TST-04: Round-trip с вложенными директориями (3+ уровня)
- TST-05: Round-trip с пустыми директориями
- TST-06: Проверка сохранения mode bits
- TST-07: Cross-validation: Rust archive → Kotlin/Shell decode с директориями
v1.2 Requirements
User Key Input (Пользовательский ввод ключа)
- KEY-01: CLI аргумент
--key <HEX>— 64 символа hex, декодируется в 32-байтный AES-256 ключ - KEY-02: CLI аргумент
--key-file <PATH>— чтение ровно 32 байт из файла как raw ключ - KEY-03: CLI аргумент
--password [VALUE]— интерактивный промпт (rpassword) или значение из CLI - KEY-04: Argon2id KDF — деривация 32-байтного ключа из пароля + 16-байтный random salt
- KEY-05: Хранение salt в архиве — flags bit 4 (0x10), 16-байтный salt между header и TOC при pack
- KEY-06: Чтение salt из архива при unpack/inspect — автоматическое определение по flags bit 4
- KEY-07: Один из
--key,--key-file,--passwordобязателен для pack/unpack; inspect принимает ключ опционально
Future Requirements
Расширенная обфускация
- OBF-01: Shuffled blocks (хранение блоков в случайном порядке с scramble map)
- OBF-02: Fake headers (имитация JPEG/PNG для ввода в заблуждение анализаторов)
UX
- UX-01: Progress reporting для больших архивов
- UX-02: Dry-run / validation mode (проверка без извлечения)
- UX-03: Configurable compression level
Security
- SEC-01: Per-file derived keys (HKDF от master key + file index)
- SEC-02: Обфускация ключа в Kotlin APK (byte array + split hex в shell)
Out of Scope
| Feature | Reason |
|---|---|
| GUI-интерфейс | CLI достаточен для разработчика |
| Windows-поддержка | Только Linux/macOS, WSL для Windows |
| Streaming/pipe | Файлы помещаются в память целиком |
| Вложенные архивы | Плоский список файлов |
| Асимметричное шифрование | Избыточно для hardcoded key модели |
| Self-extracting архивы | Shell-скрипт — отдельный файл |
| DRM / лицензирование | Не цель проекта |
| Дедупликация файлов | Разные файлы, нет дублей |
| Симлинки и хардлинки | Только файлы и директории |
| uid/gid и timestamps | Только mode bits — достаточно для target use case |
| Обратная совместимость с v1.0 | Формат меняется, старые архивы не поддерживаются |
Traceability
| Requirement | Phase | Status |
|---|---|---|
| FMT-01 | Phase 2 | Complete |
| FMT-02 | Phase 2 | Complete |
| FMT-03 | Phase 2 | Complete |
| FMT-04 | Phase 2 | Complete |
| FMT-05 | Phase 1 | Complete |
| FMT-06 | Phase 6 | Complete |
| FMT-07 | Phase 6 | Complete |
| FMT-08 | Phase 6 | Complete |
| ENC-01 | Phase 2 | Complete |
| ENC-02 | Phase 2 | Complete |
| ENC-03 | Phase 2 | Complete |
| ENC-04 | Phase 2 | Complete |
| ENC-05 | Phase 2 | Complete |
| CMP-01 | Phase 2 | Complete |
| CMP-02 | Phase 2 | Complete |
| INT-01 | Phase 2 | Complete |
| INT-02 | Phase 3 | Complete |
| CLI-01 | Phase 2 | Complete |
| CLI-02 | Phase 2 | Complete |
| CLI-03 | Phase 2 | Complete |
| KOT-01 | Phase 4 | Complete |
| KOT-02 | Phase 4 | Complete |
| KOT-03 | Phase 4 | Complete |
| KOT-04 | Phase 4 | Complete |
| SHL-01 | Phase 5 | Complete |
| SHL-02 | Phase 5 | Complete |
| SHL-03 | Phase 5 | Complete |
| TST-01 | Phase 3 | Complete |
| TST-02 | Phase 3 | Complete |
| TST-03 | Phase 3 | Complete |
| FMT-09 | Phase 7 | Complete |
| FMT-10 | Phase 7 | Complete |
| FMT-11 | Phase 7 | Complete |
| FMT-12 | Phase 7 | Complete |
| DIR-01 | Phase 8 | Complete |
| DIR-02 | Phase 8 | Complete |
| DIR-03 | Phase 8 | Complete |
| DIR-04 | Phase 8 | Complete |
| DIR-05 | Phase 8 | Complete |
| KOT-05 | Phase 9 | Complete |
| KOT-06 | Phase 9 | Complete |
| KOT-07 | Phase 9 | Complete |
| SHL-04 | Phase 10 | Pending |
| SHL-05 | Phase 10 | Pending |
| SHL-06 | Phase 10 | Pending |
| TST-04 | Phase 11 | Pending |
| TST-05 | Phase 11 | Pending |
| TST-06 | Phase 11 | Pending |
| TST-07 | Phase 11 | Pending |
| KEY-01 | Phase 12 | Complete |
| KEY-02 | Phase 12 | Complete |
| KEY-03 | Phase 12 | Complete |
| KEY-04 | Phase 12 | Complete |
| KEY-05 | Phase 12 | Complete |
| KEY-06 | Phase 12 | Complete |
| KEY-07 | Phase 12 | Complete |
Coverage:
- v1.0 requirements: 30 total -- all Complete
- v1.1 requirements: 19 total -- all mapped to phases 7-11
- v1.2 requirements: 7 total -- all mapped to phase 12
- Mapped to phases: 26/26
- Unmapped: 0
Requirements defined: 2026-02-24 Last updated: 2026-02-26 after Phase 12 requirements added (KEY-01 to KEY-07)