@airterm/protocol 0.3.0 → 0.4.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/README.md CHANGED
@@ -47,3 +47,11 @@ handoff two seconds. Ambiguous handoffs require a fresh relay pairing.
47
47
  Output acknowledgements refer to contiguous PTY byte offsets consumed by the
48
48
  terminal renderer, not merely received by the socket. Never acknowledge across
49
49
  a gap, reuse a cipher after failure, or replay uncertain terminal input.
50
+
51
+ ## Account encryption envelopes (0.4 prerelease)
52
+
53
+ The vault and pairing exports are additive application envelopes; terminal protocol v1 framing is unchanged. Vaults use RSA-OAEP-3072/SHA-256, AES-256-GCM, and context-bound HKDF. Version 1 fixes passphrase Argon2id parameters at 64 MiB, three iterations, one lane, 16-byte salt, and 32-byte output; browser derivation lives in the application worker. Unknown fields, algorithms, versions, sizes, or substituted account/session context must fail closed.
54
+
55
+ Exactly one primary vault wrapper and one user-held recovery wrapper are supported. The pairing encryption secret is distinct from the polling credential and never reaches the server. These primitives do not authenticate a downloaded browser application or provide an independent cryptographic audit.
56
+
57
+ The backend pins a reproducible prerelease tarball until separately authorized registry publication. Publish the protocol before any CLI release that depends on it; do not relabel a prerelease artifact as an already published version.
package/dist/index.d.ts CHANGED
@@ -1,19 +1,23 @@
1
1
  export declare const PROTOCOL_VERSION: 1;
2
- export { decodeInnerFrame, decodeOuterFrame, encodeInnerFrame, encodeOuterFrame, INNER_HEADER_BYTES, InnerFrameType, MAX_CIPHERTEXT_BYTES, OuterFrameKind, outerAssociatedData, } from './framing.js';
3
- export type { InnerFrame, OuterFrame } from './framing.js';
4
- export { createNoisePrologue, MAX_TRANSPORT_FRAMES, NOISE_PROTOCOL_NAME, NoiseTransport, } from './noise.js';
5
- export type { NoiseTransportOptions } from './noise.js';
6
- export { decodeProtocolError, decodePtyExit, decodePtyResize, decodeReplayStart, decodeSessionDescription, encodeProtocolError, encodePtyExit, encodePtyResize, encodeReplayStart, encodeSessionDescription, } from './messages.js';
7
- export type { ProtocolErrorMessage, PtyExitMessage, ReplayStartMessage, SessionDescription, SessionMode, TerminalDescription, TerminalFontDescription, TerminalFontFormat, SessionFeature, } from './messages.js';
8
- export { decodeTransferCancel, decodeTransferChunk, decodeTransferControl, decodeTransferOffer, decodeTransferRequest, decodeTransferResult, encodeTransferCancel, encodeTransferChunk, encodeTransferControl, encodeTransferOffer, encodeTransferRequest, encodeTransferResult, generateTransferId, hasTransferTimedOut, TRANSFER_CHUNK_BYTES, TRANSFER_IDLE_TIMEOUT_MS, TRANSFER_ID_BYTES, TRANSFER_WINDOW_BYTES, TransferReceiverState, TransferSenderState, } from './transfers.js';
9
- export type { TransferCancelMessage, TransferChunkPayload, TransferControlMessage, TransferDirection, TransferOfferMessage, TransferPurpose, TransferRequestMessage, TransferResultMessage, } from './transfers.js';
10
- export { createCapabilityUrl, decodeBase64Url, deriveCapabilityKeys, encodeBase64Url, generateCapabilityMaterial, normalizeServerUrl, parseCapabilityUrl, ROOT_SECRET_LENGTH, SESSION_ID_LENGTH, } from './capability.js';
11
- export type { CapabilityKeys, CapabilityMaterial, ParsedCapability, } from './capability.js';
12
- export * from './transport.js';
13
- export * from './outbound-queue.js';
14
- export * from './p2p.js';
15
- export * from './webrtc-transport.js';
16
- export * from './direct-negotiation.js';
17
- export * from './transport-handoff.js';
18
- export * from './peer-transport.js';
2
+ export { decodeInnerFrame, decodeOuterFrame, encodeInnerFrame, encodeOuterFrame, INNER_HEADER_BYTES, InnerFrameType, MAX_CIPHERTEXT_BYTES, OuterFrameKind, outerAssociatedData, } from "./framing.js";
3
+ export type { InnerFrame, OuterFrame } from "./framing.js";
4
+ export { createNoisePrologue, MAX_TRANSPORT_FRAMES, NOISE_PROTOCOL_NAME, NoiseTransport, } from "./noise.js";
5
+ export type { NoiseTransportOptions } from "./noise.js";
6
+ export { decodeProtocolError, decodePtyExit, decodePtyResize, decodeReplayStart, decodeSessionDescription, encodeProtocolError, encodePtyExit, encodePtyResize, encodeReplayStart, encodeSessionDescription, } from "./messages.js";
7
+ export type { ProtocolErrorMessage, PtyExitMessage, ReplayStartMessage, SessionDescription, SessionMode, TerminalDescription, TerminalFontDescription, TerminalFontFormat, SessionFeature, } from "./messages.js";
8
+ export { decodeTransferCancel, decodeTransferChunk, decodeTransferControl, decodeTransferOffer, decodeTransferRequest, decodeTransferResult, encodeTransferCancel, encodeTransferChunk, encodeTransferControl, encodeTransferOffer, encodeTransferRequest, encodeTransferResult, generateTransferId, hasTransferTimedOut, TRANSFER_CHUNK_BYTES, TRANSFER_IDLE_TIMEOUT_MS, TRANSFER_ID_BYTES, TRANSFER_WINDOW_BYTES, TransferReceiverState, TransferSenderState, } from "./transfers.js";
9
+ export type { TransferCancelMessage, TransferChunkPayload, TransferControlMessage, TransferDirection, TransferOfferMessage, TransferPurpose, TransferRequestMessage, TransferResultMessage, } from "./transfers.js";
10
+ export { createCapabilityUrl, decodeBase64Url, deriveCapabilityKeys, encodeBase64Url, generateCapabilityMaterial, normalizeServerUrl, parseCapabilityUrl, ROOT_SECRET_LENGTH, SESSION_ID_LENGTH, } from "./capability.js";
11
+ export type { CapabilityKeys, CapabilityMaterial, ParsedCapability, } from "./capability.js";
12
+ export * from "./transport.js";
13
+ export * from "./outbound-queue.js";
14
+ export * from "./p2p.js";
15
+ export * from "./webrtc-transport.js";
16
+ export * from "./direct-negotiation.js";
17
+ export * from "./transport-handoff.js";
18
+ export * from "./peer-transport.js";
19
+ export * from "./vault.js";
20
+ export * from './pairing.js';
21
+ export * from './naming.js';
22
+ export { decodeRelayUsage, isRelayCoordination, type RelayUsage } from './relay-usage.js';
19
23
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,EAAG,CAAU,CAAC;AAC3C,OAAO,EACH,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,mBAAmB,GACtB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EACH,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,GACjB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EACH,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,wBAAwB,GAC3B,MAAM,eAAe,CAAC;AACvB,YAAY,EACR,oBAAoB,EACpB,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,WAAW,EACX,mBAAmB,EACnB,uBAAuB,EACvB,kBAAkB,EAClB,cAAc,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EACH,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,EACxB,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,GACtB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACR,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,qBAAqB,GACxB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACH,mBAAmB,EACnB,eAAe,EACf,oBAAoB,EACpB,eAAe,EACf,0BAA0B,EAC1B,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,GACpB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACR,cAAc,EACd,kBAAkB,EAClB,gBAAgB,GACnB,MAAM,iBAAiB,CAAC;AAEzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,UAAU,CAAC;AACzB,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,EAAG,CAAU,CAAC;AAC3C,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,oBAAoB,EACpB,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,WAAW,EACX,mBAAmB,EACnB,uBAAuB,EACvB,kBAAkB,EAClB,cAAc,GACf,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,EACxB,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,oBAAoB,EACpB,eAAe,EACf,0BAA0B,EAC1B,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,cAAc,EACd,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AAEzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,UAAU,CAAC;AACzB,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AAEpC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAE5B,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/index.js CHANGED
@@ -1,14 +1,18 @@
1
1
  export const PROTOCOL_VERSION = 1;
