@neelegirl/baileys 1.5.2 → 1.5.3

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 (193) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +195 -187
  3. package/WAProto/WAProto.proto +537 -236
  4. package/WAProto/index.d.ts +5971 -2388
  5. package/WAProto/index.js +17298 -6513
  6. package/lib/Defaults/baileys-version.json +3 -3
  7. package/lib/Defaults/index.d.ts +77 -67
  8. package/lib/Defaults/index.js +148 -136
  9. package/lib/Defaults/phonenumber-mcc.json +223 -223
  10. package/lib/Signal/WASignalGroup/GroupProtocol.js +1908 -1908
  11. package/lib/Signal/WASignalGroup/ciphertext-message.d.ts +9 -0
  12. package/lib/Signal/WASignalGroup/ciphertext-message.js +19 -0
  13. package/lib/Signal/WASignalGroup/ciphertext_message.js +15 -15
  14. package/lib/Signal/WASignalGroup/group-session-builder.d.ts +17 -0
  15. package/lib/Signal/WASignalGroup/group-session-builder.js +72 -0
  16. package/lib/Signal/WASignalGroup/group.proto +41 -41
  17. package/lib/Signal/WASignalGroup/group_cipher.d.ts +19 -0
  18. package/lib/Signal/WASignalGroup/group_cipher.js +101 -110
  19. package/lib/Signal/WASignalGroup/group_session_builder.js +45 -45
  20. package/lib/Signal/WASignalGroup/index.d.ts +11 -0
  21. package/lib/Signal/WASignalGroup/index.js +61 -6
  22. package/lib/Signal/WASignalGroup/keyhelper.d.ts +16 -0
  23. package/lib/Signal/WASignalGroup/keyhelper.js +58 -13
  24. package/lib/Signal/WASignalGroup/protobufs.js +2 -2
  25. package/lib/Signal/WASignalGroup/queue_job.js +68 -68
  26. package/lib/Signal/WASignalGroup/readme.md +5 -5
  27. package/lib/Signal/WASignalGroup/sender-chain-key.d.ts +14 -0
  28. package/lib/Signal/WASignalGroup/sender-chain-key.js +47 -0
  29. package/lib/Signal/WASignalGroup/sender-key-distribution-message.d.ts +17 -0
  30. package/lib/Signal/WASignalGroup/sender-key-distribution-message.js +71 -0
  31. package/lib/Signal/WASignalGroup/sender-key-message.d.ts +19 -0
  32. package/lib/Signal/WASignalGroup/sender-key-message.js +73 -0
  33. package/lib/Signal/WASignalGroup/sender-key-name.d.ts +19 -0
  34. package/lib/Signal/WASignalGroup/sender-key-name.js +59 -0
  35. package/lib/Signal/WASignalGroup/sender-key-record.d.ts +32 -0
  36. package/lib/Signal/WASignalGroup/sender-key-record.js +58 -0
  37. package/lib/Signal/WASignalGroup/sender-key-state.d.ts +44 -0
  38. package/lib/Signal/WASignalGroup/sender-key-state.js +147 -0
  39. package/lib/Signal/WASignalGroup/sender-message-key.d.ts +11 -0
  40. package/lib/Signal/WASignalGroup/sender-message-key.js +33 -0
  41. package/lib/Signal/WASignalGroup/sender_chain_key.js +49 -49
  42. package/lib/Signal/WASignalGroup/sender_key_distribution_message.js +77 -77
  43. package/lib/Signal/WASignalGroup/sender_key_message.js +91 -91
  44. package/lib/Signal/WASignalGroup/sender_key_name.js +69 -69
  45. package/lib/Signal/WASignalGroup/sender_key_record.js +55 -55
  46. package/lib/Signal/WASignalGroup/sender_key_state.js +128 -128
  47. package/lib/Signal/WASignalGroup/sender_message_key.js +38 -38
  48. package/lib/Signal/libsignal.d.ts +5 -1
  49. package/lib/Signal/libsignal.js +390 -161
  50. package/lib/Signal/lid-mapping.d.ts +28 -0
  51. package/lib/Signal/lid-mapping.js +184 -0
  52. package/lib/Socket/Client/abstract-socket-client.d.ts +15 -15
  53. package/lib/Socket/Client/abstract-socket-client.js +13 -13
  54. package/lib/Socket/Client/index.d.ts +2 -2
  55. package/lib/Socket/Client/mobile-socket-client.d.ts +12 -12
  56. package/lib/Socket/Client/mobile-socket-client.js +65 -65
  57. package/lib/Socket/Client/types.d.ts +1 -1
  58. package/lib/Socket/Client/websocket.d.ts +1 -1
  59. package/lib/Socket/business.d.ts +6 -6
  60. package/lib/Socket/business.js +152 -5
  61. package/lib/Socket/chats.d.ts +3 -4
  62. package/lib/Socket/chats.js +31 -26
  63. package/lib/Socket/communities.d.ts +223 -223
  64. package/lib/Socket/communities.js +432 -432
  65. package/lib/Socket/groups.d.ts +2 -4
  66. package/lib/Socket/groups.js +22 -14
  67. package/lib/Socket/index.d.ts +69 -69
  68. package/lib/Socket/index.js +3 -2
  69. package/lib/Socket/messages-recv.d.ts +3 -6
  70. package/lib/Socket/messages-recv.js +1449 -1707
  71. package/lib/Socket/messages-send.d.ts +2 -4
  72. package/lib/Socket/messages-send.js +617 -126
  73. package/lib/Socket/mex.d.ts +2 -2
  74. package/lib/Socket/mex.js +46 -46
  75. package/lib/Socket/newsletter.d.ts +2 -4
  76. package/lib/Socket/newsletter.js +294 -285
  77. package/lib/Socket/socket.js +318 -132
  78. package/lib/Socket/usync.js +3 -3
  79. package/lib/Store/index.d.ts +4 -4
  80. package/lib/Store/index.js +23 -23
  81. package/lib/Store/make-cache-manager-store.d.ts +13 -13
  82. package/lib/Store/make-cache-manager-store.js +89 -89
  83. package/lib/Store/make-in-memory-store.d.ts +122 -122
  84. package/lib/Store/make-in-memory-store.js +428 -428
  85. package/lib/Store/make-ordered-dictionary.d.ts +11 -11
  86. package/lib/Store/make-ordered-dictionary.js +85 -85
  87. package/lib/Store/object-repository.d.ts +9 -9
  88. package/lib/Store/object-repository.js +30 -30
  89. package/lib/Types/Auth.d.ts +5 -4
  90. package/lib/Types/Bussines.js +3 -0
  91. package/lib/Types/Bussiness.d.ts +28 -0
  92. package/lib/Types/Chat.d.ts +13 -8
  93. package/lib/Types/Contact.d.ts +4 -1
  94. package/lib/Types/Events.d.ts +13 -16
  95. package/lib/Types/GroupMetadata.d.ts +1 -1
  96. package/lib/Types/Message.d.ts +18 -7
  97. package/lib/Types/Message.js +7 -1
  98. package/lib/Types/MexUpdates.d.ts +8 -8
  99. package/lib/Types/MexUpdates.js +17 -17
  100. package/lib/Types/Newsletter.d.ts +1 -1
  101. package/lib/Types/Product.d.ts +1 -1
  102. package/lib/Types/Signal.d.ts +31 -1
  103. package/lib/Types/Socket.d.ts +34 -13
  104. package/lib/Types/State.d.ts +1 -1
  105. package/lib/Types/USync.d.ts +2 -2
  106. package/lib/Types/index.d.ts +16 -15
  107. package/lib/Types/index.js +4 -2
  108. package/lib/Utils/auth-utils.d.ts +20 -20
  109. package/lib/Utils/auth-utils.js +527 -204
  110. package/lib/Utils/baileys-event-stream.d.ts +17 -17
  111. package/lib/Utils/baileys-event-stream.js +69 -69
  112. package/lib/Utils/business.d.ts +28 -28
  113. package/lib/Utils/business.js +254 -254
  114. package/lib/Utils/chat-utils.d.ts +81 -81
  115. package/lib/Utils/chat-utils.js +808 -780
  116. package/lib/Utils/crypto.d.ts +55 -55
  117. package/lib/Utils/crypto.js +188 -178
  118. package/lib/Utils/decode-wa-message.d.ts +52 -40
  119. package/lib/Utils/decode-wa-message.js +322 -252
  120. package/lib/Utils/event-buffer.d.ts +38 -38
  121. package/lib/Utils/event-buffer.js +594 -564
  122. package/lib/Utils/generics.d.ts +131 -129
  123. package/lib/Utils/generics.js +629 -623
  124. package/lib/Utils/history.d.ts +22 -22
  125. package/lib/Utils/history.js +103 -109
  126. package/lib/Utils/index.d.ts +20 -19
  127. package/lib/Utils/index.js +39 -38
  128. package/lib/Utils/link-preview.d.ts +22 -22
  129. package/lib/Utils/link-preview.js +119 -119
  130. package/lib/Utils/logger.d.ts +13 -13
  131. package/lib/Utils/logger.js +7 -7
  132. package/lib/Utils/lt-hash.d.ts +13 -13
  133. package/lib/Utils/lt-hash.js +57 -57
  134. package/lib/Utils/make-mutex.d.ts +8 -8
  135. package/lib/Utils/make-mutex.js +48 -48
  136. package/lib/Utils/message-retry-manager.d.ts +88 -0
  137. package/lib/Utils/message-retry-manager.js +160 -0
  138. package/lib/Utils/messages-media.d.ts +134 -128
  139. package/lib/Utils/messages-media.js +868 -805
  140. package/lib/Utils/messages.d.ts +104 -102
  141. package/lib/Utils/messages.js +1744 -1578
  142. package/lib/Utils/noise-handler.d.ts +20 -19
  143. package/lib/Utils/noise-handler.js +164 -154
  144. package/lib/Utils/process-message.d.ts +48 -48
  145. package/lib/Utils/process-message.js +427 -428
  146. package/lib/Utils/signal.d.ts +41 -41
  147. package/lib/Utils/signal.js +165 -165
  148. package/lib/Utils/use-mongo-file-auth-state.d.ts +5 -5
  149. package/lib/Utils/use-mongo-file-auth-state.js +83 -83
  150. package/lib/Utils/use-multi-file-auth-state.d.ts +17 -17
  151. package/lib/Utils/use-multi-file-auth-state.js +237 -237
  152. package/lib/Utils/use-single-file-auth-state.d.ts +12 -12
  153. package/lib/Utils/use-single-file-auth-state.js +79 -79
  154. package/lib/Utils/validate-connection.d.ts +12 -12
  155. package/lib/Utils/validate-connection.js +219 -186
  156. package/lib/WABinary/constants.d.ts +29 -29
  157. package/lib/WABinary/constants.js +1315 -1315
  158. package/lib/WABinary/decode.d.ts +8 -8
  159. package/lib/WABinary/decode.js +287 -287
  160. package/lib/WABinary/encode.d.ts +2 -2
  161. package/lib/WABinary/encode.js +264 -264
  162. package/lib/WABinary/generic-utils.d.ts +27 -27
  163. package/lib/WABinary/generic-utils.js +141 -141
  164. package/lib/WABinary/index.d.ts +5 -5
  165. package/lib/WABinary/index.js +24 -24
  166. package/lib/WABinary/jid-utils.d.ts +58 -53
  167. package/lib/WABinary/jid-utils.js +103 -91
  168. package/lib/WABinary/types.d.ts +21 -21
  169. package/lib/WABinary/types.js +2 -2
  170. package/lib/WAM/BinaryInfo.d.ts +15 -15
  171. package/lib/WAM/BinaryInfo.js +16 -16
  172. package/lib/WAM/constants.d.ts +46 -46
  173. package/lib/WAM/constants.js +15370 -15370
  174. package/lib/WAM/encode.d.ts +2 -2
  175. package/lib/WAM/encode.js +163 -164
  176. package/lib/WAM/index.d.ts +3 -3
  177. package/lib/WAM/index.js +22 -22
  178. package/lib/WAUSync/Protocols/USyncBotProfileProtocol.d.ts +27 -27
  179. package/lib/WAUSync/Protocols/USyncBotProfileProtocol.js +68 -68
  180. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +3 -3
  181. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +2 -2
  182. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +2 -2
  183. package/lib/WAUSync/Protocols/USyncLIDProtocol.d.ts +9 -8
  184. package/lib/WAUSync/Protocols/USyncLIDProtocol.js +37 -29
  185. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +2 -2
  186. package/lib/WAUSync/Protocols/index.d.ts +6 -6
  187. package/lib/WAUSync/USyncQuery.d.ts +3 -3
  188. package/lib/WAUSync/index.d.ts +3 -3
  189. package/lib/index.d.ts +13 -13
  190. package/lib/index.js +33 -33
  191. package/package.json +96 -94
  192. package/lib/Socket/registration.d.ts +0 -266
  193. package/lib/Socket/registration.js +0 -166
