ts-mls 1.0.2

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 (583) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +196 -0
  3. package/dist/src/IncomingMessageAction.d.ts +10 -0
  4. package/dist/src/IncomingMessageAction.js +2 -0
  5. package/dist/src/IncomingMessageAction.js.map +1 -0
  6. package/dist/src/authenticatedContent.d.ts +32 -0
  7. package/dist/src/authenticatedContent.js +26 -0
  8. package/dist/src/authenticatedContent.js.map +1 -0
  9. package/dist/src/authenticationService.d.ts +7 -0
  10. package/dist/src/authenticationService.js +6 -0
  11. package/dist/src/authenticationService.js.map +1 -0
  12. package/dist/src/capabilities.d.ts +14 -0
  13. package/dist/src/capabilities.js +28 -0
  14. package/dist/src/capabilities.js.map +1 -0
  15. package/dist/src/clientConfig.d.ts +21 -0
  16. package/dist/src/clientConfig.js +13 -0
  17. package/dist/src/clientConfig.js.map +1 -0
  18. package/dist/src/clientState.d.ts +122 -0
  19. package/dist/src/clientState.js +547 -0
  20. package/dist/src/clientState.js.map +1 -0
  21. package/dist/src/codec/number.d.ts +10 -0
  22. package/dist/src/codec/number.js +56 -0
  23. package/dist/src/codec/number.js.map +1 -0
  24. package/dist/src/codec/optional.d.ts +4 -0
  25. package/dist/src/codec/optional.js +20 -0
  26. package/dist/src/codec/optional.js.map +1 -0
  27. package/dist/src/codec/tlsDecoder.d.ts +14 -0
  28. package/dist/src/codec/tlsDecoder.js +78 -0
  29. package/dist/src/codec/tlsDecoder.js.map +1 -0
  30. package/dist/src/codec/tlsEncoder.d.ts +9 -0
  31. package/dist/src/codec/tlsEncoder.js +23 -0
  32. package/dist/src/codec/tlsEncoder.js.map +1 -0
  33. package/dist/src/codec/variableLength.d.ts +11 -0
  34. package/dist/src/codec/variableLength.js +95 -0
  35. package/dist/src/codec/variableLength.js.map +1 -0
  36. package/dist/src/commit.d.ts +10 -0
  37. package/dist/src/commit.js +9 -0
  38. package/dist/src/commit.js.map +1 -0
  39. package/dist/src/contentType.d.ts +12 -0
  40. package/dist/src/contentType.js +12 -0
  41. package/dist/src/contentType.js.map +1 -0
  42. package/dist/src/createCommit.d.ts +32 -0
  43. package/dist/src/createCommit.js +250 -0
  44. package/dist/src/createCommit.js.map +1 -0
  45. package/dist/src/createMessage.d.ts +24 -0
  46. package/dist/src/createMessage.js +32 -0
  47. package/dist/src/createMessage.js.map +1 -0
  48. package/dist/src/credential.d.ts +21 -0
  49. package/dist/src/credential.js +31 -0
  50. package/dist/src/credential.js.map +1 -0
  51. package/dist/src/credentialType.d.ts +11 -0
  52. package/dist/src/credentialType.js +11 -0
  53. package/dist/src/credentialType.js.map +1 -0
  54. package/dist/src/crypto/aead.d.ts +8 -0
  55. package/dist/src/crypto/aead.js +69 -0
  56. package/dist/src/crypto/aead.js.map +1 -0
  57. package/dist/src/crypto/ciphersuite.d.ts +51 -0
  58. package/dist/src/crypto/ciphersuite.js +245 -0
  59. package/dist/src/crypto/ciphersuite.js.map +1 -0
  60. package/dist/src/crypto/hash.d.ts +8 -0
  61. package/dist/src/crypto/hash.js +32 -0
  62. package/dist/src/crypto/hash.js.map +1 -0
  63. package/dist/src/crypto/hpke.d.ts +51 -0
  64. package/dist/src/crypto/hpke.js +109 -0
  65. package/dist/src/crypto/hpke.js.map +1 -0
  66. package/dist/src/crypto/kdf.d.ts +12 -0
  67. package/dist/src/crypto/kdf.js +42 -0
  68. package/dist/src/crypto/kdf.js.map +1 -0
  69. package/dist/src/crypto/kem.d.ts +3 -0
  70. package/dist/src/crypto/kem.js +49 -0
  71. package/dist/src/crypto/kem.js.map +1 -0
  72. package/dist/src/crypto/rng.d.ts +4 -0
  73. package/dist/src/crypto/rng.js +6 -0
  74. package/dist/src/crypto/rng.js.map +1 -0
  75. package/dist/src/crypto/signature.d.ts +12 -0
  76. package/dist/src/crypto/signature.js +127 -0
  77. package/dist/src/crypto/signature.js.map +1 -0
  78. package/dist/src/customCredential.d.ts +2 -0
  79. package/dist/src/customCredential.js +11 -0
  80. package/dist/src/customCredential.js.map +1 -0
  81. package/dist/src/defaultCapabilities.d.ts +2 -0
  82. package/dist/src/defaultCapabilities.js +12 -0
  83. package/dist/src/defaultCapabilities.js.map +1 -0
  84. package/dist/src/defaultExtensionType.d.ts +13 -0
  85. package/dist/src/defaultExtensionType.js +14 -0
  86. package/dist/src/defaultExtensionType.js.map +1 -0
  87. package/dist/src/defaultProposalType.d.ts +15 -0
  88. package/dist/src/defaultProposalType.js +16 -0
  89. package/dist/src/defaultProposalType.js.map +1 -0
  90. package/dist/src/extension.d.ts +18 -0
  91. package/dist/src/extension.js +30 -0
  92. package/dist/src/extension.js.map +1 -0
  93. package/dist/src/externalProposal.d.ts +7 -0
  94. package/dist/src/externalProposal.js +40 -0
  95. package/dist/src/externalProposal.js.map +1 -0
  96. package/dist/src/externalSender.d.ts +9 -0
  97. package/dist/src/externalSender.js +7 -0
  98. package/dist/src/externalSender.js.map +1 -0
  99. package/dist/src/framedContent.d.ts +113 -0
  100. package/dist/src/framedContent.js +131 -0
  101. package/dist/src/framedContent.js.map +1 -0
  102. package/dist/src/grease.d.ts +16 -0
  103. package/dist/src/grease.js +29 -0
  104. package/dist/src/grease.js.map +1 -0
  105. package/dist/src/groupContext.d.ts +19 -0
  106. package/dist/src/groupContext.js +44 -0
  107. package/dist/src/groupContext.js.map +1 -0
  108. package/dist/src/groupInfo.d.ts +26 -0
  109. package/dist/src/groupInfo.js +47 -0
  110. package/dist/src/groupInfo.js.map +1 -0
  111. package/dist/src/groupSecrets.d.ts +10 -0
  112. package/dist/src/groupSecrets.js +8 -0
  113. package/dist/src/groupSecrets.js.map +1 -0
  114. package/dist/src/hpkeCiphertext.d.ts +8 -0
  115. package/dist/src/hpkeCiphertext.js +6 -0
  116. package/dist/src/hpkeCiphertext.js.map +1 -0
  117. package/dist/src/index.d.ts +32 -0
  118. package/dist/src/index.js +24 -0
  119. package/dist/src/index.js.map +1 -0
  120. package/dist/src/keyPackage.d.ts +38 -0
  121. package/dist/src/keyPackage.js +72 -0
  122. package/dist/src/keyPackage.js.map +1 -0
  123. package/dist/src/keyPackageEqualityConfig.d.ts +7 -0
  124. package/dist/src/keyPackageEqualityConfig.js +10 -0
  125. package/dist/src/keyPackageEqualityConfig.js.map +1 -0
  126. package/dist/src/keyRetentionConfig.d.ts +6 -0
  127. package/dist/src/keyRetentionConfig.js +6 -0
  128. package/dist/src/keyRetentionConfig.js.map +1 -0
  129. package/dist/src/keySchedule.d.ts +24 -0
  130. package/dist/src/keySchedule.js +43 -0
  131. package/dist/src/keySchedule.js.map +1 -0
  132. package/dist/src/leafNode.d.ts +78 -0
  133. package/dist/src/leafNode.js +87 -0
  134. package/dist/src/leafNode.js.map +1 -0
  135. package/dist/src/leafNodeSource.d.ts +12 -0
  136. package/dist/src/leafNodeSource.js +12 -0
  137. package/dist/src/leafNodeSource.js.map +1 -0
  138. package/dist/src/lifetime.d.ts +9 -0
  139. package/dist/src/lifetime.js +13 -0
  140. package/dist/src/lifetime.js.map +1 -0
  141. package/dist/src/lifetimeConfig.d.ts +5 -0
  142. package/dist/src/lifetimeConfig.js +5 -0
  143. package/dist/src/lifetimeConfig.js.map +1 -0
  144. package/dist/src/message.d.ts +42 -0
  145. package/dist/src/message.js +45 -0
  146. package/dist/src/message.js.map +1 -0
  147. package/dist/src/messageProtection.d.ts +36 -0
  148. package/dist/src/messageProtection.js +128 -0
  149. package/dist/src/messageProtection.js.map +1 -0
  150. package/dist/src/messageProtectionPublic.d.ts +17 -0
  151. package/dist/src/messageProtectionPublic.js +99 -0
  152. package/dist/src/messageProtectionPublic.js.map +1 -0
  153. package/dist/src/mlsError.d.ts +24 -0
  154. package/dist/src/mlsError.js +49 -0
  155. package/dist/src/mlsError.js.map +1 -0
  156. package/dist/src/nodeType.d.ts +11 -0
  157. package/dist/src/nodeType.js +11 -0
  158. package/dist/src/nodeType.js.map +1 -0
  159. package/dist/src/paddingConfig.d.ts +9 -0
  160. package/dist/src/paddingConfig.js +8 -0
  161. package/dist/src/paddingConfig.js.map +1 -0
  162. package/dist/src/parentHash.d.ts +16 -0
  163. package/dist/src/parentHash.js +103 -0
  164. package/dist/src/parentHash.js.map +1 -0
  165. package/dist/src/parentNode.d.ts +9 -0
  166. package/dist/src/parentNode.js +11 -0
  167. package/dist/src/parentNode.js.map +1 -0
  168. package/dist/src/pathSecrets.d.ts +10 -0
  169. package/dist/src/pathSecrets.js +31 -0
  170. package/dist/src/pathSecrets.js.map +1 -0
  171. package/dist/src/presharedkey.d.ts +51 -0
  172. package/dist/src/presharedkey.js +59 -0
  173. package/dist/src/presharedkey.js.map +1 -0
  174. package/dist/src/privateKeyPath.d.ts +12 -0
  175. package/dist/src/privateKeyPath.js +21 -0
  176. package/dist/src/privateKeyPath.js.map +1 -0
  177. package/dist/src/privateMessage.d.ts +41 -0
  178. package/dist/src/privateMessage.js +114 -0
  179. package/dist/src/privateMessage.js.map +1 -0
  180. package/dist/src/processMessages.d.ts +26 -0
  181. package/dist/src/processMessages.js +196 -0
  182. package/dist/src/processMessages.js.map +1 -0
  183. package/dist/src/proposal.d.ts +97 -0
  184. package/dist/src/proposal.js +91 -0
  185. package/dist/src/proposal.js.map +1 -0
  186. package/dist/src/proposalOrRefType.d.ts +25 -0
  187. package/dist/src/proposalOrRefType.js +31 -0
  188. package/dist/src/proposalOrRefType.js.map +1 -0
  189. package/dist/src/protocolVersion.d.ts +9 -0
  190. package/dist/src/protocolVersion.js +10 -0
  191. package/dist/src/protocolVersion.js.map +1 -0
  192. package/dist/src/pskIndex.d.ts +7 -0
  193. package/dist/src/pskIndex.js +18 -0
  194. package/dist/src/pskIndex.js.map +1 -0
  195. package/dist/src/publicMessage.d.ts +29 -0
  196. package/dist/src/publicMessage.js +71 -0
  197. package/dist/src/publicMessage.js.map +1 -0
  198. package/dist/src/ratchetTree.d.ts +46 -0
  199. package/dist/src/ratchetTree.js +254 -0
  200. package/dist/src/ratchetTree.js.map +1 -0
  201. package/dist/src/requiredCapabilities.d.ts +10 -0
  202. package/dist/src/requiredCapabilities.js +8 -0
  203. package/dist/src/requiredCapabilities.js.map +1 -0
  204. package/dist/src/resumption.d.ts +18 -0
  205. package/dist/src/resumption.js +74 -0
  206. package/dist/src/resumption.js.map +1 -0
  207. package/dist/src/secretTree.d.ts +29 -0
  208. package/dist/src/secretTree.js +137 -0
  209. package/dist/src/secretTree.js.map +1 -0
  210. package/dist/src/sender.d.ts +56 -0
  211. package/dist/src/sender.js +81 -0
  212. package/dist/src/sender.js.map +1 -0
  213. package/dist/src/transcriptHash.d.ts +14 -0
  214. package/dist/src/transcriptHash.js +23 -0
  215. package/dist/src/transcriptHash.js.map +1 -0
  216. package/dist/src/treeHash.d.ts +27 -0
  217. package/dist/src/treeHash.js +70 -0
  218. package/dist/src/treeHash.js.map +1 -0
  219. package/dist/src/treemath.d.ts +14 -0
  220. package/dist/src/treemath.js +87 -0
  221. package/dist/src/treemath.js.map +1 -0
  222. package/dist/src/unappliedProposals.d.ts +7 -0
  223. package/dist/src/unappliedProposals.js +9 -0
  224. package/dist/src/unappliedProposals.js.map +1 -0
  225. package/dist/src/updatePath.d.ts +34 -0
  226. package/dist/src/updatePath.js +163 -0
  227. package/dist/src/updatePath.js.map +1 -0
  228. package/dist/src/util/addToMap.d.ts +1 -0
  229. package/dist/src/util/addToMap.js +6 -0
  230. package/dist/src/util/addToMap.js.map +1 -0
  231. package/dist/src/util/array.d.ts +2 -0
  232. package/dist/src/util/array.js +9 -0
  233. package/dist/src/util/array.js.map +1 -0
  234. package/dist/src/util/byteArray.d.ts +3 -0
  235. package/dist/src/util/byteArray.js +27 -0
  236. package/dist/src/util/byteArray.js.map +1 -0
  237. package/dist/src/util/constantTimeCompare.d.ts +1 -0
  238. package/dist/src/util/constantTimeCompare.js +10 -0
  239. package/dist/src/util/constantTimeCompare.js.map +1 -0
  240. package/dist/src/util/enumHelpers.d.ts +4 -0
  241. package/dist/src/util/enumHelpers.js +28 -0
  242. package/dist/src/util/enumHelpers.js.map +1 -0
  243. package/dist/src/util/repeat.d.ts +1 -0
  244. package/dist/src/util/repeat.js +8 -0
  245. package/dist/src/util/repeat.js.map +1 -0
  246. package/dist/src/welcome.d.ts +29 -0
  247. package/dist/src/welcome.js +46 -0
  248. package/dist/src/welcome.js.map +1 -0
  249. package/dist/src/wireformat.d.ts +13 -0
  250. package/dist/src/wireformat.js +14 -0
  251. package/dist/src/wireformat.js.map +1 -0
  252. package/dist/test/base64.test.d.ts +1 -0
  253. package/dist/test/base64.test.js +87 -0
  254. package/dist/test/base64.test.js.map +1 -0
  255. package/dist/test/codec/authenticatedContent.test.d.ts +1 -0
  256. package/dist/test/codec/authenticatedContent.test.js +38 -0
  257. package/dist/test/codec/authenticatedContent.test.js.map +1 -0
  258. package/dist/test/codec/capabilities.test.d.ts +1 -0
  259. package/dist/test/codec/capabilities.test.js +26 -0
  260. package/dist/test/codec/capabilities.test.js.map +1 -0
  261. package/dist/test/codec/commit.test.d.ts +1 -0
  262. package/dist/test/codec/commit.test.js +15 -0
  263. package/dist/test/codec/commit.test.js.map +1 -0
  264. package/dist/test/codec/composite.test.d.ts +1 -0
  265. package/dist/test/codec/composite.test.js +61 -0
  266. package/dist/test/codec/composite.test.js.map +1 -0
  267. package/dist/test/codec/contentType.test.d.ts +1 -0
  268. package/dist/test/codec/contentType.test.js +12 -0
  269. package/dist/test/codec/contentType.test.js.map +1 -0
  270. package/dist/test/codec/credential.test.d.ts +1 -0
  271. package/dist/test/codec/credential.test.js +17 -0
  272. package/dist/test/codec/credential.test.js.map +1 -0
  273. package/dist/test/codec/credentialType.test.d.ts +1 -0
  274. package/dist/test/codec/credentialType.test.js +12 -0
  275. package/dist/test/codec/credentialType.test.js.map +1 -0
  276. package/dist/test/codec/encryptedGroupSecrets.test.d.ts +1 -0
  277. package/dist/test/codec/encryptedGroupSecrets.test.js +18 -0
  278. package/dist/test/codec/encryptedGroupSecrets.test.js.map +1 -0
  279. package/dist/test/codec/extension.test.d.ts +1 -0
  280. package/dist/test/codec/extension.test.js +20 -0
  281. package/dist/test/codec/extension.test.js.map +1 -0
  282. package/dist/test/codec/extensionType.test.d.ts +1 -0
  283. package/dist/test/codec/extensionType.test.js +12 -0
  284. package/dist/test/codec/extensionType.test.js.map +1 -0
  285. package/dist/test/codec/externalSender.test.d.ts +1 -0
  286. package/dist/test/codec/externalSender.test.js +20 -0
  287. package/dist/test/codec/externalSender.test.js.map +1 -0
  288. package/dist/test/codec/framedContent.test.d.ts +1 -0
  289. package/dist/test/codec/framedContent.test.js +26 -0
  290. package/dist/test/codec/framedContent.test.js.map +1 -0
  291. package/dist/test/codec/groupContext.test.d.ts +1 -0
  292. package/dist/test/codec/groupContext.test.js +30 -0
  293. package/dist/test/codec/groupContext.test.js.map +1 -0
  294. package/dist/test/codec/groupInfo.test.d.ts +1 -0
  295. package/dist/test/codec/groupInfo.test.js +45 -0
  296. package/dist/test/codec/groupInfo.test.js.map +1 -0
  297. package/dist/test/codec/groupSecrets.test.d.ts +1 -0
  298. package/dist/test/codec/groupSecrets.test.js +16 -0
  299. package/dist/test/codec/groupSecrets.test.js.map +1 -0
  300. package/dist/test/codec/hpkeCiphertext.test.d.ts +1 -0
  301. package/dist/test/codec/hpkeCiphertext.test.js +13 -0
  302. package/dist/test/codec/hpkeCiphertext.test.js.map +1 -0
  303. package/dist/test/codec/keyPackage.test.d.ts +1 -0
  304. package/dist/test/codec/keyPackage.test.js +58 -0
  305. package/dist/test/codec/keyPackage.test.js.map +1 -0
  306. package/dist/test/codec/keyPackageTBS.test.d.ts +1 -0
  307. package/dist/test/codec/keyPackageTBS.test.js +59 -0
  308. package/dist/test/codec/keyPackageTBS.test.js.map +1 -0
  309. package/dist/test/codec/leafNode.test.d.ts +1 -0
  310. package/dist/test/codec/leafNode.test.js +43 -0
  311. package/dist/test/codec/leafNode.test.js.map +1 -0
  312. package/dist/test/codec/leafNodeData.test.d.ts +1 -0
  313. package/dist/test/codec/leafNodeData.test.js +36 -0
  314. package/dist/test/codec/leafNodeData.test.js.map +1 -0
  315. package/dist/test/codec/leafNodeSource.test.d.ts +1 -0
  316. package/dist/test/codec/leafNodeSource.test.js +15 -0
  317. package/dist/test/codec/leafNodeSource.test.js.map +1 -0
  318. package/dist/test/codec/lifetime.test.d.ts +1 -0
  319. package/dist/test/codec/lifetime.test.js +12 -0
  320. package/dist/test/codec/lifetime.test.js.map +1 -0
  321. package/dist/test/codec/message.test.d.ts +1 -0
  322. package/dist/test/codec/message.test.js +100 -0
  323. package/dist/test/codec/message.test.js.map +1 -0
  324. package/dist/test/codec/nodeType.test.d.ts +1 -0
  325. package/dist/test/codec/nodeType.test.js +12 -0
  326. package/dist/test/codec/nodeType.test.js.map +1 -0
  327. package/dist/test/codec/number.test.d.ts +1 -0
  328. package/dist/test/codec/number.test.js +74 -0
  329. package/dist/test/codec/number.test.js.map +1 -0
  330. package/dist/test/codec/optional.test.d.ts +1 -0
  331. package/dist/test/codec/optional.test.js +42 -0
  332. package/dist/test/codec/optional.test.js.map +1 -0
  333. package/dist/test/codec/padding.test.d.ts +1 -0
  334. package/dist/test/codec/padding.test.js +40 -0
  335. package/dist/test/codec/padding.test.js.map +1 -0
  336. package/dist/test/codec/parentHash.test.d.ts +1 -0
  337. package/dist/test/codec/parentHash.test.js +13 -0
  338. package/dist/test/codec/parentHash.test.js.map +1 -0
  339. package/dist/test/codec/parentNode.test.d.ts +1 -0
  340. package/dist/test/codec/parentNode.test.js +22 -0
  341. package/dist/test/codec/parentNode.test.js.map +1 -0
  342. package/dist/test/codec/presharedkey.test.d.ts +1 -0
  343. package/dist/test/codec/presharedkey.test.js +35 -0
  344. package/dist/test/codec/presharedkey.test.js.map +1 -0
  345. package/dist/test/codec/privateContentAAD.test.d.ts +1 -0
  346. package/dist/test/codec/privateContentAAD.test.js +30 -0
  347. package/dist/test/codec/privateContentAAD.test.js.map +1 -0
  348. package/dist/test/codec/privateMessage.test.d.ts +1 -0
  349. package/dist/test/codec/privateMessage.test.js +36 -0
  350. package/dist/test/codec/privateMessage.test.js.map +1 -0
  351. package/dist/test/codec/proposal.test.d.ts +1 -0
  352. package/dist/test/codec/proposal.test.js +44 -0
  353. package/dist/test/codec/proposal.test.js.map +1 -0
  354. package/dist/test/codec/proposalOrRef.test.d.ts +1 -0
  355. package/dist/test/codec/proposalOrRef.test.js +12 -0
  356. package/dist/test/codec/proposalOrRef.test.js.map +1 -0
  357. package/dist/test/codec/proposalOrRefType.test.d.ts +1 -0
  358. package/dist/test/codec/proposalOrRefType.test.js +12 -0
  359. package/dist/test/codec/proposalOrRefType.test.js.map +1 -0
  360. package/dist/test/codec/proposalType.test.d.ts +1 -0
  361. package/dist/test/codec/proposalType.test.js +12 -0
  362. package/dist/test/codec/proposalType.test.js.map +1 -0
  363. package/dist/test/codec/protocolVersion.test.d.ts +1 -0
  364. package/dist/test/codec/protocolVersion.test.js +9 -0
  365. package/dist/test/codec/protocolVersion.test.js.map +1 -0
  366. package/dist/test/codec/pskId.test.d.ts +1 -0
  367. package/dist/test/codec/pskId.test.js +18 -0
  368. package/dist/test/codec/pskId.test.js.map +1 -0
  369. package/dist/test/codec/pskInfo.test.d.ts +1 -0
  370. package/dist/test/codec/pskInfo.test.js +12 -0
  371. package/dist/test/codec/pskInfo.test.js.map +1 -0
  372. package/dist/test/codec/pskLabel.test.d.ts +1 -0
  373. package/dist/test/codec/pskLabel.test.js +26 -0
  374. package/dist/test/codec/pskLabel.test.js.map +1 -0
  375. package/dist/test/codec/pskType.test.d.ts +1 -0
  376. package/dist/test/codec/pskType.test.js +12 -0
  377. package/dist/test/codec/pskType.test.js.map +1 -0
  378. package/dist/test/codec/publicMessage.test.d.ts +1 -0
  379. package/dist/test/codec/publicMessage.test.js +39 -0
  380. package/dist/test/codec/publicMessage.test.js.map +1 -0
  381. package/dist/test/codec/ratchetTree.test.d.ts +1 -0
  382. package/dist/test/codec/ratchetTree.test.js +83 -0
  383. package/dist/test/codec/ratchetTree.test.js.map +1 -0
  384. package/dist/test/codec/requiredCapabilities.test.d.ts +1 -0
  385. package/dist/test/codec/requiredCapabilities.test.js +30 -0
  386. package/dist/test/codec/requiredCapabilities.test.js.map +1 -0
  387. package/dist/test/codec/resumptionPSKUsage.test.d.ts +1 -0
  388. package/dist/test/codec/resumptionPSKUsage.test.js +15 -0
  389. package/dist/test/codec/resumptionPSKUsage.test.js.map +1 -0
  390. package/dist/test/codec/reuseGuard.test.d.ts +1 -0
  391. package/dist/test/codec/reuseGuard.test.js +9 -0
  392. package/dist/test/codec/reuseGuard.test.js.map +1 -0
  393. package/dist/test/codec/roundtrip.d.ts +3 -0
  394. package/dist/test/codec/roundtrip.js +8 -0
  395. package/dist/test/codec/roundtrip.js.map +1 -0
  396. package/dist/test/codec/sender.test.d.ts +1 -0
  397. package/dist/test/codec/sender.test.js +18 -0
  398. package/dist/test/codec/sender.test.js.map +1 -0
  399. package/dist/test/codec/senderData.test.d.ts +1 -0
  400. package/dist/test/codec/senderData.test.js +12 -0
  401. package/dist/test/codec/senderData.test.js.map +1 -0
  402. package/dist/test/codec/senderDataAAD.test.d.ts +1 -0
  403. package/dist/test/codec/senderDataAAD.test.js +12 -0
  404. package/dist/test/codec/senderDataAAD.test.js.map +1 -0
  405. package/dist/test/codec/senderType.test.d.ts +1 -0
  406. package/dist/test/codec/senderType.test.js +18 -0
  407. package/dist/test/codec/senderType.test.js.map +1 -0
  408. package/dist/test/codec/transcriptHash.test.d.ts +1 -0
  409. package/dist/test/codec/transcriptHash.test.js +38 -0
  410. package/dist/test/codec/transcriptHash.test.js.map +1 -0
  411. package/dist/test/codec/treeHash.test.d.ts +1 -0
  412. package/dist/test/codec/treeHash.test.js +17 -0
  413. package/dist/test/codec/treeHash.test.js.map +1 -0
  414. package/dist/test/codec/updatePath.test.d.ts +1 -0
  415. package/dist/test/codec/updatePath.test.js +81 -0
  416. package/dist/test/codec/updatePath.test.js.map +1 -0
  417. package/dist/test/codec/updatePathNode.test.d.ts +1 -0
  418. package/dist/test/codec/updatePathNode.test.js +23 -0
  419. package/dist/test/codec/updatePathNode.test.js.map +1 -0
  420. package/dist/test/codec/varLengthEncoding.test.d.ts +1 -0
  421. package/dist/test/codec/varLengthEncoding.test.js +90 -0
  422. package/dist/test/codec/varLengthEncoding.test.js.map +1 -0
  423. package/dist/test/codec/welcome.test.d.ts +1 -0
  424. package/dist/test/codec/welcome.test.js +25 -0
  425. package/dist/test/codec/welcome.test.js.map +1 -0
  426. package/dist/test/codec/wireformat.test.d.ts +1 -0
  427. package/dist/test/codec/wireformat.test.js +21 -0
  428. package/dist/test/codec/wireformat.test.js.map +1 -0
  429. package/dist/test/crypto/aead.test.d.ts +1 -0
  430. package/dist/test/crypto/aead.test.js +44 -0
  431. package/dist/test/crypto/aead.test.js.map +1 -0
  432. package/dist/test/crypto/hpke.test.d.ts +1 -0
  433. package/dist/test/crypto/hpke.test.js +58 -0
  434. package/dist/test/crypto/hpke.test.js.map +1 -0
  435. package/dist/test/crypto/keyMatch.d.ts +7 -0
  436. package/dist/test/crypto/keyMatch.js +22 -0
  437. package/dist/test/crypto/keyMatch.js.map +1 -0
  438. package/dist/test/extensionsEqual.test.d.ts +1 -0
  439. package/dist/test/extensionsEqual.test.js +51 -0
  440. package/dist/test/extensionsEqual.test.js.map +1 -0
  441. package/dist/test/groupinfo.test.d.ts +1 -0
  442. package/dist/test/groupinfo.test.js +40 -0
  443. package/dist/test/groupinfo.test.js.map +1 -0
  444. package/dist/test/scenario/common.d.ts +8 -0
  445. package/dist/test/scenario/common.js +41 -0
  446. package/dist/test/scenario/common.js.map +1 -0
  447. package/dist/test/scenario/customExtensions.test.d.ts +1 -0
  448. package/dist/test/scenario/customExtensions.test.js +56 -0
  449. package/dist/test/scenario/customExtensions.test.js.map +1 -0
  450. package/dist/test/scenario/customProposal.test.d.ts +1 -0
  451. package/dist/test/scenario/customProposal.test.js +71 -0
  452. package/dist/test/scenario/customProposal.test.js.map +1 -0
  453. package/dist/test/scenario/epochOutOfOrder.test.d.ts +1 -0
  454. package/dist/test/scenario/epochOutOfOrder.test.js +162 -0
  455. package/dist/test/scenario/epochOutOfOrder.test.js.map +1 -0
  456. package/dist/test/scenario/externalAddProposal.test.d.ts +1 -0
  457. package/dist/test/scenario/externalAddProposal.test.js +69 -0
  458. package/dist/test/scenario/externalAddProposal.test.js.map +1 -0
  459. package/dist/test/scenario/externalJoin.test.d.ts +1 -0
  460. package/dist/test/scenario/externalJoin.test.js +51 -0
  461. package/dist/test/scenario/externalJoin.test.js.map +1 -0
  462. package/dist/test/scenario/externalJoinResync.test.d.ts +1 -0
  463. package/dist/test/scenario/externalJoinResync.test.js +59 -0
  464. package/dist/test/scenario/externalJoinResync.test.js.map +1 -0
  465. package/dist/test/scenario/externalProposal.test.d.ts +1 -0
  466. package/dist/test/scenario/externalProposal.test.js +69 -0
  467. package/dist/test/scenario/externalProposal.test.js.map +1 -0
  468. package/dist/test/scenario/externalPsk.test.d.ts +1 -0
  469. package/dist/test/scenario/externalPsk.test.js +73 -0
  470. package/dist/test/scenario/externalPsk.test.js.map +1 -0
  471. package/dist/test/scenario/externalPskJoin.test.d.ts +1 -0
  472. package/dist/test/scenario/externalPskJoin.test.js +51 -0
  473. package/dist/test/scenario/externalPskJoin.test.js.map +1 -0
  474. package/dist/test/scenario/generationOutOfOrder.test.d.ts +1 -0
  475. package/dist/test/scenario/generationOutOfOrder.test.js +111 -0
  476. package/dist/test/scenario/generationOutOfOrder.test.js.map +1 -0
  477. package/dist/test/scenario/grease.test.d.ts +1 -0
  478. package/dist/test/scenario/grease.test.js +44 -0
  479. package/dist/test/scenario/grease.test.js.map +1 -0
  480. package/dist/test/scenario/largeGroupFullLifecycle.test.d.ts +1 -0
  481. package/dist/test/scenario/largeGroupFullLifecycle.test.js +127 -0
  482. package/dist/test/scenario/largeGroupFullLifecycle.test.js.map +1 -0
  483. package/dist/test/scenario/leaveProposal.test.d.ts +1 -0
  484. package/dist/test/scenario/leaveProposal.test.js +77 -0
  485. package/dist/test/scenario/leaveProposal.test.js.map +1 -0
  486. package/dist/test/scenario/multipleJoinsAtOnce.test.d.ts +1 -0
  487. package/dist/test/scenario/multipleJoinsAtOnce.test.js +48 -0
  488. package/dist/test/scenario/multipleJoinsAtOnce.test.js.map +1 -0
  489. package/dist/test/scenario/oneToOneJoin.test.d.ts +1 -0
  490. package/dist/test/scenario/oneToOneJoin.test.js +98 -0
  491. package/dist/test/scenario/oneToOneJoin.test.js.map +1 -0
  492. package/dist/test/scenario/ratchetTreeExtension.test.d.ts +1 -0
  493. package/dist/test/scenario/ratchetTreeExtension.test.js +48 -0
  494. package/dist/test/scenario/ratchetTreeExtension.test.js.map +1 -0
  495. package/dist/test/scenario/reinit.test.d.ts +1 -0
  496. package/dist/test/scenario/reinit.test.js +57 -0
  497. package/dist/test/scenario/reinit.test.js.map +1 -0
  498. package/dist/test/scenario/rejectIncomingMessage.test.d.ts +1 -0
  499. package/dist/test/scenario/rejectIncomingMessage.test.js +67 -0
  500. package/dist/test/scenario/rejectIncomingMessage.test.js.map +1 -0
  501. package/dist/test/scenario/remove.test.d.ts +1 -0
  502. package/dist/test/scenario/remove.test.js +68 -0
  503. package/dist/test/scenario/remove.test.js.map +1 -0
  504. package/dist/test/scenario/requiredCapabilites.test.d.ts +1 -0
  505. package/dist/test/scenario/requiredCapabilites.test.js +65 -0
  506. package/dist/test/scenario/requiredCapabilites.test.js.map +1 -0
  507. package/dist/test/scenario/resumption.test.d.ts +1 -0
  508. package/dist/test/scenario/resumption.test.js +43 -0
  509. package/dist/test/scenario/resumption.test.js.map +1 -0
  510. package/dist/test/scenario/threePartyJoin.test.d.ts +1 -0
  511. package/dist/test/scenario/threePartyJoin.test.js +56 -0
  512. package/dist/test/scenario/threePartyJoin.test.js.map +1 -0
  513. package/dist/test/scenario/update.test.d.ts +1 -0
  514. package/dist/test/scenario/update.test.js +50 -0
  515. package/dist/test/scenario/update.test.js.map +1 -0
  516. package/dist/test/test-vectors/cryptoBasics.test.d.ts +1 -0
  517. package/dist/test/test-vectors/cryptoBasics.test.js +60 -0
  518. package/dist/test/test-vectors/cryptoBasics.test.js.map +1 -0
  519. package/dist/test/test-vectors/deserialization.test.d.ts +1 -0
  520. package/dist/test/test-vectors/deserialization.test.js +13 -0
  521. package/dist/test/test-vectors/deserialization.test.js.map +1 -0
  522. package/dist/test/test-vectors/keySchedule.test.d.ts +1 -0
  523. package/dist/test/test-vectors/keySchedule.test.js +48 -0
  524. package/dist/test/test-vectors/keySchedule.test.js.map +1 -0
  525. package/dist/test/test-vectors/messageProtection.test.d.ts +1 -0
  526. package/dist/test/test-vectors/messageProtection.test.js +215 -0
  527. package/dist/test/test-vectors/messageProtection.test.js.map +1 -0
  528. package/dist/test/test-vectors/messages.test.d.ts +1 -0
  529. package/dist/test/test-vectors/messages.test.js +136 -0
  530. package/dist/test/test-vectors/messages.test.js.map +1 -0
  531. package/dist/test/test-vectors/passiveClientScenarios.test.d.ts +1 -0
  532. package/dist/test/test-vectors/passiveClientScenarios.test.js +86 -0
  533. package/dist/test/test-vectors/passiveClientScenarios.test.js.map +1 -0
  534. package/dist/test/test-vectors/pskSecret.test.d.ts +1 -0
  535. package/dist/test/test-vectors/pskSecret.test.js +18 -0
  536. package/dist/test/test-vectors/pskSecret.test.js.map +1 -0
  537. package/dist/test/test-vectors/secretTree.test.d.ts +1 -0
  538. package/dist/test/test-vectors/secretTree.test.js +48 -0
  539. package/dist/test/test-vectors/secretTree.test.js.map +1 -0
  540. package/dist/test/test-vectors/transcriptHashes.test.d.ts +1 -0
  541. package/dist/test/test-vectors/transcriptHashes.test.js +26 -0
  542. package/dist/test/test-vectors/transcriptHashes.test.js.map +1 -0
  543. package/dist/test/test-vectors/treeOperations.test.d.ts +1 -0
  544. package/dist/test/test-vectors/treeOperations.test.js +45 -0
  545. package/dist/test/test-vectors/treeOperations.test.js.map +1 -0
  546. package/dist/test/test-vectors/treeValidation.test.d.ts +1 -0
  547. package/dist/test/test-vectors/treeValidation.test.js +36 -0
  548. package/dist/test/test-vectors/treeValidation.test.js.map +1 -0
  549. package/dist/test/test-vectors/treekem.test.d.ts +1 -0
  550. package/dist/test/test-vectors/treekem.test.js +100 -0
  551. package/dist/test/test-vectors/treekem.test.js.map +1 -0
  552. package/dist/test/test-vectors/treemath.test.d.ts +1 -0
  553. package/dist/test/test-vectors/treemath.test.js +55 -0
  554. package/dist/test/test-vectors/treemath.test.js.map +1 -0
  555. package/dist/test/test-vectors/welcome.test.d.ts +1 -0
  556. package/dist/test/test-vectors/welcome.test.js +40 -0
  557. package/dist/test/test-vectors/welcome.test.js.map +1 -0
  558. package/dist/test/validation/proposalValidation.test.d.ts +1 -0
  559. package/dist/test/validation/proposalValidation.test.js +231 -0
  560. package/dist/test/validation/proposalValidation.test.js.map +1 -0
  561. package/dist/test/validation/ratchetTreeValidation.test.d.ts +1 -0
  562. package/dist/test/validation/ratchetTreeValidation.test.js +51 -0
  563. package/dist/test/validation/ratchetTreeValidation.test.js.map +1 -0
  564. package/dist/test/validation/resumptionValidation.test.d.ts +1 -0
  565. package/dist/test/validation/resumptionValidation.test.js +79 -0
  566. package/dist/test/validation/resumptionValidation.test.js.map +1 -0
  567. package/dist/test_vectors/crypto-basics.json +303 -0
  568. package/dist/test_vectors/deserialization.json +58 -0
  569. package/dist/test_vectors/key-schedule.json +926 -0
  570. package/dist/test_vectors/message-protection.json +142 -0
  571. package/dist/test_vectors/messages.json +5702 -0
  572. package/dist/test_vectors/passive-client-handling-commit.json +2683 -0
  573. package/dist/test_vectors/passive-client-random.json +2657 -0
  574. package/dist/test_vectors/passive-client-welcome.json +814 -0
  575. package/dist/test_vectors/psk_secret.json +2382 -0
  576. package/dist/test_vectors/secret-tree.json +4846 -0
  577. package/dist/test_vectors/transcript-hashes.json +58 -0
  578. package/dist/test_vectors/tree-math.json +8156 -0
  579. package/dist/test_vectors/tree-operations.json +47 -0
  580. package/dist/test_vectors/tree-validation.json +6204 -0
  581. package/dist/test_vectors/treekem.json +14859 -0
  582. package/dist/test_vectors/welcome.json +51 -0
  583. package/package.json +108 -0
