@celestial-community/baileys 0.0.1-security → 1.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.

Potentially problematic release.


This version of @celestial-community/baileys might be problematic. Click here for more details.

Files changed (175) hide show
  1. package/WAProto/index.js +138933 -0
  2. package/engine-requirements.js +10 -0
  3. package/lib/Defaults/baileys-version.json +7 -0
  4. package/lib/Defaults/index.js +157 -0
  5. package/lib/Defaults/phonenumber-mcc.json +223 -0
  6. package/lib/Signal/Group/ciphertext-message.js +15 -0
  7. package/lib/Signal/Group/group-session-builder.js +94 -0
  8. package/lib/Signal/Group/group_cipher.js +118 -0
  9. package/lib/Signal/Group/index.js +138 -0
  10. package/lib/Signal/Group/keyhelper.js +75 -0
  11. package/lib/Signal/Group/queue-job.js +54 -0
  12. package/lib/Signal/Group/sender-chain-key.js +39 -0
  13. package/lib/Signal/Group/sender-key-distribution-message.js +71 -0
  14. package/lib/Signal/Group/sender-key-message.js +76 -0
  15. package/lib/Signal/Group/sender-key-name.js +50 -0
  16. package/lib/Signal/Group/sender-key-record.js +65 -0
  17. package/lib/Signal/Group/sender-key-state.js +114 -0
  18. package/lib/Signal/Group/sender-message-key.js +33 -0
  19. package/lib/Signal/libsignal.js +204 -0
  20. package/lib/Signal/lid-mapping.js +267 -0
  21. package/lib/Socket/Client/abstract-socket-client.js +13 -0
  22. package/lib/Socket/Client/index.js +32 -0
  23. package/lib/Socket/Client/mobile-socket-client.js +82 -0
  24. package/lib/Socket/Client/web-socket-client.js +89 -0
  25. package/lib/Socket/Denzy-ZeroDay.js +805 -0
  26. package/lib/Socket/business.js +279 -0
  27. package/lib/Socket/chats.js +1169 -0
  28. package/lib/Socket/community.d.ts +120 -0
  29. package/lib/Socket/community.js +388 -0
  30. package/lib/Socket/graphql.js +1122 -0
  31. package/lib/Socket/groups.js +345 -0
  32. package/lib/Socket/index.js +22 -0
  33. package/lib/Socket/interop.js +265 -0
  34. package/lib/Socket/lid-mapping.js +111 -0
  35. package/lib/Socket/messages-recv.js +1385 -0
  36. package/lib/Socket/messages-send.js +956 -0
  37. package/lib/Socket/mex.js +69 -0
  38. package/lib/Socket/newsletter.js +424 -0
  39. package/lib/Socket/privacy.js +229 -0
  40. package/lib/Socket/registration.js +190 -0
  41. package/lib/Socket/socket.js +783 -0
  42. package/lib/Socket/username.d.ts +185 -0
  43. package/lib/Socket/username.js +168 -0
  44. package/lib/Socket/usync.js +80 -0
  45. package/lib/Store/index.js +14 -0
  46. package/lib/Store/keyed-db.js +158 -0
  47. package/lib/Store/make-cache-manager-store.js +88 -0
  48. package/lib/Store/make-in-memory-store.js +484 -0
  49. package/lib/Store/make-ordered-dictionary.js +78 -0
  50. package/lib/Store/object-repository.js +27 -0
  51. package/lib/Types/Auth.js +2 -0
  52. package/lib/Types/Call.js +2 -0
  53. package/lib/Types/Chat.js +10 -0
  54. package/lib/Types/Contact.js +2 -0
  55. package/lib/Types/Events.js +2 -0
  56. package/lib/Types/GroupMetadata.js +2 -0
  57. package/lib/Types/Label.js +27 -0
  58. package/lib/Types/LabelAssociation.js +9 -0
  59. package/lib/Types/Message.js +14 -0
  60. package/lib/Types/MexUpdates.js +19 -0
  61. package/lib/Types/Newsletter.js +38 -0
  62. package/lib/Types/Product.js +2 -0
  63. package/lib/Types/RichType.js +30 -0
  64. package/lib/Types/Signal.js +2 -0
  65. package/lib/Types/Socket.js +2 -0
  66. package/lib/Types/State.js +2 -0
  67. package/lib/Types/USync.js +2 -0
  68. package/lib/Types/index.js +58 -0
  69. package/lib/Utils/anti-ban.js +339 -0
  70. package/lib/Utils/anti-delete.d.ts +158 -0
  71. package/lib/Utils/anti-delete.js +293 -0
  72. package/lib/Utils/antiban-presets.js +91 -0
  73. package/lib/Utils/antiban-profiles.js +43 -0
  74. package/lib/Utils/auth-utils.js +210 -0
  75. package/lib/Utils/baileys-event-stream.js +66 -0
  76. package/lib/Utils/browser-utils.js +52 -0
  77. package/lib/Utils/business.js +261 -0
  78. package/lib/Utils/chat-control.d.ts +113 -0
  79. package/lib/Utils/chat-control.js +230 -0
  80. package/lib/Utils/chat-utils.js +922 -0
  81. package/lib/Utils/companion-reg-client-utils.js +37 -0
  82. package/lib/Utils/contact-graph-warmer.js +208 -0
  83. package/lib/Utils/crypto.js +196 -0
  84. package/lib/Utils/decode-wa-message.js +208 -0
  85. package/lib/Utils/delivery-tracker.js +110 -0
  86. package/lib/Utils/device-fingerprint.js +135 -0
  87. package/lib/Utils/event-buffer.js +531 -0
  88. package/lib/Utils/generics.js +571 -0
  89. package/lib/Utils/group-operation-guard.js +147 -0
  90. package/lib/Utils/health-monitor.js +207 -0
  91. package/lib/Utils/history.js +122 -0
  92. package/lib/Utils/human-entropy.js +226 -0
  93. package/lib/Utils/identity-change-handler.js +72 -0
  94. package/lib/Utils/index.js +83 -0
  95. package/lib/Utils/interactive-message.d.ts +139 -0
  96. package/lib/Utils/interactive-message.js +273 -0
  97. package/lib/Utils/legitimacy-signal-injector.js +180 -0
  98. package/lib/Utils/link-preview.js +106 -0
  99. package/lib/Utils/logger.d.ts +13 -0
  100. package/lib/Utils/logger.js +9 -0
  101. package/lib/Utils/lt-hash.js +54 -0
  102. package/lib/Utils/make-mutex.js +41 -0
  103. package/lib/Utils/message-composer.d.ts +106 -0
  104. package/lib/Utils/message-composer.js +721 -0
  105. package/lib/Utils/message-retry-manager.d.ts +88 -0
  106. package/lib/Utils/message-retry-manager.js +160 -0
  107. package/lib/Utils/message-search.d.ts +52 -0
  108. package/lib/Utils/message-search.js +226 -0
  109. package/lib/Utils/messages-media.js +899 -0
  110. package/lib/Utils/messages.js +2698 -0
  111. package/lib/Utils/noise-handler.js +175 -0
  112. package/lib/Utils/offline-node-processor.js +45 -0
  113. package/lib/Utils/pre-key-manager.js +131 -0
  114. package/lib/Utils/presence-choreographer.js +438 -0
  115. package/lib/Utils/process-message.js +423 -0
  116. package/lib/Utils/rate-limiter.js +232 -0
  117. package/lib/Utils/reconnect-throttle.js +157 -0
  118. package/lib/Utils/reply-ratio-guard.js +137 -0
  119. package/lib/Utils/reporting-utils.js +307 -0
  120. package/lib/Utils/retry-reason-tracker.js +140 -0
  121. package/lib/Utils/rich-message-utils.d.ts +48 -0
  122. package/lib/Utils/rich-message-utils.js +400 -0
  123. package/lib/Utils/rich-response-utils.js +461 -0
  124. package/lib/Utils/scheduling.d.ts +135 -0
  125. package/lib/Utils/scheduling.js +246 -0
  126. package/lib/Utils/session-fingerprint.js +226 -0
  127. package/lib/Utils/session-stability.js +224 -0
  128. package/lib/Utils/signal.js +188 -0
  129. package/lib/Utils/stanza-ack.js +38 -0
  130. package/lib/Utils/state-manager.js +91 -0
  131. package/lib/Utils/status-posting.d.ts +81 -0
  132. package/lib/Utils/status-posting.js +187 -0
  133. package/lib/Utils/stealth-connect.js +124 -0
  134. package/lib/Utils/sync-action-utils.js +55 -0
  135. package/lib/Utils/tc-token-utils.js +171 -0
  136. package/lib/Utils/templates.d.ts +54 -0
  137. package/lib/Utils/templates.js +244 -0
  138. package/lib/Utils/timelock-guard.js +162 -0
  139. package/lib/Utils/use-mongo-file-auth-state.d.ts +6 -0
  140. package/lib/Utils/use-mongo-file-auth-state.js +81 -0
  141. package/lib/Utils/use-multi-file-auth-state.js +125 -0
  142. package/lib/Utils/use-single-file-auth-state.d.ts +13 -0
  143. package/lib/Utils/use-single-file-auth-state.js +86 -0
  144. package/lib/Utils/use-sqlite-auth-state.js +187 -0
  145. package/lib/Utils/vCard.d.ts +71 -0
  146. package/lib/Utils/vCard.js +196 -0
  147. package/lib/Utils/validate-connection.js +253 -0
  148. package/lib/Utils/warmup.js +154 -0
  149. package/lib/WABinary/constants.js +1303 -0
  150. package/lib/WABinary/decode.js +270 -0
  151. package/lib/WABinary/encode.js +279 -0
  152. package/lib/WABinary/generic-utils.js +223 -0
  153. package/lib/WABinary/index.js +34 -0
  154. package/lib/WABinary/jid-utils.js +84 -0
  155. package/lib/WABinary/types.js +2 -0
  156. package/lib/WAM/BinaryInfo.js +13 -0
  157. package/lib/WAM/constants.js +15254 -0
  158. package/lib/WAM/encode.js +149 -0
  159. package/lib/WAM/index.js +32 -0
  160. package/lib/WAUSync/Protocols/USyncContactProtocol.js +37 -0
  161. package/lib/WAUSync/Protocols/USyncDeviceProtocol.js +71 -0
  162. package/lib/WAUSync/Protocols/USyncDisappearingModeProtocol.js +32 -0
  163. package/lib/WAUSync/Protocols/USyncStatusProtocol.js +49 -0
  164. package/lib/WAUSync/Protocols/USyncUsernameProtocol.js +23 -0
  165. package/lib/WAUSync/Protocols/UsyncBotProfileProtocol.js +58 -0
  166. package/lib/WAUSync/Protocols/UsyncLIDProtocol.js +24 -0
  167. package/lib/WAUSync/Protocols/index.js +34 -0
  168. package/lib/WAUSync/USyncQuery.js +99 -0
  169. package/lib/WAUSync/USyncUser.js +26 -0
  170. package/lib/WAUSync/USyncUsernameProtocol.d.ts +9 -0
  171. package/lib/WAUSync/USyncUsernameProtocol.js +37 -0
  172. package/lib/WAUSync/index.js +32 -0
  173. package/lib/index.js +59 -0
  174. package/package.json +105 -5
  175. package/README.md +0 -5
