cojson 0.19.21 → 0.20.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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +67 -0
- package/dist/CojsonMessageChannel/CojsonMessageChannel.d.ts +42 -0
- package/dist/CojsonMessageChannel/CojsonMessageChannel.d.ts.map +1 -0
- package/dist/CojsonMessageChannel/CojsonMessageChannel.js +261 -0
- package/dist/CojsonMessageChannel/CojsonMessageChannel.js.map +1 -0
- package/dist/CojsonMessageChannel/MessagePortOutgoingChannel.d.ts +18 -0
- package/dist/CojsonMessageChannel/MessagePortOutgoingChannel.d.ts.map +1 -0
- package/dist/CojsonMessageChannel/MessagePortOutgoingChannel.js +37 -0
- package/dist/CojsonMessageChannel/MessagePortOutgoingChannel.js.map +1 -0
- package/dist/CojsonMessageChannel/index.d.ts +3 -0
- package/dist/CojsonMessageChannel/index.d.ts.map +1 -0
- package/dist/CojsonMessageChannel/index.js +2 -0
- package/dist/CojsonMessageChannel/index.js.map +1 -0
- package/dist/CojsonMessageChannel/types.d.ts +149 -0
- package/dist/CojsonMessageChannel/types.d.ts.map +1 -0
- package/dist/CojsonMessageChannel/types.js +36 -0
- package/dist/CojsonMessageChannel/types.js.map +1 -0
- package/dist/GarbageCollector.d.ts +4 -2
- package/dist/GarbageCollector.d.ts.map +1 -1
- package/dist/GarbageCollector.js +5 -3
- package/dist/GarbageCollector.js.map +1 -1
- package/dist/SyncStateManager.d.ts +3 -3
- package/dist/SyncStateManager.d.ts.map +1 -1
- package/dist/SyncStateManager.js +4 -4
- package/dist/SyncStateManager.js.map +1 -1
- package/dist/coValueContentMessage.d.ts +0 -2
- package/dist/coValueContentMessage.d.ts.map +1 -1
- package/dist/coValueContentMessage.js +0 -8
- package/dist/coValueContentMessage.js.map +1 -1
- package/dist/coValueCore/SessionMap.d.ts +4 -2
- package/dist/coValueCore/SessionMap.d.ts.map +1 -1
- package/dist/coValueCore/SessionMap.js +30 -0
- package/dist/coValueCore/SessionMap.js.map +1 -1
- package/dist/coValueCore/coValueCore.d.ts +86 -4
- package/dist/coValueCore/coValueCore.d.ts.map +1 -1
- package/dist/coValueCore/coValueCore.js +318 -17
- package/dist/coValueCore/coValueCore.js.map +1 -1
- package/dist/coValueCore/verifiedState.d.ts +6 -1
- package/dist/coValueCore/verifiedState.d.ts.map +1 -1
- package/dist/coValueCore/verifiedState.js +9 -0
- package/dist/coValueCore/verifiedState.js.map +1 -1
- package/dist/coValues/coList.d.ts +3 -2
- package/dist/coValues/coList.d.ts.map +1 -1
- package/dist/coValues/coList.js.map +1 -1
- package/dist/coValues/group.d.ts.map +1 -1
- package/dist/coValues/group.js +3 -6
- package/dist/coValues/group.js.map +1 -1
- package/dist/config.d.ts +0 -6
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +0 -8
- package/dist/config.js.map +1 -1
- package/dist/crypto/NapiCrypto.d.ts +1 -2
- package/dist/crypto/NapiCrypto.d.ts.map +1 -1
- package/dist/crypto/NapiCrypto.js +19 -4
- package/dist/crypto/NapiCrypto.js.map +1 -1
- package/dist/crypto/RNCrypto.d.ts.map +1 -1
- package/dist/crypto/RNCrypto.js +19 -4
- package/dist/crypto/RNCrypto.js.map +1 -1
- package/dist/crypto/WasmCrypto.d.ts +11 -4
- package/dist/crypto/WasmCrypto.d.ts.map +1 -1
- package/dist/crypto/WasmCrypto.js +52 -10
- package/dist/crypto/WasmCrypto.js.map +1 -1
- package/dist/crypto/WasmCryptoEdge.d.ts +1 -0
- package/dist/crypto/WasmCryptoEdge.d.ts.map +1 -1
- package/dist/crypto/WasmCryptoEdge.js +4 -1
- package/dist/crypto/WasmCryptoEdge.js.map +1 -1
- package/dist/crypto/crypto.d.ts +3 -3
- package/dist/crypto/crypto.d.ts.map +1 -1
- package/dist/crypto/crypto.js +6 -1
- package/dist/crypto/crypto.js.map +1 -1
- package/dist/exports.d.ts +3 -2
- package/dist/exports.d.ts.map +1 -1
- package/dist/exports.js +3 -1
- package/dist/exports.js.map +1 -1
- package/dist/ids.d.ts +4 -1
- package/dist/ids.d.ts.map +1 -1
- package/dist/ids.js +4 -0
- package/dist/ids.js.map +1 -1
- package/dist/knownState.d.ts +2 -0
- package/dist/knownState.d.ts.map +1 -1
- package/dist/localNode.d.ts +13 -3
- package/dist/localNode.d.ts.map +1 -1
- package/dist/localNode.js +17 -2
- package/dist/localNode.js.map +1 -1
- package/dist/platformUtils.d.ts +3 -0
- package/dist/platformUtils.d.ts.map +1 -0
- package/dist/platformUtils.js +24 -0
- package/dist/platformUtils.js.map +1 -0
- package/dist/storage/DeletedCoValuesEraserScheduler.d.ts +30 -0
- package/dist/storage/DeletedCoValuesEraserScheduler.d.ts.map +1 -0
- package/dist/storage/DeletedCoValuesEraserScheduler.js +84 -0
- package/dist/storage/DeletedCoValuesEraserScheduler.js.map +1 -0
- package/dist/storage/sqlite/client.d.ts +3 -0
- package/dist/storage/sqlite/client.d.ts.map +1 -1
- package/dist/storage/sqlite/client.js +44 -0
- package/dist/storage/sqlite/client.js.map +1 -1
- package/dist/storage/sqlite/sqliteMigrations.d.ts.map +1 -1
- package/dist/storage/sqlite/sqliteMigrations.js +7 -0
- package/dist/storage/sqlite/sqliteMigrations.js.map +1 -1
- package/dist/storage/sqliteAsync/client.d.ts +3 -0
- package/dist/storage/sqliteAsync/client.d.ts.map +1 -1
- package/dist/storage/sqliteAsync/client.js +42 -0
- package/dist/storage/sqliteAsync/client.js.map +1 -1
- package/dist/storage/storageAsync.d.ts +15 -3
- package/dist/storage/storageAsync.d.ts.map +1 -1
- package/dist/storage/storageAsync.js +60 -3
- package/dist/storage/storageAsync.js.map +1 -1
- package/dist/storage/storageSync.d.ts +14 -3
- package/dist/storage/storageSync.d.ts.map +1 -1
- package/dist/storage/storageSync.js +54 -3
- package/dist/storage/storageSync.js.map +1 -1
- package/dist/storage/types.d.ts +64 -0
- package/dist/storage/types.d.ts.map +1 -1
- package/dist/storage/types.js +12 -1
- package/dist/storage/types.js.map +1 -1
- package/dist/sync.d.ts +6 -0
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +69 -15
- package/dist/sync.js.map +1 -1
- package/dist/tests/CojsonMessageChannel.test.d.ts +2 -0
- package/dist/tests/CojsonMessageChannel.test.d.ts.map +1 -0
- package/dist/tests/CojsonMessageChannel.test.js +236 -0
- package/dist/tests/CojsonMessageChannel.test.js.map +1 -0
- package/dist/tests/DeletedCoValuesEraserScheduler.test.d.ts +2 -0
- package/dist/tests/DeletedCoValuesEraserScheduler.test.d.ts.map +1 -0
- package/dist/tests/DeletedCoValuesEraserScheduler.test.js +149 -0
- package/dist/tests/DeletedCoValuesEraserScheduler.test.js.map +1 -0
- package/dist/tests/GarbageCollector.test.js +91 -18
- package/dist/tests/GarbageCollector.test.js.map +1 -1
- package/dist/tests/StorageApiAsync.test.js +510 -146
- package/dist/tests/StorageApiAsync.test.js.map +1 -1
- package/dist/tests/StorageApiSync.test.js +531 -130
- package/dist/tests/StorageApiSync.test.js.map +1 -1
- package/dist/tests/SyncManager.processQueues.test.js +1 -1
- package/dist/tests/SyncManager.processQueues.test.js.map +1 -1
- package/dist/tests/SyncStateManager.test.js +1 -1
- package/dist/tests/SyncStateManager.test.js.map +1 -1
- package/dist/tests/WasmCrypto.test.js +6 -3
- package/dist/tests/WasmCrypto.test.js.map +1 -1
- package/dist/tests/coPlainText.test.js +1 -1
- package/dist/tests/coPlainText.test.js.map +1 -1
- package/dist/tests/coValueCore.loadFromStorage.test.js +4 -0
- package/dist/tests/coValueCore.loadFromStorage.test.js.map +1 -1
- package/dist/tests/coValueCore.test.js +34 -13
- package/dist/tests/coValueCore.test.js.map +1 -1
- package/dist/tests/coreWasm.test.js +127 -4
- package/dist/tests/coreWasm.test.js.map +1 -1
- package/dist/tests/crypto.test.js +89 -93
- package/dist/tests/crypto.test.js.map +1 -1
- package/dist/tests/deleteCoValue.test.d.ts +2 -0
- package/dist/tests/deleteCoValue.test.d.ts.map +1 -0
- package/dist/tests/deleteCoValue.test.js +313 -0
- package/dist/tests/deleteCoValue.test.js.map +1 -0
- package/dist/tests/group.removeMember.test.js +18 -30
- package/dist/tests/group.removeMember.test.js.map +1 -1
- package/dist/tests/knownState.lazyLoading.test.js +4 -0
- package/dist/tests/knownState.lazyLoading.test.js.map +1 -1
- package/dist/tests/sync.deleted.test.d.ts +2 -0
- package/dist/tests/sync.deleted.test.d.ts.map +1 -0
- package/dist/tests/sync.deleted.test.js +214 -0
- package/dist/tests/sync.deleted.test.js.map +1 -0
- package/dist/tests/sync.garbageCollection.test.js +56 -32
- package/dist/tests/sync.garbageCollection.test.js.map +1 -1
- package/dist/tests/sync.load.test.js +3 -5
- package/dist/tests/sync.load.test.js.map +1 -1
- package/dist/tests/sync.mesh.test.js +4 -3
- package/dist/tests/sync.mesh.test.js.map +1 -1
- package/dist/tests/sync.peerReconciliation.test.js +3 -3
- package/dist/tests/sync.peerReconciliation.test.js.map +1 -1
- package/dist/tests/sync.storage.test.js +12 -11
- package/dist/tests/sync.storage.test.js.map +1 -1
- package/dist/tests/sync.storageAsync.test.js +7 -7
- package/dist/tests/sync.storageAsync.test.js.map +1 -1
- package/dist/tests/sync.test.js +3 -2
- package/dist/tests/sync.test.js.map +1 -1
- package/dist/tests/sync.tracking.test.js +35 -4
- package/dist/tests/sync.tracking.test.js.map +1 -1
- package/dist/tests/testStorage.d.ts +3 -0
- package/dist/tests/testStorage.d.ts.map +1 -1
- package/dist/tests/testStorage.js +16 -2
- package/dist/tests/testStorage.js.map +1 -1
- package/dist/tests/testUtils.d.ts +29 -4
- package/dist/tests/testUtils.d.ts.map +1 -1
- package/dist/tests/testUtils.js +84 -9
- package/dist/tests/testUtils.js.map +1 -1
- package/package.json +6 -16
- package/src/CojsonMessageChannel/CojsonMessageChannel.ts +332 -0
- package/src/CojsonMessageChannel/MessagePortOutgoingChannel.ts +52 -0
- package/src/CojsonMessageChannel/index.ts +9 -0
- package/src/CojsonMessageChannel/types.ts +200 -0
- package/src/GarbageCollector.ts +5 -5
- package/src/SyncStateManager.ts +6 -6
- package/src/coValueContentMessage.ts +0 -14
- package/src/coValueCore/SessionMap.ts +43 -1
- package/src/coValueCore/coValueCore.ts +430 -15
- package/src/coValueCore/verifiedState.ts +26 -3
- package/src/coValues/coList.ts +5 -3
- package/src/coValues/group.ts +5 -6
- package/src/config.ts +0 -9
- package/src/crypto/NapiCrypto.ts +29 -13
- package/src/crypto/RNCrypto.ts +29 -11
- package/src/crypto/WasmCrypto.ts +67 -20
- package/src/crypto/WasmCryptoEdge.ts +5 -1
- package/src/crypto/crypto.ts +16 -4
- package/src/exports.ts +3 -0
- package/src/ids.ts +11 -1
- package/src/localNode.ts +18 -5
- package/src/platformUtils.ts +26 -0
- package/src/storage/DeletedCoValuesEraserScheduler.ts +124 -0
- package/src/storage/sqlite/client.ts +77 -0
- package/src/storage/sqlite/sqliteMigrations.ts +7 -0
- package/src/storage/sqliteAsync/client.ts +75 -0
- package/src/storage/storageAsync.ts +77 -4
- package/src/storage/storageSync.ts +73 -4
- package/src/storage/types.ts +75 -0
- package/src/sync.ts +84 -15
- package/src/tests/CojsonMessageChannel.test.ts +306 -0
- package/src/tests/DeletedCoValuesEraserScheduler.test.ts +185 -0
- package/src/tests/GarbageCollector.test.ts +119 -22
- package/src/tests/StorageApiAsync.test.ts +615 -156
- package/src/tests/StorageApiSync.test.ts +623 -137
- package/src/tests/SyncManager.processQueues.test.ts +1 -1
- package/src/tests/SyncStateManager.test.ts +1 -1
- package/src/tests/WasmCrypto.test.ts +8 -3
- package/src/tests/coPlainText.test.ts +1 -1
- package/src/tests/coValueCore.loadFromStorage.test.ts +8 -0
- package/src/tests/coValueCore.test.ts +49 -14
- package/src/tests/coreWasm.test.ts +319 -10
- package/src/tests/crypto.test.ts +141 -150
- package/src/tests/deleteCoValue.test.ts +528 -0
- package/src/tests/group.removeMember.test.ts +35 -35
- package/src/tests/knownState.lazyLoading.test.ts +8 -0
- package/src/tests/sync.deleted.test.ts +294 -0
- package/src/tests/sync.garbageCollection.test.ts +69 -36
- package/src/tests/sync.load.test.ts +3 -5
- package/src/tests/sync.mesh.test.ts +6 -3
- package/src/tests/sync.peerReconciliation.test.ts +3 -3
- package/src/tests/sync.storage.test.ts +14 -11
- package/src/tests/sync.storageAsync.test.ts +7 -7
- package/src/tests/sync.test.ts +5 -2
- package/src/tests/sync.tracking.test.ts +54 -4
- package/src/tests/testStorage.ts +30 -3
- package/src/tests/testUtils.ts +113 -15
- package/dist/crypto/PureJSCrypto.d.ts +0 -77
- package/dist/crypto/PureJSCrypto.d.ts.map +0 -1
- package/dist/crypto/PureJSCrypto.js +0 -236
- package/dist/crypto/PureJSCrypto.js.map +0 -1
- package/dist/tests/PureJSCrypto.test.d.ts +0 -2
- package/dist/tests/PureJSCrypto.test.d.ts.map +0 -1
- package/dist/tests/PureJSCrypto.test.js +0 -145
- package/dist/tests/PureJSCrypto.test.js.map +0 -1
- package/src/crypto/PureJSCrypto.ts +0 -429
- package/src/tests/PureJSCrypto.test.ts +0 -217
|
@@ -1,236 +0,0 @@
|
|
|
1
|
-
import { xsalsa20, xsalsa20poly1305 } from "@noble/ciphers/salsa";
|
|
2
|
-
import { ed25519, x25519 } from "@noble/curves/ed25519";
|
|
3
|
-
import { blake3 } from "@noble/hashes/blake3";
|
|
4
|
-
import { base58 } from "@scure/base";
|
|
5
|
-
import { base64URLtoBytes, bytesToBase64url } from "../base64url.js";
|
|
6
|
-
import { stableStringify } from "../jsonStringify.js";
|
|
7
|
-
import { logger } from "../logger.js";
|
|
8
|
-
import { CryptoProvider, textDecoder, textEncoder, } from "./crypto.js";
|
|
9
|
-
const x25519SharedSecretCache = new Map();
|
|
10
|
-
function getx25519SharedSecret(privateKeyA, publicKeyB) {
|
|
11
|
-
const cacheKey = `${privateKeyA}-${publicKeyB}`;
|
|
12
|
-
let sharedSecret = x25519SharedSecretCache.get(cacheKey);
|
|
13
|
-
if (!sharedSecret) {
|
|
14
|
-
const privateKeyABytes = base58.decode(privateKeyA.substring("sealerSecret_z".length));
|
|
15
|
-
const publicKeyBBytes = base58.decode(publicKeyB.substring("sealer_z".length));
|
|
16
|
-
sharedSecret = x25519.getSharedSecret(privateKeyABytes, publicKeyBBytes);
|
|
17
|
-
x25519SharedSecretCache.set(cacheKey, sharedSecret);
|
|
18
|
-
}
|
|
19
|
-
return sharedSecret;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Pure JavaScript implementation of the CryptoProvider interface using noble-curves and noble-ciphers libraries.
|
|
23
|
-
* This provides a fallback implementation that doesn't require WebAssembly, offering:
|
|
24
|
-
* - Signing/verifying (Ed25519)
|
|
25
|
-
* - Encryption/decryption (XSalsa20)
|
|
26
|
-
* - Sealing/unsealing (X25519 + XSalsa20-Poly1305)
|
|
27
|
-
* - Hashing (BLAKE3)
|
|
28
|
-
*/
|
|
29
|
-
export class PureJSCrypto extends CryptoProvider {
|
|
30
|
-
static async create() {
|
|
31
|
-
return new PureJSCrypto();
|
|
32
|
-
}
|
|
33
|
-
createStreamingHash() {
|
|
34
|
-
return blake3.create({});
|
|
35
|
-
}
|
|
36
|
-
blake3HashOnce(data) {
|
|
37
|
-
return blake3(data);
|
|
38
|
-
}
|
|
39
|
-
blake3HashOnceWithContext(data, { context }) {
|
|
40
|
-
return this.createStreamingHash().update(context).update(data).digest();
|
|
41
|
-
}
|
|
42
|
-
generateNonce(input) {
|
|
43
|
-
return this.blake3HashOnce(input).slice(0, 24);
|
|
44
|
-
}
|
|
45
|
-
generateJsonNonce(material) {
|
|
46
|
-
return this.generateNonce(textEncoder.encode(stableStringify(material)));
|
|
47
|
-
}
|
|
48
|
-
newEd25519SigningKey() {
|
|
49
|
-
return ed25519.utils.randomPrivateKey();
|
|
50
|
-
}
|
|
51
|
-
getSignerID(secret) {
|
|
52
|
-
return `signer_z${base58.encode(ed25519.getPublicKey(base58.decode(secret.substring("signerSecret_z".length))))}`;
|
|
53
|
-
}
|
|
54
|
-
sign(secret, message) {
|
|
55
|
-
const signature = ed25519.sign(textEncoder.encode(stableStringify(message)), base58.decode(secret.substring("signerSecret_z".length)));
|
|
56
|
-
return `signature_z${base58.encode(signature)}`;
|
|
57
|
-
}
|
|
58
|
-
verify(signature, message, id) {
|
|
59
|
-
return ed25519.verify(base58.decode(signature.substring("signature_z".length)), textEncoder.encode(stableStringify(message)), base58.decode(id.substring("signer_z".length)));
|
|
60
|
-
}
|
|
61
|
-
newX25519StaticSecret() {
|
|
62
|
-
return x25519.utils.randomPrivateKey();
|
|
63
|
-
}
|
|
64
|
-
getSealerID(secret) {
|
|
65
|
-
return `sealer_z${base58.encode(x25519.getPublicKey(base58.decode(secret.substring("sealerSecret_z".length))))}`;
|
|
66
|
-
}
|
|
67
|
-
encrypt(value, keySecret, nOnceMaterial) {
|
|
68
|
-
const keySecretBytes = base58.decode(keySecret.substring("keySecret_z".length));
|
|
69
|
-
const nOnce = this.generateJsonNonce(nOnceMaterial);
|
|
70
|
-
const plaintext = textEncoder.encode(stableStringify(value));
|
|
71
|
-
const ciphertext = xsalsa20(keySecretBytes, nOnce, plaintext);
|
|
72
|
-
return `encrypted_U${bytesToBase64url(ciphertext)}`;
|
|
73
|
-
}
|
|
74
|
-
decryptRaw(encrypted, keySecret, nOnceMaterial) {
|
|
75
|
-
const keySecretBytes = base58.decode(keySecret.substring("keySecret_z".length));
|
|
76
|
-
const nOnce = this.generateJsonNonce(nOnceMaterial);
|
|
77
|
-
const ciphertext = base64URLtoBytes(encrypted.substring("encrypted_U".length));
|
|
78
|
-
const plaintext = xsalsa20(keySecretBytes, nOnce, ciphertext);
|
|
79
|
-
return textDecoder.decode(plaintext);
|
|
80
|
-
}
|
|
81
|
-
seal({ message, from, to, nOnceMaterial, }) {
|
|
82
|
-
const sharedSecret = getx25519SharedSecret(from, to);
|
|
83
|
-
const nOnce = this.generateJsonNonce(nOnceMaterial);
|
|
84
|
-
const plaintext = textEncoder.encode(stableStringify(message));
|
|
85
|
-
const sealedBytes = xsalsa20poly1305(sharedSecret, nOnce).encrypt(plaintext);
|
|
86
|
-
return `sealed_U${bytesToBase64url(sealedBytes)}`;
|
|
87
|
-
}
|
|
88
|
-
unseal(sealed, sealer, from, nOnceMaterial) {
|
|
89
|
-
const nOnce = this.generateJsonNonce(nOnceMaterial);
|
|
90
|
-
const sharedSecret = getx25519SharedSecret(sealer, from);
|
|
91
|
-
const sealedBytes = base64URLtoBytes(sealed.substring("sealed_U".length));
|
|
92
|
-
const plaintext = xsalsa20poly1305(sharedSecret, nOnce).decrypt(sealedBytes);
|
|
93
|
-
try {
|
|
94
|
-
return JSON.parse(textDecoder.decode(plaintext));
|
|
95
|
-
}
|
|
96
|
-
catch (e) {
|
|
97
|
-
logger.error("Failed to decrypt/parse sealed message", { err: e });
|
|
98
|
-
return undefined;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
createSessionLog(coID, sessionID, signerID) {
|
|
102
|
-
return new PureJSSessionLog(coID, sessionID, signerID, this);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
export class PureJSSessionLog {
|
|
106
|
-
constructor(coID, sessionID, signerID, crypto) {
|
|
107
|
-
this.coID = coID;
|
|
108
|
-
this.sessionID = sessionID;
|
|
109
|
-
this.signerID = signerID;
|
|
110
|
-
this.crypto = crypto;
|
|
111
|
-
this.transactions = [];
|
|
112
|
-
this.streamingHash = crypto.createStreamingHash();
|
|
113
|
-
}
|
|
114
|
-
clone() {
|
|
115
|
-
const newLog = new PureJSSessionLog(this.coID, this.sessionID, this.signerID, this.crypto);
|
|
116
|
-
newLog.transactions = this.transactions.slice();
|
|
117
|
-
newLog.lastSignature = this.lastSignature;
|
|
118
|
-
newLog.streamingHash = this.streamingHash.clone();
|
|
119
|
-
return newLog;
|
|
120
|
-
}
|
|
121
|
-
tryAdd(transactions, newSignature, skipVerify) {
|
|
122
|
-
this.internalTryAdd(transactions.map((tx) => stableStringify(tx)), newSignature, skipVerify);
|
|
123
|
-
}
|
|
124
|
-
internalTryAdd(transactions, newSignature, skipVerify) {
|
|
125
|
-
for (const tx of transactions) {
|
|
126
|
-
this.streamingHash.update(textEncoder.encode(tx));
|
|
127
|
-
}
|
|
128
|
-
if (!skipVerify) {
|
|
129
|
-
if (!this.signerID) {
|
|
130
|
-
throw new Error("Tried to add transactions without signer ID");
|
|
131
|
-
}
|
|
132
|
-
const newHash = this.streamingHash.clone().digest();
|
|
133
|
-
const newHashEncoded = `hash_z${base58.encode(newHash)}`;
|
|
134
|
-
if (!this.crypto.verify(newSignature, newHashEncoded, this.signerID)) {
|
|
135
|
-
// Rebuild the streaming hash to the original state
|
|
136
|
-
this.streamingHash = this.crypto.createStreamingHash();
|
|
137
|
-
for (const tx of this.transactions) {
|
|
138
|
-
this.streamingHash.update(textEncoder.encode(tx));
|
|
139
|
-
}
|
|
140
|
-
throw new Error("Signature verification failed");
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
for (const tx of transactions) {
|
|
144
|
-
this.transactions.push(tx);
|
|
145
|
-
}
|
|
146
|
-
this.lastSignature = newSignature;
|
|
147
|
-
return newSignature;
|
|
148
|
-
}
|
|
149
|
-
internalAddNewTransaction(transaction, signerAgent) {
|
|
150
|
-
this.streamingHash.update(textEncoder.encode(transaction));
|
|
151
|
-
const newHash = this.streamingHash.clone().digest();
|
|
152
|
-
const newHashEncoded = `hash_z${base58.encode(newHash)}`;
|
|
153
|
-
const signature = this.crypto.sign(signerAgent.currentSignerSecret(), newHashEncoded);
|
|
154
|
-
this.transactions.push(transaction);
|
|
155
|
-
this.lastSignature = signature;
|
|
156
|
-
return signature;
|
|
157
|
-
}
|
|
158
|
-
addNewPrivateTransaction(signerAgent, changes, keyID, keySecret, madeAt, meta) {
|
|
159
|
-
const encryptedChanges = this.crypto.encrypt(changes, keySecret, {
|
|
160
|
-
in: this.coID,
|
|
161
|
-
tx: { sessionID: this.sessionID, txIndex: this.transactions.length },
|
|
162
|
-
});
|
|
163
|
-
const encryptedMeta = meta
|
|
164
|
-
? this.crypto.encrypt(meta, keySecret, {
|
|
165
|
-
in: this.coID,
|
|
166
|
-
tx: { sessionID: this.sessionID, txIndex: this.transactions.length },
|
|
167
|
-
})
|
|
168
|
-
: undefined;
|
|
169
|
-
const tx = {
|
|
170
|
-
encryptedChanges: encryptedChanges,
|
|
171
|
-
madeAt: madeAt,
|
|
172
|
-
privacy: "private",
|
|
173
|
-
keyUsed: keyID,
|
|
174
|
-
meta: encryptedMeta,
|
|
175
|
-
};
|
|
176
|
-
const signature = this.internalAddNewTransaction(stableStringify(tx), signerAgent);
|
|
177
|
-
return {
|
|
178
|
-
signature: signature,
|
|
179
|
-
transaction: tx,
|
|
180
|
-
};
|
|
181
|
-
}
|
|
182
|
-
addNewTrustingTransaction(signerAgent, changes, madeAt, meta) {
|
|
183
|
-
const tx = {
|
|
184
|
-
changes: stableStringify(changes),
|
|
185
|
-
madeAt: madeAt,
|
|
186
|
-
privacy: "trusting",
|
|
187
|
-
meta: meta ? stableStringify(meta) : undefined,
|
|
188
|
-
};
|
|
189
|
-
const signature = this.internalAddNewTransaction(stableStringify(tx), signerAgent);
|
|
190
|
-
return {
|
|
191
|
-
signature: signature,
|
|
192
|
-
transaction: tx,
|
|
193
|
-
};
|
|
194
|
-
}
|
|
195
|
-
decryptNextTransactionChangesJson(txIndex, keySecret) {
|
|
196
|
-
const txJson = this.transactions[txIndex];
|
|
197
|
-
if (!txJson) {
|
|
198
|
-
throw new Error("Transaction not found");
|
|
199
|
-
}
|
|
200
|
-
const tx = JSON.parse(txJson);
|
|
201
|
-
if (tx.privacy === "private") {
|
|
202
|
-
const nOnceMaterial = {
|
|
203
|
-
in: this.coID,
|
|
204
|
-
tx: { sessionID: this.sessionID, txIndex: txIndex },
|
|
205
|
-
};
|
|
206
|
-
return this.crypto.decryptRaw(tx.encryptedChanges, keySecret, nOnceMaterial);
|
|
207
|
-
}
|
|
208
|
-
else {
|
|
209
|
-
return tx.changes;
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
decryptNextTransactionMetaJson(txIndex, keySecret) {
|
|
213
|
-
const txJson = this.transactions[txIndex];
|
|
214
|
-
if (!txJson) {
|
|
215
|
-
throw new Error("Transaction not found");
|
|
216
|
-
}
|
|
217
|
-
const tx = JSON.parse(txJson);
|
|
218
|
-
if (!tx.meta) {
|
|
219
|
-
return undefined;
|
|
220
|
-
}
|
|
221
|
-
if (tx.privacy === "private") {
|
|
222
|
-
const nOnceMaterial = {
|
|
223
|
-
in: this.coID,
|
|
224
|
-
tx: { sessionID: this.sessionID, txIndex: txIndex },
|
|
225
|
-
};
|
|
226
|
-
return this.crypto.decryptRaw(tx.meta, keySecret, nOnceMaterial);
|
|
227
|
-
}
|
|
228
|
-
else {
|
|
229
|
-
return tx.meta;
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
free() {
|
|
233
|
-
// no-op
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
//# sourceMappingURL=PureJSCrypto.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PureJSCrypto.js","sourceRoot":"","sources":["../../src/crypto/PureJSCrypto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAOrE,OAAO,EAAe,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEnE,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EACL,cAAc,EAWd,WAAW,EACX,WAAW,GACZ,MAAM,aAAa,CAAC;AASrB,MAAM,uBAAuB,GAAG,IAAI,GAAG,EAAsB,CAAC;AAE9D,SAAS,qBAAqB,CAC5B,WAAyB,EACzB,UAAoB;IAEpB,MAAM,QAAQ,GAAG,GAAG,WAAW,IAAI,UAAU,EAAE,CAAC;IAChD,IAAI,YAAY,GAAG,uBAAuB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEzD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CACpC,WAAW,CAAC,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAC/C,CAAC;QACF,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CACnC,UAAU,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CACxC,CAAC;QACF,YAAY,GAAG,MAAM,CAAC,eAAe,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAC;QACzE,uBAAuB,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,YAAa,SAAQ,cAA2B;IAC3D,MAAM,CAAC,KAAK,CAAC,MAAM;QACjB,OAAO,IAAI,YAAY,EAAE,CAAC;IAC5B,CAAC;IAED,mBAAmB;QACjB,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,cAAc,CAAC,IAAgB;QAC7B,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAED,yBAAyB,CACvB,IAAgB,EAChB,EAAE,OAAO,EAA2B;QAEpC,OAAO,IAAI,CAAC,mBAAmB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;IAC1E,CAAC;IAED,aAAa,CAAC,KAAiB;QAC7B,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,iBAAiB,CAAC,QAAmB;QACnC,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED,oBAAoB;QAClB,OAAO,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;IAC1C,CAAC;IAED,WAAW,CAAC,MAAoB;QAC9B,OAAO,WAAW,MAAM,CAAC,MAAM,CAC7B,OAAO,CAAC,YAAY,CAClB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CACzD,CACF,EAAE,CAAC;IACN,CAAC;IAED,IAAI,CAAC,MAAoB,EAAE,OAAkB;QAC3C,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAC5B,WAAW,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,EAC5C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CACzD,CAAC;QACF,OAAO,cAAc,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;IAClD,CAAC;IAED,MAAM,CAAC,SAAoB,EAAE,OAAkB,EAAE,EAAY;QAC3D,OAAO,OAAO,CAAC,MAAM,CACnB,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,EACxD,WAAW,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,EAC5C,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAC/C,CAAC;IACJ,CAAC;IAED,qBAAqB;QACnB,OAAO,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;IACzC,CAAC;IAED,WAAW,CAAC,MAAoB;QAC9B,OAAO,WAAW,MAAM,CAAC,MAAM,CAC7B,MAAM,CAAC,YAAY,CACjB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CACzD,CACF,EAAE,CAAC;IACN,CAAC;IAED,OAAO,CACL,KAAQ,EACR,SAAoB,EACpB,aAAgB;QAEhB,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAClC,SAAS,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,CAC1C,CAAC;QACF,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;QAEpD,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7D,MAAM,UAAU,GAAG,QAAQ,CAAC,cAAc,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QAC9D,OAAO,cAAc,gBAAgB,CAAC,UAAU,CAAC,EAAqB,CAAC;IACzE,CAAC;IAED,UAAU,CACR,SAA0B,EAC1B,SAAoB,EACpB,aAAgB;QAEhB,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAClC,SAAS,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,CAC1C,CAAC;QACF,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;QAEpD,MAAM,UAAU,GAAG,gBAAgB,CACjC,SAAS,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,CAC1C,CAAC;QACF,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;QAE9D,OAAO,WAAW,CAAC,MAAM,CAAC,SAAS,CAAmB,CAAC;IACzD,CAAC;IAED,IAAI,CAAsB,EACxB,OAAO,EACP,IAAI,EACJ,EAAE,EACF,aAAa,GAMd;QACC,MAAM,YAAY,GAAG,qBAAqB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;QACpD,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;QAE/D,MAAM,WAAW,GAAG,gBAAgB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,OAAO,CAC/D,SAAS,CACV,CAAC;QAEF,OAAO,WAAW,gBAAgB,CAAC,WAAW,CAAC,EAAe,CAAC;IACjE,CAAC;IAED,MAAM,CACJ,MAAiB,EACjB,MAAoB,EACpB,IAAc,EACd,aAAiD;QAEjD,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC;QAEpD,MAAM,YAAY,GAAG,qBAAqB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACzD,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QAE1E,MAAM,SAAS,GAAG,gBAAgB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,OAAO,CAC7D,WAAW,CACZ,CAAC;QAEF,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,CAAC,KAAK,CAAC,wCAAwC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACnE,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,gBAAgB,CACd,IAAa,EACb,SAAoB,EACpB,QAAmB;QAEnB,OAAO,IAAI,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC/D,CAAC;CACF;AAED,MAAM,OAAO,gBAAgB;IAK3B,YACmB,IAAa,EACb,SAAoB,EACpB,QAA8B,EAC9B,MAAoB;QAHpB,SAAI,GAAJ,IAAI,CAAS;QACb,cAAS,GAAT,SAAS,CAAW;QACpB,aAAQ,GAAR,QAAQ,CAAsB;QAC9B,WAAM,GAAN,MAAM,CAAc;QARvC,iBAAY,GAAa,EAAE,CAAC;QAU1B,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,mBAAmB,EAAE,CAAC;IACpD,CAAC;IAED,KAAK;QACH,MAAM,MAAM,GAAG,IAAI,gBAAgB,CACjC,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,MAAM,CACZ,CAAC;QACF,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAChD,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QAC1C,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAClD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,CACJ,YAA2B,EAC3B,YAAuB,EACvB,UAAmB;QAEnB,IAAI,CAAC,cAAc,CACjB,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,EAC7C,YAAY,EACZ,UAAU,CACX,CAAC;IACJ,CAAC;IAED,cAAc,CACZ,YAAsB,EACtB,YAAuB,EACvB,UAAmB;QAEnB,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;YAC9B,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QACpD,CAAC;QAED,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;YACjE,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC;YACpD,MAAM,cAAc,GAAG,SAAS,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAEzD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACrE,mDAAmD;gBACnD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;gBACvD,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;oBACnC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;gBACpD,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QAED,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;YAC9B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAElC,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,yBAAyB,CACvB,WAAmB,EACnB,WAAqC;QAErC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC;QACpD,MAAM,cAAc,GAAG,SAAS,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACzD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAChC,WAAW,CAAC,mBAAmB,EAAE,EACjC,cAAc,CACf,CAAC;QACF,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpC,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAE/B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,wBAAwB,CACtB,WAAqC,EACrC,OAAoB,EACpB,KAAY,EACZ,SAAoB,EACpB,MAAc,EACd,IAA4B;QAE5B,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE;YAC/D,EAAE,EAAE,IAAI,CAAC,IAAI;YACb,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;SACrE,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,IAAI;YACxB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE;gBACnC,EAAE,EAAE,IAAI,CAAC,IAAI;gBACb,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;aACrE,CAAC;YACJ,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,EAAE,GAAG;YACT,gBAAgB,EAAE,gBAAgB;YAClC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,SAAS;YAClB,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,aAAa;SACE,CAAC;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,yBAAyB,CAC9C,eAAe,CAAC,EAAE,CAAC,EACnB,WAAW,CACZ,CAAC;QACF,OAAO;YACL,SAAS,EAAE,SAAsB;YACjC,WAAW,EAAE,EAAE;SAChB,CAAC;IACJ,CAAC;IAED,yBAAyB,CACvB,WAAqC,EACrC,OAAoB,EACpB,MAAc,EACd,IAA4B;QAE5B,MAAM,EAAE,GAAG;YACT,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC;YACjC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SACzB,CAAC;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,yBAAyB,CAC9C,eAAe,CAAC,EAAE,CAAC,EACnB,WAAW,CACZ,CAAC;QACF,OAAO;YACL,SAAS,EAAE,SAAsB;YACjC,WAAW,EAAE,EAAE;SAChB,CAAC;IACJ,CAAC;IAED,iCAAiC,CAC/B,OAAe,EACf,SAAoB;QAEpB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAgB,CAAC;QAC7C,IAAI,EAAE,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,aAAa,GAAG;gBACpB,EAAE,EAAE,IAAI,CAAC,IAAI;gBACb,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE;aACpD,CAAC;YAEF,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAC3B,EAAE,CAAC,gBAAgB,EACnB,SAAS,EACT,aAAa,CACd,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,EAAE,CAAC,OAAO,CAAC;QACpB,CAAC;IACH,CAAC;IAED,8BAA8B,CAC5B,OAAe,EACf,SAAoB;QAEpB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAgB,CAAC;QAE7C,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;YACb,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,EAAE,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,aAAa,GAAG;gBACpB,EAAE,EAAE,IAAI,CAAC,IAAI;gBACb,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE;aACpD,CAAC;YAEF,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACN,OAAO,EAAE,CAAC,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IAED,IAAI;QACF,QAAQ;IACV,CAAC;CACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PureJSCrypto.test.d.ts","sourceRoot":"","sources":["../../src/tests/PureJSCrypto.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
import { assert, beforeEach, describe, expect, it } from "vitest";
|
|
2
|
-
import { loadCoValueOrFail, setCurrentTestCryptoProvider, setupTestNode, setupTestAccount, } from "./testUtils";
|
|
3
|
-
import { PureJSCrypto } from "../crypto/PureJSCrypto";
|
|
4
|
-
import { stableStringify } from "../jsonStringify";
|
|
5
|
-
const jsCrypto = await PureJSCrypto.create();
|
|
6
|
-
setCurrentTestCryptoProvider(jsCrypto);
|
|
7
|
-
let syncServer;
|
|
8
|
-
beforeEach(() => {
|
|
9
|
-
syncServer = setupTestNode({ isSyncServer: true });
|
|
10
|
-
});
|
|
11
|
-
// A suite of tests focused on high-level tests that verify:
|
|
12
|
-
// - Keys creation and unsealing
|
|
13
|
-
// - Signature creation and verification
|
|
14
|
-
// - Encryption and decryption of values
|
|
15
|
-
describe("PureJSCrypto", () => {
|
|
16
|
-
it("successfully creates a private CoValue and reads it in another session", async () => {
|
|
17
|
-
const client = setupTestNode({
|
|
18
|
-
connected: true,
|
|
19
|
-
});
|
|
20
|
-
const group = client.node.createGroup();
|
|
21
|
-
const map = group.createMap();
|
|
22
|
-
map.set("count", 0, "private");
|
|
23
|
-
map.set("count", 1, "private");
|
|
24
|
-
map.set("count", 2, "private");
|
|
25
|
-
const client2 = client.spawnNewSession();
|
|
26
|
-
const mapInTheOtherSession = await loadCoValueOrFail(client2.node, map.id);
|
|
27
|
-
expect(mapInTheOtherSession.get("count")).toEqual(2);
|
|
28
|
-
});
|
|
29
|
-
it("successfully updates a private CoValue and reads it in another session", async () => {
|
|
30
|
-
const client = setupTestNode({
|
|
31
|
-
connected: true,
|
|
32
|
-
});
|
|
33
|
-
const group = client.node.createGroup();
|
|
34
|
-
const map = group.createMap();
|
|
35
|
-
map.set("count", 0, "private");
|
|
36
|
-
map.set("count", 1, "private");
|
|
37
|
-
map.set("count", 2, "private");
|
|
38
|
-
const client2 = client.spawnNewSession();
|
|
39
|
-
const mapInTheOtherSession = await loadCoValueOrFail(client2.node, map.id);
|
|
40
|
-
mapInTheOtherSession.set("count", 3, "private");
|
|
41
|
-
await mapInTheOtherSession.core.waitForSync();
|
|
42
|
-
expect(mapInTheOtherSession.get("count")).toEqual(3);
|
|
43
|
-
});
|
|
44
|
-
it("can invite another account to a group and share a private CoValue", async () => {
|
|
45
|
-
const client = setupTestNode({
|
|
46
|
-
connected: true,
|
|
47
|
-
});
|
|
48
|
-
const account = await setupTestAccount({
|
|
49
|
-
connected: true,
|
|
50
|
-
});
|
|
51
|
-
const group = client.node.createGroup();
|
|
52
|
-
const invite = group.createInvite("admin");
|
|
53
|
-
await account.node.acceptInvite(group.id, invite);
|
|
54
|
-
const map = group.createMap();
|
|
55
|
-
map.set("secret", "private-data", "private");
|
|
56
|
-
// The other account should be able to read the private value
|
|
57
|
-
const mapInOtherSession = await loadCoValueOrFail(account.node, map.id);
|
|
58
|
-
expect(mapInOtherSession.get("secret")).toEqual("private-data");
|
|
59
|
-
mapInOtherSession.set("secret", "modified", "private");
|
|
60
|
-
await mapInOtherSession.core.waitForSync();
|
|
61
|
-
expect(map.get("secret")).toEqual("modified");
|
|
62
|
-
});
|
|
63
|
-
it("rejects sessions with invalid signatures", async () => {
|
|
64
|
-
const client = setupTestNode({
|
|
65
|
-
connected: true,
|
|
66
|
-
});
|
|
67
|
-
const group = client.node.createGroup();
|
|
68
|
-
const map = group.createMap();
|
|
69
|
-
map.set("count", 0, "trusting");
|
|
70
|
-
// Create a new session with the same agent
|
|
71
|
-
const client2 = client.spawnNewSession();
|
|
72
|
-
// This should work normally
|
|
73
|
-
const mapInOtherSession = await loadCoValueOrFail(client2.node, map.id);
|
|
74
|
-
expect(mapInOtherSession.get("count")).toEqual(0);
|
|
75
|
-
mapInOtherSession.core.tryAddTransactions(client2.node.currentSessionID, [
|
|
76
|
-
{
|
|
77
|
-
privacy: "trusting",
|
|
78
|
-
changes: stableStringify([{ op: "set", key: "count", value: 1 }]),
|
|
79
|
-
madeAt: Date.now(),
|
|
80
|
-
},
|
|
81
|
-
], "signature_z12345678", true);
|
|
82
|
-
const content = mapInOtherSession.core.newContentSince(undefined)?.[0];
|
|
83
|
-
assert(content);
|
|
84
|
-
client.node.syncManager.handleNewContent(content, "storage");
|
|
85
|
-
expect(map.get("count")).toEqual(0);
|
|
86
|
-
});
|
|
87
|
-
it("can add a meta to a private transaction", async () => {
|
|
88
|
-
const client = setupTestNode({
|
|
89
|
-
connected: true,
|
|
90
|
-
});
|
|
91
|
-
const group = client.node.createGroup();
|
|
92
|
-
const map = group.createMap();
|
|
93
|
-
map.core.makeTransaction([], "private", {
|
|
94
|
-
meta: {
|
|
95
|
-
count: 1,
|
|
96
|
-
},
|
|
97
|
-
});
|
|
98
|
-
await map.core.waitForSync();
|
|
99
|
-
const session2 = client.spawnNewSession();
|
|
100
|
-
const mapInOtherSession = await loadCoValueOrFail(session2.node, map.id);
|
|
101
|
-
const decryptedMeta = mapInOtherSession.core.verified.decryptTransactionMeta(client.node.currentSessionID, 0, map.core.getCurrentReadKey().secret);
|
|
102
|
-
expect(decryptedMeta).toEqual({
|
|
103
|
-
meta: {
|
|
104
|
-
count: 1,
|
|
105
|
-
},
|
|
106
|
-
});
|
|
107
|
-
});
|
|
108
|
-
it("can add a meta to a trusting transaction", async () => {
|
|
109
|
-
const client = setupTestNode({
|
|
110
|
-
connected: true,
|
|
111
|
-
});
|
|
112
|
-
const group = client.node.createGroup();
|
|
113
|
-
const map = group.createMap();
|
|
114
|
-
map.core.makeTransaction([], "trusting", {
|
|
115
|
-
meta: {
|
|
116
|
-
count: 1,
|
|
117
|
-
},
|
|
118
|
-
});
|
|
119
|
-
await map.core.waitForSync();
|
|
120
|
-
const session2 = client.spawnNewSession();
|
|
121
|
-
const mapInOtherSession = await loadCoValueOrFail(session2.node, map.id);
|
|
122
|
-
const transferredMeta = JSON.parse(mapInOtherSession.core.verified.sessions.get(client.node.currentSessionID)
|
|
123
|
-
?.transactions[0]?.meta);
|
|
124
|
-
expect(transferredMeta).toEqual({
|
|
125
|
-
meta: {
|
|
126
|
-
count: 1,
|
|
127
|
-
},
|
|
128
|
-
});
|
|
129
|
-
});
|
|
130
|
-
});
|
|
131
|
-
describe("PureJSSessionLog", () => {
|
|
132
|
-
it("fails to verify signatures without a signer ID", async () => {
|
|
133
|
-
const agentSecret = jsCrypto.newRandomAgentSecret();
|
|
134
|
-
const sessionID = jsCrypto.newRandomSessionID(jsCrypto.getAgentID(agentSecret));
|
|
135
|
-
const sessionLog = jsCrypto.createSessionLog("co_z12345678", sessionID);
|
|
136
|
-
expect(() => sessionLog.tryAdd([
|
|
137
|
-
{
|
|
138
|
-
privacy: "trusting",
|
|
139
|
-
changes: stableStringify([{ op: "set", key: "count", value: 1 }]),
|
|
140
|
-
madeAt: Date.now(),
|
|
141
|
-
},
|
|
142
|
-
], "signature_z12345678", false)).toThrow("Tried to add transactions without signer ID");
|
|
143
|
-
});
|
|
144
|
-
});
|
|
145
|
-
//# sourceMappingURL=PureJSCrypto.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PureJSCrypto.test.js","sourceRoot":"","sources":["../../src/tests/PureJSCrypto.test.ts"],"names":[],"mappings":"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"}
|