-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix: further fix package.json, better docs
- Loading branch information
Showing
7 changed files
with
188 additions
and
93 deletions.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,6 @@ | ||
[package] | ||
name = "opaque-wasm-client" | ||
version = "0.1.0" | ||
version = "0.1.1" | ||
authors = ["Cynthia <[email protected]>"] | ||
repository = "https://github.com/squirrelchat/opaque-wasm" | ||
description = "WebAssembly wrapper for facebook/opaque-ke (client-side)" | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
# opaque-wasm client | ||
[](https://github.com/squirrelchat/opaque-wasm/blob/mistress/LICENSE) | ||
[](https://npm.im/@squirrelchat/opaque-wasm-client) | ||
|
||
Wrapper for [opaque-ke](https://github.com/facebook/opaque-ke) to implement the OPAQUE protocol in JavaScript/WASM. | ||
|
||
This library uses the following OPAQUE configuration, based on the recommendations of the OPAQUE draft and the Argon2 RFC: | ||
- OPRF: ristretto255-SHA512 | ||
- KDF: HKDF-SHA-512 | ||
- MAC: HMAC-SHA-512 | ||
- Hash: SHA-512 | ||
- KSF: Argon2id(S = zeroes(16), p = 4, T = Nh, m = 2^16, t = 3, v = 0x13, K = nil, X = nil, y = 2) | ||
- Group: ristretto255 | ||
|
||
## Installation | ||
The client requires an environment compatible with WebAssembly ESM. For example, | ||
- For the web: [Vite](https://vitejs.dev/) with [`vite-plugin-wasm`](https://github.com/Menci/vite-plugin-wasm) | ||
- For Node: use the [`--experimental-wasm-modules` flag](https://nodejs.org/api/esm.html#wasm-modules) | ||
|
||
``` | ||
npm i @squirrelchat/opaque-wasm-client | ||
yarn add @squirrelchat/opaque-wasm-client | ||
pnpm add @squirrelchat/opaque-wasm-client | ||
``` | ||
|
||
## Usage | ||
### Registration | ||
```js | ||
import { startRegistration } from '@squirrelchat/opaque-wasm-client' | ||
|
||
try { | ||
const registration = startRegistration('mewn supy€w sekyuwe paffw0wdy! UwU') | ||
console.log(registration.request) // <Uint8Array ...> | ||
// ~> send this to the server | ||
|
||
const response = ... // <~ response from the server | ||
|
||
const { exportKey, serverPublicKey, record } = registration.finish(response) | ||
console.log(record) // <Uint8Array ...> | ||
// ~> send this to the server | ||
|
||
console.log('export key:', exportKey) // <Uint8Array ...> | ||
console.log('server public key:', serverPublicKey) // <Uint8Array ...> | ||
} catch (e) { | ||
console.error('Registration failed!', e) | ||
} | ||
``` | ||
|
||
### Login | ||
```js | ||
import { startLogin } from '@squirrelchat/opaque-wasm-client' | ||
|
||
try { | ||
const login = startLogin('mewn supy€w sekyuwe paffw0wdy! UwU') | ||
console.log(login.request) // <Uint8Array ...> | ||
// ~> send this to the server | ||
|
||
const response = ... // <~ response from the server | ||
|
||
const { exportKey, sessionKey, serverPublicKey, message } = registration.finish(response) | ||
console.log(record) // <Uint8Array ...> | ||
// ~> send this to the server | ||
|
||
console.log('export key:', exportKey) | ||
console.log('session key:', sessionKey) | ||
console.log('server public key:', serverPublicKey) | ||
} catch (e) { | ||
console.error('Login failed!', e) | ||
} | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,6 @@ | ||
[package] | ||
name = "opaque-wasm-server" | ||
version = "0.1.0" | ||
version = "0.1.1" | ||
authors = ["Cynthia <[email protected]>"] | ||
repository = "https://github.com/squirrelchat/opaque-wasm" | ||
description = "WebAssembly wrapper for facebook/opaque-ke (server-side)" | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
# opaque-wasm server | ||
[](https://github.com/squirrelchat/opaque-wasm/blob/mistress/LICENSE) | ||
[](https://npm.im/@squirrelchat/opaque-wasm-server) | ||
|
||
## Installation | ||
This package is only compatible with Node at this time. | ||
|
||
``` | ||
npm i @squirrelchat/opaque-wasm-server | ||
yarn add @squirrelchat/opaque-wasm-server | ||
pnpm add @squirrelchat/opaque-wasm-server | ||
``` | ||
|
||
## Usage | ||
### Startup | ||
```js | ||
import { Server } from '@squirrelchat/opaque-wasm-server' | ||
|
||
// Create a server | ||
// -> First time | ||
const server = new Server() | ||
console.log(server.getState()) // <Uint8Array ...> | ||
// ~> Save this somewhere super safe! | ||
|
||
// -> Future times | ||
const state = ... // Get from secure storage | ||
const server = new Server(state) | ||
|
||
// The state MUST be stored and restored, otherwise | ||
// logging in will not work after a server restart. | ||
``` | ||
|
||
### Registration | ||
```js | ||
const username = ... // <~ value sent by the client | ||
const request = ... // <~ value sent by the client | ||
|
||
try { | ||
const response = server.startRegistration(username, request) | ||
console.log(response) // <Uint8Array ...> | ||
// ~> send this to the client | ||
} catch (e) { | ||
console.error('Could not start registration!', e) | ||
} | ||
|
||
// --- | ||
|
||
const username = ... // <~ value sent by the client | ||
const record = ... // <~ value sent by the client | ||
|
||
try { | ||
const credentials = server.finishRegistration(record) | ||
console.log(credentials) // <Uint8Array ...> | ||
// Store this on disk, and tada! | ||
} catch (e) { | ||
console.error('Could not finalize registration!', e) | ||
} | ||
``` | ||
|
||
### Login | ||
```js | ||
const username = ... // <~ value sent by the client | ||
const request = ... // <~ value sent by the client | ||
|
||
// A note on account enumeration: | ||
// The OPAQUE protocol protects against account enumeration | ||
// by design during authentication. To achieve this, you must | ||
// engage in the protocol even if the account does not exists. | ||
// opaque-wasm and the underlying lib does this by using a fake | ||
// random record when no record is specified. | ||
try { | ||
const { response, state } = server.startLogin(username, request, row?.credentials) | ||
|
||
console.log(state) // <Uint8Array ...> | ||
// Store this somewhere SAFE, you'll need it to finalize the login. | ||
// Do NOT send it to the client! | ||
|
||
console.log(response) // <Uint8Array ...> | ||
// ~> send this to the client | ||
} catch (e) { | ||
console.error('Could not start authentication!', e) | ||
} | ||
|
||
// --- | ||
|
||
const authentication = ... // <~ value sent by the client | ||
try { | ||
const sessionKey = server.finishLogin(state, authentication) | ||
console.log('session key:', sessionKey) | ||
} catch (e) { | ||
console.error('Could not finalize authentication!', e) | ||
} | ||
``` |