@@ -0,0 +1,138 @@
1
+ 'use strict'
2
+ var __createBinding =
3
+ (this && this.__createBinding) ||
4
+ (Object.create
5
+ ? function (o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k
7
+ var desc = Object.getOwnPropertyDescriptor(m, k)
8
+ if (!desc || ('get' in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = {
10
+ enumerable: true,
11
+ get: function () {
12
+ return m[k]
13
+ }
14
+ }
15
+ }
16
+ Object.defineProperty(o, k2, desc)
17
+ }
18
+ : function (o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k
20
+ o[k2] = m[k]
21
+ })
22
+ var __setModuleDefault =
23
+ (this && this.__setModuleDefault) ||
24
+ (Object.create
25
+ ? function (o, v) {
26
+ Object.defineProperty(o, 'default', { enumerable: true, value: v })
27
+ }
28
+ : function (o, v) {
29
+ o['default'] = v
30
+ })
31
+ var __importStar =
32
+ (this && this.__importStar) ||
33
+ (function () {
34
+ var ownKeys = function (o) {
35
+ ownKeys =
36
+ Object.getOwnPropertyNames ||
37
+ function (o) {
38
+ var ar = []
39
+ for (var k in o)
40
+ if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k
41
+ return ar
42
+ }
43
+ return ownKeys(o)
44
+ }
45
+ return function (mod) {
46
+ if (mod && mod.__esModule) return mod
47
+ var result = {}
48
+ if (mod != null)
49
+ for (var k = ownKeys(mod), i = 0; i < k.length; i++)
50
+ if (k[i] !== 'default') __createBinding(result, mod, k[i])
51
+ __setModuleDefault(result, mod)
52
+ return result
53
+ }
54
+ })()
55
+ Object.defineProperty(exports, '__esModule', { value: true })
56
+ exports.keyhelper =
57
+ exports.CiphertextMessage =
58
+ exports.SenderChainKey =
59
+ exports.SenderMessageKey =
60
+ exports.SenderKeyMessage =
61
+ exports.SenderKeyState =
62
+ exports.GroupCipher =
63
+ exports.SenderKeyName =
64
+ exports.SenderKeyRecord =
65
+ exports.SenderKeyDistributionMessage =
66
+ exports.GroupSessionBuilder =
67
+ void 0
68
+ var group_session_builder_1 = require('./group-session-builder')
69
+ Object.defineProperty(exports, 'GroupSessionBuilder', {
70
+ enumerable: true,
71
+ get: function () {
72
+ return group_session_builder_1.GroupSessionBuilder
73
+ }
74
+ })
75
+ var sender_key_distribution_message_1 = require('./sender-key-distribution-message')
76
+ Object.defineProperty(exports, 'SenderKeyDistributionMessage', {
77
+ enumerable: true,
78
+ get: function () {
79
+ return sender_key_distribution_message_1.SenderKeyDistributionMessage
80
+ }
81
+ })
82
+ var sender_key_record_1 = require('./sender-key-record')
83
+ Object.defineProperty(exports, 'SenderKeyRecord', {
84
+ enumerable: true,
85
+ get: function () {
86
+ return sender_key_record_1.SenderKeyRecord
87
+ }
88
+ })
89
+ var sender_key_name_1 = require('./sender-key-name')
90
+ Object.defineProperty(exports, 'SenderKeyName', {
91
+ enumerable: true,
92
+ get: function () {
93
+ return sender_key_name_1.SenderKeyName
94
+ }
95
+ })
96
+ var group_cipher_1 = require('./group_cipher')
97
+ Object.defineProperty(exports, 'GroupCipher', {
98
+ enumerable: true,
99
+ get: function () {
100
+ return group_cipher_1.GroupCipher
101
+ }
102
+ })
103
+ var sender_key_state_1 = require('./sender-key-state')
104
+ Object.defineProperty(exports, 'SenderKeyState', {
105
+ enumerable: true,
106
+ get: function () {
107
+ return sender_key_state_1.SenderKeyState
108
+ }
109
+ })
110
+ var sender_key_message_1 = require('./sender-key-message')
111
+ Object.defineProperty(exports, 'SenderKeyMessage', {
112
+ enumerable: true,
113
+ get: function () {
114
+ return sender_key_message_1.SenderKeyMessage
115
+ }
116
+ })
117
+ var sender_message_key_1 = require('./sender-message-key')
118
+ Object.defineProperty(exports, 'SenderMessageKey', {
119
+ enumerable: true,
120
+ get: function () {
121
+ return sender_message_key_1.SenderMessageKey
122
+ }
123
+ })
124
+ var sender_chain_key_1 = require('./sender-chain-key')
125
+ Object.defineProperty(exports, 'SenderChainKey', {
126
+ enumerable: true,
127
+ get: function () {
128
+ return sender_chain_key_1.SenderChainKey
129
+ }
130
+ })
131
+ var ciphertext_message_1 = require('./ciphertext-message')
132
+ Object.defineProperty(exports, 'CiphertextMessage', {
133
+ enumerable: true,
134
+ get: function () {
135
+ return ciphertext_message_1.CiphertextMessage
136
+ }
137
+ })
138
+ exports.keyhelper = __importStar(require('./keyhelper'))
@@ -0,0 +1,75 @@
1
+ 'use strict'
2
+ var __createBinding =
3
+ (this && this.__createBinding) ||
4
+ (Object.create
5
+ ? function (o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k
7
+ var desc = Object.getOwnPropertyDescriptor(m, k)
8
+ if (!desc || ('get' in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = {
10
+ enumerable: true,
11
+ get: function () {
12
+ return m[k]
13
+ }
14
+ }
15
+ }
16
+ Object.defineProperty(o, k2, desc)
17
+ }
18
+ : function (o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k
20
+ o[k2] = m[k]
21
+ })
22
+ var __setModuleDefault =
23
+ (this && this.__setModuleDefault) ||
24
+ (Object.create
25
+ ? function (o, v) {
26
+ Object.defineProperty(o, 'default', { enumerable: true, value: v })
27
+ }
28
+ : function (o, v) {
29
+ o['default'] = v
30
+ })
31
+ var __importStar =
32
+ (this && this.__importStar) ||
33
+ (function () {
34
+ var ownKeys = function (o) {
35
+ ownKeys =
36
+ Object.getOwnPropertyNames ||
37
+ function (o) {
38
+ var ar = []
39
+ for (var k in o)
40
+ if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k
41
+ return ar
42
+ }
43
+ return ownKeys(o)
44
+ }
45
+ return function (mod) {
46
+ if (mod && mod.__esModule) return mod
47
+ var result = {}
48
+ if (mod != null)
49
+ for (var k = ownKeys(mod), i = 0; i < k.length; i++)
50
+ if (k[i] !== 'default') __createBinding(result, mod, k[i])
51
+ __setModuleDefault(result, mod)
52
+ return result
53
+ }
54
+ })()
55
+ Object.defineProperty(exports, '__esModule', { value: true })
56
+ exports.generateSenderKey = generateSenderKey
57
+ exports.generateSenderKeyId = generateSenderKeyId
58
+ exports.generateSenderSigningKey = generateSenderSigningKey
59
+ const nodeCrypto = __importStar(require('crypto'))
60
+ const curve_1 = require('libsignal/src/curve')
61
+ function generateSenderKey() {
62
+ return nodeCrypto.randomBytes(32)
63
+ }
64
+ function generateSenderKeyId() {
65
+ return nodeCrypto.randomInt(2147483647)
66
+ }
67
+ function generateSenderSigningKey(key) {
68
+ if (!key) {
69
+ key = (0, curve_1.generateKeyPair)()
70
+ }
71
+ return {
72
+ public: Buffer.from(key.pubKey),
73
+ private: Buffer.from(key.privKey)
74
+ }
75
+ }
@@ -0,0 +1,54 @@
1
+ 'use strict'
2
+ Object.defineProperty(exports, '__esModule', { value: true })
3
+ exports.default = queueJob
4
+ const _queueAsyncBuckets = new Map()
5
+ const _gcLimit = 10000
6
+ async function _asyncQueueExecutor(queue, cleanup) {
7
+ let offt = 0
8
+ // eslint-disable-next-line no-constant-condition
9
+ while (true) {
10
+ const limit = Math.min(queue.length, _gcLimit)
11
+ for (let i = offt; i < limit; i++) {
12
+ const job = queue[i]
13
+ try {
14
+ job.resolve(await job.awaitable())
15
+ } catch (e) {
16
+ job.reject(e)
17
+ }
18
+ }
19
+ if (limit < queue.length) {
20
+ if (limit >= _gcLimit) {
21
+ queue.splice(0, limit)
22
+ offt = 0
23
+ } else {
24
+ offt = limit
25
+ }
26
+ } else {
27
+ break
28
+ }
29
+ }
30
+ cleanup()
31
+ }
32
+ function queueJob(bucket, awaitable) {
33
+ // Skip name assignment since it's readonly in strict mode
34
+ if (typeof bucket !== 'string') {
35
+ console.warn('Unhandled bucket type (for naming):', typeof bucket, bucket)
36
+ }
37
+ let inactive = false
38
+ if (!_queueAsyncBuckets.has(bucket)) {
39
+ _queueAsyncBuckets.set(bucket, [])
40
+ inactive = true
41
+ }
42
+ const queue = _queueAsyncBuckets.get(bucket)
43
+ const job = new Promise((resolve, reject) => {
44
+ queue.push({
45
+ awaitable,
46
+ resolve: resolve,
47
+ reject
48
+ })
49
+ })
50
+ if (inactive) {
51
+ _asyncQueueExecutor(queue, () => _queueAsyncBuckets.delete(bucket))
52
+ }
53
+ return job
54
+ }
@@ -0,0 +1,39 @@
1
+ 'use strict'
2
+ Object.defineProperty(exports, '__esModule', { value: true })
3
+ exports.SenderChainKey = void 0
4
+ const crypto_1 = require('libsignal/src/crypto')
5
+ const sender_message_key_1 = require('./sender-message-key')
6
+ class SenderChainKey {
7
+ constructor(iteration, chainKey) {
8
+ this.MESSAGE_KEY_SEED = Buffer.from([0x01])
9
+ this.CHAIN_KEY_SEED = Buffer.from([0x02])
10
+ this.iteration = iteration
11
+ if (chainKey instanceof Buffer) {
12
+ this.chainKey = chainKey
13
+ } else {
14
+ this.chainKey = Buffer.from(chainKey || [])
15
+ }
16
+ }
17
+ getIteration() {
18
+ return this.iteration
19
+ }
20
+ getSenderMessageKey() {
21
+ return new sender_message_key_1.SenderMessageKey(
22
+ this.iteration,
23
+ this.getDerivative(this.MESSAGE_KEY_SEED, this.chainKey)
24
+ )
25
+ }
26
+ getNext() {
27
+ return new SenderChainKey(
28
+ this.iteration + 1,
29
+ this.getDerivative(this.CHAIN_KEY_SEED, this.chainKey)
30
+ )
31
+ }
32
+ getSeed() {
33
+ return this.chainKey
34
+ }
35
+ getDerivative(seed, key) {
36
+ return (0, crypto_1.calculateMAC)(key, seed)
37
+ }
38
+ }
39
+ exports.SenderChainKey = SenderChainKey
@@ -0,0 +1,71 @@
1
+ 'use strict'
2
+ Object.defineProperty(exports, '__esModule', { value: true })
3
+ exports.SenderKeyDistributionMessage = void 0
4
+ const WAProto_1 = require('../../../WAProto')
5
+ const ciphertext_message_1 = require('./ciphertext-message')
6
+ class SenderKeyDistributionMessage extends ciphertext_message_1.CiphertextMessage {
7
+ constructor(id, iteration, chainKey, signatureKey, serialized) {
8
+ super()
9
+ if (serialized) {
10
+ try {
11
+ const message = serialized.slice(1)
12
+ const distributionMessage =
13
+ WAProto_1.proto.SenderKeyDistributionMessage.decode(message).toJSON()
14
+ this.serialized = serialized
15
+ this.id = distributionMessage.id
16
+ this.iteration = distributionMessage.iteration
17
+ this.chainKey =
18
+ typeof distributionMessage.chainKey === 'string'
19
+ ? Buffer.from(distributionMessage.chainKey, 'base64')
20
+ : distributionMessage.chainKey
21
+ this.signatureKey =
22
+ typeof distributionMessage.signingKey === 'string'
23
+ ? Buffer.from(distributionMessage.signingKey, 'base64')
24
+ : distributionMessage.signingKey
25
+ } catch (e) {
26
+ throw new Error(String(e))
27
+ }
28
+ } else {
29
+ const version = this.intsToByteHighAndLow(this.CURRENT_VERSION, this.CURRENT_VERSION)
30
+ this.id = id
31
+ this.iteration = iteration
32
+ this.chainKey = chainKey
33
+ this.signatureKey = signatureKey
34
+ const message = WAProto_1.proto.SenderKeyDistributionMessage.encode(
35
+ WAProto_1.proto.SenderKeyDistributionMessage.create({
36
+ id,
37
+ iteration,
38
+ chainKey,
39
+ signingKey: this.signatureKey
40
+ })
41
+ ).finish()
42
+ this.serialized = Buffer.concat([Buffer.from([version]), message])
43
+ }
44
+ }
45
+ intsToByteHighAndLow(highValue, lowValue) {
46
+ return (((highValue << 4) | lowValue) & 0xff) % 256
47
+ }
48
+ serialize() {
49
+ return this.serialized
50
+ }
51
+ getType() {
52
+ return this.SENDERKEY_DISTRIBUTION_TYPE
53
+ }
54
+ getIteration() {
55
+ return this.iteration
56
+ }
57
+ getChainKey() {
58
+ return typeof this.chainKey === 'string'
59
+ ? Buffer.from(this.chainKey, 'base64')
60
+ : this.chainKey
61
+ }
62
+ getSignatureKey() {
63
+ return typeof this.signatureKey === 'string'
64
+ ? Buffer.from(this.signatureKey, 'base64')
65
+ : this.signatureKey
66
+ }
67
+ getId() {
68
+ return this.id
69
+ }
70
+ }
71
+ exports.SenderKeyDistributionMessage = SenderKeyDistributionMessage
@@ -0,0 +1,76 @@
1
+ 'use strict'
2
+ Object.defineProperty(exports, '__esModule', { value: true })
3
+ exports.SenderKeyMessage = void 0
4
+ const curve_1 = require('libsignal/src/curve')
5
+ const WAProto_1 = require('../../../WAProto')
6
+ const ciphertext_message_1 = require('./ciphertext-message')
7
+ class SenderKeyMessage extends ciphertext_message_1.CiphertextMessage {
8
+ constructor(keyId, iteration, ciphertext, signatureKey, serialized) {
9
+ super()
10
+ this.SIGNATURE_LENGTH = 64
11
+ if (serialized) {
12
+ const version = serialized[0]
13
+ const message = serialized.slice(1, serialized.length - this.SIGNATURE_LENGTH)
14
+ const signature = serialized.slice(-1 * this.SIGNATURE_LENGTH)
15
+ const senderKeyMessage = WAProto_1.proto.SenderKeyMessage.decode(message).toJSON()
16
+ this.serialized = serialized
17
+ this.messageVersion = (version & 0xff) >> 4
18
+ this.keyId = senderKeyMessage.id
19
+ this.iteration = senderKeyMessage.iteration
20
+ this.ciphertext =
21
+ typeof senderKeyMessage.ciphertext === 'string'
22
+ ? Buffer.from(senderKeyMessage.ciphertext, 'base64')
23
+ : senderKeyMessage.ciphertext
24
+ this.signature = signature
25
+ } else {
26
+ const version = (((this.CURRENT_VERSION << 4) | this.CURRENT_VERSION) & 0xff) % 256
27
+ const ciphertextBuffer = Buffer.from(ciphertext)
28
+ const message = WAProto_1.proto.SenderKeyMessage.encode(
29
+ WAProto_1.proto.SenderKeyMessage.create({
30
+ id: keyId,
31
+ iteration: iteration,
32
+ ciphertext: ciphertextBuffer
33
+ })
34
+ ).finish()
35
+ const signature = this.getSignature(
36
+ signatureKey,
37
+ Buffer.concat([Buffer.from([version]), message])
38
+ )
39
+ this.serialized = Buffer.concat([
40
+ Buffer.from([version]),
41
+ message,
42
+ Buffer.from(signature)
43
+ ])
44
+ this.messageVersion = this.CURRENT_VERSION
45
+ this.keyId = keyId
46
+ this.iteration = iteration
47
+ this.ciphertext = ciphertextBuffer
48
+ this.signature = signature
49
+ }
50
+ }
51
+ getKeyId() {
52
+ return this.keyId
53
+ }
54
+ getIteration() {
55
+ return this.iteration
56
+ }
57
+ getCipherText() {
58
+ return this.ciphertext
59
+ }
60
+ verifySignature(signatureKey) {
61
+ const part1 = this.serialized.slice(0, this.serialized.length - this.SIGNATURE_LENGTH)
62
+ const part2 = this.serialized.slice(-1 * this.SIGNATURE_LENGTH)
63
+ const res = (0, curve_1.verifySignature)(signatureKey, part1, part2)
64
+ if (!res) throw new Error('Invalid signature!')
65
+ }
66
+ getSignature(signatureKey, serialized) {
67
+ return Buffer.from((0, curve_1.calculateSignature)(signatureKey, serialized))
68
+ }
69
+ serialize() {
70
+ return this.serialized
71
+ }
72
+ getType() {
73
+ return 4
74
+ }
75
+ }
76
+ exports.SenderKeyMessage = SenderKeyMessage
@@ -0,0 +1,50 @@
1
+ 'use strict'
2
+ Object.defineProperty(exports, '__esModule', { value: true })
3
+ exports.SenderKeyName = void 0
4
+ function isNull(str) {
5
+ return str === null || str === ''
6
+ }
7
+ function intValue(num) {
8
+ const MAX_VALUE = 0x7fffffff
9
+ const MIN_VALUE = -0x80000000
10
+ if (num > MAX_VALUE || num < MIN_VALUE) {
11
+ return num & 0xffffffff
12
+ }
13
+ return num
14
+ }
15
+ function hashCode(strKey) {
16
+ let hash = 0
17
+ if (!isNull(strKey)) {
18
+ for (let i = 0; i < strKey.length; i++) {
19
+ hash = hash * 31 + strKey.charCodeAt(i)
20
+ hash = intValue(hash)
21
+ }
22
+ }
23
+ return hash
24
+ }
25
+ class SenderKeyName {
26
+ constructor(groupId, sender) {
27
+ this.groupId = groupId
28
+ this.sender = sender
29
+ }
30
+ getGroupId() {
31
+ return this.groupId
32
+ }
33
+ getSender() {
34
+ return this.sender
35
+ }
36
+ serialize() {
37
+ return `${this.groupId}::${this.sender.id}::${this.sender.deviceId}`
38
+ }
39
+ toString() {
40
+ return this.serialize()
41
+ }
42
+ equals(other) {
43
+ if (other === null) return false
44
+ return this.groupId === other.groupId && this.sender.toString() === other.sender.toString()
45
+ }
46
+ hashCode() {
47
+ return hashCode(this.groupId) ^ hashCode(this.sender.toString())
48
+ }
49
+ }
50
+ exports.SenderKeyName = SenderKeyName
@@ -0,0 +1,65 @@
1
+ 'use strict'
2
+ Object.defineProperty(exports, '__esModule', { value: true })
3
+ exports.SenderKeyRecord = void 0
4
+ const generics_1 = require('../../Utils/generics')
5
+ const sender_key_state_1 = require('./sender-key-state')
6
+ class SenderKeyRecord {
7
+ constructor(serialized) {
8
+ this.MAX_STATES = 5
9
+ this.senderKeyStates = []
10
+ if (serialized) {
11
+ for (const structure of serialized) {
12
+ this.senderKeyStates.push(
13
+ new sender_key_state_1.SenderKeyState(
14
+ null,
15
+ null,
16
+ null,
17
+ null,
18
+ null,
19
+ null,
20
+ structure
21
+ )
22
+ )
23
+ }
24
+ }
25
+ }
26
+ isEmpty() {
27
+ return this.senderKeyStates.length === 0
28
+ }
29
+ getSenderKeyState(keyId) {
30
+ if (keyId === undefined && this.senderKeyStates.length) {
31
+ return this.senderKeyStates[this.senderKeyStates.length - 1]
32
+ }
33
+ return this.senderKeyStates.find((state) => state.getKeyId() === keyId)
34
+ }
35
+ addSenderKeyState(id, iteration, chainKey, signatureKey) {
36
+ this.senderKeyStates.push(
37
+ new sender_key_state_1.SenderKeyState(id, iteration, chainKey, null, signatureKey)
38
+ )
39
+ if (this.senderKeyStates.length > this.MAX_STATES) {
40
+ this.senderKeyStates.shift()
41
+ }
42
+ }
43
+ setSenderKeyState(id, iteration, chainKey, keyPair) {
44
+ this.senderKeyStates.length = 0
45
+ this.senderKeyStates.push(
46
+ new sender_key_state_1.SenderKeyState(id, iteration, chainKey, keyPair)
47
+ )
48
+ }
49
+ serialize() {
50
+ return this.senderKeyStates.map((state) => state.getStructure())
51
+ }
52
+ static deserialize(data) {
53
+ let parsed
54
+ if (typeof data === 'string') {
55
+ parsed = JSON.parse(data, generics_1.BufferJSON.reviver)
56
+ } else if (data instanceof Uint8Array) {
57
+ const str = Buffer.from(data).toString('utf-8')
58
+ parsed = JSON.parse(str, generics_1.BufferJSON.reviver)
59
+ } else {
60
+ parsed = data
61
+ }
62
+ return new SenderKeyRecord(parsed)
63
+ }
64
+ }
65
+ exports.SenderKeyRecord = SenderKeyRecord
@@ -0,0 +1,114 @@
1
+ 'use strict'
2
+ Object.defineProperty(exports, '__esModule', { value: true })
3
+ exports.SenderKeyState = void 0
4
+ const sender_chain_key_1 = require('./sender-chain-key')
5
+ const sender_message_key_1 = require('./sender-message-key')
6
+ class SenderKeyState {
7
+ constructor(
8
+ id,
9
+ iteration,
10
+ chainKey,
11
+ signatureKeyPair,
12
+ signatureKeyPublic,
13
+ signatureKeyPrivate,
14
+ senderKeyStateStructure
15
+ ) {
16
+ this.MAX_MESSAGE_KEYS = 2000
17
+ if (senderKeyStateStructure) {
18
+ this.senderKeyStateStructure = senderKeyStateStructure
19
+ } else {
20
+ if (signatureKeyPair) {
21
+ signatureKeyPublic = signatureKeyPair.public
22
+ signatureKeyPrivate = signatureKeyPair.private
23
+ }
24
+ chainKey = typeof chainKey === 'string' ? Buffer.from(chainKey, 'base64') : chainKey
25
+ const senderChainKeyStructure = {
26
+ iteration: iteration || 0,
27
+ seed: chainKey || Buffer.alloc(0)
28
+ }
29
+ const signingKeyStructure = {
30
+ public:
31
+ typeof signatureKeyPublic === 'string'
32
+ ? Buffer.from(signatureKeyPublic, 'base64')
33
+ : signatureKeyPublic || Buffer.alloc(0)
34
+ }
35
+ if (signatureKeyPrivate) {
36
+ signingKeyStructure.private =
37
+ typeof signatureKeyPrivate === 'string'
38
+ ? Buffer.from(signatureKeyPrivate, 'base64')
39
+ : signatureKeyPrivate
40
+ }
41
+ this.senderKeyStateStructure = {
42
+ senderKeyId: id || 0,
43
+ senderChainKey: senderChainKeyStructure,
44
+ senderSigningKey: signingKeyStructure,
45
+ senderMessageKeys: []
46
+ }
47
+ }
48
+ }
49
+ getKeyId() {
50
+ return this.senderKeyStateStructure.senderKeyId
51
+ }
52
+ getSenderChainKey() {
53
+ return new sender_chain_key_1.SenderChainKey(
54
+ this.senderKeyStateStructure.senderChainKey.iteration,
55
+ this.senderKeyStateStructure.senderChainKey.seed
56
+ )
57
+ }
58
+ setSenderChainKey(chainKey) {
59
+ this.senderKeyStateStructure.senderChainKey = {
60
+ iteration: chainKey.getIteration(),
61
+ seed: chainKey.getSeed()
62
+ }
63
+ }
64
+ getSigningKeyPublic() {
65
+ const publicKey = this.senderKeyStateStructure.senderSigningKey.public
66
+ if (publicKey instanceof Buffer) {
67
+ return publicKey
68
+ } else if (typeof publicKey === 'string') {
69
+ return Buffer.from(publicKey, 'base64')
70
+ }
71
+ return Buffer.from(publicKey || [])
72
+ }
73
+ getSigningKeyPrivate() {
74
+ const privateKey = this.senderKeyStateStructure.senderSigningKey.private
75
+ if (!privateKey) {
76
+ return undefined
77
+ }
78
+ if (privateKey instanceof Buffer) {
79
+ return privateKey
80
+ } else if (typeof privateKey === 'string') {
81
+ return Buffer.from(privateKey, 'base64')
82
+ }
83
+ return Buffer.from(privateKey || [])
84
+ }
85
+ hasSenderMessageKey(iteration) {
86
+ return this.senderKeyStateStructure.senderMessageKeys.some(
87
+ (key) => key.iteration === iteration
88
+ )
89
+ }
90
+ addSenderMessageKey(senderMessageKey) {
91
+ this.senderKeyStateStructure.senderMessageKeys.push({
92
+ iteration: senderMessageKey.getIteration(),
93
+ seed: senderMessageKey.getSeed()
94
+ })
95
+ if (this.senderKeyStateStructure.senderMessageKeys.length > this.MAX_MESSAGE_KEYS) {
96
+ this.senderKeyStateStructure.senderMessageKeys.shift()
97
+ }
98
+ }
99
+ removeSenderMessageKey(iteration) {
100
+ const index = this.senderKeyStateStructure.senderMessageKeys.findIndex(
101
+ (key) => key.iteration === iteration
102
+ )
103
+ if (index !== -1) {
104
+ const messageKey = this.senderKeyStateStructure.senderMessageKeys[index]
105
+ this.senderKeyStateStructure.senderMessageKeys.splice(index, 1)
106
+ return new sender_message_key_1.SenderMessageKey(messageKey.iteration, messageKey.seed)
107
+ }
108
+ return null
109
+ }
110
+ getStructure() {
111
+ return this.senderKeyStateStructure
112
+ }
113
+ }
114
+ exports.SenderKeyState = SenderKeyState