<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://invarians.org/index.php?action=history&amp;feed=atom&amp;title=The_Principia_Machina%2FTPC-PY%2Fdiff_fingerprint.py</id>
	<title>The Principia Machina/TPC-PY/diff fingerprint.py - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://invarians.org/index.php?action=history&amp;feed=atom&amp;title=The_Principia_Machina%2FTPC-PY%2Fdiff_fingerprint.py"/>
	<link rel="alternate" type="text/html" href="https://invarians.org/index.php?title=The_Principia_Machina/TPC-PY/diff_fingerprint.py&amp;action=history"/>
	<updated>2026-10-21T13:46:52Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://invarians.org/index.php?title=The_Principia_Machina/TPC-PY/diff_fingerprint.py&amp;diff=4049&amp;oldid=prev</id>
		<title>BFP Rauch: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://invarians.org/index.php?title=The_Principia_Machina/TPC-PY/diff_fingerprint.py&amp;diff=4049&amp;oldid=prev"/>
		<updated>2026-09-28T04:32:52Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 04:32, 28 September 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>BFP Rauch</name></author>
	</entry>
	<entry>
		<id>https://invarians.org/index.php?title=The_Principia_Machina/TPC-PY/diff_fingerprint.py&amp;diff=4048&amp;oldid=prev</id>
		<title>BFP Rauch: TPC-PY source diff_fingerprint.py (0.1.0), SHA-256 a7bcfbe1a11162f9; conformed TPS 0.3.0; PROPOSED, not declared (CO-8)</title>
		<link rel="alternate" type="text/html" href="https://invarians.org/index.php?title=The_Principia_Machina/TPC-PY/diff_fingerprint.py&amp;diff=4048&amp;oldid=prev"/>
		<updated>2026-09-27T15:43:18Z</updated>

		<summary type="html">&lt;p&gt;TPC-PY source diff_fingerprint.py (0.1.0), SHA-256 a7bcfbe1a11162f9; conformed TPS 0.3.0; PROPOSED, not declared (CO-8)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;quot;&amp;quot;&amp;quot;diff_fingerprint 0.1.0: the cross-residence differential for&lt;br /&gt;
tpc_fingerprint 0.1.0. Random TEST keys, salts and fields from a seed&lt;br /&gt;
(never a real secret), valid and malformed, both residences on the same&lt;br /&gt;
inputs, every render compared byte for byte; 0 differences is the pass.&lt;br /&gt;
Usage: python3 diff_fingerprint.py [seed] [cases].&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
import json&lt;br /&gt;
import os&lt;br /&gt;
import random&lt;br /&gt;
import subprocess&lt;br /&gt;
import sys&lt;br /&gt;
import tempfile&lt;br /&gt;
&lt;br /&gt;
here = os.path.dirname(os.path.abspath(__file__))&lt;br /&gt;
sys.path.insert(0, here)&lt;br /&gt;
from tpc_fingerprint import run_case, FNS  # noqa: E402&lt;br /&gt;
&lt;br /&gt;
seed = int(sys.argv[1]) if len(sys.argv) &amp;gt; 1 else 1&lt;br /&gt;
count = int(sys.argv[2]) if len(sys.argv) &amp;gt; 2 else 20000&lt;br /&gt;
rnd = random.Random(seed)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def pick(xs):&lt;br /&gt;
    return xs[rnd.randrange(len(xs))]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def bad():&lt;br /&gt;
    return rnd.random() &amp;lt; 0.04&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def hexs(nbytes):&lt;br /&gt;
    if bad():&lt;br /&gt;
        return pick([&amp;quot;&amp;quot;, &amp;quot;zz&amp;quot; * nbytes, &amp;quot;%0*x&amp;quot; % (nbytes * 2 - 1, rnd.getrandbits(nbytes * 8 - 4)),&lt;br /&gt;
                     (&amp;quot;%0*x&amp;quot; % (nbytes * 2, rnd.getrandbits(nbytes * 8))).upper(), 5, None])&lt;br /&gt;
    return &amp;quot;%0*x&amp;quot; % (nbytes * 2, rnd.getrandbits(nbytes * 8))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def ts():&lt;br /&gt;
    if bad():&lt;br /&gt;
        return pick([&amp;quot;2026092406234&amp;quot;, &amp;quot;2026092406234x&amp;quot;, 1700000000, &amp;quot;&amp;quot;, None])&lt;br /&gt;
    return &amp;quot;%04d%02d%02d%02d%02d%02d&amp;quot; % (rnd.randint(2001, 2099), rnd.randint(1, 12), rnd.randint(1, 28),&lt;br /&gt;
                                         rnd.randint(0, 23), rnd.randint(0, 59), rnd.randint(0, 59))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def uid():&lt;br /&gt;
    if bad():&lt;br /&gt;
        return pick([0, -1, True, &amp;quot;7&amp;quot;, 1.5, None])&lt;br /&gt;
    return rnd.randint(1, 10 ** rnd.randint(1, 9))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def gen(fn):&lt;br /&gt;
    if fn == &amp;quot;hkdf&amp;quot;:&lt;br /&gt;
        a = {&amp;quot;prk&amp;quot;: hexs(pick([32, 32, 32, 64, 22])), &amp;quot;info&amp;quot;: pick([&amp;quot;TPX-FINGERPRINT-1&amp;quot;, &amp;quot;x&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;café&amp;quot;, &amp;quot;a|b&amp;quot;]),&lt;br /&gt;
             &amp;quot;length&amp;quot;: pick([1, 16, 32, 33, 42, 64, 100, 8160]) if not bad() else pick([0, 8161, -1, &amp;quot;32&amp;quot;, 1.5])}&lt;br /&gt;
        if rnd.random() &amp;lt; 0.3:&lt;br /&gt;
            a[&amp;quot;info_hex&amp;quot;] = hexs(rnd.randint(1, 20)) if not bad() else pick([&amp;quot;abc&amp;quot;, &amp;quot;ZZ&amp;quot;, 5, &amp;quot;&amp;quot;])&lt;br /&gt;
        return a&lt;br /&gt;
    if fn == &amp;quot;key_fp&amp;quot; or fn == &amp;quot;key_id&amp;quot;:&lt;br /&gt;
        return {&amp;quot;k&amp;quot;: hexs(pick([32, 32, 32, 31, 33]))}&lt;br /&gt;
    if fn == &amp;quot;agent_key&amp;quot;:&lt;br /&gt;
        return {&amp;quot;k&amp;quot;: hexs(32), &amp;quot;agent_user_id&amp;quot;: uid(), &amp;quot;salt&amp;quot;: hexs(pick([16, 16, 16, 15, 17]))}&lt;br /&gt;
    if fn == &amp;quot;call_sign&amp;quot;:&lt;br /&gt;
        return {&amp;quot;fp&amp;quot;: hexs(pick([32, 32, 32, 31, 33]))}&lt;br /&gt;
    f = {&amp;quot;sponsor_user_id&amp;quot;: uid(), &amp;quot;sponsor_registration&amp;quot;: ts(), &amp;quot;agent_user_id&amp;quot;: uid(),&lt;br /&gt;
         &amp;quot;agent_registration&amp;quot;: ts(), &amp;quot;salt&amp;quot;: hexs(16), &amp;quot;cert_serial&amp;quot;: uid(), &amp;quot;cert_time&amp;quot;: ts()}&lt;br /&gt;
    if bad():&lt;br /&gt;
        del f[pick(list(f.keys()))]&lt;br /&gt;
    if bad():&lt;br /&gt;
        f[&amp;quot;extra&amp;quot;] = 1&lt;br /&gt;
    return {&amp;quot;k&amp;quot;: hexs(32), &amp;quot;fields&amp;quot;: f if not bad() else [1]}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
