@stvor/sdk 2.4.0 → 3.0.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.
Files changed (82) hide show
  1. package/dist/facade/app.cjs +29 -0
  2. package/dist/facade/app.d.ts +83 -76
  3. package/dist/facade/app.js +330 -195
  4. package/dist/facade/crypto-session.cjs +29 -0
  5. package/dist/facade/crypto-session.d.ts +49 -54
  6. package/dist/facade/crypto-session.js +117 -140
  7. package/dist/facade/errors.cjs +29 -0
  8. package/dist/facade/errors.d.ts +29 -12
  9. package/dist/facade/errors.js +49 -8
  10. package/dist/facade/index.cjs +29 -0
  11. package/dist/facade/index.d.ts +27 -8
  12. package/dist/facade/index.js +23 -3
  13. package/dist/facade/local-storage-identity-store.cjs +29 -0
  14. package/dist/facade/local-storage-identity-store.d.ts +50 -0
  15. package/dist/facade/local-storage-identity-store.js +100 -0
  16. package/dist/facade/metrics-attestation.cjs +29 -0
  17. package/dist/facade/metrics-attestation.d.ts +209 -0
  18. package/dist/facade/metrics-attestation.js +333 -0
  19. package/dist/facade/metrics-engine.cjs +29 -0
  20. package/dist/facade/metrics-engine.d.ts +91 -0
  21. package/dist/facade/metrics-engine.js +170 -0
  22. package/dist/facade/redis-replay-cache.cjs +29 -0
  23. package/dist/facade/redis-replay-cache.d.ts +88 -0
  24. package/dist/facade/redis-replay-cache.js +60 -0
  25. package/dist/facade/relay-client.cjs +29 -0
  26. package/dist/facade/relay-client.d.ts +22 -23
  27. package/dist/facade/relay-client.js +107 -128
  28. package/dist/facade/replay-manager.cjs +29 -0
  29. package/dist/facade/replay-manager.d.ts +28 -35
  30. package/dist/facade/replay-manager.js +102 -69
  31. package/dist/facade/sodium-singleton.cjs +29 -0
  32. package/dist/facade/tofu-manager.cjs +29 -0
  33. package/dist/facade/tofu-manager.d.ts +38 -36
  34. package/dist/facade/tofu-manager.js +109 -77
  35. package/dist/facade/types.cjs +29 -0
  36. package/dist/facade/types.d.ts +2 -0
  37. package/dist/index.cjs +29 -0
  38. package/dist/index.d.cts +6 -0
  39. package/dist/index.d.ts +4 -0
  40. package/dist/index.js +7 -0
  41. package/dist/legacy.cjs +29 -0
  42. package/dist/legacy.d.ts +31 -1
  43. package/dist/legacy.js +90 -2
  44. package/dist/ratchet/core-production.cjs +29 -0
  45. package/dist/ratchet/core-production.d.ts +95 -0
  46. package/dist/ratchet/core-production.js +286 -0
  47. package/dist/ratchet/index.cjs +29 -0
  48. package/dist/ratchet/index.d.ts +49 -78
  49. package/dist/ratchet/index.js +313 -288
  50. package/dist/ratchet/key-recovery.cjs +29 -0
  51. package/dist/ratchet/replay-protection.cjs +29 -0
  52. package/dist/ratchet/tofu.cjs +29 -0
  53. package/dist/src/facade/app.cjs +29 -0
  54. package/dist/src/facade/app.d.ts +105 -0
  55. package/dist/src/facade/app.js +245 -0
  56. package/dist/src/facade/crypto.cjs +29 -0
  57. package/dist/src/facade/errors.cjs +29 -0
  58. package/dist/src/facade/errors.d.ts +19 -0
  59. package/dist/src/facade/errors.js +21 -0
  60. package/dist/src/facade/index.cjs +29 -0
  61. package/dist/src/facade/index.d.ts +8 -0
  62. package/dist/src/facade/index.js +5 -0
  63. package/dist/src/facade/relay-client.cjs +29 -0
  64. package/dist/src/facade/relay-client.d.ts +36 -0
  65. package/dist/src/facade/relay-client.js +154 -0
  66. package/dist/src/facade/types.cjs +29 -0
  67. package/dist/src/facade/types.d.ts +50 -0
  68. package/dist/src/facade/types.js +4 -0
  69. package/dist/src/index.cjs +29 -0
  70. package/dist/src/index.d.ts +2 -0
  71. package/dist/src/index.js +2 -0
  72. package/dist/src/legacy.cjs +29 -0
  73. package/dist/src/legacy.d.ts +0 -0
  74. package/dist/src/legacy.js +1 -0
  75. package/dist/src/mock-relay-server.cjs +29 -0
  76. package/dist/src/mock-relay-server.d.ts +30 -0
  77. package/dist/src/mock-relay-server.js +236 -0
  78. package/package.json +37 -11
  79. package/dist/ratchet/tests/ratchet.test.d.ts +0 -1
  80. package/dist/ratchet/tests/ratchet.test.js +0 -160
  81. /package/dist/{facade → src/facade}/crypto.d.ts +0 -0
  82. /package/dist/{facade → src/facade}/crypto.js +0 -0
