@uxnan/shared 0.0.7-alpha.20260719 → 0.0.8-alpha.20260720

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.
@@ -6,8 +6,29 @@
6
6
  *
7
7
  * Source: architecture/02a-system-architecture.md §5.9.1.
8
8
  */
9
- /** Secure transport protocol version negotiated in the handshake. */
10
- export declare const SECURE_PROTOCOL_VERSION = 1;
9
+ /**
10
+ * Secure transport protocol version negotiated in the handshake. Both sides
11
+ * reject a mismatch during `clientHello`/`serverHello`, so an incompatible pair
12
+ * fails fast and legibly instead of completing the handshake and then dropping
13
+ * every encrypted frame.
14
+ *
15
+ * **Bump this whenever the encrypted-frame format changes** (envelope shape,
16
+ * AAD layout, key derivation) — not just when the handshake JSON changes. The
17
+ * handshake is the only place the two sides can still talk, so it is the only
18
+ * place a version gap can be reported.
19
+ *
20
+ * - `1` — initial: AES-256-GCM over the envelope's ciphertext only.
21
+ * - `2` — `sessionId`/`seq`/direction bound as GCM AAD (`buildEnvelopeAad`).
22
+ */
23
+ export declare const SECURE_PROTOCOL_VERSION = 2;
24
+ /**
25
+ * AAD direction bytes for {@link SECURE_PROTOCOL_VERSION} ≥ 2. The session key
26
+ * is shared by both directions, so the direction is bound into the AAD to stop
27
+ * a frame being reflected back at its own sender as apparently-inbound traffic.
28
+ * Mirrored in the mobile `ProtocolConstants`.
29
+ */
30
+ export declare const ENVELOPE_DIRECTION_PHONE_TO_BRIDGE = 1;
31
+ export declare const ENVELOPE_DIRECTION_BRIDGE_TO_PHONE = 2;
11
32
  /** Version stamped into the pairing QR payload. */
12
33
  export declare const PAIRING_QR_VERSION = 2;
13
34
  /** HKDF `info` tag used when deriving the session key. */
@@ -6,8 +6,29 @@
6
6
  *
7
7
  * Source: architecture/02a-system-architecture.md §5.9.1.
8
8
  */
9
- /** Secure transport protocol version negotiated in the handshake. */
10
- export const SECURE_PROTOCOL_VERSION = 1;
9
+ /**
10
+ * Secure transport protocol version negotiated in the handshake. Both sides
11
+ * reject a mismatch during `clientHello`/`serverHello`, so an incompatible pair
12
+ * fails fast and legibly instead of completing the handshake and then dropping
13
+ * every encrypted frame.
14
+ *
15
+ * **Bump this whenever the encrypted-frame format changes** (envelope shape,
16
+ * AAD layout, key derivation) — not just when the handshake JSON changes. The
17
+ * handshake is the only place the two sides can still talk, so it is the only
18
+ * place a version gap can be reported.
19
+ *
20
+ * - `1` — initial: AES-256-GCM over the envelope's ciphertext only.
21
+ * - `2` — `sessionId`/`seq`/direction bound as GCM AAD (`buildEnvelopeAad`).
22
+ */
23
+ export const SECURE_PROTOCOL_VERSION = 2;
24
+ /**
25
+ * AAD direction bytes for {@link SECURE_PROTOCOL_VERSION} ≥ 2. The session key
26
+ * is shared by both directions, so the direction is bound into the AAD to stop
27
+ * a frame being reflected back at its own sender as apparently-inbound traffic.
28
+ * Mirrored in the mobile `ProtocolConstants`.
29
+ */
30
+ export const ENVELOPE_DIRECTION_PHONE_TO_BRIDGE = 0x01;
31
+ export const ENVELOPE_DIRECTION_BRIDGE_TO_PHONE = 0x02;
11
32
  /** Version stamped into the pairing QR payload. */
12
33
  export const PAIRING_QR_VERSION = 2;
13
34
  /** HKDF `info` tag used when deriving the session key. */
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,qEAAqE;AACrE,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAEzC,mDAAmD;AACnD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAEpC,0DAA0D;AAC1D,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAE7C,0EAA0E;AAC1E,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAE1C,mEAAmE;AACnE,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAE9C,gEAAgE;AAChE,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAEhD,uEAAuE;AACvE,MAAM,CAAC,MAAM,4BAA4B,GAAG,GAAG,CAAC;AAEhD,6EAA6E;AAC7E,MAAM,CAAC,MAAM,yBAAyB,GAAG,UAAU,CAAC;AAEpD,8BAA8B;AAC9B,MAAM,CAAC,MAAM,iBAAiB,GAAG,sBAAsB,CAAC;AAExD,yDAAyD;AACzD,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAEtC,wCAAwC;AACxC,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kCAAkC,GAAG,IAAI,CAAC;AACvD,MAAM,CAAC,MAAM,kCAAkC,GAAG,IAAI,CAAC;AAEvD,mDAAmD;AACnD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAEpC,0DAA0D;AAC1D,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAE7C,0EAA0E;AAC1E,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAE1C,mEAAmE;AACnE,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAE9C,gEAAgE;AAChE,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAEhD,uEAAuE;AACvE,MAAM,CAAC,MAAM,4BAA4B,GAAG,GAAG,CAAC;AAEhD,6EAA6E;AAC7E,MAAM,CAAC,MAAM,yBAAyB,GAAG,UAAU,CAAC;AAEpD,8BAA8B;AAC9B,MAAM,CAAC,MAAM,iBAAiB,GAAG,sBAAsB,CAAC;AAExD,yDAAyD;AACzD,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAEtC,wCAAwC;AACxC,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAC"}
@@ -5,8 +5,24 @@
5
5
  */
6
6
  export interface SecureEnvelope {
7
7
  kind: 'encryptedEnvelope';
8
+ /**
9
+ * Session this envelope belongs to. Travels in the clear (the receiver needs
10
+ * it before it can look up a key) and is therefore bound as GCM AAD — see
11
+ * {@link seq}.
12
+ */
8
13
  sessionId: string;
9
- /** Monotonic sequence number (replay protection). */
14
+ /**
15
+ * Monotonic sequence number (replay protection). Like `sessionId` it is
16
+ * visible on the wire, so from `SECURE_PROTOCOL_VERSION` 2 both are bound —
17
+ * together with a direction byte — as the AES-GCM **AAD**:
18
+ *
19
+ * AAD = utf8(sessionId) || 0x00 || u64_be(seq) || 0x00 || direction
20
+ *
21
+ * so tampering with either field fails the tag instead of silently passing an
22
+ * unauthenticated `seq <= lastApplied` check. Both implementations must build
23
+ * this byte-for-byte identically (`buildEnvelopeAad` on each side); see
24
+ * architecture/02a §5.9.1.
25
+ */
10
26
  seq: number;
11
27
  /** Per-message random nonce (hex, 12 bytes). */
12
28
  nonce: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@uxnan/shared",
3
- "version": "0.0.7-alpha.20260719",
3
+ "version": "0.0.8-alpha.20260720",
4
4
  "description": "Shared JSON-RPC and E2EE contracts for the Uxnan ecosystem (bridge, relay, mobile).",
5
5
  "license": "MPL-2.0",
6
6
  "author": "Luis Donaldo Gamas Vazquez",