dcodeindra-baileyspro 2.3.9

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 (286) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2534 -0
  3. package/WAProto/Adv/Adv.d.ts +518 -0
  4. package/WAProto/Adv/Adv.js +1734 -0
  5. package/WAProto/Adv/Adv.proto +36 -0
  6. package/WAProto/BotMetadata/BotMetadata.d.ts +5745 -0
  7. package/WAProto/BotMetadata/BotMetadata.js +16291 -0
  8. package/WAProto/BotMetadata/BotMetadata.proto +463 -0
  9. package/WAProto/Cert/Cert.d.ts +497 -0
  10. package/WAProto/Cert/Cert.js +1503 -0
  11. package/WAProto/Cert/Cert.proto +28 -0
  12. package/WAProto/ChatLockSettings/ChatLockSettings.d.ts +391 -0
  13. package/WAProto/ChatLockSettings/ChatLockSettings.js +1155 -0
  14. package/WAProto/ChatLockSettings/ChatLockSettings.proto +7 -0
  15. package/WAProto/CompanionReg/CompanionReg.d.ts +1055 -0
  16. package/WAProto/CompanionReg/CompanionReg.js +3532 -0
  17. package/WAProto/CompanionReg/CompanionReg.proto +89 -0
  18. package/WAProto/DeviceCapabilities/DeviceCapabilities.d.ts +187 -0
  19. package/WAProto/DeviceCapabilities/DeviceCapabilities.js +520 -0
  20. package/WAProto/DeviceCapabilities/DeviceCapabilities.proto +14 -0
  21. package/WAProto/E2E/E2E.d.ts +28417 -0
  22. package/WAProto/E2E/E2E.js +98438 -0
  23. package/WAProto/E2E/E2E.proto +2289 -0
  24. package/WAProto/Ephemeral/Ephemeral.d.ts +95 -0
  25. package/WAProto/Ephemeral/Ephemeral.js +269 -0
  26. package/WAProto/Ephemeral/Ephemeral.proto +6 -0
  27. package/WAProto/HistorySync/HistorySync.d.ts +40728 -0
  28. package/WAProto/HistorySync/HistorySync.js +142980 -0
  29. package/WAProto/HistorySync/HistorySync.proto +207 -0
  30. package/WAProto/LidMigrationSyncPayload/LidMigrationSyncPayload.d.ts +189 -0
  31. package/WAProto/LidMigrationSyncPayload/LidMigrationSyncPayload.js +585 -0
  32. package/WAProto/LidMigrationSyncPayload/LidMigrationSyncPayload.proto +11 -0
  33. package/WAProto/MdStorageChatRowOpaqueData/MdStorageChatRowOpaqueData.d.ts +461 -0
  34. package/WAProto/MdStorageChatRowOpaqueData/MdStorageChatRowOpaqueData.js +1559 -0
  35. package/WAProto/MdStorageChatRowOpaqueData/MdStorageChatRowOpaqueData.proto +37 -0
  36. package/WAProto/MdStorageMsgRowOpaqueData/MdStorageMsgRowOpaqueData.d.ts +29294 -0
  37. package/WAProto/MdStorageMsgRowOpaqueData/MdStorageMsgRowOpaqueData.js +101732 -0
  38. package/WAProto/MdStorageMsgRowOpaqueData/MdStorageMsgRowOpaqueData.proto +76 -0
  39. package/WAProto/MmsRetry/MmsRetry.d.ts +200 -0
  40. package/WAProto/MmsRetry/MmsRetry.js +586 -0
  41. package/WAProto/MmsRetry/MmsRetry.proto +17 -0
  42. package/WAProto/Protocol/Protocol.d.ts +218 -0
  43. package/WAProto/Protocol/Protocol.js +701 -0
  44. package/WAProto/Protocol/Protocol.proto +20 -0
  45. package/WAProto/Reporting/Reporting.d.ts +301 -0
  46. package/WAProto/Reporting/Reporting.js +989 -0
  47. package/WAProto/Reporting/Reporting.proto +19 -0
  48. package/WAProto/ServerSync/ServerSync.d.ts +1050 -0
  49. package/WAProto/ServerSync/ServerSync.js +3176 -0
  50. package/WAProto/ServerSync/ServerSync.proto +59 -0
  51. package/WAProto/SignalLocalStorageProtocol/SignalLocalStorageProtocol.d.ts +1507 -0
  52. package/WAProto/SignalLocalStorageProtocol/SignalLocalStorageProtocol.js +4756 -0
  53. package/WAProto/SignalLocalStorageProtocol/SignalLocalStorageProtocol.proto +88 -0
  54. package/WAProto/SignalWhisperTextProtocol/SignalWhisperTextProtocol.d.ts +617 -0
  55. package/WAProto/SignalWhisperTextProtocol/SignalWhisperTextProtocol.js +1940 -0
  56. package/WAProto/SignalWhisperTextProtocol/SignalWhisperTextProtocol.proto +38 -0
  57. package/WAProto/StatusAttributions/StatusAttributions.d.ts +636 -0
  58. package/WAProto/StatusAttributions/StatusAttributions.js +2037 -0
  59. package/WAProto/StatusAttributions/StatusAttributions.proto +61 -0
  60. package/WAProto/SyncAction/SyncAction.d.ts +7227 -0
  61. package/WAProto/SyncAction/SyncAction.js +22271 -0
  62. package/WAProto/SyncAction/SyncAction.proto +423 -0
  63. package/WAProto/UserPassword/UserPassword.d.ts +298 -0
  64. package/WAProto/UserPassword/UserPassword.js +898 -0
  65. package/WAProto/UserPassword/UserPassword.proto +27 -0
  66. package/WAProto/VnameCert/VnameCert.d.ts +658 -0
  67. package/WAProto/VnameCert/VnameCert.js +2225 -0
  68. package/WAProto/VnameCert/VnameCert.proto +60 -0
  69. package/WAProto/Wa6/Wa6.d.ts +1613 -0
  70. package/WAProto/Wa6/Wa6.js +6299 -0
  71. package/WAProto/Wa6/Wa6.proto +229 -0
  72. package/WAProto/Web/Web.d.ts +31718 -0
  73. package/WAProto/Web/Web.js +113402 -0
  74. package/WAProto/Web/Web.proto +545 -0
  75. package/WAProto/index.d.ts +49 -0
  76. package/WAProto/index.js +28 -0
  77. package/WASignalGroup/GroupProtocol.js +1771 -0
  78. package/WASignalGroup/ciphertext_message.js +10 -0
  79. package/WASignalGroup/group_cipher.js +103 -0
  80. package/WASignalGroup/group_session_builder.js +39 -0
  81. package/WASignalGroup/index.js +5 -0
  82. package/WASignalGroup/keyhelper.js +17 -0
  83. package/WASignalGroup/protobufs.js +2 -0
  84. package/WASignalGroup/queue_job.js +64 -0
  85. package/WASignalGroup/sender_chain_key.js +38 -0
  86. package/WASignalGroup/sender_key_distribution_message.js +68 -0
  87. package/WASignalGroup/sender_key_message.js +79 -0
  88. package/WASignalGroup/sender_key_name.js +59 -0
  89. package/WASignalGroup/sender_key_record.js +47 -0
  90. package/WASignalGroup/sender_key_state.js +110 -0
  91. package/WASignalGroup/sender_message_key.js +30 -0
  92. package/check-node-version.js +10 -0
  93. package/lib/Defaults/baileys-version.json +3 -0
  94. package/lib/Defaults/index.d.ts +51 -0
  95. package/lib/Defaults/index.js +108 -0
  96. package/lib/Defaults/phonenumber-mcc.json +223 -0
  97. package/lib/Signal/Group/ciphertext-message.d.ts +9 -0
  98. package/lib/Signal/Group/ciphertext-message.js +19 -0
  99. package/lib/Signal/Group/group-session-builder.d.ts +17 -0
  100. package/lib/Signal/Group/group-session-builder.js +72 -0
  101. package/lib/Signal/Group/group_cipher.d.ts +19 -0
  102. package/lib/Signal/Group/group_cipher.js +99 -0
  103. package/lib/Signal/Group/index.d.ts +11 -0
  104. package/lib/Signal/Group/index.js +61 -0
  105. package/lib/Signal/Group/keyhelper.d.ts +16 -0
  106. package/lib/Signal/Group/keyhelper.js +66 -0
  107. package/lib/Signal/Group/queue-job.d.ts +1 -0
  108. package/lib/Signal/Group/queue-job.js +64 -0
  109. package/lib/Signal/Group/sender-chain-key.d.ts +14 -0
  110. package/lib/Signal/Group/sender-chain-key.js +39 -0
  111. package/lib/Signal/Group/sender-key-distribution-message.d.ts +17 -0
  112. package/lib/Signal/Group/sender-key-distribution-message.js +71 -0
  113. package/lib/Signal/Group/sender-key-message.d.ts +19 -0
  114. package/lib/Signal/Group/sender-key-message.js +73 -0
  115. package/lib/Signal/Group/sender-key-name.d.ts +19 -0
  116. package/lib/Signal/Group/sender-key-name.js +59 -0
  117. package/lib/Signal/Group/sender-key-record.d.ts +32 -0
  118. package/lib/Signal/Group/sender-key-record.js +53 -0
  119. package/lib/Signal/Group/sender-key-record.ts +77 -0
  120. package/lib/Signal/Group/sender-key-state.d.ts +44 -0
  121. package/lib/Signal/Group/sender-key-state.js +104 -0
  122. package/lib/Signal/Group/sender-message-key.d.ts +11 -0
  123. package/lib/Signal/Group/sender-message-key.js +33 -0
  124. package/lib/Signal/libsignal.d.ts +3 -0
  125. package/lib/Signal/libsignal.js +153 -0
  126. package/lib/Socket/Client/index.d.ts +2 -0
  127. package/lib/Socket/Client/index.js +18 -0
  128. package/lib/Socket/Client/types.d.ts +15 -0
  129. package/lib/Socket/Client/types.js +14 -0
  130. package/lib/Socket/Client/websocket.d.ts +12 -0
  131. package/lib/Socket/Client/websocket.js +57 -0
  132. package/lib/Socket/business.d.ts +181 -0
  133. package/lib/Socket/business.js +259 -0
  134. package/lib/Socket/chats.d.ts +95 -0
  135. package/lib/Socket/chats.js +906 -0
  136. package/lib/Socket/community.d.ts +131 -0
  137. package/lib/Socket/community.js +369 -0
  138. package/lib/Socket/groups.d.ts +122 -0
  139. package/lib/Socket/groups.js +360 -0
  140. package/lib/Socket/index.d.ts +183 -0
  141. package/lib/Socket/index.js +10 -0
  142. package/lib/Socket/messages-recv.d.ts +170 -0
  143. package/lib/Socket/messages-recv.js +1074 -0
  144. package/lib/Socket/messages-send.d.ts +161 -0
  145. package/lib/Socket/messages-send.js +982 -0
  146. package/lib/Socket/newsletter.d.ts +140 -0
  147. package/lib/Socket/newsletter.js +242 -0
  148. package/lib/Socket/socket.d.ts +43 -0
  149. package/lib/Socket/socket.js +749 -0
  150. package/lib/Socket/usync.d.ts +36 -0
  151. package/lib/Socket/usync.js +71 -0
  152. package/lib/Store/index.d.ts +4 -0
  153. package/lib/Store/index.js +20 -0
  154. package/lib/Store/make-cache-manager-store.d.ts +13 -0
  155. package/lib/Store/make-cache-manager-store.js +77 -0
  156. package/lib/Store/make-in-memory-store.d.ts +117 -0
  157. package/lib/Store/make-in-memory-store.js +420 -0
  158. package/lib/Store/make-ordered-dictionary.d.ts +12 -0
  159. package/lib/Store/make-ordered-dictionary.js +83 -0
  160. package/lib/Store/object-repository.d.ts +10 -0
  161. package/lib/Store/object-repository.js +28 -0
  162. package/lib/Types/Auth.d.ts +103 -0
  163. package/lib/Types/Auth.js +2 -0
  164. package/lib/Types/Call.d.ts +13 -0
  165. package/lib/Types/Call.js +2 -0
  166. package/lib/Types/Chat.d.ts +115 -0
  167. package/lib/Types/Chat.js +6 -0
  168. package/lib/Types/Contact.d.ts +35 -0
  169. package/lib/Types/Contact.js +2 -0
  170. package/lib/Types/Events.d.ts +208 -0
  171. package/lib/Types/Events.js +2 -0
  172. package/lib/Types/GroupMetadata.d.ts +81 -0
  173. package/lib/Types/GroupMetadata.js +2 -0
  174. package/lib/Types/Label.d.ts +46 -0
  175. package/lib/Types/Label.js +28 -0
  176. package/lib/Types/LabelAssociation.d.ts +29 -0
  177. package/lib/Types/LabelAssociation.js +10 -0
  178. package/lib/Types/Message.d.ts +480 -0
  179. package/lib/Types/Message.js +9 -0
  180. package/lib/Types/MexUpdates.d.ts +9 -0
  181. package/lib/Types/MexUpdates.js +18 -0
  182. package/lib/Types/Newsletter.d.ts +92 -0
  183. package/lib/Types/Newsletter.js +33 -0
  184. package/lib/Types/Product.d.ts +78 -0
  185. package/lib/Types/Product.js +2 -0
  186. package/lib/Types/Signal.d.ts +57 -0
  187. package/lib/Types/Signal.js +2 -0
  188. package/lib/Types/Socket.d.ts +116 -0
  189. package/lib/Types/Socket.js +2 -0
  190. package/lib/Types/State.d.ts +27 -0
  191. package/lib/Types/State.js +2 -0
  192. package/lib/Types/USync.d.ts +25 -0
  193. package/lib/Types/USync.js +2 -0
  194. package/lib/Types/index.d.ts +70 -0
  195. package/lib/Types/index.js +42 -0
  196. package/lib/Utils/auth-utils.d.ts +18 -0
  197. package/lib/Utils/auth-utils.js +198 -0
  198. package/lib/Utils/baileys-event-stream.d.ts +16 -0
  199. package/lib/Utils/baileys-event-stream.js +64 -0
  200. package/lib/Utils/business.d.ts +22 -0
  201. package/lib/Utils/business.js +243 -0
  202. package/lib/Utils/chat-utils.d.ts +72 -0
  203. package/lib/Utils/chat-utils.js +762 -0
  204. package/lib/Utils/crypto.d.ts +40 -0
  205. package/lib/Utils/crypto.js +150 -0
  206. package/lib/Utils/decode-wa-message.d.ts +252 -0
  207. package/lib/Utils/decode-wa-message.js +232 -0
  208. package/lib/Utils/event-buffer.d.ts +35 -0
  209. package/lib/Utils/event-buffer.js +539 -0
  210. package/lib/Utils/generics.d.ts +96 -0
  211. package/lib/Utils/generics.js +553 -0
  212. package/lib/Utils/history.d.ts +29 -0
  213. package/lib/Utils/history.js +109 -0
  214. package/lib/Utils/index.d.ts +19 -0
  215. package/lib/Utils/index.js +35 -0
  216. package/lib/Utils/link-preview.d.ts +21 -0
  217. package/lib/Utils/link-preview.js +112 -0
  218. package/lib/Utils/logger.d.ts +11 -0
  219. package/lib/Utils/logger.js +7 -0
  220. package/lib/Utils/lt-hash.d.ts +12 -0
  221. package/lib/Utils/lt-hash.js +53 -0
  222. package/lib/Utils/make-mutex.d.ts +7 -0
  223. package/lib/Utils/make-mutex.js +45 -0
  224. package/lib/Utils/messages-media.d.ts +104 -0
  225. package/lib/Utils/messages-media.js +751 -0
  226. package/lib/Utils/messages.d.ts +80 -0
  227. package/lib/Utils/messages.js +1741 -0
  228. package/lib/Utils/noise-handler.d.ts +19 -0
  229. package/lib/Utils/noise-handler.js +150 -0
  230. package/lib/Utils/process-message.d.ts +41 -0
  231. package/lib/Utils/process-message.js +391 -0
  232. package/lib/Utils/signal.d.ts +33 -0
  233. package/lib/Utils/signal.js +154 -0
  234. package/lib/Utils/use-mongo-file-auth-state.d.ts +5 -0
  235. package/lib/Utils/use-mongo-file-auth-state.js +75 -0
  236. package/lib/Utils/use-multi-file-auth-state.d.ts +12 -0
  237. package/lib/Utils/use-multi-file-auth-state.js +123 -0
  238. package/lib/Utils/use-single-file-auth-state.d.ts +12 -0
  239. package/lib/Utils/use-single-file-auth-state.js +75 -0
  240. package/lib/Utils/validate-connection.d.ts +10 -0
  241. package/lib/Utils/validate-connection.js +174 -0
  242. package/lib/WABinary/constants.d.ts +27 -0
  243. package/lib/WABinary/constants.js +45 -0
  244. package/lib/WABinary/decode.d.ts +6 -0
  245. package/lib/WABinary/decode.js +255 -0
  246. package/lib/WABinary/encode.d.ts +2 -0
  247. package/lib/WABinary/encode.js +243 -0
  248. package/lib/WABinary/generic-utils.d.ts +16 -0
  249. package/lib/WABinary/generic-utils.js +125 -0
  250. package/lib/WABinary/index.d.ts +5 -0
  251. package/lib/WABinary/index.js +21 -0
  252. package/lib/WABinary/jid-utils.d.ts +34 -0
  253. package/lib/WABinary/jid-utils.js +73 -0
  254. package/lib/WABinary/types.d.ts +18 -0
  255. package/lib/WABinary/types.js +2 -0
  256. package/lib/WAM/BinaryInfo.d.ts +16 -0
  257. package/lib/WAM/BinaryInfo.js +14 -0
  258. package/lib/WAM/constants.d.ts +39 -0
  259. package/lib/WAM/constants.js +15362 -0
  260. package/lib/WAM/encode.d.ts +2 -0
  261. package/lib/WAM/encode.js +156 -0
  262. package/lib/WAM/index.d.ts +3 -0
  263. package/lib/WAM/index.js +19 -0
  264. package/lib/WAUSync/Protocols/USyncBotProfileProtocol.d.ts +25 -0
  265. package/lib/WAUSync/Protocols/USyncBotProfileProtocol.js +60 -0
  266. package/lib/WAUSync/Protocols/USyncContactProtocol.d.ts +9 -0
  267. package/lib/WAUSync/Protocols/USyncContactProtocol.js +32 -0
  268. package/lib/WAUSync/Protocols/USyncDeviceProtocol.d.ts +22 -0
  269. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +58 -0
  270. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.d.ts +12 -0
  271. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +31 -0
  272. package/lib/WAUSync/Protocols/USyncLIDProtocol.d.ts +8 -0
  273. package/lib/WAUSync/Protocols/USyncLIDProtocol.js +26 -0
  274. package/lib/WAUSync/Protocols/USyncStatusProtocol.d.ts +12 -0
  275. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +42 -0
  276. package/lib/WAUSync/Protocols/index.d.ts +6 -0
  277. package/lib/WAUSync/Protocols/index.js +22 -0
  278. package/lib/WAUSync/USyncQuery.d.ts +28 -0
  279. package/lib/WAUSync/USyncQuery.js +88 -0
  280. package/lib/WAUSync/USyncUser.d.ts +12 -0
  281. package/lib/WAUSync/USyncUser.js +27 -0
  282. package/lib/WAUSync/index.d.ts +3 -0
  283. package/lib/WAUSync/index.js +19 -0
  284. package/lib/index.d.ts +13 -0
  285. package/lib/index.js +45 -0
  286. package/package.json +63 -0
