@brightchain/brightchain-lib 0.19.0 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (281) hide show
  1. package/package.json +6 -2
  2. package/src/lib/documents/member/memberProfileHydration.d.ts.map +1 -1
  3. package/src/lib/documents/member/memberProfileHydration.js +6 -0
  4. package/src/lib/documents/member/memberProfileHydration.js.map +1 -1
  5. package/src/lib/enumerations/brightChainStrings.d.ts +39 -0
  6. package/src/lib/enumerations/brightChainStrings.d.ts.map +1 -1
  7. package/src/lib/enumerations/brightChainStrings.js +47 -0
  8. package/src/lib/enumerations/brightChainStrings.js.map +1 -1
  9. package/src/lib/enumerations/identityValidationErrorType.d.ts +11 -0
  10. package/src/lib/enumerations/identityValidationErrorType.d.ts.map +1 -0
  11. package/src/lib/enumerations/identityValidationErrorType.js +15 -0
  12. package/src/lib/enumerations/identityValidationErrorType.js.map +1 -0
  13. package/src/lib/enumerations/index.d.ts +4 -0
  14. package/src/lib/enumerations/index.d.ts.map +1 -1
  15. package/src/lib/enumerations/index.js +5 -0
  16. package/src/lib/enumerations/index.js.map +1 -1
  17. package/src/lib/enumerations/memberStatusType.d.ts +2 -1
  18. package/src/lib/enumerations/memberStatusType.d.ts.map +1 -1
  19. package/src/lib/enumerations/memberStatusType.js +1 -0
  20. package/src/lib/enumerations/memberStatusType.js.map +1 -1
  21. package/src/lib/enumerations/proposalActionType.d.ts +22 -0
  22. package/src/lib/enumerations/proposalActionType.d.ts.map +1 -0
  23. package/src/lib/enumerations/proposalActionType.js +26 -0
  24. package/src/lib/enumerations/proposalActionType.js.map +1 -0
  25. package/src/lib/enumerations/proposalStatus.d.ts +14 -0
  26. package/src/lib/enumerations/proposalStatus.d.ts.map +1 -0
  27. package/src/lib/enumerations/proposalStatus.js +18 -0
  28. package/src/lib/enumerations/proposalStatus.js.map +1 -0
  29. package/src/lib/enumerations/quorumErrorType.d.ts +30 -1
  30. package/src/lib/enumerations/quorumErrorType.d.ts.map +1 -1
  31. package/src/lib/enumerations/quorumErrorType.js +37 -0
  32. package/src/lib/enumerations/quorumErrorType.js.map +1 -1
  33. package/src/lib/enumerations/quorumOperationalMode.d.ts +16 -0
  34. package/src/lib/enumerations/quorumOperationalMode.d.ts.map +1 -0
  35. package/src/lib/enumerations/quorumOperationalMode.js +20 -0
  36. package/src/lib/enumerations/quorumOperationalMode.js.map +1 -0
  37. package/src/lib/enumerations/sealingErrorType.d.ts +3 -1
  38. package/src/lib/enumerations/sealingErrorType.d.ts.map +1 -1
  39. package/src/lib/enumerations/sealingErrorType.js +2 -0
  40. package/src/lib/enumerations/sealingErrorType.js.map +1 -1
  41. package/src/lib/errors/identityValidationError.d.ts +8 -0
  42. package/src/lib/errors/identityValidationError.d.ts.map +1 -0
  43. package/src/lib/errors/identityValidationError.js +26 -0
  44. package/src/lib/errors/identityValidationError.js.map +1 -0
  45. package/src/lib/errors/index.d.ts +4 -0
  46. package/src/lib/errors/index.d.ts.map +1 -1
  47. package/src/lib/errors/index.js +7 -0
  48. package/src/lib/errors/index.js.map +1 -1
  49. package/src/lib/errors/quorumError.d.ts.map +1 -1
  50. package/src/lib/errors/quorumError.js +37 -0
  51. package/src/lib/errors/quorumError.js.map +1 -1
  52. package/src/lib/errors/sealingError.d.ts.map +1 -1
  53. package/src/lib/errors/sealingError.js +2 -0
  54. package/src/lib/errors/sealingError.js.map +1 -1
  55. package/src/lib/i18n/strings/englishUs.d.ts.map +1 -1
  56. package/src/lib/i18n/strings/englishUs.js +45 -0
  57. package/src/lib/i18n/strings/englishUs.js.map +1 -1
  58. package/src/lib/i18n/strings/french.d.ts.map +1 -1
  59. package/src/lib/i18n/strings/french.js +37 -0
  60. package/src/lib/i18n/strings/french.js.map +1 -1
  61. package/src/lib/i18n/strings/german.d.ts.map +1 -1
  62. package/src/lib/i18n/strings/german.js +37 -0
  63. package/src/lib/i18n/strings/german.js.map +1 -1
  64. package/src/lib/i18n/strings/japanese.d.ts.map +1 -1
  65. package/src/lib/i18n/strings/japanese.js +37 -0
  66. package/src/lib/i18n/strings/japanese.js.map +1 -1
  67. package/src/lib/i18n/strings/mandarin.d.ts.map +1 -1
  68. package/src/lib/i18n/strings/mandarin.js +37 -0
  69. package/src/lib/i18n/strings/mandarin.js.map +1 -1
  70. package/src/lib/i18n/strings/spanish.d.ts.map +1 -1
  71. package/src/lib/i18n/strings/spanish.js +37 -0
  72. package/src/lib/i18n/strings/spanish.js.map +1 -1
  73. package/src/lib/i18n/strings/ukrainian.d.ts.map +1 -1
  74. package/src/lib/i18n/strings/ukrainian.js +37 -0
  75. package/src/lib/i18n/strings/ukrainian.js.map +1 -1
  76. package/src/lib/interfaces/aliasRecord.d.ts +34 -0
  77. package/src/lib/interfaces/aliasRecord.d.ts.map +1 -0
  78. package/src/lib/interfaces/aliasRecord.js +11 -0
  79. package/src/lib/interfaces/aliasRecord.js.map +1 -0
  80. package/src/lib/interfaces/api/index.d.ts +2 -0
  81. package/src/lib/interfaces/api/index.d.ts.map +1 -0
  82. package/src/lib/interfaces/api/index.js +5 -0
  83. package/src/lib/interfaces/api/index.js.map +1 -0
  84. package/src/lib/interfaces/api/quorumApi.d.ts +97 -0
  85. package/src/lib/interfaces/api/quorumApi.d.ts.map +1 -0
  86. package/src/lib/interfaces/api/quorumApi.js +12 -0
  87. package/src/lib/interfaces/api/quorumApi.js.map +1 -0
  88. package/src/lib/interfaces/auditLogEntry.d.ts +34 -0
  89. package/src/lib/interfaces/auditLogEntry.d.ts.map +1 -0
  90. package/src/lib/interfaces/auditLogEntry.js +10 -0
  91. package/src/lib/interfaces/auditLogEntry.js.map +1 -0
  92. package/src/lib/interfaces/availability/gossipService.d.ts +116 -2
  93. package/src/lib/interfaces/availability/gossipService.d.ts.map +1 -1
  94. package/src/lib/interfaces/availability/gossipService.js +62 -0
  95. package/src/lib/interfaces/availability/gossipService.js.map +1 -1
  96. package/src/lib/interfaces/chainedAuditLogEntry.d.ts +27 -0
  97. package/src/lib/interfaces/chainedAuditLogEntry.d.ts.map +1 -0
  98. package/src/lib/interfaces/chainedAuditLogEntry.js +12 -0
  99. package/src/lib/interfaces/chainedAuditLogEntry.js.map +1 -0
  100. package/src/lib/interfaces/contentWithIdentity.d.ts +39 -0
  101. package/src/lib/interfaces/contentWithIdentity.d.ts.map +1 -0
  102. package/src/lib/interfaces/contentWithIdentity.js +24 -0
  103. package/src/lib/interfaces/contentWithIdentity.js.map +1 -0
  104. package/src/lib/interfaces/energyAccount.d.ts +3 -1
  105. package/src/lib/interfaces/energyAccount.d.ts.map +1 -1
  106. package/src/lib/interfaces/identityRecoveryRecord.d.ts +41 -0
  107. package/src/lib/interfaces/identityRecoveryRecord.d.ts.map +1 -0
  108. package/src/lib/interfaces/identityRecoveryRecord.js +11 -0
  109. package/src/lib/interfaces/identityRecoveryRecord.js.map +1 -0
  110. package/src/lib/interfaces/index.d.ts +16 -0
  111. package/src/lib/interfaces/index.d.ts.map +1 -1
  112. package/src/lib/interfaces/index.js +4 -0
  113. package/src/lib/interfaces/index.js.map +1 -1
  114. package/src/lib/interfaces/initResult.d.ts +6 -6
  115. package/src/lib/interfaces/initResult.d.ts.map +1 -1
  116. package/src/lib/interfaces/member/brightChainBaseInitResult.d.ts +4 -1
  117. package/src/lib/interfaces/member/brightChainBaseInitResult.d.ts.map +1 -1
  118. package/src/lib/interfaces/member/brightChainInitResult.d.ts +1 -1
  119. package/src/lib/interfaces/member/brightChainInitResult.d.ts.map +1 -1
  120. package/src/lib/interfaces/member/memberData.d.ts +3 -0
  121. package/src/lib/interfaces/member/memberData.d.ts.map +1 -1
  122. package/src/lib/interfaces/member/profileStorage.d.ts +5 -0
  123. package/src/lib/interfaces/member/profileStorage.d.ts.map +1 -1
  124. package/src/lib/interfaces/operationalState.d.ts +20 -0
  125. package/src/lib/interfaces/operationalState.d.ts.map +1 -0
  126. package/src/lib/interfaces/operationalState.js +10 -0
  127. package/src/lib/interfaces/operationalState.js.map +1 -0
  128. package/src/lib/interfaces/proposal.d.ts +59 -0
  129. package/src/lib/interfaces/proposal.d.ts.map +1 -0
  130. package/src/lib/interfaces/proposal.js +10 -0
  131. package/src/lib/interfaces/proposal.js.map +1 -0
  132. package/src/lib/interfaces/quorumDocumentMetadata.d.ts +20 -0
  133. package/src/lib/interfaces/quorumDocumentMetadata.d.ts.map +1 -0
  134. package/src/lib/interfaces/quorumDocumentMetadata.js +10 -0
  135. package/src/lib/interfaces/quorumDocumentMetadata.js.map +1 -0
  136. package/src/lib/interfaces/quorumEpoch.d.ts +33 -0
  137. package/src/lib/interfaces/quorumEpoch.d.ts.map +1 -0
  138. package/src/lib/interfaces/quorumEpoch.js +11 -0
  139. package/src/lib/interfaces/quorumEpoch.js.map +1 -0
  140. package/src/lib/interfaces/quorumMetrics.d.ts +49 -0
  141. package/src/lib/interfaces/quorumMetrics.d.ts.map +1 -0
  142. package/src/lib/interfaces/quorumMetrics.js +10 -0
  143. package/src/lib/interfaces/quorumMetrics.js.map +1 -0
  144. package/src/lib/interfaces/redistributionJournalEntry.d.ts +25 -0
  145. package/src/lib/interfaces/redistributionJournalEntry.d.ts.map +1 -0
  146. package/src/lib/interfaces/redistributionJournalEntry.js +11 -0
  147. package/src/lib/interfaces/redistributionJournalEntry.js.map +1 -0
  148. package/src/lib/interfaces/responses/backupCodesResponseData.d.ts +3 -5
  149. package/src/lib/interfaces/responses/backupCodesResponseData.d.ts.map +1 -1
  150. package/src/lib/interfaces/responses/challengeResponseData.d.ts +5 -0
  151. package/src/lib/interfaces/responses/challengeResponseData.d.ts.map +1 -1
  152. package/src/lib/interfaces/responses/codeCountResponseData.d.ts +3 -5
  153. package/src/lib/interfaces/responses/codeCountResponseData.d.ts.map +1 -1
  154. package/src/lib/interfaces/responses/index.d.ts +4 -2
  155. package/src/lib/interfaces/responses/index.d.ts.map +1 -1
  156. package/src/lib/interfaces/responses/passwordChangeResponse.d.ts +2 -0
  157. package/src/lib/interfaces/responses/passwordChangeResponse.d.ts.map +1 -0
  158. package/src/lib/interfaces/responses/passwordChangeResponse.js +3 -0
  159. package/src/lib/interfaces/responses/passwordChangeResponse.js.map +1 -0
  160. package/src/lib/interfaces/responses/recoveryResponse.d.ts +2 -0
  161. package/src/lib/interfaces/responses/recoveryResponse.d.ts.map +1 -0
  162. package/src/lib/interfaces/responses/recoveryResponse.js +3 -0
  163. package/src/lib/interfaces/responses/recoveryResponse.js.map +1 -0
  164. package/src/lib/interfaces/responses/registrationResponseData.d.ts +2 -2
  165. package/src/lib/interfaces/responses/registrationResponseData.d.ts.map +1 -1
  166. package/src/lib/interfaces/services/contentIngestion.d.ts +61 -0
  167. package/src/lib/interfaces/services/contentIngestion.d.ts.map +1 -0
  168. package/src/lib/interfaces/services/contentIngestion.js +12 -0
  169. package/src/lib/interfaces/services/contentIngestion.js.map +1 -0
  170. package/src/lib/interfaces/services/expirationScheduler.d.ts +55 -0
  171. package/src/lib/interfaces/services/expirationScheduler.d.ts.map +1 -0
  172. package/src/lib/interfaces/services/expirationScheduler.js +11 -0
  173. package/src/lib/interfaces/services/expirationScheduler.js.map +1 -0
  174. package/src/lib/interfaces/services/identitySealingPipeline.d.ts +56 -0
  175. package/src/lib/interfaces/services/identitySealingPipeline.d.ts.map +1 -0
  176. package/src/lib/interfaces/services/identitySealingPipeline.js +12 -0
  177. package/src/lib/interfaces/services/identitySealingPipeline.js.map +1 -0
  178. package/src/lib/interfaces/services/identityValidator.d.ts +44 -0
  179. package/src/lib/interfaces/services/identityValidator.d.ts.map +1 -0
  180. package/src/lib/interfaces/services/identityValidator.js +11 -0
  181. package/src/lib/interfaces/services/identityValidator.js.map +1 -0
  182. package/src/lib/interfaces/services/index.d.ts +9 -0
  183. package/src/lib/interfaces/services/index.d.ts.map +1 -1
  184. package/src/lib/interfaces/services/membershipProof.d.ts +40 -0
  185. package/src/lib/interfaces/services/membershipProof.d.ts.map +1 -0
  186. package/src/lib/interfaces/services/membershipProof.js +11 -0
  187. package/src/lib/interfaces/services/membershipProof.js.map +1 -0
  188. package/src/lib/interfaces/services/operatorPrompt.d.ts +68 -0
  189. package/src/lib/interfaces/services/operatorPrompt.d.ts.map +1 -0
  190. package/src/lib/interfaces/services/operatorPrompt.js +11 -0
  191. package/src/lib/interfaces/services/operatorPrompt.js.map +1 -0
  192. package/src/lib/interfaces/services/quorumDatabase.d.ts +207 -0
  193. package/src/lib/interfaces/services/quorumDatabase.d.ts.map +1 -0
  194. package/src/lib/interfaces/services/quorumDatabase.js +13 -0
  195. package/src/lib/interfaces/services/quorumDatabase.js.map +1 -0
  196. package/src/lib/interfaces/services/quorumService.d.ts +3 -0
  197. package/src/lib/interfaces/services/quorumService.d.ts.map +1 -1
  198. package/src/lib/interfaces/services/quorumStateMachine.d.ts +128 -0
  199. package/src/lib/interfaces/services/quorumStateMachine.d.ts.map +1 -0
  200. package/src/lib/interfaces/services/quorumStateMachine.js +12 -0
  201. package/src/lib/interfaces/services/quorumStateMachine.js.map +1 -0
  202. package/src/lib/interfaces/services/redistributionConfig.d.ts +20 -0
  203. package/src/lib/interfaces/services/redistributionConfig.d.ts.map +1 -0
  204. package/src/lib/interfaces/services/redistributionConfig.js +10 -0
  205. package/src/lib/interfaces/services/redistributionConfig.js.map +1 -0
  206. package/src/lib/interfaces/statuteConfig.d.ts +22 -0
  207. package/src/lib/interfaces/statuteConfig.d.ts.map +1 -0
  208. package/src/lib/interfaces/statuteConfig.js +18 -0
  209. package/src/lib/interfaces/statuteConfig.js.map +1 -0
  210. package/src/lib/interfaces/storage/documentStore.d.ts +46 -24
  211. package/src/lib/interfaces/storage/documentStore.d.ts.map +1 -1
  212. package/src/lib/interfaces/storage/documentStore.js +6 -2
  213. package/src/lib/interfaces/storage/documentStore.js.map +1 -1
  214. package/src/lib/interfaces/userManagement.d.ts +49 -0
  215. package/src/lib/interfaces/userManagement.d.ts.map +1 -0
  216. package/src/lib/interfaces/userManagement.js +9 -0
  217. package/src/lib/interfaces/userManagement.js.map +1 -0
  218. package/src/lib/interfaces/vote.d.ts +45 -0
  219. package/src/lib/interfaces/vote.d.ts.map +1 -0
  220. package/src/lib/interfaces/vote.js +10 -0
  221. package/src/lib/interfaces/vote.js.map +1 -0
  222. package/src/lib/quorumDataRecord.d.ts +7 -1
  223. package/src/lib/quorumDataRecord.d.ts.map +1 -1
  224. package/src/lib/quorumDataRecord.js +12 -4
  225. package/src/lib/quorumDataRecord.js.map +1 -1
  226. package/src/lib/quorumDataRecordDto.d.ts +6 -0
  227. package/src/lib/quorumDataRecordDto.d.ts.map +1 -1
  228. package/src/lib/services/aliasRegistry.d.ts +77 -0
  229. package/src/lib/services/aliasRegistry.d.ts.map +1 -0
  230. package/src/lib/services/aliasRegistry.js +138 -0
  231. package/src/lib/services/aliasRegistry.js.map +1 -0
  232. package/src/lib/services/auditLogService.d.ts +100 -0
  233. package/src/lib/services/auditLogService.d.ts.map +1 -0
  234. package/src/lib/services/auditLogService.js +223 -0
  235. package/src/lib/services/auditLogService.js.map +1 -0
  236. package/src/lib/services/blockService.d.ts +2 -1
  237. package/src/lib/services/blockService.d.ts.map +1 -1
  238. package/src/lib/services/blockService.js +7 -2
  239. package/src/lib/services/blockService.js.map +1 -1
  240. package/src/lib/services/identitySealingPipeline.d.ts +120 -0
  241. package/src/lib/services/identitySealingPipeline.d.ts.map +1 -0
  242. package/src/lib/services/identitySealingPipeline.js +288 -0
  243. package/src/lib/services/identitySealingPipeline.js.map +1 -0
  244. package/src/lib/services/identityValidator.d.ts +75 -0
  245. package/src/lib/services/identityValidator.d.ts.map +1 -0
  246. package/src/lib/services/identityValidator.js +202 -0
  247. package/src/lib/services/identityValidator.js.map +1 -0
  248. package/src/lib/services/index.d.ts +6 -0
  249. package/src/lib/services/index.d.ts.map +1 -1
  250. package/src/lib/services/index.js +6 -0
  251. package/src/lib/services/index.js.map +1 -1
  252. package/src/lib/services/member/memberCblService.d.ts.map +1 -1
  253. package/src/lib/services/member/memberCblService.js +12 -1
  254. package/src/lib/services/member/memberCblService.js.map +1 -1
  255. package/src/lib/services/memberStore.d.ts.map +1 -1
  256. package/src/lib/services/memberStore.js +2 -0
  257. package/src/lib/services/memberStore.js.map +1 -1
  258. package/src/lib/services/membershipProofService.d.ts +90 -0
  259. package/src/lib/services/membershipProofService.d.ts.map +1 -0
  260. package/src/lib/services/membershipProofService.js +361 -0
  261. package/src/lib/services/membershipProofService.js.map +1 -0
  262. package/src/lib/services/quorumStateMachine.d.ts +336 -0
  263. package/src/lib/services/quorumStateMachine.d.ts.map +1 -0
  264. package/src/lib/services/quorumStateMachine.js +1396 -0
  265. package/src/lib/services/quorumStateMachine.js.map +1 -0
  266. package/src/lib/services/sealing.service.d.ts +80 -0
  267. package/src/lib/services/sealing.service.d.ts.map +1 -1
  268. package/src/lib/services/sealing.service.js +192 -0
  269. package/src/lib/services/sealing.service.js.map +1 -1
  270. package/src/lib/stores/energyAccountStore.d.ts +13 -11
  271. package/src/lib/stores/energyAccountStore.d.ts.map +1 -1
  272. package/src/lib/stores/energyAccountStore.js +18 -20
  273. package/src/lib/stores/energyAccountStore.js.map +1 -1
  274. package/brightchain-lib/BLOCK_COVERAGE_AUDIT.md +0 -169
  275. package/brightchain-lib/BROWSER_COMPAT.md +0 -54
  276. package/brightchain-lib/DEPRECATIONS.md +0 -454
  277. package/brightchain-lib/DEPRECATIONS_REMOVED.md +0 -160
  278. package/brightchain-lib/MIGRATION.md +0 -801
  279. package/brightchain-lib/NAMING_AUDIT.md +0 -233
  280. package/brightchain-lib/NAMING_CONVENTIONS.md +0 -346
  281. package/brightchain-lib/README.md +0 -611
