@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,528 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.createApduDevice = exports.ApduDevice = exports.APDU = exports.TRUSTCHAIN_APP_NAME = void 0;
|
|
13
|
+
const CommandBlock_1 = require("./CommandBlock");
|
|
14
|
+
const PublicKey_1 = require("./PublicKey");
|
|
15
|
+
const CommandStreamEncoder_1 = require("./CommandStreamEncoder");
|
|
16
|
+
const Crypto_1 = require("./Crypto");
|
|
17
|
+
const tlv_1 = require("./tlv");
|
|
18
|
+
const SeedId_1 = require("./SeedId");
|
|
19
|
+
exports.TRUSTCHAIN_APP_NAME = "Ledger Sync";
|
|
20
|
+
var ParseStreamMode;
|
|
21
|
+
(function (ParseStreamMode) {
|
|
22
|
+
ParseStreamMode[ParseStreamMode["BlockHeader"] = 0] = "BlockHeader";
|
|
23
|
+
ParseStreamMode[ParseStreamMode["Command"] = 1] = "Command";
|
|
24
|
+
ParseStreamMode[ParseStreamMode["Signature"] = 2] = "Signature";
|
|
25
|
+
ParseStreamMode[ParseStreamMode["Empty"] = 3] = "Empty";
|
|
26
|
+
})(ParseStreamMode || (ParseStreamMode = {}));
|
|
27
|
+
var OutputDataMode;
|
|
28
|
+
(function (OutputDataMode) {
|
|
29
|
+
OutputDataMode[OutputDataMode["None"] = 0] = "None";
|
|
30
|
+
OutputDataMode[OutputDataMode["TrustedParam"] = 1] = "TrustedParam";
|
|
31
|
+
})(OutputDataMode || (OutputDataMode = {}));
|
|
32
|
+
const TP_ENCRYPT = 1 << 7;
|
|
33
|
+
var TrustedPropertiesTLV;
|
|
34
|
+
(function (TrustedPropertiesTLV) {
|
|
35
|
+
TrustedPropertiesTLV[TrustedPropertiesTLV["IV"] = 0] = "IV";
|
|
36
|
+
TrustedPropertiesTLV[TrustedPropertiesTLV["IssuerPublicKey"] = 129] = "IssuerPublicKey";
|
|
37
|
+
TrustedPropertiesTLV[TrustedPropertiesTLV["Xpriv"] = 130] = "Xpriv";
|
|
38
|
+
TrustedPropertiesTLV[TrustedPropertiesTLV["EphemeralPublicKey"] = 3] = "EphemeralPublicKey";
|
|
39
|
+
TrustedPropertiesTLV[TrustedPropertiesTLV["CommandIV"] = 4] = "CommandIV";
|
|
40
|
+
TrustedPropertiesTLV[TrustedPropertiesTLV["GroupKey"] = 5] = "GroupKey";
|
|
41
|
+
TrustedPropertiesTLV[TrustedPropertiesTLV["TrustedMember"] = 134] = "TrustedMember";
|
|
42
|
+
})(TrustedPropertiesTLV || (TrustedPropertiesTLV = {}));
|
|
43
|
+
/**
|
|
44
|
+
*
|
|
45
|
+
*/
|
|
46
|
+
class APDU {
|
|
47
|
+
static setTrustedMember(transport, member) {
|
|
48
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
49
|
+
const payload = new Uint8Array([
|
|
50
|
+
TrustedPropertiesTLV.IV,
|
|
51
|
+
member.iv.length,
|
|
52
|
+
...member.iv,
|
|
53
|
+
TrustedPropertiesTLV.TrustedMember,
|
|
54
|
+
member.data.length,
|
|
55
|
+
...member.data,
|
|
56
|
+
]);
|
|
57
|
+
yield transport.send(APDU.CLA, APDU.INS_SET_TRUSTED_MEMBER, 0, 0, Buffer.from(payload));
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
static parseBlockHeader(transport, header) {
|
|
61
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
62
|
+
const result = yield transport.send(APDU.CLA, APDU.INS_PARSE_STREAM, ParseStreamMode.BlockHeader, OutputDataMode.None, Buffer.from(header));
|
|
63
|
+
return APDU.getResponseData(result);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
static parseCommand(transport_1, command_1) {
|
|
67
|
+
return __awaiter(this, arguments, void 0, function* (transport, command, outputTrustedParam = false) {
|
|
68
|
+
return yield transport.send(APDU.CLA, APDU.INS_PARSE_STREAM, ParseStreamMode.Command, outputTrustedParam ? OutputDataMode.TrustedParam : OutputDataMode.None, Buffer.from(command));
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
static parseSignature(transport, signature) {
|
|
72
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
73
|
+
return yield transport.send(APDU.CLA, APDU.INS_PARSE_STREAM, ParseStreamMode.Signature, OutputDataMode.None, Buffer.from(signature));
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
static initFlow(transport, sessionKey) {
|
|
77
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
78
|
+
yield transport.send(APDU.CLA, APDU.INS_INIT, 0x00, 0x00, Buffer.from(sessionKey));
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
static parseEmptyStream(transport) {
|
|
82
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
83
|
+
yield transport.send(APDU.CLA, APDU.INS_PARSE_STREAM, ParseStreamMode.Empty, OutputDataMode.None, Buffer.alloc(0));
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
static signBlockHeader(transport, header) {
|
|
87
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
88
|
+
const data = yield transport.send(APDU.CLA, APDU.INS_SIGN_BLOCK, ParseStreamMode.BlockHeader, OutputDataMode.None, Buffer.from(header));
|
|
89
|
+
const resp = APDU.getResponseData(data);
|
|
90
|
+
const tlvs = tlv_1.TLV.readAllTLV(resp, 0);
|
|
91
|
+
let iv = null;
|
|
92
|
+
let issuer = null;
|
|
93
|
+
for (const tlv of tlvs) {
|
|
94
|
+
if (tlv.type === TrustedPropertiesTLV.IV) {
|
|
95
|
+
iv = tlv.value;
|
|
96
|
+
}
|
|
97
|
+
if (tlv.type === TrustedPropertiesTLV.IssuerPublicKey) {
|
|
98
|
+
issuer = tlv.value;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (iv === null) {
|
|
102
|
+
throw new Error("No IV in response");
|
|
103
|
+
}
|
|
104
|
+
if (issuer === null) {
|
|
105
|
+
throw new Error("No issuer in response");
|
|
106
|
+
}
|
|
107
|
+
return { iv, issuer };
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
static signCommand(transport, command) {
|
|
111
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
112
|
+
const data = yield transport.send(APDU.CLA, APDU.INS_SIGN_BLOCK, ParseStreamMode.Command, OutputDataMode.None, Buffer.from(command));
|
|
113
|
+
return APDU.getResponseData(data);
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
static finalizeSignature(transport) {
|
|
117
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
118
|
+
const response = yield transport.send(APDU.CLA, APDU.INS_SIGN_BLOCK, ParseStreamMode.Signature, OutputDataMode.None, Buffer.alloc(0));
|
|
119
|
+
const data = APDU.getResponseData(response);
|
|
120
|
+
const sigLen = data[0];
|
|
121
|
+
const signature = data.slice(1, sigLen + 1);
|
|
122
|
+
const sessionKey = data.slice(sigLen + 2);
|
|
123
|
+
return { signature, sessionKey };
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
static getPublicKey(transport) {
|
|
127
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
128
|
+
const response = yield transport.send(APDU.CLA, APDU.INS_GET_PUBLIC_KEY, 0x00, 0x00, Buffer.alloc(0));
|
|
129
|
+
return APDU.getResponseData(response);
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* allows to sign a challenge and get the seed id
|
|
134
|
+
*/
|
|
135
|
+
static getSeedId(transport, challenge) {
|
|
136
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
137
|
+
const response = yield transport.send(APDU.CLA, APDU.INS_GET_PUBLIC_KEY, 0x00, 0x00, Buffer.from(challenge));
|
|
138
|
+
const result = (0, SeedId_1.parseSeedIdResult)(APDU.getResponseData(response));
|
|
139
|
+
return result;
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
static getResponseData(response) {
|
|
143
|
+
return Uint8Array.prototype.slice.call(response, 0, response.length - 2);
|
|
144
|
+
}
|
|
145
|
+
static getStatusWord(response) {
|
|
146
|
+
return response.readUInt16BE(response.length - 2);
|
|
147
|
+
}
|
|
148
|
+
static parseTrustedSeed(tlvs) {
|
|
149
|
+
let iv = null;
|
|
150
|
+
let xpriv = null;
|
|
151
|
+
let ephemeralPublicKey = null;
|
|
152
|
+
let commandIv = null;
|
|
153
|
+
let groupKey = null;
|
|
154
|
+
let trustedMember = null;
|
|
155
|
+
for (const tlv of tlvs) {
|
|
156
|
+
switch (tlv.type) {
|
|
157
|
+
case TrustedPropertiesTLV.IV:
|
|
158
|
+
iv = tlv.value;
|
|
159
|
+
break;
|
|
160
|
+
case TrustedPropertiesTLV.Xpriv:
|
|
161
|
+
xpriv = tlv.value;
|
|
162
|
+
break;
|
|
163
|
+
case TrustedPropertiesTLV.EphemeralPublicKey:
|
|
164
|
+
ephemeralPublicKey = tlv.value;
|
|
165
|
+
break;
|
|
166
|
+
case TrustedPropertiesTLV.CommandIV:
|
|
167
|
+
commandIv = tlv.value;
|
|
168
|
+
break;
|
|
169
|
+
case TrustedPropertiesTLV.GroupKey:
|
|
170
|
+
groupKey = tlv.value;
|
|
171
|
+
break;
|
|
172
|
+
case TrustedPropertiesTLV.TrustedMember:
|
|
173
|
+
trustedMember = tlv.value;
|
|
174
|
+
break;
|
|
175
|
+
default:
|
|
176
|
+
throw new Error("Unknown trusted property");
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (iv === null) {
|
|
180
|
+
throw new Error("No IV in response");
|
|
181
|
+
}
|
|
182
|
+
if (xpriv === null) {
|
|
183
|
+
throw new Error("No xpriv in response");
|
|
184
|
+
}
|
|
185
|
+
if (ephemeralPublicKey === null) {
|
|
186
|
+
throw new Error("No ephemeral public key in response");
|
|
187
|
+
}
|
|
188
|
+
if (commandIv === null) {
|
|
189
|
+
throw new Error("No command IV in response");
|
|
190
|
+
}
|
|
191
|
+
if (groupKey === null) {
|
|
192
|
+
throw new Error("No group key in response");
|
|
193
|
+
}
|
|
194
|
+
return { iv, xpriv, ephemeralPublicKey, commandIv, groupKey, trustedMember };
|
|
195
|
+
}
|
|
196
|
+
static parseTrustedAddMember(tlvs) {
|
|
197
|
+
let iv = null;
|
|
198
|
+
let trustedMember = null;
|
|
199
|
+
for (const tlv of tlvs) {
|
|
200
|
+
if (tlv.type === TrustedPropertiesTLV.TrustedMember) {
|
|
201
|
+
trustedMember = tlv.value;
|
|
202
|
+
}
|
|
203
|
+
else if (tlv.type === TrustedPropertiesTLV.IV) {
|
|
204
|
+
iv = tlv.value;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
if (iv === null) {
|
|
208
|
+
throw new Error("No IV in response");
|
|
209
|
+
}
|
|
210
|
+
if (trustedMember === null) {
|
|
211
|
+
throw new Error("No trusted member in response");
|
|
212
|
+
}
|
|
213
|
+
return { trustedMember, iv };
|
|
214
|
+
}
|
|
215
|
+
static parseTrustedPublishKey(tlvs) {
|
|
216
|
+
let iv = null;
|
|
217
|
+
let ephemeralPublicKey = null;
|
|
218
|
+
let commandIv = null;
|
|
219
|
+
let trustedMember = null;
|
|
220
|
+
let xpriv = null;
|
|
221
|
+
for (const tlv of tlvs) {
|
|
222
|
+
switch (tlv.type) {
|
|
223
|
+
case TrustedPropertiesTLV.IV:
|
|
224
|
+
iv = tlv.value;
|
|
225
|
+
break;
|
|
226
|
+
case TrustedPropertiesTLV.EphemeralPublicKey:
|
|
227
|
+
ephemeralPublicKey = tlv.value;
|
|
228
|
+
break;
|
|
229
|
+
case TrustedPropertiesTLV.CommandIV:
|
|
230
|
+
commandIv = tlv.value;
|
|
231
|
+
break;
|
|
232
|
+
case TrustedPropertiesTLV.TrustedMember:
|
|
233
|
+
trustedMember = tlv.value;
|
|
234
|
+
break;
|
|
235
|
+
case TrustedPropertiesTLV.Xpriv:
|
|
236
|
+
xpriv = tlv.value;
|
|
237
|
+
break;
|
|
238
|
+
default:
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
if (iv === null) {
|
|
243
|
+
throw new Error("No IV in response");
|
|
244
|
+
}
|
|
245
|
+
if (ephemeralPublicKey === null) {
|
|
246
|
+
throw new Error("No ephemeral public key in response");
|
|
247
|
+
}
|
|
248
|
+
if (commandIv === null) {
|
|
249
|
+
throw new Error("No command IV in response");
|
|
250
|
+
}
|
|
251
|
+
if (xpriv === null) {
|
|
252
|
+
throw new Error("No xpriv in response");
|
|
253
|
+
}
|
|
254
|
+
return { iv, ephemeralPublicKey, commandIv, trustedMember, xpriv };
|
|
255
|
+
}
|
|
256
|
+
static parseTrustedProperties(command, rawProperties) {
|
|
257
|
+
const tlvs = tlv_1.TLV.readAllTLV(rawProperties, 0);
|
|
258
|
+
switch (command.getType()) {
|
|
259
|
+
case CommandBlock_1.CommandType.Derive:
|
|
260
|
+
case CommandBlock_1.CommandType.Seed:
|
|
261
|
+
return APDU.parseTrustedSeed(tlvs);
|
|
262
|
+
case CommandBlock_1.CommandType.AddMember:
|
|
263
|
+
return APDU.parseTrustedAddMember(tlvs);
|
|
264
|
+
case CommandBlock_1.CommandType.PublishKey:
|
|
265
|
+
return APDU.parseTrustedPublishKey(tlvs);
|
|
266
|
+
case CommandBlock_1.CommandType.CloseStream:
|
|
267
|
+
return {};
|
|
268
|
+
default:
|
|
269
|
+
throw new Error("Unsupported command type");
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
exports.APDU = APDU;
|
|
274
|
+
APDU.CLA = 0xe0;
|
|
275
|
+
APDU.INS_GET_PUBLIC_KEY = 0x05;
|
|
276
|
+
APDU.INS_PARSE_STREAM = 0x08;
|
|
277
|
+
APDU.INS_SIGN_BLOCK = 0x07;
|
|
278
|
+
APDU.INS_INIT = 0x06;
|
|
279
|
+
APDU.INS_SET_TRUSTED_MEMBER = 0x09;
|
|
280
|
+
function injectTrustedProperties(command, properties, secret) {
|
|
281
|
+
switch (command.getType()) {
|
|
282
|
+
case CommandBlock_1.CommandType.Seed: {
|
|
283
|
+
const seedCommand = command;
|
|
284
|
+
const seedProperties = properties;
|
|
285
|
+
seedCommand.encryptedXpriv = Crypto_1.crypto.decrypt(secret, seedProperties.iv, seedProperties.xpriv);
|
|
286
|
+
seedCommand.ephemeralPublicKey = seedProperties.ephemeralPublicKey;
|
|
287
|
+
seedCommand.initializationVector = seedProperties.commandIv;
|
|
288
|
+
seedCommand.groupKey = seedProperties.groupKey;
|
|
289
|
+
return seedCommand;
|
|
290
|
+
}
|
|
291
|
+
case CommandBlock_1.CommandType.Derive: {
|
|
292
|
+
const deriveCommand = command;
|
|
293
|
+
const deriveProperties = properties;
|
|
294
|
+
deriveCommand.encryptedXpriv = Crypto_1.crypto.decrypt(secret, deriveProperties.iv, deriveProperties.xpriv);
|
|
295
|
+
deriveCommand.ephemeralPublicKey = deriveProperties.ephemeralPublicKey;
|
|
296
|
+
deriveCommand.initializationVector = deriveProperties.commandIv;
|
|
297
|
+
deriveCommand.groupKey = deriveProperties.groupKey;
|
|
298
|
+
return deriveCommand;
|
|
299
|
+
}
|
|
300
|
+
case CommandBlock_1.CommandType.AddMember:
|
|
301
|
+
return command; // No properties to inject
|
|
302
|
+
case CommandBlock_1.CommandType.PublishKey: {
|
|
303
|
+
const publishKeyCommand = command;
|
|
304
|
+
const publishKeyProperties = properties;
|
|
305
|
+
publishKeyCommand.ephemeralPublicKey = publishKeyProperties.ephemeralPublicKey;
|
|
306
|
+
publishKeyCommand.initializationVector = publishKeyProperties.commandIv;
|
|
307
|
+
publishKeyCommand.encryptedXpriv = Crypto_1.crypto.decrypt(secret, publishKeyProperties.iv, publishKeyProperties.xpriv);
|
|
308
|
+
return publishKeyCommand;
|
|
309
|
+
}
|
|
310
|
+
case CommandBlock_1.CommandType.CloseStream:
|
|
311
|
+
return command; // No properties to inject
|
|
312
|
+
default:
|
|
313
|
+
throw new Error("Unsupported command type");
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
function findTrustedMember(params, member) {
|
|
317
|
+
return params.members.get(Crypto_1.crypto.to_hex(member)) || null;
|
|
318
|
+
}
|
|
319
|
+
findTrustedMember;
|
|
320
|
+
class ApduDevice {
|
|
321
|
+
constructor(transport) {
|
|
322
|
+
this.transport = transport;
|
|
323
|
+
this.sessionKeyPair = Crypto_1.crypto.randomKeypair();
|
|
324
|
+
}
|
|
325
|
+
isPublicKeyAvailable() {
|
|
326
|
+
return false;
|
|
327
|
+
}
|
|
328
|
+
getPublicKey() {
|
|
329
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
330
|
+
const publicKey = yield APDU.getPublicKey(this.transport);
|
|
331
|
+
return new PublicKey_1.PublicKey(publicKey);
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
getSeedId(data) {
|
|
335
|
+
return APDU.getSeedId(this.transport, data);
|
|
336
|
+
}
|
|
337
|
+
assertStreamIsValid(stream) {
|
|
338
|
+
const blockToSign = stream.filter(block => block.signature.length == 0).length;
|
|
339
|
+
if (blockToSign !== 1)
|
|
340
|
+
throw new Error("Stream must contain exactly one block to sign. Found " + blockToSign + " blocks to sign.");
|
|
341
|
+
}
|
|
342
|
+
recordTrustedMember(trustedParams, publicKey, responseData) {
|
|
343
|
+
// Parse an APDU result as TLV and find IV and trusted member data.
|
|
344
|
+
// The data is then assigned to a public key. The parsing must set the
|
|
345
|
+
// public key depending on the current step in the flow (e.g add member
|
|
346
|
+
// will issue a trusted member for the added member)
|
|
347
|
+
const tlvs = tlv_1.TLV.readAllTLV(responseData, 0);
|
|
348
|
+
let member = null;
|
|
349
|
+
let iv = null;
|
|
350
|
+
if (publicKey.length == 0 || (publicKey[0] != 0x02 && publicKey[0] != 0x03)) {
|
|
351
|
+
// The public key is not set if it's the device itself
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
for (const tlv of tlvs) {
|
|
355
|
+
if (tlv.type == TrustedPropertiesTLV.TrustedMember) {
|
|
356
|
+
member = tlv.value;
|
|
357
|
+
}
|
|
358
|
+
if (tlv.type == TrustedPropertiesTLV.IV) {
|
|
359
|
+
iv = tlv.value;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
if (member === null || iv === null) {
|
|
363
|
+
return; // Do nothing trusted member is optional in some cases
|
|
364
|
+
// (e.g. if the trusted member is the device itself)
|
|
365
|
+
}
|
|
366
|
+
trustedParams.members.set(Crypto_1.crypto.to_hex(publicKey), { iv, data: member });
|
|
367
|
+
// Set the last trusted member. This is used to prevent sending the same current trusted member
|
|
368
|
+
// to the device again.
|
|
369
|
+
trustedParams.lastTrustedMember = Crypto_1.crypto.to_hex(publicKey);
|
|
370
|
+
}
|
|
371
|
+
hasTrustedMember(trustedParams, publicKey) {
|
|
372
|
+
return trustedParams.members.has(Crypto_1.crypto.to_hex(publicKey));
|
|
373
|
+
}
|
|
374
|
+
// Throws if the trusted member is not found
|
|
375
|
+
getTrustedMember(trustedParams, publicKey) {
|
|
376
|
+
const member = trustedParams.members.get(Crypto_1.crypto.to_hex(publicKey));
|
|
377
|
+
if (member === undefined) {
|
|
378
|
+
throw new Error("Trusted member not found");
|
|
379
|
+
}
|
|
380
|
+
return member;
|
|
381
|
+
}
|
|
382
|
+
// Set the trusted member on the device if it's not already set
|
|
383
|
+
setTrustedMember(params, publicKey) {
|
|
384
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
385
|
+
// Check if the trusted member is already set on device
|
|
386
|
+
if (params.lastTrustedMember == Crypto_1.crypto.to_hex(publicKey)) {
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
// Verify we actually have the trusted member
|
|
390
|
+
if (this.hasTrustedMember(params, publicKey) == false) {
|
|
391
|
+
return;
|
|
392
|
+
}
|
|
393
|
+
// console.log("Setting trusted member: ", crypto.to_hex(publicKey));
|
|
394
|
+
return APDU.setTrustedMember(this.transport, this.getTrustedMember(params, publicKey));
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
parseBlock(block, trustedParams) {
|
|
398
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
399
|
+
let result;
|
|
400
|
+
// Parse the block header
|
|
401
|
+
yield this.setTrustedMember(trustedParams, block.issuer);
|
|
402
|
+
result = yield APDU.parseBlockHeader(this.transport, CommandStreamEncoder_1.CommandStreamEncoder.encodeBlockHeader(block));
|
|
403
|
+
// Record potential trusted member
|
|
404
|
+
this.recordTrustedMember(trustedParams, block.issuer, result);
|
|
405
|
+
for (const index in block.commands) {
|
|
406
|
+
// Parse the command
|
|
407
|
+
const command = block.commands[index];
|
|
408
|
+
// Set the trusted member depending on the command
|
|
409
|
+
switch (command.getType()) {
|
|
410
|
+
case CommandBlock_1.CommandType.AddMember:
|
|
411
|
+
yield this.setTrustedMember(trustedParams, block.issuer);
|
|
412
|
+
break;
|
|
413
|
+
case CommandBlock_1.CommandType.PublishKey:
|
|
414
|
+
yield this.setTrustedMember(trustedParams, command.recipient);
|
|
415
|
+
break;
|
|
416
|
+
case CommandBlock_1.CommandType.EditMember:
|
|
417
|
+
yield this.setTrustedMember(trustedParams, command.member);
|
|
418
|
+
break;
|
|
419
|
+
default:
|
|
420
|
+
// Do nothing
|
|
421
|
+
break;
|
|
422
|
+
}
|
|
423
|
+
result = yield APDU.parseCommand(this.transport, CommandStreamEncoder_1.CommandStreamEncoder.encodeCommand(block, parseInt(index)), true);
|
|
424
|
+
// Record potential trusted member
|
|
425
|
+
switch (command.getType()) {
|
|
426
|
+
case CommandBlock_1.CommandType.Seed:
|
|
427
|
+
this.recordTrustedMember(trustedParams, block.issuer, result);
|
|
428
|
+
break;
|
|
429
|
+
case CommandBlock_1.CommandType.AddMember:
|
|
430
|
+
this.recordTrustedMember(trustedParams, command.publicKey, result);
|
|
431
|
+
break;
|
|
432
|
+
case CommandBlock_1.CommandType.PublishKey:
|
|
433
|
+
this.recordTrustedMember(trustedParams, command.recipient, result);
|
|
434
|
+
break;
|
|
435
|
+
case CommandBlock_1.CommandType.Derive:
|
|
436
|
+
this.recordTrustedMember(trustedParams, block.issuer, result);
|
|
437
|
+
break;
|
|
438
|
+
case CommandBlock_1.CommandType.EditMember:
|
|
439
|
+
this.recordTrustedMember(trustedParams, command.member, result);
|
|
440
|
+
break;
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
// Parse the block signature
|
|
444
|
+
yield APDU.parseSignature(this.transport, CommandStreamEncoder_1.CommandStreamEncoder.encodeSignature(block));
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
parseStream(stream) {
|
|
448
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
449
|
+
const trustedParams = {
|
|
450
|
+
members: new Map(),
|
|
451
|
+
lastTrustedMember: undefined,
|
|
452
|
+
};
|
|
453
|
+
if (stream.length == 0) {
|
|
454
|
+
yield APDU.parseEmptyStream(this.transport);
|
|
455
|
+
}
|
|
456
|
+
for (const block of stream.slice(0, stream.length - 1)) {
|
|
457
|
+
yield this.parseBlock(block, trustedParams);
|
|
458
|
+
}
|
|
459
|
+
return trustedParams;
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
sign(stream) {
|
|
463
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
464
|
+
const sessionKey = this.sessionKeyPair;
|
|
465
|
+
const trustedProperties = [];
|
|
466
|
+
// We expect the stream to have a single block to sign (the last one)
|
|
467
|
+
this.assertStreamIsValid(stream);
|
|
468
|
+
// Init signature flow
|
|
469
|
+
yield APDU.initFlow(this.transport, sessionKey.publicKey);
|
|
470
|
+
// Before signing we need to parse the stream on device and get trusted params
|
|
471
|
+
const trustedParams = yield this.parseStream(stream);
|
|
472
|
+
trustedParams;
|
|
473
|
+
// Create the new block to sign
|
|
474
|
+
const blockToSign = stream[stream.length - 1];
|
|
475
|
+
const trustedIssuer = yield APDU.signBlockHeader(this.transport, CommandStreamEncoder_1.CommandStreamEncoder.encodeBlockHeader(blockToSign));
|
|
476
|
+
// Pass all commands to device
|
|
477
|
+
for (let commandIndex = 0; commandIndex < blockToSign.commands.length; commandIndex++) {
|
|
478
|
+
// Pass the trusted param allowing the command to the device
|
|
479
|
+
// If we have no trusted param we need an explicit approval
|
|
480
|
+
const tp = yield APDU.signCommand(this.transport, CommandStreamEncoder_1.CommandStreamEncoder.encodeCommand(blockToSign, commandIndex));
|
|
481
|
+
trustedProperties.push(APDU.parseTrustedProperties(blockToSign.commands[commandIndex], tp));
|
|
482
|
+
}
|
|
483
|
+
// Finalize block signature
|
|
484
|
+
const signature = yield APDU.finalizeSignature(this.transport);
|
|
485
|
+
// Decrypt and inject trusted issuer
|
|
486
|
+
const secret = Crypto_1.crypto.ecdh(sessionKey, signature.sessionKey);
|
|
487
|
+
const issuer = Crypto_1.crypto.decrypt(secret, trustedIssuer.iv, trustedIssuer.issuer);
|
|
488
|
+
// Inject trusted properties for commands
|
|
489
|
+
for (let commandIndex = 0; commandIndex < blockToSign.commands.length; commandIndex++) {
|
|
490
|
+
blockToSign.commands[commandIndex] = yield injectTrustedProperties(blockToSign.commands[commandIndex], trustedProperties[commandIndex], secret);
|
|
491
|
+
}
|
|
492
|
+
blockToSign.issuer = issuer;
|
|
493
|
+
blockToSign.signature = signature.signature;
|
|
494
|
+
return blockToSign;
|
|
495
|
+
});
|
|
496
|
+
}
|
|
497
|
+
readKey(tree, path) {
|
|
498
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
499
|
+
tree;
|
|
500
|
+
path;
|
|
501
|
+
throw new Error("readKey is not supported on hardware devices");
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
isConnected() {
|
|
505
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
506
|
+
const response = yield this.transport.send(0xe0, 0x04, 0x00, 0x00);
|
|
507
|
+
const sw = response.readUInt16BE(response.length - 2);
|
|
508
|
+
if (sw !== 0x9000)
|
|
509
|
+
return false;
|
|
510
|
+
const appName = response.subarray(0, response.length - 2).toString();
|
|
511
|
+
return appName === exports.TRUSTCHAIN_APP_NAME;
|
|
512
|
+
});
|
|
513
|
+
}
|
|
514
|
+
close() {
|
|
515
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
516
|
+
yield this.transport.close();
|
|
517
|
+
});
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
exports.ApduDevice = ApduDevice;
|
|
521
|
+
/**
|
|
522
|
+
*
|
|
523
|
+
*/
|
|
524
|
+
function createApduDevice(transport) {
|
|
525
|
+
return new ApduDevice(transport);
|
|
526
|
+
}
|
|
527
|
+
exports.createApduDevice = createApduDevice;
|
|
528
|
+
//# sourceMappingURL=ApduDevice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApduDevice.js","sourceRoot":"","sources":["../src/ApduDevice.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export default class BigEndian {
|
|
2
|
+
static shortToArray(n: number): Uint8Array;
|
|
3
|
+
static arrayToShort(array: Uint8Array): number;
|
|
4
|
+
static numberToArray(n: number): Uint8Array;
|
|
5
|
+
static arrayToNumber(array: Uint8Array): number;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=BigEndian.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BigEndian.d.ts","sourceRoot":"","sources":["../src/BigEndian.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,SAAS;WACd,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU;WAOnC,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM;WAKvC,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU;WAOpC,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM;CAIvD"}
|
package/lib/BigEndian.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
class BigEndian {
|
|
4
|
+
static shortToArray(n) {
|
|
5
|
+
const array = new Uint8Array(2);
|
|
6
|
+
const view = new DataView(array.buffer);
|
|
7
|
+
view.setUint16(0, n, false);
|
|
8
|
+
return array;
|
|
9
|
+
}
|
|
10
|
+
static arrayToShort(array) {
|
|
11
|
+
const view = new DataView(array.buffer);
|
|
12
|
+
return view.getUint16(0, false);
|
|
13
|
+
}
|
|
14
|
+
static numberToArray(n) {
|
|
15
|
+
const array = new Uint8Array(4);
|
|
16
|
+
const view = new DataView(array.buffer);
|
|
17
|
+
view.setUint32(0, n, false);
|
|
18
|
+
return array;
|
|
19
|
+
}
|
|
20
|
+
static arrayToNumber(array) {
|
|
21
|
+
const view = new DataView(array.buffer);
|
|
22
|
+
return view.getUint32(0, false);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.default = BigEndian;
|
|
26
|
+
//# sourceMappingURL=BigEndian.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BigEndian.js","sourceRoot":"","sources":["../src/BigEndian.ts"],"names":[],"mappings":";;AAAA,MAAqB,SAAS;IACrB,MAAM,CAAC,YAAY,CAAC,CAAS;QAClC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QAC5B,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,MAAM,CAAC,YAAY,CAAC,KAAiB;QAC1C,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC;IAEM,MAAM,CAAC,aAAa,CAAC,CAAS;QACnC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QAC5B,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,MAAM,CAAC,aAAa,CAAC,KAAiB;QAC3C,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC;CACF;AAxBD,4BAwBC"}
|