@ledgerhq/hw-ledger-key-ring-protocol 0.2.1-fix-build-number-pre.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/.eslintrc.js +33 -0
- package/.turbo/turbo-build.log +4 -0
- package/CHANGELOG.md +126 -0
- package/LICENSE.txt +21 -0
- package/README.md +3 -0
- package/jest.config.js +13 -0
- package/lib/ApduDevice.d.ts +99 -0
- package/lib/ApduDevice.d.ts.map +1 -0
- package/lib/ApduDevice.js +528 -0
- package/lib/ApduDevice.js.map +1 -0
- package/lib/BigEndian.d.ts +7 -0
- package/lib/BigEndian.d.ts.map +1 -0
- package/lib/BigEndian.js +26 -0
- package/lib/BigEndian.js.map +1 -0
- package/lib/CommandBlock.d.ts +114 -0
- package/lib/CommandBlock.d.ts.map +1 -0
- package/lib/CommandBlock.js +156 -0
- package/lib/CommandBlock.js.map +1 -0
- package/lib/CommandStream.d.ts +38 -0
- package/lib/CommandStream.d.ts.map +1 -0
- package/lib/CommandStream.js +195 -0
- package/lib/CommandStream.js.map +1 -0
- package/lib/CommandStreamDecoder.d.ts +15 -0
- package/lib/CommandStreamDecoder.d.ts.map +1 -0
- package/lib/CommandStreamDecoder.js +101 -0
- package/lib/CommandStreamDecoder.js.map +1 -0
- package/lib/CommandStreamEncoder.d.ts +16 -0
- package/lib/CommandStreamEncoder.d.ts.map +1 -0
- package/lib/CommandStreamEncoder.js +131 -0
- package/lib/CommandStreamEncoder.js.map +1 -0
- package/lib/CommandStreamJsonifier.d.ts +6 -0
- package/lib/CommandStreamJsonifier.d.ts.map +1 -0
- package/lib/CommandStreamJsonifier.js +75 -0
- package/lib/CommandStreamJsonifier.js.map +1 -0
- package/lib/CommandStreamResolver.d.ts +53 -0
- package/lib/CommandStreamResolver.d.ts.map +1 -0
- package/lib/CommandStreamResolver.js +221 -0
- package/lib/CommandStreamResolver.js.map +1 -0
- package/lib/Crypto.d.ts +38 -0
- package/lib/Crypto.d.ts.map +1 -0
- package/lib/Crypto.js +47 -0
- package/lib/Crypto.js.map +1 -0
- package/lib/Device.d.ts +43 -0
- package/lib/Device.d.ts.map +1 -0
- package/lib/Device.js +195 -0
- package/lib/Device.js.map +1 -0
- package/lib/IndexedTree.d.ts +13 -0
- package/lib/IndexedTree.d.ts.map +1 -0
- package/lib/IndexedTree.js +75 -0
- package/lib/IndexedTree.js.map +1 -0
- package/lib/NobleCrypto.d.ts +39 -0
- package/lib/NobleCrypto.d.ts.map +1 -0
- package/lib/NobleCrypto.js +240 -0
- package/lib/NobleCrypto.js.map +1 -0
- package/lib/PublicKey.d.ts +5 -0
- package/lib/PublicKey.d.ts.map +1 -0
- package/lib/PublicKey.js +10 -0
- package/lib/PublicKey.js.map +1 -0
- package/lib/SeedId.d.ts +80 -0
- package/lib/SeedId.d.ts.map +1 -0
- package/lib/SeedId.js +244 -0
- package/lib/SeedId.js.map +1 -0
- package/lib/StreamTree.d.ts +50 -0
- package/lib/StreamTree.d.ts.map +1 -0
- package/lib/StreamTree.js +169 -0
- package/lib/StreamTree.js.map +1 -0
- package/lib/StreamTreeCipher.d.ts +46 -0
- package/lib/StreamTreeCipher.d.ts.map +1 -0
- package/lib/StreamTreeCipher.js +175 -0
- package/lib/StreamTreeCipher.js.map +1 -0
- package/lib/__tests__/codec.d.ts +2 -0
- package/lib/__tests__/codec.d.ts.map +1 -0
- package/lib/__tests__/codec.js +108 -0
- package/lib/__tests__/codec.js.map +1 -0
- package/lib/__tests__/crypto.d.ts +2 -0
- package/lib/__tests__/crypto.d.ts.map +1 -0
- package/lib/__tests__/crypto.js +46 -0
- package/lib/__tests__/crypto.js.map +1 -0
- package/lib/__tests__/indexed_tree.d.ts +2 -0
- package/lib/__tests__/indexed_tree.d.ts.map +1 -0
- package/lib/__tests__/indexed_tree.js +45 -0
- package/lib/__tests__/indexed_tree.js.map +1 -0
- package/lib/__tests__/key_exchange.d.ts +2 -0
- package/lib/__tests__/key_exchange.d.ts.map +1 -0
- package/lib/__tests__/key_exchange.js +129 -0
- package/lib/__tests__/key_exchange.js.map +1 -0
- package/lib/__tests__/seedId.d.ts +2 -0
- package/lib/__tests__/seedId.d.ts.map +1 -0
- package/lib/__tests__/seedId.js +92 -0
- package/lib/__tests__/seedId.js.map +1 -0
- package/lib/__tests__/shared_object.d.ts +2 -0
- package/lib/__tests__/shared_object.d.ts.map +1 -0
- package/lib/__tests__/shared_object.js +78 -0
- package/lib/__tests__/shared_object.js.map +1 -0
- package/lib/index.d.ts +35 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +81 -0
- package/lib/index.js.map +1 -0
- package/lib/tlv.d.ts +99 -0
- package/lib/tlv.d.ts.map +1 -0
- package/lib/tlv.js +150 -0
- package/lib/tlv.js.map +1 -0
- package/lib-es/ApduDevice.d.ts +99 -0
- package/lib-es/ApduDevice.d.ts.map +1 -0
- package/lib-es/ApduDevice.js +522 -0
- package/lib-es/ApduDevice.js.map +1 -0
- package/lib-es/BigEndian.d.ts +7 -0
- package/lib-es/BigEndian.d.ts.map +1 -0
- package/lib-es/BigEndian.js +23 -0
- package/lib-es/BigEndian.js.map +1 -0
- package/lib-es/CommandBlock.d.ts +114 -0
- package/lib-es/CommandBlock.d.ts.map +1 -0
- package/lib-es/CommandBlock.js +143 -0
- package/lib-es/CommandBlock.js.map +1 -0
- package/lib-es/CommandStream.d.ts +38 -0
- package/lib-es/CommandStream.d.ts.map +1 -0
- package/lib-es/CommandStream.js +187 -0
- package/lib-es/CommandStream.js.map +1 -0
- package/lib-es/CommandStreamDecoder.d.ts +15 -0
- package/lib-es/CommandStreamDecoder.d.ts.map +1 -0
- package/lib-es/CommandStreamDecoder.js +97 -0
- package/lib-es/CommandStreamDecoder.js.map +1 -0
- package/lib-es/CommandStreamEncoder.d.ts +16 -0
- package/lib-es/CommandStreamEncoder.d.ts.map +1 -0
- package/lib-es/CommandStreamEncoder.js +127 -0
- package/lib-es/CommandStreamEncoder.js.map +1 -0
- package/lib-es/CommandStreamJsonifier.d.ts +6 -0
- package/lib-es/CommandStreamJsonifier.d.ts.map +1 -0
- package/lib-es/CommandStreamJsonifier.js +72 -0
- package/lib-es/CommandStreamJsonifier.js.map +1 -0
- package/lib-es/CommandStreamResolver.d.ts +53 -0
- package/lib-es/CommandStreamResolver.d.ts.map +1 -0
- package/lib-es/CommandStreamResolver.js +216 -0
- package/lib-es/CommandStreamResolver.js.map +1 -0
- package/lib-es/Crypto.d.ts +38 -0
- package/lib-es/Crypto.d.ts.map +1 -0
- package/lib-es/Crypto.js +43 -0
- package/lib-es/Crypto.js.map +1 -0
- package/lib-es/Device.d.ts +43 -0
- package/lib-es/Device.d.ts.map +1 -0
- package/lib-es/Device.js +187 -0
- package/lib-es/Device.js.map +1 -0
- package/lib-es/IndexedTree.d.ts +13 -0
- package/lib-es/IndexedTree.d.ts.map +1 -0
- package/lib-es/IndexedTree.js +71 -0
- package/lib-es/IndexedTree.js.map +1 -0
- package/lib-es/NobleCrypto.d.ts +39 -0
- package/lib-es/NobleCrypto.d.ts.map +1 -0
- package/lib-es/NobleCrypto.js +209 -0
- package/lib-es/NobleCrypto.js.map +1 -0
- package/lib-es/PublicKey.d.ts +5 -0
- package/lib-es/PublicKey.d.ts.map +1 -0
- package/lib-es/PublicKey.js +6 -0
- package/lib-es/PublicKey.js.map +1 -0
- package/lib-es/SeedId.d.ts +80 -0
- package/lib-es/SeedId.d.ts.map +1 -0
- package/lib-es/SeedId.js +235 -0
- package/lib-es/SeedId.js.map +1 -0
- package/lib-es/StreamTree.d.ts +50 -0
- package/lib-es/StreamTree.d.ts.map +1 -0
- package/lib-es/StreamTree.js +165 -0
- package/lib-es/StreamTree.js.map +1 -0
- package/lib-es/StreamTreeCipher.d.ts +46 -0
- package/lib-es/StreamTreeCipher.d.ts.map +1 -0
- package/lib-es/StreamTreeCipher.js +171 -0
- package/lib-es/StreamTreeCipher.js.map +1 -0
- package/lib-es/__tests__/codec.d.ts +2 -0
- package/lib-es/__tests__/codec.d.ts.map +1 -0
- package/lib-es/__tests__/codec.js +106 -0
- package/lib-es/__tests__/codec.js.map +1 -0
- package/lib-es/__tests__/crypto.d.ts +2 -0
- package/lib-es/__tests__/crypto.d.ts.map +1 -0
- package/lib-es/__tests__/crypto.js +44 -0
- package/lib-es/__tests__/crypto.js.map +1 -0
- package/lib-es/__tests__/indexed_tree.d.ts +2 -0
- package/lib-es/__tests__/indexed_tree.d.ts.map +1 -0
- package/lib-es/__tests__/indexed_tree.js +43 -0
- package/lib-es/__tests__/indexed_tree.js.map +1 -0
- package/lib-es/__tests__/key_exchange.d.ts +2 -0
- package/lib-es/__tests__/key_exchange.d.ts.map +1 -0
- package/lib-es/__tests__/key_exchange.js +124 -0
- package/lib-es/__tests__/key_exchange.js.map +1 -0
- package/lib-es/__tests__/seedId.d.ts +2 -0
- package/lib-es/__tests__/seedId.d.ts.map +1 -0
- package/lib-es/__tests__/seedId.js +90 -0
- package/lib-es/__tests__/seedId.js.map +1 -0
- package/lib-es/__tests__/shared_object.d.ts +2 -0
- package/lib-es/__tests__/shared_object.d.ts.map +1 -0
- package/lib-es/__tests__/shared_object.js +76 -0
- package/lib-es/__tests__/shared_object.js.map +1 -0
- package/lib-es/index.d.ts +35 -0
- package/lib-es/index.d.ts.map +1 -0
- package/lib-es/index.js +32 -0
- package/lib-es/index.js.map +1 -0
- package/lib-es/tlv.d.ts +99 -0
- package/lib-es/tlv.d.ts.map +1 -0
- package/lib-es/tlv.js +144 -0
- package/lib-es/tlv.js.map +1 -0
- package/package.json +63 -0
- package/src/ApduDevice.ts +688 -0
- package/src/BigEndian.ts +25 -0
- package/src/CommandBlock.ts +244 -0
- package/src/CommandStream.ts +260 -0
- package/src/CommandStreamDecoder.ts +142 -0
- package/src/CommandStreamEncoder.ts +144 -0
- package/src/CommandStreamJsonifier.ts +82 -0
- package/src/CommandStreamResolver.ts +284 -0
- package/src/Crypto.ts +78 -0
- package/src/Device.ts +246 -0
- package/src/IndexedTree.ts +80 -0
- package/src/NobleCrypto.ts +255 -0
- package/src/PublicKey.ts +6 -0
- package/src/SeedId.ts +338 -0
- package/src/StreamTree.ts +212 -0
- package/src/StreamTreeCipher.ts +207 -0
- package/src/__tests__/codec.ts +146 -0
- package/src/__tests__/crypto.ts +44 -0
- package/src/__tests__/indexed_tree.ts +51 -0
- package/src/__tests__/key_exchange.ts +167 -0
- package/src/__tests__/seedId.ts +120 -0
- package/src/__tests__/shared_object.ts +118 -0
- package/src/index.ts +43 -0
- package/src/tlv.ts +210 -0
- package/tsconfig.json +14 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { crypto } from ".";
|
|
11
|
+
/**
|
|
12
|
+
*
|
|
13
|
+
*/
|
|
14
|
+
export var StreamTreeCipherMode;
|
|
15
|
+
(function (StreamTreeCipherMode) {
|
|
16
|
+
StreamTreeCipherMode[StreamTreeCipherMode["AES_256_CBC"] = 0] = "AES_256_CBC";
|
|
17
|
+
StreamTreeCipherMode[StreamTreeCipherMode["AES_256_GCM"] = 1] = "AES_256_GCM";
|
|
18
|
+
})(StreamTreeCipherMode || (StreamTreeCipherMode = {}));
|
|
19
|
+
const TAG_LENGTH = 16;
|
|
20
|
+
/**
|
|
21
|
+
*
|
|
22
|
+
*/
|
|
23
|
+
export class StreamTreeCipher {
|
|
24
|
+
constructor(mode, device) {
|
|
25
|
+
this._mode = mode;
|
|
26
|
+
this._device = device;
|
|
27
|
+
}
|
|
28
|
+
get mode() {
|
|
29
|
+
return this._mode;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Encrypts a message for a given path in the tree
|
|
33
|
+
* @param tree
|
|
34
|
+
* @param path
|
|
35
|
+
* @param message
|
|
36
|
+
* @param nonce optional nonce to use for the encryption (if null a random nonce will be generated)
|
|
37
|
+
* @returns the encrypted message with the nonce prepended (1 byte for the nonce length + nonce + 33 bytes ephemeral key + encrypted message + 4 bytes checksum)
|
|
38
|
+
* @throws Error if the cipher mode is not implemented
|
|
39
|
+
* @throws Error if the path is not found in the tree and can't be derived from the device
|
|
40
|
+
*/
|
|
41
|
+
encrypt(tree_1, path_1, message_1) {
|
|
42
|
+
return __awaiter(this, arguments, void 0, function* (tree, path, message, nonce = null) {
|
|
43
|
+
if (nonce === null) {
|
|
44
|
+
nonce = crypto.randomBytes(16);
|
|
45
|
+
}
|
|
46
|
+
// Generate ephemeral key pair
|
|
47
|
+
const ephemeralKeyPair = crypto.randomKeypair();
|
|
48
|
+
// Get the group public key
|
|
49
|
+
const groupKeypair = yield this.getGroupKeypair(tree, path);
|
|
50
|
+
// Compute the secret via ECDH
|
|
51
|
+
const secret = crypto.ecdh(ephemeralKeyPair, groupKeypair.publicKey);
|
|
52
|
+
let encrypted = new Uint8Array(0);
|
|
53
|
+
switch (this._mode) {
|
|
54
|
+
case StreamTreeCipherMode.AES_256_CBC: {
|
|
55
|
+
encrypted = crypto.encrypt(secret, nonce, message);
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
case StreamTreeCipherMode.AES_256_GCM: {
|
|
59
|
+
encrypted = crypto.encrypt(secret, nonce, message);
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
default:
|
|
63
|
+
throw new Error("Unknown cipher mode");
|
|
64
|
+
}
|
|
65
|
+
// Serialize encrypted data
|
|
66
|
+
return this.encodeData(ephemeralKeyPair.publicKey, nonce, encrypted, message);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
getGroupKeypair(tree, path) {
|
|
70
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
71
|
+
if (!this._device.isPublicKeyAvailable()) {
|
|
72
|
+
throw new Error("Stream tree cipher is only available for software devices");
|
|
73
|
+
}
|
|
74
|
+
const member = yield this._device.getPublicKey();
|
|
75
|
+
const event = yield tree.getPublishKeyEvent(member.publicKey, path);
|
|
76
|
+
if (!event) {
|
|
77
|
+
throw new Error("Cannot find key in the tree for the current device");
|
|
78
|
+
}
|
|
79
|
+
// Compute the relative path from the event to the path parameter
|
|
80
|
+
const privateKey = (yield this._device.readKey(tree, path)).slice(0, 32);
|
|
81
|
+
const publicKey = crypto.keypairFromSecretKey(privateKey).publicKey;
|
|
82
|
+
return { privateKey, publicKey };
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
encodeData(ephemeralPublicKey, nonce, data, message) {
|
|
86
|
+
const result = new Uint8Array(1 + 33 + nonce.length + TAG_LENGTH + data.length);
|
|
87
|
+
let offset = 0;
|
|
88
|
+
// Version
|
|
89
|
+
result[offset] = this._mode;
|
|
90
|
+
offset += 1;
|
|
91
|
+
// Ephemeral public key
|
|
92
|
+
result.set(ephemeralPublicKey, offset);
|
|
93
|
+
offset += ephemeralPublicKey.length;
|
|
94
|
+
// Nonce/IV
|
|
95
|
+
result.set(nonce, offset);
|
|
96
|
+
offset += nonce.length;
|
|
97
|
+
// Checksum
|
|
98
|
+
if (this._mode == StreamTreeCipherMode.AES_256_CBC) {
|
|
99
|
+
const checksum = this.computeChecksum(message);
|
|
100
|
+
result.set(checksum, offset);
|
|
101
|
+
offset += checksum.length;
|
|
102
|
+
}
|
|
103
|
+
// Encrypted data
|
|
104
|
+
result.set(data, offset);
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
decodeData(payload) {
|
|
108
|
+
const version = payload[0];
|
|
109
|
+
let offset = 1;
|
|
110
|
+
const ephemeralPublicKey = payload.slice(offset, offset + 33);
|
|
111
|
+
offset += 33;
|
|
112
|
+
const nonce = payload.slice(offset, offset + 16);
|
|
113
|
+
offset += 16;
|
|
114
|
+
const checksum = payload.slice(payload.length - 16, payload.length);
|
|
115
|
+
const encrypted = payload.slice(offset, payload.length - 16);
|
|
116
|
+
return {
|
|
117
|
+
version,
|
|
118
|
+
ephemeralPublicKey,
|
|
119
|
+
nonce,
|
|
120
|
+
encrypted,
|
|
121
|
+
checksum,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Decrypts a message for a given path in the tree
|
|
126
|
+
* @param tree
|
|
127
|
+
* @param path
|
|
128
|
+
* @param encrytedPayload
|
|
129
|
+
* @returns the decrypted message
|
|
130
|
+
* @throws Error if the cipher mode is not implemented
|
|
131
|
+
* @throws Error if the path is not found in the tree and can't be derived from the device
|
|
132
|
+
* @throws Error if the checksum is invalid
|
|
133
|
+
*/
|
|
134
|
+
decrypt(tree, path, encrytedPayload) {
|
|
135
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
136
|
+
const decodedPayload = this.decodeData(encrytedPayload);
|
|
137
|
+
const ephemeralKey = decodedPayload.ephemeralPublicKey;
|
|
138
|
+
const nonce = decodedPayload.nonce;
|
|
139
|
+
const encryptedMessage = decodedPayload.encrypted;
|
|
140
|
+
const checksum = decodedPayload.checksum;
|
|
141
|
+
const sharedKeyPair = yield this.getGroupKeypair(tree, path);
|
|
142
|
+
const secret = crypto.ecdh(sharedKeyPair, ephemeralKey);
|
|
143
|
+
let decrypted = new Uint8Array(0);
|
|
144
|
+
switch (this._mode) {
|
|
145
|
+
case StreamTreeCipherMode.AES_256_CBC: {
|
|
146
|
+
decrypted = crypto.decrypt(secret, nonce, encryptedMessage);
|
|
147
|
+
const computedChecksum = this.computeChecksum(decrypted);
|
|
148
|
+
if (crypto.to_hex(computedChecksum) !== crypto.to_hex(checksum)) {
|
|
149
|
+
throw new Error("Invalid checksum");
|
|
150
|
+
}
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
case StreamTreeCipherMode.AES_256_GCM: {
|
|
154
|
+
decrypted = crypto.decrypt(secret, nonce, encryptedMessage);
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
default:
|
|
158
|
+
throw new Error("Unknown cipher mode");
|
|
159
|
+
}
|
|
160
|
+
return decrypted;
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
computeChecksum(message) {
|
|
164
|
+
const hash = crypto.hash(message);
|
|
165
|
+
return hash.slice(0, 16);
|
|
166
|
+
}
|
|
167
|
+
static create(device, mode = StreamTreeCipherMode.AES_256_GCM) {
|
|
168
|
+
return new StreamTreeCipher(mode, device);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=StreamTreeCipher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StreamTreeCipher.js","sourceRoot":"","sources":["../src/StreamTreeCipher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../src/__tests__/codec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { AddMember, createCommandBlock, Permissions, PublishKey, Seed, signCommandBlock, } from "../CommandBlock";
|
|
11
|
+
import { TLV } from "../tlv";
|
|
12
|
+
import { CommandStreamDecoder } from "../CommandStreamDecoder";
|
|
13
|
+
import { CommandStreamEncoder } from "../CommandStreamEncoder";
|
|
14
|
+
import { crypto } from "../Crypto";
|
|
15
|
+
import { CommandStream } from "..";
|
|
16
|
+
describe("Encode/Decode command stream tester", () => {
|
|
17
|
+
it("should encode and decode a byte", () => {
|
|
18
|
+
const byte = 42;
|
|
19
|
+
let buffer = new Uint8Array();
|
|
20
|
+
buffer = TLV.pushByte(buffer, 42);
|
|
21
|
+
const decoded = TLV.readVarInt(TLV.readTLV(buffer, 0));
|
|
22
|
+
expect(decoded.value).toBe(byte);
|
|
23
|
+
});
|
|
24
|
+
it("should encode and decode a Int32", () => {
|
|
25
|
+
const varint = 0xdeadbeef;
|
|
26
|
+
let buffer = new Uint8Array();
|
|
27
|
+
buffer = TLV.pushInt32(buffer, varint);
|
|
28
|
+
const decoded = TLV.readVarInt(TLV.readTLV(buffer, 0));
|
|
29
|
+
expect(decoded.value).toBe(varint);
|
|
30
|
+
});
|
|
31
|
+
it("should encode and decode a string", () => {
|
|
32
|
+
const str = "Hello World";
|
|
33
|
+
let buffer = new Uint8Array();
|
|
34
|
+
buffer = TLV.pushString(buffer, str);
|
|
35
|
+
const decoded = TLV.readString(TLV.readTLV(buffer, 0));
|
|
36
|
+
expect(decoded.value).toBe(str);
|
|
37
|
+
});
|
|
38
|
+
it("should encode and decode a hash", () => {
|
|
39
|
+
const hash = crypto.hash(new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]));
|
|
40
|
+
let buffer = new Uint8Array();
|
|
41
|
+
buffer = TLV.pushHash(buffer, hash);
|
|
42
|
+
const decoded = TLV.readHash(TLV.readTLV(buffer, 0));
|
|
43
|
+
expect(crypto.to_hex(decoded.value)).toEqual(crypto.to_hex(hash));
|
|
44
|
+
});
|
|
45
|
+
it("should encode and decode bytes", () => {
|
|
46
|
+
const bytes = new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
|
|
47
|
+
let buffer = new Uint8Array();
|
|
48
|
+
buffer = TLV.pushBytes(buffer, bytes);
|
|
49
|
+
const decoded = TLV.readBytes(TLV.readTLV(buffer, 0));
|
|
50
|
+
expect(decoded.value).toEqual(bytes);
|
|
51
|
+
});
|
|
52
|
+
it("should encode and decode a signature", () => {
|
|
53
|
+
const alice = crypto.randomKeypair();
|
|
54
|
+
const block = signCommandBlock(createCommandBlock(alice.publicKey, []), alice.publicKey, alice.privateKey);
|
|
55
|
+
let buffer = new Uint8Array();
|
|
56
|
+
buffer = TLV.pushSignature(buffer, block.signature);
|
|
57
|
+
const decoded = TLV.readSignature(TLV.readTLV(buffer, 0));
|
|
58
|
+
expect(decoded.value).toEqual(block.signature);
|
|
59
|
+
});
|
|
60
|
+
it("should encode and decode a public key", () => {
|
|
61
|
+
const alice = crypto.randomKeypair();
|
|
62
|
+
let buffer = new Uint8Array();
|
|
63
|
+
buffer = TLV.pushPublicKey(buffer, alice.publicKey);
|
|
64
|
+
const decoded = TLV.readPublicKey(TLV.readTLV(buffer, 0));
|
|
65
|
+
expect(decoded.value).toEqual(alice.publicKey);
|
|
66
|
+
});
|
|
67
|
+
it("should encode and decode a stream. Encoding/Decoding should not alter the stream", () => {
|
|
68
|
+
const alice = crypto.randomKeypair();
|
|
69
|
+
const groupPk = crypto.randomKeypair();
|
|
70
|
+
const groupChainCode = crypto.randomBytes(32);
|
|
71
|
+
const xpriv = new Uint8Array(64);
|
|
72
|
+
const initializationVector = crypto.randomBytes(16);
|
|
73
|
+
xpriv.set(groupPk.privateKey);
|
|
74
|
+
xpriv.set(groupChainCode, 32);
|
|
75
|
+
const ephemeralPk = crypto.randomKeypair();
|
|
76
|
+
const block1 = signCommandBlock(createCommandBlock(alice.publicKey, [
|
|
77
|
+
new Seed(crypto.randomBytes(16), 0, groupPk.publicKey, initializationVector, xpriv, ephemeralPk.publicKey),
|
|
78
|
+
]), alice.publicKey, alice.privateKey);
|
|
79
|
+
const block2 = signCommandBlock(createCommandBlock(alice.publicKey, [
|
|
80
|
+
new AddMember("Alice", crypto.randomBytes(32), Permissions.OWNER),
|
|
81
|
+
new PublishKey(crypto.randomBytes(16), crypto.randomBytes(32), crypto.randomBytes(32), crypto.randomBytes(32)),
|
|
82
|
+
]), alice.publicKey, alice.privateKey);
|
|
83
|
+
const block3 = signCommandBlock(createCommandBlock(alice.publicKey, []), alice.publicKey, alice.privateKey);
|
|
84
|
+
const stream = [block1, block2, block3];
|
|
85
|
+
const encoded = CommandStreamEncoder.encode(stream);
|
|
86
|
+
const digestEncoded = crypto.hash(encoded);
|
|
87
|
+
const decoded = CommandStreamDecoder.decode(encoded);
|
|
88
|
+
const reencoded = CommandStreamEncoder.encode(decoded);
|
|
89
|
+
const digestReencoded = crypto.hash(reencoded);
|
|
90
|
+
expect(digestEncoded).toEqual(digestReencoded);
|
|
91
|
+
});
|
|
92
|
+
it("decodes a specific command stream", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
93
|
+
const tlv = "0101010220824b3168c79e8b61b599751c107117b5c9b647f2b6859de8a245952559707692062102a13e82cd0d2f77d1ab1434d8bd799571e54cd32e1121c5cf82217f8b0b713b6b01010315a8050c800000008000001080000000062103ccf74aa7775b3d39d6cbb0236acee7a7f980b9f6a556a4d814d44b0bd56cb77b05108c51eda6be26623ca919ed17333afcdb054019c0b60ede1692479cc04ce69eae6a0bd51941bab6f044f3dec10c11cf11e6253504d1df6b0aab7dc1996e4eaa7c6f92c29153c59534578901cd7ff4efcea1ae06210268abdb3d49ba4a274ce8660cde0d1eeaf1fea00e281218be775f6b3aefc39756113a040f7765622d746f6f6c732d6563626638062103a270456b0f95714cc61a6473e6b6d8db354a3c377281096bdd2439a5475ecbf80104ffffffff129a05100e5205b4a616b2a4d79b07b4a4932f560540669e741f38fee07956fb0dc0ea9978d55bd5d8424b0d0f66a2c5a45788f92d0ddc283138c7ba62c521de1d604ee7f847c5aed40a11536bbe742af0be8cfd4132062103a270456b0f95714cc61a6473e6b6d8db354a3c377281096bdd2439a5475ecbf80621027003755248202ea8a67d1fcdcd82d7f7022248f3af892fa5307d3ea250dc81050346304402204422a779fd08723d8cba19c0cc11ef7a24f6f1f459cb01598ff1a26f27ea8976022053a554d4f509223f2d08faa5de796fed13a9762f35da08e94884edd1f7c0d015";
|
|
94
|
+
const decoded = CommandStreamDecoder.decode(crypto.from_hex(tlv));
|
|
95
|
+
const stream = new CommandStream(decoded);
|
|
96
|
+
const resolved = yield stream.resolve();
|
|
97
|
+
expect(resolved.getMembersData()).toEqual([
|
|
98
|
+
{
|
|
99
|
+
id: "03a270456b0f95714cc61a6473e6b6d8db354a3c377281096bdd2439a5475ecbf8",
|
|
100
|
+
name: "web-tools-ecbf8",
|
|
101
|
+
permissions: 4294967295,
|
|
102
|
+
},
|
|
103
|
+
]);
|
|
104
|
+
}));
|
|
105
|
+
});
|
|
106
|
+
//# sourceMappingURL=codec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../../src/__tests__/codec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/__tests__/crypto.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { crypto } from "../Crypto";
|
|
11
|
+
describe("Sodium wrapper tester", () => {
|
|
12
|
+
it("should computes the same symetric key with ECDH using two parties", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
13
|
+
const kp1 = yield crypto.randomKeypair();
|
|
14
|
+
const kp2 = yield crypto.randomKeypair();
|
|
15
|
+
const shared1 = yield crypto.ecdh(kp1, kp2.publicKey);
|
|
16
|
+
const shared2 = yield crypto.ecdh(kp2, kp1.publicKey);
|
|
17
|
+
expect(crypto.to_hex(shared1)).toBe(crypto.to_hex(shared2));
|
|
18
|
+
}));
|
|
19
|
+
it("should encrypt a message and decrypt using the same symmetric key", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
20
|
+
//const message = "Hello world!"
|
|
21
|
+
const message = yield crypto.randomBytes(64);
|
|
22
|
+
const key = yield crypto.randomBytes(32);
|
|
23
|
+
const nonce = yield crypto.randomBytes(16);
|
|
24
|
+
const encrypted = yield crypto.encrypt(key, nonce, message);
|
|
25
|
+
const decrypted = yield crypto.decrypt(key, nonce, encrypted);
|
|
26
|
+
expect(crypto.to_hex(decrypted)).toBe(crypto.to_hex(message));
|
|
27
|
+
}));
|
|
28
|
+
it("should encrypt user data", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
29
|
+
const keypair = yield crypto.randomKeypair();
|
|
30
|
+
const data = yield crypto.randomBytes(64);
|
|
31
|
+
const encrypted = yield crypto.encryptUserData(keypair.privateKey, data);
|
|
32
|
+
const decrypted = yield crypto.decryptUserData(keypair.privateKey, encrypted);
|
|
33
|
+
expect(crypto.to_hex(decrypted)).toBe(crypto.to_hex(data));
|
|
34
|
+
}));
|
|
35
|
+
it("should verify truncated signature by padding 0s from the start", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
36
|
+
const hash = crypto.from_hex("19514a2e50bfad4a6de397ebde776191cbb720e8bbfcc3c165385c3664c03341");
|
|
37
|
+
const signature = crypto.from_hex(
|
|
38
|
+
// Here the "S" part of the signature is only 31 bytes long it should be padded with a 0
|
|
39
|
+
"3043022052a82876fcd4d9d8383ce12a7e4d96bb4c1d9e71e857cd087c092b87cec6baeb021f6b86b9a3bab1e7794ca6ef081c66cb6e6dff06cceddbd23e1f25089e311784");
|
|
40
|
+
const issuer = crypto.from_hex("026e7bf1e015da491674be5796b15d6fabd1f454aad478a6a223934e5a872719e0");
|
|
41
|
+
expect(yield crypto.verify(hash, signature, issuer)).toBe(true);
|
|
42
|
+
}));
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/__tests__/crypto.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,mEAAmE,EAAE,GAAS,EAAE;QACjF,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QACtD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAEtD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAA,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAS,EAAE;QACjF,gCAAgC;QAChC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACzC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAChE,CAAC,CAAA,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAS,EAAE;QACxC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACzE,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAC9E,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAA,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAS,EAAE;QAC9E,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAC1B,kEAAkE,CACnE,CAAC;QACF,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ;QAC/B,wFAAwF;QACxF,4IAA4I,CAC7I,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAC5B,oEAAoE,CACrE,CAAC;QACF,MAAM,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClE,CAAC,CAAA,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexed_tree.d.ts","sourceRoot":"","sources":["../../src/__tests__/indexed_tree.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { IndexedTree } from "../IndexedTree";
|
|
2
|
+
describe("Indexed tree unit test suite", () => {
|
|
3
|
+
it("should create a new tree with a root", () => {
|
|
4
|
+
const tree = new IndexedTree(0);
|
|
5
|
+
expect(tree.getValue()).toBe(0);
|
|
6
|
+
});
|
|
7
|
+
it("should create a new tree with a root and update the root", () => {
|
|
8
|
+
let tree = new IndexedTree(0);
|
|
9
|
+
tree = tree.updateChild([], 1);
|
|
10
|
+
expect(tree.getValue()).toBe(1);
|
|
11
|
+
});
|
|
12
|
+
it("should create a new tree with a root and update a child", () => {
|
|
13
|
+
let tree = new IndexedTree(0);
|
|
14
|
+
tree = tree.updateChild([1], 1);
|
|
15
|
+
expect(tree.getChild(1).getValue()).toBe(1);
|
|
16
|
+
});
|
|
17
|
+
it("should create a tree with multiple children and update a child which had no value before", () => {
|
|
18
|
+
var _a, _b;
|
|
19
|
+
let tree = new IndexedTree(0);
|
|
20
|
+
tree = tree.updateChild([0, 1], 1);
|
|
21
|
+
tree = tree.updateChild([0, 2], 2);
|
|
22
|
+
expect(tree.findChild([0, 1]).getValue()).toBe(1);
|
|
23
|
+
expect(tree.findChild([0, 2]).getValue()).toBe(2);
|
|
24
|
+
expect((_a = tree.getChild(0)) === null || _a === void 0 ? void 0 : _a.getValue()).toBe(null);
|
|
25
|
+
tree = tree.updateChild([0], 42);
|
|
26
|
+
expect((_b = tree.getChild(0)) === null || _b === void 0 ? void 0 : _b.getValue()).toBe(42);
|
|
27
|
+
});
|
|
28
|
+
it("should add a subtree to the tree", () => {
|
|
29
|
+
let tree = new IndexedTree(0);
|
|
30
|
+
tree = tree.addChild([0, 1], new IndexedTree(1));
|
|
31
|
+
tree = tree.addChild([0, 2], new IndexedTree(2));
|
|
32
|
+
let subtree = new IndexedTree(42);
|
|
33
|
+
subtree = subtree.updateChild([0], 43);
|
|
34
|
+
subtree = subtree.updateChild([1], 44);
|
|
35
|
+
tree = tree.addChild([0, 3], subtree);
|
|
36
|
+
expect(tree.findChild([0, 1]).getValue()).toBe(1);
|
|
37
|
+
expect(tree.findChild([0, 2]).getValue()).toBe(2);
|
|
38
|
+
expect(tree.findChild([0, 3]).getValue()).toBe(42);
|
|
39
|
+
expect(tree.findChild([0, 3, 0]).getValue()).toBe(43);
|
|
40
|
+
expect(tree.findChild([0, 3, 1]).getValue()).toBe(44);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
//# sourceMappingURL=indexed_tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexed_tree.js","sourceRoot":"","sources":["../../src/__tests__/indexed_tree.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key_exchange.d.ts","sourceRoot":"","sources":["../../src/__tests__/key_exchange.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { createDevice } from "../Device";
|
|
11
|
+
import CommandStream from "../CommandStream";
|
|
12
|
+
import { Permissions } from "../CommandBlock";
|
|
13
|
+
import { crypto } from "../Crypto";
|
|
14
|
+
import { StreamTreeCipher } from "../StreamTreeCipher";
|
|
15
|
+
import { StreamTree } from "../StreamTree";
|
|
16
|
+
const DEFAULT_TOPIC = "c96d450545ff2836204c29af291428a5bf740304978f5dfb0b4a261474192851";
|
|
17
|
+
describe("Symmetric key exchange scenarii", () => {
|
|
18
|
+
it("create a new group with 1 member", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
19
|
+
const alice = yield createDevice();
|
|
20
|
+
const topic = crypto.from_hex(DEFAULT_TOPIC);
|
|
21
|
+
let stream = new CommandStream([]);
|
|
22
|
+
stream = yield stream.edit().seed(topic).issue(alice);
|
|
23
|
+
const resolved = yield stream.resolve();
|
|
24
|
+
expect(resolved.isCreated()).toBe(true);
|
|
25
|
+
expect(resolved.getMembers().length).toBe(1);
|
|
26
|
+
expect(resolved.getMembersData().length).toBe(0);
|
|
27
|
+
expect(crypto.to_hex(resolved.getTopic())).toBe(crypto.to_hex(topic));
|
|
28
|
+
//const parsed = CommandStreamDecoder.decode(CommandStreamEncoder.encode(stream.blocks));
|
|
29
|
+
//console.log(JSON.stringify(CommandStreamJsonifier.jsonify(parsed), null, 2));
|
|
30
|
+
//const raw = CommandStreamEncoder.encode(stream.blocks);
|
|
31
|
+
//console.log(crypto.to_hex(raw));
|
|
32
|
+
}));
|
|
33
|
+
it("create a group owned by Alice, Alice adds Bob and publish a key for Bob.", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
34
|
+
const alice = yield createDevice();
|
|
35
|
+
const bob = yield createDevice();
|
|
36
|
+
let stream = new CommandStream();
|
|
37
|
+
stream = yield stream.edit().seed(crypto.from_hex(DEFAULT_TOPIC)).issue(alice);
|
|
38
|
+
stream = yield stream
|
|
39
|
+
.edit()
|
|
40
|
+
.addMember("Bob", (yield bob.getPublicKey()).publicKey, Permissions.KEY_READER)
|
|
41
|
+
.issue(alice);
|
|
42
|
+
const tree = StreamTree.from(stream);
|
|
43
|
+
// Encrypt a message from Alice
|
|
44
|
+
const originalMessage = new TextEncoder().encode("Hello World!");
|
|
45
|
+
const encryptedMessage = yield StreamTreeCipher.create(alice).encrypt(tree, [], originalMessage);
|
|
46
|
+
// The message should be different from the original
|
|
47
|
+
expect(crypto.to_hex(encryptedMessage)).not.toEqual(crypto.to_hex(originalMessage));
|
|
48
|
+
// Decrypt the message from Bob
|
|
49
|
+
const decryptedMessage = yield StreamTreeCipher.create(bob).decrypt(tree, [], encryptedMessage);
|
|
50
|
+
// The message should be the same as the original
|
|
51
|
+
expect(crypto.to_hex(decryptedMessage)).toBe(crypto.to_hex(originalMessage));
|
|
52
|
+
}));
|
|
53
|
+
it("create a group owned by Alice, Alice adds Bob and publish a key for Bob, Alice adds Charlie and Bob publishes a key for Charlie", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
54
|
+
const alice = yield createDevice();
|
|
55
|
+
const bob = yield createDevice();
|
|
56
|
+
const charlie = yield createDevice();
|
|
57
|
+
let stream = new CommandStream();
|
|
58
|
+
stream = yield stream.edit().seed(crypto.from_hex(DEFAULT_TOPIC)).issue(alice);
|
|
59
|
+
stream = yield stream
|
|
60
|
+
.edit()
|
|
61
|
+
.addMember("Bob", (yield bob.getPublicKey()).publicKey, Permissions.KEY_READER)
|
|
62
|
+
.issue(alice);
|
|
63
|
+
stream = yield stream
|
|
64
|
+
.edit()
|
|
65
|
+
.addMember("Charlie", (yield charlie.getPublicKey()).publicKey, Permissions.KEY_READER)
|
|
66
|
+
.issue(alice);
|
|
67
|
+
const tree = StreamTree.from(stream);
|
|
68
|
+
// Encrypt a message from Alice
|
|
69
|
+
const originalMessage = new TextEncoder().encode("Hello World!");
|
|
70
|
+
const encryptedMessage = yield StreamTreeCipher.create(alice).encrypt(tree, [], originalMessage);
|
|
71
|
+
// The message should be different from the original
|
|
72
|
+
expect(crypto.to_hex(encryptedMessage)).not.toBe(crypto.to_hex(originalMessage));
|
|
73
|
+
{
|
|
74
|
+
// Decrypt the message from Bob
|
|
75
|
+
const decryptedMessage = yield StreamTreeCipher.create(bob).decrypt(tree, [], encryptedMessage);
|
|
76
|
+
// The message should be the same as the original
|
|
77
|
+
expect(crypto.to_hex(decryptedMessage)).toBe(crypto.to_hex(originalMessage));
|
|
78
|
+
}
|
|
79
|
+
{
|
|
80
|
+
// Decrypt the message from Charlie
|
|
81
|
+
const decryptedMessage = yield StreamTreeCipher.create(charlie).decrypt(tree, [], encryptedMessage);
|
|
82
|
+
// The message should be the same as the original
|
|
83
|
+
expect(crypto.to_hex(decryptedMessage)).toBe(crypto.to_hex(originalMessage));
|
|
84
|
+
}
|
|
85
|
+
//console.log(crypto.to_hex(CommandStreamEncoder.encode(stream.blocks)));
|
|
86
|
+
//const parsed = CommandStreamDecoder.decode(CommandStreamEncoder.encode(stream.blocks));
|
|
87
|
+
//console.log(JSON.stringify(CommandStreamJsonifier.jsonify(parsed), null, 2));
|
|
88
|
+
}));
|
|
89
|
+
it("creates group owned by Alice, Alice adds Bob as an admin, Bob adds Charlie", () => __awaiter(void 0, void 0, void 0, function* () {
|
|
90
|
+
const alice = yield createDevice();
|
|
91
|
+
const bob = yield createDevice();
|
|
92
|
+
const charlie = yield createDevice();
|
|
93
|
+
let stream = new CommandStream();
|
|
94
|
+
stream = yield stream.edit().seed(crypto.from_hex(DEFAULT_TOPIC)).issue(alice);
|
|
95
|
+
stream = yield stream
|
|
96
|
+
.edit()
|
|
97
|
+
.addMember("Bob", (yield bob.getPublicKey()).publicKey, Permissions.ADD_MEMBER | Permissions.KEY_READER)
|
|
98
|
+
.issue(alice);
|
|
99
|
+
stream = yield stream
|
|
100
|
+
.edit()
|
|
101
|
+
.addMember("Charlie", (yield charlie.getPublicKey()).publicKey, Permissions.KEY_READER)
|
|
102
|
+
.issue(bob);
|
|
103
|
+
const tree = StreamTree.from(stream);
|
|
104
|
+
// Encrypt a message from Alice
|
|
105
|
+
const originalMessage = new TextEncoder().encode("Hello World!");
|
|
106
|
+
const encryptedMessage = yield StreamTreeCipher.create(alice).encrypt(tree, [], originalMessage);
|
|
107
|
+
// The message should be different from the original
|
|
108
|
+
expect(crypto.to_hex(encryptedMessage)).not.toBe(crypto.to_hex(originalMessage));
|
|
109
|
+
{
|
|
110
|
+
// Decrypt the message from Bob
|
|
111
|
+
const decryptedMessage = yield StreamTreeCipher.create(bob).decrypt(tree, [], encryptedMessage);
|
|
112
|
+
// The message should be the same as the original
|
|
113
|
+
expect(crypto.to_hex(decryptedMessage)).toBe(crypto.to_hex(originalMessage));
|
|
114
|
+
}
|
|
115
|
+
{
|
|
116
|
+
// Decrypt the message from Charlie
|
|
117
|
+
const decryptedMessage = yield StreamTreeCipher.create(charlie).decrypt(tree, [], encryptedMessage);
|
|
118
|
+
// The message should be the same as the original
|
|
119
|
+
expect(crypto.to_hex(decryptedMessage)).toBe(crypto.to_hex(originalMessage));
|
|
120
|
+
}
|
|
121
|
+
//console.log(JSON.stringify(CommandStreamJsonifier.jsonify(stream.blocks), null, 2));
|
|
122
|
+
}));
|
|
123
|
+
});
|
|
124
|
+
//# sourceMappingURL=key_exchange.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"key_exchange.js","sourceRoot":"","sources":["../../src/__tests__/key_exchange.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seedId.d.ts","sourceRoot":"","sources":["../../src/__tests__/seedId.ts"],"names":[],"mappings":""}
|