Project scaffold (uv, pyproject.toml CalVer 2026.5.10, ruff, pytest, mypy
strict config, MIT, README, .gitignore protecting any .pca / panel keys).
Library primitives (src/omni_pca/):
- crypto.py AES-128-ECB + per-block XOR seq pre-whitening, session-key
derivation (CK[0:11] || (CK[11:16] XOR SessionID))
- opcodes.py Byte-exact PacketType (12), v1 MessageType (104),
v2 MessageType (83), ConnectionType, ProtocolVersion
- packet.py Outer Packet dataclass with encode/decode
- message.py Inner Message + CRC-16/MODBUS, helpers for v1/v2
- pca_file.py Borland LCG XOR cipher, PcaReader, .pca + .CFG parsers
(KEY_PC01 = 0x14326573, KEY_EXPORT = 0x17569237 — fixed
from initial typo; verified via test_keys_match_decompiled)
- __main__.py CLI: 'omni-pca decode-pca <file> --field {host,port,...}'
PII opt-in via --include-pii
49 tests pass, 1 skipped (live fixture). Ruff clean.
42 lines
459 B
Plaintext
42 lines
459 B
Plaintext
# Python
|
|
__pycache__/
|
|
*.pyc
|
|
*.pyo
|
|
*.egg-info/
|
|
.venv/
|
|
.uv-cache/
|
|
build/
|
|
dist/
|
|
.coverage
|
|
.coverage.*
|
|
htmlcov/
|
|
.pytest_cache/
|
|
.mypy_cache/
|
|
.ruff_cache/
|
|
|
|
# IDE
|
|
.vscode/
|
|
.idea/
|
|
*.swp
|
|
|
|
# OS
|
|
.DS_Store
|
|
._*
|
|
|
|
# Sensitive — never commit panel-specific data
|
|
**/Our*.pca*
|
|
**/PCA01.CFG*
|
|
**/Serial Number*
|
|
**/Serial_Number*
|
|
*.plain
|
|
*.decrypted
|
|
*.plaintext
|
|
**/secrets.yaml
|
|
**/.env
|
|
**/.env.local
|
|
controller_key*
|
|
panel_key*
|
|
|
|
# Wine artifacts (if used for testing)
|
|
.wine-pca/
|