2
- export { decodeInnerFrame, decodeOuterFrame, encodeInnerFrame, encodeOuterFrame, INNER_HEADER_BYTES, InnerFrameType, MAX_CIPHERTEXT_BYTES, OuterFrameKind, outerAssociatedData, } from './framing.js';
3
- export { createNoisePrologue, MAX_TRANSPORT_FRAMES, NOISE_PROTOCOL_NAME, NoiseTransport, } from './noise.js';
4
- export { decodeProtocolError, decodePtyExit, decodePtyResize, decodeReplayStart, decodeSessionDescription, encodeProtocolError, encodePtyExit, encodePtyResize, encodeReplayStart, encodeSessionDescription, } from './messages.js';
5
- export { decodeTransferCancel, decodeTransferChunk, decodeTransferControl, decodeTransferOffer, decodeTransferRequest, decodeTransferResult, encodeTransferCancel, encodeTransferChunk, encodeTransferControl, encodeTransferOffer, encodeTransferRequest, encodeTransferResult, generateTransferId, hasTransferTimedOut, TRANSFER_CHUNK_BYTES, TRANSFER_IDLE_TIMEOUT_MS, TRANSFER_ID_BYTES, TRANSFER_WINDOW_BYTES, TransferReceiverState, TransferSenderState, } from './transfers.js';
6
- export { createCapabilityUrl, decodeBase64Url, deriveCapabilityKeys, encodeBase64Url, generateCapabilityMaterial, normalizeServerUrl, parseCapabilityUrl, ROOT_SECRET_LENGTH, SESSION_ID_LENGTH, } from './capability.js';
7
- export * from './transport.js';
8
- export * from './outbound-queue.js';
9
- export * from './p2p.js';
10
- export * from './webrtc-transport.js';
11
- export * from './direct-negotiation.js';
12
- export * from './transport-handoff.js';
13
- export * from './peer-transport.js';
2
+ export { decodeInnerFrame, decodeOuterFrame, encodeInnerFrame, encodeOuterFrame, INNER_HEADER_BYTES, InnerFrameType, MAX_CIPHERTEXT_BYTES, OuterFrameKind, outerAssociatedData, } from "./framing.js";
3
+ export { createNoisePrologue, MAX_TRANSPORT_FRAMES, NOISE_PROTOCOL_NAME, NoiseTransport, } from "./noise.js";
4
+ export { decodeProtocolError, decodePtyExit, decodePtyResize, decodeReplayStart, decodeSessionDescription, encodeProtocolError, encodePtyExit, encodePtyResize, encodeReplayStart, encodeSessionDescription, } from "./messages.js";
5
+ export { decodeTransferCancel, decodeTransferChunk, decodeTransferControl, decodeTransferOffer, decodeTransferRequest, decodeTransferResult, encodeTransferCancel, encodeTransferChunk, encodeTransferControl, encodeTransferOffer, encodeTransferRequest, encodeTransferResult, generateTransferId, hasTransferTimedOut, TRANSFER_CHUNK_BYTES, TRANSFER_IDLE_TIMEOUT_MS, TRANSFER_ID_BYTES, TRANSFER_WINDOW_BYTES, TransferReceiverState, TransferSenderState, } from "./transfers.js";
6
+ export { createCapabilityUrl, decodeBase64Url, deriveCapabilityKeys, encodeBase64Url, generateCapabilityMaterial, normalizeServerUrl, parseCapabilityUrl, ROOT_SECRET_LENGTH, SESSION_ID_LENGTH, } from "./capability.js";
7
+ export * from "./transport.js";
8
+ export * from "./outbound-queue.js";
9
+ export * from "./p2p.js";
10
+ export * from "./webrtc-transport.js";
11
+ export * from "./direct-negotiation.js";
12
+ export * from "./transport-handoff.js";
13
+ export * from "./peer-transport.js";
14
+ export * from "./vault.js";
15
+ export * from './pairing.js';
16
+ export * from './naming.js';
17
+ export { decodeRelayUsage, isRelayCoordination } from './relay-usage.js';
14
18
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAU,CAAC;AAC3C,OAAO,EACH,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,mBAAmB,GACtB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACH,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,GACjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACH,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,wBAAwB,GAC3B,MAAM,eAAe,CAAC;AAYvB,OAAO,EACH,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,EACxB,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,GACtB,MAAM,gBAAgB,CAAC;AAWxB,OAAO,EACH,mBAAmB,EACnB,eAAe,EACf,oBAAoB,EACpB,eAAe,EACf,0BAA0B,EAC1B,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,GACpB,MAAM,iBAAiB,CAAC;AAOzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,UAAU,CAAC;AACzB,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAU,CAAC;AAC3C,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,mBAAmB,GACpB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,eAAe,CAAC;AAYvB,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,EACxB,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AAWxB,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,oBAAoB,EACpB,eAAe,EACf,0BAA0B,EAC1B,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AAOzB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,UAAU,CAAC;AACzB,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AAEpC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAE5B,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAmB,MAAM,kBAAkB,CAAC"}
@@ -15,6 +15,8 @@ export interface TerminalDescription {
15
15
  nextOffset: bigint;
16
16
  }
