Raziel's local mode encrypts your files entirely in your browser. This page lets you — or anyone — verify that the crypto code we serve is exactly the code described here, and that it has not been silently swapped.
/js/integrity-loader.js) pins the hash of the main module and refuses to run local mode if the served bytes differ — your browser enforces this on every use.Upstream source: github.com/dajiaji/mlkem — tag v2.7.0, tarball SHA-256 in the table below. The public key above is the raw Ed25519 public point; to derive the DER file for openssl, decode it: openssl base64 -d -A -in pubkey.b64 > raziel_release.pub (the base64 string itself is DER-encoded SPKI).
| Module | /js/raziel-local.mjs |
| SHA-384 | 9lBBT1gqu2ZXgja7x/dH0g58vZn0+gnxWJApN9/7JgWijR7AbesI6+udpW/G3h6h |
| KEM library | dajiaji/mlkem v2.7.0 (vendored at /vendor/mlkem-esm/, MIT license) — FIPS 203 ML-KEM-768 pure TypeScript |
| Upstream tarball SHA-256 | 4a85db57ce8cf3e6ab5e7a25f2ccbefc6a3a1121de91b0a0349c76c69825bd48 |
| Wire format | RZWB v2 (segmented): header = ML-KEM-768 ct(1088B) + 12B file nonce + segment size (u32be); payload split into 8 MiB segments, each AES-256-GCM sealed with key SHA-256(ss‖nonce‖u32be seg_idx) and AAD binding seg_idx (reorder/splice fails auth). Legacy v1 whole-file boxes remain decryptable. |
Manifest signature (Ed25519, base64):
ROka6FD5L6z9zn3aBS/nwvcmtPZ9oOgB7J4el/3tB5RzvV4s4kNE4c4m0blKNH5Xf7OM8+ENvwSI9qpuiVHvDQ==
Verify with the public key:
pubkey base64: MCowBQYDK2VwAyEA3usuC7OBB2OnjYmnCiFeI0ln2rfaNt7NlYciT85oO/g= # verify: openssl pkeyutl -verify -pubin -inkey raziel_release.pub \ -rawin -in integrity-manifest.txt \ -sigfile <(openssl base64 -d -A -in integrity-manifest.txt.sig.b64)
sha384-9lBBT1gqu2ZXgja7x/dH0g58vZn0+gnxWJApN9/7JgWijR7AbesI6+udpW/G3h6h js/raziel-local.mjs sha384-0x2JwP42aAIxytvR7FKURtdYCBX2ogpeToQ3qOoDLbFt3wMNubL3SkOrjdjNOz9T vendor/mlkem-esm/mod.js sha384-xzxzOOmtngUpFaQZGZh5j1SlURJF6p9DwzEVoqiUlHoB0h86s6NA75J/68BHoR6t vendor/mlkem-esm/_dnt.shims.js sha384-9KrU7ISW6bCxWu7rGkNBM4M48aa69cv8V9ZXJk4CmQTSNk8nFZznTbbXuWtoSwdd vendor/mlkem-esm/src/consts.js sha384-K6eZ88/UNkto5SiPJuwnn8bKUvW4WU8A3rEFmD7XrfzzOj0BHqUfNvvFcnIl6VoI vendor/mlkem-esm/src/deps.js sha384-z2lO8VxAtHgEbQ3frIchfwtnj5Twp4qG9xUt4wu4HRrm7gmd5ATALqPx5HnJny4c vendor/mlkem-esm/src/errors.js sha384-z0dQZuTpVhlJhRpzBVjQTCgdq+BUSh89DMD4c8ea5gn4XTF+416jeLVKPWSl2O8q vendor/mlkem-esm/src/interfaces.js sha384-xIIDMbPdbMilCiOXwi3oOMh491YW4/gcDVfEAPbebzqWOeWzJPCWFImc1o5kgyi6 vendor/mlkem-esm/src/mlKem1024Base.js sha384-HviZ2jNeFSb27Y9NI/wg0NMGg7T/pTjr2dYzpUmKMQ4b7gpioyCVx+4oYXRIuyt0 vendor/mlkem-esm/src/mlKem1024Impl.js sha384-T9mCouNwbuwHWty8+WyPyktnPidPh0PE/TuxHRlCJCsZ9HWJkJgylfsyyAr4KYiK vendor/mlkem-esm/src/mlKem1024.js sha384-uHv0HfCc0Fx1U2jSoNhHA15ZKYPaGn1fl6An4zPc2CBdj4B7/qXm5QGOsv34aQzZ vendor/mlkem-esm/src/mlKem512Base.js sha384-xyvc98DZqsgmz93WniKiaKVMNWyr96IbDdYiVfvoOHxN6bbxiEB2CBqfSLZXdyL0 vendor/mlkem-esm/src/mlKem512Impl.js sha384-tqQ9pT7cHq/xuMBKUqdJsK4vgWEYCv01JoTKJi+58M7fz3HjJBi98tlqfE8zl/a1 vendor/mlkem-esm/src/mlKem512.js sha384-5xlVHP2axEx+4xqye3IvZajjTnyrgnx2hyR8mAYCFdjEQ+8m7Wt9jlQPPT+l5zyy vendor/mlkem-esm/src/mlKem768Impl.js sha384-JdA54hEd523LGoIKk1Cyp+D77APZT0gohtuSQ1OCDBbPLfMltrIxqFmz5Djqx2Tt vendor/mlkem-esm/src/mlKem768.js sha384-g0b4w/aD8a2eg0CYdGshjtkrpDEs5SHqisfriHC/BN2S56v8Kd2o9tZ6yII1s0hO vendor/mlkem-esm/src/mlKemBase.js sha384-DqjQqykaRBczkkJFwYdUa6daLmldcQ8sOMAQGSCe4SJQtcXZ4tnX1+674bbCaU4M vendor/mlkem-esm/src/sha3/sha3.js sha384-1lvBiBIIcXKZL8OSGQtnvtYDHXz7tSEtUgmkUcYk/mX7iCkMHWBc8xPNEGDQfS5W vendor/mlkem-esm/src/sha3/_u64.js sha384-APle4r3FaHxNZpTCJYq78LI11f14BfU4JmoBsCcQZgFPmEHH9VmcjxIhTHozUzAA vendor/mlkem-esm/src/sha3/utils.js sha384-yTM7vIFPwvDYo64LAKSR2WYu2PwZBmB1J5K694IzwQxrOfK6aTwNmDbh+DCniif5 vendor/mlkem-esm/src/utils.js