diff --git a/README.md b/README.md index 74c09da..ca7e379 100644 --- a/README.md +++ b/README.md @@ -90,6 +90,8 @@ Logarithms in an entropy or an information rate are base two. | Semantic similarity | `exp_semantic` | `semantic.csv` | | Load and channel-estimate sweeps | `exp_users_csi` | `users.csv`, `csi.csv` | | Permutation-variant check | `exp_full.stage_M` | `perm_variant.csv` | + +Run one stage on its own with `python code/exp_full.py stage_B`, or the whole chain with no argument. | Closed-form and symbolic checks | `verify_math` | `verify_math.csv` | ## Security scope diff --git a/code/check_consistency.py b/code/check_consistency.py index 4f9f77d..384ab21 100644 --- a/code/check_consistency.py +++ b/code/check_consistency.py @@ -216,6 +216,18 @@ chk("degeneracy numbers in tex", and "overlapping by $0.10$ on average over user pairs" in " ".join(tex.split()), "searched tex", needs_tex=True) +# --- why the permutation key is granted a shared permutation --------- +pv = {r["variant"]: float(r["legit_ser"]) for r in rows("perm_variant.csv")} +chk("shared permutation legitimate rate", abs(pv["shared"] - 0.053) < 1e-3, + "%.5f" % pv["shared"]) +chk("per-user permutation legitimate rate", + abs(pv["per_user"] - 0.129) < 1e-3, "%.5f" % pv["per_user"]) +if HAVE_TEX: + chk("quoted permutation cost in tex", + "from $0.053$ to $0.129$" in " ".join(tex.split()), + "searched tex", needs_tex=True) + + # --- key-length sweep floor ------------------------------------------ # The eavesdropper column is an average over eight substitute-key draws, # so the quoted floor must track the data and not one lucky draw. diff --git a/code/exp_full.py b/code/exp_full.py index 0bab7b9..4d5d748 100644 --- a/code/exp_full.py +++ b/code/exp_full.py @@ -18,6 +18,7 @@ Experiment scripts write CSV only, never draw. Fixed seeds. """ from __future__ import annotations import math +import sys import numpy as np import torch @@ -854,19 +855,27 @@ def stage_L_gap(rows): f"over SER {lo:.3f} to {hi:.3f}") -def main(): +CHAIN = ["stage_A", "stage_B", "stage_C", "stage_D", "stage_E", "stage_F", + "stage_I", "stage_J", "stage_L", "stage_M"] + + +def main(names=None): + """Run the named stages, or the whole chain when none are named. + + The README maps every figure and table to its stage, so a reader + reproducing one figure runs that stage alone: + python code/exp_full.py stage_B + """ print(f"device={DEVICE}") - stage_A() - stage_B() - stage_C() - stage_D() - stage_E() - stage_F() - stage_I() - stage_J() - stage_L() - print("[done] full-scale security CSVs in", DATA) + todo = names or CHAIN + unknown = [n for n in todo if n not in CHAIN] + if unknown: + raise SystemExit("unknown stage(s): %s\nknown: %s" + % (", ".join(unknown), ", ".join(CHAIN))) + for n in todo: + globals()[n]() + print("[done] security CSVs in", DATA) if __name__ == "__main__": - main() + main(sys.argv[1:]) diff --git a/data/perm_variant.csv b/data/perm_variant.csv new file mode 100644 index 0000000..571a53c --- /dev/null +++ b/data/perm_variant.csv @@ -0,0 +1,3 @@ +variant,legit_ser +shared,0.05344 +per_user,0.129035 diff --git a/fig/fig_sec_brute.pdf b/fig/fig_sec_brute.pdf index ebb15bc..e90c32c 100644 Binary files a/fig/fig_sec_brute.pdf and b/fig/fig_sec_brute.pdf differ diff --git a/fig/fig_sec_jam.pdf b/fig/fig_sec_jam.pdf index 49c5374..868ea16 100644 Binary files a/fig/fig_sec_jam.pdf and b/fig/fig_sec_jam.pdf differ diff --git a/fig/fig_sec_keylen.pdf b/fig/fig_sec_keylen.pdf index 8217024..fa6e8c3 100644 Binary files a/fig/fig_sec_keylen.pdf and b/fig/fig_sec_keylen.pdf differ diff --git a/fig/fig_sec_kpa.pdf b/fig/fig_sec_kpa.pdf index 69a2a55..8ff04d9 100644 Binary files a/fig/fig_sec_kpa.pdf and b/fig/fig_sec_kpa.pdf differ diff --git a/fig/fig_sec_real.pdf b/fig/fig_sec_real.pdf index 822889d..63eaaf3 100644 Binary files a/fig/fig_sec_real.pdf and b/fig/fig_sec_real.pdf differ diff --git a/fig/fig_sec_sens.pdf b/fig/fig_sec_sens.pdf index 50e609a..ac24859 100644 Binary files a/fig/fig_sec_sens.pdf and b/fig/fig_sec_sens.pdf differ diff --git a/fig/fig_sec_snr.pdf b/fig/fig_sec_snr.pdf index 84ba413..71ea0d1 100644 Binary files a/fig/fig_sec_snr.pdf and b/fig/fig_sec_snr.pdf differ