SPS3: Poly1305-Einmal-MAC + Public-Ready README/LICENSE
Authentifizierung für CLI und Web: - Poly1305 (RFC 8439) pur in Python (bigint) und JS (BigInt), keine neue Dependency - MAC-Schluessel pro Nachricht frisch aus dem Pad (len+32), encrypt-then-MAC ueber Header + Ciphertext; reveal lehnt manipulierte/desynchrone Bilder hart ab - Stego-Format SPS2 -> SPS3 (16-B-Tag im Header); alte SPS2-Bilder werden noch gelesen, aber als unauthentifiziert markiert - Service-Worker-Cache auf v3 gebumpt - Interop-Runner (web/_interop_run.sh): RFC-Vektor cross-impl, beide Richtungen, Tamper-Erkennung README fuer Public ueberarbeitet (ehrliches Bedrohungsmodell, Voraussetzungen, Projektstruktur, Tests) + MIT-LICENSE. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
44
web/_interop_run.sh
Executable file
44
web/_interop_run.sh
Executable file
@@ -0,0 +1,44 @@
|
||||
#!/usr/bin/env bash
|
||||
# Reproduzierbarer Interop-Test CLI <-> Web-Core (SPS3 / Poly1305).
|
||||
# Erzeugt frische Test-Schlüssel, fährt beide Senderichtungen durch und prüft,
|
||||
# dass CLI und Browser-Core byte-genau dasselbe Format sprechen — inkl. MAC.
|
||||
set -euo pipefail
|
||||
cd "$(dirname "$0")/.." # Repo-Wurzel
|
||||
PY=${PYTHON:-python3}
|
||||
|
||||
echo "== Setup: frische, richtungsgetrennte Schlüssel =="
|
||||
$PY schattenpost.py genkey -o t2/rel -s 100000 --force >/dev/null
|
||||
$PY web/_interop_rawrgb.py mkcarrier web/_carrier.png 200 200 >/dev/null
|
||||
|
||||
echo "== A) CLI verschlüsselt+authentifiziert -> Bild =="
|
||||
$PY schattenpost.py hide -t "MsgA vom CLI 🕵️" \
|
||||
-k t2/rel_meine_seite/send.key -c web/_carrier.png -o web/_a.png >/dev/null
|
||||
$PY web/_interop_rawrgb.py png2rgb web/_a.png web/_a_rgb.bin >/dev/null
|
||||
|
||||
echo "== B) Trägerbild als rohes RGB für den Web-Core bereitstellen =="
|
||||
$PY web/_interop_rawrgb.py png2rgb web/_carrier.png web/_b_rgb.bin > web/_b_dims.txt
|
||||
|
||||
echo "== Web-Core: A verifizieren, B einbetten =="
|
||||
node web/_interop_test.mjs
|
||||
|
||||
echo "== B) Web-Ausgabe zurück nach PNG, vom CLI aufdecken+prüfen =="
|
||||
read -r W H < web/_b_dims.txt
|
||||
$PY web/_interop_rawrgb.py rgb2png web/_b_out_rgb.bin "$W" "$H" web/_b_stego.png >/dev/null
|
||||
OUT=$($PY schattenpost.py reveal -s web/_b_stego.png -k t2/rel_meine_seite/recv.key)
|
||||
echo " CLI reveal: $OUT"
|
||||
if [ "$OUT" = "MsgB aus dem Browser-Core 🌐" ]; then
|
||||
echo " ✓ B round-trip (Web→CLI) inkl. MAC-Prüfung ok"
|
||||
else
|
||||
echo " ✗ B mismatch"; exit 1
|
||||
fi
|
||||
|
||||
echo "== Poly1305 Python-Seite gegen RFC-8439-Vektor =="
|
||||
$PY - <<'PYEOF'
|
||||
import schattenpost as sp
|
||||
key = bytes.fromhex('85d6be7857556d337f4452fe42d506a80103808afb0db2fd4abff6af4149f51b')
|
||||
tag = sp.poly1305_mac(b'Cryptographic Forum Research Group', key)
|
||||
assert tag.hex() == 'a8061dc1305136c6c22b8baf0c0127a9', tag.hex()
|
||||
print(' ✓ Python-Poly1305 matcht RFC-Vektor')
|
||||
PYEOF
|
||||
|
||||
echo "== Alles grün =="
|
||||
Reference in New Issue
Block a user