3:I[4707,[],""]
5:I[6423,[],""]
6:I[6665,["7281","static/chunks/7281-843e037a8e70f2dc.js","2972","static/chunks/2972-206c84f960364fc8.js","5315","static/chunks/5315-f69dee48ed012c1d.js","815","static/chunks/815-3b9d8cc363060263.js","2490","static/chunks/2490-f3452dfcdf496696.js","6529","static/chunks/app/(docs)/layout-4fa0829f760f53cf.js"],"Navbar"]
7:I[6812,["7281","static/chunks/7281-843e037a8e70f2dc.js","2972","static/chunks/2972-206c84f960364fc8.js","5315","static/chunks/5315-f69dee48ed012c1d.js","815","static/chunks/815-3b9d8cc363060263.js","2490","static/chunks/2490-f3452dfcdf496696.js","6529","static/chunks/app/(docs)/layout-4fa0829f760f53cf.js"],"Footer"]
4:["slug","security","d"]
8:{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"}
9:{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"}
a:{"display":"inline-block"}
b:{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0}
0:["lhuH3gKfmvR-zf5xG0U6e",[[["",{"children":["(docs)",{"children":["docs",{"children":[["slug","security","d"],{"children":["__PAGE__?{\"slug\":\"security\"}",{}]}]}]}]},"$undefined","$undefined",true],["",{"children":["(docs)",{"children":["docs",{"children":[["slug","security","d"],{"children":["__PAGE__",{},[["$L1","$L2",null],null],null]},[null,["$","$L3",null,{"parallelRouterKey":"children","segmentPath":["children","(docs)","children","docs","children","$4","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined"}]],null]},[null,["$","$L3",null,{"parallelRouterKey":"children","segmentPath":["children","(docs)","children","docs","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined"}]],null]},[[null,["$","main",null,{"className":"min-h-screen relative z-10","children":[["$","$L6",null,{}],["$","div",null,{"className":"pt-24 pb-16 max-w-4xl mx-auto px-6","children":["$","$L3",null,{"parallelRouterKey":"children","segmentPath":["children","(docs)","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[]}]}],["$","$L7",null,{}]]}]],null],null]},[[[["$","link","0",{"rel":"stylesheet","href":"/next/static/css/7d3295cdb652feda.css","precedence":"next","crossOrigin":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/next/static/css/c025d3bf1b5d959c.css","precedence":"next","crossOrigin":"$undefined"}]],["$","html",null,{"lang":"en","data-theme":"dark","className":"__variable_aa659e __variable_a607d1 __variable_ba5569 __variable_595324","children":["$","body",null,{"className":"bg-[var(--bg-base)]","children":["$","$L3",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":"$8","children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":"$9","children":"404"}],["$","div",null,{"style":"$a","children":["$","h2",null,{"style":"$b","children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[]}]}]}]],null],null],["$Lc",null]]]]
d:I[9836,["7281","static/chunks/7281-843e037a8e70f2dc.js","2972","static/chunks/2972-206c84f960364fc8.js","7775","static/chunks/app/(docs)/docs/%5Bslug%5D/page-edcecef592b5c2ea.js"],"DocArticle"]
e:I[2972,["7281","static/chunks/7281-843e037a8e70f2dc.js","2972","static/chunks/2972-206c84f960364fc8.js","7775","static/chunks/app/(docs)/docs/%5Bslug%5D/page-edcecef592b5c2ea.js"],""]
2:["$","$Ld",null,{"children":[["$","$Le",null,{"href":"/docs","className":"inline-flex items-center gap-1.5 text-sm text-[var(--text-tertiary)] hover:text-[var(--orange)] transition-colors mb-8","children":[["$","svg",null,{"width":"16","height":"16","viewBox":"0 0 24 24","fill":"none","stroke":"currentColor","strokeWidth":"2","strokeLinecap":"round","children":[["$","path",null,{"d":"M19 12H5"}],["$","path",null,{"d":"M12 19l-7-7 7-7"}]]}],"Back to docs"]}],["$","article",null,{"className":"prose-zoff","children":[["$","h1","h1-0",{"children":"Security Model"}],"\n",["$","p","p-0",{"children":"Zoff Wallet is designed with a single principle: your private keys should never exist anywhere you don't control. This page explains exactly how that works and where trust boundaries exist."}],"\n",["$","h2","h2-0",{"children":"Key Management"}],"\n",["$","h3","h3-0",{"children":"Seed Generation"}],"\n",["$","p","p-1",{"children":["Zoff generates a 24-word mnemonic using the BIP39 standard with 256 bits of cryptographically secure entropy from the browser's ",["$","code","code-0",{"children":"crypto.getRandomValues()"}]," API. The mnemonic is shown to the user exactly once during wallet creation and is never stored in plaintext."]}],"\n",["$","h3","h3-1",{"children":"Key Derivation"}],"\n",["$","p","p-2",{"children":"From the mnemonic, Zoff derives Ed25519 signing keys using BIP32-Ed25519 (the Edwards-curve variant of hierarchical deterministic key derivation). Each account uses a unique derivation path, allowing multiple accounts from a single seed."}],"\n",["$","p","p-3",{"children":"Canton Network uses Ed25519 for transaction signing, which provides 128-bit security, compact signatures (64 bytes), and fast verification."}],"\n",["$","h3","h3-2",{"children":"Encrypted Keystore"}],"\n",["$","p","p-4",{"children":"The seed is encrypted before storage:"}],"\n",["$","ul","ul-0",{"children":["\n",["$","li","li-0",{"children":[["$","strong","strong-0",{"children":"Algorithm:"}]," AES-256-GCM (authenticated encryption)"]}],"\n",["$","li","li-1",{"children":[["$","strong","strong-0",{"children":"Key derivation:"}]," The user's password is stretched using a key derivation function to produce the AES key."]}],"\n",["$","li","li-2",{"children":[["$","strong","strong-0",{"children":"Storage:"}]," The encrypted blob is stored in ",["$","code","code-0",{"children":"chrome.storage.local"}],"."]}],"\n",["$","li","li-3",{"children":[["$","strong","strong-0",{"children":"Decryption:"}]," Only happens in the extension popup context when the user enters their password. The decrypted seed is held in memory only for the duration of the signing operation, then explicitly zeroed."]}],"\n"]}],"\n",["$","h3","h3-3",{"children":"What's Stored Where"}],"\n",["$","table","table-0",{"children":[["$","thead","thead-0",{"children":["$","tr","tr-0",{"children":[["$","th","th-0",{"children":"Data"}],["$","th","th-1",{"children":"Location"}],["$","th","th-2",{"children":"Encrypted"}],["$","th","th-3",{"children":"Sensitive"}]]}]}],["$","tbody","tbody-0",{"children":[["$","tr","tr-0",{"children":[["$","td","td-0",{"children":"Encrypted seed"}],["$","td","td-1",{"children":["$","code","code-0",{"children":"chrome.storage.local"}]}],["$","td","td-2",{"children":"Yes (AES-256-GCM)"}],["$","td","td-3",{"children":"Only if decrypted"}]]}],["$","tr","tr-1",{"children":[["$","td","td-0",{"children":"Account names"}],["$","td","td-1",{"children":["$","code","code-0",{"children":"chrome.storage.local"}]}],["$","td","td-2",{"children":"No"}],["$","td","td-3",{"children":"No"}]]}],["$","tr","tr-2",{"children":[["$","td","td-0",{"children":"Party IDs"}],["$","td","td-1",{"children":["$","code","code-0",{"children":"chrome.storage.local"}]}],["$","td","td-2",{"children":"No"}],["$","td","td-3",{"children":"No (public)"}]]}],["$","tr","tr-3",{"children":[["$","td","td-0",{"children":"Public keys"}],["$","td","td-1",{"children":["$","code","code-0",{"children":"chrome.storage.local"}]}],["$","td","td-2",{"children":"No"}],["$","td","td-3",{"children":"No (public)"}]]}],["$","tr","tr-4",{"children":[["$","td","td-0",{"children":"Session JWT"}],["$","td","td-1",{"children":["$","code","code-0",{"children":"chrome.storage.session"}]}],["$","td","td-2",{"children":"No"}],["$","td","td-3",{"children":"Low (short-lived, wiped on browser close)"}]]}],["$","tr","tr-5",{"children":[["$","td","td-0",{"children":"Connected dApps"}],["$","td","td-1",{"children":["$","code","code-0",{"children":"chrome.storage.local"}]}],["$","td","td-2",{"children":"No"}],["$","td","td-3",{"children":"No"}]]}],["$","tr","tr-6",{"children":[["$","td","td-0",{"children":"Password"}],["$","td","td-1",{"children":"Nowhere"}],["$","td","td-2",{"children":"N/A"}],["$","td","td-3",{"children":"User's responsibility"}]]}],["$","tr","tr-7",{"children":[["$","td","td-0",{"children":"Unencrypted seed"}],["$","td","td-1",{"children":"Nowhere (in-memory only)"}],["$","td","td-2",{"children":"N/A"}],["$","td","td-3",{"children":"Yes — never persisted"}]]}]]}]]}],"\n",["$","h2","h2-1",{"children":"Trust Boundaries"}],"\n",["$","h3","h3-4",{"children":"The popup context is the trust root"}],"\n",["$","p","p-5",{"children":"The popup page is the only execution context that ever handles decrypted key material. It runs in a separate Chrome process, isolated from web pages and content scripts."}],"\n",["$","h3","h3-5",{"children":"The service worker sees no secrets"}],"\n",["$","p","p-6",{"children":["The service worker (background.js) handles message routing and state sync, but it ",["$","strong","strong-0",{"children":"never"}]," receives the password, decrypted seed, or private keys. Even if an attacker compromises the service worker, they get:"]}],"\n",["$","ul","ul-1",{"children":["\n",["$","li","li-0",{"children":"Account metadata (names, party IDs) — public information."}],"\n",["$","li","li-1",{"children":"Session JWTs — short-lived and scoped to the current browser session."}],"\n",["$","li","li-2",{"children":"No path to private keys."}],"\n"]}],"\n",["$","h3","h3-6",{"children":"The content script is a dumb relay"}],"\n",["$","p","p-7",{"children":"The content script and injected provider only pass messages between the web page and the service worker. They never see key material, signatures, or the keystore."}],"\n",["$","h3","h3-7",{"children":"The backend is a proxy"}],"\n",["$","p","p-8",{"children":[["$","code","code-0",{"children":"api.zoff.app"}]," proxies requests to the Canton participant node. It handles:"]}],"\n",["$","ul","ul-2",{"children":["\n",["$","li","li-0",{"children":"Party allocation (receives only public keys)."}],"\n",["$","li","li-1",{"children":"Authentication (verifies signatures, never sees private keys)."}],"\n",["$","li","li-2",{"children":"Transaction submission (receives pre-signed commands, never signs on behalf of users)."}],"\n",["$","li","li-3",{"children":"Balance queries (reads from the Canton ledger)."}],"\n"]}],"\n",["$","p","p-9",{"children":"The backend stores no user data beyond transient challenge nonces. No private keys, no seeds, no passwords, no personal information."}],"\n",["$","h2","h2-2",{"children":"Threat Model"}],"\n",["$","h3","h3-8",{"children":"What Zoff protects against"}],"\n",["$","ul","ul-3",{"children":["\n",["$","li","li-0",{"children":[["$","strong","strong-0",{"children":"Server compromise:"}]," If ",["$","code","code-0",{"children":"api.zoff.app"}]," is breached, attackers get nothing useful. No keys are stored server-side. Users' funds remain secure."]}],"\n",["$","li","li-1",{"children":[["$","strong","strong-0",{"children":"Network interception:"}]," All communication between the extension and backend uses HTTPS. Signed commands are tamper-evident (Ed25519 signatures)."]}],"\n",["$","li","li-2",{"children":[["$","strong","strong-0",{"children":"Extension process isolation:"}]," Chrome's Manifest V3 architecture enforces strong process boundaries between the popup, service worker, and content scripts."]}],"\n",["$","li","li-3",{"children":[["$","strong","strong-0",{"children":"Malicious dApps:"}]," dApps can only interact through the ",["$","code","code-0",{"children":"window.cantonWallet"}]," provider. Every ",["$","code","code-1",{"children":"signAndSubmit"}]," call requires explicit user approval in the popup. dApps never see key material."]}],"\n"]}],"\n",["$","h3","h3-9",{"children":"What Zoff does NOT protect against"}],"\n",["$","ul","ul-4",{"children":["\n",["$","li","li-0",{"children":[["$","strong","strong-0",{"children":"Compromised browser:"}]," If the user's Chrome installation or operating system is compromised (keylogger, malicious extension with ",["$","code","code-0",{"children":"debugger"}]," permission), all bets are off. This is true for any browser-based wallet."]}],"\n",["$","li","li-1",{"children":[["$","strong","strong-0",{"children":"Physical access:"}]," If someone has physical access to your unlocked device and knows your wallet password, they can access your funds."]}],"\n",["$","li","li-2",{"children":[["$","strong","strong-0",{"children":"Seed phrase exposure:"}]," If your 24-word recovery phrase is stolen (because you stored it in a text file, took a screenshot, etc.), your wallet can be imported and drained from any device."]}],"\n",["$","li","li-3",{"children":[["$","strong","strong-0",{"children":"Phishing:"}]," If you enter your seed phrase on a malicious website pretending to be Zoff, your keys are compromised. Zoff will never ask for your seed phrase outside the extension popup."]}],"\n"]}],"\n",["$","h2","h2-3",{"children":"Recommendations"}],"\n",["$","ol","ol-0",{"children":["\n",["$","li","li-0",{"children":[["$","strong","strong-0",{"children":"Use a strong, unique password"}]," for your Zoff wallet. Don't reuse passwords from other services."]}],"\n",["$","li","li-1",{"children":[["$","strong","strong-0",{"children":"Write your seed phrase on paper."}]," Never store it digitally."]}],"\n",["$","li","li-2",{"children":[["$","strong","strong-0",{"children":"Verify the extension source."}]," Only install Zoff from the Chrome Web Store or directly from zoff.app."]}],"\n",["$","li","li-3",{"children":[["$","strong","strong-0",{"children":"Review dApp connections regularly."}]," Revoke access for dApps you no longer use (Settings → Connected dApps)."]}],"\n",["$","li","li-4",{"children":[["$","strong","strong-0",{"children":"Keep your browser updated."}]," Chrome security patches protect the process isolation that Zoff relies on."]}],"\n"]}],"\n",["$","h2","h2-4",{"children":"Audit Status"}],"\n",["$","p","p-10",{"children":"Zoff has not yet undergone a formal third-party security audit. We plan to pursue an audit before or shortly after mainnet launch. The security model described above reflects the actual implementation as of the current DevNet release."}],"\n",["$","hr","hr-0",{}],"\n",["$","p","p-11",{"children":["Next: ",["$","a","a-0",{"href":"/docs/faq","children":"FAQ →"}]]}]]}]]}]
c:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","1",{"name":"theme-color","content":"#1C1410"}],["$","meta","2",{"charSet":"utf-8"}],["$","title","3",{"children":"Security Model | Zoff Wallet"}],["$","meta","4",{"name":"description","content":"Self-custodial web wallet for Canton Network"}],["$","link","5",{"rel":"manifest","href":"/manifest.json","crossOrigin":"use-credentials"}],["$","meta","6",{"property":"og:title","content":"Zoff Wallet"}],["$","meta","7",{"property":"og:description","content":"Self-custodial web wallet for Canton Network"}],["$","meta","8",{"property":"og:site_name","content":"Zoff Wallet"}],["$","meta","9",{"property":"og:type","content":"website"}],["$","meta","10",{"name":"twitter:card","content":"summary"}],["$","meta","11",{"name":"twitter:title","content":"Zoff Wallet"}],["$","meta","12",{"name":"twitter:description","content":"Self-custodial web wallet for Canton Network"}],["$","link","13",{"rel":"icon","href":"/favicon.ico","sizes":"32x32"}],["$","link","14",{"rel":"icon","href":"/favicon.svg","type":"image/svg+xml"}],["$","link","15",{"rel":"apple-touch-icon","href":"/apple-touch-icon.png"}],["$","meta","16",{"name":"next-size-adjust"}]]
1:null