@@ -0,0 +1,58 @@
1
+ import { makeHpke } from "../../src/crypto/hpke";
2
+ import { CryptoError } from "../../src/mlsError";
3
+ describe("hpke error handling", () => {
4
+ // Use a minimal valid algorithm config (using a likely supported one)
5
+ const hpkeAlg = {
6
+ kem: "DHKEM-P256-HKDF-SHA256",
7
+ kdf: "HKDF-SHA256",
8
+ aead: "AES128GCM",
9
+ };
10
+ let hpke;
11
+ beforeAll(async () => {
12
+ hpke = await makeHpke(hpkeAlg);
13
+ });
14
+ test("throws CryptoError from open (invalid ciphertext)", async () => {
15
+ await expect(hpke.open({}, new Uint8Array([1]), new Uint8Array([2]), new Uint8Array([3]))).rejects.toThrow(CryptoError);
16
+ });
17
+ test("throws CryptoError from importSecret (invalid kemOutput)", async () => {
18
+ await expect(hpke.importSecret({}, new Uint8Array([1]), new Uint8Array([2]), 16, new Uint8Array([3]))).rejects.toThrow(CryptoError);
19
+ });
20
+ test("throws CryptoError from importPrivateKey (invalid key)", async () => {
21
+ await expect(hpke.importPrivateKey(new Uint8Array([1, 2, 3]))).rejects.toThrow(CryptoError);
22
+ });
23
+ test("throws CryptoError from importPublicKey (invalid key)", async () => {
24
+ await expect(hpke.importPublicKey(new Uint8Array([1, 2, 3]))).rejects.toThrow(CryptoError);
25
+ });
26
+ test("throws CryptoError from decryptAead (invalid key/nonce)", async () => {
27
+ await expect(hpke.decryptAead(new Uint8Array([1]), new Uint8Array([2]), new Uint8Array([3]), new Uint8Array([4]))).rejects.toThrow(CryptoError);
28
+ });
29
+ });
30
+ describe("hpke happy path", () => {
31
+ const hpkeAlg = {
32
+ kem: "DHKEM-P256-HKDF-SHA256",
33
+ kdf: "HKDF-SHA256",
34
+ aead: "AES128GCM",
35
+ };
36
+ let hpke;
37
+ beforeAll(async () => {
38
+ hpke = await makeHpke(hpkeAlg);
39
+ });
40
+ test("can seal and open a message", async () => {
41
+ const { publicKey, privateKey } = await hpke.generateKeyPair();
42
+ const plaintext = new TextEncoder().encode("hello world");
43
+ const info = new TextEncoder().encode("test info");
44
+ const { ct, enc } = await hpke.seal(publicKey, plaintext, info);
45
+ const decrypted = await hpke.open(privateKey, enc, ct, info);
46
+ expect(new TextDecoder().decode(decrypted)).toBe("hello world");
47
+ });
48
+ test("can encrypt and decrypt with AEAD", async () => {
49
+ const key = new Uint8Array(hpke.keyLength);
50
+ const nonce = new Uint8Array(hpke.nonceLength);
51
+ const aad = new TextEncoder().encode("aad");
52
+ const plaintext = new TextEncoder().encode("secret");
53
+ const ciphertext = await hpke.encryptAead(key, nonce, aad, plaintext);
54
+ const decrypted = await hpke.decryptAead(key, nonce, aad, ciphertext);
55
+ expect(new TextDecoder().decode(decrypted)).toBe("secret");
56
+ });
57
+ });
58
+ //# sourceMappingURL=hpke.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hpke.test.js","sourceRoot":"","sources":["../../../test/crypto/hpke.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAEhD,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,sEAAsE;IACtE,MAAM,OAAO,GAAG;QACd,GAAG,EAAE,wBAAwB;QAC7B,GAAG,EAAE,aAAa;QAClB,IAAI,EAAE,WAAW;KACT,CAAA;IAEV,IAAI,IAA0C,CAAA;IAC9C,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAS,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC/G,WAAW,CACZ,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,MAAM,CACV,IAAI,CAAC,YAAY,CAAC,EAAS,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAChG,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IAC7F,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IAC5F,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,MAAM,CACV,IAAI,CAAC,WAAW,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACrG,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,MAAM,OAAO,GAAG;QACd,GAAG,EAAE,wBAAwB;QAC7B,GAAG,EAAE,aAAa;QAClB,IAAI,EAAE,WAAW;KACT,CAAA;IAEV,IAAI,IAA0C,CAAA;IAC9C,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,IAAI,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAA;IAChC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAA;QAC9D,MAAM,SAAS,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;QACzD,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;QAClD,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;QAC/D,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,CAAA;QAC5D,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IACjE,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC1C,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAC9C,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC3C,MAAM,SAAS,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QACpD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,CAAC,CAAA;QACrE,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,CAAC,CAAA;QACrE,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC5D,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,7 @@
1
+ import { ClientState } from "../../src/clientState";
2
+ import { CiphersuiteImpl } from "../../src/crypto/ciphersuite";
3
+ import { Hpke } from "../../src/crypto/hpke";
4
+ import { Signature } from "../../src/crypto/signature";
5
+ export declare function hpkeKeysMatch(publicKey: Uint8Array, privateKey: Uint8Array, hpke: Hpke): Promise<boolean>;
6
+ export declare function signatureKeysMatch(publicKey: Uint8Array, privateKey: Uint8Array, s: Signature): Promise<boolean>;
7
+ export declare function checkHpkeKeysMatch(group: ClientState, impl: CiphersuiteImpl): Promise<void>;
@@ -0,0 +1,22 @@
1
+ import { getHpkePublicKey } from "../../src/ratchetTree";
2
+ export async function hpkeKeysMatch(publicKey, privateKey, hpke) {
3
+ const encoder = new TextEncoder();
4
+ const plaintext = encoder.encode("test");
5
+ const info = encoder.encode("key check");
6
+ const { ct, enc } = await hpke.seal(await hpke.importPublicKey(publicKey), plaintext, info);
7
+ const decrypted = await hpke.open(await hpke.importPrivateKey(privateKey), enc, ct, info);
8
+ return new TextDecoder().decode(decrypted) === "test";
9
+ }
10
+ export async function signatureKeysMatch(publicKey, privateKey, s) {
11
+ const testMessage = new TextEncoder().encode("test");
12
+ const signature = await s.sign(privateKey, testMessage);
13
+ return s.verify(publicKey, testMessage, signature);
14
+ }
15
+ export async function checkHpkeKeysMatch(group, impl) {
16
+ for (const [nodeIndex, privateKey] of Object.entries(group.privatePath.privateKeys)) {
17
+ const pub = getHpkePublicKey(group.ratchetTree[Number(nodeIndex)]);
18
+ const x = await hpkeKeysMatch(pub, privateKey, impl.hpke);
19
+ expect(x).toBe(true);
20
+ }
21
+ }
22
+ //# sourceMappingURL=keyMatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyMatch.js","sourceRoot":"","sources":["../../../test/crypto/keyMatch.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAExD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,SAAqB,EAAE,UAAsB,EAAE,IAAU;IAC3F,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAA;IACjC,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACxC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;IAExC,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;IAE3F,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,CAAA;IAEzF,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,MAAM,CAAA;AACvD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,SAAqB,EACrB,UAAsB,EACtB,CAAY;IAEZ,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACpD,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;IACvD,OAAO,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,SAAS,CAAC,CAAA;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,KAAkB,EAAE,IAAqB;IAChF,KAAK,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC;QACpF,MAAM,GAAG,GAAG,gBAAgB,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAE,CAAC,CAAA;QACnE,MAAM,CAAC,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;QACzD,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACtB,CAAC;AACH,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,51 @@
1
+ import { extensionsEqual } from "../src/extension";
2
+ describe("extensionsEqual", () => {
3
+ test("should return true for identical extensions", () => {
4
+ const ext1 = {
5
+ extensionType: "application_id",
6
+ extensionData: new Uint8Array([1, 2, 3]),
7
+ };
8
+ const ext2 = {
9
+ extensionType: "application_id",
10
+ extensionData: new Uint8Array([1, 2, 3]),
11
+ };
12
+ expect(extensionsEqual([ext1], [ext2])).toBe(true);
13
+ });
14
+ test("should return false for different extension types", () => {
15
+ const ext1 = {
16
+ extensionType: "application_id",
17
+ extensionData: new Uint8Array([1, 2, 3]),
18
+ };
19
+ const ext2 = {
20
+ extensionType: "ratchet_tree",
21
+ extensionData: new Uint8Array([1, 2, 3]),
22
+ };
23
+ expect(extensionsEqual([ext1], [ext2])).toBe(false);
24
+ });
25
+ test("should return false for different extension data", () => {
26
+ const ext1 = {
27
+ extensionType: "application_id",
28
+ extensionData: new Uint8Array([1, 2, 3]),
29
+ };
30
+ const ext2 = {
31
+ extensionType: "application_id",
32
+ extensionData: new Uint8Array([1, 2, 4]),
33
+ };
34
+ expect(extensionsEqual([ext1], [ext2])).toBe(false);
35
+ });
36
+ test("should return false for different array lengths", () => {
37
+ const ext1 = {
38
+ extensionType: "application_id",
39
+ extensionData: new Uint8Array([1, 2, 3]),
40
+ };
41
+ const ext2 = {
42
+ extensionType: "application_id",
43
+ extensionData: new Uint8Array([1, 2, 3]),
44
+ };
45
+ expect(extensionsEqual([ext1], [ext1, ext2])).toBe(false);
46
+ });
47
+ test("should return true for empty arrays", () => {
48
+ expect(extensionsEqual([], [])).toBe(true);
49
+ });
50
+ });
51
+ //# sourceMappingURL=extensionsEqual.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extensionsEqual.test.js","sourceRoot":"","sources":["../../test/extensionsEqual.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAE7D,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,IAAI,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACvD,MAAM,IAAI,GAAc;YACtB,aAAa,EAAE,gBAAgB;YAC/B,aAAa,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;SACzC,CAAA;QACD,MAAM,IAAI,GAAc;YACtB,aAAa,EAAE,gBAAgB;YAC/B,aAAa,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;SACzC,CAAA;QAED,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACpD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC7D,MAAM,IAAI,GAAc;YACtB,aAAa,EAAE,gBAAgB;YAC/B,aAAa,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;SACzC,CAAA;QACD,MAAM,IAAI,GAAc;YACtB,aAAa,EAAE,cAAc;YAC7B,aAAa,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;SACzC,CAAA;QAED,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACrD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC5D,MAAM,IAAI,GAAc;YACtB,aAAa,EAAE,gBAAgB;YAC/B,aAAa,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;SACzC,CAAA;QACD,MAAM,IAAI,GAAc;YACtB,aAAa,EAAE,gBAAgB;YAC/B,aAAa,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;SACzC,CAAA;QAED,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACrD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC3D,MAAM,IAAI,GAAc;YACtB,aAAa,EAAE,gBAAgB;YAC/B,aAAa,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;SACzC,CAAA;QACD,MAAM,IAAI,GAAc;YACtB,aAAa,EAAE,gBAAgB;YAC/B,aAAa,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;SACzC,CAAA;QAED,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC3D,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC5C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,40 @@
1
+ import { getCiphersuiteFromId, getCiphersuiteImpl } from "../src/crypto/ciphersuite";
2
+ import { signGroupInfo, verifyGroupInfoSignature } from "../src/groupInfo";
3
+ import { ed25519 } from "@noble/curves/ed25519";
4
+ describe("GroupInfo signing and verification", () => {
5
+ const privateKey = ed25519.utils.randomPrivateKey();
6
+ const publicKey = ed25519.getPublicKey(privateKey);
7
+ const groupContext = {
8
+ version: "mls10",
9
+ cipherSuite: "MLS_128_DHKEMX25519_AES128GCM_SHA256_Ed25519",
10
+ groupId: new Uint8Array([0x01, 0x02]),
11
+ epoch: BigInt(42),
12
+ treeHash: new Uint8Array([0xaa]),
13
+ confirmedTranscriptHash: new Uint8Array([0xbb]),
14
+ extensions: [{ extensionType: "application_id", extensionData: new Uint8Array([0x11]) }],
15
+ };
16
+ const baseTBS = {
17
+ groupContext,
18
+ extensions: [{ extensionType: "ratchet_tree", extensionData: new Uint8Array([0x22]) }],
19
+ confirmationTag: new Uint8Array([0xcc]),
20
+ signer: 7,
21
+ };
22
+ test("signs and verifies successfully", async () => {
23
+ const cs = await getCiphersuiteImpl(getCiphersuiteFromId(1));
24
+ const gi = await signGroupInfo(baseTBS, privateKey, cs.signature);
25
+ expect(await verifyGroupInfoSignature(gi, publicKey, cs.signature)).toBe(true);
26
+ });
27
+ test("fails verification if confirmationTag is changed", async () => {
28
+ const cs = await getCiphersuiteImpl(getCiphersuiteFromId(1));
29
+ const gi = await signGroupInfo(baseTBS, privateKey, cs.signature);
30
+ const modified = { ...gi, confirmationTag: new Uint8Array([0xdd]) };
31
+ expect(await verifyGroupInfoSignature(modified, publicKey, cs.signature)).toBe(false);
32
+ });
33
+ test("fails verification if signature is tampered", async () => {
34
+ const cs = await getCiphersuiteImpl(getCiphersuiteFromId(1));
35
+ const gi = await signGroupInfo(baseTBS, privateKey, cs.signature);
36
+ const tampered = { ...gi, signature: gi.signature.fill(0, 2, 4) };
37
+ expect(await verifyGroupInfoSignature(tampered, publicKey, cs.signature)).toBe(false);
38
+ });
39
+ });
40
+ //# sourceMappingURL=groupinfo.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groupinfo.test.js","sourceRoot":"","sources":["../../test/groupinfo.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { ClientState } from "../../src/clientState";
2
+ import { CiphersuiteImpl } from "../../src/crypto/ciphersuite";
3
+ export declare function testEveryoneCanMessageEveryone(clients: ClientState[], impl: CiphersuiteImpl): Promise<{
4
+ updatedGroups: ClientState[];
5
+ }>;
6
+ export declare function cannotMessageAnymore(state: ClientState, impl: CiphersuiteImpl): Promise<void>;
7
+ export declare function shuffledIndices<T>(arr: T[]): number[];
8
+ export declare function getRandomElement<T>(arr: T[]): T;
@@ -0,0 +1,41 @@
1
+ import { makePskIndex } from "../../src/clientState";
2
+ import { createApplicationMessage } from "../../src/createMessage";
3
+ import { processPrivateMessage } from "../../src/processMessages";
4
+ import { UsageError } from "../../src/mlsError";
5
+ export async function testEveryoneCanMessageEveryone(clients, impl) {
6
+ const encoder = new TextEncoder();
7
+ const updatedGroups = [...clients];
8
+ for (const [senderIndex, senderState] of updatedGroups.entries()) {
9
+ const messageText = `Hello from member ${senderIndex}`;
10
+ const encodedMessage = encoder.encode(messageText);
11
+ const { privateMessage, newState: newSenderState } = await createApplicationMessage(senderState, encodedMessage, impl);
12
+ updatedGroups[senderIndex] = newSenderState;
13
+ for (const [receiverIndex, receiverGroup] of updatedGroups.entries()) {
14
+ if (receiverIndex === senderIndex)
15
+ continue;
16
+ const result = await processPrivateMessage(receiverGroup, privateMessage, makePskIndex(receiverGroup, {}), impl);
17
+ if (result.kind === "newState") {
18
+ throw new Error(`Expected application message for member ${receiverIndex} from ${senderIndex}`);
19
+ }
20
+ expect(result.message).toStrictEqual(encodedMessage);
21
+ updatedGroups[receiverIndex] = result.newState;
22
+ }
23
+ }
24
+ return { updatedGroups };
25
+ }
26
+ export async function cannotMessageAnymore(state, impl) {
27
+ await expect(createApplicationMessage(state, new TextEncoder().encode("hello"), impl)).rejects.toThrow(UsageError);
28
+ }
29
+ export function shuffledIndices(arr) {
30
+ const indices = arr.map((_, i) => i);
31
+ for (let i = indices.length - 1; i > 0; i--) {
32
+ const j = Math.floor(Math.random() * (i + 1));
33
+ [indices[i], indices[j]] = [indices[j], indices[i]];
34
+ }
35
+ return indices;
36
+ }
37
+ export function getRandomElement(arr) {
38
+ const index = Math.floor(Math.random() * arr.length);
39
+ return arr[index];
40
+ }
41
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../test/scenario/common.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,56 @@
1
+ import { createGroup, joinGroup } from "../../src/clientState";
2
+ import { createCommit } from "../../src/createCommit";
3
+ import { emptyPskIndex } from "../../src/pskIndex";
4
+ import { getCiphersuiteImpl, getCiphersuiteFromName, ciphersuites } from "../../src/crypto/ciphersuite";
5
+ import { generateKeyPackage } from "../../src/keyPackage";
6
+ import { defaultLifetime } from "../../src/lifetime";
7
+ import { defaultCapabilities } from "../../src/defaultCapabilities";
8
+ import { ValidationError } from "../../src/mlsError";
9
+ for (const cs of Object.keys(ciphersuites)) {
10
+ test(`Custom Extensions ${cs}`, async () => {
11
+ await customExtensionTest(cs);
12
+ });
13
+ }
14
+ async function customExtensionTest(cipherSuite) {
15
+ const impl = await getCiphersuiteImpl(getCiphersuiteFromName(cipherSuite));
16
+ const customExtensionType = 7;
17
+ const capabilities = {
18
+ extensions: [customExtensionType],
19
+ credentials: ["basic"],
20
+ proposals: [],
21
+ versions: ["mls10"],
22
+ ciphersuites: [cipherSuite],
23
+ };
24
+ const aliceCredential = { credentialType: "basic", identity: new TextEncoder().encode("alice") };
25
+ const alice = await generateKeyPackage(aliceCredential, capabilities, defaultLifetime, [], impl);
26
+ const groupId = new TextEncoder().encode("group1");
27
+ const extensionData = new TextEncoder().encode("custom extension data");
28
+ const customExtension = {
29
+ extensionType: customExtensionType,
30
+ extensionData: extensionData,
31
+ };
32
+ let aliceGroup = await createGroup(groupId, alice.publicPackage, alice.privatePackage, [customExtension], impl);
33
+ const bobCredential = { credentialType: "basic", identity: new TextEncoder().encode("bob") };
34
+ const bob = await generateKeyPackage(bobCredential, capabilities, defaultLifetime, [], impl);
35
+ const addBobProposal = {
36
+ proposalType: "add",
37
+ add: {
38
+ keyPackage: bob.publicPackage,
39
+ },
40
+ };
41
+ const addBobCommitResult = await createCommit(aliceGroup, emptyPskIndex, false, [addBobProposal], impl);
42
+ aliceGroup = addBobCommitResult.newState;
43
+ let bobGroup = await joinGroup(addBobCommitResult.welcome, bob.publicPackage, bob.privatePackage, emptyPskIndex, impl, aliceGroup.ratchetTree);
44
+ expect(bobGroup.groupContext.extensions.find((e) => e.extensionType === customExtensionType)).toStrictEqual(customExtension);
45
+ //Charlie doesn't support the custom extension
46
+ const charlieCredential = { credentialType: "basic", identity: new TextEncoder().encode("charlie") };
47
+ const charlie = await generateKeyPackage(charlieCredential, defaultCapabilities(), defaultLifetime, [], impl);
48
+ const addCharlieProposal = {
49
+ proposalType: "add",
50
+ add: {
51
+ keyPackage: charlie.publicPackage,
52
+ },
53
+ };
54
+ await expect(createCommit(aliceGroup, emptyPskIndex, false, [addCharlieProposal], impl)).rejects.toThrow(ValidationError);
55
+ }
56
+ //# sourceMappingURL=customExtensions.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customExtensions.test.js","sourceRoot":"","sources":["../../../test/scenario/customExtensions.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,71 @@
1
+ import { createGroup, joinGroup } from "../../src/clientState";
2
+ import { createCommit } from "../../src/createCommit";
3
+ import { emptyPskIndex } from "../../src/pskIndex";
4
+ import { getCiphersuiteImpl, getCiphersuiteFromName, ciphersuites } from "../../src/crypto/ciphersuite";
5
+ import { generateKeyPackage } from "../../src/keyPackage";
6
+ import { testEveryoneCanMessageEveryone } from "./common";
7
+ import { defaultLifetime } from "../../src/lifetime";
8
+ import { createApplicationMessage, createProposal, processPrivateMessage } from "../../src";
9
+ import { UsageError } from "../../src/mlsError";
10
+ for (const cs of Object.keys(ciphersuites)) {
11
+ test(`Custom Proposals ${cs}`, async () => {
12
+ await customProposalTest(cs);
13
+ });
14
+ }
15
+ async function customProposalTest(cipherSuite) {
16
+ const impl = await getCiphersuiteImpl(getCiphersuiteFromName(cipherSuite));
17
+ const customProposalType = 8;
18
+ const capabilities = {
19
+ extensions: [],
20
+ credentials: ["basic"],
21
+ proposals: [customProposalType],
22
+ versions: ["mls10"],
23
+ ciphersuites: [cipherSuite],
24
+ };
25
+ const aliceCredential = { credentialType: "basic", identity: new TextEncoder().encode("alice") };
26
+ const alice = await generateKeyPackage(aliceCredential, capabilities, defaultLifetime, [], impl);
27
+ const groupId = new TextEncoder().encode("group1");
28
+ let aliceGroup = await createGroup(groupId, alice.publicPackage, alice.privatePackage, [], impl);
29
+ const bobCredential = { credentialType: "basic", identity: new TextEncoder().encode("bob") };
30
+ const bob = await generateKeyPackage(bobCredential, capabilities, defaultLifetime, [], impl);
31
+ const addBobProposal = {
32
+ proposalType: "add",
33
+ add: {
34
+ keyPackage: bob.publicPackage,
35
+ },
36
+ };
37
+ const addBobCommitResult = await createCommit(aliceGroup, emptyPskIndex, false, [addBobProposal], impl);
38
+ aliceGroup = addBobCommitResult.newState;
39
+ let bobGroup = await joinGroup(addBobCommitResult.welcome, bob.publicPackage, bob.privatePackage, emptyPskIndex, impl, aliceGroup.ratchetTree);
40
+ const proposalData = new TextEncoder().encode("custom proposal data");
41
+ const customProposal = {
42
+ proposalType: 8,
43
+ proposalData: proposalData,
44
+ };
45
+ const createProposalResult = await createProposal(bobGroup, false, customProposal, impl);
46
+ bobGroup = createProposalResult.newState;
47
+ if (createProposalResult.message.wireformat !== "mls_private_message")
48
+ throw new Error("Expected private message");
49
+ const processProposalResult = await processPrivateMessage(aliceGroup, createProposalResult.message.privateMessage, emptyPskIndex, impl, (p) => {
50
+ if (p.kind !== "proposal")
51
+ throw new Error("Expected proposal");
52
+ expect(p.proposal.proposal).toStrictEqual(customProposal);
53
+ return "accept";
54
+ });
55
+ aliceGroup = processProposalResult.newState;
56
+ //creating an application message will fail now
57
+ expect(createApplicationMessage(aliceGroup, new Uint8Array([1, 2, 3]), impl)).rejects.toThrow(UsageError);
58
+ const createCommitResult = await createCommit(aliceGroup, emptyPskIndex, false, [], impl);
59
+ aliceGroup = createCommitResult.newState;
60
+ if (createCommitResult.commit.wireformat !== "mls_private_message")
61
+ throw new Error("Expected private message");
62
+ const processCommitResult = await processPrivateMessage(bobGroup, createCommitResult.commit.privateMessage, emptyPskIndex, impl, (p) => {
63
+ if (p.kind !== "commit")
64
+ throw new Error("Expected commit");
65
+ expect(p.proposals.map((p) => p.proposal)).toStrictEqual([customProposal]);
66
+ return "accept";
67
+ });
68
+ bobGroup = processCommitResult.newState;
69
+ await testEveryoneCanMessageEveryone([aliceGroup, bobGroup], impl);
70
+ }
71
+ //# sourceMappingURL=customProposal.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customProposal.test.js","sourceRoot":"","sources":["../../../test/scenario/customProposal.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,162 @@
1
+ import { createGroup, joinGroup, makePskIndex } from "../../src/clientState";
2
+ import { createCommit } from "../../src/createCommit";
3
+ import { createApplicationMessage, createProposal } from "../../src/createMessage";
4
+ import { processPrivateMessage } from "../../src/processMessages";
5
+ import { emptyPskIndex } from "../../src/pskIndex";
6
+ import { ciphersuites, getCiphersuiteFromName, getCiphersuiteImpl } from "../../src/crypto/ciphersuite";
7
+ import { generateKeyPackage } from "../../src/keyPackage";
8
+ import { shuffledIndices, testEveryoneCanMessageEveryone } from "./common";
9
+ import { defaultLifetime } from "../../src/lifetime";
10
+ import { defaultCapabilities } from "../../src/defaultCapabilities";
11
+ import { defaultKeyRetentionConfig } from "../../src/keyRetentionConfig";
12
+ import { ValidationError } from "../../src/mlsError";
13
+ import { defaultClientConfig } from "../../src/clientConfig";
14
+ describe("Out of order message processing by epoch", () => {
15
+ for (const cs of Object.keys(ciphersuites)) {
16
+ test(`Out of order epoch ${cs}`, async () => {
17
+ await epochOutOfOrder(cs);
18
+ });
19
+ }
20
+ for (const cs of Object.keys(ciphersuites)) {
21
+ test(`Out of order epoch random ${cs}`, async () => {
22
+ await epochOutOfOrderRandom(cs, defaultKeyRetentionConfig.retainKeysForEpochs);
23
+ });
24
+ }
25
+ for (const cs of Object.keys(ciphersuites)) {
26
+ test(`Out of order epoch limit reached fails ${cs}`, async () => {
27
+ await epochOutOfOrderLimitFails(cs, 3);
28
+ });
29
+ }
30
+ });
31
+ async function setupTestParticipants(cipherSuite, retainConfig) {
32
+ const impl = await getCiphersuiteImpl(getCiphersuiteFromName(cipherSuite));
33
+ const aliceCredential = { credentialType: "basic", identity: new TextEncoder().encode("alice") };
34
+ const alice = await generateKeyPackage(aliceCredential, defaultCapabilities(), defaultLifetime, [], impl);
35
+ const groupId = new TextEncoder().encode("group1");
36
+ // group starts at epoch 0
37
+ let aliceGroup = await createGroup(groupId, alice.publicPackage, alice.privatePackage, [], impl);
38
+ const bobCredential = { credentialType: "basic", identity: new TextEncoder().encode("bob") };
39
+ const bob = await generateKeyPackage(bobCredential, defaultCapabilities(), defaultLifetime, [], impl);
40
+ const addBobProposal = {
41
+ proposalType: "add",
42
+ add: {
43
+ keyPackage: bob.publicPackage,
44
+ },
45
+ };
46
+ // alice adds bob and initiates epoch 1
47
+ const addBobCommitResult = await createCommit(aliceGroup, emptyPskIndex, false, [addBobProposal], impl, true);
48
+ aliceGroup = addBobCommitResult.newState;
49
+ // bob joins at epoch 1
50
+ const bobGroup = await joinGroup(addBobCommitResult.welcome, bob.publicPackage, bob.privatePackage, emptyPskIndex, impl, undefined, undefined, { ...defaultClientConfig, keyRetentionConfig: retainConfig ?? defaultKeyRetentionConfig });
51
+ return { aliceGroup, bobGroup, impl };
52
+ }
53
+ async function epochOutOfOrder(cipherSuite) {
54
+ const { aliceGroup: initialAliceGroup, bobGroup: initialBobGroup, impl } = await setupTestParticipants(cipherSuite);
55
+ let aliceGroup = initialAliceGroup;
56
+ let bobGroup = initialBobGroup;
57
+ const firstMessage = new TextEncoder().encode("Hello bob!");
58
+ const secondMessage = new TextEncoder().encode("How are ya?");
59
+ const thirdMessage = new TextEncoder().encode("Have you heard the news?");
60
+ // alice sends the first message in epoch 1
61
+ const aliceCreateFirstMessageResult = await createApplicationMessage(aliceGroup, firstMessage, impl);
62
+ aliceGroup = aliceCreateFirstMessageResult.newState;
63
+ // alice sends a proposal message in epoch 1
64
+ const aliceCreateFirstProposalResult = await createProposal(aliceGroup, false, { proposalType: 7, proposalData: new Uint8Array() }, impl);
65
+ aliceGroup = aliceCreateFirstProposalResult.newState;
66
+ // bob creates an empty commit and goes to epoch 2
67
+ const emptyCommitResult1 = await createCommit(bobGroup, emptyPskIndex, false, [], impl);
68
+ bobGroup = emptyCommitResult1.newState;
69
+ if (emptyCommitResult1.commit.wireformat !== "mls_private_message")
70
+ throw new Error("Expected private message");
71
+ // alice processes the empty commit and goes to epoch 2
72
+ const aliceProcessFirstCommitResult = await processPrivateMessage(aliceGroup, emptyCommitResult1.commit.privateMessage, emptyPskIndex, impl);
73
+ aliceGroup = aliceProcessFirstCommitResult.newState;
74
+ // alice sends the 2nd message in epoch 2
75
+ const aliceCreateSecondMessageResult = await createApplicationMessage(aliceGroup, secondMessage, impl);
76
+ aliceGroup = aliceCreateSecondMessageResult.newState;
77
+ // bob creates an empty commit and goes to epoch 3
78
+ const emptyCommitResult2 = await createCommit(bobGroup, emptyPskIndex, false, [], impl);
79
+ bobGroup = emptyCommitResult2.newState;
80
+ if (emptyCommitResult2.commit.wireformat !== "mls_private_message")
81
+ throw new Error("Expected private message");
82
+ // alice processes the empty commit and goes to epoch 3
83
+ const aliceProcessSecondCommitResult = await processPrivateMessage(aliceGroup, emptyCommitResult2.commit.privateMessage, emptyPskIndex, impl);
84
+ aliceGroup = aliceProcessSecondCommitResult.newState;
85
+ // alice sends the 3rd message in epoch 3
86
+ const aliceCreateThirdMessageResult = await createApplicationMessage(aliceGroup, thirdMessage, impl);
87
+ aliceGroup = aliceCreateThirdMessageResult.newState;
88
+ // bob creates an empty commit and goes to epoch 4
89
+ const emptyCommitResult3 = await createCommit(bobGroup, emptyPskIndex, false, [], impl);
90
+ bobGroup = emptyCommitResult3.newState;
91
+ if (emptyCommitResult3.commit.wireformat !== "mls_private_message")
92
+ throw new Error("Expected private message");
93
+ // alice processes the empty commit and goes to epoch 4
94
+ const aliceProcessThirdCommitResult = await processPrivateMessage(aliceGroup, emptyCommitResult3.commit.privateMessage, emptyPskIndex, impl);
95
+ aliceGroup = aliceProcessThirdCommitResult.newState;
96
+ // bob receives 3rd message first
97
+ const bobProcessThirdMessageResult = await processPrivateMessage(bobGroup, aliceCreateThirdMessageResult.privateMessage, makePskIndex(bobGroup, {}), impl);
98
+ bobGroup = bobProcessThirdMessageResult.newState;
99
+ // then bob receives the first message
100
+ const bobProcessFirstMessageResult = await processPrivateMessage(bobGroup, aliceCreateFirstMessageResult.privateMessage, makePskIndex(bobGroup, {}), impl);
101
+ bobGroup = bobProcessFirstMessageResult.newState;
102
+ // bob receives 2nd message last
103
+ const bobProcessSecondMessageResult = await processPrivateMessage(bobGroup, aliceCreateSecondMessageResult.privateMessage, makePskIndex(bobGroup, {}), impl);
104
+ bobGroup = bobProcessSecondMessageResult.newState;
105
+ //bob won't be able to receive the proposal from an older epoch
106
+ if (aliceCreateFirstProposalResult.message.wireformat !== "mls_private_message")
107
+ throw new Error("Expected private message");
108
+ expect(processPrivateMessage(bobGroup, aliceCreateFirstProposalResult.message.privateMessage, emptyPskIndex, impl)).rejects.toThrow(ValidationError);
109
+ await testEveryoneCanMessageEveryone([aliceGroup, bobGroup], impl);
110
+ }
111
+ async function epochOutOfOrderRandom(cipherSuite, totalMessages) {
112
+ const { aliceGroup: initialAliceGroup, bobGroup: initialBobGroup, impl } = await setupTestParticipants(cipherSuite);
113
+ let aliceGroup = initialAliceGroup;
114
+ let bobGroup = initialBobGroup;
115
+ const message = new TextEncoder().encode("Hi!");
116
+ let messages = [];
117
+ for (let i = 0; i < totalMessages; i++) {
118
+ const createMessageResult = await createApplicationMessage(aliceGroup, message, impl);
119
+ // alice sends the first message in current epoch
120
+ aliceGroup = createMessageResult.newState;
121
+ // bob creates an empty commit and goes to next epoch
122
+ const emptyCommitResult = await createCommit(bobGroup, emptyPskIndex, false, [], impl);
123
+ bobGroup = emptyCommitResult.newState;
124
+ if (emptyCommitResult.commit.wireformat !== "mls_private_message")
125
+ throw new Error("Expected private message");
126
+ // alice processes the empty commit and goes to next epoch
127
+ const aliceProcessCommitResult = await processPrivateMessage(aliceGroup, emptyCommitResult.commit.privateMessage, emptyPskIndex, impl);
128
+ aliceGroup = aliceProcessCommitResult.newState;
129
+ messages.push(createMessageResult.privateMessage);
130
+ }
131
+ const shuffledMessages = shuffledIndices(messages).map((i) => messages[i]);
132
+ for (const msg of shuffledMessages) {
133
+ const bobProcessMessageResult = await processPrivateMessage(bobGroup, msg, makePskIndex(bobGroup, {}), impl);
134
+ bobGroup = bobProcessMessageResult.newState;
135
+ }
136
+ await testEveryoneCanMessageEveryone([aliceGroup, bobGroup], impl);
137
+ }
138
+ async function epochOutOfOrderLimitFails(cipherSuite, totalMessages) {
139
+ const retainConfig = { ...defaultKeyRetentionConfig, retainKeysForEpochs: totalMessages - 1 };
140
+ const { aliceGroup: initialAliceGroup, bobGroup: initialBobGroup, impl, } = await setupTestParticipants(cipherSuite, retainConfig);
141
+ let aliceGroup = initialAliceGroup;
142
+ let bobGroup = initialBobGroup;
143
+ const message = new TextEncoder().encode("Hi!");
144
+ let messages = [];
145
+ for (let i = 0; i < totalMessages; i++) {
146
+ const createMessageResult = await createApplicationMessage(aliceGroup, message, impl);
147
+ // alice sends the first message in current epoch
148
+ aliceGroup = createMessageResult.newState;
149
+ // bob creates an empty commit and goes to next epoch
150
+ const emptyCommitResult = await createCommit(bobGroup, emptyPskIndex, false, [], impl);
151
+ bobGroup = emptyCommitResult.newState;
152
+ if (emptyCommitResult.commit.wireformat !== "mls_private_message")
153
+ throw new Error("Expected private message");
154
+ // alice processes the empty commit and goes to next epoch
155
+ const aliceProcessCommitResult = await processPrivateMessage(aliceGroup, emptyCommitResult.commit.privateMessage, emptyPskIndex, impl);
156
+ aliceGroup = aliceProcessCommitResult.newState;
157
+ messages.push(createMessageResult.privateMessage);
158
+ }
159
+ //process last message
160
+ await expect(processPrivateMessage(bobGroup, messages.at(0), emptyPskIndex, impl)).rejects.toThrow(ValidationError);
161
+ }
162
+ //# sourceMappingURL=epochOutOfOrder.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"epochOutOfOrder.test.js","sourceRoot":"","sources":["../../../test/scenario/epochOutOfOrder.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};