@@ -1,88 +1,59 @@
1
1
  /**
2
2
  * X3DH + Double Ratchet Implementation
3
- * This module handles session establishment and message encryption/decryption.
3
+ * Uses ONLY Node.js built-in crypto module zero external dependencies
4
+ *
5
+ * Implements the Signal Protocol Double Ratchet with deferred initialization:
6
+ * - First send → "initiator" DH ratchet (DH with peer's SPK)
7
+ * - First receive → "responder" DH ratchet (use own SPK, then fresh key)
8
+ * This allows either side to send first after symmetric X3DH key agreement.
9
+ *
10
+ * Provides:
11
+ * - X3DH key agreement (symmetric variant, both sides derive same SK)
12
+ * - Double Ratchet with DH ratchet + symmetric-key ratchet
13
+ * - AES-256-GCM AEAD encryption with header as AAD
14
+ * - ECDSA P-256 signing / verification
15
+ * - HKDF-SHA256 key derivation
16
+ * - HMAC-based chain-key ratchet (Signal-style)
4
17
  */
18
+ export interface KeyPair {
19
+ publicKey: Buffer;
20
+ privateKey: Buffer;
21
+ }
5
22
  export interface SessionState {
23
+ myIdentityPublicKey: Buffer;
24
+ peerIdentityPublicKey: Buffer;
25
+ rootKey: Buffer;
26
+ sendingChainKey: Buffer;
27
+ receivingChainKey: Buffer;
28
+ myRatchetKeyPair: KeyPair;
29
+ theirRatchetPublicKey: Buffer | null;
30
+ sendCount: number;
31
+ recvCount: number;
32
+ prevSendCount: number;
33
+ skippedKeys: Map<string, Buffer>;
34
+ isPostCompromise: boolean;
35
+ peerSPK: Buffer | null;
36
+ mySPKPair: KeyPair | null;
6
37
  identityKey: Uint8Array;
7
38
  signedPreKey: Uint8Array;
8
39
  oneTimePreKey: Uint8Array;
9
- rootKey: Uint8Array;
10
- sendingChainKey: Uint8Array;
11
- receivingChainKey: Uint8Array;
12
- skippedMessageKeys: Map<string, Uint8Array>;
13
- isPostCompromise: boolean;
40
+ sendingChainMessageNumber: number;
41
+ receivingChainMessageNumber: number;
42
+ previousSendingChainLength: number;
14
43
  }
15
44
  export declare function initializeCrypto(): Promise<void>;
