@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 @@
|
|
|
1
|
+
{"version":3,"file":"Device.d.ts","sourceRoot":"","sources":["../src/Device.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EACL,YAAY,EAMb,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAA0B,OAAO,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C;;GAEG;AACH,MAAM,WAAW,MAAM;IAErB,YAAY,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC;IAEnC;;;;;OAKG;IACH,oBAAoB,IAAI,OAAO,CAAC;IAGhC,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAEvE;;;;;OAKG;IACH,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAChE;AAcD,qBAAa,cAAe,YAAW,MAAM;IAC3C,OAAO,CAAC,OAAO,CAAU;gBAEb,EAAE,EAAE,OAAO;IAIjB,YAAY,IAAI,OAAO,CAAC,SAAS,CAAC;IAIxC,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,gBAAgB;YAUV,SAAS;IAmBjB,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;IA2FtE,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC;IA4BpE,oBAAoB,IAAI,OAAO;CAGhC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAGrC;AAED,eAAO,MAAM,kBAAkB,YAE7B,CAAC"}
|
package/lib-es/Device.js
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
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 { PublicKey } from "./PublicKey";
|
|
11
|
+
import { CommandType, signCommandBlock, } from "./CommandBlock";
|
|
12
|
+
import CommandStreamResolver from "./CommandStreamResolver";
|
|
13
|
+
import { crypto, DerivationPath } from "./Crypto";
|
|
14
|
+
export class SoftwareDevice {
|
|
15
|
+
constructor(kp) {
|
|
16
|
+
this.keyPair = kp;
|
|
17
|
+
}
|
|
18
|
+
getPublicKey() {
|
|
19
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
20
|
+
return new PublicKey(this.keyPair.publicKey);
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
generateSharedKey() {
|
|
24
|
+
const xpriv = crypto.randomBytes(64);
|
|
25
|
+
const pk = crypto.derivePrivate(xpriv, []);
|
|
26
|
+
return { xpriv, publicKey: pk.publicKey };
|
|
27
|
+
}
|
|
28
|
+
encryptSharedKey(sharedKey, recipient) {
|
|
29
|
+
const kp = crypto.randomKeypair();
|
|
30
|
+
const ecdh = crypto.ecdh(kp, recipient);
|
|
31
|
+
const initializationVector = crypto.randomBytes(16);
|
|
32
|
+
const encryptedXpriv = crypto.encrypt(ecdh, initializationVector, sharedKey.xpriv);
|
|
33
|
+
return {
|
|
34
|
+
encryptedXpriv,
|
|
35
|
+
publicKey: sharedKey.publicKey,
|
|
36
|
+
ephemeralPublicKey: kp.publicKey,
|
|
37
|
+
initializationVector,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
decryptSharedKey(encryptedSharedKey) {
|
|
41
|
+
const ecdh = crypto.ecdh(this.keyPair, encryptedSharedKey.ephemeralPublicKey);
|
|
42
|
+
const xpriv = crypto.decrypt(ecdh, encryptedSharedKey.initializationVector, encryptedSharedKey.encryptedXpriv);
|
|
43
|
+
return { xpriv, publicKey: encryptedSharedKey.publicKey };
|
|
44
|
+
}
|
|
45
|
+
deriveKey(tree, path) {
|
|
46
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
47
|
+
const event = yield tree.getPublishKeyEvent(this.keyPair.publicKey, path);
|
|
48
|
+
if (!event) {
|
|
49
|
+
throw new Error("Cannot find key in the tree for the current device");
|
|
50
|
+
}
|
|
51
|
+
const encryptedSharedKey = {
|
|
52
|
+
encryptedXpriv: event.encryptedXpriv,
|
|
53
|
+
publicKey: event.groupPublicKey,
|
|
54
|
+
ephemeralPublicKey: event.ephemeralPublicKey,
|
|
55
|
+
initializationVector: event.nonce,
|
|
56
|
+
};
|
|
57
|
+
const sharedKey = this.decryptSharedKey(encryptedSharedKey);
|
|
58
|
+
const newKey = crypto.derivePrivate(sharedKey.xpriv, path);
|
|
59
|
+
const xpriv = new Uint8Array(64);
|
|
60
|
+
xpriv.set(newKey.privateKey);
|
|
61
|
+
xpriv.set(newKey.chainCode, 32);
|
|
62
|
+
return { xpriv, publicKey: newKey.publicKey };
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
sign(stream, tree) {
|
|
66
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
67
|
+
if (stream.length === 0) {
|
|
68
|
+
throw new Error("Cannot sign an empty stream");
|
|
69
|
+
}
|
|
70
|
+
if (stream[stream.length - 1].commands.length === 0) {
|
|
71
|
+
throw new Error("Cannot sign an empty block");
|
|
72
|
+
}
|
|
73
|
+
const lastBlock = stream[stream.length - 1];
|
|
74
|
+
lastBlock.issuer = this.keyPair.publicKey;
|
|
75
|
+
// Resolve the stream (before the last block)
|
|
76
|
+
const resolved = yield CommandStreamResolver.resolve(stream.slice(0, stream.length - 1));
|
|
77
|
+
// The shared key of the stream
|
|
78
|
+
let sharedKey = null;
|
|
79
|
+
// Iterate through the commands to inject encrypted keys
|
|
80
|
+
for (let commandIndex = 0; commandIndex < lastBlock.commands.length; commandIndex++) {
|
|
81
|
+
const command = lastBlock.commands[commandIndex];
|
|
82
|
+
switch (command.getType()) {
|
|
83
|
+
case CommandType.Seed: {
|
|
84
|
+
// Generate the shared key
|
|
85
|
+
sharedKey = this.generateSharedKey();
|
|
86
|
+
// Encrypt the shared key and inject it in the command
|
|
87
|
+
const encryptedSharedKey = this.encryptSharedKey(sharedKey, this.keyPair.publicKey);
|
|
88
|
+
command.groupKey = sharedKey.publicKey;
|
|
89
|
+
command.encryptedXpriv = encryptedSharedKey.encryptedXpriv;
|
|
90
|
+
command.ephemeralPublicKey = encryptedSharedKey.ephemeralPublicKey;
|
|
91
|
+
command.initializationVector = encryptedSharedKey.initializationVector;
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
case CommandType.Derive: {
|
|
95
|
+
// Derive the shared key from the tree
|
|
96
|
+
if (!tree) {
|
|
97
|
+
throw new Error("Cannot derive a key without a tree");
|
|
98
|
+
}
|
|
99
|
+
sharedKey = yield this.deriveKey(tree, command.path);
|
|
100
|
+
// Encrypt the shared key and inject it in the command
|
|
101
|
+
const encryptedDerivedKey = this.encryptSharedKey(sharedKey, this.keyPair.publicKey);
|
|
102
|
+
command.groupKey = sharedKey.publicKey;
|
|
103
|
+
command.encryptedXpriv = encryptedDerivedKey.encryptedXpriv;
|
|
104
|
+
command.initializationVector = encryptedDerivedKey.initializationVector;
|
|
105
|
+
command.ephemeralPublicKey = encryptedDerivedKey.ephemeralPublicKey;
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
case CommandType.PublishKey: {
|
|
109
|
+
// Derive the shared key from the tree
|
|
110
|
+
if (!sharedKey) {
|
|
111
|
+
// If the current stream is the seed stream, read the key from the first command in the first block
|
|
112
|
+
const encryptedKey = resolved.getEncryptedKey(this.keyPair.publicKey);
|
|
113
|
+
if (encryptedKey) {
|
|
114
|
+
sharedKey = this.decryptSharedKey({
|
|
115
|
+
encryptedXpriv: encryptedKey.encryptedXpriv,
|
|
116
|
+
initializationVector: encryptedKey.initialiationVector,
|
|
117
|
+
publicKey: encryptedKey.issuer,
|
|
118
|
+
ephemeralPublicKey: encryptedKey.ephemeralPublicKey,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
else if (stream[0].commands[0].getType() == CommandType.Seed) {
|
|
122
|
+
if (crypto.to_hex(stream[0].issuer) !== crypto.to_hex(this.keyPair.publicKey)) {
|
|
123
|
+
throw new Error("Cannot read the seed key from another device");
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
// console.dir(stream, { depth: null });
|
|
128
|
+
sharedKey = yield this.deriveKey(tree, resolved.getStreamDerivationPath());
|
|
129
|
+
}
|
|
130
|
+
if (!sharedKey)
|
|
131
|
+
throw new Error("Cannot find the shared key");
|
|
132
|
+
}
|
|
133
|
+
const encryptedSharedKey = this.encryptSharedKey(sharedKey, command.recipient);
|
|
134
|
+
command.encryptedXpriv = encryptedSharedKey.encryptedXpriv;
|
|
135
|
+
command.initializationVector = encryptedSharedKey.initializationVector;
|
|
136
|
+
command.ephemeralPublicKey = encryptedSharedKey.ephemeralPublicKey;
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
const signature = signCommandBlock(lastBlock, (yield this.getPublicKey()).publicKey, this.keyPair.privateKey).signature;
|
|
142
|
+
lastBlock.signature = signature;
|
|
143
|
+
return lastBlock;
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
readKey(tree, path) {
|
|
147
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
148
|
+
const event = yield tree.getPublishKeyEvent(this.keyPair.publicKey, path);
|
|
149
|
+
if (!event) {
|
|
150
|
+
throw new Error("Cannot find key in the tree for the current device");
|
|
151
|
+
}
|
|
152
|
+
const encryptedSharedKey = {
|
|
153
|
+
encryptedXpriv: event.encryptedXpriv,
|
|
154
|
+
initializationVector: event.nonce,
|
|
155
|
+
publicKey: event.groupPublicKey,
|
|
156
|
+
ephemeralPublicKey: event.ephemeralPublicKey,
|
|
157
|
+
};
|
|
158
|
+
const sharedKey = this.decryptSharedKey(encryptedSharedKey);
|
|
159
|
+
// Derive the key to match the path
|
|
160
|
+
let index = DerivationPath.toIndexArray(event.stream.getStreamPath()).length;
|
|
161
|
+
while (index < path.length) {
|
|
162
|
+
const derivation = crypto.derivePrivate(sharedKey.xpriv, [index]);
|
|
163
|
+
const xpriv = new Uint8Array(64);
|
|
164
|
+
xpriv.set(derivation.privateKey);
|
|
165
|
+
xpriv.set(derivation.chainCode, 32);
|
|
166
|
+
sharedKey.xpriv = xpriv;
|
|
167
|
+
sharedKey.publicKey = derivation.publicKey;
|
|
168
|
+
index += 1;
|
|
169
|
+
}
|
|
170
|
+
return sharedKey.xpriv;
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
isPublicKeyAvailable() {
|
|
174
|
+
return true;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
*
|
|
179
|
+
*/
|
|
180
|
+
export function createDevice() {
|
|
181
|
+
const kp = crypto.randomKeypair();
|
|
182
|
+
return new SoftwareDevice(kp);
|
|
183
|
+
}
|
|
184
|
+
export const ISSUER_PLACEHOLDER = new Uint8Array([
|
|
185
|
+
3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
186
|
+
]);
|
|
187
|
+
//# sourceMappingURL=Device.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Device.js","sourceRoot":"","sources":["../src/Device.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class IndexedTree<T> {
|
|
2
|
+
private node;
|
|
3
|
+
private children;
|
|
4
|
+
constructor(node: T | null, children?: Map<number, IndexedTree<T>>);
|
|
5
|
+
getHighestIndex(): number;
|
|
6
|
+
getChildren(): Map<number, IndexedTree<T>>;
|
|
7
|
+
getChild(index: number): IndexedTree<T> | undefined;
|
|
8
|
+
findChild(path: number[]): IndexedTree<T> | undefined;
|
|
9
|
+
getValue(): T | null;
|
|
10
|
+
updateChild(path: number[], value: T): IndexedTree<T>;
|
|
11
|
+
addChild(path: number[], child: IndexedTree<T>): IndexedTree<T>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=IndexedTree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IndexedTree.d.ts","sourceRoot":"","sources":["../src/IndexedTree.ts"],"names":[],"mappings":"AAAA,qBAAa,WAAW,CAAC,CAAC;IACxB,OAAO,CAAC,IAAI,CAAW;IACvB,OAAO,CAAC,QAAQ,CAA8B;gBAElC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,QAAQ,GAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAa;IAKtE,eAAe,IAAI,MAAM;IAIzB,WAAW,IAAI,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IAI1C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,SAAS;IAInD,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,SAAS;IAYrD,QAAQ,IAAI,CAAC,GAAG,IAAI;IAKpB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;IAmBrD,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;CAsBvE"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
export class IndexedTree {
|
|
2
|
+
constructor(node, children = new Map()) {
|
|
3
|
+
this.node = node;
|
|
4
|
+
this.children = children;
|
|
5
|
+
}
|
|
6
|
+
getHighestIndex() {
|
|
7
|
+
return [...this.children.keys()].reduce((a, b) => Math.max(a, b), 0);
|
|
8
|
+
}
|
|
9
|
+
getChildren() {
|
|
10
|
+
return this.children;
|
|
11
|
+
}
|
|
12
|
+
getChild(index) {
|
|
13
|
+
return this.children.get(index);
|
|
14
|
+
}
|
|
15
|
+
findChild(path) {
|
|
16
|
+
if (path.length === 0) {
|
|
17
|
+
return this;
|
|
18
|
+
}
|
|
19
|
+
const index = path[0];
|
|
20
|
+
const rest = path.slice(1);
|
|
21
|
+
if (this.children.has(index)) {
|
|
22
|
+
return this.children.get(index).findChild(rest);
|
|
23
|
+
}
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
getValue() {
|
|
27
|
+
return this.node;
|
|
28
|
+
}
|
|
29
|
+
/// Update the value of the node, if the node doesn't exist, it will be created
|
|
30
|
+
updateChild(path, value) {
|
|
31
|
+
if (path.length === 0) {
|
|
32
|
+
return new IndexedTree(value, this.children);
|
|
33
|
+
}
|
|
34
|
+
const index = path[0];
|
|
35
|
+
const rest = path.slice(1);
|
|
36
|
+
const children = new Map(this.children);
|
|
37
|
+
if (this.children.has(index)) {
|
|
38
|
+
const subTree = this.children.get(index).updateChild(rest, value);
|
|
39
|
+
children.set(index, subTree);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
const subTree = new IndexedTree(null).updateChild(rest, value);
|
|
43
|
+
children.set(index, subTree);
|
|
44
|
+
}
|
|
45
|
+
return new IndexedTree(this.node, children);
|
|
46
|
+
}
|
|
47
|
+
/// Adds a subtree to the tree
|
|
48
|
+
addChild(path, child) {
|
|
49
|
+
if (path.length === 0) {
|
|
50
|
+
return this;
|
|
51
|
+
}
|
|
52
|
+
if (path.length == 1) {
|
|
53
|
+
const children = new Map(this.children);
|
|
54
|
+
children.set(path[0], child);
|
|
55
|
+
return new IndexedTree(this.node, children);
|
|
56
|
+
}
|
|
57
|
+
const index = path[0];
|
|
58
|
+
const rest = path.slice(1);
|
|
59
|
+
const children = new Map(this.children);
|
|
60
|
+
if (this.children.has(index)) {
|
|
61
|
+
const subTree = this.children.get(index).addChild(rest, child);
|
|
62
|
+
children.set(index, subTree);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
const subTree = new IndexedTree(null).addChild(rest, child);
|
|
66
|
+
children.set(index, subTree);
|
|
67
|
+
}
|
|
68
|
+
return new IndexedTree(this.node, children);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=IndexedTree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IndexedTree.js","sourceRoot":"","sources":["../src/IndexedTree.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Crypto, KeyPair, KeyPairWithChainCode } from "./Crypto";
|
|
2
|
+
export declare class NobleCryptoSecp256k1 implements Crypto {
|
|
3
|
+
randomKeypair(): KeyPair;
|
|
4
|
+
derivePrivate(xpriv: Uint8Array, path: number[]): KeyPairWithChainCode;
|
|
5
|
+
keypairFromSecretKey(secretKey: Uint8Array): KeyPair;
|
|
6
|
+
private derEncode;
|
|
7
|
+
private derDecode;
|
|
8
|
+
sign(message: Uint8Array, keyPair: KeyPair): Uint8Array;
|
|
9
|
+
verify(message: Uint8Array, signature: Uint8Array, publicKey: Uint8Array): boolean;
|
|
10
|
+
private to_array;
|
|
11
|
+
private normalizeKey;
|
|
12
|
+
private normalizeNonce;
|
|
13
|
+
private concat;
|
|
14
|
+
private enforceLength;
|
|
15
|
+
encrypt(secret: Uint8Array, nonce: Uint8Array, message: Uint8Array): Uint8Array;
|
|
16
|
+
decrypt(secret: Uint8Array, nonce: Uint8Array, ciphertext: Uint8Array): Uint8Array;
|
|
17
|
+
/**
|
|
18
|
+
* Ledger Live data are encrypted following pattern based on ECIES.
|
|
19
|
+
* For each encryption the Ledger Live instance generates a random keypair over secp256k1 (ephemeral public key)
|
|
20
|
+
* and a 16 bytes IV. Ledger Live then perform an ECDH between the command stream public key and
|
|
21
|
+
* the ephemeral private key to get the encryption key.
|
|
22
|
+
* The data is then encrypted using AES-256-GCM and serialized using the following format:
|
|
23
|
+
1 byte : Version of the format (0x00)
|
|
24
|
+
33 bytes : Compressed ephemeral public key
|
|
25
|
+
16 bytes : Nonce/IV
|
|
26
|
+
16 bytes : Tag/MAC (from AES-256-GCM)
|
|
27
|
+
variable : Encrypted data
|
|
28
|
+
*/
|
|
29
|
+
encryptUserData(commandStreamPrivateKey: Uint8Array, data: Uint8Array): Uint8Array;
|
|
30
|
+
decryptUserData(commandStreamPrivateKey: Uint8Array, data: Uint8Array): Uint8Array;
|
|
31
|
+
randomBytes(size: number): Uint8Array;
|
|
32
|
+
ecdh(keyPair: KeyPair, publicKey: Uint8Array): Uint8Array;
|
|
33
|
+
computeSymmetricKey(privateKey: Uint8Array, extra: Uint8Array): any;
|
|
34
|
+
hash(message: Uint8Array): Uint8Array;
|
|
35
|
+
from_hex(hex: string): Uint8Array;
|
|
36
|
+
to_hex(bytes?: Uint8Array | undefined | null): string;
|
|
37
|
+
}
|
|
38
|
+
export declare function to_hex(bytes?: Uint8Array | undefined | null): string;
|
|
39
|
+
//# sourceMappingURL=NobleCrypto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NobleCrypto.d.ts","sourceRoot":"","sources":["../src/NobleCrypto.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAMjE,qBAAa,oBAAqB,YAAW,MAAM;IACjD,aAAa,IAAI,OAAO;IAQxB,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,oBAAoB;IActE,oBAAoB,CAAC,SAAS,EAAE,UAAU,GAAG,OAAO;IAOpD,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,SAAS;IAYjB,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,UAAU;IAMvD,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,GAAG,OAAO;IAMlF,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,MAAM;IAOd,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,GAAG,UAAU;IAW/E,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,GAAG,UAAU;IAYlF;;;;;;;;;;;OAWG;IACH,eAAe,CAAC,uBAAuB,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU;IAmClF,eAAe,CAAC,uBAAuB,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU;IA2BlF,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU;IAIrC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,GAAG,UAAU;IAOzD,mBAAmB,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU;IAK7D,IAAI,CAAC,OAAO,EAAE,UAAU,GAAG,UAAU;IAIrC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU;IAQjC,MAAM,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM;CAGtD;AAED,wBAAgB,MAAM,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAKpE"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import * as secp256k1 from "secp256k1";
|
|
2
|
+
import * as ecc from "tiny-secp256k1";
|
|
3
|
+
import { BIP32Factory } from "bip32";
|
|
4
|
+
import hmac from "create-hmac";
|
|
5
|
+
import * as crypto from "crypto";
|
|
6
|
+
const bip32 = BIP32Factory(ecc);
|
|
7
|
+
const AES_BLOCK_SIZE = 16;
|
|
8
|
+
const PRIVATE_KEY_SIZE = 32;
|
|
9
|
+
export class NobleCryptoSecp256k1 {
|
|
10
|
+
randomKeypair() {
|
|
11
|
+
let pk;
|
|
12
|
+
do {
|
|
13
|
+
pk = crypto.randomBytes(PRIVATE_KEY_SIZE);
|
|
14
|
+
} while (!secp256k1.privateKeyVerify(pk));
|
|
15
|
+
return this.keypairFromSecretKey(pk);
|
|
16
|
+
}
|
|
17
|
+
derivePrivate(xpriv, path) {
|
|
18
|
+
const pk = xpriv.slice(0, 32);
|
|
19
|
+
const chainCode = xpriv.slice(32);
|
|
20
|
+
let node = bip32.fromPrivateKey(Buffer.from(pk), Buffer.from(chainCode));
|
|
21
|
+
for (const index of path) {
|
|
22
|
+
node = node.derive(index);
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
publicKey: this.to_array(node.publicKey),
|
|
26
|
+
privateKey: this.to_array(node.privateKey),
|
|
27
|
+
chainCode: this.to_array(node.chainCode),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
keypairFromSecretKey(secretKey) {
|
|
31
|
+
return {
|
|
32
|
+
publicKey: secp256k1.publicKeyCreate(secretKey),
|
|
33
|
+
privateKey: secretKey,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
derEncode(R, S) {
|
|
37
|
+
if (R[0] > 0x7f) {
|
|
38
|
+
R = this.concat(new Uint8Array([0x00]), R);
|
|
39
|
+
}
|
|
40
|
+
if (S[0] > 0x7f) {
|
|
41
|
+
S = this.concat(new Uint8Array([0x00]), S);
|
|
42
|
+
}
|
|
43
|
+
R = this.concat(new Uint8Array([0x02, R.length]), R);
|
|
44
|
+
S = this.concat(new Uint8Array([0x02, S.length]), S);
|
|
45
|
+
const prefix = new Uint8Array([0x30, R.length + S.length]);
|
|
46
|
+
return this.concat(prefix, this.concat(R, S));
|
|
47
|
+
}
|
|
48
|
+
derDecode(signature) {
|
|
49
|
+
const R = signature.slice(4, 4 + signature[3]);
|
|
50
|
+
const S = signature.slice(6 + signature[3], 6 + signature[3] + signature[5 + signature[3]]);
|
|
51
|
+
return {
|
|
52
|
+
R: this.enforceLength(R, PRIVATE_KEY_SIZE),
|
|
53
|
+
S: this.enforceLength(S, PRIVATE_KEY_SIZE),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
sign(message, keyPair) {
|
|
57
|
+
const signature = secp256k1.ecdsaSign(message, keyPair.privateKey).signature;
|
|
58
|
+
// DER encoding
|
|
59
|
+
return this.derEncode(signature.slice(0, 32), signature.slice(32, 64));
|
|
60
|
+
}
|
|
61
|
+
verify(message, signature, publicKey) {
|
|
62
|
+
// DER decoding
|
|
63
|
+
const { R, S } = this.derDecode(signature);
|
|
64
|
+
return secp256k1.ecdsaVerify(this.concat(R, S), message, publicKey);
|
|
65
|
+
}
|
|
66
|
+
to_array(buffer) {
|
|
67
|
+
return new Uint8Array(buffer);
|
|
68
|
+
}
|
|
69
|
+
normalizeKey(key) {
|
|
70
|
+
if (key.length === 32) {
|
|
71
|
+
return key;
|
|
72
|
+
}
|
|
73
|
+
throw new Error("Invalid key length for AES-256 " + `(invalid length is ${key.length})`);
|
|
74
|
+
}
|
|
75
|
+
normalizeNonce(nonce) {
|
|
76
|
+
if (nonce.length < 16) {
|
|
77
|
+
throw new Error("Invalid nonce length (must be 128bits) " + `(invalid length is ${nonce.length})`);
|
|
78
|
+
}
|
|
79
|
+
return nonce.slice(0, 16);
|
|
80
|
+
}
|
|
81
|
+
concat(a, b) {
|
|
82
|
+
const c = new Uint8Array(a.length + b.length);
|
|
83
|
+
c.set(a);
|
|
84
|
+
c.set(b, a.length);
|
|
85
|
+
return c;
|
|
86
|
+
}
|
|
87
|
+
enforceLength(buffer, length) {
|
|
88
|
+
if (buffer.length > length) {
|
|
89
|
+
return buffer.slice(buffer.length - length); // truncate extra bytes from the start
|
|
90
|
+
}
|
|
91
|
+
else if (buffer.length < length) {
|
|
92
|
+
const padded = new Uint8Array(length);
|
|
93
|
+
const start = length - buffer.length;
|
|
94
|
+
padded.set(Array(start).fill(0));
|
|
95
|
+
padded.set(buffer, start);
|
|
96
|
+
return padded;
|
|
97
|
+
}
|
|
98
|
+
return buffer;
|
|
99
|
+
}
|
|
100
|
+
encrypt(secret, nonce, message) {
|
|
101
|
+
const normalizedSecret = this.normalizeKey(secret);
|
|
102
|
+
const normalizeNonce = this.normalizeNonce(nonce);
|
|
103
|
+
const cipher = crypto.createCipheriv("aes-256-gcm", normalizedSecret, normalizeNonce);
|
|
104
|
+
cipher.setAutoPadding(false);
|
|
105
|
+
let result = cipher.update(this.to_hex(message), "hex", "hex");
|
|
106
|
+
result += cipher.final("hex");
|
|
107
|
+
const bytes = this.from_hex(result);
|
|
108
|
+
return this.concat(bytes, cipher.getAuthTag());
|
|
109
|
+
}
|
|
110
|
+
decrypt(secret, nonce, ciphertext) {
|
|
111
|
+
const normalizedSecret = this.normalizeKey(secret);
|
|
112
|
+
const normalizeNonce = this.normalizeNonce(nonce);
|
|
113
|
+
const encryptedData = ciphertext.slice(0, ciphertext.length - AES_BLOCK_SIZE);
|
|
114
|
+
const authTag = ciphertext.slice(encryptedData.length);
|
|
115
|
+
const decipher = crypto.createDecipheriv("aes-256-gcm", normalizedSecret, normalizeNonce);
|
|
116
|
+
decipher.setAuthTag(authTag);
|
|
117
|
+
let result = decipher.update(this.to_hex(encryptedData), "hex", "hex");
|
|
118
|
+
result += decipher.final("hex");
|
|
119
|
+
return this.from_hex(result);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Ledger Live data are encrypted following pattern based on ECIES.
|
|
123
|
+
* For each encryption the Ledger Live instance generates a random keypair over secp256k1 (ephemeral public key)
|
|
124
|
+
* and a 16 bytes IV. Ledger Live then perform an ECDH between the command stream public key and
|
|
125
|
+
* the ephemeral private key to get the encryption key.
|
|
126
|
+
* The data is then encrypted using AES-256-GCM and serialized using the following format:
|
|
127
|
+
1 byte : Version of the format (0x00)
|
|
128
|
+
33 bytes : Compressed ephemeral public key
|
|
129
|
+
16 bytes : Nonce/IV
|
|
130
|
+
16 bytes : Tag/MAC (from AES-256-GCM)
|
|
131
|
+
variable : Encrypted data
|
|
132
|
+
*/
|
|
133
|
+
encryptUserData(commandStreamPrivateKey, data) {
|
|
134
|
+
// Generate ephemeral key pair
|
|
135
|
+
const ephemeralKeypair = this.randomKeypair();
|
|
136
|
+
// Derive the shared secret using ECDH
|
|
137
|
+
const sharedSecret = this.ecdh(this.keypairFromSecretKey(commandStreamPrivateKey), ephemeralKeypair.publicKey);
|
|
138
|
+
// Normalize the shared secret to be used as AES key
|
|
139
|
+
const aesKey = this.computeSymmetricKey(sharedSecret, new Uint8Array());
|
|
140
|
+
// Generate a random IV (nonce)
|
|
141
|
+
const iv = crypto.randomBytes(16);
|
|
142
|
+
// Encrypt the data using AES-256-GCM
|
|
143
|
+
const cipher = crypto.createCipheriv("aes-256-gcm", aesKey, iv);
|
|
144
|
+
let encryptedData = cipher.update(data);
|
|
145
|
+
encryptedData = Buffer.concat([encryptedData, cipher.final()]);
|
|
146
|
+
const tag = cipher.getAuthTag();
|
|
147
|
+
// Serialize the format
|
|
148
|
+
const result = new Uint8Array(1 + ephemeralKeypair.publicKey.length + iv.length + tag.length + encryptedData.length);
|
|
149
|
+
result[0] = 0x00; // Version of the format
|
|
150
|
+
result.set(ephemeralKeypair.publicKey, 1);
|
|
151
|
+
result.set(iv, 34);
|
|
152
|
+
result.set(tag, 50);
|
|
153
|
+
result.set(encryptedData, 66);
|
|
154
|
+
return result;
|
|
155
|
+
}
|
|
156
|
+
decryptUserData(commandStreamPrivateKey, data) {
|
|
157
|
+
const version = data[0];
|
|
158
|
+
if (version !== 0x00) {
|
|
159
|
+
throw new Error("Unsupported format version");
|
|
160
|
+
}
|
|
161
|
+
const ephemeralPublicKey = data.slice(1, 34);
|
|
162
|
+
const iv = data.slice(34, 50);
|
|
163
|
+
const tag = data.slice(50, 66);
|
|
164
|
+
const encryptedData = data.slice(66);
|
|
165
|
+
// Derive the shared secret using ECDH
|
|
166
|
+
const sharedSecret = this.ecdh(this.keypairFromSecretKey(commandStreamPrivateKey), ephemeralPublicKey);
|
|
167
|
+
// Normalize the shared secret to be used as AES key
|
|
168
|
+
const aesKey = this.computeSymmetricKey(sharedSecret, new Uint8Array());
|
|
169
|
+
// Decrypt the data using AES-256-GCM
|
|
170
|
+
const decipher = crypto.createDecipheriv("aes-256-gcm", aesKey, iv);
|
|
171
|
+
decipher.setAuthTag(tag);
|
|
172
|
+
let decryptedData = decipher.update(encryptedData);
|
|
173
|
+
decryptedData = Buffer.concat([decryptedData, decipher.final()]);
|
|
174
|
+
return new Uint8Array(decryptedData.buffer, decryptedData.byteOffset, decryptedData.byteLength);
|
|
175
|
+
}
|
|
176
|
+
randomBytes(size) {
|
|
177
|
+
return crypto.randomBytes(size);
|
|
178
|
+
}
|
|
179
|
+
ecdh(keyPair, publicKey) {
|
|
180
|
+
const pubkey = Buffer.from(publicKey);
|
|
181
|
+
const privkey = Buffer.from(keyPair.privateKey);
|
|
182
|
+
const point = ecc.pointMultiply(pubkey, privkey, ecc.isPointCompressed(pubkey));
|
|
183
|
+
return point.slice(1);
|
|
184
|
+
}
|
|
185
|
+
computeSymmetricKey(privateKey, extra) {
|
|
186
|
+
const digest = hmac("sha256", Buffer.from(extra)).update(Buffer.from(privateKey)).digest();
|
|
187
|
+
return digest;
|
|
188
|
+
}
|
|
189
|
+
hash(message) {
|
|
190
|
+
return crypto.createHash("sha256").update(Buffer.from(message)).digest();
|
|
191
|
+
}
|
|
192
|
+
from_hex(hex) {
|
|
193
|
+
const bytes = new Uint8Array(hex.length / 2);
|
|
194
|
+
for (let i = 0; i < hex.length; i += 2) {
|
|
195
|
+
bytes[i / 2] = parseInt(hex[i] + hex[i + 1], 16);
|
|
196
|
+
}
|
|
197
|
+
return bytes;
|
|
198
|
+
}
|
|
199
|
+
to_hex(bytes) {
|
|
200
|
+
return to_hex(bytes);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
export function to_hex(bytes) {
|
|
204
|
+
if (!bytes) {
|
|
205
|
+
return "";
|
|
206
|
+
}
|
|
207
|
+
return bytes.reduce((str, byte) => str + byte.toString(16).padStart(2, "0"), "");
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=NobleCrypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NobleCrypto.js","sourceRoot":"","sources":["../src/NobleCrypto.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PublicKey.d.ts","sourceRoot":"","sources":["../src/PublicKey.ts"],"names":[],"mappings":"AAAA,qBAAa,SAAS;IACpB,SAAS,EAAE,UAAU,CAAC;gBACV,SAAS,EAAE,UAAU;CAGlC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PublicKey.js","sourceRoot":"","sources":["../src/PublicKey.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,SAAS;IAEpB,YAAY,SAAqB;QAC/B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF"}
|