#!/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 =="