@@ -0,0 +1,44 @@
1
+ import { SenderChainKey } from './sender-chain-key'
2
+ import { SenderMessageKey } from './sender-message-key'
3
+
4
+ interface SenderChainKeyStructure {
5
+ iteration: number
6
+ seed: Uint8Array
7
+ }
8
+
9
+ interface SenderSigningKeyStructure {
10
+ public: Uint8Array
11
+ private?: Uint8Array
12
+ }
13
+
14
+ interface SenderMessageKeyStructure {
15
+ iteration: number
16
+ seed: Uint8Array
17
+ }
18
+
19
+ interface SenderKeyStateStructure {
20
+ senderKeyId: number
21
+ senderChainKey: SenderChainKeyStructure
22
+ senderSigningKey: SenderSigningKeyStructure
23
+ senderMessageKeys: SenderMessageKeyStructure[]
24
+ }
25
+
26
+ export declare class SenderKeyState {
27
+ private readonly MAX_MESSAGE_KEYS
28
+ private readonly senderKeyStateStructure
29
+ constructor(id?: number | null, iteration?: number | null, chainKey?: Uint8Array | null, signatureKeyPair?: {
30
+ public: Uint8Array
31
+ private: Uint8Array
32
+ } | null, signatureKeyPublic?: Uint8Array | null, signatureKeyPrivate?: Uint8Array | null, senderKeyStateStructure?: SenderKeyStateStructure | null)
33
+ getKeyId(): number
34
+ getSenderChainKey(): SenderChainKey
35
+ setSenderChainKey(chainKey: SenderChainKey): void
36
+ getSigningKeyPublic(): Buffer
37
+ getSigningKeyPrivate(): Buffer | undefined
38
+ hasSenderMessageKey(iteration: number): boolean
39
+ addSenderMessageKey(senderMessageKey: SenderMessageKey): void
40
+ removeSenderMessageKey(iteration: number): SenderMessageKey | null
41
+ getStructure(): SenderKeyStateStructure
42
+ }
43
+
44
+ export {}
@@ -0,0 +1,147 @@
1
+ "use strict"
2
+
3
+ Object.defineProperty(exports, "__esModule", { value: true })
4
+
5
+ const sender_chain_key_1 = require("./sender-chain-key")
6
+ const sender_message_key_1 = require("./sender-message-key")
7
+
8
+ class SenderKeyState {
9
+ constructor(id, iteration, chainKey, signatureKeyPair, signatureKeyPublic, signatureKeyPrivate, senderKeyStateStructure) {
10
+ this.MAX_MESSAGE_KEYS = 2000
11
+
12
+ const toBuffer = (val) => {
13
+ if (!val)
14
+ return Buffer.alloc(0)
15
+ if (typeof val === 'string')
16
+ return Buffer.from(val, 'base64')
17
+ if (val instanceof Uint8Array || Array.isArray(val))
18
+ return Buffer.from(val)
19
+ return Buffer.alloc(0)
20
+ }
21
+
22
+ if (senderKeyStateStructure) {
23
+ this.senderKeyStateStructure = {
24
+ ...senderKeyStateStructure,
25
+ senderMessageKeys: Array.isArray(senderKeyStateStructure.senderMessageKeys)
26
+ ? senderKeyStateStructure.senderMessageKeys
27
+ : []
28
+ }
29
+ }
30
+ else {
31
+ if (signatureKeyPair) {
32
+ signatureKeyPublic = signatureKeyPair.public
33
+ signatureKeyPrivate = signatureKeyPair.private
34
+ }
35
+ chainKey = typeof chainKey === 'string' ? Buffer.from(chainKey, 'base64') : chainKey
36
+
37
+ const senderChainKeyStructure = {
38
+ iteration: iteration || 0,
39
+ seed: chainKey ? toBuffer(chainKey) : Buffer.alloc(0)
40
+ }
41
+
42
+ const signingKeyStructure = {
43
+ public: toBuffer(signatureKeyPublic),
44
+ private: signatureKeyPrivate ? toBuffer(signatureKeyPrivate) : undefined
45
+ }
46
+
47
+ this.senderKeyStateStructure = {
48
+ senderKeyId: id || 0,
49
+ senderChainKey: senderChainKeyStructure,
50
+ senderSigningKey: signingKeyStructure,
51
+ senderMessageKeys: []
52
+ }
53
+ }
54
+ }
55
+ getKeyId() {
56
+ return this.senderKeyStateStructure.senderKeyId
57
+ }
58
+ getSenderChainKey() {
59
+ return new sender_chain_key_1.SenderChainKey(this.senderKeyStateStructure.senderChainKey.iteration, this.senderKeyStateStructure.senderChainKey.seed)
60
+ }
61
+ setSenderChainKey(chainKey) {
62
+ this.senderKeyStateStructure.senderChainKey = {
63
+ iteration: chainKey.getIteration(),
64
+ seed: chainKey.getSeed()
65
+ }
66
+ }
67
+ getSigningKeyPublic() {
68
+ let key = this.senderKeyStateStructure.senderSigningKey.public
69
+
70
+ // normalize into Buffer
71
+ if (!Buffer.isBuffer(key)) {
72
+ if (key instanceof Uint8Array) {
73
+ key = Buffer.from(key)
74
+ }
75
+ else if (typeof key === 'string') {
76
+ key = Buffer.from(key, 'base64')
77
+ }
78
+ else if (key && typeof key === 'object') {
79
+ return Buffer.from(Object.values(key)) // temp fix // inspired by @MartinSchere 's #1741
80
+ }
81
+ else {
82
+ key = Buffer.from(key || [])
83
+ }
84
+ }
85
+
86
+ const publicKey = key
87
+
88
+ if (publicKey.length === 32) {
89
+ const fixed = Buffer.alloc(33)
90
+
91
+ fixed[0] = 0x05
92
+ publicKey.copy(fixed, 1)
93
+
94
+ return fixed
95
+ }
96
+
97
+ return publicKey
98
+ }
99
+ getSigningKeyPrivate() {
100
+ const privateKey = this.senderKeyStateStructure.senderSigningKey.private
101
+ if (!privateKey) {
102
+ return undefined
103
+ }
104
+ if (Buffer.isBuffer(privateKey)) {
105
+ return privateKey
106
+ }
107
+ else if (privateKey instanceof Uint8Array) {
108
+ return Buffer.from(privateKey)
109
+ }
110
+ else if (privateKey && typeof privateKey === 'object') {
111
+ return Buffer.from(Object.values(privateKey)) // temp fix // inspired by @MartinSchere 's #1741
112
+ }
113
+ else if (typeof privateKey === 'string') {
114
+ return Buffer.from(privateKey, 'base64')
115
+ }
116
+ return Buffer.from(privateKey || [])
117
+ }
118
+ hasSenderMessageKey(iteration) {
119
+ return this.senderKeyStateStructure.senderMessageKeys.some(key => key.iteration === iteration)
120
+ }
121
+ addSenderMessageKey(senderMessageKey) {
122
+ this.senderKeyStateStructure.senderMessageKeys.push({
123
+ iteration: senderMessageKey.getIteration(),
124
+ seed: senderMessageKey.getSeed()
125
+ })
126
+
127
+ if (this.senderKeyStateStructure.senderMessageKeys.length > this.MAX_MESSAGE_KEYS) {
128
+ this.senderKeyStateStructure.senderMessageKeys.shift()
129
+ }
130
+ }
131
+ removeSenderMessageKey(iteration) {
132
+ const index = this.senderKeyStateStructure.senderMessageKeys.findIndex(key => key.iteration === iteration)
133
+ if (index !== -1) {
134
+ const messageKey = this.senderKeyStateStructure.senderMessageKeys[index]
135
+ this.senderKeyStateStructure.senderMessageKeys.splice(index, 1)
136
+ return new sender_message_key_1.SenderMessageKey(messageKey.iteration, messageKey.seed)
137
+ }
138
+ return null
139
+ }
140
+ getStructure() {
141
+ return this.senderKeyStateStructure
142
+ }
143
+ }
144
+
145
+ module.exports = {
146
+ SenderKeyState
147
+ }
@@ -0,0 +1,11 @@
1
+ export declare class SenderMessageKey {
2
+ private readonly iteration
3
+ private readonly iv
4
+ private readonly cipherKey
5
+ private readonly seed
6
+ constructor(iteration: number, seed: Uint8Array)
7
+ getIteration(): number
8
+ getIv(): Uint8Array
9
+ getCipherKey(): Uint8Array
10
+ getSeed(): Uint8Array
11
+ }
@@ -0,0 +1,33 @@
1
+ "use strict"
2
+ Object.defineProperty(exports, "__esModule", { value: true })
3
+
4
+ const crypto_1 = require("@neelegirl/libsignal/src/crypto")
5
+
6
+ class SenderMessageKey {
7
+ constructor(iteration, seed) {
8
+ const derivative = (0, crypto_1.deriveSecrets)(seed, Buffer.alloc(32), Buffer.from('WhisperGroup'))
9
+ const keys = new Uint8Array(32)
10
+ keys.set(new Uint8Array(derivative[0].slice(16)))
11
+ keys.set(new Uint8Array(derivative[1].slice(0, 16)), 16)
12
+ this.iv = Buffer.from(derivative[0].slice(0, 16))
13
+ this.cipherKey = Buffer.from(keys.buffer)
14
+ this.iteration = iteration
15
+ this.seed = seed
16
+ }
17
+ getIteration() {
18
+ return this.iteration
19
+ }
20
+ getIv() {
21
+ return this.iv
22
+ }
23
+ getCipherKey() {
24
+ return this.cipherKey
25
+ }
26
+ getSeed() {
27
+ return this.seed
28
+ }
29
+ }
30
+
31
+ module.exports = {
32
+ SenderMessageKey
33
+ }
@@ -1,50 +1,50 @@
1
- const SenderMessageKey = require('./sender_message_key');
2
- //const HKDF = require('./hkdf');
3
- const crypto = require('@neelegirl/libsignal/src/crypto');
4
-
5
- class SenderChainKey {
6
- MESSAGE_KEY_SEED = Buffer.from([0x01]);
7
-
8
- CHAIN_KEY_SEED = Buffer.from([0x02]);
9
-
10
- iteration = 0;
11
-
12
- chainKey = Buffer.alloc(0);
13
-
14
- constructor(iteration, chainKey) {
15
- this.iteration = iteration;
16
- this.chainKey = chainKey;
17
- }
18
-
19
- getIteration() {
20
- return this.iteration;
21
- }
22
-
23
- getSenderMessageKey() {
24
- return new SenderMessageKey(
25
- this.iteration,
26
- this.getDerivative(this.MESSAGE_KEY_SEED, this.chainKey)
27
- );
28
- }
29
-
30
- getNext() {
31
- return new SenderChainKey(
32
- this.iteration + 1,
33
- this.getDerivative(this.CHAIN_KEY_SEED, this.chainKey)
34
- );
35
- }
36
-
37
- getSeed() {
38
- return typeof this.chainKey === 'string' ? Buffer.from(this.chainKey, 'base64') : this.chainKey;
39
- }
40
-
41
- getDerivative(seed, key) {
42
- key = typeof key === 'string' ? Buffer.from(key, 'base64') : key;
43
- const hash = crypto.calculateMAC(key, seed);
44
- //const hash = new Hash().hmac_hash(key, seed, 'sha256', '');
45
-
46
- return hash;
47
- }
48
- }
49
-
1
+ const SenderMessageKey = require('./sender_message_key');
2
+ //const HKDF = require('./hkdf');
3
+ const crypto = require('@neelegirl/libsignal/src/crypto');
4
+
5
+ class SenderChainKey {
6
+ MESSAGE_KEY_SEED = Buffer.from([0x01]);
7
+
8
+ CHAIN_KEY_SEED = Buffer.from([0x02]);
9
+
10
+ iteration = 0;
11
+
12
+ chainKey = Buffer.alloc(0);
13
+
14
+ constructor(iteration, chainKey) {
15
+ this.iteration = iteration;
16
+ this.chainKey = chainKey;
17
+ }
18
+
19
+ getIteration() {
20
+ return this.iteration;
21
+ }
22
+
23
+ getSenderMessageKey() {
24
+ return new SenderMessageKey(
25
+ this.iteration,
26
+ this.getDerivative(this.MESSAGE_KEY_SEED, this.chainKey)
27
+ );
28
+ }
29
+
30
+ getNext() {
31
+ return new SenderChainKey(
32
+ this.iteration + 1,
33
+ this.getDerivative(this.CHAIN_KEY_SEED, this.chainKey)
34
+ );
35
+ }
36
+
37
+ getSeed() {
38
+ return typeof this.chainKey === 'string' ? Buffer.from(this.chainKey, 'base64') : this.chainKey;
39
+ }
40
+
41
+ getDerivative(seed, key) {
42
+ key = typeof key === 'string' ? Buffer.from(key, 'base64') : key;
43
+ const hash = crypto.calculateMAC(key, seed);
44
+ //const hash = new Hash().hmac_hash(key, seed, 'sha256', '');
45
+
46
+ return hash;
47
+ }
48
+ }
49
+
50
50
  module.exports = SenderChainKey;
