{"_id":"@47ng/opaque-client","_rev":"15-6e940606b6c362a0f56c6484c23ab78b","name":"@47ng/opaque-client","dist-tags":{"beta":"0.0.1-beta.16","latest":"2.1.5"},"versions":{"0.0.1-beta.7":{"name":"@47ng/opaque-client","collaborators":["Marcin Lazar <marcin.lazar@pm.me>","Hawkheart","r0kk3rz","François Best <npm.opaque@francoisbest.com>"],"description":"An implementation of the OPAQUE key exchange protocol in WASM(WebAssembly)","version":"0.0.1-beta.7","repository":{"type":"git","url":"git+https://github.com/47ng/opaque-wasm.git","directory":"packages/client"},"module":"opaque-client.js","types":"opaque-client.d.ts","sideEffects":false,"keywords":["cryptography","crypto","opaque","passwords","authentication","wasm","js","browser","webassembly","node","wasm-pack","bindgen","wasm-bindgen"],"type":"module","exports":{".":{"import":"./opaque_wasm.js","types":"./opaque_wasm.d.ts"}},"license":"(Apache-2.0 OR MIT)","publishConfig":{"access":"public"},"devDependencies":{"sceau":"^1.3.0"},"scripts":{},"bugs":{"url":"https://github.com/47ng/opaque-wasm/issues"},"homepage":"https://github.com/47ng/opaque-wasm#readme","_id":"@47ng/opaque-client@0.0.1-beta.7","_integrity":"sha512-qfBYrIkRioKd2FApC98aqZ0CsXQLLsBNDnyhvZJHz3AXbyqF8NQTHRfi6GM3kXowDP+UJY+GXFWBOOe3iaYmlw==","_resolved":"/tmp/4c2c12dd81ea3c6b0072cc14446bc0b3/47ng-opaque-client-0.0.1-beta.7.tgz","_from":"file:47ng-opaque-client-0.0.1-beta.7.tgz","_nodeVersion":"18.13.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-qfBYrIkRioKd2FApC98aqZ0CsXQLLsBNDnyhvZJHz3AXbyqF8NQTHRfi6GM3kXowDP+UJY+GXFWBOOe3iaYmlw==","shasum":"4d20cf420b5a82b1b09deed20c2cc3348bb7a7e6","tarball":"https://registry.npmjs.org/@47ng/opaque-client/-/opaque-client-0.0.1-beta.7.tgz","fileCount":6,"unpackedSize":263492,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEtgeMVVGowOqqmsL089uaEWlHhj1uBTts+ARqGlv0b5AiEAsRspCLkjJDBw2r2gybb9NDogRL78uqaT9eRi3I1C6HY="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj2Z0wACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmocHA/9HH/S7Ayzush/2lGNT2ghlP/eG0WoaW0wUFLrDh6HCOMBJSEt\r\nYaPf5wb9l2YUu31HTnlRIu0buIZHf8+IWU9tEAjQYuNfsG7hTfmuL12dbFsf\r\n3WDolXtyuxlIbY6ryNKN0V97qjExoCuVVRzzCadxn/CZgWW7ApKMxa0Ecqkr\r\nigCryTh62ISQ89v/509ssqBEGDLPkXA68PZ3Vvpxq1LtY3+ohPrbPU+ZbScS\r\nIBCzbsbfUkDfKKVNWQI+43BJtPG+PfEoc9ED6GmOx2ChBOqmmI2Tz/PfLK4z\r\nG7O9Jwg9VQu6/dp3xJuaGjW+kVBrQA+zBp/a/peNjWSCK+hVtfVoLoaxucXB\r\nORMQIsVwgl6qbat2avnK7uBtRB5byKrL1kTLPTiEcZl9Zt/KinW6Ib61wFJf\r\nCSJQM1ltLz0PlgidRpDeue5+cWXoRrpFijHhW5G57n2bTZ43dG9V6fkcOKyT\r\np55QM3q8a+htvgzz4PBjWxgvGiq+SF34PvPXVrR3r2wgGsmBPMf5hA0AzIme\r\nE3JZp8i3ONvUPFEqAu3JejdWV1UZhBNBcURkdkCHXAGPOqGrX095wR+EHUED\r\nZdM4bvMLwwg0/hoAqsPQWqGze06H2B8o4yLV6M6+ixAVgdEYYbznT2C4SjlY\r\noBnAzFd8tP1l4BEImZS6r5tm66T34+QkYIo=\r\n=9Rz1\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"franky47","email":"accounts@francoisbest.com"},"directories":{},"maintainers":[{"name":"franky47","email":"accounts@francoisbest.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/opaque-client_0.0.1-beta.7_1675205936673_0.9591246969697518"},"_hasShrinkwrap":false},"0.0.1-beta.8":{"name":"@47ng/opaque-client","collaborators":["Marcin Lazar <marcin.lazar@pm.me>","Hawkheart","r0kk3rz","François Best <npm.opaque@francoisbest.com>"],"description":"An implementation of the OPAQUE key exchange protocol in WASM(WebAssembly)","version":"0.0.1-beta.8","repository":{"type":"git","url":"git+https://github.com/47ng/opaque-wasm.git","directory":"packages/client"},"module":"opaque-client.js","types":"opaque-client.d.ts","sideEffects":false,"keywords":["cryptography","crypto","opaque","passwords","authentication","wasm","js","browser","webassembly","node","wasm-pack","bindgen","wasm-bindgen"],"type":"module","exports":{".":{"import":"./opaque_wasm.js","types":"./opaque_wasm.d.ts"}},"license":"(Apache-2.0 OR MIT)","publishConfig":{"access":"public"},"devDependencies":{"sceau":"^1.3.0"},"scripts":{},"readme":"# `@47ng/opaque-client`\n\nThe OPAQUE key exchange protocol in WASM (WebAssembly), for web browsers.\nThis implementation is based on [facebook/opaque-ke](https://github.com/facebook/opaque-ke).\n\nBuilt as ESM for browsers from [47ng/opaque-wasm](https://github.com/47ng/opaque-wasm/tree/fork/47ng-opaque/do-not-merge-to-upstream)\n_(a fork of [marucjmar/opaque-wasm](https://github.com/marucjmar/opaque-wasm)\nto allow server/server WASM code splitting, statelessness for the server, and uses Ristretto rather than the NIST P-256 curve)_.\n\nServer (Node.js) counterpart is available in [`@47ng/opaque-server`](https://npmjs.com/package/@47ng/opaque-server).\n\n## Installation\n\n```\nnpm install @47ng/opaque-client\nyarn add @47ng/opaque-client\npnpm add @47ng/opaque-client\n```\n\n## Usage\n\nReference: [OPAQUE Protocol overview](https://www.ietf.org/archive/id/draft-irtf-cfrg-opaque-09.html#name-protocol-overview).\n\n### Registration (signup)\n\nOPAQUE requires two handshakes to perform a signup (technically one and a half,\nthe final response has no cryptographic use to the client):\n\n![Sequence diagram of the OPAQUE registration protocol](./README-1.svg \"Registration\")\n\n<br/>\n\n```ts\nimport { Registration } from '@47ng/opaque-server'\n\nconst username = 'alice@example.com'\nconst password = 'correct horse battery staple'\n\nasync function registerClient(username: string, password: string) {\n  const registration = new Registration()\n  const registrationRequest = registration.start(password)\n  const {\n    data: { nonce, registrationResponse },\n  } = await sendToServer(username, registrationRequest)\n  const registrationRecord = registration.finish(password, registrationResponse)\n  const { status } = await sendToServer(nonce, registrationRecord)\n  registration.free()\n}\n```\n\n> _Note: registration doesn't perform key exchange/agreement,\n> so a login step is necessary after signup to establish a shared key._\n\n### Login\n\nOPAQUE requires two handshakes to perform a login.\n\nThe client will already have the key before sending the second handshake, but\nthe server will only be able to obtain it after doing its calculations, so\nthe key must not be used in the second request.\n\n![Sequence diagram of the OPAQUE login protocol](./README-2.svg \"Login\")\n\n<br/>\n\n```ts\nimport { Login } from '@47ng/opaque-client'\n\nconst username = 'alice@example.com'\nconst password = 'correct horse battery staple'\n\nasync function clientLogin(username: string, password: string) {\n  const login = new Login()\n  const loginRequest = login.start(password)\n  const {\n    data: { nonce, loginReponse },\n  } = await sendToServer(username, loginRequest)\n  const loginFinal = login.finish(password, loginReponse)\n  const { status } = await sendToServer(nonce, loginFinal)\n  const sessionKey = login.getSessionKey()\n  login.free()\n  return sessionKey\n}\n```\n\n### Export key\n\nAfter both registration and login, the client can obtain an `exportKey`,\ntied to the credentials used and only available to the client.\n\nIt can be used to implement simple end-to-end self-encryption to store secret\npersonal data on the server.\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/47ng/opaque-wasm/issues"},"homepage":"https://github.com/47ng/opaque-wasm#readme","_id":"@47ng/opaque-client@0.0.1-beta.8","_integrity":"sha512-DjrngaqERystzV6Qc2MKGGnMLCgnj5mmhjVhcm7HX0l0TGiEbc+w+bHYpY3yEsJkJtTj4u5TmIK3hVo4EhSLjA==","_resolved":"/tmp/38565e3992db9874df844723047327a4/47ng-opaque-client-0.0.1-beta.8.tgz","_from":"file:47ng-opaque-client-0.0.1-beta.8.tgz","_nodeVersion":"18.13.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-DjrngaqERystzV6Qc2MKGGnMLCgnj5mmhjVhcm7HX0l0TGiEbc+w+bHYpY3yEsJkJtTj4u5TmIK3hVo4EhSLjA==","shasum":"8832b230718090778ff623d8315ef328a8886ca8","tarball":"https://registry.npmjs.org/@47ng/opaque-client/-/opaque-client-0.0.1-beta.8.tgz","fileCount":6,"unpackedSize":261898,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICu/ZOaatP8klD0yDm3OQeZwhc0RFp8wv6Gt6wcCfd38AiB9mdPfJPYEgsadA8qmi8b10FwxvvLXo/+zuTrOZUOg3g=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj2aIbACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmr37w//Yi6bNhEQaV/Yr8KjcIOC1+bdAbptDm58+b7FgCBmOEpiRVfo\r\nSjmCz4Q2ZnfEjK7F6eBGaVVomtTe/WUbsEIZlHaRltgp4xshVemHJ0QP0DEo\r\nS82I1DQh9ibogKPbRmnEYFzP+AKlGOzG2REY774pq2wn73tKPhiGLk5UkAP2\r\nYbgrNsiUzDmIRgr7A4Ovk5k0awSqKW/PvhsUxr6wdAhbHABAS0I5ldxxrmSY\r\nS5E8J+HaYIVuM5Ze1AekQR4UCMHc/jL/KlFl0INXdhCsmp9pgvztvABzmU/7\r\n+XugqWYxTz9KQpcoljraC3qPQEAZmuFx+rvr/jEslKmcIvf29ui5Vnm4SSj9\r\nnoBWsBFsO1Wb81R8bmWgV4NpyEozBUYsSare9YHd9y/2Iz2LEdTeuDv8ee/T\r\nrkFZgQaDJnEOkP68FZPBg0NRTE/86B+XvXYrgaRqozMZsjzotjEHKq67wzfk\r\nhcA7zvbhUYxAkQ/FRpfXw9i1CHzlKsf82efrmr95QheTWmcS3b+89qKU6Xrh\r\nrdqpq7s9ivcUUe4uHThllpFt6hWgEMzGGykvkTeLIo8iHNqPq1TDowz9SkxD\r\nMHFvFS6FaCiLYLBkeRnxv2iAQmpH4l8E7UXfd9X8e8qNVfdQFsZB8OhACktP\r\ngvH2ykax1+SPVOFaEKAicPdBc20v6V6PzeI=\r\n=31vh\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"franky47","email":"accounts@francoisbest.com"},"directories":{},"maintainers":[{"name":"franky47","email":"accounts@francoisbest.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/opaque-client_0.0.1-beta.8_1675207194874_0.33600415506946146"},"_hasShrinkwrap":false},"0.0.1-beta.9":{"name":"@47ng/opaque-client","collaborators":["Marcin Lazar <marcin.lazar@pm.me>","Hawkheart","r0kk3rz","François Best <npm.opaque@francoisbest.com>"],"description":"An implementation of the OPAQUE key exchange protocol in WASM(WebAssembly)","version":"0.0.1-beta.9","repository":{"type":"git","url":"git+https://github.com/47ng/opaque-wasm.git","directory":"packages/client"},"module":"opaque-client.js","types":"opaque-client.d.ts","sideEffects":false,"keywords":["cryptography","crypto","opaque","passwords","authentication","wasm","js","browser","webassembly","node","wasm-pack","bindgen","wasm-bindgen"],"type":"module","exports":{".":{"import":"./opaque_wasm.js","types":"./opaque_wasm.d.ts"}},"license":"(Apache-2.0 OR MIT)","publishConfig":{"access":"public"},"devDependencies":{"sceau":"^1.3.0"},"scripts":{},"readme":"# `@47ng/opaque-client`\n\nThe OPAQUE key exchange protocol in WASM (WebAssembly), for web browsers.\nThis implementation is based on [facebook/opaque-ke](https://github.com/facebook/opaque-ke).\n\nBuilt as ESM for browsers from [47ng/opaque-wasm](https://github.com/47ng/opaque-wasm/tree/fork/47ng-opaque/do-not-merge-to-upstream)\n_(a fork of [marucjmar/opaque-wasm](https://github.com/marucjmar/opaque-wasm)\nto allow server/server WASM code splitting, statelessness for the server, and uses Ristretto rather than the NIST P-256 curve)_.\n\nServer (Node.js) counterpart is available in [`@47ng/opaque-server`](https://npmjs.com/package/@47ng/opaque-server).\n\n## Installation\n\n```\nnpm install @47ng/opaque-client\nyarn add @47ng/opaque-client\npnpm add @47ng/opaque-client\n```\n\n## Usage\n\nReference: [OPAQUE Protocol overview](https://www.ietf.org/archive/id/draft-irtf-cfrg-opaque-09.html#name-protocol-overview).\n\n### Registration (signup)\n\nOPAQUE requires two handshakes to perform a signup (technically one and a half,\nthe final response has no cryptographic use to the client):\n\n![Sequence diagram of the OPAQUE registration protocol](./README-1.svg \"Registration\")\n\n<br/>\n\n```ts\nimport { Registration } from '@47ng/opaque-server'\n\nconst username = 'alice@example.com'\nconst password = 'correct horse battery staple'\n\nasync function registerClient(username: string, password: string) {\n  const registration = new Registration()\n  const registrationRequest = registration.start(password)\n  const {\n    data: { nonce, registrationResponse },\n  } = await sendToServer(username, registrationRequest)\n  const registrationRecord = registration.finish(password, registrationResponse)\n  const { status } = await sendToServer(nonce, registrationRecord)\n  registration.free()\n}\n```\n\n> _Note: registration doesn't perform key exchange/agreement,\n> so a login step is necessary after signup to establish a shared key._\n\n### Login\n\nOPAQUE requires two handshakes to perform a login.\n\nThe client will already have the key before sending the second handshake, but\nthe server will only be able to obtain it after doing its calculations, so\nthe key must not be used in the second request.\n\n![Sequence diagram of the OPAQUE login protocol](./README-2.svg \"Login\")\n\n<br/>\n\n```ts\nimport { Login } from '@47ng/opaque-client'\n\nconst username = 'alice@example.com'\nconst password = 'correct horse battery staple'\n\nasync function clientLogin(username: string, password: string) {\n  const login = new Login()\n  const loginRequest = login.start(password)\n  const {\n    data: { nonce, loginReponse },\n  } = await sendToServer(username, loginRequest)\n  const loginFinal = login.finish(password, loginReponse)\n  const { status } = await sendToServer(nonce, loginFinal)\n  const sessionKey = login.getSessionKey()\n  login.free()\n  return sessionKey\n}\n```\n\n### Export key\n\nAfter both registration and login, the client can obtain an `exportKey`,\ntied to the credentials used and only available to the client.\n\nIt can be used to implement simple end-to-end self-encryption to store secret\npersonal data on the server.\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/47ng/opaque-wasm/issues"},"homepage":"https://github.com/47ng/opaque-wasm#readme","_id":"@47ng/opaque-client@0.0.1-beta.9","_integrity":"sha512-2RVaqNTnp0tPXNpAg9ozGalhA16mvzSEIPK/LUZqZkcu4LZtGeK/ZOWjW5V/6Xh8rhNQrxh+gWIc3EkTbOSItw==","_resolved":"/tmp/d0bf01b27e8b263c7dbbbc52a205307f/47ng-opaque-client-0.0.1-beta.9.tgz","_from":"file:47ng-opaque-client-0.0.1-beta.9.tgz","_nodeVersion":"18.13.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-2RVaqNTnp0tPXNpAg9ozGalhA16mvzSEIPK/LUZqZkcu4LZtGeK/ZOWjW5V/6Xh8rhNQrxh+gWIc3EkTbOSItw==","shasum":"5b0fba640d8f5a89d31a91688f2f37a974d55cc2","tarball":"https://registry.npmjs.org/@47ng/opaque-client/-/opaque-client-0.0.1-beta.9.tgz","fileCount":8,"unpackedSize":317670,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDr1B2Qpbnctubq0D/NobA7ArNG4ThwIroYz10p815InAiAJafqcSmtENkTuiqtoRSYHD9vxM3AQ82XjfV2v7dHybw=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj2aRwACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrQqA//VJO2U3HmpceHBt9ihLUSwR2Yk0498P47hQmbNUVsulFyTAnY\r\n1FoAgiArHd3GZ4NP94TMSLOJeHQWqMOCGWhg+haV9UfVJlKQSynczXRAOooo\r\ntmPe0HLBM76YMWUoCaYTRbOIKL/BXav/if9MTEL+I4lHLqOHO2wWtjW1p3xk\r\nsAPr2fytUM6pTGh2vlmP6/Qt8ET9IqoH+laq1yU+rMYkNXjYLakv1eqc4lBj\r\n9ebi0QJwhVEQo7aZasFLNL2m1bLUar7FmDPp6OlejmGcFFnUGaUwwsOnn8yP\r\nLjdu4CVuurOYGUG+SVxQk9xw4F3pCa+PiqzCCdXb+pFqUnx64ZCdO0uhIKtU\r\nWesiS9AqlD1Nx3J3emRE7vB9ajkMinwmPpNwlhLgw3xuoSEBiHJ0ruIkN2w/\r\n7CVOe643jXmAAzU1CkVzHZsezNzQum67dc+5FCrcBOfvy09xLlJbXn//VAri\r\nS+XYj8ARFgthA3TkFl5GWaUCt0PdS6Q9masiUDZUoSpcLNfUIPdBn2zfPkiq\r\nm3JPWT/KkCiPXxoAPwkSgGJHE88uRX6w5BrshgsCuPH/Ahe8zbVwoO124meu\r\nLRt00X3NCMlfRkqDGa7NbwBEeCQfRhLa3la+pSlQJGPBDyyG5j2R7Rg6PUnQ\r\npy2Jm1Zo+VZSkrt4WI/hroxCJDWYAyg+xVk=\r\n=aTGQ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"franky47","email":"accounts@francoisbest.com"},"directories":{},"maintainers":[{"name":"franky47","email":"accounts@francoisbest.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/opaque-client_0.0.1-beta.9_1675207792384_0.2440906682862214"},"_hasShrinkwrap":false},"0.0.1-beta.10":{"name":"@47ng/opaque-client","collaborators":["Marcin Lazar <marcin.lazar@pm.me>","Hawkheart","r0kk3rz","François Best <npm.opaque@francoisbest.com>"],"description":"An implementation of the OPAQUE key exchange protocol in WASM(WebAssembly)","version":"0.0.1-beta.10","repository":{"type":"git","url":"git+https://github.com/47ng/opaque.git","directory":"packages/client"},"module":"opaque-client.js","types":"opaque-client.d.ts","sideEffects":false,"keywords":["cryptography","crypto","opaque","passwords","authentication","wasm","js","browser","webassembly","node","wasm-pack","bindgen","wasm-bindgen"],"type":"module","exports":{".":{"import":"./opaque_wasm.js","types":"./opaque_wasm.d.ts"}},"license":"(Apache-2.0 OR MIT)","publishConfig":{"access":"public"},"devDependencies":{"sceau":"^1.3.0"},"scripts":{},"readme":"# `@47ng/opaque-client`\n\nThe OPAQUE key exchange protocol in WASM (WebAssembly), for web browsers.\nThis implementation is based on [facebook/opaque-ke](https://github.com/facebook/opaque-ke).\n\nBuilt as ESM for browsers from [47ng/opaque-wasm](https://github.com/47ng/opaque-wasm/tree/fork/47ng-opaque/do-not-merge-to-upstream)\n_(a fork of [marucjmar/opaque-wasm](https://github.com/marucjmar/opaque-wasm)\nto allow server/server WASM code splitting, statelessness for the server, and uses Ristretto rather than the NIST P-256 curve)_.\n\nServer (Node.js) counterpart is available in [`@47ng/opaque-server`](https://npmjs.com/package/@47ng/opaque-server).\n\n## Installation\n\n```\nnpm install @47ng/opaque-client\nyarn add @47ng/opaque-client\npnpm add @47ng/opaque-client\n```\n\n## Usage\n\nReference: [OPAQUE Protocol overview](https://www.ietf.org/archive/id/draft-irtf-cfrg-opaque-09.html#name-protocol-overview).\n\n### Registration (signup)\n\nOPAQUE requires two handshakes to perform a signup (technically one and a half,\nthe final response has no cryptographic use to the client):\n\n```mermaid\nsequenceDiagram\n    %%{\n      init: {\n        \"messageFontFamily\": \"monospace\",\n        \"noteAlign\": \"left\"\n      }\n    }%%\n    accTitle: Registration\n    accDescr: Sequence diagram of the OPAQUE registration protocol\n    actor C as Client\n    participant S as Server\n    participant D as Database\n    autonumber\n    Note right of C: Client registration start\n    activate C\n    C->>+S: username, registrationRequest\n    deactivate C\n    Note right of S: Server registration start\n    S->>D: Generate nonce<br/>Save { nonce: username }<br/>with short TTL\n    S->>-C: nonce, registrationResponse\n    activate C\n    Note right of C: Client registration finish\n    C->>+S: nonce, registrationRecord\n    deactivate C\n    Note right of S: Server registration finish\n    S->>D: Save credentials<br/>Remove nonce\n    S->>-C: HTTP 204 (No Content)\n```\n\n<br/>\n\n```ts\nimport { Registration } from '@47ng/opaque-server'\n\nconst username = 'alice@example.com'\nconst password = 'correct horse battery staple'\n\nasync function registerClient(username: string, password: string) {\n  const registration = new Registration()\n  const registrationRequest = registration.start(password)\n  const {\n    data: { nonce, registrationResponse },\n  } = await sendToServer(username, registrationRequest)\n  const registrationRecord = registration.finish(password, registrationResponse)\n  const { status } = await sendToServer(nonce, registrationRecord)\n  registration.free()\n}\n```\n\n> _Note: registration doesn't perform key exchange/agreement,\n> so a login step is necessary after signup to establish a shared key._\n\n### Login\n\nOPAQUE requires two handshakes to perform a login.\n\nThe client will already have the key before sending the second handshake, but\nthe server will only be able to obtain it after doing its calculations, so\nthe key must not be used in the second request.\n\n```mermaid\nsequenceDiagram\n    %%{\n      init: {\n        \"messageFontFamily\": \"monospace\",\n        \"noteAlign\": \"left\"\n      }\n    }%%\n    accTitle: Login\n    accDescr: Sequence diagram of the OPAQUE login protocol\n    actor C as Client\n    participant S as Server\n    participant D as Database\n    autonumber\n    Note right of C: Client login start\n    activate C\n    C->>+S: username, loginRequest\n    deactivate C\n    S->>+D: query user by username\n    D->>-S: Obtain credentials\n    Note right of S: Server login start\n    S->>D: Generate nonce<br/>Save { nonce: { loginState, username } }<br/>with a short TTL\n    S->>-C: nonce, loginReponse\n    activate C\n    Note right of C: Client login finish\n    Note right of C: Now the client can<br/>access the shared key\n    C->>+S: nonce, loginFinal\n    deactivate C\n    D->>S: Obtain { username, loginState }<br/>using the given nonce\n    Note right of S: Server login finish\n    Note right of S: Now the server can<br/>access the shared key\n    S-->>D: Clear nonce & loginState\n    S->>-C: Set cookies or return token\n```\n\n<br/>\n\n```ts\nimport { Login } from '@47ng/opaque-client'\n\nconst username = 'alice@example.com'\nconst password = 'correct horse battery staple'\n\nasync function clientLogin(username: string, password: string) {\n  const login = new Login()\n  const loginRequest = login.start(password)\n  const {\n    data: { nonce, loginReponse },\n  } = await sendToServer(username, loginRequest)\n  const loginFinal = login.finish(password, loginReponse)\n  const { status } = await sendToServer(nonce, loginFinal)\n  const sessionKey = login.getSessionKey()\n  login.free()\n  return sessionKey\n}\n```\n\n### Export key\n\nAfter both registration and login, the client can obtain an `exportKey`,\ntied to the credentials used and only available to the client.\n\nIt can be used to implement simple end-to-end self-encryption to store secret\npersonal data on the server.\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/47ng/opaque/issues"},"homepage":"https://github.com/47ng/opaque#readme","_id":"@47ng/opaque-client@0.0.1-beta.10","_integrity":"sha512-mWrwQMlhiDApR2Y5fPjQBHoLn/S3Ec62itqSNfmsQoKa4GU3vByC3Rs1WtroeQ1Iz5HIjakug+S2zbU7MiE+/A==","_resolved":"/tmp/18a2ad3578c4cbedf14dc31d1ef4451f/47ng-opaque-client-0.0.1-beta.10.tgz","_from":"file:47ng-opaque-client-0.0.1-beta.10.tgz","_nodeVersion":"18.13.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-mWrwQMlhiDApR2Y5fPjQBHoLn/S3Ec62itqSNfmsQoKa4GU3vByC3Rs1WtroeQ1Iz5HIjakug+S2zbU7MiE+/A==","shasum":"b64a5d0279f3186b80da33c6ef3b10e16429a43b","tarball":"https://registry.npmjs.org/@47ng/opaque-client/-/opaque-client-0.0.1-beta.10.tgz","fileCount":6,"unpackedSize":263682,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDxnjbP2SJX1DWB5kxku85ibtoDsvk6i5gYYKCGCaztNAIhAJCCBi6pn7pNLxyYmeukv1gJD1mrX5oeZyQpWLe9rxZo"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj2aahACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpaBg//R+5/WJ4aCBp4JI4w50EawMMoQ56Jiyj/QM8jnz733hhWIQTT\r\nu4D2/Z3WuVs/IAV21VUfrB2rY36OPpOqmGloJAoK+fNH9KSI3bbeuwoO2RaC\r\ncf2G3y+bwF1wX9Gugwd6bl+kPLoij6mYwRLgG11zYOkt6U1s8Po+lcYsL6Sx\r\nzCWNsDXGwrl6dxVgsK60YWMatPSqAijWlewk4NiblBPmtXJhLa/2tk1f7ICW\r\nmZbZ2nY29Bt1NPjAoUygyzyB70ZU6F5abe9tHaly1N4VHm8Qc2ItIfIDsgXS\r\nJOpmBO71eCwcvdfzcaukmyzUfRHm7RS/YFXSkHS0bNxw2zCqNTuM0IqwfN5x\r\nQacM1hPORdOwXxWk3YPHNM/JgEufiPZ28+qF4D3Xidaq4LJCbOkqreEEfYU8\r\nvEZ1IXmUn4UcCTg1gH9mkFz6BzMToaGz9XM3abkJtiy5mGNWKworlSuwFvpa\r\nmtuGoKRVW97+ZSIQ+jXDXu0QJuOBM/CqjaBhnimi0zwLlw4yItY3vsWx1aU5\r\nTCABMS4464Miy/pXFp9LY8lq9/pP1IQYZbsrF+CfgwcBi1ATFzwuIX849sdV\r\nqJjD6dqldTtxIe2US/f0LN6mhG4vgPWM4+9mOv5mBGCUL9F8x/krVkItgYy+\r\nY7f+ySCflpgNp++Pk40oG40vv7Jsp0+ShsY=\r\n=xoZf\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"franky47","email":"accounts@francoisbest.com"},"directories":{},"maintainers":[{"name":"franky47","email":"accounts@francoisbest.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/opaque-client_0.0.1-beta.10_1675208353027_0.6804346134415513"},"_hasShrinkwrap":false},"0.0.1-beta.11":{"name":"@47ng/opaque-client","collaborators":["Marcin Lazar <marcin.lazar@pm.me>","Hawkheart","r0kk3rz","François Best <npm.opaque@francoisbest.com>"],"description":"An implementation of the OPAQUE key exchange protocol in WASM(WebAssembly)","version":"0.0.1-beta.11","repository":{"type":"git","url":"git+https://github.com/47ng/opaque.git","directory":"packages/client"},"module":"opaque-client.js","types":"opaque-client.d.ts","sideEffects":false,"keywords":["cryptography","crypto","opaque","passwords","authentication","wasm","js","browser","webassembly","node","wasm-pack","bindgen","wasm-bindgen"],"type":"module","exports":{".":{"import":"./opaque_wasm.js","types":"./opaque_wasm.d.ts"}},"license":"(Apache-2.0 OR MIT)","publishConfig":{"access":"public"},"devDependencies":{"sceau":"^1.3.0"},"scripts":{},"readme":"# `@47ng/opaque-client`\n\nThe OPAQUE key exchange protocol in WASM (WebAssembly), for web browsers.\nThis implementation is based on [facebook/opaque-ke](https://github.com/facebook/opaque-ke).\n\nBuilt as ESM for browsers from [47ng/opaque-wasm](https://github.com/47ng/opaque-wasm/tree/fork/47ng-opaque/do-not-merge-to-upstream)\n_(a fork of [marucjmar/opaque-wasm](https://github.com/marucjmar/opaque-wasm)\nto allow server/server WASM code splitting, statelessness for the server, and uses Ristretto rather than the NIST P-256 curve)_.\n\nServer (Node.js) counterpart is available in [`@47ng/opaque-server`](https://npmjs.com/package/@47ng/opaque-server).\n\n## Installation\n\n```\nnpm install @47ng/opaque-client\nyarn add @47ng/opaque-client\npnpm add @47ng/opaque-client\n```\n\n## Usage\n\nThis implements the [OPAQUE protocol overview](https://github.com/47ng/opaque/blob/main/docs/opaque-protocol-overview.md)\nfor a stateless server and with recommended security practices.\n\n### Registration (signup)\n\nOPAQUE requires two handshakes to perform a signup (technically one and a half,\nthe final response has no cryptographic use to the client).\n\nPseudo-code:\n\n```ts\nimport { Registration } from '@47ng/opaque-server'\n\nconst username = 'alice@example.com'\nconst password = 'correct horse battery staple'\n\nasync function registerClient(username: string, password: string) {\n  const registration = new Registration()\n  const registrationRequest = registration.start(password)\n  const {\n    data: { nonce, registrationResponse },\n  } = await sendToServer(username, registrationRequest)\n  const registrationRecord = registration.finish(password, registrationResponse)\n  const { status } = await sendToServer(nonce, registrationRecord)\n  registration.free()\n}\n```\n\n> _Note: registration doesn't perform key exchange/agreement,\n> so a login step is necessary after signup to establish a shared key._\n\n### Login\n\nOPAQUE requires two handshakes to perform a login.\n\nThe client will already have the key before sending the second handshake, but\nthe server will only be able to obtain it after doing its calculations, so\nthe key must not be used in the second request.\n\nPseudo-code:\n\n```ts\nimport { Login } from '@47ng/opaque-client'\n\nconst username = 'alice@example.com'\nconst password = 'correct horse battery staple'\n\nasync function clientLogin(username: string, password: string) {\n  const login = new Login()\n  const loginRequest = login.start(password)\n  const {\n    data: { nonce, loginReponse },\n  } = await sendToServer(username, loginRequest)\n  const loginFinal = login.finish(password, loginReponse)\n  const { status } = await sendToServer(nonce, loginFinal)\n  const sessionKey = login.getSessionKey()\n  login.free()\n  return sessionKey\n}\n```\n\n### Export key\n\nAfter both registration and login, the client can obtain an `exportKey`,\ntied to the credentials used and only available to the client.\n\nIt can be used to implement simple end-to-end self-encryption to store secret\npersonal data on the server.\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/47ng/opaque/issues"},"homepage":"https://github.com/47ng/opaque#readme","_id":"@47ng/opaque-client@0.0.1-beta.11","_integrity":"sha512-D33G/UaFRH61X059qJUheArSFlC53PV9RggnD70Q64B7cdWDVoanhi/QmUp63ljkvGqoSk43JF3F3tSX46EKqQ==","_resolved":"/tmp/da61636751cbee1efe3383a5afd3ce12/47ng-opaque-client-0.0.1-beta.11.tgz","_from":"file:47ng-opaque-client-0.0.1-beta.11.tgz","_nodeVersion":"18.13.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-D33G/UaFRH61X059qJUheArSFlC53PV9RggnD70Q64B7cdWDVoanhi/QmUp63ljkvGqoSk43JF3F3tSX46EKqQ==","shasum":"e2e22868e0687704956458847b34ccec9e7cb3c5","tarball":"https://registry.npmjs.org/@47ng/opaque-client/-/opaque-client-0.0.1-beta.11.tgz","fileCount":6,"unpackedSize":261826,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICTUH+9drhj7C840jYZGmXywluSCMG5E66U+qqG3AARfAiEAjabcriIIll0DHLYiga2WyIHDkdUvkDwVgQ1oWkOa8Eo="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj2kiRACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpsFQ//QeqLgS5tSpEZjydXGXlSLuKvAeNzO0Ym6VjxDZeRUNgCIB1i\r\n64njQ2NOSSLdSjNpREjdNrNC9L8Sznku7OLimVEJnh7J+PS6j3fooS4nNbAU\r\nUzO5f9XdRzfYNne3JesX2KN8MJ90fOaSCUzCF9uqjkouSuEkSOVO11bfUNkn\r\n+szVpktQht9DXgDr4Sr4+KZ0oBekI0NcF5Xp3MNbah+VsBskArgedUxhpv1L\r\nT39GYAZCbqO8M/TIQuKUJnwT1praRgqJi4rd1zX+CrNJpybmLcTkxNqM41m5\r\nWSFsgfp3NR3O/xmlTTXkWzp/hoY8gQAfu30Uh3zCWFexldt/aumjUT0ny3IQ\r\nVc54k7g8jcV7i/tJEdi/PCrh+xCjHI2rXlyxkVXnGhsI+eMyG2Gg5M/mVk5O\r\n43Y6E9cYvc8eJiRqzyK0PhNKuyg5kxNP77Eay+I8BXeQhjsDISuh2xbDPzbL\r\naJxs5chC5KP7ElYrt6ykYSucVe/eArBYfB8BYAis3iY25RPcWtsKI0/H31x+\r\n97LVrpf/KleCYUoXnViEhb6hxEhnsHQ75dLTOpumvFGVfGsUmKcpXx46kFNW\r\nXhkPXEl7XYq50wDE9CjhNTujTL9pto1zct/Pe7EKfJ6GV4d+o7awPntm9jaU\r\nXPYxtK3XULd+xbCAWgaapG/0eKje8BpVvUA=\r\n=x+tb\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"franky47","email":"accounts@francoisbest.com"},"directories":{},"maintainers":[{"name":"franky47","email":"accounts@francoisbest.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/opaque-client_0.0.1-beta.11_1675249808877_0.3834431799124538"},"_hasShrinkwrap":false},"0.0.1-beta.13":{"name":"@47ng/opaque-client","collaborators":["Marcin Lazar <marcin.lazar@pm.me>","Hawkheart","r0kk3rz","François Best <npm.opaque@francoisbest.com>"],"description":"An implementation of the OPAQUE key exchange protocol in WASM(WebAssembly)","version":"0.0.1-beta.13","repository":{"type":"git","url":"git+https://github.com/47ng/opaque.git","directory":"packages/client"},"module":"opaque-client.js","types":"opaque-client.d.ts","sideEffects":false,"keywords":["cryptography","crypto","opaque","passwords","authentication","wasm","js","browser","webassembly","node","wasm-pack","bindgen","wasm-bindgen"],"type":"module","exports":{".":{"import":"./opaque_wasm.js","types":"./opaque_wasm.d.ts"}},"license":"(Apache-2.0 OR MIT)","publishConfig":{"access":"public"},"devDependencies":{"sceau":"^1.3.0"},"scripts":{},"readme":"# `@47ng/opaque-client`\n\nThe OPAQUE key exchange protocol in WASM (WebAssembly), for web browsers.\nThis implementation is based on [facebook/opaque-ke](https://github.com/facebook/opaque-ke).\n\nBuilt as ESM for browsers from [47ng/opaque-wasm](https://github.com/47ng/opaque-wasm/tree/fork/47ng-opaque/do-not-merge-to-upstream)\n_(a fork of [marucjmar/opaque-wasm](https://github.com/marucjmar/opaque-wasm)\nto allow server/server WASM code splitting, statelessness for the server, and uses Ristretto rather than the NIST P-256 curve)_.\n\nServer (Node.js) counterpart is available in [`@47ng/opaque-server`](https://npmjs.com/package/@47ng/opaque-server).\n\n## Installation\n\n```\nnpm install @47ng/opaque-client\nyarn add @47ng/opaque-client\npnpm add @47ng/opaque-client\n```\n\n## Usage\n\nThis implements the [OPAQUE protocol overview](https://github.com/47ng/opaque/blob/main/docs/opaque-protocol-overview.md)\nfor a stateless server and with recommended security practices.\n\n### Registration (signup)\n\nOPAQUE requires two handshakes to perform a signup (technically one and a half,\nthe final response has no cryptographic use to the client).\n\nPseudo-code:\n\n```ts\nimport { Registration } from '@47ng/opaque-server'\n\nconst username = 'alice@example.com'\nconst password = 'correct horse battery staple'\n\nasync function registerClient(username: string, password: string) {\n  const registration = new Registration()\n  const registrationRequest = registration.start(password)\n  const {\n    data: { nonce, registrationResponse },\n  } = await sendToServer(username, registrationRequest)\n  const registrationRecord = registration.finish(password, registrationResponse)\n  const { status } = await sendToServer(nonce, registrationRecord)\n  registration.free()\n}\n```\n\n> _Note: registration doesn't perform key exchange/agreement,\n> so a login step is necessary after signup to establish a shared key._\n\n### Login\n\nOPAQUE requires two handshakes to perform a login.\n\nThe client will already have the key before sending the second handshake, but\nthe server will only be able to obtain it after doing its calculations, so\nthe key must not be used in the second request.\n\nPseudo-code:\n\n```ts\nimport { Login } from '@47ng/opaque-client'\n\nconst username = 'alice@example.com'\nconst password = 'correct horse battery staple'\n\nasync function clientLogin(username: string, password: string) {\n  const login = new Login()\n  const loginRequest = login.start(password)\n  const {\n    data: { nonce, loginReponse },\n  } = await sendToServer(username, loginRequest)\n  const loginFinal = login.finish(password, loginReponse)\n  const { status } = await sendToServer(nonce, loginFinal)\n  const sessionKey = login.getSessionKey()\n  login.free()\n  return sessionKey\n}\n```\n\n### Export key\n\nAfter both registration and login, the client can obtain an `exportKey`,\ntied to the credentials used and only available to the client.\n\nIt can be used to implement simple end-to-end self-encryption to store secret\npersonal data on the server.\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/47ng/opaque/issues"},"homepage":"https://github.com/47ng/opaque#readme","_id":"@47ng/opaque-client@0.0.1-beta.13","_integrity":"sha512-1QApMq+qgT4gwtyA8UiyKBthU5ZuwVql4+npJnnjKZJcjolxfXJxOoG/5yPRC7HFRCgWgXynbaoK9J7lWYGKQQ==","_resolved":"/tmp/4510836a332db1a29378228c4d142fdf/47ng-opaque-client-0.0.1-beta.13.tgz","_from":"file:47ng-opaque-client-0.0.1-beta.13.tgz","_nodeVersion":"18.13.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-1QApMq+qgT4gwtyA8UiyKBthU5ZuwVql4+npJnnjKZJcjolxfXJxOoG/5yPRC7HFRCgWgXynbaoK9J7lWYGKQQ==","shasum":"87efe8cb51bd20d41d6c0abe5b52da875f23db6f","tarball":"https://registry.npmjs.org/@47ng/opaque-client/-/opaque-client-0.0.1-beta.13.tgz","fileCount":6,"unpackedSize":261826,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEk7KpqP85Ah+tR3nsAbUjAOO1ZLmdSXY4jCGOBekss4AiEAicqxIBOy1e/90w70Y+JuK+3NnD2q02oPPsykC2CHwAw="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj2mEdACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq6aA/+Jg7yQdAlT7iFcMcPe0Ee/HO69ZXUH21fZSUwseAY0gNJmFoS\r\n6RbSg59Ef/w+Hh/CLrRYUmQwlEmI1iSGRL6dUkyYBdq+1fY/QKBzQSNUcOWc\r\nLlB1PApG8397/E+4UT3KQd3Leiv7ScdeGA5MNUI9I3SBVe9jjxAdM4K0f7eV\r\nbr4GXtB88+qv2TzK1MaQ7L7Jmh11gRi6r11iWHxSbjXByhYo6P27zntNUlIe\r\neEFF2t3obzXkpuSiA9y3AXBDnRBWVtrS9DQqHbNXbiwA/7CwagTliuwI7CyV\r\nnP8Hnn1y+CYGzy1EGd+bhGjPnzMtFGTnx9NDcj1bLIu75xcRE3w/pSC4SBxw\r\nY2R486XJ2jUpND9zsNqBoPyXzKlskI+YyqLKSPJsw2H2gW36yOrga2rnZVcv\r\nAQw4Xk7l1lkaC2jgZaIKHovrVim2YvCzi41A+r4acjUVKVHzTaX1lJ5xkoWK\r\ncFUG/49EU2t85JEaHWqmJ3JdTvdG9SgsCvU0Wsk4opGp/mg8t0o5wPvrSYZK\r\n2EPgJvk2oGZJZeXqRRrK35ZNEdqgE7qKOA2KPtUENv8lWjb517Dk6Of29Fht\r\nGgmvRjhESWBWBOcj5ujNKKR6CCI6HPQCtlnEgZxPKn8UIpfAGaFCH4lUYEWo\r\nBXvGQV7hqNZ+Cb27NbzZV/Y0FkgA62ir5dg=\r\n=bPWM\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"franky47","email":"accounts@francoisbest.com"},"directories":{},"maintainers":[{"name":"franky47","email":"accounts@francoisbest.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/opaque-client_0.0.1-beta.13_1675256093312_0.9085641019638164"},"_hasShrinkwrap":false},"0.0.1-beta.14":{"name":"@47ng/opaque-client","collaborators":["Marcin Lazar <marcin.lazar@pm.me>","Hawkheart","r0kk3rz","François Best <npm.opaque@francoisbest.com>"],"description":"An implementation of the OPAQUE key exchange protocol in WASM(WebAssembly)","version":"0.0.1-beta.14","repository":{"type":"git","url":"git+https://github.com/47ng/opaque.git","directory":"packages/client"},"module":"opaque-client.js","types":"opaque-client.d.ts","sideEffects":false,"keywords":["cryptography","crypto","opaque","passwords","authentication","wasm","js","browser","webassembly","node","wasm-pack","bindgen","wasm-bindgen"],"type":"module","exports":{".":{"import":"./opaque_wasm.js","types":"./opaque_wasm.d.ts"}},"license":"(Apache-2.0 OR MIT)","publishConfig":{"access":"public"},"devDependencies":{"sceau":"^1.3.0"},"scripts":{},"readme":"# `@47ng/opaque-client`\n\nThe OPAQUE key exchange protocol in WASM (WebAssembly), for web browsers.\nThis implementation is based on [facebook/opaque-ke](https://github.com/facebook/opaque-ke).\n\nBuilt as ESM for browsers from [47ng/opaque-wasm](https://github.com/47ng/opaque-wasm/tree/fork/47ng-opaque/do-not-merge-to-upstream)\n_(a fork of [marucjmar/opaque-wasm](https://github.com/marucjmar/opaque-wasm)\nto allow server/server WASM code splitting, statelessness for the server, and uses Ristretto rather than the NIST P-256 curve)_.\n\nServer (Node.js) counterpart is available in [`@47ng/opaque-server`](https://npmjs.com/package/@47ng/opaque-server).\n\n## Installation\n\n```\nnpm install @47ng/opaque-client\nyarn add @47ng/opaque-client\npnpm add @47ng/opaque-client\n```\n\n## Usage\n\nThis implements the [OPAQUE protocol overview](https://github.com/47ng/opaque/blob/main/docs/opaque-protocol-overview.md)\nfor a stateless server and with recommended security practices.\n\n### Registration (signup)\n\nOPAQUE requires two handshakes to perform a signup (technically one and a half,\nthe final response has no cryptographic use to the client).\n\nPseudo-code:\n\n```ts\nimport { Registration } from '@47ng/opaque-server'\n\nconst username = 'alice@example.com'\nconst password = 'correct horse battery staple'\n\nasync function registerClient(username: string, password: string) {\n  const registration = new Registration()\n  const registrationRequest = registration.start(password)\n  const {\n    data: { nonce, registrationResponse },\n  } = await sendToServer(username, registrationRequest)\n  const registrationRecord = registration.finish(password, registrationResponse)\n  const { status } = await sendToServer(nonce, registrationRecord)\n  registration.free()\n}\n```\n\n> _Note: registration doesn't perform key exchange/agreement,\n> so a login step is necessary after signup to establish a shared key._\n\n### Login\n\nOPAQUE requires two handshakes to perform a login.\n\nThe client will already have the key before sending the second handshake, but\nthe server will only be able to obtain it after doing its calculations, so\nthe key must not be used in the second request.\n\nPseudo-code:\n\n```ts\nimport { Login } from '@47ng/opaque-client'\n\nconst username = 'alice@example.com'\nconst password = 'correct horse battery staple'\n\nasync function clientLogin(username: string, password: string) {\n  const login = new Login()\n  const loginRequest = login.start(password)\n  const {\n    data: { nonce, loginReponse },\n  } = await sendToServer(username, loginRequest)\n  const loginFinal = login.finish(password, loginReponse)\n  const { status } = await sendToServer(nonce, loginFinal)\n  const sessionKey = login.getSessionKey()\n  login.free()\n  return sessionKey\n}\n```\n\n### Export key\n\nAfter both registration and login, the client can obtain an `exportKey`,\ntied to the credentials used and only available to the client.\n\nIt can be used to implement simple end-to-end self-encryption to store secret\npersonal data on the server.\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/47ng/opaque/issues"},"homepage":"https://github.com/47ng/opaque#readme","_id":"@47ng/opaque-client@0.0.1-beta.14","_integrity":"sha512-aJ+gaeUKq225HEqS8lrbwoJW5jLUYH19Jh/cJ42bA6a9+f90q6Mhauk6uPLZmT8v7QvfpqvjPt1iDSuybFsOJw==","_resolved":"/tmp/88cc2b10feb0a13b6917eb75fe30bb5f/47ng-opaque-client-0.0.1-beta.14.tgz","_from":"file:47ng-opaque-client-0.0.1-beta.14.tgz","_nodeVersion":"18.13.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-aJ+gaeUKq225HEqS8lrbwoJW5jLUYH19Jh/cJ42bA6a9+f90q6Mhauk6uPLZmT8v7QvfpqvjPt1iDSuybFsOJw==","shasum":"b561b1d96ffbecc4c5d475cee3373646bdabadc5","tarball":"https://registry.npmjs.org/@47ng/opaque-client/-/opaque-client-0.0.1-beta.14.tgz","fileCount":6,"unpackedSize":222060,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEa7oBnjuOEhYSBXwPD06iqERx+XHQ8gMhngtuwM5E6UAiBPMB6Xvsi47Tl2oszBiuS77Hj5nZamExZQFCA4tQ2mnQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj2mabACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmpq/A/9HP8NcC7BIHGqftAQlyT0PEqtzc7KsIMR+lS3YfINjbuJmj5z\r\n9vU5cOmySHbQD68We9OfBdaj/wS6rvUFjfYEfcUaZkpiuKN1ESp7PFTrtf+Q\r\n73MDYYQCqBi0E3SJ4qq2yx8D8D89BYsash0GaSFhwnEHbibBv4KsQS6wrpiD\r\n9LJxu+dRXZ6Kv1jlXgsbrl3PoIRc/CZumITyJT32i3gvQA2Fl4g8y++U03Hk\r\ndYTnQbLH3Mhk6lBd6+UQ8Px1KH3wol7A80m7sZp1zZ0vOfJ47pcFeRLO4X2q\r\nw5M5k1e9p2SbTjJe0vuimCqLp4/s3P1dXdtOj0Ti5BHIsojK9poNPSTs0GBr\r\nmsgasRS3R7g+HJzBG614pwzmQ7zkjNLVGCpa1vNWf3YYUK+LRunsf4hQKqSI\r\n9ZNSflgSCQIw44jvN0v8pGOUa2iG743zDLL6Mu4H/biAHS7B7LnPCz1fDoeT\r\n86lTaq65JiM1+08nzre36HVF5Xtk4V3Ahseu+0UuptciSmP44+KVrBmfuqvJ\r\ny3KlDSvCGJe3UO2ArLh/C/QfBzy6Tm7kJPdgEM87oQ03bq/cMTpqkbjNh9vE\r\nrTKz3Yp+wGCU1WVVkcwJgASJzsw9MZ5kAPBJCGTHddF2u+YRX0UK7qAFvUGv\r\n421xYksqprtI2pfwQFbhqkrVbz9LBH0LD2g=\r\n=NtxE\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"franky47","email":"accounts@francoisbest.com"},"directories":{},"maintainers":[{"name":"franky47","email":"accounts@francoisbest.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/opaque-client_0.0.1-beta.14_1675257499225_0.9821861177432734"},"_hasShrinkwrap":false},"0.0.1-beta.15":{"name":"@47ng/opaque-client","collaborators":["Marcin Lazar <marcin.lazar@pm.me>","Hawkheart","r0kk3rz","François Best <npm.opaque@francoisbest.com>"],"description":"An implementation of the OPAQUE key exchange protocol in WASM(WebAssembly)","version":"0.0.1-beta.15","repository":{"type":"git","url":"git+https://github.com/47ng/opaque.git","directory":"packages/client"},"module":"opaque-client.js","types":"opaque-client.d.ts","sideEffects":false,"keywords":["cryptography","crypto","opaque","passwords","authentication","wasm","js","browser","webassembly","node","wasm-pack","bindgen","wasm-bindgen"],"type":"module","exports":{".":{"import":"./opaque-client.js","types":"./opaque-client.d.ts"}},"license":"(Apache-2.0 OR MIT)","publishConfig":{"access":"public"},"devDependencies":{"sceau":"^1.3.0"},"scripts":{},"readme":"# `@47ng/opaque-client`\n\nThe OPAQUE key exchange protocol in WASM (WebAssembly), for web browsers.\nThis implementation is based on [facebook/opaque-ke](https://github.com/facebook/opaque-ke).\n\nBuilt as ESM for browsers from [47ng/opaque-wasm](https://github.com/47ng/opaque-wasm/tree/fork/47ng-opaque/do-not-merge-to-upstream)\n_(a fork of [marucjmar/opaque-wasm](https://github.com/marucjmar/opaque-wasm)\nto allow server/server WASM code splitting, statelessness for the server, and uses Ristretto rather than the NIST P-256 curve)_.\n\nServer (Node.js) counterpart is available in [`@47ng/opaque-server`](https://npmjs.com/package/@47ng/opaque-server).\n\n## Installation\n\n```\nnpm install @47ng/opaque-client\nyarn add @47ng/opaque-client\npnpm add @47ng/opaque-client\n```\n\n## Usage\n\nThis implements the [OPAQUE protocol overview](https://github.com/47ng/opaque/blob/main/docs/opaque-protocol-overview.md)\nfor a stateless server and with recommended security practices.\n\n### Registration (signup)\n\nOPAQUE requires two handshakes to perform a signup (technically one and a half,\nthe final response has no cryptographic use to the client).\n\nPseudo-code:\n\n```ts\nimport { Registration } from '@47ng/opaque-server'\n\nconst username = 'alice@example.com'\nconst password = 'correct horse battery staple'\n\nasync function registerClient(username: string, password: string) {\n  const registration = new Registration()\n  const registrationRequest = registration.start(password)\n  const {\n    data: { nonce, registrationResponse },\n  } = await sendToServer(username, registrationRequest)\n  const registrationRecord = registration.finish(password, registrationResponse)\n  const { status } = await sendToServer(nonce, registrationRecord)\n  registration.free()\n}\n```\n\n> _Note: registration doesn't perform key exchange/agreement,\n> so a login step is necessary after signup to establish a shared key._\n\n### Login\n\nOPAQUE requires two handshakes to perform a login.\n\nThe client will already have the key before sending the second handshake, but\nthe server will only be able to obtain it after doing its calculations, so\nthe key must not be used in the second request.\n\nPseudo-code:\n\n```ts\nimport { Login } from '@47ng/opaque-client'\n\nconst username = 'alice@example.com'\nconst password = 'correct horse battery staple'\n\nasync function clientLogin(username: string, password: string) {\n  const login = new Login()\n  const loginRequest = login.start(password)\n  const {\n    data: { nonce, loginReponse },\n  } = await sendToServer(username, loginRequest)\n  const loginFinal = login.finish(password, loginReponse)\n  const { status } = await sendToServer(nonce, loginFinal)\n  const sessionKey = login.getSessionKey()\n  login.free()\n  return sessionKey\n}\n```\n\n### Export key\n\nAfter both registration and login, the client can obtain an `exportKey`,\ntied to the credentials used and only available to the client.\n\nIt can be used to implement simple end-to-end self-encryption to store secret\npersonal data on the server.\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/47ng/opaque/issues"},"homepage":"https://github.com/47ng/opaque#readme","_id":"@47ng/opaque-client@0.0.1-beta.15","_integrity":"sha512-KxqZfjrvcc/XmeYBSRBdNEJcdFCv4+xJ2PgwMNSaTnocejn77s5zew5qlwWpPIA/pDsaKN2SmYb0MknZflV42A==","_resolved":"/tmp/7d6776b9650a102a14041ead82040779/47ng-opaque-client-0.0.1-beta.15.tgz","_from":"file:47ng-opaque-client-0.0.1-beta.15.tgz","_nodeVersion":"18.13.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-KxqZfjrvcc/XmeYBSRBdNEJcdFCv4+xJ2PgwMNSaTnocejn77s5zew5qlwWpPIA/pDsaKN2SmYb0MknZflV42A==","shasum":"46b4b30488905dc5b4588aa20daae76a319ce200","tarball":"https://registry.npmjs.org/@47ng/opaque-client/-/opaque-client-0.0.1-beta.15.tgz","fileCount":6,"unpackedSize":221658,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFWWEXl18BbKCGqeNEUGYiuMRm926rMw3lQPiUeS8J7SAiA8F/oUZYiDsKcU/2+YcDzMDY6xCtwyivY3N3cQR7tmFQ=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj27giACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqC+A//QpZwrIkhLKG/6ZnUd3Cm3n4dTP1s5YmXkKLgy5rMhaUtlMcv\r\nt20h6smH50Khswnbi5u508tQf6QuIM8mJCOChkKRp/GHuG4QYO7QnSTl3H7/\r\np2OrGO1Bdi48+Fk1ANFQIxfHf160X7SthYXnlmXfuCNJ9O/d+UOjk83foHu/\r\n+aop++xRUwqejOdXryIaG4A6vv1QcZCy7xIIXEGZwGOuJmdsPfg4MWtdXL4J\r\nrQMIf/U7vtD9iveYyUbrgxDr5koWfFDzjOgN5ya+RrwQPzIpWinpbzVx328+\r\nsr9gdbbXOnLCnUx9PPgW2Qt7AEeNvrVWiPF0owtVk4nsxYvMB0aGTNG9CKGA\r\nqa08e8JUhH+Z8WR84vaC+CxXX1sVjsWHQeWdBoGrLr4tkrn6I1TOHa/h1Pen\r\nzzh/k8fpieMNoRbg55Pzlj5phDLRu1k7KzcMx7bk99e3jw3fXKf+kgfmOiTU\r\nBmdQZb0cEgTGBU49ajIbSOXYnC/YRL6j03DlFt67GPzJ5z2XoXvBJDw6WF1f\r\naQZWh5WtcJsrc/3HopKNoblU92KoIFo39ZxHmNwShqabN8fPEGbJT4wkuEIV\r\nvKA6U28vRY4SGpnXwvc4iskn80T2el8qgeKPPeP1vsNrz5/mAggno/OS/8Pp\r\nap0WxAyrnnJazsb5qK5azxPzWqJd1aLjvo0=\r\n=uvmF\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"franky47","email":"accounts@francoisbest.com"},"directories":{},"maintainers":[{"name":"franky47","email":"accounts@francoisbest.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/opaque-client_0.0.1-beta.15_1675343906687_0.58572913859682"},"_hasShrinkwrap":false},"0.0.1-beta.16":{"name":"@47ng/opaque-client","collaborators":["Marcin Lazar <marcin.lazar@pm.me>","Hawkheart","r0kk3rz","François Best <npm.opaque@francoisbest.com>"],"description":"An implementation of the OPAQUE key exchange protocol in WASM(WebAssembly)","version":"0.0.1-beta.16","repository":{"type":"git","url":"git+https://github.com/47ng/opaque.git","directory":"packages/client"},"module":"opaque-client.js","types":"opaque-client.d.ts","sideEffects":false,"keywords":["cryptography","crypto","opaque","passwords","authentication","wasm","js","browser","webassembly","node","wasm-pack","bindgen","wasm-bindgen"],"type":"module","exports":{".":{"import":"./opaque-client.js","types":"./opaque-client.d.ts"}},"license":"(Apache-2.0 OR MIT)","publishConfig":{"access":"public"},"devDependencies":{"sceau":"^1.3.0"},"scripts":{},"readme":"# `@47ng/opaque-client`\n\nThe OPAQUE key exchange protocol in WASM (WebAssembly), for web browsers.\nThis implementation is based on [facebook/opaque-ke](https://github.com/facebook/opaque-ke).\n\nBuilt as ESM for browsers from [47ng/opaque-wasm](https://github.com/47ng/opaque-wasm/tree/fork/47ng-opaque/do-not-merge-to-upstream)\n_(a fork of [marucjmar/opaque-wasm](https://github.com/marucjmar/opaque-wasm)\nto allow server/server WASM code splitting, statelessness for the server, and uses Ristretto rather than the NIST P-256 curve)_.\n\nServer (Node.js) counterpart is available in [`@47ng/opaque-server`](https://npmjs.com/package/@47ng/opaque-server).\n\n## Installation\n\n```\nnpm install @47ng/opaque-client\nyarn add @47ng/opaque-client\npnpm add @47ng/opaque-client\n```\n\n## Usage\n\nThis implements the [OPAQUE protocol overview](https://github.com/47ng/opaque/blob/main/docs/opaque-protocol-overview.md)\nfor a stateless server and with recommended security practices.\n\n### Registration (signup)\n\nOPAQUE requires two handshakes to perform a signup (technically one and a half,\nthe final response has no cryptographic use to the client).\n\nPseudo-code:\n\n```ts\nimport { Registration } from '@47ng/opaque-server'\n\nconst username = 'alice@example.com'\nconst password = 'correct horse battery staple'\n\nasync function registerClient(username: string, password: string) {\n  const registration = new Registration()\n  const registrationRequest = registration.start(password)\n  const {\n    data: { nonce, registrationResponse },\n  } = await sendToServer(username, registrationRequest)\n  const registrationRecord = registration.finish(password, registrationResponse)\n  const { status } = await sendToServer(nonce, registrationRecord)\n  registration.free()\n}\n```\n\n> _Note: registration doesn't perform key exchange/agreement,\n> so a login step is necessary after signup to establish a shared key._\n\n### Login\n\nOPAQUE requires two handshakes to perform a login.\n\nThe client will already have the key before sending the second handshake, but\nthe server will only be able to obtain it after doing its calculations, so\nthe key must not be used in the second request.\n\nPseudo-code:\n\n```ts\nimport { Login } from '@47ng/opaque-client'\n\nconst username = 'alice@example.com'\nconst password = 'correct horse battery staple'\n\nasync function clientLogin(username: string, password: string) {\n  const login = new Login()\n  const loginRequest = login.start(password)\n  const {\n    data: { nonce, loginReponse },\n  } = await sendToServer(username, loginRequest)\n  const loginFinal = login.finish(password, loginReponse)\n  const { status } = await sendToServer(nonce, loginFinal)\n  const sessionKey = login.getSessionKey()\n  login.free()\n  return sessionKey\n}\n```\n\n### Export key\n\nAfter both registration and login, the client can obtain an `exportKey`,\ntied to the credentials used and only available to the client.\n\nIt can be used to implement simple end-to-end self-encryption to store secret\npersonal data on the server.\n","readmeFilename":"README.md","bugs":{"url":"https://github.com/47ng/opaque/issues"},"homepage":"https://github.com/47ng/opaque#readme","_id":"@47ng/opaque-client@0.0.1-beta.16","_integrity":"sha512-oSOQWyEUEe+GDOEMzzfMhitRQM+nFwndieNv0Sq8+mxlcJOdXUXDlRoAResWuaia8TXB0jyCxx+PovR7SH4fBA==","_resolved":"/tmp/d1a1514cbf3436556733229511dbc108/47ng-opaque-client-0.0.1-beta.16.tgz","_from":"file:47ng-opaque-client-0.0.1-beta.16.tgz","_nodeVersion":"18.13.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-oSOQWyEUEe+GDOEMzzfMhitRQM+nFwndieNv0Sq8+mxlcJOdXUXDlRoAResWuaia8TXB0jyCxx+PovR7SH4fBA==","shasum":"2fa754568356b300707901ecf13311b75e2af1fb","tarball":"https://registry.npmjs.org/@47ng/opaque-client/-/opaque-client-0.0.1-beta.16.tgz","fileCount":6,"unpackedSize":221658,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFguJTyFU2murgAZTuGCVrsu3Cl6AkUzDSiqlR7oR43dAiEA5D51XIoUZ8fBv5s7+y0wTLpa3ywHOnXPY5Z577XeqD0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj3PKMACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpNcA//W5x8wBhMVJPM5jqpkUPEEFjVD8Ok40sSBV/CCaH8hO5CJFn/\r\nEag2aOS6lqR+aA0Bs+B7IpU3jRqg4by7XZEIi6hXVtIWtC6xA0EoXJj3SLW2\r\nfKpxI9tAqJpOgyh1UxiUqggDPD/eiRLq+/6BTMsZSlKqKWUw4GM5rP/H52Db\r\nAhuVRGr1gVcHNj4KJZBDrNkzXZctqo6nO8JRGeBYv9pA13M4ZqbE3Zve483S\r\nuUoES8c6z7+uRJR2kGzOSRAoXns5y4IVLXTkavrkuZNBydzclhYWIbOBSmcL\r\nbysQ9htaniV7yA3CZ5Wi8sffRBmc/6Z+IrmhliAEsS0kJNQtJhvqAWSMrwV9\r\nyGRcvW0PX/AjbEaJZoChGhI7Ik8llOzFi1Rcu5JMuA228nDBTgfnBgVK2jgp\r\n75ttSxsLpVZwb/8N2oXISmgtOAGchJHjhuxXq5mGLA2/EaNSiyWtmmc8fsWB\r\nrGDjhSFwgTM7KVcCxyAT19+qY23V/SboDb8nugJh5zUdYWhB60FbtveEXlJC\r\nuKWUwZIo5GK0OeIOPX/BBCAMZqR7AOkGVNXystXSp2tEC+kQazRr1CJLAVGl\r\neP2VlC+l/tUBtq3x7fLCaikhgBP3xf5PaA77K/gf0UMq5XOTMoC6NOuc4US7\r\n82QampJd5PfsmGBjG7tHxDVcxZ/AdGpdaNI=\r\n=nOqn\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"franky47","email":"accounts@francoisbest.com"},"directories":{},"maintainers":[{"name":"franky47","email":"accounts@francoisbest.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/opaque-client_0.0.1-beta.16_1675424396153_0.4939703346486568"},"_hasShrinkwrap":false},"1.0.0":{"name":"@47ng/opaque-client","collaborators":["Marcin Lazar <marcin.lazar@pm.me>","Hawkheart","r0kk3rz","François Best <npm.opaque@francoisbest.com>"],"description":"An implementation of the OPAQUE key exchange protocol in WASM(WebAssembly)","version":"1.0.0","repository":{"type":"git","url":"git+https://github.com/47ng/opaque.git","directory":"packages/client"},"module":"opaque-client.js","types":"opaque-client.d.ts","sideEffects":false,"keywords":["cryptography","crypto","opaque","passwords","authentication","wasm","js","browser","webassembly","node","wasm-pack","bindgen","wasm-bindgen"],"type":"module","exports":{".":{"import":"./opaque-client.js","types":"./opaque-client.d.ts"}},"license":"(Apache-2.0 OR MIT)","publishConfig":{"access":"public"},"devDependencies":{"sceau":"^1.3.0"},"scripts":{},"bugs":{"url":"https://github.com/47ng/opaque/issues"},"homepage":"https://github.com/47ng/opaque#readme","_id":"@47ng/opaque-client@1.0.0","_integrity":"sha512-DKqV9w8yoDy2w++r5h+xsoVz+c/L0h1584T2RMsxSw0o2cZLTfXxhtEGtHzC5xD0Hx75k6IvIRK7d0OGfEkSTw==","_resolved":"/tmp/561d2f8679ec5b623d589d6dceb4b80f/47ng-opaque-client-1.0.0.tgz","_from":"file:47ng-opaque-client-1.0.0.tgz","_nodeVersion":"18.13.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-DKqV9w8yoDy2w++r5h+xsoVz+c/L0h1584T2RMsxSw0o2cZLTfXxhtEGtHzC5xD0Hx75k6IvIRK7d0OGfEkSTw==","shasum":"ba6fc2bdfc4d3e8629f18354a2721e485f400a9e","tarball":"https://registry.npmjs.org/@47ng/opaque-client/-/opaque-client-1.0.0.tgz","fileCount":6,"unpackedSize":221650,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDx9QUUs3ROXIJCODBJYh3vI6EIF9Oh0tZLTnPuf+IuZwIhAJvj4N/I4gCeqW9NzEIKo0xevfZKKEy0V3FAehJcOBe+"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj3P7BACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoC2xAAhljEyqqD4PzHrnD5DELsKF+l3bsrKnSMpcrArkzCDtdJACwi\r\nMWyUySgh96Y5cGPuhYAklGuMmLjkWLw82cA8PcYpw6rY69ieZjaq3P6GxKH5\r\nqn1u1/uFcFkqCMtiIk22i0EUq3J8nMVGTpeKbVGegP45d0G2JMBNOW0o+LnB\r\n/UYcC6NxEC5NYBnIx2uuSCxVV1J0Gdavz1tf7wz/6KNqLJ0UFm/dBUjcGgWd\r\nMiz7ffffXE0Mb10dSfx2OEQelSjd8QajiFWRrJRcQShNMbiTwu1ZlH7pIHq9\r\nxz665OtbSaZkXw3zhyi9MQHdAXaGHUlgHfIyoUkDOgfC1Ah2gAZg59BAlEae\r\n7K9ShNNfyWmZ9aORK1JLEYEKd/fVKeV2Uc1Xju6xtIyIxjFbxVIqlaaztYTP\r\nrOwG4STeyO3Sh/IPQVbIa8DuxQnYENIZ3Qp/gPcjWiPTBbJGnyE2X+GEP1B7\r\nBmgCrycw/jytrAAEjlx96v/q8NGp3GiQAlxz2uXcYPdYGFwCTPgN3tzQ3T1n\r\nd36tOpDZ8JhzVn85imGw2Qg/4bDxabzfuLFKPiFJZojnDHFqqPK4DfeqOshA\r\nst8lQ9/93b8asP1egVx96NCghhkzAG5guFE5OanPfkVCp7XOw5e7A681alIB\r\nzfvq6Bpl9aR9NoIf/HBhuryJA/q2V+cTcv8=\r\n=Qkc4\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"franky47","email":"accounts@francoisbest.com"},"directories":{},"maintainers":[{"name":"franky47","email":"accounts@francoisbest.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/opaque-client_1.0.0_1675427521362_0.6650967814787245"},"_hasShrinkwrap":false},"2.1.0":{"name":"@47ng/opaque-client","collaborators":["Marcin Lazar <marcin.lazar@pm.me>","Hawkheart","r0kk3rz","François Best <npm.opaque@francoisbest.com>"],"description":"An implementation of the OPAQUE key exchange protocol in WASM(WebAssembly)","version":"2.1.0","repository":{"type":"git","url":"git+https://github.com/47ng/opaque.git","directory":"packages/client"},"module":"opaque-client.js","types":"opaque-client.d.ts","sideEffects":false,"keywords":["cryptography","crypto","opaque","passwords","authentication","wasm","js","browser","webassembly","node","wasm-pack","bindgen","wasm-bindgen"],"type":"module","exports":{".":{"import":"./opaque-client.js","types":"./opaque-client.d.ts"}},"license":"(Apache-2.0 OR MIT)","publishConfig":{"access":"public"},"devDependencies":{"sceau":"^1.3.0"},"scripts":{},"bugs":{"url":"https://github.com/47ng/opaque/issues"},"homepage":"https://github.com/47ng/opaque#readme","_id":"@47ng/opaque-client@2.1.0","_integrity":"sha512-wNhzBzXvsloU3ZNbqemSQRUxWdV02/7THhQsozR/M0QmZbhE6SByf6L+Gik41ieHaAO5Ty85TJpk8EgvX8Tm0A==","_resolved":"/tmp/efb11454ecb6192e5a396254e32ea1b7/47ng-opaque-client-2.1.0.tgz","_from":"file:47ng-opaque-client-2.1.0.tgz","_nodeVersion":"18.13.0","_npmVersion":"8.19.3","dist":{"integrity":"sha512-wNhzBzXvsloU3ZNbqemSQRUxWdV02/7THhQsozR/M0QmZbhE6SByf6L+Gik41ieHaAO5Ty85TJpk8EgvX8Tm0A==","shasum":"cfc8ffab330b3b1014f67f267be24a9ef919e10c","tarball":"https://registry.npmjs.org/@47ng/opaque-client/-/opaque-client-2.1.0.tgz","fileCount":6,"unpackedSize":221573,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCdsDncACvTykNZzZ5CcobyrUugjGD6Eib0xyTmmjP/KgIhAJ9U6GSv5Ual1JROSuqvyAB37jkw2G7Xqr0W4F3j1dXa"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj3QFQACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqevw//cjq5WYtpXnx4siAAtx2iZDCvJ3D5HQqEAHAbBM5vQBqURDul\r\nENahfmykrLi6ByNHX8PYMqgWKC+JwlRh+YckwWL43MukMQmJ6DNAfWkaDg82\r\nDA2cHcsymF13Zp7HNKqhx796H62qahfRHXSiO4GDDBzhXDHGXOg5J/tgXDVU\r\nPoqVNlHD2gAK+UPHhCikfcy2g6zsufGkDXL7a/SI09vUQLQznJ6LQX55d+yb\r\n5t+c9kzcIN2K9xOgnmQLV5pyMla6JZZIDsLZBhPmxnUOr2NulgWabkHhAGVY\r\nO7SlA2153sI7MCur/JxuK2ofC5xn27nm9jPPxibz6JcOqKcFLFM/dLGCAehz\r\nq6olxXhNa6T4uRASWnbwvU5TfPILtygg0ms/erm8IfALMiWg0xX42gZMnLUg\r\nC6VMbvFVIl3W2ZSLRqCDjWcJgSDzRn3uXpI4rVJckF7THDF3TADe8OnnTyhF\r\nmGFYldbHVvhr34rNx4JSWVZZ3jACjNJMOyMlo3cQZxBGT6MsE6hqf1xBxHPH\r\nM0AVYFvxPSyPZtII//T0dZcMWqqHItWb6OWzpwIOUd7i1pOVpI7/KEyMlu+y\r\nJaWvjMToniqCalhjts1R7af3E1RTI/Sj+AWV6Vjzy4/4GgcACfUEFMsxAauw\r\niKnEi3bLPGtFwV4elQJVhYV4gMjd0yVFGdM=\r\n=aRHK\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"franky47","email":"accounts@francoisbest.com"},"directories":{},"maintainers":[{"name":"franky47","email":"accounts@francoisbest.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/opaque-client_2.1.0_1675428176515_0.9756862473859464"},"_hasShrinkwrap":false},"2.1.1":{"name":"@47ng/opaque-client","collaborators":["Marcin Lazar <marcin.lazar@pm.me>","Hawkheart","r0kk3rz","François Best <npm.opaque@francoisbest.com>"],"description":"An implementation of the OPAQUE key exchange protocol in WASM(WebAssembly)","version":"2.1.1","repository":{"type":"git","url":"git+https://github.com/47ng/opaque.git","directory":"packages/client"},"module":"opaque-client.js","types":"opaque-client.d.ts","sideEffects":false,"keywords":["cryptography","crypto","opaque","passwords","authentication","wasm","js","browser","webassembly","node","wasm-pack","bindgen","wasm-bindgen"],"type":"module","exports":{".":{"import":"./opaque-client.js","types":"./opaque-client.d.ts"}},"license":"(Apache-2.0 OR MIT)","publishConfig":{"access":"public"},"devDependencies":{"sceau":"^1.3.0"},"scripts":{},"bugs":{"url":"https://github.com/47ng/opaque/issues"},"homepage":"https://github.com/47ng/opaque#readme","_id":"@47ng/opaque-client@2.1.1","_integrity":"sha512-aQ+C7v5y1V90RS4EylQGEfjanwXXjUqGNRfy1cUw8mXS8q1JYO7VSFmtzJDW3EnFVY+jRcbjzEc+UZDnlcH7Ug==","_resolved":"/tmp/9da0247a35b9e30315b3e1e896dd11cb/47ng-opaque-client-2.1.1.tgz","_from":"file:47ng-opaque-client-2.1.1.tgz","_nodeVersion":"18.14.0","_npmVersion":"9.3.1","dist":{"integrity":"sha512-aQ+C7v5y1V90RS4EylQGEfjanwXXjUqGNRfy1cUw8mXS8q1JYO7VSFmtzJDW3EnFVY+jRcbjzEc+UZDnlcH7Ug==","shasum":"78d9d8a8ad3210b8edeb21ac43a905052e45a6f6","tarball":"https://registry.npmjs.org/@47ng/opaque-client/-/opaque-client-2.1.1.tgz","fileCount":6,"unpackedSize":230874,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFfTVPQJ9CLdVYG4ZAUUIaAgMTDehz/83BzYbT3mUM6LAiEAyeA5h1C6B/VIkEQZtv1iD9bppbP2kr42DsU/gSpR2lk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj7jQHACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoQ+Q//Q7LF6IiQjEKgP9RoZJA2c7BLnUVnl+PI4ba5la4Al/MLBOcZ\r\nAexjhhJu9Tenq4EAKyuTx0mQxccTGfmMVsQgqzlsw0KM0Ld09kV3OD/qtetl\r\nmIyPxG1sAH1+gYIGvi1z+DFKn94JarquIf3MdebZCED1dUzWFveWkt4Inrrt\r\n9qPYHrHz0OLs7m6tlOJD0tmmRVMaD73BRs8zvH9kopgP2RYZWzRzRwGKY7nj\r\n1A7CiMW98xmfzE32czOmgDxwcSQ6lKHjYJzbZTP53d+o7ew9RaokRqNJDLb+\r\ndxd4RGLTGLF1w8yDLOweOaltr0enZEa/3czfcyCqnwjLkxwavYkrrGaSJ8gO\r\niy0P1EmSOVgjiIcmXy4YLdh2Bse4HTB0qPjzl3MDr1gffDzLQtrpLKnQfPvy\r\naD0ps3fBjqSkr3iHU+mOCYtx0WgpKu1OcfghRO9lervev/KvvKfiQ+4q7If3\r\nKyl6NdrvPEKk2KX9UTunGyP+uchuRxwKkKIP7zycWOx1sH9zB/lE+yqO8ebg\r\nVuMuEeRyIFCyrKeu9RX6KsB5Wt1A9D7YY8dqmFVB30hWNy70SLpoNLasGuxE\r\ncAoNuZDFqipbP/voIToAAyZQwOsTtfaVNpJMJutZMr3yT+TdmGPxiAflc8aW\r\nNqvmnTLavXE7NQLx1tR1kLngk6lncqJ/shI=\r\n=gdcF\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"franky47","email":"accounts@francoisbest.com"},"directories":{},"maintainers":[{"name":"franky47","email":"accounts@francoisbest.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/opaque-client_2.1.1_1676555271221_0.4470966681684967"},"_hasShrinkwrap":false},"2.1.2":{"name":"@47ng/opaque-client","collaborators":["Marcin Lazar <marcin.lazar@pm.me>","Hawkheart","r0kk3rz","François Best <npm.opaque@francoisbest.com>"],"description":"An implementation of the OPAQUE key exchange protocol in WASM(WebAssembly)","version":"2.1.2","repository":{"type":"git","url":"git+https://github.com/47ng/opaque.git","directory":"packages/client"},"module":"opaque-client.js","types":"opaque-client.d.ts","sideEffects":false,"keywords":["cryptography","crypto","opaque","passwords","authentication","wasm","js","browser","webassembly","node","wasm-pack","bindgen","wasm-bindgen"],"type":"module","exports":{".":{"import":"./opaque-client.js","types":"./opaque-client.d.ts"},"./inline-wasm":{"import":"./inline-wasm.js","types":"./inline-wasm.d.ts"}},"license":"(Apache-2.0 OR MIT)","publishConfig":{"access":"public"},"devDependencies":{"sceau":"^1.3.0"},"scripts":{},"bugs":{"url":"https://github.com/47ng/opaque/issues"},"homepage":"https://github.com/47ng/opaque#readme","_id":"@47ng/opaque-client@2.1.2","_integrity":"sha512-49vteI2cVLjJrTM8LJCBfzmYJm9lKOOJ+/fC8k9wNNQBtf/GLL4ykBlf97VcWMt2MFhxO5tuqDys6FhG2QOKlw==","_resolved":"/tmp/607d38a6978449c8f965d44036d088b9/47ng-opaque-client-2.1.2.tgz","_from":"file:47ng-opaque-client-2.1.2.tgz","_nodeVersion":"18.14.0","_npmVersion":"9.3.1","dist":{"integrity":"sha512-49vteI2cVLjJrTM8LJCBfzmYJm9lKOOJ+/fC8k9wNNQBtf/GLL4ykBlf97VcWMt2MFhxO5tuqDys6FhG2QOKlw==","shasum":"d1bf3a1da2af7622556bbc3e51c2a605c8a30dcb","tarball":"https://registry.npmjs.org/@47ng/opaque-client/-/opaque-client-2.1.2.tgz","fileCount":6,"unpackedSize":231002,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDqbLBykxEt6tNnYHC2hGvUCM/HOaZjUB8jfh4nvGc23wIhAPodAHo99TPOk4hjbUgrny5x7VOBN08QTFTIoaUo7P3g"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj9UoXACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmol6g/+MrShFVvyw1Ei8W/tHQ/4jEZNDYEng95dqUByQPKp+LJUQqdm\r\nUpeMj5dl+LKYyky/I9tocJorlYJhSEumYVk3pnXzHQIwdkVWnIEqAEFTi5LM\r\nURmfoXIZGXpnWIkMIWr8Y6CZQ5Q/pfOA80ZxTv/uyHu01kIVPwBJyp11DPQP\r\noezQlnSIFxckUWIeHhGU1UDSaFxe7tmOHVynmfp5Z+EOxiQoTgFfjvuoMP1L\r\nk8mYZHXZoRy8Q+PHlIEOaOu/Z2+5nObLEX25NXFgQPvw3OKg95IXeHxNHt90\r\niC6mx9cRf1vi1JkByLmHauUL/0xU4ONemeB1+c8tml8II72njY9zFB4bMXdc\r\n27zabm2fRb0fRu00JBmSrJnN5pa+vlxb+WC87Lg1VqnjflPhp2KSknPMBIOE\r\nt/Fr5W9ibsltr0hgphmrYqmr5GoJcTL1hDfCsFu+bNVKH3iG5JliTbprsp+e\r\nB4PdDxN/IUzsQZOYP2tcNJpe6xxFX6M9d03vmrGdAxkAopGKitLY6jRVHROJ\r\nt+Y76/xd9JJJilOq4ughHAueOjKH16lFW3nT72Y626G33tvq5z+6ktggGYqg\r\n06E8n3Rzo3MQ4LQGkFO0tHiPdYqjEbLiPJdzILga1PiMY7sDPQ0T8c5d+7d4\r\nLw+fmANLwoTyml4mJArakPD7MNTvdFt9Dac=\r\n=Ki4Z\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"franky47","email":"accounts@francoisbest.com"},"directories":{},"maintainers":[{"name":"franky47","email":"accounts@francoisbest.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/opaque-client_2.1.2_1677019671177_0.7566484937951172"},"_hasShrinkwrap":false},"2.1.3":{"name":"@47ng/opaque-client","collaborators":["Marcin Lazar <marcin.lazar@pm.me>","Hawkheart","r0kk3rz","François Best <npm.opaque@francoisbest.com>"],"description":"An implementation of the OPAQUE key exchange protocol in WASM(WebAssembly)","version":"2.1.3","repository":{"type":"git","url":"git+https://github.com/47ng/opaque.git","directory":"packages/client"},"module":"opaque-client.js","types":"opaque-client.d.ts","sideEffects":false,"keywords":["cryptography","crypto","opaque","passwords","authentication","wasm","js","browser","webassembly","node","wasm-pack","bindgen","wasm-bindgen"],"type":"module","exports":{".":{"import":"./opaque-client.js","types":"./opaque-client.d.ts"},"./inline-wasm":{"import":"./inline-wasm.js","types":"./inline-wasm.d.ts"}},"license":"(Apache-2.0 OR MIT)","publishConfig":{"access":"public"},"devDependencies":{"sceau":"^1.3.0"},"scripts":{},"bugs":{"url":"https://github.com/47ng/opaque/issues"},"homepage":"https://github.com/47ng/opaque#readme","_id":"@47ng/opaque-client@2.1.3","_integrity":"sha512-i7zG/jjrTKk7xcnKsX9PkKdb1NbICjTK4YisThtvcJm6e1qqQoZhnpGFmRqda5FC+Rkd1yhS7Nuesu7kHYyN6w==","_resolved":"/tmp/d267a1089c55ae7a877cec30d9239ce1/47ng-opaque-client-2.1.3.tgz","_from":"file:47ng-opaque-client-2.1.3.tgz","_nodeVersion":"18.14.0","_npmVersion":"9.3.1","dist":{"integrity":"sha512-i7zG/jjrTKk7xcnKsX9PkKdb1NbICjTK4YisThtvcJm6e1qqQoZhnpGFmRqda5FC+Rkd1yhS7Nuesu7kHYyN6w==","shasum":"18ca1efbbe0ef13e2437950917c220986ed47e3e","tarball":"https://registry.npmjs.org/@47ng/opaque-client/-/opaque-client-2.1.3.tgz","fileCount":8,"unpackedSize":506863,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID4kRZx7gFQEIX4ZbgesF9cZqZeVWIIm3sz/alzblP/3AiEAjQuGEwSrNLPuoE7/D/jXmoqpN5ysbeSBLBv0tqGWjAM="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj9Uu8ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmp2vQ/+MwD2YOkCDG8Zz9iPHpo4382Rl10h/KlPJAVk0WxJW7Miglde\r\nAt1cJPBPMgw/vD35Adf1pdaBRje+KQpso5ApfFN4d0DGAfXv6Cmp2X09vlh/\r\n33uSPpfOnx31Sl6k4Q+LYRNB/4FS+FYU2ZwupKDHU7ev4BJMKDq+7ZgoXPHh\r\nn8AZnCE5hlhJ6zyXIZYOZ44DlUdbELwTCzTz/1u/kOfcrcZPH3UM2CzCWhme\r\n2mZcA2A+d/k4vu0rVJoDXI5y36h+9CTgupX0EQF59NO7jK1usHEY2HG3ZE1R\r\n+oyta8BkSxi7v7ulHpAO8FV5qmdrjprKwzLubwMbf4vbajZ8YW42ZwAgMcUj\r\nYOfWZojUvVow9bTP7zVYkxHc41HiHv3jLiJwcTFuSA9MNrwN6YxufkSuauBk\r\nsM81jRb9hbl5rdC12xr1uTHtYhl9PrlU4r6jxe6QGjQqw/SjCQVS+oWHXVFg\r\nXuJtG22EcuvNuEbyYHPMZuuLf4+myeHbgHm37aKv/ViSDUdPIWZ0TzxF7uJO\r\nblxgemAczlMme5PXgep3y/ZAGUC3E31u5/Gd0tn+zSMY0Fqm22JrOEzLap9q\r\naoAkldYYYPKE4MaQ4tKQ5IX4XS6DcnN+aO3+Bb3onwnbIeYTxt9IafFX2LsK\r\ny7/YUWq8RRnwNaBFwvEo0vf/OXh/6dnFkrI=\r\n=KyKZ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"franky47","email":"accounts@francoisbest.com"},"directories":{},"maintainers":[{"name":"franky47","email":"accounts@francoisbest.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/opaque-client_2.1.3_1677020092730_0.6301125455180565"},"_hasShrinkwrap":false},"2.1.4":{"name":"@47ng/opaque-client","collaborators":["Marcin Lazar <marcin.lazar@pm.me>","Hawkheart","r0kk3rz","François Best <npm.opaque@francoisbest.com>"],"description":"An implementation of the OPAQUE key exchange protocol in WASM(WebAssembly)","version":"2.1.4","repository":{"type":"git","url":"git+https://github.com/47ng/opaque.git","directory":"packages/client"},"module":"opaque-client.js","types":"opaque-client.d.ts","sideEffects":false,"keywords":["cryptography","crypto","opaque","passwords","authentication","wasm","js","browser","webassembly","node","wasm-pack","bindgen","wasm-bindgen"],"type":"module","exports":{".":{"import":"./opaque-client.js","types":"./opaque-client.d.ts"},"./inline-wasm":{"import":"./inline-wasm.js","types":"./inline-wasm.d.ts"}},"license":"(Apache-2.0 OR MIT)","publishConfig":{"access":"public"},"devDependencies":{"sceau":"^1.3.0"},"scripts":{},"bugs":{"url":"https://github.com/47ng/opaque/issues"},"homepage":"https://github.com/47ng/opaque#readme","_id":"@47ng/opaque-client@2.1.4","_integrity":"sha512-OpIwPAY3+wq1ou7e3XCT+OeLeZmWGe+LrM/ywIlRsh9ggPIPDYs0TfD+nzoiL0gnRSKD04UALiD0Vz3mxgeJGw==","_resolved":"/tmp/eab2b3bd3145732aebaa86503d14b687/47ng-opaque-client-2.1.4.tgz","_from":"file:47ng-opaque-client-2.1.4.tgz","_nodeVersion":"18.14.0","_npmVersion":"9.3.1","dist":{"integrity":"sha512-OpIwPAY3+wq1ou7e3XCT+OeLeZmWGe+LrM/ywIlRsh9ggPIPDYs0TfD+nzoiL0gnRSKD04UALiD0Vz3mxgeJGw==","shasum":"32cfbffccad2ffff5722b2603731394f58744a33","tarball":"https://registry.npmjs.org/@47ng/opaque-client/-/opaque-client-2.1.4.tgz","fileCount":8,"unpackedSize":503290,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDzXmKILmKGt5sceTF0lZYX+/63DANbG2/5pEHwZoMdowIgGSaBdRv4NII3TFDydZjT5i6WEnAH/hkt95s/3I4Lfgo="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj9U70ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmrigg/+NxxmUeOp7kGtjrYKYWhOfzLVJaxTihGsx0wYgzvj7F1hyj9R\r\nHZ7YKpNeytUStm9/iHpn2qfdlyNUsbMADMf64l+9ckGReeVqipr6jCtpg/At\r\n8epiVu7wXYHIo5FFTs5DYX/ZiAj8DxFqt0ecTPt9iiBMfAfeklxU+14bRlZf\r\n57ZvXtOl6+DD2xxNpWRAZZCvIY2dhlq4lHbPEXf+wxf0lPHR3MKZHmSKqKn7\r\nlY2sgngq0Im+Ifq6gIP71MyarENZNoOMGyVjvaUTGHD47hC6o3RraIYmwuCK\r\nxfKcW7BpK5kJqQKP/LUznF3HQK8RwRMRb7zW8tdiyXcEyzKvvaY0Gj845R2O\r\nyF9KRZPl0/9wrHwAh5y/ERIGEj2MGcTFryiZ6KIlx20aKKXKu0f2ylxuXMbO\r\n8Oy7Qbm0ucttP8npRSsef/CS75FzOT7GmWRPjM/GmD3AHfsnLjttWLN1Xdz3\r\nKOTgIJy+Om1ZpDmyuOo8tTysKhFydoaLuLcUzj856Mct9ISB81ta/pmBY6Wn\r\nWvFmxzVXeobT32Cwh5R3yNGbIO6tsodPFtWG/35EBwcNr3zi6mVmzA0TvHzg\r\nEEnh37Wqe5oMwOgWnq6/Ade6Fd1jfS1Xsn7voVpL0ZYrQjTt3v0vRtsO9pCM\r\n7NXRfNImtS6WTp8VSYRtprieChw9xg0WxOs=\r\n=qpic\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"franky47","email":"accounts@francoisbest.com"},"directories":{},"maintainers":[{"name":"franky47","email":"accounts@francoisbest.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/opaque-client_2.1.4_1677020915918_0.9130536053265412"},"_hasShrinkwrap":false},"2.1.5":{"name":"@47ng/opaque-client","collaborators":["Marcin Lazar <marcin.lazar@pm.me>","Hawkheart","r0kk3rz","François Best <npm.opaque@francoisbest.com>"],"description":"An implementation of the OPAQUE key exchange protocol in WASM(WebAssembly)","version":"2.1.5","repository":{"type":"git","url":"git+https://github.com/47ng/opaque.git","directory":"packages/client"},"module":"opaque-client.js","types":"opaque-client.d.ts","sideEffects":["./snippets/*"],"keywords":["cryptography","crypto","opaque","passwords","authentication","wasm","js","browser","webassembly","node","wasm-pack","bindgen","wasm-bindgen"],"type":"module","exports":{".":{"import":"./opaque-client.js","types":"./opaque-client.d.ts"},"./inline-wasm":{"import":"./inline-wasm.js","types":"./inline-wasm.d.ts"}},"license":"(Apache-2.0 OR MIT)","publishConfig":{"access":"public"},"devDependencies":{"sceau":"^1.3.0"},"scripts":{},"bugs":{"url":"https://github.com/47ng/opaque/issues"},"homepage":"https://github.com/47ng/opaque#readme","_id":"@47ng/opaque-client@2.1.5","_integrity":"sha512-uYxNuRtBlPEfTrxHqmDARDIiqwEVWzIL5C3I1kmX7P1cMNtjV0/mmUW73TX+l0+n3GGEivx/aCOhek209Y+LJw==","_resolved":"/tmp/04b0f79a9459aa73f43ddc59b23f184c/47ng-opaque-client-2.1.5.tgz","_from":"file:47ng-opaque-client-2.1.5.tgz","_nodeVersion":"18.15.0","_npmVersion":"9.5.0","dist":{"integrity":"sha512-uYxNuRtBlPEfTrxHqmDARDIiqwEVWzIL5C3I1kmX7P1cMNtjV0/mmUW73TX+l0+n3GGEivx/aCOhek209Y+LJw==","shasum":"c4c3e7acc893175dc01dac6cba982a1aba1095c0","tarball":"https://registry.npmjs.org/@47ng/opaque-client/-/opaque-client-2.1.5.tgz","fileCount":8,"unpackedSize":489771,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDT346iIrtrEGoKeVsAAI6Tnsd7LUCGePX1XSd0UZ0H2QIhALMdc2JlYS5iCY/pefQMIje/T1ezst8gxnOrg0Ivl6Ga"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJkHdQkACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrcmQ//SRYzwgLEJqzwjkRVZqj+7Qwp5aH/3/JmReAXHt6MBksKVzlr\r\nMbs2iqs6SR27djhCmPYx74kWA/nijsOl1LXZeAY7QEBDGqTMeoxPctYdE2lt\r\n9Z6y66uJ+oRsDtFVHyKBPrxZ6wcQxKsILDSqlBIlS5X4poIuLTw6s+NPXmdu\r\nx/eXAwK0zvi8FKMdowTI8wf+Pons8tA1bmzc4BskWGhoE/Ufc1UMoHOag9r3\r\ntHmhqWMeEoWnlwqf5Seej8jsTJweX9fP0+n056GN79WZU9wy86Q1Mdk+H/Ip\r\nU6LaDuCbOEsVYvtChpJeT0xa6enKEXbr9+iT3sRsrDYsWWO4fz/ncl7UqW0j\r\n1KytxBrdoC58p8F4FU4anN1+8InGH8vve7UDmnklDpO8G3lFs4am09paAZMS\r\neizcD7MEYgBmg/9N+2s2cUrFkNfkmjLMOEuGs+HHFNb6cUSYq7XQx4HK0cTM\r\n75iSVlnuFtDUM2C3SYz1rAdNQDZ7eOOWhk8bLiu9U+IaeSZpMPDKdIN491Zq\r\n+xqgiylNaL/xLrvP7RkIy++4148i1xHzUnGiWrVo2SNMbOUOKQR0VZk2CeBL\r\n9ZxpdstTn+9wMv42CYaRhF4votqepI7aUnAKyzpcuRng9jdRWv/Xn8/8E9sY\r\nxdJ1PwAizwy+WrXmLSKCihUMOSrxM5INyyg=\r\n=O72n\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"franky47","email":"accounts@francoisbest.com"},"directories":{},"maintainers":[{"name":"franky47","email":"accounts@francoisbest.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/opaque-client_2.1.5_1679676451916_0.3417592498499955"},"_hasShrinkwrap":false}},"time":{"created":"2023-01-31T22:58:56.611Z","0.0.1-beta.7":"2023-01-31T22:58:56.955Z","modified":"2023-03-24T16:47:32.319Z","0.0.1-beta.8":"2023-01-31T23:19:55.028Z","0.0.1-beta.9":"2023-01-31T23:29:52.565Z","0.0.1-beta.10":"2023-01-31T23:39:13.181Z","0.0.1-beta.11":"2023-02-01T11:10:09.017Z","0.0.1-beta.13":"2023-02-01T12:54:53.492Z","0.0.1-beta.14":"2023-02-01T13:18:19.382Z","0.0.1-beta.15":"2023-02-02T13:18:26.883Z","0.0.1-beta.16":"2023-02-03T11:39:56.305Z","1.0.0":"2023-02-03T12:32:01.570Z","2.1.0":"2023-02-03T12:42:56.695Z","2.1.1":"2023-02-16T13:47:51.403Z","2.1.2":"2023-02-21T22:47:51.361Z","2.1.3":"2023-02-21T22:54:52.945Z","2.1.4":"2023-02-21T23:08:36.175Z","2.1.5":"2023-03-24T16:47:32.136Z"},"maintainers":[{"name":"franky47","email":"accounts@francoisbest.com"}],"description":"An implementation of the OPAQUE key exchange protocol in WASM(WebAssembly)","homepage":"https://github.com/47ng/opaque#readme","keywords":["cryptography","crypto","opaque","passwords","authentication","wasm","js","browser","webassembly","node","wasm-pack","bindgen","wasm-bindgen"],"repository":{"type":"git","url":"git+https://github.com/47ng/opaque.git","directory":"packages/client"},"bugs":{"url":"https://github.com/47ng/opaque/issues"},"license":"(Apache-2.0 OR MIT)","readme":"# `@47ng/opaque-client`\n\nThe OPAQUE key exchange protocol in WASM (WebAssembly), for web browsers.\nThis implementation is based on [facebook/opaque-ke](https://github.com/facebook/opaque-ke).\n\nBuilt as ESM for browsers from [47ng/opaque-wasm](https://github.com/47ng/opaque-wasm/tree/fork/47ng-opaque/do-not-merge-to-upstream)\n_(a fork of [marucjmar/opaque-wasm](https://github.com/marucjmar/opaque-wasm) using Ristretto rather than the NIST P-256 curve)_.\n\nServer (Node.js) counterpart is available in [`@47ng/opaque-server`](https://npmjs.com/package/@47ng/opaque-server).\n\n## Installation\n\n```\nnpm install @47ng/opaque-client\nyarn add @47ng/opaque-client\npnpm add @47ng/opaque-client\n```\n\n## Usage\n\nThis implements the [OPAQUE protocol overview](https://github.com/47ng/opaque/blob/main/docs/opaque-protocol-overview.md)\nfor a stateless server and with recommended security practices.\n\n### Registration (signup)\n\nOPAQUE requires two handshakes to perform a signup (technically one and a half,\nthe final response has no cryptographic use to the client).\n\nPseudo-code:\n\n```ts\nimport { Registration } from '@47ng/opaque-server'\n\nconst username = 'alice@example.com'\nconst password = 'correct horse battery staple'\n\nasync function registerClient(username: string, password: string) {\n  const registration = new Registration()\n  const registrationRequest = registration.start(password)\n  const {\n    data: { nonce, registrationResponse },\n  } = await sendToServer(username, registrationRequest)\n  const registrationRecord = registration.finish(password, registrationResponse)\n  const { status } = await sendToServer(nonce, registrationRecord)\n  registration.free()\n}\n```\n\n> _Note: registration doesn't perform key exchange/agreement,\n> so a login step is necessary after signup to establish a shared key._\n\n### Login\n\nOPAQUE requires two handshakes to perform a login.\n\nThe client will already have the key before sending the second handshake, but\nthe server will only be able to obtain it after doing its calculations, so\nthe key must not be used in the second request.\n\nPseudo-code:\n\n```ts\nimport { Login } from '@47ng/opaque-client'\n\nconst username = 'alice@example.com'\nconst password = 'correct horse battery staple'\n\nasync function clientLogin(username: string, password: string) {\n  const login = new Login()\n  const loginRequest = login.start(password)\n  const {\n    data: { nonce, loginReponse },\n  } = await sendToServer(username, loginRequest)\n  const loginFinal = login.finish(password, loginReponse)\n  const { status } = await sendToServer(nonce, loginFinal)\n  const sessionKey = login.getSessionKey()\n  login.free()\n  return sessionKey\n}\n```\n\n### Export key\n\nAfter both registration and login, the client can obtain an `exportKey`,\ntied to the credentials used and only available to the client.\n\nIt can be used to implement simple end-to-end self-encryption to store secret\npersonal data on the server.\n","readmeFilename":"README.md"}