secrets-engine/tests/test_release_bundle.py
tegwick ebd8e49aff
All checks were successful
CI Smoke / host-smoke (push) Successful in 1s
CI Smoke / container-smoke (push) Successful in 2s
feat(admission): founder-signed trust and recovery-attempt admission (WP14 T02, WP15 T05)
Reuse the gated-executor approval pattern: ssh-keygen -Y signatures over exact
bytes, verified against a runtime-unwritable allowed_signers anchor with a fixed
namespace per purpose. load_trust now refuses responder trust without a founder
admission; the KeyCape selector preflight gains --admission for one exact,
bounded recovery attempt. WP14 re-pointed to CUST-WP-0082-T06 and split founder
key admission into human-gated T04; WP15 T04 now requires the signed admission.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 809600@bnt-lap001
Assistant-Session: 40ba228f-c8a0-4ec9-bb29-3129951afdc4
2026-10-21 00:30:59 +02:00

140 lines
6.4 KiB
Python

"""Actual offline installation proof; only supplied locked public dependency wheel.
Set SECRETS_ENGINE_TEST_DEPENDENCY_WHEEL to a local PyYAML wheel from uv.lock.
No production install, trust admission, backend or credential is used.
"""
import hashlib
import json
import os
from pathlib import Path
import shutil
import subprocess
import sys
import pytest
from tests.test_decision_signature import FIXTURE, PUBLIC
from tests.test_decision_transport import server
from tests.signature_support import admit
ROOT = Path(__file__).resolve().parents[1]
def run(command, **kwargs):
return subprocess.run(command, text=True, capture_output=True, timeout=120, **kwargs)
@pytest.fixture(scope='module')
def bundles(tmp_path_factory):
dependency=os.environ.get('SECRETS_ENGINE_TEST_DEPENDENCY_WHEEL')
if not dependency:
pytest.skip('provide the locked public PyYAML wheel for actual bundle build/install tests')
directory=tmp_path_factory.mktemp('cli-bundles')
result=[]
for name in ['one','two']:
bundle=directory/name
built=run([sys.executable,str(ROOT/'scripts/build_release_bundle.py'),'--output',str(bundle),
'--dependency-wheel',dependency])
assert built.returncode==0,built.stderr
result.append(bundle)
return result
def manifest_hash(bundle):
return hashlib.sha256((bundle/'manifest.json').read_bytes()).hexdigest()
def install(bundle,prefix):
return run([sys.executable,str(bundle/'install.py'),'--bundle',str(bundle),'--prefix',str(prefix),
'--manifest-sha256',manifest_hash(bundle)])
@pytest.fixture
def installed(bundles,tmp_path):
prefix=tmp_path/'installed'
result=install(bundles[0],prefix)
assert result.returncode==0,result.stderr
return prefix
def test_two_builds_match_and_contain_no_signer(bundles):
one,two=bundles
names={str(path.relative_to(one)) for path in one.rglob('*') if path.is_file()}
assert names=={str(path.relative_to(two)) for path in two.rglob('*') if path.is_file()}
for name in names:
assert (one/name).read_bytes()==(two/name).read_bytes(),name
assert not any('signer' in name or 'testsupport' in name for name in names)
assert (one/'bin/secrets-engine-pdp-verify').is_file()
assert len(list((one/'wheels').glob('secrets_engine-*.whl')))==1
def test_clean_install_uses_installed_wheel_and_signed_boundary(installed,tmp_path):
env={**os.environ,'SECRETS_ENGINE_PDP_VERIFIER':'/must-not-use-ambient-override'}
help_result=run([str(installed/'bin/secrets-engine'),'--help'],env=env,cwd='/tmp')
assert help_result.returncode==0,help_result.stderr
envelope=json.loads(FIXTURE.read_bytes())
trust={name:envelope['provenance'][name] for name in ('evaluator','mode','policy_package','policy_version','policy_package_digest')}
trust.update(schema='secrets-engine.pdp-trust.v1',keys={'testdata-ed25519':PUBLIC})
trust_file=tmp_path/'synthetic-trust.json';trust_file.write_text(json.dumps(trust));admit(trust_file)
token=tmp_path/'synthetic.token';token.write_text('synthetic-pdp-credential');token.chmod(0o600)
script='''import pathlib,sys
import secrets_engine.decision_check as installed
from secrets_engine.errors import DecisionError
import secrets_engine.founder_admission as admission
admission._writable_by_runtime=lambda info: bool(info.st_mode & 0o022) # test runs as anchor owner
assert str(pathlib.Path(installed.__file__).resolve()).startswith(sys.argv[1]+'/venv/')
try:
result=installed.check_decision(base_url=sys.argv[2],token_file=pathlib.Path(sys.argv[3]),request={},trust_file=pathlib.Path(sys.argv[4]),verifier=pathlib.Path(sys.argv[1]+'/libexec/secrets-engine-pdp-verify'))
except DecisionError:
if sys.argv[5]=='refuse':sys.exit(0)
raise
assert sys.argv[5]=='accept' and result['effect']=='allow'
'''
clean_env={key:value for key,value in os.environ.items() if key not in ('PYTHONPATH','PYTHONHOME')}
for body,expect in [(FIXTURE.read_bytes(),'accept'),(b'{"effect":"allow"}','refuse')]:
with server(body=body) as (origin,seen):
result=run([str(installed/'venv/bin/python'),'-c',script,str(installed),origin,str(token),str(trust_file),expect],env=clean_env,cwd='/tmp')
assert result.returncode==0,result.stderr
assert seen==[True]
@pytest.mark.parametrize('change',['missing','tampered'])
def test_installed_cli_refuses_missing_or_tampered_helper(installed,change):
helper=installed/'libexec/secrets-engine-pdp-verify'
if change=='missing':helper.rename(helper.with_suffix('.held'))
else:helper.write_bytes(helper.read_bytes()+b'tampered')
result=run([str(installed/'bin/secrets-engine'),'--help'],cwd='/tmp')
assert result.returncode==1
assert 'verifier missing or changed' in result.stderr
assert not result.stdout
def test_installer_refuses_changed_artifact_and_existing_prefix(bundles,tmp_path):
altered=tmp_path/'altered';shutil.copytree(bundles[0],altered)
helper=altered/'bin/secrets-engine-pdp-verify';helper.write_bytes(helper.read_bytes()+b'tampered')
prefix=tmp_path/'must-not-create'
result=install(altered,prefix)
assert result.returncode==1 and not prefix.exists()
existing=tmp_path/'existing';existing.mkdir();marker=existing/'keep';marker.write_text('unchanged')
result=install(bundles[0],existing)
assert result.returncode==1 and marker.read_text()=='unchanged'
assert sorted(path.name for path in existing.iterdir())==['keep']
def test_installer_requires_exact_reviewed_manifest(bundles,tmp_path):
prefix=tmp_path/'must-not-create'
result=run([sys.executable,str(bundles[0]/'install.py'),'--prefix',str(prefix),'--manifest-sha256','0'*64])
assert result.returncode==1 and not prefix.exists()
def test_changed_producer_source_stops_before_build(tmp_path):
root=tmp_path/'source';(root/'scripts').mkdir(parents=True)
for name in ['build_release_bundle.py','check_pdp_producer_source.py']:
shutil.copyfile(ROOT/'scripts'/name,root/'scripts'/name)
shutil.copytree(ROOT/'verifier',root/'verifier')
shutil.copytree(ROOT/'tests/fixtures/pdp-signature',root/'tests/fixtures/pdp-signature')
source=root/'verifier/internal/sign/sign.go';source.write_bytes(source.read_bytes()+b'// drift\n')
output=tmp_path/'must-not-build'
result=run([sys.executable,str(root/'scripts/build_release_bundle.py'),'--output',str(output),
'--dependency-wheel',str(tmp_path/'not-reached.whl')])
assert result.returncode==1 and not output.exists()