@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.
- package/package.json +6 -2
- package/src/lib/documents/member/memberProfileHydration.d.ts.map +1 -1
- package/src/lib/documents/member/memberProfileHydration.js +6 -0
- package/src/lib/documents/member/memberProfileHydration.js.map +1 -1
- package/src/lib/enumerations/brightChainStrings.d.ts +39 -0
- package/src/lib/enumerations/brightChainStrings.d.ts.map +1 -1
- package/src/lib/enumerations/brightChainStrings.js +47 -0
- package/src/lib/enumerations/brightChainStrings.js.map +1 -1
- package/src/lib/enumerations/identityValidationErrorType.d.ts +11 -0
- package/src/lib/enumerations/identityValidationErrorType.d.ts.map +1 -0
- package/src/lib/enumerations/identityValidationErrorType.js +15 -0
- package/src/lib/enumerations/identityValidationErrorType.js.map +1 -0
- package/src/lib/enumerations/index.d.ts +4 -0
- package/src/lib/enumerations/index.d.ts.map +1 -1
- package/src/lib/enumerations/index.js +5 -0
- package/src/lib/enumerations/index.js.map +1 -1
- package/src/lib/enumerations/memberStatusType.d.ts +2 -1
- package/src/lib/enumerations/memberStatusType.d.ts.map +1 -1
- package/src/lib/enumerations/memberStatusType.js +1 -0
- package/src/lib/enumerations/memberStatusType.js.map +1 -1
- package/src/lib/enumerations/proposalActionType.d.ts +22 -0
- package/src/lib/enumerations/proposalActionType.d.ts.map +1 -0
- package/src/lib/enumerations/proposalActionType.js +26 -0
- package/src/lib/enumerations/proposalActionType.js.map +1 -0
- package/src/lib/enumerations/proposalStatus.d.ts +14 -0
- package/src/lib/enumerations/proposalStatus.d.ts.map +1 -0
- package/src/lib/enumerations/proposalStatus.js +18 -0
- package/src/lib/enumerations/proposalStatus.js.map +1 -0
- package/src/lib/enumerations/quorumErrorType.d.ts +30 -1
- package/src/lib/enumerations/quorumErrorType.d.ts.map +1 -1
- package/src/lib/enumerations/quorumErrorType.js +37 -0
- package/src/lib/enumerations/quorumErrorType.js.map +1 -1
- package/src/lib/enumerations/quorumOperationalMode.d.ts +16 -0
- package/src/lib/enumerations/quorumOperationalMode.d.ts.map +1 -0
- package/src/lib/enumerations/quorumOperationalMode.js +20 -0
- package/src/lib/enumerations/quorumOperationalMode.js.map +1 -0
- package/src/lib/enumerations/sealingErrorType.d.ts +3 -1
- package/src/lib/enumerations/sealingErrorType.d.ts.map +1 -1
- package/src/lib/enumerations/sealingErrorType.js +2 -0
- package/src/lib/enumerations/sealingErrorType.js.map +1 -1
- package/src/lib/errors/identityValidationError.d.ts +8 -0
- package/src/lib/errors/identityValidationError.d.ts.map +1 -0
- package/src/lib/errors/identityValidationError.js +26 -0
- package/src/lib/errors/identityValidationError.js.map +1 -0
- package/src/lib/errors/index.d.ts +4 -0
- package/src/lib/errors/index.d.ts.map +1 -1
- package/src/lib/errors/index.js +7 -0
- package/src/lib/errors/index.js.map +1 -1
- package/src/lib/errors/quorumError.d.ts.map +1 -1
- package/src/lib/errors/quorumError.js +37 -0
- package/src/lib/errors/quorumError.js.map +1 -1
- package/src/lib/errors/sealingError.d.ts.map +1 -1
- package/src/lib/errors/sealingError.js +2 -0
- package/src/lib/errors/sealingError.js.map +1 -1
- package/src/lib/i18n/strings/englishUs.d.ts.map +1 -1
- package/src/lib/i18n/strings/englishUs.js +45 -0
- package/src/lib/i18n/strings/englishUs.js.map +1 -1
- package/src/lib/i18n/strings/french.d.ts.map +1 -1
- package/src/lib/i18n/strings/french.js +37 -0
- package/src/lib/i18n/strings/french.js.map +1 -1
- package/src/lib/i18n/strings/german.d.ts.map +1 -1
- package/src/lib/i18n/strings/german.js +37 -0
- package/src/lib/i18n/strings/german.js.map +1 -1
- package/src/lib/i18n/strings/japanese.d.ts.map +1 -1
- package/src/lib/i18n/strings/japanese.js +37 -0
- package/src/lib/i18n/strings/japanese.js.map +1 -1
- package/src/lib/i18n/strings/mandarin.d.ts.map +1 -1
- package/src/lib/i18n/strings/mandarin.js +37 -0
- package/src/lib/i18n/strings/mandarin.js.map +1 -1
- package/src/lib/i18n/strings/spanish.d.ts.map +1 -1
- package/src/lib/i18n/strings/spanish.js +37 -0
- package/src/lib/i18n/strings/spanish.js.map +1 -1
- package/src/lib/i18n/strings/ukrainian.d.ts.map +1 -1
- package/src/lib/i18n/strings/ukrainian.js +37 -0
- package/src/lib/i18n/strings/ukrainian.js.map +1 -1
- package/src/lib/interfaces/aliasRecord.d.ts +34 -0
- package/src/lib/interfaces/aliasRecord.d.ts.map +1 -0
- package/src/lib/interfaces/aliasRecord.js +11 -0
- package/src/lib/interfaces/aliasRecord.js.map +1 -0
- package/src/lib/interfaces/api/index.d.ts +2 -0
- package/src/lib/interfaces/api/index.d.ts.map +1 -0
- package/src/lib/interfaces/api/index.js +5 -0
- package/src/lib/interfaces/api/index.js.map +1 -0
- package/src/lib/interfaces/api/quorumApi.d.ts +97 -0
- package/src/lib/interfaces/api/quorumApi.d.ts.map +1 -0
- package/src/lib/interfaces/api/quorumApi.js +12 -0
- package/src/lib/interfaces/api/quorumApi.js.map +1 -0
- package/src/lib/interfaces/auditLogEntry.d.ts +34 -0
- package/src/lib/interfaces/auditLogEntry.d.ts.map +1 -0
- package/src/lib/interfaces/auditLogEntry.js +10 -0
- package/src/lib/interfaces/auditLogEntry.js.map +1 -0
- package/src/lib/interfaces/availability/gossipService.d.ts +116 -2
- package/src/lib/interfaces/availability/gossipService.d.ts.map +1 -1
- package/src/lib/interfaces/availability/gossipService.js +62 -0
- package/src/lib/interfaces/availability/gossipService.js.map +1 -1
- package/src/lib/interfaces/chainedAuditLogEntry.d.ts +27 -0
- package/src/lib/interfaces/chainedAuditLogEntry.d.ts.map +1 -0
- package/src/lib/interfaces/chainedAuditLogEntry.js +12 -0
- package/src/lib/interfaces/chainedAuditLogEntry.js.map +1 -0
- package/src/lib/interfaces/contentWithIdentity.d.ts +39 -0
- package/src/lib/interfaces/contentWithIdentity.d.ts.map +1 -0
- package/src/lib/interfaces/contentWithIdentity.js +24 -0
- package/src/lib/interfaces/contentWithIdentity.js.map +1 -0
- package/src/lib/interfaces/energyAccount.d.ts +3 -1
- package/src/lib/interfaces/energyAccount.d.ts.map +1 -1
- package/src/lib/interfaces/identityRecoveryRecord.d.ts +41 -0
- package/src/lib/interfaces/identityRecoveryRecord.d.ts.map +1 -0
- package/src/lib/interfaces/identityRecoveryRecord.js +11 -0
- package/src/lib/interfaces/identityRecoveryRecord.js.map +1 -0
- package/src/lib/interfaces/index.d.ts +16 -0
- package/src/lib/interfaces/index.d.ts.map +1 -1
- package/src/lib/interfaces/index.js +4 -0
- package/src/lib/interfaces/index.js.map +1 -1
- package/src/lib/interfaces/initResult.d.ts +6 -6
- package/src/lib/interfaces/initResult.d.ts.map +1 -1
- package/src/lib/interfaces/member/brightChainBaseInitResult.d.ts +4 -1
- package/src/lib/interfaces/member/brightChainBaseInitResult.d.ts.map +1 -1
- package/src/lib/interfaces/member/brightChainInitResult.d.ts +1 -1
- package/src/lib/interfaces/member/brightChainInitResult.d.ts.map +1 -1
- package/src/lib/interfaces/member/memberData.d.ts +3 -0
- package/src/lib/interfaces/member/memberData.d.ts.map +1 -1
- package/src/lib/interfaces/member/profileStorage.d.ts +5 -0
- package/src/lib/interfaces/member/profileStorage.d.ts.map +1 -1
- package/src/lib/interfaces/operationalState.d.ts +20 -0
- package/src/lib/interfaces/operationalState.d.ts.map +1 -0
- package/src/lib/interfaces/operationalState.js +10 -0
- package/src/lib/interfaces/operationalState.js.map +1 -0
- package/src/lib/interfaces/proposal.d.ts +59 -0
- package/src/lib/interfaces/proposal.d.ts.map +1 -0
- package/src/lib/interfaces/proposal.js +10 -0
- package/src/lib/interfaces/proposal.js.map +1 -0
- package/src/lib/interfaces/quorumDocumentMetadata.d.ts +20 -0
- package/src/lib/interfaces/quorumDocumentMetadata.d.ts.map +1 -0
- package/src/lib/interfaces/quorumDocumentMetadata.js +10 -0
- package/src/lib/interfaces/quorumDocumentMetadata.js.map +1 -0
- package/src/lib/interfaces/quorumEpoch.d.ts +33 -0
- package/src/lib/interfaces/quorumEpoch.d.ts.map +1 -0
- package/src/lib/interfaces/quorumEpoch.js +11 -0
- package/src/lib/interfaces/quorumEpoch.js.map +1 -0
- package/src/lib/interfaces/quorumMetrics.d.ts +49 -0
- package/src/lib/interfaces/quorumMetrics.d.ts.map +1 -0
- package/src/lib/interfaces/quorumMetrics.js +10 -0
- package/src/lib/interfaces/quorumMetrics.js.map +1 -0
- package/src/lib/interfaces/redistributionJournalEntry.d.ts +25 -0
- package/src/lib/interfaces/redistributionJournalEntry.d.ts.map +1 -0
- package/src/lib/interfaces/redistributionJournalEntry.js +11 -0
- package/src/lib/interfaces/redistributionJournalEntry.js.map +1 -0
- package/src/lib/interfaces/responses/backupCodesResponseData.d.ts +3 -5
- package/src/lib/interfaces/responses/backupCodesResponseData.d.ts.map +1 -1
- package/src/lib/interfaces/responses/challengeResponseData.d.ts +5 -0
- package/src/lib/interfaces/responses/challengeResponseData.d.ts.map +1 -1
- package/src/lib/interfaces/responses/codeCountResponseData.d.ts +3 -5
- package/src/lib/interfaces/responses/codeCountResponseData.d.ts.map +1 -1
- package/src/lib/interfaces/responses/index.d.ts +4 -2
- package/src/lib/interfaces/responses/index.d.ts.map +1 -1
- package/src/lib/interfaces/responses/passwordChangeResponse.d.ts +2 -0
- package/src/lib/interfaces/responses/passwordChangeResponse.d.ts.map +1 -0
- package/src/lib/interfaces/responses/passwordChangeResponse.js +3 -0
- package/src/lib/interfaces/responses/passwordChangeResponse.js.map +1 -0
- package/src/lib/interfaces/responses/recoveryResponse.d.ts +2 -0
- package/src/lib/interfaces/responses/recoveryResponse.d.ts.map +1 -0
- package/src/lib/interfaces/responses/recoveryResponse.js +3 -0
- package/src/lib/interfaces/responses/recoveryResponse.js.map +1 -0
- package/src/lib/interfaces/responses/registrationResponseData.d.ts +2 -2
- package/src/lib/interfaces/responses/registrationResponseData.d.ts.map +1 -1
- package/src/lib/interfaces/services/contentIngestion.d.ts +61 -0
- package/src/lib/interfaces/services/contentIngestion.d.ts.map +1 -0
- package/src/lib/interfaces/services/contentIngestion.js +12 -0
- package/src/lib/interfaces/services/contentIngestion.js.map +1 -0
- package/src/lib/interfaces/services/expirationScheduler.d.ts +55 -0
- package/src/lib/interfaces/services/expirationScheduler.d.ts.map +1 -0
- package/src/lib/interfaces/services/expirationScheduler.js +11 -0
- package/src/lib/interfaces/services/expirationScheduler.js.map +1 -0
- package/src/lib/interfaces/services/identitySealingPipeline.d.ts +56 -0
- package/src/lib/interfaces/services/identitySealingPipeline.d.ts.map +1 -0
- package/src/lib/interfaces/services/identitySealingPipeline.js +12 -0
- package/src/lib/interfaces/services/identitySealingPipeline.js.map +1 -0
- package/src/lib/interfaces/services/identityValidator.d.ts +44 -0
- package/src/lib/interfaces/services/identityValidator.d.ts.map +1 -0
- package/src/lib/interfaces/services/identityValidator.js +11 -0
- package/src/lib/interfaces/services/identityValidator.js.map +1 -0
- package/src/lib/interfaces/services/index.d.ts +9 -0
- package/src/lib/interfaces/services/index.d.ts.map +1 -1
- package/src/lib/interfaces/services/membershipProof.d.ts +40 -0
- package/src/lib/interfaces/services/membershipProof.d.ts.map +1 -0
- package/src/lib/interfaces/services/membershipProof.js +11 -0
- package/src/lib/interfaces/services/membershipProof.js.map +1 -0
- package/src/lib/interfaces/services/operatorPrompt.d.ts +68 -0
- package/src/lib/interfaces/services/operatorPrompt.d.ts.map +1 -0
- package/src/lib/interfaces/services/operatorPrompt.js +11 -0
- package/src/lib/interfaces/services/operatorPrompt.js.map +1 -0
- package/src/lib/interfaces/services/quorumDatabase.d.ts +207 -0
- package/src/lib/interfaces/services/quorumDatabase.d.ts.map +1 -0
- package/src/lib/interfaces/services/quorumDatabase.js +13 -0
- package/src/lib/interfaces/services/quorumDatabase.js.map +1 -0
- package/src/lib/interfaces/services/quorumService.d.ts +3 -0
- package/src/lib/interfaces/services/quorumService.d.ts.map +1 -1
- package/src/lib/interfaces/services/quorumStateMachine.d.ts +128 -0
- package/src/lib/interfaces/services/quorumStateMachine.d.ts.map +1 -0
- package/src/lib/interfaces/services/quorumStateMachine.js +12 -0
- package/src/lib/interfaces/services/quorumStateMachine.js.map +1 -0
- package/src/lib/interfaces/services/redistributionConfig.d.ts +20 -0
- package/src/lib/interfaces/services/redistributionConfig.d.ts.map +1 -0
- package/src/lib/interfaces/services/redistributionConfig.js +10 -0
- package/src/lib/interfaces/services/redistributionConfig.js.map +1 -0
- package/src/lib/interfaces/statuteConfig.d.ts +22 -0
- package/src/lib/interfaces/statuteConfig.d.ts.map +1 -0
- package/src/lib/interfaces/statuteConfig.js +18 -0
- package/src/lib/interfaces/statuteConfig.js.map +1 -0
- package/src/lib/interfaces/storage/documentStore.d.ts +46 -24
- package/src/lib/interfaces/storage/documentStore.d.ts.map +1 -1
- package/src/lib/interfaces/storage/documentStore.js +6 -2
- package/src/lib/interfaces/storage/documentStore.js.map +1 -1
- package/src/lib/interfaces/userManagement.d.ts +49 -0
- package/src/lib/interfaces/userManagement.d.ts.map +1 -0
- package/src/lib/interfaces/userManagement.js +9 -0
- package/src/lib/interfaces/userManagement.js.map +1 -0
- package/src/lib/interfaces/vote.d.ts +45 -0
- package/src/lib/interfaces/vote.d.ts.map +1 -0
- package/src/lib/interfaces/vote.js +10 -0
- package/src/lib/interfaces/vote.js.map +1 -0
- package/src/lib/quorumDataRecord.d.ts +7 -1
- package/src/lib/quorumDataRecord.d.ts.map +1 -1
- package/src/lib/quorumDataRecord.js +12 -4
- package/src/lib/quorumDataRecord.js.map +1 -1
- package/src/lib/quorumDataRecordDto.d.ts +6 -0
- package/src/lib/quorumDataRecordDto.d.ts.map +1 -1
- package/src/lib/services/aliasRegistry.d.ts +77 -0
- package/src/lib/services/aliasRegistry.d.ts.map +1 -0
- package/src/lib/services/aliasRegistry.js +138 -0
- package/src/lib/services/aliasRegistry.js.map +1 -0
- package/src/lib/services/auditLogService.d.ts +100 -0
- package/src/lib/services/auditLogService.d.ts.map +1 -0
- package/src/lib/services/auditLogService.js +223 -0
- package/src/lib/services/auditLogService.js.map +1 -0
- package/src/lib/services/blockService.d.ts +2 -1
- package/src/lib/services/blockService.d.ts.map +1 -1
- package/src/lib/services/blockService.js +7 -2
- package/src/lib/services/blockService.js.map +1 -1
- package/src/lib/services/identitySealingPipeline.d.ts +120 -0
- package/src/lib/services/identitySealingPipeline.d.ts.map +1 -0
- package/src/lib/services/identitySealingPipeline.js +288 -0
- package/src/lib/services/identitySealingPipeline.js.map +1 -0
- package/src/lib/services/identityValidator.d.ts +75 -0
- package/src/lib/services/identityValidator.d.ts.map +1 -0
- package/src/lib/services/identityValidator.js +202 -0
- package/src/lib/services/identityValidator.js.map +1 -0
- package/src/lib/services/index.d.ts +6 -0
- package/src/lib/services/index.d.ts.map +1 -1
- package/src/lib/services/index.js +6 -0
- package/src/lib/services/index.js.map +1 -1
- package/src/lib/services/member/memberCblService.d.ts.map +1 -1
- package/src/lib/services/member/memberCblService.js +12 -1
- package/src/lib/services/member/memberCblService.js.map +1 -1
- package/src/lib/services/memberStore.d.ts.map +1 -1
- package/src/lib/services/memberStore.js +2 -0
- package/src/lib/services/memberStore.js.map +1 -1
- package/src/lib/services/membershipProofService.d.ts +90 -0
- package/src/lib/services/membershipProofService.d.ts.map +1 -0
- package/src/lib/services/membershipProofService.js +361 -0
- package/src/lib/services/membershipProofService.js.map +1 -0
- package/src/lib/services/quorumStateMachine.d.ts +336 -0
- package/src/lib/services/quorumStateMachine.d.ts.map +1 -0
- package/src/lib/services/quorumStateMachine.js +1396 -0
- package/src/lib/services/quorumStateMachine.js.map +1 -0
- package/src/lib/services/sealing.service.d.ts +80 -0
- package/src/lib/services/sealing.service.d.ts.map +1 -1
- package/src/lib/services/sealing.service.js +192 -0
- package/src/lib/services/sealing.service.js.map +1 -1
- package/src/lib/stores/energyAccountStore.d.ts +13 -11
- package/src/lib/stores/energyAccountStore.d.ts.map +1 -1
- package/src/lib/stores/energyAccountStore.js +18 -20
- package/src/lib/stores/energyAccountStore.js.map +1 -1
- package/brightchain-lib/BLOCK_COVERAGE_AUDIT.md +0 -169
- package/brightchain-lib/BROWSER_COMPAT.md +0 -54
- package/brightchain-lib/DEPRECATIONS.md +0 -454
- package/brightchain-lib/DEPRECATIONS_REMOVED.md +0 -160
- package/brightchain-lib/MIGRATION.md +0 -801
- package/brightchain-lib/NAMING_AUDIT.md +0 -233
- package/brightchain-lib/NAMING_CONVENTIONS.md +0 -346
- 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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"}
|