@acpantenna/relay-protocol 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +54 -2
- package/dist/bip39-english.d.ts +28 -0
- package/dist/bip39-english.d.ts.map +1 -0
- package/dist/bip39-english.js +28 -0
- package/dist/bip39-english.js.map +1 -0
- package/dist/bytes.d.ts +21 -0
- package/dist/bytes.d.ts.map +1 -0
- package/dist/bytes.js +114 -0
- package/dist/bytes.js.map +1 -0
- package/dist/frames.d.ts +90 -0
- package/dist/frames.d.ts.map +1 -0
- package/dist/frames.js +234 -0
- package/dist/frames.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/link.d.ts +44 -0
- package/dist/link.d.ts.map +1 -0
- package/dist/link.js +120 -0
- package/dist/link.js.map +1 -0
- package/dist/noise.d.ts +181 -0
- package/dist/noise.d.ts.map +1 -0
- package/dist/noise.js +490 -0
- package/dist/noise.js.map +1 -0
- package/dist/relay.d.ts +37 -0
- package/dist/relay.d.ts.map +1 -0
- package/dist/relay.js +70 -0
- package/dist/relay.js.map +1 -0
- package/dist/sas.d.ts +11 -0
- package/dist/sas.d.ts.map +1 -0
- package/dist/sas.js +26 -0
- package/dist/sas.js.map +1 -0
- package/dist/session.d.ts +298 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +608 -0
- package/dist/session.js.map +1 -0
- package/package.json +56 -5
- package/src/bip39-english.ts +30 -0
- package/src/bytes.ts +125 -0
- package/src/frames.ts +278 -0
- package/src/index.ts +14 -0
- package/src/link.ts +160 -0
- package/src/noise.ts +655 -0
- package/src/relay.ts +106 -0
- package/src/sas.ts +28 -0
- package/src/session.ts +848 -0
- package/test-vectors/frames.json +353 -0
- package/test-vectors/noise-kk.json +43 -0
- package/test-vectors/noise-nkpsk0.json +47 -0
- package/test-vectors/sas.json +21 -0
- package/test-vectors/session.json +58 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frames.js","sourceRoot":"","sources":["../src/frames.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The wire protocol between acpantenna and a web client over a relay:
|
|
3
|
+
* Noise NKpsk0, the frame codec, the pairing link, the SAS words, and a
|
|
4
|
+
* session object both ends use. Plain `Uint8Array`s and Web APIs only, so it
|
|
5
|
+
* runs in a browser as well as in Bun. The spec is `docs/relay-protocol.md`.
|
|
6
|
+
*/
|
|
7
|
+
export * from "./bytes.ts";
|
|
8
|
+
export * from "./frames.ts";
|
|
9
|
+
export * from "./link.ts";
|
|
10
|
+
export * from "./noise.ts";
|
|
11
|
+
export * from "./relay.ts";
|
|
12
|
+
export * from "./sas.ts";
|
|
13
|
+
export * from "./session.ts";
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The wire protocol between acpantenna and a web client over a relay:
|
|
3
|
+
* Noise NKpsk0, the frame codec, the pairing link, the SAS words, and a
|
|
4
|
+
* session object both ends use. Plain `Uint8Array`s and Web APIs only, so it
|
|
5
|
+
* runs in a browser as well as in Bun. The spec is `docs/relay-protocol.md`.
|
|
6
|
+
*/
|
|
7
|
+
export * from "./bytes.js";
|
|
8
|
+
export * from "./frames.js";
|
|
9
|
+
export * from "./link.js";
|
|
10
|
+
export * from "./noise.js";
|
|
11
|
+
export * from "./relay.js";
|
|
12
|
+
export * from "./sas.js";
|
|
13
|
+
export * from "./session.js";
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC"}
|
package/dist/link.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The pairing link: `<web origin>/#v1.<room>.<s_pub>.<psk>.<expiry>`.
|
|
3
|
+
*
|
|
4
|
+
* `room` (16 bytes), `s_pub` (32) and `psk` (32) are base64url without
|
|
5
|
+
* padding; `expiry` is unix seconds in decimal. Everything secret is in the
|
|
6
|
+
* fragment, which browsers never send to a server.
|
|
7
|
+
*/
|
|
8
|
+
export declare const LINK_VERSION = "v1";
|
|
9
|
+
export declare const ROOM_LENGTH = 16;
|
|
10
|
+
export declare const KEY_LENGTH = 32;
|
|
11
|
+
/** How long a link is valid by default: 10 minutes. */
|
|
12
|
+
export declare const DEFAULT_LINK_TTL_SECONDS: number;
|
|
13
|
+
/** The label at the start of the prologue. */
|
|
14
|
+
export declare const PROLOGUE_LABEL = "acpantenna-relay/1";
|
|
15
|
+
export interface PairingLink {
|
|
16
|
+
/** The web client's origin, e.g. `https://app.example`. */
|
|
17
|
+
webOrigin: string;
|
|
18
|
+
room: Uint8Array;
|
|
19
|
+
/** The agent side's static X25519 public key. */
|
|
20
|
+
staticPublicKey: Uint8Array;
|
|
21
|
+
psk: Uint8Array;
|
|
22
|
+
/** Unix seconds. */
|
|
23
|
+
expiry: number;
|
|
24
|
+
}
|
|
25
|
+
export declare class LinkError extends Error {
|
|
26
|
+
constructor(message: string);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Checks that `origin` is an origin and nothing more — a scheme, a host and
|
|
30
|
+
* maybe a port — and returns it in the form `URL.origin` gives.
|
|
31
|
+
*/
|
|
32
|
+
export declare function normalizeWebOrigin(origin: string): string;
|
|
33
|
+
export declare function encodeLink(link: PairingLink): string;
|
|
34
|
+
/** Parses a link. It does not check expiry: see {@link isLinkExpired}. */
|
|
35
|
+
export declare function parseLink(text: string): PairingLink;
|
|
36
|
+
export declare function isLinkExpired(link: PairingLink, nowMs?: number): boolean;
|
|
37
|
+
/** The room id as it appears in the relay URL: base64url, 22 characters. */
|
|
38
|
+
export declare function roomId(room: Uint8Array): string;
|
|
39
|
+
/**
|
|
40
|
+
* The Noise prologue: `"acpantenna-relay/1" ‖ 0x00 ‖ room ‖ 0x00 ‖ web
|
|
41
|
+
* origin`, binding the handshake to this room and this web client.
|
|
42
|
+
*/
|
|
43
|
+
export declare function prologue(room: Uint8Array, webOrigin: string): Uint8Array;
|
|
44
|
+
//# sourceMappingURL=link.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../src/link.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,eAAO,MAAM,YAAY,OAAO,CAAC;AACjC,eAAO,MAAM,WAAW,KAAK,CAAC;AAC9B,eAAO,MAAM,UAAU,KAAK,CAAC;AAC7B,uDAAuD;AACvD,eAAO,MAAM,wBAAwB,QAAU,CAAC;AAChD,8CAA8C;AAC9C,eAAO,MAAM,cAAc,uBAAuB,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC3B,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,UAAU,CAAC;IACjB,iDAAiD;IACjD,eAAe,EAAE,UAAU,CAAC;IAC5B,GAAG,EAAE,UAAU,CAAC;IAChB,oBAAoB;IACpB,MAAM,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,SAAU,SAAQ,KAAK;gBACvB,OAAO,EAAE,MAAM;CAI3B;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAoBzD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAUpD;AAED,0EAA0E;AAC1E,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CA8BnD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,SAAa,GAAG,OAAO,CAE5E;AAED,4EAA4E;AAC5E,wBAAgB,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAE/C;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,CAWxE"}
|
package/dist/link.js
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The pairing link: `<web origin>/#v1.<room>.<s_pub>.<psk>.<expiry>`.
|
|
3
|
+
*
|
|
4
|
+
* `room` (16 bytes), `s_pub` (32) and `psk` (32) are base64url without
|
|
5
|
+
* padding; `expiry` is unix seconds in decimal. Everything secret is in the
|
|
6
|
+
* fragment, which browsers never send to a server.
|
|
7
|
+
*/
|
|
8
|
+
import { base64urlDecode, base64urlEncode, concatBytes, utf8Encode, } from "./bytes.js";
|
|
9
|
+
export const LINK_VERSION = "v1";
|
|
10
|
+
export const ROOM_LENGTH = 16;
|
|
11
|
+
export const KEY_LENGTH = 32;
|
|
12
|
+
/** How long a link is valid by default: 10 minutes. */
|
|
13
|
+
export const DEFAULT_LINK_TTL_SECONDS = 10 * 60;
|
|
14
|
+
/** The label at the start of the prologue. */
|
|
15
|
+
export const PROLOGUE_LABEL = "acpantenna-relay/1";
|
|
16
|
+
export class LinkError extends Error {
|
|
17
|
+
constructor(message) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.name = "LinkError";
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Checks that `origin` is an origin and nothing more — a scheme, a host and
|
|
24
|
+
* maybe a port — and returns it in the form `URL.origin` gives.
|
|
25
|
+
*/
|
|
26
|
+
export function normalizeWebOrigin(origin) {
|
|
27
|
+
let url;
|
|
28
|
+
try {
|
|
29
|
+
url = new URL(origin);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
throw new LinkError(`Not a URL: ${origin}`);
|
|
33
|
+
}
|
|
34
|
+
if (url.protocol !== "https:" && url.protocol !== "http:") {
|
|
35
|
+
throw new LinkError("The web origin is http or https");
|
|
36
|
+
}
|
|
37
|
+
if (url.origin !== origin.replace(/\/$/, "") ||
|
|
38
|
+
url.username ||
|
|
39
|
+
url.password) {
|
|
40
|
+
throw new LinkError(`The web origin is a scheme and host only, like https://app.example: ${origin}`);
|
|
41
|
+
}
|
|
42
|
+
return url.origin;
|
|
43
|
+
}
|
|
44
|
+
export function encodeLink(link) {
|
|
45
|
+
checkFields(link);
|
|
46
|
+
const fragment = [
|
|
47
|
+
LINK_VERSION,
|
|
48
|
+
base64urlEncode(link.room),
|
|
49
|
+
base64urlEncode(link.staticPublicKey),
|
|
50
|
+
base64urlEncode(link.psk),
|
|
51
|
+
String(link.expiry),
|
|
52
|
+
].join(".");
|
|
53
|
+
return `${normalizeWebOrigin(link.webOrigin)}/#${fragment}`;
|
|
54
|
+
}
|
|
55
|
+
/** Parses a link. It does not check expiry: see {@link isLinkExpired}. */
|
|
56
|
+
export function parseLink(text) {
|
|
57
|
+
const hashIndex = text.indexOf("#");
|
|
58
|
+
if (hashIndex < 0) {
|
|
59
|
+
throw new LinkError("The link has no fragment");
|
|
60
|
+
}
|
|
61
|
+
const base = text.slice(0, hashIndex).replace(/\/$/, "");
|
|
62
|
+
const webOrigin = normalizeWebOrigin(base);
|
|
63
|
+
const parts = text.slice(hashIndex + 1).split(".");
|
|
64
|
+
if (parts.length !== 5 || parts[0] !== LINK_VERSION) {
|
|
65
|
+
throw new LinkError("Not a v1 link");
|
|
66
|
+
}
|
|
67
|
+
const [, room, staticPublicKey, psk, expiry] = parts;
|
|
68
|
+
if (!/^[1-9][0-9]{0,15}$/.test(expiry)) {
|
|
69
|
+
throw new LinkError("Invalid expiry");
|
|
70
|
+
}
|
|
71
|
+
const link = {
|
|
72
|
+
webOrigin,
|
|
73
|
+
room: decodeField(room, "room"),
|
|
74
|
+
staticPublicKey: decodeField(staticPublicKey, "static key"),
|
|
75
|
+
psk: decodeField(psk, "psk"),
|
|
76
|
+
expiry: Number(expiry),
|
|
77
|
+
};
|
|
78
|
+
checkFields(link);
|
|
79
|
+
return link;
|
|
80
|
+
}
|
|
81
|
+
export function isLinkExpired(link, nowMs = Date.now()) {
|
|
82
|
+
return nowMs >= link.expiry * 1000;
|
|
83
|
+
}
|
|
84
|
+
/** The room id as it appears in the relay URL: base64url, 22 characters. */
|
|
85
|
+
export function roomId(room) {
|
|
86
|
+
return base64urlEncode(room);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* The Noise prologue: `"acpantenna-relay/1" ‖ 0x00 ‖ room ‖ 0x00 ‖ web
|
|
90
|
+
* origin`, binding the handshake to this room and this web client.
|
|
91
|
+
*/
|
|
92
|
+
export function prologue(room, webOrigin) {
|
|
93
|
+
if (room.length !== ROOM_LENGTH) {
|
|
94
|
+
throw new LinkError("A room is 16 bytes");
|
|
95
|
+
}
|
|
96
|
+
return concatBytes(utf8Encode(PROLOGUE_LABEL), Uint8Array.of(0), room, Uint8Array.of(0), utf8Encode(normalizeWebOrigin(webOrigin)));
|
|
97
|
+
}
|
|
98
|
+
function decodeField(text, name) {
|
|
99
|
+
try {
|
|
100
|
+
return base64urlDecode(text);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
throw new LinkError(`Invalid ${name}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
function checkFields(link) {
|
|
107
|
+
if (link.room.length !== ROOM_LENGTH) {
|
|
108
|
+
throw new LinkError("A room is 16 bytes");
|
|
109
|
+
}
|
|
110
|
+
if (link.staticPublicKey.length !== KEY_LENGTH) {
|
|
111
|
+
throw new LinkError("A static key is 32 bytes");
|
|
112
|
+
}
|
|
113
|
+
if (link.psk.length !== KEY_LENGTH) {
|
|
114
|
+
throw new LinkError("A psk is 32 bytes");
|
|
115
|
+
}
|
|
116
|
+
if (!Number.isSafeInteger(link.expiry) || link.expiry <= 0) {
|
|
117
|
+
throw new LinkError("Invalid expiry");
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=link.js.map
|
package/dist/link.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link.js","sourceRoot":"","sources":["../src/link.ts"],"names":[],"mappings":"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"}
|
package/dist/noise.d.ts
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `Noise_NKpsk0_25519_ChaChaPoly_BLAKE2s` for pairing and
|
|
3
|
+
* `Noise_KK_25519_ChaChaPoly_BLAKE2s` for reconnecting, following the Noise
|
|
4
|
+
* Protocol Framework, revision 34 (https://noiseprotocol.org/noise.html): the
|
|
5
|
+
* CipherState, SymmetricState and HandshakeState objects of §5, with the
|
|
6
|
+
* `psk` modifier of §9 and `Rekey()` of §11.3.
|
|
7
|
+
*
|
|
8
|
+
* NKpsk0:
|
|
9
|
+
*
|
|
10
|
+
* <- s
|
|
11
|
+
* ...
|
|
12
|
+
* -> psk, e, es
|
|
13
|
+
* <- e, ee
|
|
14
|
+
*
|
|
15
|
+
* KK:
|
|
16
|
+
*
|
|
17
|
+
* -> s
|
|
18
|
+
* <- s
|
|
19
|
+
* ...
|
|
20
|
+
* -> e, es, ss
|
|
21
|
+
* <- e, ee, se
|
|
22
|
+
*/
|
|
23
|
+
export declare const PROTOCOL_NAME = "Noise_NKpsk0_25519_ChaChaPoly_BLAKE2s";
|
|
24
|
+
export declare const KK_PROTOCOL_NAME = "Noise_KK_25519_ChaChaPoly_BLAKE2s";
|
|
25
|
+
export declare const DHLEN = 32;
|
|
26
|
+
export declare const HASHLEN = 32;
|
|
27
|
+
export declare const KEYLEN = 32;
|
|
28
|
+
export declare const TAGLEN = 16;
|
|
29
|
+
/** The largest Noise message, in bytes (§3). */
|
|
30
|
+
export declare const MAX_MESSAGE_LENGTH = 65535;
|
|
31
|
+
/** A decryption failed, or a message could not be processed. Always fatal. */
|
|
32
|
+
export declare class NoiseError extends Error {
|
|
33
|
+
constructor(message: string);
|
|
34
|
+
}
|
|
35
|
+
export interface KeyPair {
|
|
36
|
+
publicKey: Uint8Array;
|
|
37
|
+
privateKey: Uint8Array;
|
|
38
|
+
}
|
|
39
|
+
/** Makes an X25519 key pair, from `privateKey` if given. */
|
|
40
|
+
export declare function generateKeyPair(privateKey?: Uint8Array): KeyPair;
|
|
41
|
+
/**
|
|
42
|
+
* A static key whose private half this code may never see: a browser keeps
|
|
43
|
+
* it as a non-extractable WebCrypto key, so its DH is asynchronous.
|
|
44
|
+
*/
|
|
45
|
+
export interface StaticKey {
|
|
46
|
+
publicKey: Uint8Array;
|
|
47
|
+
/** X25519 with `publicKey`; rejects (any error) for an invalid one. */
|
|
48
|
+
dh(publicKey: Uint8Array): Promise<Uint8Array>;
|
|
49
|
+
}
|
|
50
|
+
/** A {@link StaticKey} over a key pair held in memory. */
|
|
51
|
+
export declare function staticKey(keyPair: KeyPair): StaticKey;
|
|
52
|
+
/**
|
|
53
|
+
* A key and a nonce counter (§5.1). The counter is a JavaScript number, so it
|
|
54
|
+
* stops at 2^53 rather than 2^64 − 1; a session never gets near either.
|
|
55
|
+
*/
|
|
56
|
+
export declare class CipherState {
|
|
57
|
+
private key;
|
|
58
|
+
private nonce;
|
|
59
|
+
constructor(key?: Uint8Array);
|
|
60
|
+
initializeKey(key: Uint8Array): void;
|
|
61
|
+
hasKey(): boolean;
|
|
62
|
+
/** How many messages this state has encrypted or decrypted. */
|
|
63
|
+
get messages(): number;
|
|
64
|
+
encryptWithAd(ad: Uint8Array, plaintext: Uint8Array): Uint8Array;
|
|
65
|
+
/** Throws a {@link NoiseError} if the tag does not verify; the nonce is then unchanged. */
|
|
66
|
+
decryptWithAd(ad: Uint8Array, ciphertext: Uint8Array): Uint8Array;
|
|
67
|
+
/** §11.3: replaces the key with the first 32 bytes of ENCRYPT(k, 2^64 − 1, ε, zeros). */
|
|
68
|
+
rekey(): void;
|
|
69
|
+
private checkNonce;
|
|
70
|
+
}
|
|
71
|
+
/** The chaining key, the handshake hash and a CipherState (§5.2). */
|
|
72
|
+
export declare class SymmetricState {
|
|
73
|
+
readonly cipher: CipherState;
|
|
74
|
+
private chainingKey;
|
|
75
|
+
private h;
|
|
76
|
+
constructor(protocolName: string);
|
|
77
|
+
get handshakeHash(): Uint8Array;
|
|
78
|
+
mixKey(inputKeyMaterial: Uint8Array): void;
|
|
79
|
+
mixHash(data: Uint8Array): void;
|
|
80
|
+
mixKeyAndHash(inputKeyMaterial: Uint8Array): void;
|
|
81
|
+
encryptAndHash(plaintext: Uint8Array): Uint8Array;
|
|
82
|
+
decryptAndHash(ciphertext: Uint8Array): Uint8Array;
|
|
83
|
+
/** Returns the initiator's sending and receiving CipherStates, in that order. */
|
|
84
|
+
split(): [CipherState, CipherState];
|
|
85
|
+
}
|
|
86
|
+
export interface HandshakeOptions {
|
|
87
|
+
prologue: Uint8Array;
|
|
88
|
+
psk: Uint8Array;
|
|
89
|
+
/** Fixes the ephemeral key, for test vectors only. */
|
|
90
|
+
ephemeralPrivateKey?: Uint8Array;
|
|
91
|
+
}
|
|
92
|
+
export interface InitiatorHandshakeOptions extends HandshakeOptions {
|
|
93
|
+
/** The responder's static public key, known in advance (`<- s`). */
|
|
94
|
+
remoteStaticPublicKey: Uint8Array;
|
|
95
|
+
}
|
|
96
|
+
export interface ResponderHandshakeOptions extends HandshakeOptions {
|
|
97
|
+
staticKeyPair: KeyPair;
|
|
98
|
+
}
|
|
99
|
+
/** The result of a finished handshake. */
|
|
100
|
+
export interface HandshakeResult {
|
|
101
|
+
/** Encrypts what this side sends. */
|
|
102
|
+
send: CipherState;
|
|
103
|
+
/** Decrypts what this side receives. */
|
|
104
|
+
receive: CipherState;
|
|
105
|
+
/** The final handshake hash `h`. */
|
|
106
|
+
handshakeHash: Uint8Array;
|
|
107
|
+
/** The other side's ephemeral public key. */
|
|
108
|
+
remoteEphemeralPublicKey: Uint8Array;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* The NKpsk0 HandshakeState (§5.3), for one side. Call `writeMessage` and
|
|
112
|
+
* `readMessage` in turn: the initiator writes message 1 and reads message 2,
|
|
113
|
+
* the responder the other way round. After message 2 `result` is set.
|
|
114
|
+
*/
|
|
115
|
+
export declare class HandshakeState {
|
|
116
|
+
readonly initiator: boolean;
|
|
117
|
+
private readonly symmetric;
|
|
118
|
+
private readonly psk;
|
|
119
|
+
private readonly staticKeyPair;
|
|
120
|
+
private readonly remoteStatic;
|
|
121
|
+
private readonly fixedEphemeral;
|
|
122
|
+
private ephemeral;
|
|
123
|
+
private remoteEphemeral;
|
|
124
|
+
private step;
|
|
125
|
+
result: HandshakeResult | undefined;
|
|
126
|
+
private constructor();
|
|
127
|
+
static initiator(options: InitiatorHandshakeOptions): HandshakeState;
|
|
128
|
+
static responder(options: ResponderHandshakeOptions): HandshakeState;
|
|
129
|
+
get handshakeHash(): Uint8Array;
|
|
130
|
+
/** Writes the next handshake message, carrying `payload`. */
|
|
131
|
+
writeMessage(payload?: Uint8Array): Uint8Array;
|
|
132
|
+
/** Reads the next handshake message and returns its payload. */
|
|
133
|
+
readMessage(message: Uint8Array): Uint8Array;
|
|
134
|
+
private writeEphemeral;
|
|
135
|
+
private readEphemeral;
|
|
136
|
+
private ephemeralKeyPair;
|
|
137
|
+
private remoteEphemeralKey;
|
|
138
|
+
private staticKeys;
|
|
139
|
+
private finish;
|
|
140
|
+
private checkLength;
|
|
141
|
+
}
|
|
142
|
+
export interface KKHandshakeOptions {
|
|
143
|
+
prologue: Uint8Array;
|
|
144
|
+
/** This side's static key. */
|
|
145
|
+
staticKey: StaticKey;
|
|
146
|
+
/** The other side's static public key, known in advance. */
|
|
147
|
+
remoteStaticPublicKey: Uint8Array;
|
|
148
|
+
/** Fixes the ephemeral key, for test vectors only. */
|
|
149
|
+
ephemeralPrivateKey?: Uint8Array;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* The KK HandshakeState (§5.3), for one side: both static keys are known in
|
|
153
|
+
* advance, so it needs no psk. As with {@link HandshakeState}, the initiator
|
|
154
|
+
* writes message 1 and reads message 2. Its steps are asynchronous because a
|
|
155
|
+
* {@link StaticKey}'s DH is.
|
|
156
|
+
*/
|
|
157
|
+
export declare class KKHandshakeState {
|
|
158
|
+
readonly initiator: boolean;
|
|
159
|
+
private readonly symmetric;
|
|
160
|
+
private readonly staticKey;
|
|
161
|
+
private readonly remoteStatic;
|
|
162
|
+
private readonly fixedEphemeral;
|
|
163
|
+
private ephemeral;
|
|
164
|
+
private remoteEphemeral;
|
|
165
|
+
private step;
|
|
166
|
+
result: HandshakeResult | undefined;
|
|
167
|
+
private constructor();
|
|
168
|
+
static initiator(options: KKHandshakeOptions): KKHandshakeState;
|
|
169
|
+
static responder(options: KKHandshakeOptions): KKHandshakeState;
|
|
170
|
+
get handshakeHash(): Uint8Array;
|
|
171
|
+
/** Writes the next handshake message, carrying `payload`. */
|
|
172
|
+
writeMessage(payload?: Uint8Array): Promise<Uint8Array>;
|
|
173
|
+
/** Reads the next handshake message and returns its payload. */
|
|
174
|
+
readMessage(message: Uint8Array): Promise<Uint8Array>;
|
|
175
|
+
private writeEphemeral;
|
|
176
|
+
private readEphemeral;
|
|
177
|
+
private ephemeralKeyPair;
|
|
178
|
+
private remoteEphemeralKey;
|
|
179
|
+
private finish;
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=noise.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noise.d.ts","sourceRoot":"","sources":["../src/noise.ts"],"names":[],"mappings":"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"}
|