@@ -0,0 +1,40 @@
1
+ import { KeyPair } from '../Types'
2
+ /** prefix version byte to the pub keys, required for some curve crypto functions */
3
+ export declare const generateSignalPubKey: (pubKey: Uint8Array | Buffer) => Uint8Array | Buffer
4
+ export declare const Curve: {
5
+ generateKeyPair: () => KeyPair
6
+ sharedKey: (privateKey: Uint8Array, publicKey: Uint8Array) => Buffer
7
+ sign: (privateKey: Uint8Array, buf: Uint8Array) => any
8
+ verify: (pubKey: Uint8Array, message: Uint8Array, signature: Uint8Array) => boolean
9
+ }
10
+ export declare const signedKeyPair: (identityKeyPair: KeyPair, keyId: number) => {
11
+ keyPair: KeyPair
12
+ signature: any
13
+ keyId: number
14
+ }
15
+ /**
16
+ * encrypt AES 256 GCM
17
+ * where the tag tag is suffixed to the ciphertext
18
+ * */
19
+ export declare function aesEncryptGCM(plaintext: Uint8Array, key: Uint8Array, iv: Uint8Array, additionalData: Uint8Array): Buffer
20
+ /**
21
+ * decrypt AES 256 GCM
22
+ * where the auth tag is suffixed to the ciphertext
23
+ * */
24
+ export declare function aesDecryptGCM(ciphertext: Uint8Array, key: Uint8Array, iv: Uint8Array, additionalData: Uint8Array): Buffer
25
+ export declare function aesEncryptCTR(plaintext: Uint8Array, key: Uint8Array, iv: Uint8Array): Buffer
26
+ export declare function aesDecryptCTR(ciphertext: Uint8Array, key: Uint8Array, iv: Uint8Array): Buffer
27
+ /** decrypt AES 256 CBC where the IV is prefixed to the buffer */
28
+ export declare function aesDecrypt(buffer: Buffer, key: Buffer): Buffer
29
+ /** decrypt AES 256 CBC */
30
+ export declare function aesDecryptWithIV(buffer: Buffer, key: Buffer, IV: Buffer): Buffer
31
+ export declare function aesEncrypt(buffer: Buffer | Uint8Array, key: Buffer): Buffer
32
+ export declare function aesEncrypWithIV(buffer: Buffer, key: Buffer, IV: Buffer): Buffer
33
+ export declare function hmacSign(buffer: Buffer | Uint8Array, key: Buffer | Uint8Array, variant?: 'sha256' | 'sha512'): Buffer
34
+ export declare function sha256(buffer: Buffer): Buffer
35
+ export declare function md5(buffer: Buffer): Buffer
36
+ export declare function hkdf(buffer: Uint8Array | Buffer, expandedLength: number, info: {
37
+ salt?: Buffer
38
+ info?: string
39
+ }): Promise<Buffer>
40
+ export declare function derivePairingCodeKey(pairingCode: string, salt: Buffer): Promise<Buffer>
@@ -0,0 +1,150 @@
1
+ "use strict"
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k
4
+ var desc = Object.getOwnPropertyDescriptor(m, k)
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k] } }
7
+ }
8
+ Object.defineProperty(o, k2, desc)
9
+ } : function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k
11
+ o[k2] = m[k]
12
+ })
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v })
15
+ } : function(o, v) {
16
+ o["default"] = v
17
+ })
18
+ var __importStar = (this && this.__importStar) || function(mod) {
19
+ if (mod && mod.__esModule) return mod
20
+ var result = {}
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k)
22
+ __setModuleDefault(result, mod)
23
+ return result
24
+ }
25
+ Object.defineProperty(exports, "__esModule", { value: true })
26
+ const crypto_1 = require("crypto")
27
+ const libsignal = __importStar(require("libsignal"))
28
+ const Defaults_1 = require("../Defaults")
29
+ const generateSignalPubKey = (pubKey) => (
30
+ pubKey.length === 33 ? pubKey : Buffer.concat([Defaults_1.KEY_BUNDLE_TYPE, pubKey])
31
+ )
32
+ const Curve = {
33
+ generateKeyPair: () => {
34
+ const { pubKey, privKey } = libsignal.curve.generateKeyPair()
35
+ return {
36
+ private: Buffer.from(privKey),
37
+ public: Buffer.from(pubKey.slice(1))
38
+ }
39
+ },
40
+ sharedKey: (privateKey, publicKey) => {
41
+ const shared = libsignal.curve.calculateAgreement(generateSignalPubKey(publicKey), privateKey)
42
+ return Buffer.from(shared)
43
+ },
44
+ sign: (privateKey, buf) => libsignal.curve.calculateSignature(privateKey, buf),
45
+ verify: (pubKey, message, signature) => {
46
+ try {
47
+ libsignal.curve.verifySignature(generateSignalPubKey(pubKey), message, signature)
48
+ return true
49
+ } catch {
50
+ return false
51
+ }
52
+ }
53
+ }
54
+ const signedKeyPair = (identityKeyPair, keyId) => {
55
+ const preKey = Curve.generateKeyPair()
56
+ const pubKey = generateSignalPubKey(preKey.public)
57
+ const signature = Curve.sign(identityKeyPair.private, pubKey)
58
+ return { keyPair: preKey, signature, keyId }
59
+ }
60
+ const GCM_TAG_LENGTH = 128 >> 3
61
+ function aesEncryptGCM(plaintext, key, iv, additionalData) {
62
+ const cipher = crypto_1.createCipheriv('aes-256-gcm', key, iv)
63
+ cipher.setAAD(additionalData)
64
+ return Buffer.concat([cipher.update(plaintext), cipher.final(), cipher.getAuthTag()])
65
+ }
66
+ function aesDecryptGCM(ciphertext, key, iv, additionalData) {
67
+ const decipher = crypto_1.createDecipheriv('aes-256-gcm', key, iv)
68
+ const enc = ciphertext.slice(0, ciphertext.length - GCM_TAG_LENGTH)
69
+ const tag = ciphertext.slice(ciphertext.length - GCM_TAG_LENGTH)
70
+ decipher.setAAD(additionalData)
71
+ decipher.setAuthTag(tag)
72
+ return Buffer.concat([decipher.update(enc), decipher.final()])
73
+ }
74
+ function aesEncryptCTR(plaintext, key, iv) {
75
+ const cipher = crypto_1.createCipheriv('aes-256-ctr', key, iv)
76
+ return Buffer.concat([cipher.update(plaintext), cipher.final()])
77
+ }
78
+ function aesDecryptCTR(ciphertext, key, iv) {
79
+ const decipher = crypto_1.createDecipheriv('aes-256-ctr', key, iv)
80
+ return Buffer.concat([decipher.update(ciphertext), decipher.final()])
81
+ }
82
+ function aesDecrypt(buffer, key) {
83
+ return aesDecryptWithIV(buffer.slice(16), key, buffer.slice(0, 16))
84
+ }
85
+ function aesDecryptWithIV(buffer, key, IV) {
86
+ const aes = crypto_1.createDecipheriv('aes-256-cbc', key, IV)
87
+ return Buffer.concat([aes.update(buffer), aes.final()])
88
+ }
89
+ function aesEncrypt(buffer, key) {
90
+ const IV = crypto_1.randomBytes(16)
91
+ const aes = crypto_1.createCipheriv('aes-256-cbc', key, IV)
92
+ return Buffer.concat([IV, aes.update(buffer), aes.final()])
93
+ }
94
+ function aesEncrypWithIV(buffer, key, IV) {
95
+ const aes = crypto_1.createCipheriv('aes-256-cbc', key, IV)
96
+ return Buffer.concat([aes.update(buffer), aes.final()])
97
+ }
98
+ function hmacSign(buffer, key, variant = 'sha256') {
99
+ return crypto_1.createHmac(variant, key).update(buffer).digest()
100
+ }
101
+ function sha256(buffer) {
102
+ return crypto_1.createHash('sha256').update(buffer).digest()
103
+ }
104
+ function md5(buffer) {
105
+ return crypto_1.createHash('md5').update(buffer).digest()
106
+ }
107
+ async function hkdf(buffer, expandedLength, info) {
108
+ const inputKeyMaterial = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer)
109
+ const salt = info.salt ? new Uint8Array(info.salt) : new Uint8Array(0)
110
+ const infoBytes = info.info ? new TextEncoder().encode(info.info) : new Uint8Array(0)
111
+ const importedKey = await crypto.subtle.importKey('raw', inputKeyMaterial, { name: 'HKDF' }, false, ['deriveBits'])
112
+ const derivedBits = await crypto.subtle.deriveBits({
113
+ name: 'HKDF',
114
+ hash: 'SHA-256',
115
+ salt,
116
+ info: infoBytes
117
+ }, importedKey, expandedLength * 8)
118
+ return Buffer.from(derivedBits)
119
+ }
120
+ async function derivePairingCodeKey(pairingCode, salt) {
121
+ const encoder = new TextEncoder()
122
+ const pairingCodeBuffer = encoder.encode(pairingCode)
123
+ const saltBuffer = salt instanceof Uint8Array ? salt : new Uint8Array(salt)
124
+ const keyMaterial = await crypto.subtle.importKey('raw', pairingCodeBuffer, { name: 'PBKDF2' }, false, ['deriveBits'])
125
+ const derivedBits = await crypto.subtle.deriveBits({
126
+ name: 'PBKDF2',
127
+ salt: saltBuffer,
128
+ iterations: 2 << 16,
129
+ hash: 'SHA-256'
130
+ }, keyMaterial, 32 * 8)
131
+ return Buffer.from(derivedBits)
132
+ }
133
+ module.exports = {
134
+ generateSignalPubKey,
135
+ Curve,
136
+ signedKeyPair,
137
+ aesEncryptGCM,
138
+ aesDecryptGCM,
139
+ aesEncryptCTR,
140
+ aesDecryptCTR,
141
+ aesDecrypt,
142
+ aesDecryptWithIV,
143
+ aesEncrypt,
144
+ aesEncrypWithIV,
145
+ hmacSign,
146
+ sha256,
147
+ md5,
148
+ hkdf,
149
+ derivePairingCodeKey
150
+ }
@@ -0,0 +1,252 @@
1
+ "use strict";
2
+
3
+ const { Boom } = require('@hapi/boom');
4
+ const { proto } = require('../../WAProto');
5
+ const { areJidsSameUser, isJidBroadcast, isJidGroup, isJidMetaIa, isJidNewsletter, isJidStatusBroadcast, isJidUser, isLidUser, jidNormalizedUser } = require('../WABinary');
6
+ const { unpadRandomMax16 } = require('./generics');
7
+ const { getDevice } = require('./messages');
8
+
9
+ const NO_MESSAGE_FOUND_ERROR_TEXT = 'Message absent from node';
10
+ const MISSING_KEYS_ERROR_TEXT = 'Key used already or never filled';
11
+
12
+ const NACK_REASONS = {
13
+ ParsingError: 487,
14
+ UnrecognizedStanza: 488,
15
+ UnrecognizedStanzaClass: 489,
16
+ UnrecognizedStanzaType: 490,
17
+ InvalidProtobuf: 491,
18
+ InvalidHostedCompanionStanza: 493,
19
+ MissingMessageSecret: 495,
20
+ SignalErrorOldCounter: 496,
21
+ MessageDeletedOnPeer: 499,
22
+ UnhandledError: 500,
23
+ UnsupportedAdminRevoke: 550,
24
+ UnsupportedLIDGroup: 551,
25
+ DBOperationFailed: 552
26
+ };
27
+
28
+ /**
29
+ * Decode the received node as a message.
30
+ * @note this will only parse the message, not decrypt it
31
+ */
32
+ function decodeMessageNode(stanza, meId, meLid) {
33
+ let msgType;
34
+ let chatId;
35
+ let author;
36
+
37
+ const msgId = stanza.attrs.id;
38
+ const from = stanza.attrs.from;
39
+ const participant = stanza.attrs.participant;
40
+ const recipient = stanza.attrs.recipient;
41
+
42
+ const isMe = (jid) => areJidsSameUser(jid, meId);
43
+ const isMeLid = (jid) => areJidsSameUser(jid, meLid);
44
+
45
+ if (isJidUser(from) || isLidUser(from)) {
46
+ if (recipient && !isJidMetaIa(recipient)) {
47
+ if (!isMe(from) && !isMeLid(from)) {
48
+ throw new Boom('receipient present, but msg not from me', { data: stanza });
49
+ }
50
+
51
+ chatId = recipient;
52
+ } else {
53
+ chatId = from;
54
+ }
55
+
56
+ msgType = 'chat';
57
+ author = from;
58
+ } else if (isJidGroup(from)) {
59
+ if (!participant) {
60
+ throw new Boom('No participant in group message');
61
+ }
62
+
63
+ msgType = 'group';
64
+ author = participant;
65
+ chatId = from;
66
+ } else if (isJidBroadcast(from)) {
67
+ if (!participant) {
68
+ throw new Boom('No participant in group message');
69
+ }
70
+
71
+ const isParticipantMe = isMe(participant);
72
+ if (isJidStatusBroadcast(from)) {
73
+ msgType = isParticipantMe ? 'direct_peer_status' : 'other_status';
74
+ } else {
75
+ msgType = isParticipantMe ? 'peer_broadcast' : 'other_broadcast';
76
+ }
77
+
78
+ chatId = from;
79
+ author = participant;
80
+ } else if (isJidNewsletter(from)) {
81
+ msgType = 'newsletter';
82
+ chatId = from;
83
+ author = from;
84
+ } else {
85
+ throw new Boom('Unknown message type', { data: stanza });
86
+ }
87
+
88
+ const fromMe = isJidNewsletter(from)
89
+ ? !!stanza.attrs?.is_sender
90
+ : isLidUser(from)
91
+ ? isMeLid(stanza.attrs.participant || stanza.attrs.from)
92
+ : isMe(stanza.attrs.participant || stanza.attrs.from);
93
+
94
+ const pushname = stanza?.attrs?.notify;
95
+
96
+ const key = {
97
+ remoteJid: chatId,
98
+ fromMe,
99
+ id: msgId,
100
+ participant,
101
+ senderLid: stanza?.attrs?.sender_lid,
102
+ senderPn: stanza?.attrs?.sender_pn,
103
+ participantLid: stanza?.attrs?.participant_lid,
104
+ newsletter_server_id: msgType === 'newsletter' ? +stanza.attrs?.server_id : undefined
105
+ };
106
+
107
+ const fullMessage = {
108
+ key,
109
+ messageTimestamp: +stanza.attrs.t,
110
+ pushName: pushname,
111
+ broadcast: isJidBroadcast(from),
112
+ newsletter: isJidNewsletter(from)
113
+ };
114
+
115
+ if (msgType === 'newsletter') {
116
+ fullMessage.newsletter_server_id = +stanza.attrs?.server_id;
117
+ }
118
+
119
+ if (key.fromMe) {
120
+ fullMessage.status = proto.WebMessageInfo.Status.SERVER_ACK;
121
+ }
122
+
123
+ if (!key.fromMe) {
124
+ fullMessage.platform = getDevice(key.id);
125
+ }
126
+
127
+ return {
128
+ fullMessage,
129
+ author,
130
+ sender: msgType === 'chat' ? author : chatId
131
+ };
132
+ }
133
+
134
+ function decryptMessageNode(stanza, meId, meLid, repository, logger) {
135
+ const { fullMessage, author, sender } = decodeMessageNode(stanza, meId, meLid);
136
+ return {
137
+ fullMessage,
138
+ category: stanza.attrs.category,
139
+ author,
140
+ async decrypt() {
141
+ let decryptables = 0;
142
+ if (Array.isArray(stanza.content)) {
143
+ for (const { tag, attrs, content } of stanza.content) {
144
+ if (tag === 'verified_name' && content instanceof Uint8Array) {
145
+ const cert = proto.VerifiedNameCertificate.decode(content);
146
+ const details = proto.VerifiedNameCertificate.Details.decode(cert.details);
147
+ fullMessage.verifiedBizName = details.verifiedName;
148
+ }
149
+
150
+ if (tag === 'multicast' && content instanceof Uint8Array) {
151
+ fullMessage.multicast = true;
152
+ }
153
+
154
+ if (tag === 'meta' && content instanceof Uint8Array) {
155
+ fullMessage.metaInfo = {
156
+ targetID: attrs.target_id
157
+ };
158
+ if (attrs.target_sender_jid) {
159
+ fullMessage.metaInfo.targetSender = jidNormalizedUser(attrs.target_sender_jid);
160
+ }
161
+ }
162
+
163
+ if (tag === 'bot' && content instanceof Uint8Array) {
164
+ if (attrs.edit) {
165
+ fullMessage.botInfo = {
166
+ editType: attrs.edit,
167
+ editTargetID: attrs.edit_target_id,
168
+ editSenderTimestampMS: attrs.sender_timestamp_ms
169
+ };
170
+ }
171
+ }
172
+
173
+ if (tag !== 'enc' && tag !== 'plaintext') {
174
+ continue;
175
+ }
176
+
177
+ if (!(content instanceof Uint8Array)) {
178
+ continue;
179
+ }
180
+
181
+ decryptables += 1;
182
+
183
+ let msgBuffer;
184
+ try {
185
+ const e2eType = tag === 'plaintext' ? 'plaintext' : attrs.type;
186
+ switch (e2eType) {
187
+ case 'skmsg':
188
+ msgBuffer = await repository.decryptGroupMessage({
189
+ group: sender,
190
+ authorJid: author,
191
+ msg: content
192
+ });
193
+ break;
194
+ case 'pkmsg':
195
+ case 'msg':
196
+ const user = isJidUser(sender) ? sender : author;
197
+ msgBuffer = await repository.decryptMessage({
198
+ jid: user,
199
+ type: e2eType,
200
+ ciphertext: content
201
+ });
202
+ break;
203
+ case 'plaintext':
204
+ msgBuffer = content;
205
+ break;
206
+ default:
207
+ throw new Error(`Unknown e2e type: ${e2eType}`);
208
+ }
209
+
210
+ let msg = proto.Message.decode(
211
+ e2eType !== 'plaintext' ? unpadRandomMax16(msgBuffer) : msgBuffer
212
+ );
213
+ msg = msg.deviceSentMessage?.message || msg;
214
+ if (msg.senderKeyDistributionMessage) {
215
+ try {
216
+ await repository.processSenderKeyDistributionMessage({
217
+ authorJid: author,
218
+ item: msg.senderKeyDistributionMessage
219
+ });
220
+ } catch (err) {
221
+ logger.error({ key: fullMessage.key, err }, 'failed to decrypt message');
222
+ }
223
+ }
224
+
225
+ if (fullMessage.message) {
226
+ Object.assign(fullMessage.message, msg);
227
+ } else {
228
+ fullMessage.message = msg;
229
+ }
230
+ } catch (err) {
231
+ logger.error({ key: fullMessage.key, err }, 'failed to decrypt message');
232
+ fullMessage.messageStubType = proto.WebMessageInfo.StubType.CIPHERTEXT;
233
+ fullMessage.messageStubParameters = [err.message];
234
+ }
235
+ }
236
+ }
237
+
238
+ if (!decryptables) {
239
+ fullMessage.messageStubType = proto.WebMessageInfo.StubType.CIPHERTEXT;
240
+ fullMessage.messageStubParameters = [NO_MESSAGE_FOUND_ERROR_TEXT];
241
+ }
242
+ }
243
+ };
244
+ }
245
+
246
+ module.exports = {
247
+ decodeMessageNode,
248
+ decryptMessageNode,
249
+ NO_MESSAGE_FOUND_ERROR_TEXT,
250
+ MISSING_KEYS_ERROR_TEXT,
251
+ NACK_REASONS
252
+ };
@@ -0,0 +1,232 @@
1
+ "use strict"
2
+ Object.defineProperty(exports, "__esModule", { value: true })
3
+ const boom_1 = require("@hapi/boom")
4
+ const WAProto_1 = require("../../WAProto")
5
+ const WABinary_1 = require("../WABinary")
6
+ const generics_1 = require("./generics")
7
+ const messages_1 = require("./messages")
8
+ const NO_MESSAGE_FOUND_ERROR_TEXT = 'Message absent from node'
9
+ const MISSING_KEYS_ERROR_TEXT = 'Key used already or never filled'
10
+ const NACK_REASONS = {
11
+ ParsingError: 487,
12
+ UnrecognizedStanza: 488,
13
+ UnrecognizedStanzaClass: 489,
14
+ UnrecognizedStanzaType: 490,
15
+ InvalidProtobuf: 491,
16
+ InvalidHostedCompanionStanza: 493,
17
+ MissingMessageSecret: 495,
18
+ SignalErrorOldCounter: 496,
19
+ MessageDeletedOnPeer: 499,
20
+ UnhandledError: 500,
21
+ UnsupportedAdminRevoke: 550,
22
+ UnsupportedLIDGroup: 551,
23
+ DBOperationFailed: 552
24
+ }
25
+ /**
26
+ * Decode the received node as a message.
27
+ * @note this will only parse the message, not decrypt it
28
+ */
29
+ function decodeMessageNode(stanza, meId, meLid) {
30
+ let msgType
31
+ let chatId
32
+ let author
33
+ const msgId = stanza.attrs.id
34
+ const from = stanza.attrs.from
35
+ const participant = stanza.attrs.participant
36
+ const recipient = stanza.attrs.recipient
37
+ const isMe = (jid) => WABinary_1.areJidsSameUser(jid, meId)
38
+ const isMeLid = (jid) => WABinary_1.areJidsSameUser(jid, meLid)
39
+ if (WABinary_1.isJidUser(from)) {
40
+ if (recipient) {
41
+ if (!isMe(from)) {
42
+ throw new boom_1.Boom('receipient present, but msg not from me', { data: stanza })
43
+ }
44
+ chatId = recipient
45
+ }
46
+ else {
47
+ chatId = from
48
+ }
49
+ msgType = 'chat'
50
+ author = from
51
+ }
52
+ else if (WABinary_1.isLidUser(from)) {
53
+ if (recipient) {
54
+ if (!isMeLid(from)) {
55
+ throw new boom_1.Boom('receipient present, but msg not from me', { data: stanza })
56
+ }
57
+ chatId = recipient
58
+ }
59
+ else {
60
+ chatId = from
61
+ }
62
+ msgType = 'chat'
63
+ author = from
64
+ }
65
+ else if (WABinary_1.isJidGroup(from)) {
66
+ if (!participant) {
67
+ throw new boom_1.Boom('No participant in group message')
68
+ }
69
+ msgType = 'group'
70
+ author = participant
71
+ chatId = from
72
+ }
73
+ else if (WABinary_1.isJidBroadcast(from)) {
74
+ if (!participant) {
75
+ throw new boom_1.Boom('No participant in group message')
76
+ }
77
+ const isParticipantMe = isMe(participant)
78
+ if (WABinary_1.isJidStatusBroadcast(from)) {
79
+ msgType = isParticipantMe ? 'direct_peer_status' : 'other_status'
80
+ }
81
+ else {
82
+ msgType = isParticipantMe ? 'peer_broadcast' : 'other_broadcast'
83
+ }
84
+ chatId = from
85
+ author = participant
86
+ }
87
+ else if (WABinary_1.isJidNewsletter(from)) {
88
+ msgType = 'newsletter'
89
+ chatId = from
90
+ author = from
91
+ }
92
+ else {
93
+ throw new boom_1.Boom('Unknown message type', { data: stanza })
94
+ }
95
+ const fromMe = WABinary_1.isJidNewsletter(from) ? !!stanza.attrs?.is_sender : WABinary_1.isLidUser(from) ? isMeLid(stanza.attrs.participant || stanza.attrs.from) : isMe(stanza.attrs.participant || stanza.attrs.from)
96
+ const pushname = stanza?.attrs?.notify
97
+ const key = {
98
+ remoteJid: chatId,
99
+ fromMe,
100
+ id: msgId,
101
+ participant
102
+ }
103
+ const fullMessage = {
104
+ key,
105
+ messageTimestamp: +stanza.attrs.t,
106
+ pushName: pushname,
107
+ broadcast: WABinary_1.isJidBroadcast(from),
108
+ newsletter: WABinary_1.isJidNewsletter(from)
109
+ }
110
+ if (msgType === 'newsletter') {
111
+ fullMessage.newsletter_server_id = +stanza.attrs?.server_id
112
+ }
113
+ if (key.fromMe) {
114
+ fullMessage.status = WAProto_1.proto.WebMessageInfo.Status.SERVER_ACK
115
+ }
116
+ if (!key.fromMe) {
117
+ fullMessage.platform = messages_1.getDevice(key.id)
118
+ }
119
+ return {
120
+ fullMessage,
121
+ author,
122
+ sender: msgType === 'chat' ? author : chatId
123
+ }
124
+ }
125
+ const decryptMessageNode = (stanza, meId, meLid, repository, logger) => {
126
+ const { fullMessage, author, sender } = decodeMessageNode(stanza, meId, meLid)
127
+ return {
128
+ fullMessage,
129
+ category: stanza.attrs.category,
130
+ author,
131
+ async decrypt() {
132
+ let decryptables = 0
133
+ if (Array.isArray(stanza.content)) {
134
+ for (const { tag, attrs, content } of stanza.content) {
135
+ if (tag === 'verified_name' && content instanceof Uint8Array) {
136
+ const cert = WAProto_1.proto.VerifiedNameCertificate.decode(content)
137
+ const details = WAProto_1.proto.VerifiedNameCertificate.Details.decode(cert.details)
138
+ fullMessage.verifiedBizName = details.verifiedName
139
+ }
140
+ if (tag === 'multicast' && content instanceof Uint8Array) {
141
+ fullMessage.multicast = true
142
+ }
143
+ if (tag === 'meta' && content instanceof Uint8Array) {
144
+ fullMessage.metaInfo = {
145
+ targetID: attrs.target_id
146
+ }
147
+ if (attrs.target_sender_jid) {
148
+ fullMessage.metaInfo.targetSender = WABinary_1.jidNormalizedUser(attrs.target_sender_jid)
149
+ }
150
+ }
151
+ if (tag === 'bot' && content instanceof Uint8Array) {
152
+ if (attrs.edit) {
153
+ fullMessage.botInfo = {
154
+ editType: attrs.edit,
155
+ editTargetID: attrs.edit_target_id,
156
+ editSenderTimestampMS: attrs.sender_timestamp_ms
157
+ }
158
+ }
159
+ }
160
+ if (tag !== 'enc' && tag !== 'plaintext') {
161
+ continue
162
+ }
163
+ if (!(content instanceof Uint8Array)) {
164
+ continue
165
+ }
166
+ decryptables += 1
167
+ let msgBuffer
168
+ try {
169
+ const e2eType = tag === 'plaintext' ? 'plaintext' : attrs.type
170
+ switch (e2eType) {
171
+ case 'skmsg':
172
+ msgBuffer = await repository.decryptGroupMessage({
173
+ group: sender,
174
+ authorJid: author,
175
+ msg: content
176
+ })
177
+ break
178
+ case 'pkmsg':
179
+ case 'msg':
180
+ const user = WABinary_1.isJidUser(sender) ? sender : author
181
+ msgBuffer = await repository.decryptMessage({
182
+ jid: user,
183
+ type: e2eType,
184
+ ciphertext: content
185
+ })
186
+ break
187
+ case 'plaintext':
188
+ msgBuffer = content
189
+ break
190
+ default:
191
+ throw new Error(`Unknown e2e type: ${e2eType}`)
192
+ }
193
+ let msg = WAProto_1.proto.Message.decode(e2eType !== 'plaintext' ? generics_1.unpadRandomMax16(msgBuffer) : msgBuffer)
194
+ msg = msg.deviceSentMessage?.message || msg
195
+ if (msg.senderKeyDistributionMessage) {
196
+ //eslint-disable-next-line max-depth
197
+ try {
198
+ await repository.processSenderKeyDistributionMessage({
199
+ authorJid: author,
200
+ item: msg.senderKeyDistributionMessage
201
+ })
202
+ }
203
+ catch (err) {
204
+ logger.error({ key: fullMessage.key, err }, 'failed to decrypt message')
205
+ }
206
+ }
207
+ if (fullMessage.message) {
208
+ Object.assign(fullMessage.message, msg)
209
+ }
210
+ else {
211
+ fullMessage.message = msg
212
+ }
213
+ }
214
+ catch (err) {
215
+ logger.error({ key: fullMessage.key, err }, 'failed to decrypt message')
216
+ fullMessage.messageStubType = WAProto_1.proto.WebMessageInfo.StubType.CIPHERTEXT
217
+ fullMessage.messageStubParameters = [err.message]
218
+ }
219
+ }
220
+ }
221
+ // if nothing was found to decrypt
222
+ if (!decryptables) {
223
+ fullMessage.messageStubType = WAProto_1.proto.WebMessageInfo.StubType.CIPHERTEXT
224
+ fullMessage.messageStubParameters = [NO_MESSAGE_FOUND_ERROR_TEXT]
225
+ }
226
+ }
227
+ }
228
+ }
229
+ module.exports = {
230
+ decodeMessageNode,
231
+ decryptMessageNode
232
+ }