@@ -0,0 +1,361 @@
1
+ "use strict";
2
+ /**
3
+ * @fileoverview MembershipProofService — generates and verifies ring signatures
4
+ * proving quorum membership without revealing which specific member created content.
5
+ *
6
+ * Uses an Abe-Ohkubo-Suzuki (AOS) style ring signature scheme built on
7
+ * secp256k1 ECDSA primitives. The proof is bound to a specific content hash,
8
+ * preventing reuse across different content items.
9
+ *
10
+ * Ring Signature Scheme:
11
+ * - For a ring of n public keys, the signer (at index s) generates a ring
12
+ * of challenges and responses such that the verification equation holds
13
+ * for all members, but only the signer knows which position is theirs.
14
+ * - The challenge chain is: c_{i+1} = H(L || m || g^{r_i} * y_i^{c_i})
15
+ * where L is the key set, m is the message, g is the generator, y_i is
16
+ * the public key at index i, r_i is the response, and c_i is the challenge.
17
+ * - The ring closes when c_0 (computed) matches c_0 (stored).
18
+ *
19
+ * @see Requirements 18
20
+ * @see Design: MembershipProofService (Section 7)
21
+ */
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.MembershipProofService = void 0;
24
+ const sha3_1 = require("@noble/hashes/sha3");
25
+ const secp256k1 = require("secp256k1");
26
+ /** Proof format version byte for forward compatibility */
27
+ const PROOF_VERSION = 0x01;
28
+ /**
29
+ * Compute a 32-byte challenge hash from the ring context.
30
+ *
31
+ * H(keyRing || contentHash || point) → 32 bytes
32
+ *
33
+ * Uses SHA3-512 truncated to 32 bytes to produce a scalar suitable
34
+ * for secp256k1 operations.
35
+ */
36
+ function computeChallenge(keyRing, contentHash, point) {
37
+ const input = new Uint8Array(keyRing.length + contentHash.length + point.length);
38
+ input.set(keyRing, 0);
39
+ input.set(contentHash, keyRing.length);
40
+ input.set(point, keyRing.length + contentHash.length);
41
+ const fullHash = (0, sha3_1.sha3_512)(input);
42
+ // Truncate to 32 bytes for secp256k1 scalar
43
+ return fullHash.slice(0, 32);
44
+ }
45
+ /**
46
+ * Serialize the sorted key ring into a single buffer for hashing.
47
+ * Keys are sorted lexicographically to ensure deterministic ordering
48
+ * regardless of input order.
49
+ */
50
+ function serializeKeyRing(memberPublicKeys) {
51
+ // Sort keys lexicographically for deterministic ring ordering
52
+ const sorted = [...memberPublicKeys].sort((a, b) => {
53
+ const len = Math.min(a.length, b.length);
54
+ for (let i = 0; i < len; i++) {
55
+ if (a[i] !== b[i])
56
+ return a[i] - b[i];
57
+ }
58
+ return a.length - b.length;
59
+ });
60
+ const totalLen = sorted.reduce((sum, k) => sum + k.length, 0);
61
+ const result = new Uint8Array(totalLen);
62
+ let offset = 0;
63
+ for (const key of sorted) {
64
+ result.set(key, offset);
65
+ offset += key.length;
66
+ }
67
+ return result;
68
+ }
69
+ /**
70
+ * Find the index of the signer's public key in the member key array.
71
+ * Derives the public key from the private key and matches against
72
+ * compressed public keys.
73
+ */
74
+ function findSignerIndex(signerPrivateKey, memberPublicKeys) {
75
+ const signerPubKey = secp256k1.publicKeyCreate(signerPrivateKey, true);
76
+ for (let i = 0; i < memberPublicKeys.length; i++) {
77
+ const compressed = secp256k1.publicKeyConvert(memberPublicKeys[i], true);
78
+ if (compressed.length === signerPubKey.length &&
79
+ compressed.every((byte, idx) => byte === signerPubKey[idx])) {
80
+ return i;
81
+ }
82
+ }
83
+ return -1;
84
+ }
85
+ /**
86
+ * Generate cryptographically secure random bytes.
87
+ */
88
+ function getRandomBytes(length) {
89
+ const bytes = new Uint8Array(length);
90
+ // Use Node.js crypto for secure random generation
91
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
92
+ const crypto = require('crypto');
93
+ crypto.randomFillSync(bytes);
94
+ return bytes;
95
+ }
96
+ /**
97
+ * Generate a valid random secp256k1 private key (scalar).
98
+ * Ensures the key is valid (non-zero, less than curve order).
99
+ */
100
+ function generateRandomScalar() {
101
+ let key;
102
+ do {
103
+ key = getRandomBytes(32);
104
+ } while (!secp256k1.privateKeyVerify(key));
105
+ return key;
106
+ }
107
+ /**
108
+ * Compute g^response * pubKey^challenge (EC point addition).
109
+ *
110
+ * This is the core ring signature verification equation for one step:
111
+ * R_i = g * r_i + y_i * c_i
112
+ *
113
+ * Where g is the secp256k1 generator, r_i is the response scalar,
114
+ * y_i is the public key, and c_i is the challenge scalar.
115
+ */
116
+ function computeRingPoint(response, publicKey, challenge) {
117
+ // g * response = publicKeyCreate(response)
118
+ const gR = secp256k1.publicKeyCreate(response, true);
119
+ // pubKey * challenge = publicKeyTweakMul(pubKey, challenge)
120
+ const compressed = secp256k1.publicKeyConvert(publicKey, true);
121
+ const yC = secp256k1.publicKeyTweakMul(compressed, challenge);
122
+ // Point addition: gR + yC
123
+ return secp256k1.publicKeyCombine([gR, yC], true);
124
+ }
125
+ /**
126
+ * Subtract two 32-byte scalars modulo the secp256k1 curve order.
127
+ * result = (a - b) mod n
128
+ *
129
+ * Uses privateKeyNegate and privateKeyTweakAdd:
130
+ * a - b = a + (-b)
131
+ */
132
+ function scalarSubtract(a, b) {
133
+ // Negate b: -b mod n
134
+ const negB = new Uint8Array(b);
135
+ secp256k1.privateKeyNegate(negB);
136
+ // a + (-b) mod n
137
+ const result = new Uint8Array(a);
138
+ secp256k1.privateKeyTweakAdd(result, negB);
139
+ return result;
140
+ }
141
+ /**
142
+ * Multiply two 32-byte scalars modulo the secp256k1 curve order.
143
+ * result = (a * b) mod n
144
+ *
145
+ * Uses privateKeyTweakMul which computes (key * tweak) mod n.
146
+ */
147
+ function scalarMultiply(a, b) {
148
+ const result = new Uint8Array(a);
149
+ secp256k1.privateKeyTweakMul(result, b);
150
+ return result;
151
+ }
152
+ /**
153
+ * MembershipProofService generates and verifies ring signatures
154
+ * proving quorum membership without revealing which member.
155
+ *
156
+ * The ring signature scheme ensures:
157
+ * - Any member can generate a valid proof
158
+ * - The proof is bound to specific content (content hash)
159
+ * - Verification succeeds against the full member key set
160
+ * - No information about which member generated the proof is leaked
161
+ *
162
+ * Proof format (serialized):
163
+ * [version: 1 byte] [n: 2 bytes (uint16 BE)] [c0: 32 bytes] [r0: 32 bytes] ... [r_{n-1}: 32 bytes]
164
+ *
165
+ * @template TID - Platform ID type for frontend/backend DTO compatibility
166
+ */
167
+ class MembershipProofService {
168
+ /**
169
+ * Generate a ring signature proving the signer is one of the current
170
+ * quorum members. The proof is bound to the specific content hash.
171
+ *
172
+ * Algorithm (AOS ring signature):
173
+ * 1. Find signer's index s in the key ring
174
+ * 2. Generate random k (nonce) for the signer's position
175
+ * 3. Compute initial point: g^k
176
+ * 4. For positions (s+1) to (s-1) mod n, generate random responses
177
+ * and compute the challenge chain
178
+ * 5. Close the ring by computing the signer's response:
179
+ * r_s = k - c_s * privateKey mod n
180
+ *
181
+ * @param signerPrivateKey - The signer's secp256k1 private key (32 bytes)
182
+ * @param memberPublicKeys - Public keys of all current quorum members
183
+ * @param contentHash - Hash of the content being signed
184
+ * @returns The serialized ring signature proof
185
+ * @throws Error if signer is not in the member set or member set is empty
186
+ */
187
+ async generateProof(signerPrivateKey, memberPublicKeys, contentHash) {
188
+ const n = memberPublicKeys.length;
189
+ if (n === 0) {
190
+ throw new Error('Member public key set must not be empty');
191
+ }
192
+ // Find signer's position in the ring
193
+ const signerIndex = findSignerIndex(signerPrivateKey, memberPublicKeys);
194
+ if (signerIndex === -1) {
195
+ throw new Error('Signer is not a member of the provided key set');
196
+ }
197
+ const keyRing = serializeKeyRing(memberPublicKeys);
198
+ // Step 1: Generate random nonce k for the signer
199
+ const k = generateRandomScalar();
200
+ // Step 2: Compute the initial point g^k
201
+ const gK = secp256k1.publicKeyCreate(k, true);
202
+ // Step 3: Compute challenge at position (signerIndex + 1) mod n
203
+ const challenges = new Array(n);
204
+ const responses = new Array(n);
205
+ const nextIdx = (signerIndex + 1) % n;
206
+ challenges[nextIdx] = computeChallenge(keyRing, contentHash, gK);
207
+ // Step 4: For each position from (s+1) to (s-1), generate random
208
+ // responses and compute the challenge chain
209
+ for (let offset = 1; offset < n; offset++) {
210
+ const i = (signerIndex + offset) % n;
211
+ const nextI = (i + 1) % n;
212
+ // Generate random response for position i
213
+ responses[i] = generateRandomScalar();
214
+ // Compute ring point: g^{r_i} * y_i^{c_i}
215
+ const point = computeRingPoint(responses[i], memberPublicKeys[i], challenges[i]);
216
+ // Compute next challenge
217
+ challenges[nextI] = computeChallenge(keyRing, contentHash, point);
218
+ }
219
+ // Step 5: Close the ring — compute signer's response
220
+ // r_s = k - c_s * privateKey mod n
221
+ const cTimesKey = scalarMultiply(challenges[signerIndex], signerPrivateKey);
222
+ responses[signerIndex] = scalarSubtract(k, cTimesKey);
223
+ // Wipe the nonce from memory
224
+ k.fill(0);
225
+ // Serialize the proof
226
+ return this.serializeProof(challenges[0], responses, n);
227
+ }
228
+ /**
229
+ * Verify a membership proof against the current member set and content hash.
230
+ *
231
+ * Algorithm:
232
+ * 1. Deserialize the proof to extract c_0 and all responses
233
+ * 2. Recompute the challenge chain starting from c_0:
234
+ * For each i: point_i = g^{r_i} * y_i^{c_i}, c_{i+1} = H(L, m, point_i)
235
+ * 3. The ring is valid if the recomputed c_0 matches the stored c_0
236
+ *
237
+ * @param proof - The serialized ring signature proof
238
+ * @param memberPublicKeys - Public keys of all current quorum members
239
+ * @param contentHash - Hash of the content the proof should be bound to
240
+ * @returns True if the proof is valid
241
+ */
242
+ async verifyProof(proof, memberPublicKeys, contentHash) {
243
+ try {
244
+ const n = memberPublicKeys.length;
245
+ if (n === 0) {
246
+ return false;
247
+ }
248
+ // Deserialize the proof
249
+ const parsed = this.deserializeProof(proof);
250
+ if (!parsed) {
251
+ return false;
252
+ }
253
+ const { c0, responses } = parsed;
254
+ // The proof must have the same number of responses as member keys
255
+ if (responses.length !== n) {
256
+ return false;
257
+ }
258
+ // Validate all public keys
259
+ for (const key of memberPublicKeys) {
260
+ if (!secp256k1.publicKeyVerify(key)) {
261
+ return false;
262
+ }
263
+ }
264
+ const keyRing = serializeKeyRing(memberPublicKeys);
265
+ // Recompute the challenge chain
266
+ let currentChallenge = c0;
267
+ for (let i = 0; i < n; i++) {
268
+ // Validate the response is a valid scalar
269
+ if (!secp256k1.privateKeyVerify(responses[i])) {
270
+ return false;
271
+ }
272
+ // Compute ring point: g^{r_i} * y_i^{c_i}
273
+ const point = computeRingPoint(responses[i], memberPublicKeys[i], currentChallenge);
274
+ // Compute next challenge
275
+ currentChallenge = computeChallenge(keyRing, contentHash, point);
276
+ }
277
+ // The ring is valid if we arrive back at c_0
278
+ if (currentChallenge.length !== c0.length) {
279
+ return false;
280
+ }
281
+ // Constant-time comparison to prevent timing attacks
282
+ let diff = 0;
283
+ for (let i = 0; i < c0.length; i++) {
284
+ diff |= currentChallenge[i] ^ c0[i];
285
+ }
286
+ return diff === 0;
287
+ }
288
+ catch {
289
+ return false;
290
+ }
291
+ }
292
+ /**
293
+ * Serialize a ring signature proof into bytes.
294
+ *
295
+ * Format:
296
+ * [version: 1 byte] [n: 2 bytes uint16 BE] [c0: 32 bytes] [r_0: 32 bytes] ... [r_{n-1}: 32 bytes]
297
+ */
298
+ serializeProof(c0, responses, n) {
299
+ // 1 (version) + 2 (n) + 32 (c0) + n * 32 (responses)
300
+ const totalLen = 1 + 2 + 32 + n * 32;
301
+ const result = new Uint8Array(totalLen);
302
+ let offset = 0;
303
+ // Version byte
304
+ result[offset] = PROOF_VERSION;
305
+ offset += 1;
306
+ // Ring size as uint16 big-endian
307
+ result[offset] = (n >> 8) & 0xff;
308
+ result[offset + 1] = n & 0xff;
309
+ offset += 2;
310
+ // Initial challenge c0
311
+ result.set(c0, offset);
312
+ offset += 32;
313
+ // Responses
314
+ for (let i = 0; i < n; i++) {
315
+ result.set(responses[i], offset);
316
+ offset += 32;
317
+ }
318
+ return result;
319
+ }
320
+ /**
321
+ * Deserialize a ring signature proof from bytes.
322
+ *
323
+ * @returns Parsed proof components or null if the format is invalid
324
+ */
325
+ deserializeProof(proof) {
326
+ // Minimum size: 1 (version) + 2 (n) + 32 (c0) + 32 (at least 1 response)
327
+ if (proof.length < 1 + 2 + 32 + 32) {
328
+ return null;
329
+ }
330
+ let offset = 0;
331
+ // Check version
332
+ const version = proof[offset];
333
+ if (version !== PROOF_VERSION) {
334
+ return null;
335
+ }
336
+ offset += 1;
337
+ // Read ring size
338
+ const n = (proof[offset] << 8) | proof[offset + 1];
339
+ offset += 2;
340
+ if (n === 0) {
341
+ return null;
342
+ }
343
+ // Verify total length matches
344
+ const expectedLen = 1 + 2 + 32 + n * 32;
345
+ if (proof.length !== expectedLen) {
346
+ return null;
347
+ }
348
+ // Read c0
349
+ const c0 = proof.slice(offset, offset + 32);
350
+ offset += 32;
351
+ // Read responses
352
+ const responses = [];
353
+ for (let i = 0; i < n; i++) {
354
+ responses.push(proof.slice(offset, offset + 32));
355
+ offset += 32;
356
+ }
357
+ return { c0, responses };
358
+ }
359
+ }
360
+ exports.MembershipProofService = MembershipProofService;
361
+ //# sourceMappingURL=membershipProofService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"membershipProofService.js","sourceRoot":"","sources":["../../../../../brightchain-lib/src/lib/services/membershipProofService.ts"],"names":[],"mappings":"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"}