mirror of
https://github.com/tlsnotary/tlsn-js.git
synced 2026-01-09 20:47:55 -05:00
159 lines
4.1 KiB
Markdown
159 lines
4.1 KiB
Markdown
![MIT licensed][mit-badge]
|
|
![Apache licensed][apache-badge]
|
|
|
|
[mit-badge]: https://img.shields.io/badge/license-MIT-blue.svg
|
|
[apache-badge]: https://img.shields.io/github/license/saltstack/salt
|
|
|
|
# tlsn-js
|
|
|
|
NPM Modules for proving and verifying using TLSNotary in the browser.
|
|
|
|
The prover requires a [notary-server](https://github.com/tlsnotary/notary-server) and a websocket proxy
|
|
|
|
> [!IMPORTANT]
|
|
> The primary purpose of `tlsn-js` is to support the development of the [TLSNotary browser extension](https://github.com/tlsnotary/tlsn-extension/).
|
|
> **Please do not treat this as a public API (yet).**
|
|
|
|
> [!IMPORTANT]
|
|
> `tlsn-js` is developed for the usage of TLSNotary **in the Browser**. This module does not work in `nodejs`.
|
|
|
|
## License
|
|
This repository is licensed under either of
|
|
|
|
- [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
|
|
- [MIT license](http://opensource.org/licenses/MIT)
|
|
|
|
at your option.
|
|
|
|
## Example
|
|
```ts
|
|
// worker.ts
|
|
import * as Comlink from 'comlink';
|
|
import init, { Prover, NotarizedSession, TlsProof } from 'tlsn-js';
|
|
|
|
Comlink.expose({
|
|
init,
|
|
Prover,
|
|
NotarizedSession,
|
|
TlsProof,
|
|
});
|
|
|
|
```
|
|
```ts
|
|
// app.ts
|
|
import { NotaryServer } from 'tlsn-js';
|
|
const { init, Prover, NotarizedSession, TlsProof }: any = Comlink.wrap(
|
|
new Worker(new URL('./worker.ts', import.meta.url)),
|
|
);
|
|
|
|
// To create a proof
|
|
await init({ loggingLevel: 'Debug '});
|
|
const notary = NotaryServer.from(`http://localhost:7047`);
|
|
const prover = await new Prover({ serverDns: 'swapi.dev' });
|
|
|
|
// Connect to verifier
|
|
await prover.setup(await notary.sessionUrl());
|
|
|
|
// Submit request
|
|
await prover.sendRequest('ws://localhost:55688', {
|
|
url: 'https://swapi.dev/api/people/1',
|
|
method: 'GET',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: {
|
|
hello: 'world',
|
|
one: 1,
|
|
},
|
|
});
|
|
|
|
// Get transcript and precalculated ranges
|
|
const transcript = await prover.transcript();
|
|
|
|
// Select ranges to commit
|
|
const commit: Commit = {
|
|
sent: [
|
|
transcript.ranges.sent.info!,
|
|
transcript.ranges.sent.headers!['content-type'],
|
|
transcript.ranges.sent.headers!['host'],
|
|
...transcript.ranges.sent.lineBreaks,
|
|
],
|
|
recv: [
|
|
transcript.ranges.recv.info!,
|
|
transcript.ranges.recv.headers!['server'],
|
|
transcript.ranges.recv.headers!['date'],
|
|
transcript.ranges.recv.json!['name'],
|
|
transcript.ranges.recv.json!['gender'],
|
|
...transcript.ranges.recv.lineBreaks,
|
|
],
|
|
};
|
|
|
|
// Notarize selected ranges
|
|
const serializedSession = await prover.notarize(commit);
|
|
|
|
// Instantiate NotarizedSession
|
|
// note: this is necessary because workers can only post messages in serializable values
|
|
const notarizedSession = await new NotarizedSession(serializedSession);
|
|
|
|
|
|
// Create proof for commited ranges
|
|
// note: this will reveal the selected ranges
|
|
const serializedProof = await notarizedSession.proof(commit);
|
|
|
|
// Instantiate Proof
|
|
// note: necessary due to limitation with workers
|
|
const proof = await new TlsProof(serializedProof);
|
|
|
|
// Verify a proof
|
|
const proofData = await proof.verify({
|
|
typ: 'P256',
|
|
key: await notary.publicKey(),
|
|
});
|
|
```
|
|
|
|
## Running a local websocket proxy for `https://swapi.dev`
|
|
|
|
1. Install [websocat](https://github.com/vi/websocat):
|
|
|
|
| tool | command |
|
|
| ------ | ------------------------------ |
|
|
| cargo | `cargo install websocat` |
|
|
| brew | `brew install websocat` |
|
|
| source | https://github.com/vi/websocat |
|
|
|
|
2. Run a websocket proxy for `https://swapi.dev`:
|
|
```sh
|
|
websocat --binary -v ws-l:0.0.0.0:55688 tcp:swapi.dev:443
|
|
```
|
|
|
|
## Install as NPM Package
|
|
|
|
```
|
|
npm install tlsn-js
|
|
```
|
|
|
|
## Development
|
|
|
|
```
|
|
# make sure you have rust installed
|
|
# https://www.rust-lang.org/tools/install
|
|
npm install
|
|
|
|
# this serve a page that will execute the example code at http://localhost:3001
|
|
npm run dev
|
|
```
|
|
|
|
## Build for NPM
|
|
|
|
```
|
|
npm install
|
|
npm run build
|
|
```
|
|
|
|
## Adding a new test
|
|
1. Create a new `new-test.spec.ts` file in the `test/` directory
|
|
2. Add your spec file to the entry object fin `webpack.web.dev.config.js`
|
|
3. Add a new `div` block to `test/test.ejs` like this: `<div>Testing "new-test":<div id="new-test"></div></div>`. The div id must be the same as the filename.
|
|
|
|
|