fractal-pqc 0.7.0 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/cli.mjs +20 -2
- package/examples/README.md +21 -0
- package/examples/anchor-bundle.json +30 -0
- package/package.json +2 -1
- package/src/mutations.mjs +37 -3
package/bin/cli.mjs
CHANGED
|
@@ -249,8 +249,26 @@ switch (cmd) {
|
|
|
249
249
|
// audit path, and (when a previous head is present) the append-only property.
|
|
250
250
|
case "verify-anchor": {
|
|
251
251
|
const path = rest[0];
|
|
252
|
-
if (!path) die("usage: fractal-pqc verify-anchor <bundle.json>
|
|
253
|
-
|
|
252
|
+
if (!path) die("usage: fractal-pqc verify-anchor <bundle.json> --log-id <hex> --cutoff <height> [--block-merkle-root=<h>=<root>]");
|
|
253
|
+
// Round 8, caught by running our own README against a clean install: an unparseable
|
|
254
|
+
// file threw a raw SyntaxError with a stack trace. The verb a reviewer is told to run
|
|
255
|
+
// first must never answer with a crash — it teaches them nothing and it looks like the
|
|
256
|
+
// tool is broken rather than the input.
|
|
257
|
+
let raw;
|
|
258
|
+
try { raw = readFileSync(path, "utf8"); }
|
|
259
|
+
catch (e) { die(`cannot read ${path}: ${e.message}`); }
|
|
260
|
+
let b;
|
|
261
|
+
try { b = JSON.parse(raw); }
|
|
262
|
+
catch {
|
|
263
|
+
die(`${path} is not a JSON transparency bundle.\n` +
|
|
264
|
+
` A bundle is JSON with { sth, entries, otsHex } — the signed head, the COMPLETE\n` +
|
|
265
|
+
` ordered entry list for that head, and the OpenTimestamps proof.\n` +
|
|
266
|
+
` If you passed a .anchor or .ots file, those are the raw anchor blobs that go\n` +
|
|
267
|
+
` INSIDE a bundle, not the bundle itself.\n` +
|
|
268
|
+
` A ready-to-run example ships with this package:\n` +
|
|
269
|
+
` node_modules/fractal-pqc/examples/anchor-bundle.json\n` +
|
|
270
|
+
` and examples/README.md has the exact command, flags included.`);
|
|
271
|
+
}
|
|
254
272
|
// PROVENANCE, applied completely this time. Round 3 fixed the headers and left the
|
|
255
273
|
// OTHER two halves of the predicate readable from the claimant's own JSON: the log
|
|
256
274
|
// identity to pin against, and the cutoff height. Both must come from the operator.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Ejecutar \`verify-anchor\` — comando completo
|
|
2
|
+
|
|
3
|
+
npx fractal-pqc verify-anchor node_modules/fractal-pqc/examples/anchor-bundle.json \\
|
|
4
|
+
--log-id a6d188b06e777d2a10f10320f9a3f54114383a560ce413671aeffaff1daa11dc \\
|
|
5
|
+
--cutoff 850000 \\
|
|
6
|
+
--block-merkle-root=800000=828dff2ed9ef1e054f10a53d722d8de73632a55798e249b1fdf76f21e7846b1a
|
|
7
|
+
|
|
8
|
+
**Por qué hacen falta esos tres flags, y por qué el bundle no los trae dentro.**
|
|
9
|
+
|
|
10
|
+
| Flag | Por qué NO puede salir del bundle |
|
|
11
|
+
|---|---|
|
|
12
|
+
| \`--log-id\` | Fijar la identidad contra un valor que el propio bundle suministra no prueba nada. Tiene que llegarle por otro canal. |
|
|
13
|
+
| \`--cutoff\` | No existe un Día-Q objetivo. Nos negamos a imprimir uno: la altura la elige quien verifica. |
|
|
14
|
+
| \`--block-merkle-root\` | Un \`.ots\` es dato inerte que *dice* "bitcoin, altura N". Solo una cabecera real lo convierte en un hecho. La ronda 3 de nuestro propio asedio forjó la frontera temporal entera con ~100 bytes porque esto era opcional. Léala de **su propio nodo**: \`bitcoin-cli getblockheader <hash>\`.
|
|
15
|
+
|
|
16
|
+
Para probar que rechaza lo que debe rechazar, cambie un carácter del \`--log-id\` o baje el
|
|
17
|
+
\`--cutoff\` por debajo de 800000: en ambos casos debe negarse, no advertir.
|
|
18
|
+
|
|
19
|
+
> **Estos son datos de DEMOSTRACIÓN.** La atestación de Bitcoin es sintética para que el flujo
|
|
20
|
+
> corra sin red. Contra un ancla real, la raíz de Merkle la pone usted desde su propio nodo — y
|
|
21
|
+
> ese es exactamente el punto: nosotros no estamos en ese camino.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_what": "A PQ-ANCHOR-v1 transparency bundle. Everything here is recomputed by verify-anchor; nothing is trusted because the file says so.",
|
|
3
|
+
"_note": "DEMONSTRATION DATA. The Bitcoin height below is a synthetic attestation so the flow can be run offline. Against a real anchor you would pass a Merkle root read from YOUR OWN node's block header.",
|
|
4
|
+
"subjectClassicalPub": "035e6ea9db0fe35a8c23d3759765720e8f6130e5d7094d3a3efc5ef1b83333219f",
|
|
5
|
+
"sth": {
|
|
6
|
+
"version": 1,
|
|
7
|
+
"logId": "a6d188b06e777d2a10f10320f9a3f54114383a560ce413671aeffaff1daa11dc",
|
|
8
|
+
"treeSize": 2,
|
|
9
|
+
"rootHash": "8816ac848537484210a1e69aa4849e56339ab4b9651f4b660b0ec031833428c9",
|
|
10
|
+
"timestampMs": 1756000000000,
|
|
11
|
+
"signature": "50a222c060ca26951386b643b250a8adc6711933020af3d5d4203ffcad170a9124e3014b93969120a025837ad0a49c5d4dd5903c8365d9cdd9aa7a292aa19146b64de4b47b19ed5b05013031272140e0692bba2a58983a568ede1686210cdad8c9e87ea6f3f7415cf31b51ac9ea291d6fa206454bb99804713963479de95659d843dcc8b906608d11ba8a7c4013e86d351c534b4ccd0569974cdbe2054d7cc53d4e04bbc52b335cb76347fcaa3ba5988b7941e34e6db6875ab90bb5bd4ecc92dedf1cf50494009f212c9835e2f816ac11c06c416d76188c0098e04e738f3366f4ae85a8aaa81890894660a411abc1e09f74560c19ab3ed178a676fa4d17ff5e1aa3ff0ab08320b8599a922e227bc4beaf091b2be54a49f1e7659f981c7f8776190272d5a369d40b0c3491312ff66034952507d87ae133624ce4f1c7b1fae7e351de186f1435638bae6b9748918c61a85705377ed0372f2798abf0057224df60596308970452769a38c472d953ceb61b293770e2828f6c5c24302f1deb816ab529c1dfaad4bb2b85ae8d69849102c9d3c875208334d61c14627724238cbde93a4be62a369ff8f62375865a13122cd2b2458a54e061521c867bf2e1a9637ee98bf406b9831bf46ed9e81decac9aa574ef7d0bded217281a523275fd997f4e1276af763784b10129472338b644bb9ae91901eb1c8d4afd46b7140818eb1c91e2a603e09007171df3c8d9ee3bf9139034826224eff1721921fc3cb843ff8145a260f6a386b830b783d2a8249071d5996d2250a870e004ca699904dc03a20693b6436cf32e8b1736649596f7c919e00694d67148b55b6ff0ef3e02807194a6472ed9a7b014cb357b7494c04eeb779c69af130a77a4c6c2e0b01ab4740d062dcf711b270adde39a0c2457898ca75f5c3769d87c99e159762ca9d20ae6bd6653269130ada4fd2f5242c76bc87538410594a6211ab2f86de47f48cac8bd200e151d72008ccc6a3eced21c0dae63d7b9844f2dae93a791c996dfde67cb9041e46ff5866c6ceb7aff90ed27907760649610f5598001dd441186f69003bdc7ab3b33043c885b7a3883ae14286300cfd0124eb222f033c3d433e755b1e390f70fef9d371a2a9364a398fc903d150a7851247c5e419c68b3fca6ad1e2f4cf76ffbb8c8a95792dc3dc6a7621247402446cae07c1896b1f90d78e8f2b9972e6c089fe58d6fabd2f6b8366a6819316437aa1275cd79234fb7c05df87f9c41fa213187e8b76bc819b35d26b4d8ce1ae876b0c29595c86c04f486d652e555dc52a2abb8d6a55ed74e56838dfadfba6cd8893758034abf8fa8ab3f6a52e764b346f0ecf2ee27ef980a00ab56ec8de5b3c776a766220a3cb72a5aa845f3efc500b77b443897208551a373c0011eb90157cd51f3df91e227c5570f163591033a12a4b46a49a91beccfb685a217f2446081030450e2528887d52193bb3bb466c0f2db0d94a6c900bb5c70cfac2112348e1d7ca6257ea20143b26a807c738eaf23bf1671aeab1a24ae769864bf19689f7b2822deb95b8b1eb6419f22d0437a69c64536702ebc5c373c762cd275fad7be147cdba7425b22d508488e0a3f6a9f557688c4b317bc79bd776d18227ae4291ce23862279372a4ef608f84535c74d6590b61ee5c99a49d63a32142d016224f0d2efeac910aaf38958b32984da7d2ea788d0b1624f49bb36527a18b0018b55cd686adab1e1af743645bda8befd4dd6aa51701213452950bfb4d7de85d261cee6e7f864cdd43ef9c81423fffa0de7f3cc856f83279fd0187f2c8488993aad0f8f90d609ca516ebea8637227f3378c0fdce0414933f37455dc1c1e8c14117e4c7d60f4e5ce23a640fd78b8eeae3f476a961d64d0e54ca982982bba738bf4507f83171fcf7652111ff411dbc92c457291186af22a83cbbe1b724a44a0527c424a8538dd27af6d040ef0bbcfb88722c936f327cb6711614db60013056d35fd53c7e9122346d5280abc1c1133837259656d236e9a50fc917690447ef245d67e557b87b0757ee59beebd190faff5e9809b08803b6f6d3e814ffa3549b31f3e25ff92b7d1ac4ac770681dbe28a43b4ec665f5fd857d62e4755c4246a12c13e68a47b659277965818af8170170c1972c02a9363892ed4f73d5a447a581142937373591eebd90dbefdcc8a9bd9052eb296344847a929eab9d126a7fc6481e687e0adca5524280a4d1641c7b82159617deb233a87af439d26c088ad1d3c15f7a0f4bd64e2f06c65e696088722a059272b3044febbd6e6fb0f2015a5f6fb696cf0329623d583ed33fb49afa8ec1fb5902f1ecff91ddc9d6b38829e3fc556d058d47fa241f44c9d49d3331ffc0110e8d5d3096ab2a776f6ae5eb67908eaa26da0c06d74efa037f21941e403b11adce25798a5604445e1a4d6500d6abaa9454ff193dec0138a0e2190748a6f307731222ecc0e48a89088d0cc2247b0dc072e5e720540a6b229af7553782b32f0ff28a63aedc12f9f97d1270f730ddf009cf9ac11280fe55b072ceac8130473639659456d7d2dd78d6415e4d8c2a64b1cd990d3491e871b68f903f2eb8a4327bf0e8059e878e74a473c12c9fe2776e13b6cf93627fac958690e23b8a0bc7729a454efd593ce3dab03781c72ac78fb8e84c14e899cc64c761f8cdfaf6d6fc830f4ee8dd3810a71e832a385106de49b023bab838ed45cc16d41dc2196c6f17a9c957cf644b257e1e7250aa760be7a7ccb5aeeda62b12f07b25d66e6558931561719764ece4e1aed90dfd42d9422d26268d46d45b805990bf84dda0f2080e67fccc8566a4c6c3ec28d292c3a81f661f7df898e3deec722c59a009800edb922839da6ff8bc0bd5f99ced09d54402d706ace0c791d193b9b60a384e07bb7fc4e747e288044a33a33aff62799c83a09e0b561467445ca189c62bf106ee3e8adb7ecf6c4cbfa1f527db9bb3f553f194d6fd421732222112ccc0f67a00323d05f96947d1a5822d089e9ac69bd47f99edd640d8b241b2273fa3aa6fcec61d67164648341eab3273ee128c30de8ce9cca09516c4345bec500849a3db348d05920765537a2414519b95a4db74ec8569343eb5be989bf6c5f5820dc9842ebe68cde52e00a809241a39f605f1730646c16f377927c90d08135cba121c68a464a7ef7722e94a07221ca876ec615fa086539cd6d1e42bd89a77bd34b22e52214caed4b588f9c29a13d2b26ad833663fba75125a1e48c305a834898e176588844c3c350cf97a553c8833a99a2a1d2553e731609b3115a2a8087d7512bedb88dcdec9aa5d7e515492812217c28580ac96636b78cb8a78697d7165770178cdf79b83d3e39e93cd64269148ae952db6310ec9d7a86202f8e11a603c798581b26688cb42692fb22184e26f735c27d67bf76e856c374b951788b5f8d2bab79eb1d8c4efbca76b6cd85f6d47272258e3bd5f0b6743b858ea523eb39def407771c0935ca6b146674ebcd361d9af8e5ab47b01f71d79fae311009a2ec755401536262ede34a942569d36e4df5cd683618de1fd51a8b27f59924aaff699f7ba0c0ba6dfc03ddac3e00cf58f7bd54f6db3a21b1e0ee47c7cfc481fb44f6776071df87878846d374ea4cbf0f62fa04476c8980defd7ea0da9873748707a24e8156ad616a10dd7e2ced42d331ed4da897e04cfa449cfe461065627f6531b4d98a0f01639a6f7bd025b9a43b00c93ac169b44fdfce769d5037a9ab86db2b356922f3894ac0d8f232e72c5a59ff51c4c33b70973d6737fb752908878d300dcd5c1c1c21d0c05c00aa264475eae27230d6fea55cd3d466254df7e3d2f1e6f55d6528f4cffe0d106aa0664eba0545da0d3232a5968671e714fb5436a88e583063664a6d67323f4b22038c42c7180aaf3453645b38b89fdfdb1d5e3b256a6f6dceab1dd01166282ecf858fad71c4a8cd7d6a3d77d38068d254e55122a37bf6cd4c2a8ae44483332d79a80bb99d7ec92e4f7cf349dbe0f4f3413240f6ada96c52018b8e2fc850fc63a5a2fcb1aac90855d30f23b07b81374f3c14c0de45fb2430bb6ab563d3356eeb51180758cb7fa4c7f239fc587b922ef92a7c347b9b5065bec823be19446b52e9d900f6c6eff75612fb8b6080b9d50285215fb70571d196415986cb03e94bba716ed437e2db3d2b0befbd2e185be70338a78d73001dcc8fdb47af99f70fc2d3e8a051de076ff7deef641c346d4247c3a3f352a91b69450a03285a47f73ea84b8dfce84a0b8563d09a896ce8271421db10f89468565e9bf14bb00d391d6209e9b85970508c9ae21dd85afa33556f71be81f795e82cbc4ee4b9d875bb8535ec10a44b0e68d6cd4f9e12c00d1583538c8d2f7d792f0c657cd1ad32430f0e468b267f9dbacc763c9d556e71af5b21a4328e9c536f98093ebd97f68a993b6649de063e9dc3708202f478b0224fee36a66eeb1b04a69547a8c0c34d07da8a80ff32849fdf25c1573e7d5d9d137584fc07ff52350437ffa5a403cc1f50a2b1a6675ee3f652eb7c4620a79c4d9fe457bb7df06ad1fbf8ea697307ffd0030aa6ea1eb5bdd708fbb543ee92310d6fc8c6ac589de313398a8acaeaf12334b656a6d99b8f437487fbbbed7141c3b3c3d5281afddf01f5b7aa2c1d11840565b78a1adf900000000000000000007101620262e",
|
|
12
|
+
"publicKey": "680819d95404e02e46625a6acf21410dd4d1ac4a7f1f09f172c097f82896315f7f3f217f0f0fd511710e5cbdf3bcb7d2dd87ce61d88ac3ae2015be84820233b6411f973019cf66fb7546a2a1d89894c4ecf7ef4d7dfc90ac15705d192baa62fe60328b77b32cc74ece0e84ea1d2ed679cbd008466f81d3c57142402e2c90990bc33ebbb02b334603cbaf02d59904048deb3baf51c23de32f6a54edaa4dfe47f759b61af57bb8ebb4e0a09f72532c88c23a2e3ffe86a9bd26962eac72e0aed500068bebe231926dd05bae152bca64e1c6c4dd458eeb676c38a3c049e2de25581ad3d674828d99d147c20db96c2a694cec78ae4c251e466afc892e7aada526ae8ea6dd8db3c81535727d9123d6671bd3d94d0ef15601eb0ab38ee28c19ae5b8aef9d2aba9c462102fe24e198c792aa321a13e8a1bec6fbe515cc39a7dd1bf3c3bc549da5d7c10fa01fb2fe6265784e0528cfb55f04d32d5f91d0c2f5f2cb67943c3dbdcca248b3e1fa151f7c0f0281fd6de42fd0aabc64427783355ce9bb9bff3c98e96f743cf0ce78ddd26a9bf4e7bd5204abca9a21959d525093b5f0c4a971ab47a8c2f6029fe442dff353b184aaba09a655acd3cdc03eef0be12ac52862043e5535792312cad3836bb2b6450f2669010db1f790f1984f1887a398e3843970c166197d7e2ab85159aa0cd1ef79f140b23e6876126e85bc5f931ab20b78befac39c201359c77238cacbb083392c775d2cb3ac56e08bbe79806e05476ae64c3ce07911b7b03e505df729eb94e340e686003648b77c8b96577de41738fb10bb3686be6016398ec8b9ab1ec5e82feef7b94c587b9a832b6fc76737ae2cde5630c79f52939705801d6a3f984f5c8445b431d9a927e0aa62fad7efaacc1dd79db6506dcefca57e67d59247eab2d92c0af0c0ecee0161f401515d7e274f25a4add9d91a1673780e6723153de4345ab1f1d3ca1e3bd3261c6fde6a92f5924077de341bdcea4d5845194ec3db494e9eb2c05eaf2ca821a29ecc65abd12c3a8f6779afe67016025158c708deede29a24d35946717557912a8e0b119fbe1fd74bc7ccaafc17b554eea511e99cf74420dd5dd03103a4be2928bf0353f5ee7409bfa174960798b9882e3dd8af38f61e6d9422f5eefc4b0d30cf291e6826475d14f75e58ba43ab841ccae9a5dbf3b164cc1ac9f1eade92483b3b1a11a5676504bf66dae070e7ddb88f58d9d02bc86d05f14e67a52bcae1470d66aa9b42c9403d1c45c2fcc343686cec3d27af0d7578b391298fefd752b4ddb14b97f03b9ad3c2f5fc756bb43c55efffc0b8821638228519cd78dc8566ea7e56be6b907adad910ddfc08dcbb50ec22b65b04001a1e7e95f9d324e2fba09a427c5ca8d1d5704d9ed658b0dd499be1c4d349b49742b74368b222a476e5d153b51b3cf81c82e38875b2f8b59e298aaa284f908ec2b96f584573426c66568cc8df90068a0d5196e189d1ff147aad0de2a0b75f9dbaec4face23d8dcf98ac5a7cedf37308d2621484f8fdf9806d6c38a669bb95bc84bce9d17e984328425c56bc1fcb6d531dfe5203501bac343f0f73a78f0a60b2431c163bd52e91412e01b9eedd667618ff0b68b35b86f7672239589f8e442d272461356beee79af2bafe1e1542fbf62795dcd20b87f1c7d3299ef0384bcad6aa90765e254e51b2c053f435b5c9f7ab0fe38b0be7abf081a60c0af5282c54f2cbb198eae1a8767d45397ed740dc4994939271e121ba1816561645b848c36141e87794438a25fc6fc162363ec6b7d1ee7875b1e8bde88c644b531ad289210c939b4d9a5f2c126b50fc7c39496050d7e01749f70adfe5dcd322e8430cbdc659786bdd79d701ee03d10ec67efcf2a3ed860269621641857e72205f5d2a2fc4fd7c2269bce2914be4803230feff6ebe87cf87858a239267d6a3b4678864e5073dde996dad4e88e35327818fae5104b5e3b92bf6dddc2f3750e72806bed204789681fe094fd005a6b8257273dacf480cd56276b191f6f00a5495794dddc6d1561ec18cdefb03ac91e45fe5cdec28a8facd12817c529c671393ed77ae22048198e8237bdcb0effa556219826ae66620068dc5d0da3cff17232e9f0b7c37d5a7f0dd0d23b9a0ac0520c0aa9b047a439e3c6dd56424d5cd823a9467b99685c0b6555ef87565fbd344693a9a3d8b9bc4ae3e7c960340aeec456dd8d24e56204156ee6fd3426ba07e46c16d23d60d77cf06fe94831e12effcfd29ff389989a6b57b1dae6ebd90b56a184aa6dd7626aa039c9d7d94cd884d0ee82ad468116ea00003156742e4966b78fe79f810f12098f3c3c37a0a6274154dd2cbac40ae8b456ad48e187b21dba6ab2259952de6842a8874ebc7d694a985a740086e6563d46882694d7c4ddbd0f71def37f5de97132a403148a0f7f4303d7bd88c232e25b0c21043f855c2dbfe0eea9b224ab1b71fe9f3475fad6caac40feeb86d99979e521efc4e1a29f8b16f711bdb582503ce6f5c2aac67dcc829d834442b3cc314b428f709a094beb8912ee0b255e0c933f786747776c0714aa899839d94d6f8d815e6d5e8af7779b4d49725bf97d649f9365ef5db97a4d859a9eaf9a71e7bb8b8b0388825d65c91e7f52f6eb6b84507027131f0a61c028896fb9b33ca9ec88fd2a6b19ad5714ed140322f31aa54fa963c99a3a4a14c08af2f454d3de766bcefc26cab0c0637c97419af24f5870e765cb7f121c31529c0f2915fc48262a7cdfe02f376169a9c",
|
|
13
|
+
"signingMode": "derived"
|
|
14
|
+
},
|
|
15
|
+
"entries": [
|
|
16
|
+
{
|
|
17
|
+
"classicalPub": "02eb5a0db09ab52d4d0274efd39e9e47c55ebf78cdf5441700d04964f0617e5b16",
|
|
18
|
+
"pqPublic": "90c7e862cca92a419a9006e4c32457d7827c568e69e25f28e81177407fde383697e8f98e276b1bd988705c7bf9a47b19be65ff599209d10ee318e17059d8982d14810f95088194324bd6b24e7372b170440816a22598dc1d1f7afc5a47e97724ed1ecd6c01d2bd82e5f3f1749c3e3fac2dd71f74be348736b59eddbf72c00b0f81d3095891af5d21fb97e6ff51513da84fc897fd703fab47f68519a3fef2cd1d1c6ca11c5f99f71ff57a5e0e220b3d9279ab0b66a1e8aece9068eb0bb755034b59f0e93f7d3b3822e2ca49054a1a9abe0fedd414362ffe6100a62e500c6c4bc2c8f27835cad84d7cedebbda9cf842ee0ae8512146a99b065ab5579d1a0b8529ff4ebafb2ebc486cae6dd7ed6317f2aa8527e15c6bb7f4b44d4b1bdacafc23d3e618610b5584beebdac90be695bd43be5265d8fa2c0a855d659a3849697d535e016c45400ab69cf71a1fa98066b338b89a5b0aef4fef0340208e6a48d1f477342a1e55269702f582f5d365bc173907e8733af1a084496d286dd6c1dd0ce76080798308b141321dffb60a4b68b6608202a852d78efbb3376d66473e3b23b259937e04fbe3343c92a7e11cccde32be3b218b9d892bd5b1e4d566db9656743092d55b226624091fa32e320b9bd944b939bb43fb75db5047dffdc2926ff24c6656307aa9e8734c423d645852b01c22d36f8a3dafaf9e6e8d400531e278ca89b73786812b1c23b44d4e2821498896754de78939bb66ac5e8c67cbbd6d382939970c01bfd775c6b0408ef55c1b8fd1afebc7e9582e0a5fe69b153420361cc6f61f4df148a0a43468ecb5ee623bd68f396028a49497c9be8f54d936e55cd25e7e7e92cc16627024e1af741b0da3a4c9c2983138c10eb9a163ff052b657d8f9599423c455bf256b653d58917e35a6412fd8d73e9edb146d0c27f9ef3100fe1e857b35c48f95ae66e4f350480c475a0b384f05fe17ecd9d87492294317601a9b585d82b910df1a9f0465a0a43673ae52d8da29ce2b566d9e63f213042bc1f00d456e68e4f0ec6fdfe434f7865d659f7b60fac5658182527c276662d4ba7dcbe1dd64c9422c14f6c18f36c17c83c6eaa24790175d157deea4cdb0f356864ad39a9edb70a645c305ea4a8433be03ff41b6949c136247061bff4b6fb70ad29e3581471f30112db2c7a5b7e3a968da4e9c0b6f642eb339e082a38237f5e8f38998bf5bf9cb493eaced4f2edd5b89d47eb09da8cf64c1c705f7d4ecaba1130967ca82f5e76e596b9939ed5c038391ca379ec3b0261186a55e260084df049f98452ac2d9bf04ee3d0c965f0077d5e38232cd0d1c885ffe2a0142383d6822defb67f11be349d23bd8fc01f197679b06d47ae076b53af9fd4394a68bece54b671ae791ab1e4974ba5c6e102123f2be342bbc5da6780102cb4fc0b9fd78bb8b7aed2db110c0a0a06cf7eb0125903d80741c4e32c6fb459ac4cce6398f3c65b5edea2e3e561df6a31897bde40403a9c0bfcfe9d0de5ef8058c84c86eec8ddb600c632464e491cf9140dca840c6ed2935a87c6e3984eaceac675735a5547491b69de61dccde9c2da65b343cd0adbdd5f00c67a07afd9ea4e8c4322361e3c0a4b0446592063ab565304f16fa72bc1f96ea70e4ec7d61a8c252ffa9bafc51d9133fae026be1f85ac5cfa1583eee794e54de7f5a7a828120d666577d7da9e3c6854c362286bd4219676742bd77094a949fb14b3eea57093f0255deecb94af46b642621a5f0c9722495c5f377b925ffc4c37a1eebc22bb0a1bad226e0b220a507ab8f5ac9174ac63057eabda4c3b7d0404b44365b1da7c19b9aa56ad62327847816828dca0a4edd1ede715e848d54820fbdef470b268f80555576dbd7b1d31101959885b6444dd6d41eb656cd555f0f9750c5b354f94203981edb430511b42e43363064718abd79c75c0f4d20ac6e78f5e0bd0a29209e32d823cf53fd6875bd781dc8d899685801d71890ebec39d818434c518341881b615bd81510f3a52639b40520380d15b5b83cce20cc48fd67d17dc946ded9488648bddbb1f6be50d4e5e7fcf201897a9b6d2509839b4bfb46c08a680a33f6a60cdbc6362b220475e0657abb07bc84249c05be362b43b61526d10625ea6b683b651e729bda84526c91e8367b48731a565a2109b4acac242dcbb66deae412248c42e9c0ee20b15496e40e0fd4457dafff25d1b6eaa21a2e638681a8a40699e7d93ba06761caad33ec41e16dd7bb3513c8077b4336ed6aebf4841cbc619c9779d8b7c8ec4357e6811b894ea0eb81e1d2503ddd5a43020877f6653344b8e3fe937f2078be957fff9d31e1a3a0b96a9e4b40fc9ad777c32a4c69095860054388b165b5b2e9846a7ce4da76650760dcb4d049299ee04528c8ca22fe8dcf25756ce6465c13c889190c0d5564f91047f43a0e9374a7d96945090931ba4c9b24d53ecf436e098078762fb5f413fcd2539ea12533b7dbc928144b5d5eaab13b4c290433952af851e219d5f0154d154c0bceabc9a9cb8572881a0eef9be30982bbf1ea7b1ed13d1d3f3f285075712f83ccdc65c8948e2fb1f4d8a6d3636f1497c664dc740be32eb53cda7c56621df002deb8162cce7b0cb3a3e8f76cc0514c907b7c910fe941843d1234b2996d7df438413aa7cf45318da17b7bbf3eb4dbd015803ccfb0d75314f9b4fc92c1e28e8efb767072c3eac80194a0e2d3ab4f7040bb882e9795748db074430d5f9bf59112395be56ae7258317fd2e8a5394",
|
|
19
|
+
"classicalSig": "db37066b5d6ad310054381917becf2869431dc7aa3bb64940f934c8bcedb7cb17bcc821dc923ad1391f44a63c386505ee9ef3c3bd006b2639d400e03b959603d",
|
|
20
|
+
"pqSig": "3581df49324128170b5af682c3ee327f8e14974ad4d968adf8f0ce7b18da6f022575c8f6adbe3083cc9d4afa72461fd702a172bf6507e6fedec28cb7fd31bcf8cd6529c3bef72c4f9ab960c1166bdeee0d0430ec34536ac25229c27dce4ff7b2237939663da11fbd305e9d878db7ff7adb5bb49f012a492205fd250685c4de8a40dbf7914098d00b1e663436dc31333d63709ce2a5e9d1fb668039e2d02f7053227b2b7457d5d48391356f4aae33913cf6caff65fd8d10375c4986f1eba25d2f12da9dff5ab9aeb25590c2fc3b85309b116bc33f9da154c8b0f6572780be5198174c1895c904f3020c041e68ac84626a8348ece3c40921cf33dbd6acac12f60604bb788bd0605e634b622680ed9b987cf09f54507b524801fee26f9a5c2db667d0ad2993b901349a14428de4ffc9c7ee4ecfa873e6ffba686fe648a271af824ee0a007f9ff2af100a069295ec5a813ba2d12d4acae93c8243035e3f45bcf6e39c2a03f6b0deacb778824236d697924ee9f516f764c99a327f9b381b447217ac28240a32addc0c13b6a5d6ccbb9abcd32f50a75af6b0a4f1929a281cc3346b29d68447fc0681b296d9c0cacdf467af7f9f2df76be4aca0283a3751b19c73062fcf29e1e09bbd367210c3bf36242ed205a141c6b077c8a418233193baf9cb00cacd2f08698926b8008d2d7819405efb69adbd096f334ca6d8fb92acd640ad5e4782f49f6f153e6866e6d4e63ca28739795e164b1c34fe7bc4f1090e300d264b082700e11bbd74099b4e2b65468bf7301e5d9d8cf7e3046fa2e763b6d59b6240c967ea7a9f80e7a586c4c5f0debebe70c8a0cef2bd56f57cc00cf663b2646c1d195f220e536514897d3b6632bb5e65b173184ad73fe3dac911825f929f53a05cf10498536e272ee418d85b658adbad8fd06e5e52de3b28d8e9bc8cae96a3dd3fb1313528ce1c1266f8a52c11c03d34a9e7ac7e6650d71aa67a455531bf010dfb1408ebd1185d71dcacd03bb25d197c9b3df0f6d508d1d3fc1b77786ba5823c11b9768a6a52d49550c1d70b713ee0881158d5a97d7b1853d10cef49053fea3fe58e244fc033a74b8ef33719abe5753b58658519104f6ef1f8cb34c59fb7028b17e50df8424377c93ad2c2b0e5134cd4c55618f1525804b8adf82242e5c9c5c16721a740416301ab702894daf47db61e9c55005a10cbe87a8277da0bd01bb21a184d3c64699f6edcfa82ca60a8fc85566231ec2f0a3152e5317b86a299d3d66d208041604f230268494de58795a15c86bcc36f9c0680ec5ac1fa083eb3ba07cffcfd317edfed5f194d112ca5562f9cfb63e3b63adf6b35921f2c48c870bb0ae5552642fd187db042bca9ab7e486922d08e92c2558751e11aad43d73859f4c7bffb5923f20db6c9af070e47e3be4196daf2e55f9145e4ad5eed3428c2888348e9964ffe58a712522f86ddb0380f66a70ca44c733fc4dabea96e18ecb0cecf5226e7a38da9496d265991008d6f489d58c711fd5404dcd6531821d8402bc535af2d0bb6ccc7e569d1faa8b4f5daa78535d5ff2d1a80475daa5b3bd05be8cff9c82f8e066d5eb71ca63795a221e6b17429b80081b140033ccce91450b49c68f317f4f58b67de17e94dc02204bd25730295ff2a3aa4f94065f8e253c8f95e326fb7b6ece1966c4d50e1b0e8e8e69c2bc94f0d80ce65eda75734611940aa669ecc3835236f346d00204ab14a1473f0907e4a24e2acc04c32d71a75f6bff68247b619c21abcc32e6b2e2ab87f0b319ce70f16d1aaf4db3f9e1ed3430d28786a622855261a160516afe5435fe4c525b23a4ef7ae2aa6df651e31e217dfacc7aae35e81772bc2b5cad20f7fcee14d8dd6fb381002ff545abda8e3f64f40bb4974b3ee8e6a92f189aa653d239a7a27112d532c00e43162b216a2504335a88fc6967e474ded0c75de9c8cdc3a2da68ed3816e86ae58f20cebb98bd32003717df6d0eae3ffb369fcd716c07677ddeb3a1b2486a921f5af05671496b955cf7aee5be73bad7f8e955423fca8e41fbecd2f372e669f692e04305d2dc464862cbed058aa4a86d1b1693b1ea979bef6f1165e0815ccff3e3296121c09a88ec7dd5478f2b62afc01da8f20cd000ce874f2cc051f64e6ed0321c521086d2fd179518dc70c0be94e8759051a7a20c90cfdbead001f35687f03823fb730e16314603061c545593512448acf27608eada9ccc66826b53f5542d92726bc53374f0b3b4771459e8ee7e84a573e352434bffbac1f4cb588f23ef411bd72eb26a497f33d186dfe7415c3034f7c1c83f81d40f5540546abe97511e1f733f12eb00d95da8178aca7814a493b2b1867e35c8dc148fa1ec042365879a706bd782c266f31a8cc2df0c1e620f3a4b8acbb13e5b738f260aa18e53fa29403f68aeb1b222b7f9532ea423fc880d4579e54860fa893c9b5d28a30c4b3e7e4d7e748b793752cd04732ac75e2fb4d5e03ccc02932b851eb83f1deb15461c204c613bba1724c74d586382ac70ce9c8b365d17ea88ceccc386da44747e280b4740b0b2a037ce084e87f7f5af030a4230ae984e909be84e9acbcf3aa5b982d16be793505b8ce2dde7e6255a1b514e9f869ff08262cdb3cc9a1d688dc27e39e3ce44844ccfcec46573e82a814a379f663e5c16f5dc5495229fd2e63df760bef6a83704a3a1a4c0182465033e693b3e62ce2ecd91dafb0427862f85fdb73c4dad72d2b3b678684048b5507d2c56e91cefe52e9c80cf8cb2d957cd09d41155a1fc9db98ad2c7c52d43f509d752973d7b43f882824e5beda53a7a29795f8afd57d84750bb80b24dd3767306389e79be75f61e9d5129843f2cb5257da1fe724fa6bf382d7d830a70652da51047a52688a4024a15f511cc883a67d59767ef272a3231aac1734a35e7b2cf04b091917b413eb71cb0e70a2bcbdec223d6fffd54655b9eb81fd9d0e00c1fa8d0c591d89e77eb0a16b015c5f177a1585032dcdb9526632ec6ddda64e2781155192e41bdff87f8f09d768237f79b359fac6a80a70226f16dcd63691e9fcaa2dea500267f2511efdfe2756f4a028f139be832ac9cf5b10993eabd31b8c28b091326897196e635c8a0131b97d4611e973ed947309691816e5d4224a769a176c7fe8c485eb4c42825026f7a74e5a0b1270362771b312faa4dd9f26c1dcee6564d9acd93c8d7f92e94e0a1ea3558a03ded3598ebfa69bb660d93e83f9eecb3a89cf780b06973e8e52325f5482323e1808219d7820c0d5a9813dae812778b7d4a394de37068e4d253b972ebccb914b112fe400412a021f5633c10d7267f851319cc235720a26fbd3fd8de29cae950a2f54e7792924ab65ad97c4c7c70920d05110c52a04dbece125046b29786efb000cafda144a0a82e88c222a766ba6d6725bd4c9ebd688f20bcea2cd30992ca526b653c412197277136375a6e473dd0d3e8165eb175a093acccf3136a65461feb1cb008ae6ea1ef6ad02df9c144d05f6da845fcfd2e79794e3d6bab2e9eec140544c4997986827c43c6ea9c1d13e3383e3bdeabc6f80d9811a678109badda8f440f170905ebcc26dbcc4c25c0376532fc3e1e21ef17152c8af4625c566a0fa0ba51357a7c73577769fe707bb9ac04766130f15e7d6851e2e3c38f768542de0cc272e147ccf9f8755452c1ababb44d16cb0ee1b6e5a1fc5a813739c4a4f412d67b4e0a070fd16bdbcbbdb98da6492071cf9fa165a4ff7ecc51e39f73d8e2a1f550af9203fca625bd7d815ea5eeb3f73b5fd86a62dc5b20de6cc0a3d0ad7ee37ef6f8ee86fdbcc0f145e9b1fc1339703d6f86a25dd85c833f32e80b78b66d252144d75a54c4a73b55f05682ac402b97ed1f3d174399e029ebe15ad4f7931b50f532403adfcc9851c2a3f26034f63338f3384358a5e29ff8010e4cb031a01243a61e0096b7018147587f1aeb1423d28c15d368582805e6ac2df88d96a797865d5397689bbf35385e295d81a425a2e2166dd47ede663de0815ac7fdb0ede43fa6de9ef5d7b2d1325b0c576e6f2da78c8fe60cbdae1fc22179c98d45c7faa60b8d613943554eee3c09368a2e2d8586ac5e57d68affa80d64551865aca2810d2362dc4b90e8e761692d07e931dfd9598131e83974ed3a3ffd57ff7e6806ec1f05f278045d9a86895385ca4b463dd720f9a12896a33c0a415bc737141eeb42794875149751b4dbb3c0e0c2cf7815e3de3e957e7a77f53219e9207a83cc04d2bfd3dcdd450e6325824626d6e6b6179dd379d5f93f2579bc6119e3d83a4e450e8a6c8ff6484f5b662123b8515d732f15a1959cd728744427efc7b24da8dbb015ba2e943a07585434bb2b8758f3bd737867bfdff3cb2e572ea17038a52f9fdbf193cfe50103ae73b4b88b6dff6a2598780fc0fa7243ee7928768006547d697bcd2d9d5a7a2758f869679210b7ece3d1f3a44f654a71c7bc7b2e1ac25df94c2a988dd87f3a20804f1db5ab406995f488b62ff39c59c59be052abbb9bd8c9a95da0d7842ebe8a8c815523e22bc326e67c7cad879196aaa89fb0e33cfe9e8b3bdcd932d374a6c18035629956236599b2d79ed39813ab39621ed31f223077d2f0021421242f52658991c8f1364e8f9fbec3db0334565d8ad3dce0f700243f85c40000000000000000000000000000000000060711182126"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"classicalPub": "035e6ea9db0fe35a8c23d3759765720e8f6130e5d7094d3a3efc5ef1b83333219f",
|
|
24
|
+
"pqPublic": "4998545ea479b3baf5c863524ded6d749f056f1054df6e5d1a8012f1afd97dbaaf7de18581c88dc2352cf81328be8fee6db02565e75432661dc5b5ec9e7503e2ee04075cc51fb444759092e20dce1626486d6182e9e1554aed8e5a6738efa52ed46add5d9809067c2b83d82433d7da5b24c0666994086d580d8d962259b10b0b62c3cb64d1e63a80c2933be9a9ef09aab25f1a4302af474c3c1019e7ec2e982ab55fa75a06fc054e775a76815e4fdec6925e6ef75a5e0ff726d69ebd995a0a969a83289f7df12aa625937ef42fc4a3ed9d9bf3b4227cb05858374c2d8b6c89b122d93c23250999bc9a12b82bb109cc6f0ebae7dc6e0ca0339302668e1da1a0c0281c13ed4ab5aea65945a2dc966fc0a46c6cc762366dc56695768b4b05173d4f86452551fc858434c7604c9e4f4740b70f6015354b074f64153b6a54ce23e5699ec288c4436b2776098109152bdaa2fd715c4ca545c97c135127dc45da3dcf780ddaa3c831fb5d8fedc713cf18341b508bbf78b9511237273802d62e90135e10dd17a8d82a587ae21392bd698518d36c6026558c843d54991a509d0ac5f1d4a2049e18c5f772f5f3ec3e8c9c3d4edf77d3157e1c11eeb858c8db81ba3903dfe9df609e99a392a74949d66d9c5f20ac1d462e9bcc08b802a8f6d81df57ea5843f05e7963c5710867823c86b28a8665445e772368fc044fdc35d96e60e3311c1a291d197da801674e6b2c6b3ae510a0c5d24766f56f25a0311c0d6ceeb6aeeefa2a9ce102902ff830025968259332f8112a400ea4e36ef8a39679dd9498447d123a2532112403fc3cd218fe785a88430165d8a603fc808f4268d39c202d49bd51493935f92be25a334af2baed21737a29d96997ee436a0ab713c61dc96c28be3b38ed62a77b81fa192803ad259ac055c4a9429eca8e00939eefe0ede4032b25b263f8ca44fb152f6edd7a37b8e72f3d1c9fa875403836324d6bf5f13d4a163df66c1bc4905e48579fcd854adcb0001b192cdc17608820b98cc2cb4406b6249070838d015bff6ca8fad1061d037ba480bdff01deb8e06670673a0ea4e22ca6e1920b157492a09abcac018ce2854ffd266635673c93cd44e0e8d3101a6d70b51a8572b4912619f71d0a5c1245a2ec9f2b828342c21f3de4c2312a836391ac450be133bb5c42e038a9c95a9c045bc5ef3c7887fbada3c6ca810a712170f82788c9ad9296c41aabea86736d39e2d0849e0b7578b59a4e0c526d2ace8fb041c4c9cab78eef6b5f86d7ee76b2a0b73c1c884a45fa59f94bd45f5f1ea0527dd9f0c5f3a0446b5ce6c06ade61bb7e4b16f7e1271207613e543aa044a29d3a082dd2643df4b52daa0e8174d15a37d647d420391ecb714703cdbf8d30d26071ac619190d2407ca95bb2fc597b2bdba4afc7f92caddc0013d4910002d1a961b07430e12820b94d7b02d05dbaca6c27642901027845f3c9ae59960386480461cdc6ca8bb5de7dc0849db6d33cbdd92af3c76362b10e18dab911bc0fb5732e23cfb1801ebe66bd71ede367c24fc479e9ffbc6fe968e2f134701fbddba02883c879161c6ab188036e4acc1a438263da551f106e8143d5cf05d48e922aeaf50d6e1c8b5e6d644e72f27405dfd2827a15092d0657a9b32e153feaffa51bd3abc3aec58cf5607aa8e81f396a732b6db0f9f078d2ff80d23cccbb8e6b2c3582e04249987959afd98194e43be1332b314e5e3bdb45a0def55f929a67ab0ed2fc7ebff764e348427250c8b201e2c84bb3a38b09ea9f8baa6e749d738e410633aeb21db78d4b95c52a01ebb4c657d846f79f18322d2160e950d24bc65e0a59795b12579eab249c749c85b00b539d6b02c73f4a4bd950cee2c4de9db2addeeba77fb9e6cbae2c98d2402aa5b13edc6ae1ee22f2db4f6ec05a99e9d5d3121b06a61b875ea26cc1881c1710cdb83decb201d19d99c72c409a6b9d9643a13e75eb86131f91490ff24af89dfcbc263e52d7d4736ccfd2f8d48de04c2be13176abbb76d0860f8d7362f9944ecf1bc85b5e4d7badf7e2c01b77beaf63891b200f12861861aff1face5169d19bc5f471c0aed6fce1faea76a647997ef22e9cef025b81ea7e5a1b2c697fc6f0057ff36367b37708f9447b32a8d740e8aad38eb8db405315b53453ca6ae26e05751c6c781e63341e3a2e61e0997e51e5b899e267ba73b2aa276438516c5a73d806911b57ce276b731306c207489735f43fe8ce10e488d808b4a606050563c49bae23c7db1fc76685c66ab738fceaa760463fe6984756f136d02ea554b1c0ec716a0743835f259c95a71f387db819661f8f3c4c51f56692f83013282b0bd6558c0ae7c49b55996632cf2dedf4b3b935dab80862e9411bc72b9ff2fa4b744ba25b20ff5b45146dd692281d74138a7239ecdd16f61013265786067e89649355d178ca4c5698ffe9ae4f5f2f220b7a6298b3188e192eb48068ad813d72148a1bffa69b1ea63052421798fa8b081d69f16aa5e9df04d95b3575f693d35fe42d747aeea0fb8fd171312528c14f78a57970105a0b6db568c39ce437b815f8d6e80197f2b1b9199f3f86245cbacac24e565742f7c6c60672197cc7b3a99155f8daf6f897568538cb458083c53442c4f145e7f86235bb1ab6a27d3720afae1ee86d53b85cb82a26a6606de424e863b0aa1ecc0c7f443024595ce1c723f8d17a55ec9ab27217463eb853b47ebead79f7b0ee1a71514ca94d0f781056a5556e109ebeefdf1c2ad92f8",
|
|
25
|
+
"classicalSig": "9ab62a2db49c55683006d2506e9aadd61558f0eea0c460f9b8241bff781bbfae4213c87a617cbd7e1a4cce82bdffe51e5bc1a3b249171696f4849b8a4d9b0cbe",
|
|
26
|
+
"pqSig": "5b520f2657fcdf322b8ef38ab0baeb439a3fbc64aca050a7d09d3af23643d9da48ff35531ec2eb9290de9c407e1762f41303e3a08c33bb5040377e0a56b53190a8257c48fb612b3cb53cb7670e88d49602ff09ccdb0c64e0a5bbe3c893fd29559114b0c9a6942915130fed0551e3d97b74bd53ba624d73874d0b8728f76920ed13f1c075e5ddb09c74d0517b3ef9fd9c85093a8323088924f96d6cba4157eb432e8bc336c811e0e2aa255a668c6a990b5f764bbf1913dc2792c1f0292aea59160d620cdd687c6b1cc716f1e73cabde3f335533b4e0375fa215b2007f05202a05e9581940a30dd7271907f62cc12306bce75b902590f161748bca47c1fa4904e8d5571cf93fc0a6034c5a0fbe85e713d32662d916765b5d2807e2456f9759014d0593ab1f1d2257e5d143a0b61141abb7b3d62a482f5b72fa69ee7f2060391a7ef139d4889d69ad906de2b59157990d730f97544a892fe057307c324d45b5f01b36e88bf62c46b6f10c465a698444c66819ab837b40ad3f89d721d222ea479eef22f5fc6abf92ace2436f0376e3ef0a23aa95b03ba2611c169c457215f63d9dda63a851e7d9ff4a207e831812e17a8b988755a1668f6be41e23e95a414f6a1940db1f4698b37edf9e14140dd084abdc1ccb03eb46df2c0a12aecb11709614695046145cb99d3d099a75d935c1615e691c9f3391b7cfe1ba56f4058c8aff9eee2118e5f3ef01511beef51310927f07f2a2a83331140ee08fe77ad25bcc89373675be26d1dadb46cd8a4ef1d248bdd87e16f02c386adb82b9eaa21a07280ee17c3277083e3430c06d4547d024a075b40dbc5e0a79c67f6f1c7e0a4b1b5b07fe70509073a291d26c1b6932d4a0bf9336886153f987e7deb903357b893af05e6d928bdbe23d8c6f7fb282df7c4ed19f08197f4693fcae731e7a465b66374eb0b957e97fed063145c2c12a13618156b969979a84d5db64b4337fba33ccccd68c68bb71a96b79279b5f71f97118c16faf437a001fc468865763d8887da74243d48cf24cee63f13be8ad4b4d0d7009176c961769408db0b6479d66f1dbbe5186aad46d6cab45dc2bc4cd0c16f1ba73e54f082b00856e8e3fb33539245d0b8e89b480a99308fd5355f6633be77a3e3873265cd1fad830f4eda70af8621738908ff3899ce1715dedabba3e8bad5bb7344107807cffc10acba5ccf98710a0080e0817f04307f60009d01d7cf39677f287b2ed392dd2746ce0e0387eec2b865e5e9c55721651c4c6b32bdc89dd68dc51fe13d1af9e1e97bde5445071cf098671c95f90317a17b025b9ea41e38268815c13b1e04802005d8805b4bd553271ec0edabf2c302f60185c8f9ef79c4ea1f4b6eaadd08c90592f97a40f8e1f8c14dbf42c996b01c0932b073f14f0264b34fbd50fa89ee1c8503cd09f3b6708954c18e958cf69c052741f067b5c13d860fc41036ea9977d9f3f611255ecc1b2689a2d3ca7e70e10d5ebbd34dbd9ca9f3a694cd9042817fb4e3a1d65f098aa6cbc64189c57271ed93a44af98d58762749814ecd9858d32b49a8fd77054452b454d96d893afa8a0d87b6bfc5ac98772a50c9067260f795dd792e3b791d79023eafd7659b63d647ca1eb32fddb468b9259519a5bd7cc9ff4f546db5b2b6cca5ccfa75f985ebcb379c0483a274ad765e1c5f998db1aca9d2c719dc859636540c91e57a87846cfda0afcf69e3b26d97ceef60b26e8f1f0ac43934cf090e766ece3e4eeda4e6f11c70219bf620ef0eb3326a6fe5bbd72f3c5bfb204200f3bc10c2d9a911a21cffcc62cb4fda96a0a896f241be1aee018b359f11ae7d6b11877414982eb10d4176e76b5cca68e2091506227e6d4948f4b1e0e138f8af56a969db3ca039f11525b7e9f224fd623fb45ed3ea3c80ffa04fa078e73a102bbd1078187df8c986d88c4d1f7ed9cd7ee9f4e322adae48b807d331a4315ac500098c4073dbc53562cc2b8a21adf0373e164979324f691e77c22f268bcade20d5a970a0d632f5d4133969fd4f09e61560f77622f0e4ae331eb808094ab5eac60b9b8c3542c3a569450cb8019166d9f0ee3940fce2eecaec39cbd05b9b25498dc258fa77aaa36388f8e64ef27d1710ac11356909ceabfa82834e4b2ef6bf85559be331cb6f663a32274eff06adc32d1411bbe1b8c50b6edd968868c33cd5fda51617cc4f4f7e1b58584c6b7c10873ee7c000708c4445def3c8b5c34532c44eb9627fbdd4b5cb3afea04809b5ed777c19a3a95babb5031505e972d0142462894d24ade571f921ed175ca227aa749ff8132ed3d73589d27dc173d701a92c9c2ab6dedfabc42d38fd9dc059aa0a7cf81a6c9559a152402ff9c9e985b77f9e29a4a34ab48452437f3442d538cb50747222fdeaeacd6b47d74d7ea16a49e54dd4218ac6bcf760d82ff329593ee32638c8c708c095d59933832025b0d12ec242a5d595cdb77a20b75faeae779e34575c8fdc032bf8df55d95b7c463e6b61ebc8ff8dd0743e742bccb21718f7b720653b6297dc86b489ba74b376356a670c4d9a0eb19c5f2f9931d2c482c15193fc2557ec4bdd16a56bb1426b7bc5d2b078cd652f243439b677fe4f3900445698c9aa2e0489de20da72218782d95afd4be7edf9dfeb74c9830f85730a2ca3d8d672fae4832ed4a6d6f1aed1a7ae5a6e2d6ddc2c2a14fccddf6f4f869d26db522eb6af7fa95e557be4b2e4cbe059b8a8ef8a1b3fd1a36e8a24dc0d314eec25ed40389e9aba7efa5283319826289afabea5c16c17cc5bba60a9cd7f729c1038f36104f08a26a381b4ae033e03b768261b91f1ec2bc252f0a3e2d1f220ff039ed31cd74f85864cfc7ba4bffc369bad356ac4e4ae4abf3a69d16841ebc789420ed6bbc36bdf7b7e553d4c5f41c4fa49a632b0ad498ad551c578d249353feb9163f1d170141f777d79c74ec368647f526bc8692d3fe2125808f8a044df058f771e5d59e53e3347a0bc5f80f4b69b15221e93289d0db2660a8c45a428e4749a35e24cd3b7a9f9b9219624a677baf1993143b06bc80a0eb906d4454d0d0d2d204e6ad317447834cebcde12fbcce0d1a7a40dfb8260497407148e87443e2c0b64de522cc41d13e7d2c56a734cbd4d7aee95f58755865c90dc8911946bfccd2e56d543e37d1eef36e21dca2fce018eb4a1f3a366229a5b378f3da02d51cee1dd512e05ffbf82cad5d93af32359cf851309626478034470b9e44ebf5ef019152af39dc51f90f24103f68a5b3732d4e3ee2a78a8b0be9db4b5030f493e474a2e412594eff6acf17ee89962a227e30d11ac0c8fd1109cdfa7a35622b21fd677b7748d8f6bdc87da975d5bd0f1c308c65b40cacdd24c750e9021623b3e7b86066388907d2c98b378ab075c9191a2fa94e6f799d41acda933554fe288d6f047bbf9e62004a2669d82c1eaa8ba9b64c0be6ceefdbbc8aaf978b24508abace1980ef6566fb7d02f1435d68451937f0f15fd189a530c200341a8343cccf02c9531efc4e493a44f1f083152e981cdff333a967659ec0e0fe18d1aad778643993f2b36e14c45d35abf686e0eabefa33431636d8ffe54d903bbeb7d31944ecb309b0c1be852c0ad8d9d6a93f3b1549fd05555e5fc710a473a7aa94b263aece43d62df521fbec960d5f296db50022d3040ab9cc2e36820a2d3fb47fc116728a874c5d24a8fe4a554d8dbdfba5668f53f97a07b71b3a619d25b9206709f2b305ce54c42c8708acd8c60663382f8905acf5515827474c6dd4bec8f7fd90e5030d3c119d0c066471bc018864badb12bead3908320a71d3783b84dff675715b08def2b1fe4219a0b040079237dd4a0ef907f43cbca11158e8831fb98d138314f33a2282ffa7a916e90ec7d7e1a4856ec2874a4bca38253f9702d99dcea2e428d3dd92e74b27929a370e79544dc0612dadacae4896eeed6623cd5b03b9f8d6419f562a3c2d06b957823fc8c6a177ce426b7bc8f536ea1c6df4ba0e894c83e95dc655e02dc6fd62556019a33819c583e6e1787466bcd4b1e30fa951c45e2672cfdcefa0baa000fa095298726df6d90cf068705a8e38cc08266f8fb6a6f93b86d2746d332022c685c7a04a3a25a1a86163a43a794dc63215d9632c127ddaac59c54600626cb048ce0488caedfbf2ddd7797469e17358a7e1566fc2406a16cadce531db6fc9fe07c2a01a2cb08aff6580c539ac976d8c921472ba0c88ae5009f9891bb6c5c587bbe129a3d38f97bca764fcefa7019f0d024b407f8cce1772e5c198e8f51e1e7915e4db01a0f2fa77a80b084e3c3067dcfc1a0d6ca7becfe9e999c3646616287ed05d52d48ab209137ab5f3ce75440baa0aecfd4f6196fa769db756375188598bd4e6639c4f6fda5b31badfa773c118524ea3fdbe99f6f3e6bda3330e4b02259dd33ea2cd33dba7735cea131d3de3227aa17562c6e338ba2e687793dbc0adc41c17c8d719de8ada44f1feee0c1dd888930e850d5c488a2865b05df5c0b6844bcd7a8c2f6040931c54fd1c4f0f3e215cd3fb5c82402deafe3d7087c94f3bc7bf97c77f3f6d64eae67099a86b8573dc4fdb6e942d80a7174f7cb235ede2cf7e69d409131d360c24686979bb212d3499b2d3197d819aa9c3da66949af51728868caab8d6eff7fa000000000000000000000000000000000000040a10171b25"
|
|
27
|
+
}
|
|
28
|
+
],
|
|
29
|
+
"otsHex": "004f70656e54696d657374616d7073000050726f6f6600bf89e2e884e8929401081a6b84e7216ff7fdb149e29857a53236e78d2d723da5104f051eefd92eff8d82000588960d73d719010380ea30"
|
|
30
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fractal-pqc",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.2",
|
|
4
4
|
"description": "Runnable reference for quantum-safe migration of a Bitcoin-style key: bind secp256k1/Taproot to ML-DSA-65 (FIPS-204), derive P2TR addresses, build+sign BIP-341 key-path spends (official-vector-verified), and broadcast on testnet. Real primitives, honest scope.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -36,6 +36,7 @@
|
|
|
36
36
|
"LICENSE",
|
|
37
37
|
"README.md",
|
|
38
38
|
"bin",
|
|
39
|
+
"examples",
|
|
39
40
|
"src",
|
|
40
41
|
"test",
|
|
41
42
|
"tools",
|
package/src/mutations.mjs
CHANGED
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
* is load-bearing, never that no sentence is missing.
|
|
48
48
|
*/
|
|
49
49
|
|
|
50
|
-
import { mkdtempSync, cpSync, writeFileSync, readFileSync, rmSync } from "node:fs";
|
|
50
|
+
import { mkdtempSync, cpSync, writeFileSync, readFileSync, rmSync, existsSync, symlinkSync } from "node:fs";
|
|
51
51
|
import { tmpdir } from "node:os";
|
|
52
52
|
import { join, dirname } from "node:path";
|
|
53
53
|
import { fileURLToPath } from "node:url";
|
|
@@ -267,6 +267,36 @@ export const MUTATIONS = [
|
|
|
267
267
|
},
|
|
268
268
|
];
|
|
269
269
|
|
|
270
|
+
/**
|
|
271
|
+
* Make the dependencies reachable from the throwaway copy.
|
|
272
|
+
*
|
|
273
|
+
* This used to be `cpSync(join(PKG, "node_modules"), …)`, which worked in a development
|
|
274
|
+
* checkout and threw ENOENT for EVERY user who installed from npm — because npm HOISTS
|
|
275
|
+
* dependencies to the top-level `node_modules`, so the package directory has none of its
|
|
276
|
+
* own. `claims --mutate` is one of the three commands we ask auditors to run, and it had
|
|
277
|
+
* never once worked outside this repository. It was caught by installing the published
|
|
278
|
+
* tarball into an empty directory and running it, which is the only test that would have.
|
|
279
|
+
*
|
|
280
|
+
* We now walk up from the package looking for the `node_modules` that actually holds our
|
|
281
|
+
* dependencies, and link it. Linking rather than copying is also the honest choice: the
|
|
282
|
+
* mutation runs against the SAME dependency bytes the caller has installed, not a copy we
|
|
283
|
+
* made.
|
|
284
|
+
*/
|
|
285
|
+
function linkDependencies(work) {
|
|
286
|
+
let dir = PKG;
|
|
287
|
+
for (let i = 0; i < 8; i++) {
|
|
288
|
+
const candidate = join(dir, "node_modules");
|
|
289
|
+
if (existsSync(join(candidate, "@noble", "hashes"))) {
|
|
290
|
+
try { symlinkSync(candidate, join(work, "node_modules"), "dir"); return true; }
|
|
291
|
+
catch { try { cpSync(candidate, join(work, "node_modules"), { recursive: true, dereference: false }); return true; } catch { return false; } }
|
|
292
|
+
}
|
|
293
|
+
const up = dirname(dir);
|
|
294
|
+
if (up === dir) break;
|
|
295
|
+
dir = up;
|
|
296
|
+
}
|
|
297
|
+
return false;
|
|
298
|
+
}
|
|
299
|
+
|
|
270
300
|
/**
|
|
271
301
|
* Apply every mutation to a throwaway copy and check the named claims die.
|
|
272
302
|
* Returns a matrix an auditor can read without trusting us.
|
|
@@ -279,7 +309,9 @@ export function runMutations({ claimIds } = {}) {
|
|
|
279
309
|
cpSync(join(PKG, dir), join(work, dir), { recursive: true });
|
|
280
310
|
}
|
|
281
311
|
cpSync(join(PKG, "package.json"), join(work, "package.json"));
|
|
282
|
-
|
|
312
|
+
if (!linkDependencies(work)) {
|
|
313
|
+
throw new Error("could not locate the installed dependencies (@noble/*) to run mutations against");
|
|
314
|
+
}
|
|
283
315
|
|
|
284
316
|
const ledger = () => {
|
|
285
317
|
try {
|
|
@@ -368,7 +400,9 @@ export function runAttackAttribution() {
|
|
|
368
400
|
try {
|
|
369
401
|
for (const dir of ["src", "bin", "vectors"]) cpSync(join(PKG, dir), join(work, dir), { recursive: true });
|
|
370
402
|
cpSync(join(PKG, "package.json"), join(work, "package.json"));
|
|
371
|
-
|
|
403
|
+
if (!linkDependencies(work)) {
|
|
404
|
+
throw new Error("could not locate the installed dependencies (@noble/*) to run mutations against");
|
|
405
|
+
}
|
|
372
406
|
|
|
373
407
|
const reg = join(work, "src", "claims-registry.mjs");
|
|
374
408
|
const regSrc = readFileSync(reg, "utf8");
|