open-index/open-npm huggingface dataset:
npm package: @squirrelchat/opaque-wasm-client
Description: WebAssembly wrapper for facebook/opaque-ke (client-side)
Latest version: 0.1.2

# opaque-wasm client
[![License](https://img.shields.io/github/license/squirrelchat/opaque-wasm.svg?style=flat-square)](https://github.com/squirrelchat/opaque-wasm/blob/mistress/LICENSE)
[![npm](https://img.shields.io/npm/v/@squirrelchat/opaque-wasm-client?label=npm%20%28client%29&style=flat-square)](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)
}
```
npm package: @squirrelchat/opaque-wasm-server
Description: WebAssembly wrapper for facebook/opaque-ke (server-side)
Latest version: 0.1.2

# opaque-wasm server
[![License](https://img.shields.io/github/license/squirrelchat/opaque-wasm.svg?style=flat-square)](https://github.com/squirrelchat/opaque-wasm/blob/mistress/LICENSE)
[![npm](https://img.shields.io/npm/v/@squirrelchat/opaque-wasm-server?label=npm%20%28server%29&style=flat-square)](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)
}
```