@@ -1,78 +1,78 @@
1
- const CiphertextMessage = require('./ciphertext_message');
2
- const protobufs = require('./protobufs');
3
-
4
- class SenderKeyDistributionMessage extends CiphertextMessage {
5
- constructor(
6
- id = null,
7
- iteration = null,
8
- chainKey = null,
9
- signatureKey = null,
10
- serialized = null
11
- ) {
12
- super();
13
- if (serialized) {
14
- try {
15
- const version = serialized[0];
16
- const message = serialized.slice(1);
17
-
18
- const distributionMessage = protobufs.SenderKeyDistributionMessage.decode(
19
- message
20
- ).toJSON();
21
- this.serialized = serialized;
22
- this.id = distributionMessage.id;
23
- this.iteration = distributionMessage.iteration;
24
- this.chainKey = distributionMessage.chainKey;
25
- this.signatureKey = distributionMessage.signingKey;
26
- } catch (e) {
27
- throw new Error(e);
28
- }
29
- } else {
30
- const version = this.intsToByteHighAndLow(this.CURRENT_VERSION, this.CURRENT_VERSION);
31
- this.id = id;
32
- this.iteration = iteration;
33
- this.chainKey = chainKey;
34
- this.signatureKey = signatureKey;
35
- const message = protobufs.SenderKeyDistributionMessage.encode(
36
- protobufs.SenderKeyDistributionMessage.create({
37
- id,
38
- iteration,
39
- chainKey,
40
- signingKey: this.signatureKey,
41
- })
42
- ).finish();
43
- this.serialized = Buffer.concat([Buffer.from([version]), message]);
44
- }
45
- }
46
-
47
- intsToByteHighAndLow(highValue, lowValue) {
48
- return (((highValue << 4) | lowValue) & 0xff) % 256;
49
- }
50
-
51
- serialize() {
52
- return this.serialized;
53
- }
54
-
55
- getType() {
56
- return this.SENDERKEY_DISTRIBUTION_TYPE;
57
- }
58
-
59
- getIteration() {
60
- return this.iteration;
61
- }
62
-
63
- getChainKey() {
64
- return typeof this.chainKey === 'string' ? Buffer.from(this.chainKey, 'base64') : this.chainKey;
65
- }
66
-
67
- getSignatureKey() {
68
- return typeof this.signatureKey === 'string'
69
- ? Buffer.from(this.signatureKey, 'base64')
70
- : this.signatureKey;
71
- }
72
-
73
- getId() {
74
- return this.id;
75
- }
76
- }
77
-
1
+ const CiphertextMessage = require('./ciphertext_message');
2
+ const protobufs = require('./protobufs');
3
+
4
+ class SenderKeyDistributionMessage extends CiphertextMessage {
5
+ constructor(
6
+ id = null,
7
+ iteration = null,
8
+ chainKey = null,
9
+ signatureKey = null,
10
+ serialized = null
11
+ ) {
12
+ super();
13
+ if (serialized) {
14
+ try {
15
+ const version = serialized[0];
16
+ const message = serialized.slice(1);
17
+
18
+ const distributionMessage = protobufs.SenderKeyDistributionMessage.decode(
19
+ message
20
+ ).toJSON();
21
+ this.serialized = serialized;
22
+ this.id = distributionMessage.id;
23
+ this.iteration = distributionMessage.iteration;
24
+ this.chainKey = distributionMessage.chainKey;
25
+ this.signatureKey = distributionMessage.signingKey;
26
+ } catch (e) {
27
+ throw new Error(e);
28
+ }
29
+ } else {
30
+ const version = this.intsToByteHighAndLow(this.CURRENT_VERSION, this.CURRENT_VERSION);
31
+ this.id = id;
32
+ this.iteration = iteration;
33
+ this.chainKey = chainKey;
34
+ this.signatureKey = signatureKey;
35
+ const message = protobufs.SenderKeyDistributionMessage.encode(
36
+ protobufs.SenderKeyDistributionMessage.create({
37
+ id,
38
+ iteration,
39
+ chainKey,
40
+ signingKey: this.signatureKey,
41
+ })
42
+ ).finish();
43
+ this.serialized = Buffer.concat([Buffer.from([version]), message]);
44
+ }
45
+ }
46
+
47
+ intsToByteHighAndLow(highValue, lowValue) {
48
+ return (((highValue << 4) | lowValue) & 0xff) % 256;
49
+ }
50
+
51
+ serialize() {
52
+ return this.serialized;
53
+ }
54
+
55
+ getType() {
56
+ return this.SENDERKEY_DISTRIBUTION_TYPE;
57
+ }
58
+
59
+ getIteration() {
60
+ return this.iteration;
61
+ }
62
+
63
+ getChainKey() {
64
+ return typeof this.chainKey === 'string' ? Buffer.from(this.chainKey, 'base64') : this.chainKey;
65
+ }
66
+
67
+ getSignatureKey() {
68
+ return typeof this.signatureKey === 'string'
69
+ ? Buffer.from(this.signatureKey, 'base64')
70
+ : this.signatureKey;
71
+ }
72
+
73
+ getId() {
74
+ return this.id;
75
+ }
76
+ }
77
+
78
78
  module.exports = SenderKeyDistributionMessage;