cases = []&lt;br /&gt;
for _ in range(count):&lt;br /&gt;
    fn = pick(FNS)&lt;br /&gt;
    cases.append({&amp;quot;fn&amp;quot;: fn, &amp;quot;args&amp;quot;: gen(fn)})&lt;br /&gt;
CASES_PATH = os.environ.get(&amp;quot;TPC_DIFF_CASES&amp;quot;)  # named: kept, for crosspy.py&lt;br /&gt;
if not CASES_PATH:&lt;br /&gt;
    fd, CASES_PATH = tempfile.mkstemp(prefix=&amp;quot;tpc_diff_&amp;quot;, suffix=&amp;quot;.json&amp;quot;)  # outside the tree&lt;br /&gt;
    os.close(fd)&lt;br /&gt;
with open(CASES_PATH, &amp;quot;w&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
    json.dump(cases, f, ensure_ascii=False)&lt;br /&gt;
py = [run_case(c[&amp;quot;fn&amp;quot;], c[&amp;quot;args&amp;quot;]) for c in cases]&lt;br /&gt;
php = json.loads(subprocess.run([&amp;quot;php&amp;quot;, os.path.join(here, &amp;quot;diff_fingerprint.php&amp;quot;), CASES_PATH], capture_output=True,&lt;br /&gt;
                                text=True, check=True).stdout)&lt;br /&gt;
if not os.environ.get(&amp;quot;TPC_DIFF_CASES&amp;quot;):&lt;br /&gt;
    os.remove(CASES_PATH)&lt;br /&gt;
diffs = sum(1 for a, b in zip(py, php) if a != b)&lt;br /&gt;
outcomes = {}&lt;br /&gt;
for c, a in zip(cases, py):&lt;br /&gt;
    k = c[&amp;quot;fn&amp;quot;] + (&amp;quot;/ERROR&amp;quot; if a.startswith(&amp;quot;ERROR&amp;quot;) else &amp;quot;&amp;quot;)&lt;br /&gt;
    outcomes[k] = outcomes.get(k, 0) + 1&lt;br /&gt;
print(&amp;quot;seed&amp;quot;, seed, &amp;quot;cases&amp;quot;, len(cases), &amp;quot;differences&amp;quot;, diffs, &amp;quot;php_len&amp;quot;, len(php),&lt;br /&gt;
      json.dumps(outcomes, sort_keys=True))&lt;br /&gt;
for c, a, b in zip(cases, py, php):&lt;br /&gt;
    if a != b:&lt;br /&gt;
        print(json.dumps(c, ensure_ascii=False)); print(a); print(&amp;quot;---&amp;quot;); print(b); break&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>BFP Rauch</name></author>
	</entry>
</feed>