SOURCE / PINNED RELEASE
Made of little things.
Body Journal
- Release
- e8049f8da4e2…
- Author-recorded commit
- 61c04bf0e8aa…
- License
- LICENSE
- Author’s source reference
- nostr://npub182jczunncwe0jn6frpqwq3e0qjws7yqqnc3auccqv9nte2dnd63scjm4rf/wss%3A%2F%2Fgit.napplet.soy%2F/n-6c4554844c7
Archive hash verified: 4369d778da046a8b…. The source-to-build association is the author’s claim; it has not been independently rebuilt.
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { createRequire } from 'node:module';
import { readFileSync, writeFileSync } from 'node:fs';
import { resolve, dirname } from 'node:path';
import { runInNewContext } from 'node:vm';
import { createHash } from 'node:crypto';
import ts from 'typescript';
import QRCode from 'qrcode';
import jsQR from 'jsqr';
import { schnorr } from '@noble/curves/secp256k1.js';
const require=createRequire(import.meta.url), cache=new Map();
function load(path) { path=resolve(path);if(cache.has(path))return cache.get(path).exports;const m={exports:{}};cache.set(path,m);const source=ts.transpileModule(readFileSync(path,'utf8'),{compilerOptions:{module:ts.ModuleKind.CommonJS,target:ts.ScriptTarget.ES2022,esModuleInterop:true}}).outputText;runInNewContext(source,{module:m,exports:m.exports,crypto,Date,TextEncoder,Uint8Array,require:s=>s.startsWith('.')?load(resolve(dirname(path),s.replace(/\.js$/,'.ts'))):require(s)});return m.exports; }
const id=load('src/report-identity.ts'), {recoveryPdf}=load('src/identity-backup.ts');
const key=new Uint8Array(32).fill(1), service='b'.repeat(64);
test('private nsec/hex recovery validates scalar and never accepts public keys',()=>{
const nsec=id.privateText(key);assert.deepEqual(id.parsePrivateKey(nsec),key);assert.deepEqual(id.parsePrivateKey('01'.repeat(32)),key);
assert.throws(()=>id.parsePrivateKey('00'.repeat(32)),/valid private/);assert.throws(()=>id.parsePrivateKey('ff'.repeat(32)),/valid private/);assert.throws(()=>id.parsePrivateKey('npub1something'),/valid private/);
assert.notEqual(id.publicKey(id.createPrivateKey()),id.publicKey(id.createPrivateKey()));
});
test('client signs domain-separated proof only for expected service, action, arguments and time',async()=>{
const args={receipt:'c'.repeat(64)};const c={service,pubkey:id.publicKey(key),nonce:'d'.repeat(64),action:'attach',digest:await id.digest(args),expiresAt:Date.now()+120000};
const sig=await id.signChallenge(key,c,service,'attach',args);
const hash=createHash('sha256').update(JSON.stringify(['ai-doc-identity/v1',c.service,c.pubkey,c.nonce,c.action,c.digest,c.expiresAt])).digest();
assert.equal(schnorr.verify(Buffer.from(sig,'hex'),hash,Buffer.from(c.pubkey,'hex')),true);
await assert.rejects(id.signChallenge(key,c,'a'.repeat(64),'attach',args),/invalid identity/);
await assert.rejects(id.signChallenge(key,c,service,'delete',args),/invalid identity/);
await assert.rejects(id.signChallenge(key,{...c,expiresAt:1},service,'attach',args),/invalid identity/);
await assert.rejects(id.signChallenge(key,c,service,'attach',{receipt:'e'.repeat(64)}),/invalid identity/);
assert.doesNotMatch(JSON.stringify({challenge:c,signature:sig,args}),new RegExp(id.privateText(key)));
});
test('recovery QR round trips; printable PDF contains exact key and service, no report data',()=>{
const text=id.privateText(key), matrix=QRCode.create(text,{errorCorrectionLevel:'M'}).modules,scale=8,size=(matrix.size+8)*scale,pixels=new Uint8ClampedArray(size*size*4).fill(255);
for(let y=0;y<matrix.size;y++)for(let x=0;x<matrix.size;x++)if(matrix.get(y,x))for(let dy=0;dy<scale;dy++)for(let dx=0;dx<scale;dx++){const p=(((y+4)*scale+dy)*size+(x+4)*scale+dx)*4;pixels[p]=pixels[p+1]=pixels[p+2]=0;}
assert.deepEqual(id.parsePrivateKey(jsQR(pixels,size,size).data),key);
const pdf=recoveryPdf(key,service), raw=new TextDecoder().decode(pdf);
assert.match(raw,/%PDF-1.4/);assert.ok(raw.includes(text));assert.ok(raw.includes(service));assert.doesNotMatch(raw,/caseText|receipt|patientDescription/);
if(process.env.IDENTITY_PDF_FIXTURE)writeFileSync(process.env.IDENTITY_PDF_FIXTURE,pdf,{mode:0o600});
});