@@ -1,92 +1,92 @@
1
- const CiphertextMessage = require('./ciphertext_message');
2
- const curve = require('@neelegirl/libsignal/src/curve');
3
- const protobufs = require('./protobufs');
4
-
5
- class SenderKeyMessage extends CiphertextMessage {
6
- SIGNATURE_LENGTH = 64;
7
-
8
- constructor(
9
- keyId = null,
10
- iteration = null,
11
- ciphertext = null,
12
- signatureKey = null,
13
- serialized = null
14
- ) {
15
- super();
16
- if (serialized) {
17
- const version = serialized[0];
18
- const message = serialized.slice(1, serialized.length - this.SIGNATURE_LENGTH);
19
- const signature = serialized.slice(-1 * this.SIGNATURE_LENGTH);
20
- const senderKeyMessage = protobufs.SenderKeyMessage.decode(message).toJSON();
21
- senderKeyMessage.ciphertext = Buffer.from(senderKeyMessage.ciphertext, 'base64');
22
-
23
- this.serialized = serialized;
24
- this.messageVersion = (version & 0xff) >> 4;
25
-
26
- this.keyId = senderKeyMessage.id;
27
- this.iteration = senderKeyMessage.iteration;
28
- this.ciphertext = senderKeyMessage.ciphertext;
29
- this.signature = signature;
30
- } else {
31
- const version = (((this.CURRENT_VERSION << 4) | this.CURRENT_VERSION) & 0xff) % 256;
32
- ciphertext = Buffer.from(ciphertext); // .toString('base64');
33
- const message = protobufs.SenderKeyMessage.encode(
34
- protobufs.SenderKeyMessage.create({
35
- id: keyId,
36
- iteration,
37
- ciphertext,
38
- })
39
- ).finish();
40
-
41
- const signature = this.getSignature(
42
- signatureKey,
43
- Buffer.concat([Buffer.from([version]), message])
44
- );
45
- this.serialized = Buffer.concat([Buffer.from([version]), message, Buffer.from(signature)]);
46
- this.messageVersion = this.CURRENT_VERSION;
47
- this.keyId = keyId;
48
- this.iteration = iteration;
49
- this.ciphertext = ciphertext;
50
- this.signature = signature;
51
- }
52
- }
53
-
54
- getKeyId() {
55
- return this.keyId;
56
- }
57
-
58
- getIteration() {
59
- return this.iteration;
60
- }
61
-
62
- getCipherText() {
63
- return this.ciphertext;
64
- }
65
-
66
- verifySignature(signatureKey) {
67
- const part1 = this.serialized.slice(0, this.serialized.length - this.SIGNATURE_LENGTH);
68
- const part2 = this.serialized.slice(-1 * this.SIGNATURE_LENGTH);
69
- const res = curve.verifySignature(signatureKey, part1, part2);
70
- if (!res) throw new Error('Invalid signature!');
71
- }
72
-
73
- getSignature(signatureKey, serialized) {
74
- const signature = Buffer.from(
75
- curve.calculateSignature(
76
- signatureKey,
77
- serialized
78
- )
79
- );
80
- return signature;
81
- }
82
-
83
- serialize() {
84
- return this.serialized;
85
- }
86
-
87
- getType() {
88
- return 4;
89
- }
90
- }
91
-
1
+ const CiphertextMessage = require('./ciphertext_message');
2
+ const curve = require('@neelegirl/libsignal/src/curve');
3
+ const protobufs = require('./protobufs');
4
+
5
+ class SenderKeyMessage extends CiphertextMessage {
6
+ SIGNATURE_LENGTH = 64;
7
+
8
+ constructor(
9
+ keyId = null,
10
+ iteration = null,
11
+ ciphertext = null,
12
+ signatureKey = null,
13
+ serialized = null
14
+ ) {
15
+ super();
16
+ if (serialized) {
17
+ const version = serialized[0];
18
+ const message = serialized.slice(1, serialized.length - this.SIGNATURE_LENGTH);
19
+ const signature = serialized.slice(-1 * this.SIGNATURE_LENGTH);
20
+ const senderKeyMessage = protobufs.SenderKeyMessage.decode(message).toJSON();
21
+ senderKeyMessage.ciphertext = Buffer.from(senderKeyMessage.ciphertext, 'base64');
22
+
23
+ this.serialized = serialized;
24
+ this.messageVersion = (version & 0xff) >> 4;
25
+
26
+ this.keyId = senderKeyMessage.id;
27
+ this.iteration = senderKeyMessage.iteration;
28
+ this.ciphertext = senderKeyMessage.ciphertext;
29
+ this.signature = signature;
30
+ } else {
31
+ const version = (((this.CURRENT_VERSION << 4) | this.CURRENT_VERSION) & 0xff) % 256;
32
+ ciphertext = Buffer.from(ciphertext); // .toString('base64');
33
+ const message = protobufs.SenderKeyMessage.encode(
34
+ protobufs.SenderKeyMessage.create({
35
+ id: keyId,
36
+ iteration,
37
+ ciphertext,
38
+ })
39
+ ).finish();
40
+
41
+ const signature = this.getSignature(
42
+ signatureKey,
43
+ Buffer.concat([Buffer.from([version]), message])
44
+ );
45
+ this.serialized = Buffer.concat([Buffer.from([version]), message, Buffer.from(signature)]);
46
+ this.messageVersion = this.CURRENT_VERSION;
47
+ this.keyId = keyId;
48
+ this.iteration = iteration;
49
+ this.ciphertext = ciphertext;
50
+ this.signature = signature;
51
+ }
52
+ }
53
+
54
+ getKeyId() {
55
+ return this.keyId;
56
+ }
57
+
58
+ getIteration() {
59
+ return this.iteration;
60
+ }
61
+
62
+ getCipherText() {
63
+ return this.ciphertext;
64
+ }
65
+
66
+ verifySignature(signatureKey) {
67
+ const part1 = this.serialized.slice(0, this.serialized.length - this.SIGNATURE_LENGTH);
68
+ const part2 = this.serialized.slice(-1 * this.SIGNATURE_LENGTH);
69
+ const res = curve.verifySignature(signatureKey, part1, part2);
70
+ if (!res) throw new Error('Invalid signature!');
71
+ }
72
+
73
+ getSignature(signatureKey, serialized) {
74
+ const signature = Buffer.from(
75
+ curve.calculateSignature(
76
+ signatureKey,
77
+ serialized
78
+ )
79
+ );
80
+ return signature;
81
+ }
82
+
83
+ serialize() {
84
+ return this.serialized;
85
+ }
86
+
87
+ getType() {
88
+ return 4;
89
+ }
90
+ }
91
+
92
92
  module.exports = SenderKeyMessage;