16
- /**
17
- * X3DH Session Establishment
18
- * @param identityKeyPair - The user's identity key pair
19
- * @param signedPreKeyPair - The user's signed pre-key pair
20
- * @param oneTimePreKey - A one-time pre-key
21
- * @param recipientIdentityKey - The recipient's identity key
22
- * @param recipientSignedPreKey - The recipient's signed pre-key
23
- * @param recipientOneTimePreKey - The recipient's one-time pre-key
24
- * @param recipientSPKSignature - Signature of SPK by recipient's identity key
25
- * @param protocolVersion - The protocol version
26
- * @param cipherSuite - The cipher suite
27
- * @returns SessionState
28
- */
29
- export declare function establishSession(identityKeyPair: {
30
- publicKey: Uint8Array;
31
- privateKey: Uint8Array;
32
- }, signedPreKeyPair: {
33
- publicKey: Uint8Array;
34
- privateKey: Uint8Array;
35
- }, oneTimePreKey: Uint8Array, recipientIdentityKey: Uint8Array, recipientSignedPreKey: Uint8Array, recipientOneTimePreKey: Uint8Array, recipientSPKSignature: Uint8Array, protocolVersion: string, cipherSuite: string): SessionState;
36
- /**
37
- * Double Ratchet Encryption
38
- * @param plaintext - The message to encrypt
39
- * @param session - The current session state
40
- * @returns { ciphertext: Uint8Array; header: { publicKey: Uint8Array; nonce: Uint8Array } }
41
- */
42
- export declare function encryptMessage(plaintext: string, session: SessionState): {
43
- ciphertext: any;
44
- header: {
45
- publicKey: any;
46
- nonce: any;
47
- };
45
+ export declare function generateKeyPair(): KeyPair;
46
+ /** ECDSA-P256-SHA256 sign */
47
+ export declare function ecSign(data: Buffer, kp: KeyPair): Buffer;
48
+ /** ECDSA-P256-SHA256 verify */
49
+ export declare function ecVerify(data: Buffer, sig: Buffer, pub: Buffer): boolean;
50
+ export declare function x3dhSymmetric(myIK: KeyPair, mySPK: KeyPair, peerIK: Buffer, peerSPK: Buffer): Buffer;
51
+ export declare function establishSession(myIK: KeyPair, mySPK: KeyPair, peerIK: Buffer, peerSPK: Buffer): SessionState;
52
+ export declare function encryptMessage(session: SessionState, plaintext: Buffer): {
53
+ ciphertext: Buffer;
54
+ header: Buffer;
48
55
  };
49
- /**
50
- * Double Ratchet Decryption
51
- * @param ciphertext - The encrypted message
52
- * @param header - The message header containing the sender's public key and nonce
53
- * @param session - The current session state
54
- * @returns The decrypted plaintext
55
- */
56
- export declare function decryptMessage(ciphertext: Uint8Array, header: {
57
- publicKey: Uint8Array;
58
- nonce: Uint8Array;
59
- }, session: SessionState): string;
60
- export declare function addSkippedKey(session: SessionState, header: {
61
- publicKey: Uint8Array;
62
- nonce: Uint8Array;
63
- }, messageKey: Uint8Array): void;
64
- export declare function removeSkippedKey(session: SessionState, header: {
65
- publicKey: Uint8Array;
66
- nonce: Uint8Array;
67
- }): void;
68
- export declare function processSkippedKeys(session: SessionState): void;
69
- export declare function handleSimultaneousSend(session: SessionState, isInitiator: boolean): void;
70
- export declare function generateOPKPool(): void;
71
- export declare function consumeOPKAtomically(userId: string): Uint8Array;
72
- export declare function enforceDHRatchetPolicy(session: SessionState, remotePublicKey: Uint8Array, suspectedCompromise?: boolean): void;
73
- /**
74
- * Increment message counter and enforce policy.
75
- */
76
- export declare function incrementMessageCounter(session: SessionState, remotePublicKey: Uint8Array): void;
77
- /**
78
- * Force a DH ratchet step to enable PCS.
79
- * @param session - The current session state.
80
- * @param remotePublicKey - The remote party's ephemeral public key.
81
- */
82
- export declare function forceDHRatchet(session: SessionState, remotePublicKey: Uint8Array): void;
83
- /**
84
- * Trigger PCS recovery only after receiving a new DH public key.
85
- * @param session - The current session state.
86
- * @param remotePublicKey - The new DH public key from the remote party.
87
- */
88
- export declare function receiveNewDHPublicKey(session: SessionState, remotePublicKey: Uint8Array): void;
56
+ export declare function decryptMessage(session: SessionState, ciphertext: Buffer, header: Buffer): Buffer;
57
+ export declare function forceRatchet(session: SessionState): void;
58
+ export declare function serializeSession(s: SessionState): Buffer;
59
+ export declare function deserializeSession(data: Buffer): SessionState;