@@ -11,6 +11,11 @@ MOHAWK_API_TOKEN="${MOHAWK_API_TOKEN:-}"
1111MOHAWK_API_TOKEN_FILE=" ${MOHAWK_API_TOKEN_FILE:-/ run/ secrets/ mohawk_api_token} "
1212MOHAWK_API_ROLE=" ${MOHAWK_API_ROLE:- verifier} "
1313MOHAWK_NEGATIVE_TEST_ROLE=" ${MOHAWK_NEGATIVE_TEST_ROLE:- observer} "
14+ DRILL_MODE=" ${DRILL_MODE:- testnet} "
15+ FALLBACK_STARK_BACKEND=" ${FALLBACK_STARK_BACKEND:- winterfell_mock} "
16+ ENFORCE_NON_MOCK_BACKEND=" ${ENFORCE_NON_MOCK_BACKEND:- false} "
17+ PQC_KEM_SUITE=" ${PQC_KEM_SUITE:- declared-hybrid-target: x25519+mlkem768} "
18+ PQC_SIGNATURE_SUITE=" ${PQC_SIGNATURE_SUITE:- declared-target: mldsa65} "
1419DRILL_ID=" ${DRILL_ID:- kex-rotation-$(date -u +% Y% m% dT% H% M% SZ)} "
1520ARTIFACT_ROOT=" ${ARTIFACT_ROOT:- ${ARTIFACTS_BASE_DIR} / ${DRILL_ID} } "
1621DRILL_RETENTION_DAYS=" ${DRILL_RETENTION_DAYS:- 2555} "
@@ -35,6 +40,19 @@ require_cmd() {
3540 command -v " $1 " > /dev/null 2>&1 || die " missing required command: $1 "
3641}
3742
43+ is_mock_backend () {
44+ local backend_name
45+ backend_name=" $( echo " $1 " | tr ' [:upper:]' ' [:lower:]' ) "
46+ case " ${backend_name} " in
47+ * mock* |simulated_* |test_* )
48+ return 0
49+ ;;
50+ * )
51+ return 1
52+ ;;
53+ esac
54+ }
55+
3856expect_bool_true () {
3957 local actual=" $1 "
4058 local error_message=" $2 "
118136API_TOKEN=" $( resolve_api_token) "
119137[[ -n " ${API_TOKEN} " ]] || die " resolved API token is empty"
120138
139+ if [[ " ${DRILL_MODE} " == " production" ]]; then
140+ ENFORCE_NON_MOCK_BACKEND=true
141+ fi
142+
121143START_TS=" $( date -u +%Y-%m-%dT%H:%M:%SZ) "
122144info " drill id: ${DRILL_ID} "
123145info " artifact root: ${ARTIFACT_ROOT} "
124146info " target node-agent: ${NODE_AGENT_BASE_URL} "
147+ info " drill mode: ${DRILL_MODE} "
148+ info " fallback stark backend: ${FALLBACK_STARK_BACKEND} "
149+ info " enforce non-mock backend: ${ENFORCE_NON_MOCK_BACKEND} "
125150
126151curl -fsS " ${READINESS_URL} " > " ${ARTIFACT_ROOT} /readiness_pre.json"
127152READY_PRE=" $( json_field " ${ARTIFACT_ROOT} /readiness_pre.json" " ready" ) "
@@ -171,10 +196,11 @@ domain_sep = b"winterfell-v1:"
171196transcript = b"winterfell-fallback-drill-transcript-v1-20260408-extended-window"
172197root = hashlib.sha256(domain_sep + transcript).digest()
173198stark_proof = root + transcript
199+ backend = "${FALLBACK_STARK_BACKEND}"
174200payload = {
175201 "mode": "any",
176202 "encoding": "base64",
177- "stark_backend": "winterfell_mock" ,
203+ "stark_backend": backend ,
178204 "snark_proof": base64.b64encode(b"invalid-snark-placeholder").decode("ascii"),
179205 "stark_proof": base64.b64encode(stark_proof).decode("ascii"),
180206}
@@ -187,6 +213,10 @@ FALLBACK_ACCEPTED="$(json_field "${ARTIFACT_ROOT}/hybrid_verify_fallback_backend
187213FALLBACK_BACKEND=" $( json_field " ${ARTIFACT_ROOT} /hybrid_verify_fallback_backend.json" " backend" ) "
188214expect_bool_true " ${FALLBACK_ACCEPTED} " " fallback backend rehearsal failed"
189215
216+ if [[ " ${ENFORCE_NON_MOCK_BACKEND} " == " true" ]] && is_mock_backend " ${FALLBACK_BACKEND} " ; then
217+ die " non-mock backend enforcement enabled, but backend '${FALLBACK_BACKEND} ' is mock/simulated"
218+ fi
219+
190220# Negative role-failure check proves policy enforcement (expects 401/403).
191221NEGATIVE_STATUS=" $( curl -sS -o " ${ARTIFACT_ROOT} /role_failure_negative_response.txt" -w ' %{http_code}' \
192222 " ${LEDGER_URL} " \
228258
229259END_TS=" $( date -u +%Y-%m-%dT%H:%M:%SZ) "
230260DRILL_OUTCOME=" pass"
261+ PQC_PRIMITIVES_WIRED=false
262+ PQC_PRODUCTION_READY=false
263+ if [[ " ${ENFORCE_NON_MOCK_BACKEND} " == " true" ]] && ! is_mock_backend " ${FALLBACK_BACKEND} " ; then
264+ PQC_PRODUCTION_READY=true
265+ fi
266+
267+ cat > " ${ARTIFACT_ROOT} /pqc-readiness-evidence.json" << EOF
268+ {
269+ "drill_mode": "${DRILL_MODE} ",
270+ "pqc_kem_suite": "${PQC_KEM_SUITE} ",
271+ "pqc_signature_suite": "${PQC_SIGNATURE_SUITE} ",
272+ "primitives_wired_in_runtime": ${PQC_PRIMITIVES_WIRED} ,
273+ "fallback_backend": "${FALLBACK_BACKEND} ",
274+ "enforce_non_mock_backend": ${ENFORCE_NON_MOCK_BACKEND} ,
275+ "production_pqc_ready": ${PQC_PRODUCTION_READY} ,
276+ "notes": "production_pqc_ready is true only when non-mock backend enforcement is enabled and the runtime backend is non-mock"
277+ }
278+ EOF
231279
232280cat > " ${ARTIFACT_ROOT} /retention-policy.json" << EOF
233281{
@@ -279,6 +327,13 @@ cat >"${ARTIFACT_ROOT}/drill-summary.json" <<EOF
279327 "backend": "${FALLBACK_BACKEND} ",
280328 "accepted": ${FALLBACK_ACCEPTED}
281329 },
330+ "pqc_readiness": {
331+ "drill_mode": "${DRILL_MODE} ",
332+ "pqc_kem_suite": "${PQC_KEM_SUITE} ",
333+ "pqc_signature_suite": "${PQC_SIGNATURE_SUITE} ",
334+ "primitives_wired_in_runtime": ${PQC_PRIMITIVES_WIRED} ,
335+ "production_pqc_ready": ${PQC_PRODUCTION_READY}
336+ },
282337 "negative_role_failure_test": {
283338 "role": "${MOHAWK_NEGATIVE_TEST_ROLE} ",
284339 "status_code": ${NEGATIVE_STATUS} ,
@@ -300,6 +355,7 @@ cat >"${ARTIFACT_ROOT}/drill-summary.json" <<EOF
300355 "crypto_rotation_test.log",
301356 "hybrid_verify_post_rotation.json",
302357 "hybrid_verify_fallback_backend.json",
358+ "pqc-readiness-evidence.json",
303359 "role_failure_negative_response.txt",
304360 "role_failure_negative_test.json",
305361 "ledger_post.json",
@@ -329,6 +385,11 @@ cat >"${ARTIFACT_ROOT}/drill-summary.md" <<EOF
329385- Post-rotation hybrid verify accepted: ${POST_ACCEPTED}
330386- Fallback backend rehearsal (${FALLBACK_BACKEND} ) accepted: ${FALLBACK_ACCEPTED}
331387- Negative role-failure status (${MOHAWK_NEGATIVE_TEST_ROLE} ): ${NEGATIVE_STATUS}
388+ - Drill mode: ${DRILL_MODE}
389+ - Declared PQC KEM suite: ${PQC_KEM_SUITE}
390+ - Declared PQC signature suite: ${PQC_SIGNATURE_SUITE}
391+ - PQC primitives wired in runtime: ${PQC_PRIMITIVES_WIRED}
392+ - Production PQC ready: ${PQC_PRODUCTION_READY}
332393- Ledger reconcile healthy after drill: ${RECONCILE_HEALTHY}
333394- Ledger entry count before: ${LEDGER_PRE_COUNT}
334395- Ledger entry count after: ${LEDGER_POST_COUNT}
0 commit comments