fix(tools): SignError statt roher ValueError bei kaputtem Schluesselmaterial
nl_sign.py verify/sign gaben bei syntaktisch ungueltigem --pub/--key-Inhalt (falsches DER/PEM-Format) bisher eine unbehandelte ValueError (pycryptodome teils IndexError/TypeError) an den Aufrufer durch - die CLI brach dadurch mit Python-Traceback ab statt mit der vorgesehenen "error: ..."-Meldung und Exitcode 1. Beide Backends (cryptography und pycryptodome/pycryptodomex) kapseln das Einlesen des privaten wie des oeffentlichen Schluessels jetzt in try/except und werfen SignError mit einer festen, schluesselinhaltsfreien Meldung (via "from None", damit die urspruengliche Bibliotheksausnahme nicht implizit mitgeschleppt wird). Ein ungueltiger Schluessel kann dadurch nie zu verify_image() == True fuehren. Vier neue Tests in test_nl_sign.py: je ein Modul- und CLI-Test fuer kaputtes --pub und kaputtes --key, die SignError bzw. Exitcode != 0 ohne Traceback auf stderr festnageln.
This commit is contained in:
@@ -84,3 +84,49 @@ def test_refuses_already_signed_looking_input(key, tmp_path):
|
||||
raw = b"\x00" * 1024 + b"NINL" + b"\x01" + b"\x00" * 507
|
||||
with pytest.raises(nl_sign.SignError):
|
||||
nl_sign.sign_image(raw, key.private_pem)
|
||||
|
||||
|
||||
def test_verify_rejects_garbage_pub_key(key):
|
||||
"""Ein kaputter --pub-Inhalt (kein gueltiges DER/PEM) muss als SignError gemeldet
|
||||
werden, nicht als roher ValueError/Traceback - und darf niemals True ergeben."""
|
||||
raw = b"x" * 1024
|
||||
signed = nl_sign.sign_image(raw, key.private_pem)
|
||||
with pytest.raises(nl_sign.SignError):
|
||||
nl_sign.verify_image(signed, b"das ist definitiv kein Schluessel")
|
||||
|
||||
|
||||
def test_sign_rejects_garbage_private_key():
|
||||
"""Ein kaputter --key-Inhalt muss ebenso als SignError gemeldet werden."""
|
||||
raw = b"x" * 1024
|
||||
with pytest.raises(nl_sign.SignError):
|
||||
nl_sign.sign_image(raw, b"das ist definitiv kein Schluessel")
|
||||
|
||||
|
||||
def test_cli_verify_rejects_garbage_pub_key(key, tmp_path):
|
||||
src = tmp_path / "in_gz.img"
|
||||
dst = tmp_path / "out.img"
|
||||
pub = tmp_path / "pub.der"
|
||||
priv = tmp_path / "key.pem"
|
||||
src.write_bytes(b"\x01\x02\x03" * 1000)
|
||||
priv.write_bytes(key.private_pem)
|
||||
pub.write_bytes(b"das ist definitiv kein Schluessel")
|
||||
subprocess.run([sys.executable, str(TOOL), "sign", "--key", str(priv),
|
||||
"--in", str(src), "--out", str(dst)], check=True)
|
||||
r = subprocess.run([sys.executable, str(TOOL), "verify", "--pub", str(pub),
|
||||
"--in", str(dst)], capture_output=True, text=True)
|
||||
assert r.returncode != 0
|
||||
assert "Traceback" not in r.stderr
|
||||
assert "error:" in r.stderr.lower()
|
||||
|
||||
|
||||
def test_cli_sign_rejects_garbage_private_key(tmp_path):
|
||||
src = tmp_path / "in_gz.img"
|
||||
dst = tmp_path / "out.img"
|
||||
priv = tmp_path / "key.pem"
|
||||
src.write_bytes(b"\x01\x02\x03" * 1000)
|
||||
priv.write_bytes(b"das ist definitiv kein Schluessel")
|
||||
r = subprocess.run([sys.executable, str(TOOL), "sign", "--key", str(priv),
|
||||
"--in", str(src), "--out", str(dst)], capture_output=True, text=True)
|
||||
assert r.returncode != 0
|
||||
assert "Traceback" not in r.stderr
|
||||
assert "error:" in r.stderr.lower()
|
||||
|
||||
Reference in New Issue
Block a user