17
17
  export interface SessionDescription {
18
+ uploadLimitBytes?: number;
19
+ name?: string;
18
20
  mode: SessionMode;
19
21
  maxTabs: number;
20
22
  terminals: TerminalDescription[];
@@ -1 +1 @@
1
- {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC;AAC9C,MAAM,MAAM,cAAc,GACpB,oBAAoB,GACpB,kBAAkB,GAClB,gBAAgB,GAChB,QAAQ,CAAC;AAEf,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;AAElE,MAAM,WAAW,uBAAuB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IAC/B,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;IAC5B,IAAI,CAAC,EAAE,uBAAuB,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,wBAAwB,CACpC,WAAW,EAAE,kBAAkB,GAChC,UAAU,CAuBZ;AAED,wBAAgB,wBAAwB,CACpC,OAAO,EAAE,UAAU,GACpB,kBAAkB,CAwBpB;AA4DD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAWzE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,UAAU,GAAG;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CAChB,CAkBA;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,UAAU,CAKjE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,UAAU,GAAG,cAAc,CAiBjE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,UAAU,CAMzE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,UAAU,GAAG,kBAAkB,CAgBzE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,oBAAoB,GAAG,UAAU,CAE3E;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,UAAU,GAAG,oBAAoB,CAQ7E"}
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC;AAC9C,MAAM,MAAM,cAAc,GACpB,oBAAoB,GACpB,kBAAkB,GAClB,gBAAgB,GAChB,QAAQ,CAAC;AAEf,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;AAElE,MAAM,WAAW,uBAAuB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IAC/B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,mBAAmB,EAAE,CAAC;IACjC,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;IAC5B,IAAI,CAAC,EAAE,uBAAuB,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,wBAAwB,CACpC,WAAW,EAAE,kBAAkB,GAChC,UAAU,CAyBZ;AAED,wBAAgB,wBAAwB,CACpC,OAAO,EAAE,UAAU,GACpB,kBAAkB,CA4BpB;AA4DD,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAWzE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,UAAU,GAAG;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CAChB,CAkBA;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,UAAU,CAKjE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,UAAU,GAAG,cAAc,CAiBjE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,UAAU,CAMzE;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,UAAU,GAAG,kBAAkB,CAgBzE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,oBAAoB,GAAG,UAAU,CAE3E;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,UAAU,GAAG,oBAAoB,CAQ7E"}
package/dist/messages.js CHANGED
@@ -1,5 +1,8 @@
1
+ import { automaticName } from './naming.js';
1
2
  export function encodeSessionDescription(description) {
2
3
  return encodeJson({
4
+ ...(description.name === undefined ? {} : { name: description.name }),
5
+ ...(description.uploadLimitBytes === undefined ? {} : { upload_limit_bytes: description.uploadLimitBytes }),
3
6
  mode: description.mode,
4
7
  max_tabs: description.maxTabs,
5
8
  features: description.features ?? [],
@@ -29,9 +32,15 @@ export function decodeSessionDescription(payload) {
29
32
  !Array.isArray(value.terminals)) {
30
33
  throw new Error('Invalid session description payload.');
31
34
  }
35
+ if (value.upload_limit_bytes !== undefined && (!Number.isSafeInteger(value.upload_limit_bytes) || value.upload_limit_bytes <= 0))
36
+ throw new Error('Invalid upload limit.');
32
37
  const features = decodeSessionFeatures(value.features);
33
38
  const font = value.font === undefined ? undefined : decodeTerminalFont(value.font);
39
+ if (value.name !== undefined && (typeof value.name !== 'string' || automaticName(value.name) !== value.name))
40
+ throw new Error('Invalid session name');
34
41
  return {
42
+ ...(value.name === undefined ? {} : { name: value.name }),
43
+ ...(value.upload_limit_bytes === undefined ? {} : { uploadLimitBytes: value.upload_limit_bytes }),
35
44
  mode: value.mode,
36
45
  maxTabs: value.max_tabs,
37
46
  terminals: value.terminals.map((terminal) => decodeTerminalDescription(terminal)),
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { VaultContext } from './vault.js';
2
+ export interface SessionNames {
3
+ defaultName: string;
4
+ alias?: string;
5
+ tabs: Record<string, string>;
6
+ }
7
+ export interface NamingEnvelope extends VaultContext {
8
+ version: 1;
9
+ sessionId: string;
10
+ wrappedKey: string;
11
+ nonce: string;
12
+ ciphertext: string;
13
+ }
14
+ export declare function customName(value: string): string;
15
+ export declare function automaticName(value: string): string | undefined;
16
+ export declare function validateSessionNames(value: unknown): SessionNames;
17
+ export declare function encryptSessionNames(publicKey: string, identity: VaultContext, sessionId: string, names: SessionNames): Promise<NamingEnvelope>;
18
+ export declare function decryptSessionNames(privateKey: CryptoKey, identity: VaultContext, sessionId: string, envelope: NamingEnvelope): Promise<SessionNames>;
19
+ //# sourceMappingURL=naming.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naming.d.ts","sourceRoot":"","sources":["../src/naming.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,WAAW,YAAY;IAAG,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE;AACnG,MAAM,WAAW,cAAe,SAAQ,YAAY;IAAG,OAAO,EAAE,CAAC,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE;AAG7I,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIhD;AACD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG/D;AAaD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CAWjE;AACD,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAgBpJ;AACD,wBAAsB,mBAAmB,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC,CAU3J"}
package/dist/naming.js ADDED
@@ -0,0 +1,85 @@
1
+ import { decodeBase64Url, encodeBase64Url } from './capability.js';
2
+ const encoder = new TextEncoder();
3
+ const forbidden = /[\p{Cc}\p{Cf}]/u;
4
+ export function customName(value) {
5
+ const name = value.trim();
6
+ if (!name || [...name].length > 80 || forbidden.test(value))
7
+ throw new Error('Use 1–80 characters without control characters.');
8
+ return name;
9
+ }
10
+ export function automaticName(value) {
11
+ if (!value.trim() || forbidden.test(value))
12
+ return undefined;
13
+ return [...value].slice(0, 160).join('');
14
+ }
15
+ function canonical(value, length) {
16
+ if (typeof value !== 'string' || value.length > 22000)
17
+ throw new Error('Invalid naming encoding');
18
+ const bytes = decodeBase64Url(value);
19
+ if (encodeBase64Url(bytes) !== value || length !== undefined && bytes.length !== length)
20
+ throw new Error('Invalid naming encoding');
21
+ return bytes;
22
+ }
23
+ function buffer(value) { return value.slice().buffer; }
24
+ function context(identity, sessionId) {
25
+ if (!/^[1-9][0-9]{0,18}$/.test(identity.accountId) || !Number.isSafeInteger(identity.generation) || identity.generation < 1)
26
+ throw new Error('Invalid naming identity');
27
+ canonical(sessionId, 16);
28
+ return encoder.encode(JSON.stringify(['airterm-names', 1, identity.accountId, identity.generation, sessionId]));
29
+ }
30
+ export function validateSessionNames(value) {
31
+ if (!value || typeof value !== 'object' || Array.isArray(value))
32
+ throw new Error('Invalid names');
33
+ const doc = value;
34
+ if (Object.keys(doc).some(key => !['defaultName', 'alias', 'tabs'].includes(key)) || typeof doc.defaultName !== 'string' || automaticName(doc.defaultName) !== doc.defaultName || !doc.tabs || typeof doc.tabs !== 'object' || Array.isArray(doc.tabs))
35
+ throw new Error('Invalid names');
36
+ if (doc.alias !== undefined && (typeof doc.alias !== 'string' || customName(doc.alias) !== doc.alias))
37
+ throw new Error('Invalid alias');
38
+ const tabs = {};
39
+ for (const [id, title] of Object.entries(doc.tabs)) {
40
+ if (!/^[1-9][0-9]{0,4}$/.test(id) || Number(id) > 65535 || typeof title !== 'string' || customName(title) !== title)
41
+ throw new Error('Invalid tab alias');
42
+ tabs[id] = title;
43
+ }
44
+ return { defaultName: doc.defaultName, ...(doc.alias === undefined ? {} : { alias: doc.alias }), tabs };
45
+ }
46
+ export async function encryptSessionNames(publicKey, identity, sessionId, names) {
47
+ const data = encoder.encode(JSON.stringify(validateSessionNames(names)));
48
+ if (data.length > 11000)
49
+ throw new Error('Naming document is too large');
50
+ const aad = buffer(context(identity, sessionId));
51
+ const raw = crypto.getRandomValues(new Uint8Array(32));
52
+ try {
53
+ const key = await crypto.subtle.importKey('raw', buffer(raw), 'AES-GCM', false, ['encrypt']);
54
+ const rsa = await crypto.subtle.importKey('spki', buffer(canonical(publicKey)), { name: 'RSA-OAEP', hash: 'SHA-256' }, false, ['encrypt']);
55
+ if (rsa.algorithm.modulusLength !== 3072)
56
+ throw new Error('Invalid public key');
57
+ const nonce = crypto.getRandomValues(new Uint8Array(12));
58
+ const envelope = { version: 1, accountId: identity.accountId, generation: identity.generation, sessionId,
59
+ wrappedKey: encodeBase64Url(new Uint8Array(await crypto.subtle.encrypt({ name: 'RSA-OAEP', label: aad }, rsa, buffer(raw)))),
60
+ nonce: encodeBase64Url(nonce), ciphertext: encodeBase64Url(new Uint8Array(await crypto.subtle.encrypt({ name: 'AES-GCM', iv: buffer(nonce), additionalData: aad }, key, buffer(data)))) };
61
+ if (encoder.encode(JSON.stringify(envelope)).length > 16384)
62
+ throw new Error('Naming document is too large');
63
+ return envelope;
64
+ }
65
+ finally {
66
+ raw.fill(0);
67
+ }
68
+ }
69
+ export async function decryptSessionNames(privateKey, identity, sessionId, envelope) {
70
+ if (!envelope || encoder.encode(JSON.stringify(envelope)).length > 16384 || Object.keys(envelope).sort().join(',') !== 'accountId,ciphertext,generation,nonce,sessionId,version,wrappedKey' || envelope.version !== 1 || envelope.accountId !== identity.accountId || envelope.generation !== identity.generation || envelope.sessionId !== sessionId)
71
+ throw new Error('Invalid naming envelope');
72
+ const aad = buffer(context(identity, sessionId));
73
+ const raw = new Uint8Array(await crypto.subtle.decrypt({ name: 'RSA-OAEP', label: aad }, privateKey, buffer(canonical(envelope.wrappedKey, 384))));
74
+ try {
75
+ if (raw.length !== 32)
76
+ throw new Error('Invalid naming key');
77
+ const key = await crypto.subtle.importKey('raw', buffer(raw), 'AES-GCM', false, ['decrypt']);
78
+ const data = await crypto.subtle.decrypt({ name: 'AES-GCM', iv: buffer(canonical(envelope.nonce, 12)), additionalData: aad }, key, buffer(canonical(envelope.ciphertext)));
79
+ return validateSessionNames(JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(data)));
80
+ }
81
+ finally {
82
+ raw.fill(0);
83
+ }
84
+ }
85
+ //# sourceMappingURL=naming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naming.js","sourceRoot":"","sources":["../src/naming.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,7 @@ export declare class OutboundQueue {
11
11
  constructor(bufferedAmount: () => number, write: (frame: InnerFrame, done: (error?: Error | null) => void) => void, onBackpressure: (paused: boolean) => void, onFailure: (error: Error) => void);
12
12
  get pendingBytes(): number;
13
13
  send(frame: InnerFrame): Promise<void>;
14
+ discard(predicate: (frame: InnerFrame) => boolean): void;
14
15
  close(error?: Error): void;
15
16
  }
16
17
  //# sourceMappingURL=outbound-queue.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"outbound-queue.d.ts","sourceRoot":"","sources":["../src/outbound-queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAEnE,eAAO,MAAM,uBAAuB,QAAc,CAAC;AACnD,eAAO,MAAM,sBAAsB,QAAa,CAAC;AACjD,eAAO,MAAM,wBAAwB,QAAgB,CAAC;AAUtD,qBAAa,aAAa;;IAYlB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK;IAItB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS;gBANT,cAAc,EAAE,MAAM,MAAM,EAC5B,KAAK,EAAE,CACpB,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,KACnC,IAAI,EACQ,cAAc,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,EACzC,SAAS,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI;IAGtD,IAAW,YAAY,IAAI,MAAM,CAIhC;IAEM,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBtC,KAAK,CAAC,KAAK,QAA0C,GAAG,IAAI;CAqFtE"}
1
+ {"version":3,"file":"outbound-queue.d.ts","sourceRoot":"","sources":["../src/outbound-queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAEnE,eAAO,MAAM,uBAAuB,QAAc,CAAC;AACnD,eAAO,MAAM,sBAAsB,QAAa,CAAC;AACjD,eAAO,MAAM,wBAAwB,QAAgB,CAAC;AAUtD,qBAAa,aAAa;;IAYlB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK;IAItB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS;gBANT,cAAc,EAAE,MAAM,MAAM,EAC5B,KAAK,EAAE,CACpB,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,KACnC,IAAI,EACQ,cAAc,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,EACzC,SAAS,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI;IAGtD,IAAW,YAAY,IAAI,MAAM,CAIhC;IAEM,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBtC,OAAO,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,GAAG,IAAI;IAWxD,KAAK,CAAC,KAAK,QAA0C,GAAG,IAAI;CAqFtE"}
@@ -50,6 +50,17 @@ export class OutboundQueue {
50
50
  this.#pump();
51
51
  return pending;
52
52
  }
53
+ discard(predicate) {
54
+ for (let index = this.#queue.length - 1; index >= 0; index--) {
55
+ const item = this.#queue[index];
56
+ if (!predicate(item.frame))
57
+ continue;
58
+ this.#queue.splice(index, 1);
59
+ this.#bytes -= item.bytes;
60
+ item.reject(new Error('Relay traffic paused by usage policy.'));
61
+ }
62
+ this.#updatePressure();
63
+ }
53
64
  close(error = new Error('Gateway transport changed.')) {
54
65
  if (this.#closed)
55
66
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"outbound-queue.js","sourceRoot":"","sources":["../src/outbound-queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAmB,MAAM,cAAc,CAAC;AAEnE,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,GAAG,KAAK,CAAC;AACnD,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,GAAG,KAAK,CAAC;AACjD,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,GAAG,KAAK,CAAC;AACtD,MAAM,oBAAoB,GAAG,kBAAkB,GAAG,EAAE,CAAC;AASrD,MAAM,OAAO,aAAa;IAYD;IACA;IAIA;IACA;IAjBZ,MAAM,GAAmB,EAAE,CAAC;IACrC,MAAM,GAAG,CAAC,CAAC;IACX,SAAS,CAA2B;IACpC,MAAM,CAA4C;IAClD,OAAO,GAAG,KAAK,CAAC;IAChB,OAAO,GAAG,KAAK,CAAC;IAChB,QAAQ,GAAG,KAAK,CAAC;IACjB,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,aAAa,GAAG,CAAC,CAAC;IAElB,YACqB,cAA4B,EAC5B,KAGR,EACQ,cAAyC,EACzC,SAAiC;QANjC,mBAAc,GAAd,cAAc,CAAc;QAC5B,UAAK,GAAL,KAAK,CAGb;QACQ,mBAAc,GAAd,cAAc,CAA2B;QACzC,cAAS,GAAT,SAAS,CAAwB;IACnD,CAAC;IAEJ,IAAW,YAAY;QACnB,OAAO,CACH,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,CACrE,CAAC;IACN,CAAC;IAEM,IAAI,CAAC,KAAiB;QACzB,IAAI,IAAI,CAAC,OAAO;YACZ,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;QACxE,IAAI,IAAI,CAAC,YAAY,KAAK,CAAC;YAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,GAAG,oBAAoB,CAAC;QAC9D,IAAI,IAAI,CAAC,YAAY,GAAG,KAAK,GAAG,wBAAwB,EAAE,CAAC;YACvD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;YACpE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAClB,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAClD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACb,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;gBAC5D,KAAK;gBACL,OAAO;gBACP,MAAM;aACT,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;QACzB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,OAAO,OAAO,CAAC;IACnB,CAAC;IAEM,KAAK,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,4BAA4B,CAAC;QACxD,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7D,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAChB,IAAI,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACzB,CAAC;IAED,KAAK;QACD,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC;YACD,OACI,CAAC,IAAI,CAAC,OAAO;gBACb,IAAI,CAAC,SAAS,KAAK,SAAS;gBAC5B,IAAI,CAAC,cAAc,EAAE,GAAG,uBAAuB,EACjD,CAAC;gBACC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjC,IAAI,IAAI,KAAK,SAAS;oBAAE,MAAM;gBAC9B,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC;gBAC1B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBACtB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;oBAC7B,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI;wBAAE,OAAO;oBACpD,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;wBAChB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;wBAClB,OAAO;oBACX,CAAC;oBACD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;oBAC3B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;oBAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;oBACf,IAAI,CAAC,eAAe,EAAE,CAAC;oBACvB,IAAI,CAAC,KAAK,EAAE,CAAC;gBACjB,CAAC,CAAC,CAAC;YACP,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,CACN,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAC5D,CAAC;QACN,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IACI,CAAC,IAAI,CAAC,OAAO;YACb,IAAI,CAAC,YAAY,GAAG,CAAC;YACrB,IAAI,CAAC,MAAM,KAAK,SAAS,EAC3B,CAAC;YACC,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC1B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;gBACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;gBACvC,IAAI,QAAQ,GAAG,IAAI,CAAC,aAAa;oBAC7B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAClC,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC;gBAC9B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,IAAI,MAAM,EAAE,CAAC;oBAC1C,IAAI,CAAC,KAAK,CACN,IAAI,KAAK,CAAC,wCAAwC,CAAC,CACtD,CAAC;gBACN,CAAC;qBAAM,CAAC;oBACJ,IAAI,CAAC,KAAK,EAAE,CAAC;gBACjB,CAAC;YACL,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,CAAC;IACL,CAAC;IAED,eAAe;QACX,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO;YACvB,CAAC,CAAC,IAAI,CAAC,YAAY,IAAI,sBAAsB;YAC7C,CAAC,CAAC,IAAI,CAAC,YAAY,IAAI,uBAAuB,CAAC;QACnD,IAAI,MAAM,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;YAC1B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;YACtB,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,KAAK,CAAC;YAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,KAAY;QACd,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAClB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;CACJ"}
1
+ {"version":3,"file":"outbound-queue.js","sourceRoot":"","sources":["../src/outbound-queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAmB,MAAM,cAAc,CAAC;AAEnE,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,GAAG,KAAK,CAAC;AACnD,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,GAAG,KAAK,CAAC;AACjD,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,GAAG,KAAK,CAAC;AACtD,MAAM,oBAAoB,GAAG,kBAAkB,GAAG,EAAE,CAAC;AASrD,MAAM,OAAO,aAAa;IAYD;IACA;IAIA;IACA;IAjBZ,MAAM,GAAmB,EAAE,CAAC;IACrC,MAAM,GAAG,CAAC,CAAC;IACX,SAAS,CAA2B;IACpC,MAAM,CAA4C;IAClD,OAAO,GAAG,KAAK,CAAC;IAChB,OAAO,GAAG,KAAK,CAAC;IAChB,QAAQ,GAAG,KAAK,CAAC;IACjB,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,aAAa,GAAG,CAAC,CAAC;IAElB,YACqB,cAA4B,EAC5B,KAGR,EACQ,cAAyC,EACzC,SAAiC;QANjC,mBAAc,GAAd,cAAc,CAAc;QAC5B,UAAK,GAAL,KAAK,CAGb;QACQ,mBAAc,GAAd,cAAc,CAA2B;QACzC,cAAS,GAAT,SAAS,CAAwB;IACnD,CAAC;IAEJ,IAAW,YAAY;QACnB,OAAO,CACH,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,CACrE,CAAC;IACN,CAAC;IAEM,IAAI,CAAC,KAAiB;QACzB,IAAI,IAAI,CAAC,OAAO;YACZ,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;QACxE,IAAI,IAAI,CAAC,YAAY,KAAK,CAAC;YAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,GAAG,oBAAoB,CAAC;QAC9D,IAAI,IAAI,CAAC,YAAY,GAAG,KAAK,GAAG,wBAAwB,EAAE,CAAC;YACvD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;YACpE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAClB,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAClD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;gBACb,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;gBAC5D,KAAK;gBACL,OAAO;gBACP,MAAM;aACT,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;QACzB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,OAAO,OAAO,CAAC;IACnB,CAAC;IAEM,OAAO,CAAC,SAAyC;QACpD,KAAK,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;YAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAE,CAAC;YACjC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAE,SAAS;YACrC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC7B,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,CAAC,eAAe,EAAE,CAAC;IAC3B,CAAC;IAEM,KAAK,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,4BAA4B,CAAC;QACxD,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7D,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAChB,IAAI,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACzB,CAAC;IAED,KAAK;QACD,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1C,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC;YACD,OACI,CAAC,IAAI,CAAC,OAAO;gBACb,IAAI,CAAC,SAAS,KAAK,SAAS;gBAC5B,IAAI,CAAC,cAAc,EAAE,GAAG,uBAAuB,EACjD,CAAC;gBACC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACjC,IAAI,IAAI,KAAK,SAAS;oBAAE,MAAM;gBAC9B,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC;gBAC1B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBACtB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;oBAC7B,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI;wBAAE,OAAO;oBACpD,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;wBAChB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;wBAClB,OAAO;oBACX,CAAC;oBACD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;oBAC3B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;oBAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;oBACf,IAAI,CAAC,eAAe,EAAE,CAAC;oBACvB,IAAI,CAAC,KAAK,EAAE,CAAC;gBACjB,CAAC,CAAC,CAAC;YACP,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,CACN,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAC5D,CAAC;QACN,CAAC;gBAAS,CAAC;YACP,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IACI,CAAC,IAAI,CAAC,OAAO;YACb,IAAI,CAAC,YAAY,GAAG,CAAC;YACrB,IAAI,CAAC,MAAM,KAAK,SAAS,EAC3B,CAAC;YACC,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC1B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;gBACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;gBACvC,IAAI,QAAQ,GAAG,IAAI,CAAC,aAAa;oBAC7B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAClC,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC;gBAC9B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,IAAI,MAAM,EAAE,CAAC;oBAC1C,IAAI,CAAC,KAAK,CACN,IAAI,KAAK,CAAC,wCAAwC,CAAC,CACtD,CAAC;gBACN,CAAC;qBAAM,CAAC;oBACJ,IAAI,CAAC,KAAK,EAAE,CAAC;gBACjB,CAAC;YACL,CAAC,EAAE,EAAE,CAAC,CAAC;QACX,CAAC;IACL,CAAC;IAED,eAAe;QACX,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO;YACvB,CAAC,CAAC,IAAI,CAAC,YAAY,IAAI,sBAAsB;YAC7C,CAAC,CAAC,IAAI,CAAC,YAAY,IAAI,uBAAuB,CAAC;QACnD,IAAI,MAAM,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;YAC1B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;YACtB,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,KAAK,CAAC;YAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,KAAY;QACd,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAClB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;CACJ"}
@@ -0,0 +1,18 @@
1
+ import { type SealedValue } from './vault.js';
2
+ export interface PairingApproval {
3
+ version: 1;
4
+ pairingId: string;
5
+ accountId: string;
6
+ email: string;
7
+ generation: number;
8
+ publicKey: string;
9
+ fingerprint: string;
10
+ token: string;
11
+ }
12
+ export interface EncryptedPairing extends SealedValue {
13
+ version: 1;
14
+ }
15
+ export declare function validatePairingApproval(value: PairingApproval, pairingId: string): Promise<void>;
16
+ export declare function encryptPairingApproval(value: PairingApproval, secret: Uint8Array): Promise<EncryptedPairing>;
17
+ export declare function decryptPairingApproval(value: EncryptedPairing, secret: Uint8Array, pairingId: string): Promise<PairingApproval>;
18
+ //# sourceMappingURL=pairing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pairing.d.ts","sourceRoot":"","sources":["../src/pairing.ts"],"names":[],"mappings":"AACA,OAAO,EAA0C,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAEtF,MAAM,WAAW,eAAe;IAC5B,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACjB;AACD,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IAAG,OAAO,EAAE,CAAC,CAAA;CAAE;AAYpE,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAItG;AACD,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAOlH;AACD,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAUrI"}
@@ -0,0 +1,48 @@
1
+ import { decodeBase64Url, encodeBase64Url } from './capability.js';
2
+ import { publicKeyFingerprint, randomVaultBytes } from './vault.js';
3
+ const bytes = (value) => new Uint8Array(value).buffer;
4
+ function decode(value, size) {
5
+ const result = decodeBase64Url(value);
6
+ if (result.length !== size || encodeBase64Url(result) !== value)
7
+ throw new Error('Invalid pairing value');
8
+ return result;
9
+ }
10
+ async function key(secret, pairingId) {
11
+ if (secret.length !== 32)
12
+ throw new Error('Invalid pairing secret');
13
+ const source = await crypto.subtle.importKey('raw', bytes(secret), 'HKDF', false, ['deriveKey']);
14
+ return crypto.subtle.deriveKey({ name: 'HKDF', hash: 'SHA-256', salt: bytes(decode(pairingId, 16)), info: new TextEncoder().encode('airterm/pairing/v1/approval') }, source, { name: 'AES-GCM', length: 256 }, false, ['encrypt', 'decrypt']);
15
+ }
16
+ export async function validatePairingApproval(value, pairingId) {
17
+ if (!value || value.version !== 1 || value.pairingId !== pairingId || !/^[1-9][0-9]{0,18}$/.test(value.accountId) || !Number.isSafeInteger(value.generation) || value.generation < 1 || typeof value.email !== 'string' || value.email.length > 254 || !/^[^\s@\x00-\x1f\x7f]+@[^\s@\x00-\x1f\x7f]+$/.test(value.email))
18
+ throw new Error('Invalid pairing identity');
19
+ decode(value.token, 32);
20
+ if (await publicKeyFingerprint(value.publicKey) !== value.fingerprint)
21
+ throw new Error('Invalid public key fingerprint');
22
+ }
23
+ export async function encryptPairingApproval(value, secret) {
24
+ await validatePairingApproval(value, value.pairingId);
25
+ const nonce = randomVaultBytes(12);
26
+ const data = new TextEncoder().encode(JSON.stringify(value));
27
+ if (data.length > 4096)
28
+ throw new Error('Oversized pairing approval');
29
+ const ciphertext = await crypto.subtle.encrypt({ name: 'AES-GCM', iv: bytes(nonce), additionalData: new TextEncoder().encode(value.pairingId) }, await key(secret, value.pairingId), bytes(data));
30
+ return { version: 1, nonce: encodeBase64Url(nonce), ciphertext: encodeBase64Url(new Uint8Array(ciphertext)) };
31
+ }
32
+ export async function decryptPairingApproval(value, secret, pairingId) {
33
+ if (!value || value.version !== 1 || typeof value.ciphertext !== 'string' || value.ciphertext.length > 5500)
34
+ throw new Error('Invalid pairing envelope');
35
+ const ciphertext = decodeBase64Url(value.ciphertext);
36
+ if (encodeBase64Url(ciphertext) !== value.ciphertext)
37
+ throw new Error('Invalid pairing encoding');
38
+ const raw = new Uint8Array(await crypto.subtle.decrypt({ name: 'AES-GCM', iv: bytes(decode(value.nonce, 12)), additionalData: new TextEncoder().encode(pairingId) }, await key(secret, pairingId), bytes(ciphertext)));
39
+ try {
40
+ const result = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(raw));
41
+ await validatePairingApproval(result, pairingId);
42
+ return result;
43
+ }
44
+ finally {
45
+ raw.fill(0);
46
+ }
47
+ }
48
+ //# sourceMappingURL=pairing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pairing.js","sourceRoot":"","sources":["../src/pairing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { InnerFrameType } from './framing.js';
2
+ export interface RelayUsage {
3
+ usedBytes: number;
4
+ limitBytes: number;
5
+ resetsAt: string;
6
+ restricted: boolean;
7
+ blocked: boolean;
8
+ retryAt: number;
9
+ requiresPairing?: boolean;
10
+ }
11
+ export declare function decodeRelayUsage(value: Record<string, unknown>): RelayUsage;
12
+ export declare function isRelayCoordination(type: InnerFrameType): boolean;
13
+ //# sourceMappingURL=relay-usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-usage.d.ts","sourceRoot":"","sources":["../src/relay-usage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,MAAM,WAAW,UAAU;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC7B;AACD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,CAQ3E;AACD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAIjE"}
@@ -0,0 +1,18 @@
1
+ import { InnerFrameType } from './framing.js';
2
+ export function decodeRelayUsage(value) {
3
+ if (!Number.isSafeInteger(value.usedBytes) || value.usedBytes < 0 ||
4
+ !Number.isSafeInteger(value.limitBytes) || value.limitBytes <= 0 ||
5
+ typeof value.resetsAt !== 'string' || !Number.isFinite(Date.parse(value.resetsAt)) ||
6
+ typeof value.restricted !== 'boolean' || typeof value.blocked !== 'boolean' ||
7
+ !Number.isSafeInteger(value.retryAt) || value.retryAt <= 0)
8
+ throw new Error('Invalid relay usage state.');
9
+ if (value.requiresPairing !== undefined && typeof value.requiresPairing !== 'boolean')
10
+ throw new Error('Invalid pairing recovery flag.');
11
+ return { ...(value.requiresPairing === undefined ? {} : { requiresPairing: value.requiresPairing }), usedBytes: value.usedBytes, limitBytes: value.limitBytes, resetsAt: value.resetsAt, restricted: value.restricted, blocked: value.blocked, retryAt: value.retryAt };
12
+ }
13
+ export function isRelayCoordination(type) {
14
+ return [InnerFrameType.SessionDescription, InnerFrameType.SessionClose, InnerFrameType.P2PControl,
15
+ InnerFrameType.OutputAck, InnerFrameType.RecoveryComplete, InnerFrameType.TransferCancel,
16
+ InnerFrameType.ProtocolError, InnerFrameType.PtyExit].includes(type);
17
+ }
18
+ //# sourceMappingURL=relay-usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-usage.js","sourceRoot":"","sources":["../src/relay-usage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAU9C,MAAM,UAAU,gBAAgB,CAAC,KAA8B;IAC3D,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,IAAK,KAAK,CAAC,SAAoB,GAAG,CAAC;QACzE,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,IAAK,KAAK,CAAC,UAAqB,IAAI,CAAC;QAC5E,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAClF,OAAO,KAAK,CAAC,UAAU,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,SAAS;QAC3E,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,IAAK,KAAK,CAAC,OAAkB,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAC1H,IAAI,KAAK,CAAC,eAAe,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,eAAe,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACzI,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,eAA0B,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAmB,EAAE,UAAU,EAAE,KAAK,CAAC,UAAoB,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAiB,EAAE,CAAC;AACrT,CAAC;AACD,MAAM,UAAU,mBAAmB,CAAC,IAAoB;IACpD,OAAO,CAAC,cAAc,CAAC,kBAAkB,EAAE,cAAc,CAAC,YAAY,EAAE,cAAc,CAAC,UAAU;QAC7F,cAAc,CAAC,SAAS,EAAE,cAAc,CAAC,gBAAgB,EAAE,cAAc,CAAC,cAAc;QACxF,cAAc,CAAC,aAAa,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC7E,CAAC"}
@@ -32,6 +32,7 @@ export declare class EncryptedConnection {
32
32
  get pendingBytes(): number;
33
33
  start(): void;
34
34
  receive(bytes: Uint8Array): void;
35
+ allowFrames(predicate: (frame: InnerFrame) => boolean): void;
35
36
  send(frame: InnerFrame): Promise<void>;
36
37
  close(): void;
37
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,KAAK,UAAU,EAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAkB,KAAK,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAGxE,mFAAmF;AACnF,MAAM,WAAW,eAAe;IAC5B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;IACrE,KAAK,IAAI,IAAI,CAAC;CACjB;AAED,qBAAa,kBAAmB,YAAW,eAAe;IAElD,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAFJ,QAAQ,EAAE,MAAM,MAAM,EACtB,IAAI,EAAE,eAAe,CAAC,OAAO,CAAC,EAC9B,IAAI,EAAE,MAAM,IAAI;IAErC,IAAW,cAAc,IAAI,MAAM,CAElC;IACM,KAAK,CACR,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,GACrC,IAAI;IAGA,KAAK,IAAI,IAAI;CAGvB;AAED,MAAM,WAAW,yBAAyB;IACtC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACtC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,SAAS,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACrC;AAED,iFAAiF;AACjF,qBAAa,mBAAmB;;IAKxB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAFN,SAAS,EAAE,eAAe,EAC1B,OAAO,EAAE,qBAAqB,EAC9B,MAAM,EAAE,yBAAyB;IAiBtD,IAAW,QAAQ,IAAI,OAAO,CAE7B;IACD,IAAW,YAAY,IAAI,MAAM,CAEhC;IACM,KAAK,IAAI,IAAI;IAGb,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAUhC,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAOtC,KAAK,IAAI,IAAI;CAavB"}
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,KAAK,UAAU,EAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAkB,KAAK,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAGxE,mFAAmF;AACnF,MAAM,WAAW,eAAe;IAC5B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;IACrE,KAAK,IAAI,IAAI,CAAC;CACjB;AAED,qBAAa,kBAAmB,YAAW,eAAe;IAElD,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAFJ,QAAQ,EAAE,MAAM,MAAM,EACtB,IAAI,EAAE,eAAe,CAAC,OAAO,CAAC,EAC9B,IAAI,EAAE,MAAM,IAAI;IAErC,IAAW,cAAc,IAAI,MAAM,CAElC;IACM,KAAK,CACR,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,KAAK,IAAI,GACrC,IAAI;IAGA,KAAK,IAAI,IAAI;CAGvB;AAED,MAAM,WAAW,yBAAyB;IACtC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACtC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,SAAS,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACrC;AAED,iFAAiF;AACjF,qBAAa,mBAAmB;;IAMxB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAFN,SAAS,EAAE,eAAe,EAC1B,OAAO,EAAE,qBAAqB,EAC9B,MAAM,EAAE,yBAAyB;IAiBtD,IAAW,QAAQ,IAAI,OAAO,CAE7B;IACD,IAAW,YAAY,IAAI,MAAM,CAEhC;IACM,KAAK,IAAI,IAAI;IAGb,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAUhC,WAAW,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,GAAG,IAAI;IAI5D,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtC,KAAK,IAAI,IAAI;CAavB"}
package/dist/transport.js CHANGED
@@ -28,6 +28,7 @@ export class EncryptedConnection {
28
28
  #noise;
29
29
  #queue;
30
30
  #closed = false;
31
+ #allowed = () => true;
31
32
  constructor(transport, options, events) {
32
33
  this.transport = transport;
33
34
  this.options = options;
@@ -62,7 +63,13 @@ export class EncryptedConnection {
62
63
  this.events.onFrame?.(decodeInnerFrame(this.#noise.decrypt(bytes)));
63
64
  }
64
65
  }
66
+ allowFrames(predicate) {
67
+ this.#allowed = predicate;
68
+ this.#queue.discard((frame) => !predicate(frame));
69
+ }
65
70
  send(frame) {
71
+ if (!this.#allowed(frame))
72
+ return Promise.reject(new Error('Monthly relay allowance exhausted.'));
66
73
  if (!this.complete)
67
74
  return Promise.reject(new Error('Encrypted transport is not ready.'));
68
75
  return this.#queue.send(frame);
@@ -1 +1 @@
1
- {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ export declare const VAULT_VERSION = 1;
2
+ export declare const VAULT_PRF_INPUT: Uint8Array<ArrayBuffer>;
3
+ export interface VaultContext {
4
+ accountId: string;
5
+ generation: number;
6
+ }
7
+ export interface SealedValue {
8
+ nonce: string;
9
+ ciphertext: string;
10
+ }
11
+ export interface VaultEnvelope extends VaultContext {
12
+ version: 1;
13
+ publicKey: string;
14
+ privateKey: SealedValue;
15
+ primary: SealedValue & {
16
+ mode: "passphrase" | "passkey";
17
+ salt: string;
18
+ credentialId?: string;
19
+ };
20
+ recovery: SealedValue & {
21
+ salt: string;
22
+ };
23
+ }
24
+ export interface SessionEnvelope extends VaultContext {
25
+ version: 1;
26
+ ciphertext: string;
27
+ }
28
+ export declare const randomVaultBytes: (length?: number) => Uint8Array;
29
+ export declare function vaultKdf(secret: Uint8Array, salt: string, identity: VaultContext, purpose: string): Promise<Uint8Array>;
30
+ export declare function sealVaultValue(data: Uint8Array, secret: Uint8Array, identity: VaultContext, purpose: string): Promise<SealedValue>;
31
+ export declare function openVaultValue(value: SealedValue, secret: Uint8Array, identity: VaultContext, purpose: string): Promise<Uint8Array>;
32
+ export declare function createRecoveryCode(): Promise<string>;
33
+ export declare function decodeRecoveryCode(code: string): Promise<Uint8Array>;
34
+ export declare function validateVaultEnvelope(value: unknown): asserts value is VaultEnvelope;
35
+ export declare function publicKeyFingerprint(publicKey: string): Promise<string>;
36
+ export declare function createVault(identity: VaultContext, primary: {
37
+ mode: "passphrase" | "passkey";
38
+ salt: string;
39
+ credentialId?: string;
40
+ }, wrappingKey: Uint8Array, recoveryCode: string): Promise<{
41
+ envelope: VaultEnvelope;
42
+ vaultKey: Uint8Array;
43
+ privateKey: CryptoKey;
44
+ }>;
45
+ export declare function unlockVault(envelope: VaultEnvelope, wrappingKey: Uint8Array, recovery?: boolean): Promise<{
46
+ vaultKey: Uint8Array;
47
+ privateKey: CryptoKey;
48
+ }>;
49
+ export declare function encryptAccountSession(publicKey: string, identity: VaultContext, sessionId: string, rootSecret: string): Promise<SessionEnvelope>;
50
+ export declare function decryptAccountSession(privateKey: CryptoKey, envelope: SessionEnvelope, identity: VaultContext, sessionId: string): Promise<string>;
51
+ //# sourceMappingURL=vault.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../src/vault.ts"],"names":[],"mappings":"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"}
package/dist/vault.js ADDED
@@ -0,0 +1,215 @@
1
+ import { decodeBase64Url, encodeBase64Url } from "./capability.js";
2
+ export const VAULT_VERSION = 1;
3
+ export const VAULT_PRF_INPUT = new TextEncoder().encode("airterm/vault/v1/passkey");
4
+ const encoder = new TextEncoder();
5
+ const decoder = new TextDecoder("utf-8", { fatal: true });
6
+ const bytes = (data) => new Uint8Array(data).buffer;
7
+ export const randomVaultBytes = (length = 32) => crypto.getRandomValues(new Uint8Array(length));
8
+ function context(context, purpose) {
9
+ if (!/^[1-9][0-9]{0,18}$/.test(context.accountId) ||
10
+ !Number.isSafeInteger(context.generation) ||
11
+ context.generation < 1)
12
+ throw new Error("Invalid vault identity");
13
+ return encoder.encode(JSON.stringify([
14
+ "airterm-vault",
15
+ 1,
16
+ context.accountId,
17
+ context.generation,
18
+ purpose,
19
+ ]));
20
+ }
21
+ function decode(value, minimum, maximum = minimum) {
22
+ if (typeof value !== "string" ||
23
+ value.length > Math.ceil((maximum * 4) / 3) ||
24
+ !/^[A-Za-z0-9_-]+$/.test(value))
25
+ throw new Error("Invalid vault encoding");
26
+ const result = decodeBase64Url(value);
27
+ if (result.length < minimum ||
28
+ result.length > maximum ||
29
+ encodeBase64Url(result) !== value)
30
+ throw new Error("Invalid vault size");
31
+ return result;
32
+ }
33
+ export async function vaultKdf(secret, salt, identity, purpose) {
34
+ if (secret.length !== 32)
35
+ throw new Error("Invalid key material");
36
+ const key = await crypto.subtle.importKey("raw", bytes(secret), "HKDF", false, ["deriveBits"]);
37
+ return new Uint8Array(await crypto.subtle.deriveBits({
38
+ name: "HKDF",
39
+ hash: "SHA-256",
40
+ salt: bytes(decode(salt, 16)),
41
+ info: bytes(context(identity, purpose)),
42
+ }, key, 256));
43
+ }
44
+ export async function sealVaultValue(data, secret, identity, purpose) {
45
+ if (secret.length !== 32 || data.length > 4096)
46
+ throw new Error("Invalid vault value");
47
+ const nonce = randomVaultBytes(12);
48
+ const key = await crypto.subtle.importKey("raw", bytes(secret), "AES-GCM", false, ["encrypt"]);
49
+ return {
50
+ nonce: encodeBase64Url(nonce),
51
+ ciphertext: encodeBase64Url(new Uint8Array(await crypto.subtle.encrypt({
52
+ name: "AES-GCM",
53
+ iv: bytes(nonce),
54
+ additionalData: bytes(context(identity, purpose)),
55
+ tagLength: 128,
56
+ }, key, bytes(data)))),
57
+ };
58
+ }
59
+ export async function openVaultValue(value, secret, identity, purpose) {
60
+ if (secret.length !== 32)
61
+ throw new Error("Invalid vault key");
62
+ const key = await crypto.subtle.importKey("raw", bytes(secret), "AES-GCM", false, ["decrypt"]);
63
+ return new Uint8Array(await crypto.subtle.decrypt({
64
+ name: "AES-GCM",
65
+ iv: bytes(decode(value.nonce, 12)),
66
+ additionalData: bytes(context(identity, purpose)),
67
+ tagLength: 128,
68
+ }, key, bytes(decode(value.ciphertext, 16, 4112))));
69
+ }
70
+ export async function createRecoveryCode() {
71
+ const secret = randomVaultBytes();
72
+ const checksum = new Uint8Array(await crypto.subtle.digest("SHA-256", bytes(secret))).slice(0, 4);
73
+ return `airterm-recovery-v1.${encodeBase64Url(secret)}.${encodeBase64Url(checksum)}`;
74
+ }
75
+ export async function decodeRecoveryCode(code) {
76
+ const parts = code.split(".");
77
+ if (parts.length !== 3 || parts[0] !== "airterm-recovery-v1")
78
+ throw new Error("Invalid recovery key");
79
+ const secret = decode(parts[1], 32);
80
+ const checksum = new Uint8Array(await crypto.subtle.digest("SHA-256", bytes(secret))).slice(0, 4);
81
+ if (encodeBase64Url(checksum) !== parts[2])
82
+ throw new Error("Invalid recovery key checksum");
83
+ return secret;
84
+ }
85
+ function fields(value, allowed) {
86
+ if (!value || typeof value !== 'object' || Array.isArray(value) || Object.keys(value).some(key => !allowed.includes(key)))
87
+ throw new Error('Unsupported vault fields');
88
+ }
89
+ export function validateVaultEnvelope(value) {
90
+ if (value === null || typeof value !== "object")
91
+ throw new Error("Invalid vault");
92
+ fields(value, ['version', 'accountId', 'generation', 'publicKey', 'privateKey', 'primary', 'recovery']);
93
+ const v = value;
94
+ fields(v.primary, ['mode', 'salt', 'credentialId', 'nonce', 'ciphertext']);
95
+ fields(v.recovery, ['salt', 'nonce', 'ciphertext']);
96
+ fields(v.privateKey, ['nonce', 'ciphertext']);
97
+ if (v.version !== 1)
98
+ throw new Error("Unsupported vault version");
99
+ context(v, "validate");
100
+ decode(v.publicKey, 422, 422);
101
+ if (!v.primary || !["passkey", "passphrase"].includes(v.primary.mode))
102
+ throw new Error("Invalid vault unlock method");
103
+ if (v.primary.mode === "passkey")
104
+ decode(v.primary.credentialId, 1, 1024);
105
+ else if (v.primary.credentialId !== undefined)
106
+ throw new Error("Unexpected passphrase credential");
107
+ for (const wrapper of [v.primary, v.recovery]) {
108
+ decode(wrapper.salt, 16);
109
+ decode(wrapper.nonce, 12);
110
+ decode(wrapper.ciphertext, 48);
111
+ }
112
+ decode(v.privateKey.nonce, 12);
113
+ decode(v.privateKey.ciphertext, 1000, 4112);
114
+ }
115
+ export async function publicKeyFingerprint(publicKey) {
116
+ return encodeBase64Url(new Uint8Array(await crypto.subtle.digest("SHA-256", bytes(decode(publicKey, 422)))));
117
+ }
118
+ async function importPublic(publicKey) {
119
+ const key = await crypto.subtle.importKey("spki", bytes(decode(publicKey, 422)), { name: "RSA-OAEP", hash: "SHA-256" }, false, ["encrypt"]);
120
+ const algorithm = key.algorithm;
121
+ if (algorithm.modulusLength !== 3072 ||
122
+ encodeBase64Url(algorithm.publicExponent) !== "AQAB")
123
+ throw new Error("Unsupported public key");
124
+ return key;
125
+ }
126
+ export async function createVault(identity, primary, wrappingKey, recoveryCode) {
127
+ context(identity, "create");
128
+ const keys = await crypto.subtle.generateKey({
129
+ name: "RSA-OAEP",
130
+ modulusLength: 3072,
131
+ publicExponent: new Uint8Array([1, 0, 1]),
132
+ hash: "SHA-256",
133
+ }, true, ["encrypt", "decrypt"]);
134
+ const vaultKey = randomVaultBytes();
135
+ const rawPrivate = new Uint8Array(await crypto.subtle.exportKey("pkcs8", keys.privateKey));
136
+ const recoverySalt = encodeBase64Url(randomVaultBytes(16));
137
+ const recoveryKey = await vaultKdf(await decodeRecoveryCode(recoveryCode), recoverySalt, identity, "recovery");
138
+ const envelope = {
139
+ version: 1,
140
+ accountId: identity.accountId,
141
+ generation: identity.generation,
142
+ publicKey: encodeBase64Url(new Uint8Array(await crypto.subtle.exportKey("spki", keys.publicKey))),
143
+ privateKey: await sealVaultValue(rawPrivate, vaultKey, identity, "private-key"),
144
+ primary: {
145
+ ...primary,
146
+ ...(await sealVaultValue(vaultKey, wrappingKey, identity, `primary:${primary.mode}:${primary.credentialId ?? ""}`)),
147
+ },
148
+ recovery: {
149
+ salt: recoverySalt,
150
+ ...(await sealVaultValue(vaultKey, recoveryKey, identity, "recovery")),
151
+ },
152
+ };
153
+ const privateKey = await crypto.subtle.importKey('pkcs8', bytes(rawPrivate), { name: 'RSA-OAEP', hash: 'SHA-256' }, false, ['decrypt']);
154
+ rawPrivate.fill(0);
155
+ recoveryKey.fill(0);
156
+ validateVaultEnvelope(envelope);
157
+ return { envelope, vaultKey, privateKey };
158
+ }
159
+ export async function unlockVault(envelope, wrappingKey, recovery = false) {
160
+ validateVaultEnvelope(envelope);
161
+ const primary = envelope.primary;
162
+ const vaultKey = await openVaultValue(recovery ? envelope.recovery : primary, wrappingKey, envelope, recovery
163
+ ? "recovery"
164
+ : `primary:${primary.mode}:${primary.credentialId ?? ""}`);
165
+ const raw = await openVaultValue(envelope.privateKey, vaultKey, envelope, "private-key");
166
+ try {
167
+ const privateKey = await crypto.subtle.importKey("pkcs8", bytes(raw), { name: "RSA-OAEP", hash: "SHA-256" }, false, ["decrypt"]);
168
+ const challenge = randomVaultBytes();
169
+ const encrypted = await crypto.subtle.encrypt({ name: "RSA-OAEP" }, await importPublic(envelope.publicKey), bytes(challenge));
170
+ const opened = new Uint8Array(await crypto.subtle.decrypt({ name: "RSA-OAEP" }, privateKey, encrypted));
171
+ if (encodeBase64Url(challenge) !== encodeBase64Url(opened))
172
+ throw new Error("Vault key mismatch");
173
+ return { vaultKey, privateKey };
174
+ }
175
+ finally {
176
+ raw.fill(0);
177
+ }
178
+ }
179
+ export async function encryptAccountSession(publicKey, identity, sessionId, rootSecret) {
180
+ decode(sessionId, 16);
181
+ decode(rootSecret, 32);
182
+ const payload = encoder.encode(JSON.stringify([
183
+ 1,
184
+ identity.accountId,
185
+ identity.generation,
186
+ sessionId,
187
+ rootSecret,
188
+ ]));
189
+ return {
190
+ version: 1,
191
+ accountId: identity.accountId,
192
+ generation: identity.generation,
193
+ ciphertext: encodeBase64Url(new Uint8Array(await crypto.subtle.encrypt({ name: "RSA-OAEP", label: bytes(context(identity, "session")) }, await importPublic(publicKey), bytes(payload)))),
194
+ };
195
+ }
196
+ export async function decryptAccountSession(privateKey, envelope, identity, sessionId) {
197
+ fields(envelope, ['version', 'accountId', 'generation', 'ciphertext']);
198
+ if (envelope.version !== 1 ||
199
+ envelope.accountId !== identity.accountId ||
200
+ envelope.generation !== identity.generation)
201
+ throw new Error("Session vault mismatch");
202
+ const raw = await crypto.subtle.decrypt({ name: "RSA-OAEP", label: bytes(context(identity, "session")) }, privateKey, bytes(decode(envelope.ciphertext, 384)));
203
+ const payload = JSON.parse(decoder.decode(raw));
204
+ if (!Array.isArray(payload) ||
205
+ payload.length !== 5 ||
206
+ payload[0] !== 1 ||
207
+ payload[1] !== identity.accountId ||
208
+ payload[2] !== identity.generation ||
209
+ payload[3] !== sessionId ||
210
+ typeof payload[4] !== "string")
211
+ throw new Error("Invalid session identity");
212
+ decode(payload[4], 32);
213
+ return payload[4];
214
+ }
215
+ //# sourceMappingURL=vault.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault.js","sourceRoot":"","sources":["../src/vault.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@airterm/protocol",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Shared browser and Node.js protocol implementation for AirTerm",
5
5
  "keywords": [
6
6
  "terminal",