@brightchain/brightchain-api-lib 0.14.0 → 0.15.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 +5 -5
- package/src/index.d.ts +3 -0
- package/src/index.d.ts.map +1 -1
- package/src/index.js +5 -0
- package/src/index.js.map +1 -1
- package/src/lib/application.d.ts +1 -0
- package/src/lib/application.d.ts.map +1 -1
- package/src/lib/application.js +23 -0
- package/src/lib/application.js.map +1 -1
- package/src/lib/auth/aclEnforcedAvailability.d.ts +57 -0
- package/src/lib/auth/aclEnforcedAvailability.d.ts.map +1 -0
- package/src/lib/auth/aclEnforcedAvailability.js +87 -0
- package/src/lib/auth/aclEnforcedAvailability.js.map +1 -0
- package/src/lib/auth/aclEnforcedBlockStore.d.ts +66 -0
- package/src/lib/auth/aclEnforcedBlockStore.d.ts.map +1 -0
- package/src/lib/auth/aclEnforcedBlockStore.js +83 -0
- package/src/lib/auth/aclEnforcedBlockStore.js.map +1 -0
- package/src/lib/auth/ecdsaNodeAuthenticator.d.ts +46 -0
- package/src/lib/auth/ecdsaNodeAuthenticator.d.ts.map +1 -0
- package/src/lib/auth/ecdsaNodeAuthenticator.js +110 -0
- package/src/lib/auth/ecdsaNodeAuthenticator.js.map +1 -0
- package/src/lib/auth/index.d.ts +7 -0
- package/src/lib/auth/index.d.ts.map +1 -0
- package/src/lib/auth/index.js +13 -0
- package/src/lib/auth/index.js.map +1 -0
- package/src/lib/auth/poolAclBootstrap.d.ts +36 -0
- package/src/lib/auth/poolAclBootstrap.d.ts.map +1 -0
- package/src/lib/auth/poolAclBootstrap.js +64 -0
- package/src/lib/auth/poolAclBootstrap.js.map +1 -0
- package/src/lib/auth/poolAclStore.d.ts +77 -0
- package/src/lib/auth/poolAclStore.d.ts.map +1 -0
- package/src/lib/auth/poolAclStore.js +189 -0
- package/src/lib/auth/poolAclStore.js.map +1 -0
- package/src/lib/auth/poolAclUpdater.d.ts +79 -0
- package/src/lib/auth/poolAclUpdater.d.ts.map +1 -0
- package/src/lib/auth/poolAclUpdater.js +144 -0
- package/src/lib/auth/poolAclUpdater.js.map +1 -0
- package/src/lib/availability/availabilityService.d.ts +2 -2
- package/src/lib/availability/availabilityService.d.ts.map +1 -1
- package/src/lib/availability/availabilityService.js +12 -5
- package/src/lib/availability/availabilityService.js.map +1 -1
- package/src/lib/availability/blockRegistry.d.ts +45 -3
- package/src/lib/availability/blockRegistry.d.ts.map +1 -1
- package/src/lib/availability/blockRegistry.js +123 -5
- package/src/lib/availability/blockRegistry.js.map +1 -1
- package/src/lib/availability/discoveryProtocol.d.ts +30 -1
- package/src/lib/availability/discoveryProtocol.d.ts.map +1 -1
- package/src/lib/availability/discoveryProtocol.js +76 -0
- package/src/lib/availability/discoveryProtocol.js.map +1 -1
- package/src/lib/availability/gossipService.d.ts +45 -6
- package/src/lib/availability/gossipService.d.ts.map +1 -1
- package/src/lib/availability/gossipService.js +177 -5
- package/src/lib/availability/gossipService.js.map +1 -1
- package/src/lib/availability/reconciliationService.d.ts +88 -1
- package/src/lib/availability/reconciliationService.d.ts.map +1 -1
- package/src/lib/availability/reconciliationService.js +246 -48
- package/src/lib/availability/reconciliationService.js.map +1 -1
- package/src/lib/blockFetch/blockFetcher.d.ts +100 -0
- package/src/lib/blockFetch/blockFetcher.d.ts.map +1 -0
- package/src/lib/blockFetch/blockFetcher.js +279 -0
- package/src/lib/blockFetch/blockFetcher.js.map +1 -0
- package/src/lib/blockFetch/fetchQueue.d.ts +88 -0
- package/src/lib/blockFetch/fetchQueue.d.ts.map +1 -0
- package/src/lib/blockFetch/fetchQueue.js +204 -0
- package/src/lib/blockFetch/fetchQueue.js.map +1 -0
- package/src/lib/blockFetch/httpBlockFetchTransport.d.ts +65 -0
- package/src/lib/blockFetch/httpBlockFetchTransport.d.ts.map +1 -0
- package/src/lib/blockFetch/httpBlockFetchTransport.js +104 -0
- package/src/lib/blockFetch/httpBlockFetchTransport.js.map +1 -0
- package/src/lib/blockFetch/index.d.ts +10 -0
- package/src/lib/blockFetch/index.d.ts.map +1 -0
- package/src/lib/blockFetch/index.js +13 -0
- package/src/lib/blockFetch/index.js.map +1 -0
- package/src/lib/controllers/api/brightpass.d.ts +72 -0
- package/src/lib/controllers/api/brightpass.d.ts.map +1 -0
- package/src/lib/controllers/api/brightpass.js +577 -0
- package/src/lib/controllers/api/brightpass.js.map +1 -0
- package/src/lib/controllers/api/channels.d.ts +122 -0
- package/src/lib/controllers/api/channels.d.ts.map +1 -0
- package/src/lib/controllers/api/channels.js +701 -0
- package/src/lib/controllers/api/channels.js.map +1 -0
- package/src/lib/controllers/api/conversations.d.ts +89 -0
- package/src/lib/controllers/api/conversations.d.ts.map +1 -0
- package/src/lib/controllers/api/conversations.js +259 -0
- package/src/lib/controllers/api/conversations.js.map +1 -0
- package/src/lib/controllers/api/emails.d.ts +122 -0
- package/src/lib/controllers/api/emails.d.ts.map +1 -0
- package/src/lib/controllers/api/emails.js +494 -0
- package/src/lib/controllers/api/emails.js.map +1 -0
- package/src/lib/controllers/api/explodingMessages.d.ts +79 -0
- package/src/lib/controllers/api/explodingMessages.d.ts.map +1 -0
- package/src/lib/controllers/api/explodingMessages.js +378 -0
- package/src/lib/controllers/api/explodingMessages.js.map +1 -0
- package/src/lib/controllers/api/groups.d.ts +94 -0
- package/src/lib/controllers/api/groups.d.ts.map +1 -0
- package/src/lib/controllers/api/groups.js +484 -0
- package/src/lib/controllers/api/groups.js.map +1 -0
- package/src/lib/controllers/api/index.d.ts +6 -0
- package/src/lib/controllers/api/index.d.ts.map +1 -1
- package/src/lib/controllers/api/index.js +6 -0
- package/src/lib/controllers/api/index.js.map +1 -1
- package/src/lib/controllers/api/messages.d.ts.map +1 -1
- package/src/lib/controllers/api/messages.js +2 -1
- package/src/lib/controllers/api/messages.js.map +1 -1
- package/src/lib/controllers/api/sync.d.ts +38 -2
- package/src/lib/controllers/api/sync.d.ts.map +1 -1
- package/src/lib/controllers/api/sync.js +89 -0
- package/src/lib/controllers/api/sync.js.map +1 -1
- package/src/lib/controllers/crypto/gitController.d.ts +70 -0
- package/src/lib/controllers/crypto/gitController.d.ts.map +1 -0
- package/src/lib/controllers/crypto/gitController.js +306 -0
- package/src/lib/controllers/crypto/gitController.js.map +1 -0
- package/src/lib/controllers/crypto/index.d.ts +3 -0
- package/src/lib/controllers/crypto/index.d.ts.map +1 -0
- package/src/lib/controllers/crypto/index.js +6 -0
- package/src/lib/controllers/crypto/index.js.map +1 -0
- package/src/lib/controllers/crypto/walletController.d.ts +64 -0
- package/src/lib/controllers/crypto/walletController.d.ts.map +1 -0
- package/src/lib/controllers/crypto/walletController.js +260 -0
- package/src/lib/controllers/crypto/walletController.js.map +1 -0
- package/src/lib/controllers/identity/deviceController.d.ts +96 -0
- package/src/lib/controllers/identity/deviceController.d.ts.map +1 -0
- package/src/lib/controllers/identity/deviceController.js +355 -0
- package/src/lib/controllers/identity/deviceController.js.map +1 -0
- package/src/lib/controllers/identity/directoryController.d.ts +75 -0
- package/src/lib/controllers/identity/directoryController.d.ts.map +1 -0
- package/src/lib/controllers/identity/directoryController.js +288 -0
- package/src/lib/controllers/identity/directoryController.js.map +1 -0
- package/src/lib/controllers/identity/identityProofController.d.ts +94 -0
- package/src/lib/controllers/identity/identityProofController.d.ts.map +1 -0
- package/src/lib/controllers/identity/identityProofController.js +454 -0
- package/src/lib/controllers/identity/identityProofController.js.map +1 -0
- package/src/lib/controllers/identity/index.d.ts +4 -0
- package/src/lib/controllers/identity/index.d.ts.map +1 -0
- package/src/lib/controllers/identity/index.js +7 -0
- package/src/lib/controllers/identity/index.js.map +1 -0
- package/src/lib/controllers/index.d.ts +2 -0
- package/src/lib/controllers/index.d.ts.map +1 -1
- package/src/lib/controllers/index.js +2 -0
- package/src/lib/controllers/index.js.map +1 -1
- package/src/lib/encryption/encryptedMetadataService.d.ts +87 -0
- package/src/lib/encryption/encryptedMetadataService.d.ts.map +1 -0
- package/src/lib/encryption/encryptedMetadataService.js +224 -0
- package/src/lib/encryption/encryptedMetadataService.js.map +1 -0
- package/src/lib/encryption/encryptionAwareReplication.d.ts +76 -0
- package/src/lib/encryption/encryptionAwareReplication.d.ts.map +1 -0
- package/src/lib/encryption/encryptionAwareReplication.js +116 -0
- package/src/lib/encryption/encryptionAwareReplication.js.map +1 -0
- package/src/lib/encryption/errors.d.ts +49 -0
- package/src/lib/encryption/errors.d.ts.map +1 -0
- package/src/lib/encryption/errors.js +80 -0
- package/src/lib/encryption/errors.js.map +1 -0
- package/src/lib/encryption/index.d.ts +6 -0
- package/src/lib/encryption/index.d.ts.map +1 -0
- package/src/lib/encryption/index.js +9 -0
- package/src/lib/encryption/index.js.map +1 -0
- package/src/lib/encryption/poolEncryptionService.d.ts +94 -0
- package/src/lib/encryption/poolEncryptionService.d.ts.map +1 -0
- package/src/lib/encryption/poolEncryptionService.js +252 -0
- package/src/lib/encryption/poolEncryptionService.js.map +1 -0
- package/src/lib/encryption/poolKeyManager.d.ts +82 -0
- package/src/lib/encryption/poolKeyManager.d.ts.map +1 -0
- package/src/lib/encryption/poolKeyManager.js +156 -0
- package/src/lib/encryption/poolKeyManager.js.map +1 -0
- package/src/lib/environment.d.ts +3 -0
- package/src/lib/environment.d.ts.map +1 -1
- package/src/lib/environment.js +5 -0
- package/src/lib/environment.js.map +1 -1
- package/src/lib/interfaces/environment.d.ts +7 -1
- package/src/lib/interfaces/environment.d.ts.map +1 -1
- package/src/lib/interfaces/index.d.ts +0 -1
- package/src/lib/interfaces/index.d.ts.map +1 -1
- package/src/lib/interfaces/requests/getBlockDataRequest.d.ts +12 -0
- package/src/lib/interfaces/requests/getBlockDataRequest.d.ts.map +1 -0
- package/src/lib/interfaces/{blockStore.js → requests/getBlockDataRequest.js} +1 -1
- package/src/lib/interfaces/requests/getBlockDataRequest.js.map +1 -0
- package/src/lib/interfaces/requests/index.d.ts +1 -0
- package/src/lib/interfaces/requests/index.d.ts.map +1 -1
- package/src/lib/routers/api.d.ts +54 -1
- package/src/lib/routers/api.d.ts.map +1 -1
- package/src/lib/routers/api.js +77 -0
- package/src/lib/routers/api.js.map +1 -1
- package/src/lib/services/blockStore.d.ts +5 -2
- package/src/lib/services/blockStore.d.ts.map +1 -1
- package/src/lib/services/blockStore.js +4 -0
- package/src/lib/services/blockStore.js.map +1 -1
- package/src/lib/services/brightpass/auditLogger.d.ts +77 -0
- package/src/lib/services/brightpass/auditLogger.d.ts.map +1 -0
- package/src/lib/services/brightpass/auditLogger.js +184 -0
- package/src/lib/services/brightpass/auditLogger.js.map +1 -0
- package/src/lib/services/brightpass/vaultEncryption.d.ts +82 -0
- package/src/lib/services/brightpass/vaultEncryption.d.ts.map +1 -0
- package/src/lib/services/brightpass/vaultEncryption.js +144 -0
- package/src/lib/services/brightpass/vaultEncryption.js.map +1 -0
- package/src/lib/services/brightpass.d.ts +294 -0
- package/src/lib/services/brightpass.d.ts.map +1 -0
- package/src/lib/services/brightpass.js +1260 -0
- package/src/lib/services/brightpass.js.map +1 -0
- package/src/lib/services/eventNotificationSystem.d.ts +69 -3
- package/src/lib/services/eventNotificationSystem.d.ts.map +1 -1
- package/src/lib/services/eventNotificationSystem.js +200 -0
- package/src/lib/services/eventNotificationSystem.js.map +1 -1
- package/src/lib/services/expirationScheduler.d.ts +90 -0
- package/src/lib/services/expirationScheduler.d.ts.map +1 -0
- package/src/lib/services/expirationScheduler.js +131 -0
- package/src/lib/services/expirationScheduler.js.map +1 -0
- package/src/lib/services/fecUsageExample.d.ts +2 -2
- package/src/lib/services/index.d.ts +2 -0
- package/src/lib/services/index.d.ts.map +1 -1
- package/src/lib/services/index.js +2 -0
- package/src/lib/services/index.js.map +1 -1
- package/src/lib/services/paginationService.d.ts +18 -0
- package/src/lib/services/paginationService.d.ts.map +1 -0
- package/src/lib/services/paginationService.js +32 -0
- package/src/lib/services/paginationService.js.map +1 -0
- package/src/lib/services/presenceService.d.ts +76 -0
- package/src/lib/services/presenceService.d.ts.map +1 -0
- package/src/lib/services/presenceService.js +143 -0
- package/src/lib/services/presenceService.js.map +1 -0
- package/src/lib/services/wireConversationPromotion.d.ts +23 -0
- package/src/lib/services/wireConversationPromotion.d.ts.map +1 -0
- package/src/lib/services/wireConversationPromotion.js +26 -0
- package/src/lib/services/wireConversationPromotion.js.map +1 -0
- package/src/lib/stores/availabilityAwareBlockStore.d.ts +115 -10
- package/src/lib/stores/availabilityAwareBlockStore.d.ts.map +1 -1
- package/src/lib/stores/availabilityAwareBlockStore.js +267 -23
- package/src/lib/stores/availabilityAwareBlockStore.js.map +1 -1
- package/src/lib/stores/diskBlockAsyncStore.d.ts +81 -2
- package/src/lib/stores/diskBlockAsyncStore.d.ts.map +1 -1
- package/src/lib/stores/diskBlockAsyncStore.js +297 -10
- package/src/lib/stores/diskBlockAsyncStore.js.map +1 -1
- package/src/lib/utils/communicationValidation.d.ts +44 -0
- package/src/lib/utils/communicationValidation.d.ts.map +1 -0
- package/src/lib/utils/communicationValidation.js +291 -0
- package/src/lib/utils/communicationValidation.js.map +1 -0
- package/src/lib/utils/emailValidation.d.ts +19 -0
- package/src/lib/utils/emailValidation.d.ts.map +1 -0
- package/src/lib/utils/emailValidation.js +232 -0
- package/src/lib/utils/emailValidation.js.map +1 -0
- package/src/lib/interfaces/blockStore.d.ts +0 -7
- package/src/lib/interfaces/blockStore.d.ts.map +0 -1
- package/src/lib/interfaces/blockStore.js.map +0 -1
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AuditLogger = void 0;
|
|
4
|
+
const brightchain_lib_1 = require("@brightchain/brightchain-lib");
|
|
5
|
+
const ecies_lib_1 = require("@digitaldefiance/ecies-lib");
|
|
6
|
+
/**
|
|
7
|
+
* AuditLogger - Stores audit log entries as encrypted blocks
|
|
8
|
+
*
|
|
9
|
+
* Supports two modes:
|
|
10
|
+
* 1. In-memory mode (default): Entries stored in memory array for testing/development
|
|
11
|
+
* 2. Block store mode: Entries persisted as encrypted blocks in BrightChain's block store
|
|
12
|
+
*
|
|
13
|
+
* Entries are append-only and retrieved in reverse chronological order.
|
|
14
|
+
*
|
|
15
|
+
* Requirements: 4.1, 4.2, 4.3, 4.4
|
|
16
|
+
*/
|
|
17
|
+
class AuditLogger {
|
|
18
|
+
/**
|
|
19
|
+
* Create an AuditLogger instance.
|
|
20
|
+
*
|
|
21
|
+
* @param blockStore - Optional block store for encrypted persistence (Req 4.1)
|
|
22
|
+
* @param systemMember - Optional system member with public key for encryption (Req 4.3)
|
|
23
|
+
* @param batchSize - Number of entries to batch before creating a block (default: 10)
|
|
24
|
+
* @param blockSize - Block size for audit log blocks (default: BlockSize.Small)
|
|
25
|
+
*/
|
|
26
|
+
constructor(blockStore, systemMember, batchSize = 10, blockSize = brightchain_lib_1.BlockSize.Small) {
|
|
27
|
+
this.entries = [];
|
|
28
|
+
this.headBlockId = null;
|
|
29
|
+
this.cachedBlockEntries = null;
|
|
30
|
+
this.pendingEntries = [];
|
|
31
|
+
this.persistedEntryCount = 0;
|
|
32
|
+
this.blockStore = blockStore;
|
|
33
|
+
this.systemMember = systemMember;
|
|
34
|
+
this.batchSize = batchSize;
|
|
35
|
+
this.blockSize = blockSize;
|
|
36
|
+
this.blockService = new brightchain_lib_1.BlockService();
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Check if this logger is using encrypted block storage.
|
|
40
|
+
* Requires both a block store and a system member with public key.
|
|
41
|
+
*/
|
|
42
|
+
get isUsingBlockStore() {
|
|
43
|
+
return this.blockStore !== undefined && this.systemMember !== undefined;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Log an audit entry.
|
|
47
|
+
*
|
|
48
|
+
* In block store mode, entries are batched and periodically persisted as encrypted blocks.
|
|
49
|
+
* In memory mode, entries are simply appended to the in-memory array.
|
|
50
|
+
*
|
|
51
|
+
* Requirements: 4.1, 4.2
|
|
52
|
+
*/
|
|
53
|
+
async log(entry) {
|
|
54
|
+
const logEntry = {
|
|
55
|
+
...entry,
|
|
56
|
+
timestamp: new Date(),
|
|
57
|
+
};
|
|
58
|
+
if (this.isUsingBlockStore) {
|
|
59
|
+
this.pendingEntries.push(logEntry);
|
|
60
|
+
if (this.pendingEntries.length >= this.batchSize) {
|
|
61
|
+
await this.flushToBlockStore();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
this.entries.push(logEntry);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Flush pending entries to the block store as an encrypted block.
|
|
70
|
+
* Uses EncryptedBlock for encryption with the system member's public key.
|
|
71
|
+
* Requirements: 4.2, 4.3, 4.4
|
|
72
|
+
*/
|
|
73
|
+
async flushToBlockStore() {
|
|
74
|
+
if (!this.isUsingBlockStore || this.pendingEntries.length === 0) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const block = {
|
|
78
|
+
entries: [...this.pendingEntries],
|
|
79
|
+
previousBlockId: this.headBlockId,
|
|
80
|
+
createdAt: new Date().toISOString(),
|
|
81
|
+
};
|
|
82
|
+
const serialized = JSON.stringify(block);
|
|
83
|
+
const dataBuffer = new TextEncoder().encode(serialized);
|
|
84
|
+
const paddedData = new Uint8Array(this.blockSize);
|
|
85
|
+
paddedData.set(dataBuffer);
|
|
86
|
+
const checksumService = (0, brightchain_lib_1.getGlobalServiceProvider)().checksumService;
|
|
87
|
+
const checksum = checksumService.calculateChecksum(paddedData);
|
|
88
|
+
const ephemeralBlock = await brightchain_lib_1.EphemeralBlock.from(brightchain_lib_1.BlockType.EphemeralOwnedDataBlock, brightchain_lib_1.BlockDataType.EphemeralStructuredData, this.blockSize, paddedData, checksum, this.systemMember, new Date(), dataBuffer.length);
|
|
89
|
+
const encryptedBlock = await this.blockService.encrypt(brightchain_lib_1.BlockType.EncryptedOwnedDataBlock, ephemeralBlock, this.systemMember);
|
|
90
|
+
// Store the encrypted block - the block store uses the block's checksum as the key
|
|
91
|
+
await this.blockStore.put(encryptedBlock.idChecksum, encryptedBlock.data);
|
|
92
|
+
// Store the block's checksum as the head block ID (hex string)
|
|
93
|
+
this.headBlockId = encryptedBlock.idChecksum.toHex();
|
|
94
|
+
this.persistedEntryCount += this.pendingEntries.length;
|
|
95
|
+
this.pendingEntries = [];
|
|
96
|
+
this.cachedBlockEntries = null;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Get audit log entries in reverse chronological order.
|
|
100
|
+
* Requirements: 4.1
|
|
101
|
+
*/
|
|
102
|
+
async getEntries(limit) {
|
|
103
|
+
let allEntries;
|
|
104
|
+
if (this.isUsingBlockStore) {
|
|
105
|
+
if (this.cachedBlockEntries === null) {
|
|
106
|
+
this.cachedBlockEntries = await this.loadEntriesFromBlockStore();
|
|
107
|
+
}
|
|
108
|
+
allEntries = [...this.pendingEntries, ...this.cachedBlockEntries];
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
allEntries = [...this.entries];
|
|
112
|
+
}
|
|
113
|
+
const sorted = allEntries.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());
|
|
114
|
+
return limit ? sorted.slice(0, limit) : sorted;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get the total entry count.
|
|
118
|
+
*/
|
|
119
|
+
getCount() {
|
|
120
|
+
if (this.isUsingBlockStore) {
|
|
121
|
+
return this.pendingEntries.length + this.persistedEntryCount;
|
|
122
|
+
}
|
|
123
|
+
return this.entries.length;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Load all entries from the block store by traversing the block chain.
|
|
127
|
+
* Decrypts each block using the system member's private key.
|
|
128
|
+
*/
|
|
129
|
+
async loadEntriesFromBlockStore() {
|
|
130
|
+
if (!this.blockStore || !this.headBlockId || !this.systemMember) {
|
|
131
|
+
return [];
|
|
132
|
+
}
|
|
133
|
+
if (!this.systemMember.hasPrivateKey || !this.systemMember.privateKey) {
|
|
134
|
+
return [];
|
|
135
|
+
}
|
|
136
|
+
const allEntries = [];
|
|
137
|
+
let currentBlockId = this.headBlockId;
|
|
138
|
+
while (currentBlockId) {
|
|
139
|
+
try {
|
|
140
|
+
const hasBlock = await this.blockStore.has(currentBlockId);
|
|
141
|
+
if (!hasBlock) {
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
const blockHandle = this.blockStore.get(currentBlockId);
|
|
145
|
+
const encryptedData = blockHandle.fullData;
|
|
146
|
+
// Extract the ECIES data directly from the encrypted block
|
|
147
|
+
// The header structure is: [EncType(1)][RecipientID(idSize)][ECIES header + ciphertext]
|
|
148
|
+
const idProvider = (0, brightchain_lib_1.getGlobalServiceProvider)().idProvider;
|
|
149
|
+
const eciesDataOffset = ecies_lib_1.UINT8_SIZE + idProvider.byteLength;
|
|
150
|
+
const eciesData = encryptedData.subarray(eciesDataOffset);
|
|
151
|
+
// Decrypt directly using the ECIES service
|
|
152
|
+
const eciesService = (0, brightchain_lib_1.getGlobalServiceProvider)().eciesService;
|
|
153
|
+
const decryptedData = await eciesService.decryptWithLengthAndHeader(this.systemMember.privateKey.idUint8Array, eciesData);
|
|
154
|
+
const jsonString = new TextDecoder().decode(decryptedData);
|
|
155
|
+
const parsedBlock = JSON.parse(jsonString);
|
|
156
|
+
const entries = parsedBlock.entries.map((e) => ({
|
|
157
|
+
...e,
|
|
158
|
+
timestamp: new Date(e.timestamp),
|
|
159
|
+
}));
|
|
160
|
+
allEntries.push(...entries);
|
|
161
|
+
currentBlockId = parsedBlock.previousBlockId;
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return allEntries;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Set the head block ID (for restoring state from a persisted vault).
|
|
171
|
+
*/
|
|
172
|
+
setHeadBlockId(blockId) {
|
|
173
|
+
this.headBlockId = blockId;
|
|
174
|
+
this.cachedBlockEntries = null;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Get the head block ID (for persisting vault state).
|
|
178
|
+
*/
|
|
179
|
+
getHeadBlockId() {
|
|
180
|
+
return this.headBlockId;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
exports.AuditLogger = AuditLogger;
|
|
184
|
+
//# sourceMappingURL=auditLogger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auditLogger.js","sourceRoot":"","sources":["../../../../../../brightchain-api-lib/src/lib/services/brightpass/auditLogger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VaultEncryption - Symmetric AES-256-GCM encryption for vault data.
|
|
3
|
+
*
|
|
4
|
+
* This module provides authenticated encryption for vault entries using
|
|
5
|
+
* AES-256-GCM, the industry standard for password managers. The vault key
|
|
6
|
+
* is derived from the vault's BIP39 seed + master password using HKDF.
|
|
7
|
+
*
|
|
8
|
+
* Security Model (Hybrid Approach - same as 1Password/Bitwarden):
|
|
9
|
+
* - Vault entries: Encrypted with symmetric AES-256-GCM (fast, efficient)
|
|
10
|
+
* - Vault key sharing: Wrapped with ECIES when sharing with other members
|
|
11
|
+
* - Master password: Never stored, used only for key derivation
|
|
12
|
+
*
|
|
13
|
+
* Format: [IV (12 bytes)][Auth Tag (16 bytes)][Ciphertext]
|
|
14
|
+
*
|
|
15
|
+
* Requirements: 2.2, 2.3, 2.4, 3.2
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* VaultEncryption provides AES-256-GCM authenticated encryption for vault data.
|
|
19
|
+
*
|
|
20
|
+
* This is the production implementation used for encrypting vault entries.
|
|
21
|
+
* It uses:
|
|
22
|
+
* - AES-256-GCM: Authenticated encryption with associated data
|
|
23
|
+
* - 12-byte IV: Randomly generated for each encryption
|
|
24
|
+
* - 16-byte Auth Tag: Provides integrity verification
|
|
25
|
+
*
|
|
26
|
+
* The vault key must be 32 bytes (256 bits), derived from the vault's
|
|
27
|
+
* BIP39 seed and master password using HKDF-SHA256.
|
|
28
|
+
*/
|
|
29
|
+
export declare class VaultEncryption {
|
|
30
|
+
/** AES-256-GCM algorithm identifier */
|
|
31
|
+
private static readonly ALGORITHM;
|
|
32
|
+
/** IV length in bytes (96 bits as recommended by NIST SP 800-38D) */
|
|
33
|
+
private static readonly IV_LENGTH;
|
|
34
|
+
/** Authentication tag length in bytes (128 bits for maximum security) */
|
|
35
|
+
private static readonly AUTH_TAG_LENGTH;
|
|
36
|
+
/** Required vault key length in bytes (256 bits for AES-256) */
|
|
37
|
+
private static readonly KEY_LENGTH;
|
|
38
|
+
/**
|
|
39
|
+
* Encrypt data using AES-256-GCM.
|
|
40
|
+
*
|
|
41
|
+
* @param vaultKey - 32-byte vault key derived from BIP39 seed + master password
|
|
42
|
+
* @param plaintext - Data to encrypt
|
|
43
|
+
* @returns Encrypted data in format: [IV][Auth Tag][Ciphertext]
|
|
44
|
+
* @throws Error if vault key is not 32 bytes
|
|
45
|
+
*/
|
|
46
|
+
static encrypt(vaultKey: Uint8Array, plaintext: Uint8Array): Uint8Array;
|
|
47
|
+
/**
|
|
48
|
+
* Decrypt data using AES-256-GCM.
|
|
49
|
+
*
|
|
50
|
+
* @param vaultKey - 32-byte vault key derived from BIP39 seed + master password
|
|
51
|
+
* @param ciphertext - Encrypted data in format: [IV][Auth Tag][Ciphertext]
|
|
52
|
+
* @returns Decrypted plaintext
|
|
53
|
+
* @throws Error if vault key is not 32 bytes
|
|
54
|
+
* @throws Error if ciphertext is too short
|
|
55
|
+
* @throws Error if authentication fails (data tampered)
|
|
56
|
+
*/
|
|
57
|
+
static decrypt(vaultKey: Uint8Array, ciphertext: Uint8Array): Uint8Array;
|
|
58
|
+
/**
|
|
59
|
+
* Encrypt a string and return base64-encoded ciphertext.
|
|
60
|
+
*
|
|
61
|
+
* @param vaultKey - 32-byte vault key
|
|
62
|
+
* @param plaintext - String to encrypt
|
|
63
|
+
* @returns Base64-encoded encrypted data
|
|
64
|
+
*/
|
|
65
|
+
static encryptString(vaultKey: Uint8Array, plaintext: string): string;
|
|
66
|
+
/**
|
|
67
|
+
* Decrypt a base64-encoded ciphertext and return the original string.
|
|
68
|
+
*
|
|
69
|
+
* @param vaultKey - 32-byte vault key
|
|
70
|
+
* @param ciphertext - Base64-encoded encrypted data
|
|
71
|
+
* @returns Decrypted string
|
|
72
|
+
*/
|
|
73
|
+
static decryptString(vaultKey: Uint8Array, ciphertext: string): string;
|
|
74
|
+
/**
|
|
75
|
+
* Get the overhead size added by encryption.
|
|
76
|
+
* This is useful for capacity calculations.
|
|
77
|
+
*
|
|
78
|
+
* @returns Number of bytes added to plaintext (IV + Auth Tag = 28 bytes)
|
|
79
|
+
*/
|
|
80
|
+
static getOverheadSize(): number;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=vaultEncryption.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vaultEncryption.d.ts","sourceRoot":"","sources":["../../../../../../brightchain-api-lib/src/lib/services/brightpass/vaultEncryption.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH;;;;;;;;;;;GAWG;AACH,qBAAa,eAAe;IAC1B,uCAAuC;IACvC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAA0B;IAE3D,qEAAqE;IACrE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAM;IAEvC,yEAAyE;IACzE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAM;IAE7C,gEAAgE;IAChE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAM;IAExC;;;;;;;OAOG;WACW,OAAO,CACnB,QAAQ,EAAE,UAAU,EACpB,SAAS,EAAE,UAAU,GACpB,UAAU;IA0Cb;;;;;;;;;OASG;WACW,OAAO,CACnB,QAAQ,EAAE,UAAU,EACpB,UAAU,EAAE,UAAU,GACrB,UAAU;IA4Cb;;;;;;OAMG;WACW,aAAa,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAS5E;;;;;;OAMG;WACW,aAAa,CACzB,QAAQ,EAAE,UAAU,EACpB,UAAU,EAAE,MAAM,GACjB,MAAM;IAOT;;;;;OAKG;WACW,eAAe,IAAI,MAAM;CAGxC"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* VaultEncryption - Symmetric AES-256-GCM encryption for vault data.
|
|
4
|
+
*
|
|
5
|
+
* This module provides authenticated encryption for vault entries using
|
|
6
|
+
* AES-256-GCM, the industry standard for password managers. The vault key
|
|
7
|
+
* is derived from the vault's BIP39 seed + master password using HKDF.
|
|
8
|
+
*
|
|
9
|
+
* Security Model (Hybrid Approach - same as 1Password/Bitwarden):
|
|
10
|
+
* - Vault entries: Encrypted with symmetric AES-256-GCM (fast, efficient)
|
|
11
|
+
* - Vault key sharing: Wrapped with ECIES when sharing with other members
|
|
12
|
+
* - Master password: Never stored, used only for key derivation
|
|
13
|
+
*
|
|
14
|
+
* Format: [IV (12 bytes)][Auth Tag (16 bytes)][Ciphertext]
|
|
15
|
+
*
|
|
16
|
+
* Requirements: 2.2, 2.3, 2.4, 3.2
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.VaultEncryption = void 0;
|
|
20
|
+
const tslib_1 = require("tslib");
|
|
21
|
+
const crypto = tslib_1.__importStar(require("crypto"));
|
|
22
|
+
/**
|
|
23
|
+
* VaultEncryption provides AES-256-GCM authenticated encryption for vault data.
|
|
24
|
+
*
|
|
25
|
+
* This is the production implementation used for encrypting vault entries.
|
|
26
|
+
* It uses:
|
|
27
|
+
* - AES-256-GCM: Authenticated encryption with associated data
|
|
28
|
+
* - 12-byte IV: Randomly generated for each encryption
|
|
29
|
+
* - 16-byte Auth Tag: Provides integrity verification
|
|
30
|
+
*
|
|
31
|
+
* The vault key must be 32 bytes (256 bits), derived from the vault's
|
|
32
|
+
* BIP39 seed and master password using HKDF-SHA256.
|
|
33
|
+
*/
|
|
34
|
+
class VaultEncryption {
|
|
35
|
+
/**
|
|
36
|
+
* Encrypt data using AES-256-GCM.
|
|
37
|
+
*
|
|
38
|
+
* @param vaultKey - 32-byte vault key derived from BIP39 seed + master password
|
|
39
|
+
* @param plaintext - Data to encrypt
|
|
40
|
+
* @returns Encrypted data in format: [IV][Auth Tag][Ciphertext]
|
|
41
|
+
* @throws Error if vault key is not 32 bytes
|
|
42
|
+
*/
|
|
43
|
+
static encrypt(vaultKey, plaintext) {
|
|
44
|
+
if (vaultKey.length !== VaultEncryption.KEY_LENGTH) {
|
|
45
|
+
throw new Error(`Vault key must be ${VaultEncryption.KEY_LENGTH} bytes for AES-256, got ${vaultKey.length}`);
|
|
46
|
+
}
|
|
47
|
+
// Generate cryptographically secure random IV
|
|
48
|
+
const iv = crypto.randomBytes(VaultEncryption.IV_LENGTH);
|
|
49
|
+
// Create cipher with AES-256-GCM
|
|
50
|
+
const cipher = crypto.createCipheriv(VaultEncryption.ALGORITHM, Buffer.from(vaultKey), iv);
|
|
51
|
+
// Encrypt the plaintext
|
|
52
|
+
const encrypted = Buffer.concat([
|
|
53
|
+
cipher.update(Buffer.from(plaintext)),
|
|
54
|
+
cipher.final(),
|
|
55
|
+
]);
|
|
56
|
+
// Get the authentication tag
|
|
57
|
+
const authTag = cipher.getAuthTag();
|
|
58
|
+
// Combine: [IV (12)][Auth Tag (16)][Ciphertext]
|
|
59
|
+
const result = new Uint8Array(VaultEncryption.IV_LENGTH +
|
|
60
|
+
VaultEncryption.AUTH_TAG_LENGTH +
|
|
61
|
+
encrypted.length);
|
|
62
|
+
result.set(iv, 0);
|
|
63
|
+
result.set(authTag, VaultEncryption.IV_LENGTH);
|
|
64
|
+
result.set(encrypted, VaultEncryption.IV_LENGTH + VaultEncryption.AUTH_TAG_LENGTH);
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Decrypt data using AES-256-GCM.
|
|
69
|
+
*
|
|
70
|
+
* @param vaultKey - 32-byte vault key derived from BIP39 seed + master password
|
|
71
|
+
* @param ciphertext - Encrypted data in format: [IV][Auth Tag][Ciphertext]
|
|
72
|
+
* @returns Decrypted plaintext
|
|
73
|
+
* @throws Error if vault key is not 32 bytes
|
|
74
|
+
* @throws Error if ciphertext is too short
|
|
75
|
+
* @throws Error if authentication fails (data tampered)
|
|
76
|
+
*/
|
|
77
|
+
static decrypt(vaultKey, ciphertext) {
|
|
78
|
+
if (vaultKey.length !== VaultEncryption.KEY_LENGTH) {
|
|
79
|
+
throw new Error(`Vault key must be ${VaultEncryption.KEY_LENGTH} bytes for AES-256, got ${vaultKey.length}`);
|
|
80
|
+
}
|
|
81
|
+
const minLength = VaultEncryption.IV_LENGTH + VaultEncryption.AUTH_TAG_LENGTH;
|
|
82
|
+
if (ciphertext.length < minLength) {
|
|
83
|
+
throw new Error(`Ciphertext too short: expected at least ${minLength} bytes, got ${ciphertext.length}`);
|
|
84
|
+
}
|
|
85
|
+
// Extract components: [IV (12)][Auth Tag (16)][Ciphertext]
|
|
86
|
+
const iv = ciphertext.slice(0, VaultEncryption.IV_LENGTH);
|
|
87
|
+
const authTag = ciphertext.slice(VaultEncryption.IV_LENGTH, VaultEncryption.IV_LENGTH + VaultEncryption.AUTH_TAG_LENGTH);
|
|
88
|
+
const encrypted = ciphertext.slice(VaultEncryption.IV_LENGTH + VaultEncryption.AUTH_TAG_LENGTH);
|
|
89
|
+
// Create decipher with AES-256-GCM
|
|
90
|
+
const decipher = crypto.createDecipheriv(VaultEncryption.ALGORITHM, Buffer.from(vaultKey), Buffer.from(iv));
|
|
91
|
+
// Set the authentication tag for verification
|
|
92
|
+
decipher.setAuthTag(Buffer.from(authTag));
|
|
93
|
+
// Decrypt and verify authentication
|
|
94
|
+
const decrypted = Buffer.concat([
|
|
95
|
+
decipher.update(Buffer.from(encrypted)),
|
|
96
|
+
decipher.final(), // Throws if auth tag verification fails
|
|
97
|
+
]);
|
|
98
|
+
return new Uint8Array(decrypted);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Encrypt a string and return base64-encoded ciphertext.
|
|
102
|
+
*
|
|
103
|
+
* @param vaultKey - 32-byte vault key
|
|
104
|
+
* @param plaintext - String to encrypt
|
|
105
|
+
* @returns Base64-encoded encrypted data
|
|
106
|
+
*/
|
|
107
|
+
static encryptString(vaultKey, plaintext) {
|
|
108
|
+
const encoder = new TextEncoder();
|
|
109
|
+
const encrypted = VaultEncryption.encrypt(vaultKey, encoder.encode(plaintext));
|
|
110
|
+
return Buffer.from(encrypted).toString('base64');
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Decrypt a base64-encoded ciphertext and return the original string.
|
|
114
|
+
*
|
|
115
|
+
* @param vaultKey - 32-byte vault key
|
|
116
|
+
* @param ciphertext - Base64-encoded encrypted data
|
|
117
|
+
* @returns Decrypted string
|
|
118
|
+
*/
|
|
119
|
+
static decryptString(vaultKey, ciphertext) {
|
|
120
|
+
const encrypted = new Uint8Array(Buffer.from(ciphertext, 'base64'));
|
|
121
|
+
const decrypted = VaultEncryption.decrypt(vaultKey, encrypted);
|
|
122
|
+
const decoder = new TextDecoder();
|
|
123
|
+
return decoder.decode(decrypted);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get the overhead size added by encryption.
|
|
127
|
+
* This is useful for capacity calculations.
|
|
128
|
+
*
|
|
129
|
+
* @returns Number of bytes added to plaintext (IV + Auth Tag = 28 bytes)
|
|
130
|
+
*/
|
|
131
|
+
static getOverheadSize() {
|
|
132
|
+
return VaultEncryption.IV_LENGTH + VaultEncryption.AUTH_TAG_LENGTH;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
exports.VaultEncryption = VaultEncryption;
|
|
136
|
+
/** AES-256-GCM algorithm identifier */
|
|
137
|
+
VaultEncryption.ALGORITHM = 'aes-256-gcm';
|
|
138
|
+
/** IV length in bytes (96 bits as recommended by NIST SP 800-38D) */
|
|
139
|
+
VaultEncryption.IV_LENGTH = 12;
|
|
140
|
+
/** Authentication tag length in bytes (128 bits for maximum security) */
|
|
141
|
+
VaultEncryption.AUTH_TAG_LENGTH = 16;
|
|
142
|
+
/** Required vault key length in bytes (256 bits for AES-256) */
|
|
143
|
+
VaultEncryption.KEY_LENGTH = 32;
|
|
144
|
+
//# sourceMappingURL=vaultEncryption.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vaultEncryption.js","sourceRoot":"","sources":["../../../../../../brightchain-api-lib/src/lib/services/brightpass/vaultEncryption.ts"],"names":[],"mappings":"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"}
|