@teepin/sdk 0.2.1 → 0.3.0-rc.1
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/README.md +41 -36
- package/dist/cjs/client.js +42 -4
- package/dist/cjs/client.js.map +1 -1
- package/dist/cjs/direct/bytes.js +50 -0
- package/dist/cjs/direct/bytes.js.map +1 -0
- package/dist/cjs/direct/common.js +167 -0
- package/dist/cjs/direct/common.js.map +1 -0
- package/dist/cjs/direct/downloads-plan.js +127 -0
- package/dist/cjs/direct/downloads-plan.js.map +1 -0
- package/dist/cjs/direct/engine.js +405 -0
- package/dist/cjs/direct/engine.js.map +1 -0
- package/dist/cjs/direct/formats.js +44 -0
- package/dist/cjs/direct/formats.js.map +1 -0
- package/dist/cjs/direct/hpke.js +275 -0
- package/dist/cjs/direct/hpke.js.map +1 -0
- package/dist/cjs/direct/journal.js +80 -0
- package/dist/cjs/direct/journal.js.map +1 -0
- package/dist/cjs/direct/large.js +850 -0
- package/dist/cjs/direct/large.js.map +1 -0
- package/dist/cjs/direct/reads.js +1314 -0
- package/dist/cjs/direct/reads.js.map +1 -0
- package/dist/cjs/direct/sha256.js +122 -0
- package/dist/cjs/direct/sha256.js.map +1 -0
- package/dist/cjs/direct/tws1.js +480 -0
- package/dist/cjs/direct/tws1.js.map +1 -0
- package/dist/cjs/direct/uploads.js +1706 -0
- package/dist/cjs/direct/uploads.js.map +1 -0
- package/dist/cjs/errors.js +70 -13
- package/dist/cjs/errors.js.map +1 -1
- package/dist/cjs/index.js +5 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/links.js +195 -0
- package/dist/cjs/links.js.map +1 -0
- package/dist/cjs/node/downloads.js +835 -0
- package/dist/cjs/node/downloads.js.map +1 -0
- package/dist/cjs/node/journal.js +841 -0
- package/dist/cjs/node/journal.js.map +1 -0
- package/dist/cjs/node/uploads.js +219 -0
- package/dist/cjs/node/uploads.js.map +1 -0
- package/dist/cjs/node.js +26 -39
- package/dist/cjs/node.js.map +1 -1
- package/dist/cjs/storage.js +214 -184
- package/dist/cjs/storage.js.map +1 -1
- package/dist/cjs/transfer.js +18 -351
- package/dist/cjs/transfer.js.map +1 -1
- package/dist/esm/client.js +42 -4
- package/dist/esm/client.js.map +1 -1
- package/dist/esm/direct/bytes.js +42 -0
- package/dist/esm/direct/bytes.js.map +1 -0
- package/dist/esm/direct/common.js +155 -0
- package/dist/esm/direct/common.js.map +1 -0
- package/dist/esm/direct/downloads-plan.js +117 -0
- package/dist/esm/direct/downloads-plan.js.map +1 -0
- package/dist/esm/direct/engine.js +385 -0
- package/dist/esm/direct/engine.js.map +1 -0
- package/dist/esm/direct/formats.js +40 -0
- package/dist/esm/direct/formats.js.map +1 -0
- package/dist/esm/direct/hpke.js +262 -0
- package/dist/esm/direct/hpke.js.map +1 -0
- package/dist/esm/direct/journal.js +75 -0
- package/dist/esm/direct/journal.js.map +1 -0
- package/dist/esm/direct/large.js +816 -0
- package/dist/esm/direct/large.js.map +1 -0
- package/dist/esm/direct/reads.js +1275 -0
- package/dist/esm/direct/reads.js.map +1 -0
- package/dist/esm/direct/sha256.js +118 -0
- package/dist/esm/direct/sha256.js.map +1 -0
- package/dist/esm/direct/tws1.js +460 -0
- package/dist/esm/direct/tws1.js.map +1 -0
- package/dist/esm/direct/uploads.js +1660 -0
- package/dist/esm/direct/uploads.js.map +1 -0
- package/dist/esm/errors.js +64 -11
- package/dist/esm/errors.js.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/links.js +189 -0
- package/dist/esm/links.js.map +1 -0
- package/dist/esm/node/downloads.js +829 -0
- package/dist/esm/node/downloads.js.map +1 -0
- package/dist/esm/node/journal.js +824 -0
- package/dist/esm/node/journal.js.map +1 -0
- package/dist/esm/node/uploads.js +187 -0
- package/dist/esm/node/uploads.js.map +1 -0
- package/dist/esm/node.js +17 -14
- package/dist/esm/node.js.map +1 -1
- package/dist/esm/storage.js +214 -184
- package/dist/esm/storage.js.map +1 -1
- package/dist/esm/transfer.js +19 -349
- package/dist/esm/transfer.js.map +1 -1
- package/dist/types/client.d.ts +45 -4
- package/dist/types/client.d.ts.map +1 -1
- package/dist/types/direct/bytes.d.ts +11 -0
- package/dist/types/direct/bytes.d.ts.map +1 -0
- package/dist/types/direct/common.d.ts +47 -0
- package/dist/types/direct/common.d.ts.map +1 -0
- package/dist/types/direct/downloads-plan.d.ts +75 -0
- package/dist/types/direct/downloads-plan.d.ts.map +1 -0
- package/dist/types/direct/engine.d.ts +191 -0
- package/dist/types/direct/engine.d.ts.map +1 -0
- package/dist/types/direct/formats.d.ts +9 -0
- package/dist/types/direct/formats.d.ts.map +1 -0
- package/dist/types/direct/hpke.d.ts +55 -0
- package/dist/types/direct/hpke.d.ts.map +1 -0
- package/dist/types/direct/journal.d.ts +55 -0
- package/dist/types/direct/journal.d.ts.map +1 -0
- package/dist/types/direct/large.d.ts +170 -0
- package/dist/types/direct/large.d.ts.map +1 -0
- package/dist/types/direct/reads.d.ts +306 -0
- package/dist/types/direct/reads.d.ts.map +1 -0
- package/dist/types/direct/sha256.d.ts +16 -0
- package/dist/types/direct/sha256.d.ts.map +1 -0
- package/dist/types/direct/tws1.d.ts +157 -0
- package/dist/types/direct/tws1.d.ts.map +1 -0
- package/dist/types/direct/uploads.d.ts +461 -0
- package/dist/types/direct/uploads.d.ts.map +1 -0
- package/dist/types/errors.d.ts +47 -8
- package/dist/types/errors.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/links.d.ts +86 -0
- package/dist/types/links.d.ts.map +1 -0
- package/dist/types/node/downloads.d.ts +73 -0
- package/dist/types/node/downloads.d.ts.map +1 -0
- package/dist/types/node/journal.d.ts +162 -0
- package/dist/types/node/journal.d.ts.map +1 -0
- package/dist/types/node/uploads.d.ts +86 -0
- package/dist/types/node/uploads.d.ts.map +1 -0
- package/dist/types/node.d.ts +4 -2
- package/dist/types/node.d.ts.map +1 -1
- package/dist/types/storage.d.ts +107 -64
- package/dist/types/storage.d.ts.map +1 -1
- package/dist/types/transfer.d.ts +14 -23
- package/dist/types/transfer.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,480 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2026 TEEPIN Project
|
|
3
|
+
// Licensed under the Apache License, Version 2.0
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.objectIdBytes = exports.readNeedle = exports.checkNeedle = exports.Pack = exports.needle = exports.OpenStream = exports.Stream = exports.partOf = exports.parts = exports.partCount = exports.segmentAt = exports.decryptRange = exports.locate = exports.decrypt = exports.encrypt = exports.openHeader = exports.newHeader = exports.Keys = exports.storedSize = exports.segments = exports.newDataKey = exports.testHooks = exports.NEEDLE_HEADER_SIZE = exports.MAX_SEGMENTS = exports.SALT_SIZE = exports.KEY_SIZE = exports.STORED_SEGMENT_SIZE = exports.TAG_SIZE = exports.SEGMENT_SIZE = exports.HEADER_SIZE = exports.DataIntegrityError = void 0;
|
|
6
|
+
// TWS1, the format objects are encrypted in on the device before they go to
|
|
7
|
+
// storage (TEEPIN-STORAGE-DESIGN.md section 20.1). The reference is
|
|
8
|
+
// teepin-core's pkg/tws1; this module matches it byte for byte, and the shared
|
|
9
|
+
// vectors in test/vectors/tws1.json prove it.
|
|
10
|
+
//
|
|
11
|
+
// An object is a 72-byte header, then 64 KiB plaintext segments, each sealed
|
|
12
|
+
// with AES-256-GCM:
|
|
13
|
+
//
|
|
14
|
+
// - header: "TWS1", version 1, algorithm 1, log2 of the segment size (16), a
|
|
15
|
+
// zero byte, a 32-byte random salt, and a 32-byte key commitment;
|
|
16
|
+
// - keys: PRK = HKDF-Extract(SHA-512, salt, data key); the commitment, the
|
|
17
|
+
// segment key and a 7-byte nonce prefix are expanded from it, each bound to
|
|
18
|
+
// the header's first 40 bytes;
|
|
19
|
+
// - a segment's nonce is the prefix, its index (uint32 big-endian) and a byte
|
|
20
|
+
// that is 1 only on the last segment, so segments can't be reordered, dropped
|
|
21
|
+
// or cut off; the associated data is the whole header.
|
|
22
|
+
//
|
|
23
|
+
// A large object is one stream cut into parts at segment boundaries (section
|
|
24
|
+
// 21.1, D1): Stream seals any part from its plaintext alone, and the same
|
|
25
|
+
// plaintext always seals to the same bytes, so a retried part is identical.
|
|
26
|
+
//
|
|
27
|
+
// In a pack, each object is preceded by a 64-byte needle: "TPK1", the object
|
|
28
|
+
// id, the stored size and the SHA-256 of the stored bytes.
|
|
29
|
+
//
|
|
30
|
+
// Nothing here does I/O. Crypto is WebCrypto only, so the same code runs in
|
|
31
|
+
// Node 20+ and browsers. The segment key never leaves WebCrypto (it is derived
|
|
32
|
+
// as a non-extractable key); data keys stay with the caller, who can zero them.
|
|
33
|
+
const errors_js_1 = require("../errors.js");
|
|
34
|
+
Object.defineProperty(exports, "DataIntegrityError", { enumerable: true, get: function () { return errors_js_1.DataIntegrityError; } });
|
|
35
|
+
const bytes_js_1 = require("./bytes.js");
|
|
36
|
+
exports.HEADER_SIZE = 72;
|
|
37
|
+
exports.SEGMENT_SIZE = 1 << 16;
|
|
38
|
+
exports.TAG_SIZE = 16;
|
|
39
|
+
exports.STORED_SEGMENT_SIZE = exports.SEGMENT_SIZE + exports.TAG_SIZE;
|
|
40
|
+
exports.KEY_SIZE = 32;
|
|
41
|
+
exports.SALT_SIZE = 32;
|
|
42
|
+
/** The most segments one object may have (the index is a uint32). */
|
|
43
|
+
exports.MAX_SEGMENTS = 2 ** 32 - 1;
|
|
44
|
+
exports.NEEDLE_HEADER_SIZE = 64;
|
|
45
|
+
const MAGIC = (0, bytes_js_1.utf8)('TWS1');
|
|
46
|
+
const VERSION = 0x01;
|
|
47
|
+
const ALGORITHM = 0x01;
|
|
48
|
+
const SEGMENT_LOG2 = 16;
|
|
49
|
+
const PREFIX_SIZE = 7;
|
|
50
|
+
const BOUND_SIZE = 40; // the header bytes every derivation is bound to: all before the commitment
|
|
51
|
+
const NEEDLE_MAGIC = (0, bytes_js_1.utf8)('TPK1');
|
|
52
|
+
/**
|
|
53
|
+
* Where fresh salts come from. Only tests replace salt, to reproduce the shared vectors; the public functions take no
|
|
54
|
+
* salt, so callers can't choose one, and a test checks that no file under src assigns it. Shared state is safe here,
|
|
55
|
+
* unlike for HPKE's ephemeral keys (hpke.sealWith): every object has a fresh random data key, so even a fixed salt
|
|
56
|
+
* never repeats a segment key and nonce.
|
|
57
|
+
*/
|
|
58
|
+
exports.testHooks = {
|
|
59
|
+
salt: () => crypto.getRandomValues(new Uint8Array(exports.SALT_SIZE)),
|
|
60
|
+
};
|
|
61
|
+
/** A fresh 32-byte data key; the caller zeroes it (fill(0)) when done. */
|
|
62
|
+
function newDataKey() {
|
|
63
|
+
return crypto.getRandomValues(new Uint8Array(exports.KEY_SIZE));
|
|
64
|
+
}
|
|
65
|
+
exports.newDataKey = newDataKey;
|
|
66
|
+
/** How many segments an object of this size has: at least one, since an empty object is one empty last segment. */
|
|
67
|
+
function segments(plaintextSize) {
|
|
68
|
+
if (plaintextSize <= 0)
|
|
69
|
+
return 1;
|
|
70
|
+
return Math.ceil(plaintextSize / exports.SEGMENT_SIZE);
|
|
71
|
+
}
|
|
72
|
+
exports.segments = segments;
|
|
73
|
+
/** The size of the stored object, from the plaintext's size alone. */
|
|
74
|
+
function storedSize(plaintextSize) {
|
|
75
|
+
return exports.HEADER_SIZE + segments(plaintextSize) * exports.TAG_SIZE + plaintextSize;
|
|
76
|
+
}
|
|
77
|
+
exports.storedSize = storedSize;
|
|
78
|
+
// --- keys -------------------------------------------------------------------
|
|
79
|
+
/** The keys derived from a data key and an object's header. */
|
|
80
|
+
class Keys {
|
|
81
|
+
aad;
|
|
82
|
+
commit;
|
|
83
|
+
aead;
|
|
84
|
+
prefix;
|
|
85
|
+
constructor(header, commitment, aead, prefix) {
|
|
86
|
+
this.aad = header;
|
|
87
|
+
this.commit = commitment;
|
|
88
|
+
this.aead = aead;
|
|
89
|
+
this.prefix = prefix;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* The keys for an object's header. Given only the header's first 40 bytes, the derived commitment completes it (how
|
|
93
|
+
* a new header is made); a full header's commitment is not checked here, openHeader does that.
|
|
94
|
+
*/
|
|
95
|
+
static async derive(dek, header) {
|
|
96
|
+
if (dek.length !== exports.KEY_SIZE)
|
|
97
|
+
throw new errors_js_1.TeepinError('tws1: a data key must be 32 bytes');
|
|
98
|
+
if (header.length !== BOUND_SIZE && header.length < exports.HEADER_SIZE)
|
|
99
|
+
throw new errors_js_1.TeepinError(`tws1: a header is ${exports.HEADER_SIZE} bytes`);
|
|
100
|
+
const bound = header.slice(0, BOUND_SIZE);
|
|
101
|
+
const salt = bound.subarray(8, 8 + exports.SALT_SIZE);
|
|
102
|
+
// WebCrypto's HKDF is Extract then Expand in one call, so each derivation
|
|
103
|
+
// extracts the same PRK again from the salt and the data key.
|
|
104
|
+
const ikm = await crypto.subtle.importKey('raw', dek, 'HKDF', false, ['deriveBits', 'deriveKey']);
|
|
105
|
+
const params = (label) => ({ name: 'HKDF', hash: 'SHA-512', salt, info: (0, bytes_js_1.concat)([(0, bytes_js_1.utf8)(label), bound]) });
|
|
106
|
+
const [commitment, aead, prefix] = await Promise.all([
|
|
107
|
+
crypto.subtle.deriveBits(params('tws1/commit'), ikm, 32 * 8),
|
|
108
|
+
crypto.subtle.deriveKey(params('tws1/key'), ikm, { name: 'AES-GCM', length: 256 }, false, ['encrypt', 'decrypt']),
|
|
109
|
+
crypto.subtle.deriveBits(params('tws1/nonce'), ikm, PREFIX_SIZE * 8),
|
|
110
|
+
]);
|
|
111
|
+
const commit = new Uint8Array(commitment);
|
|
112
|
+
const full = header.length === BOUND_SIZE ? (0, bytes_js_1.concat)([bound, commit]) : header.slice(0, exports.HEADER_SIZE);
|
|
113
|
+
return new Keys(full, commit, aead, new Uint8Array(prefix));
|
|
114
|
+
}
|
|
115
|
+
/** The object's 72-byte header (a copy). */
|
|
116
|
+
get header() {
|
|
117
|
+
return this.aad.slice();
|
|
118
|
+
}
|
|
119
|
+
/** The commitment derived from the data key (a copy); in a valid header it is the last 32 bytes. */
|
|
120
|
+
get commitment() {
|
|
121
|
+
return this.commit.slice();
|
|
122
|
+
}
|
|
123
|
+
/** Segment index's nonce: the prefix, the index (uint32 big-endian) and 1 on the last segment, else 0. */
|
|
124
|
+
nonce(index, last) {
|
|
125
|
+
if (!(0, bytes_js_1.isInt)(index) || index < 0 || index > 0xffffffff)
|
|
126
|
+
throw new errors_js_1.TeepinError(`tws1: segment index ${index} is not a uint32`);
|
|
127
|
+
const n = new Uint8Array(12);
|
|
128
|
+
n.set(this.prefix);
|
|
129
|
+
new DataView(n.buffer).setUint32(PREFIX_SIZE, index);
|
|
130
|
+
n[11] = last ? 1 : 0;
|
|
131
|
+
return n;
|
|
132
|
+
}
|
|
133
|
+
/** One segment, sealed: its ciphertext and tag. */
|
|
134
|
+
async seal(index, last, plain) {
|
|
135
|
+
const params = { name: 'AES-GCM', iv: this.nonce(index, last), additionalData: this.aad };
|
|
136
|
+
return new Uint8Array(await crypto.subtle.encrypt(params, this.aead, plain));
|
|
137
|
+
}
|
|
138
|
+
/** One segment, opened; DataIntegrityError if it fails authentication. */
|
|
139
|
+
async open(index, last, sealed) {
|
|
140
|
+
const params = { name: 'AES-GCM', iv: this.nonce(index, last), additionalData: this.aad };
|
|
141
|
+
let plain;
|
|
142
|
+
try {
|
|
143
|
+
plain = await crypto.subtle.decrypt(params, this.aead, sealed);
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
throw new errors_js_1.DataIntegrityError('a segment failed authentication', 'segment');
|
|
147
|
+
}
|
|
148
|
+
return new Uint8Array(plain);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
exports.Keys = Keys;
|
|
152
|
+
/** A new object's header, with a fresh salt and its commitment, and the keys to seal its segments. */
|
|
153
|
+
async function newHeader(dek) {
|
|
154
|
+
if (dek.length !== exports.KEY_SIZE)
|
|
155
|
+
throw new errors_js_1.TeepinError('tws1: a data key must be 32 bytes');
|
|
156
|
+
const salt = exports.testHooks.salt();
|
|
157
|
+
if (salt.length !== exports.SALT_SIZE)
|
|
158
|
+
throw new errors_js_1.TeepinError('tws1: a salt must be 32 bytes');
|
|
159
|
+
const bound = new Uint8Array(BOUND_SIZE);
|
|
160
|
+
bound.set(MAGIC);
|
|
161
|
+
bound[4] = VERSION;
|
|
162
|
+
bound[5] = ALGORITHM;
|
|
163
|
+
bound[6] = SEGMENT_LOG2;
|
|
164
|
+
bound.set(salt, 8);
|
|
165
|
+
const keys = await Keys.derive(dek, bound);
|
|
166
|
+
return { header: keys.header, keys };
|
|
167
|
+
}
|
|
168
|
+
exports.newHeader = newHeader;
|
|
169
|
+
/** The keys for an existing object, after checking its header and, in constant time, that the data key matches its commitment. */
|
|
170
|
+
async function openHeader(dek, header) {
|
|
171
|
+
if (header.length < exports.HEADER_SIZE)
|
|
172
|
+
throw new errors_js_1.DataIntegrityError('the object is truncated', 'truncated');
|
|
173
|
+
const h = header.subarray(0, exports.HEADER_SIZE);
|
|
174
|
+
if (!(0, bytes_js_1.constantTimeEqual)(h.subarray(0, 4), MAGIC) || h[4] !== VERSION || h[5] !== ALGORITHM || h[6] !== SEGMENT_LOG2 || h[7] !== 0) {
|
|
175
|
+
throw new errors_js_1.DataIntegrityError('not a TWS1 object, or an unsupported version', 'format');
|
|
176
|
+
}
|
|
177
|
+
const keys = await Keys.derive(dek, h);
|
|
178
|
+
if (!(0, bytes_js_1.constantTimeEqual)(keys.commitment, h.subarray(BOUND_SIZE, exports.HEADER_SIZE))) {
|
|
179
|
+
throw new errors_js_1.DataIntegrityError("the data key does not match the object's commitment", 'commitment');
|
|
180
|
+
}
|
|
181
|
+
return keys;
|
|
182
|
+
}
|
|
183
|
+
exports.openHeader = openHeader;
|
|
184
|
+
// --- whole objects ----------------------------------------------------------
|
|
185
|
+
/** A whole object, encrypted with a fresh salt. */
|
|
186
|
+
async function encrypt(dek, plaintext) {
|
|
187
|
+
const n = segments(plaintext.length);
|
|
188
|
+
if (n > exports.MAX_SEGMENTS)
|
|
189
|
+
throw new errors_js_1.TeepinError(`tws1: an object may have at most ${exports.MAX_SEGMENTS} segments`);
|
|
190
|
+
const { header, keys } = await newHeader(dek);
|
|
191
|
+
const out = new Uint8Array(storedSize(plaintext.length));
|
|
192
|
+
out.set(header);
|
|
193
|
+
for (let i = 0; i < n; i++) {
|
|
194
|
+
const sealed = await keys.seal(i, i === n - 1, plaintext.subarray(i * exports.SEGMENT_SIZE, (i + 1) * exports.SEGMENT_SIZE));
|
|
195
|
+
out.set(sealed, exports.HEADER_SIZE + i * exports.STORED_SEGMENT_SIZE);
|
|
196
|
+
}
|
|
197
|
+
return out;
|
|
198
|
+
}
|
|
199
|
+
exports.encrypt = encrypt;
|
|
200
|
+
/** A whole object, decrypted and verified. */
|
|
201
|
+
async function decrypt(dek, stored) {
|
|
202
|
+
const keys = await openHeader(dek, stored);
|
|
203
|
+
const body = stored.subarray(exports.HEADER_SIZE);
|
|
204
|
+
if (body.length < exports.TAG_SIZE)
|
|
205
|
+
throw new errors_js_1.DataIntegrityError('the object is truncated', 'truncated');
|
|
206
|
+
const n = Math.ceil(body.length / exports.STORED_SEGMENT_SIZE);
|
|
207
|
+
if (body.length - (n - 1) * exports.STORED_SEGMENT_SIZE < exports.TAG_SIZE)
|
|
208
|
+
throw new errors_js_1.DataIntegrityError('the object is truncated', 'truncated');
|
|
209
|
+
const out = new Uint8Array(body.length - n * exports.TAG_SIZE);
|
|
210
|
+
for (let i = 0; i < n; i++) {
|
|
211
|
+
const plain = await keys.open(i, i === n - 1, body.subarray(i * exports.STORED_SEGMENT_SIZE, (i + 1) * exports.STORED_SEGMENT_SIZE));
|
|
212
|
+
out.set(plain, i * exports.SEGMENT_SIZE);
|
|
213
|
+
}
|
|
214
|
+
return out;
|
|
215
|
+
}
|
|
216
|
+
exports.decrypt = decrypt;
|
|
217
|
+
/** The segments holding plaintext bytes [offset, offset + length). */
|
|
218
|
+
function locate(plaintextSize, offset, length) {
|
|
219
|
+
if (!(0, bytes_js_1.isInt)(plaintextSize) || !(0, bytes_js_1.isInt)(offset) || !(0, bytes_js_1.isInt)(length) || offset < 0 || length < 0 || offset + length > plaintextSize) {
|
|
220
|
+
throw new errors_js_1.TeepinError(`tws1: range [${offset}, ${offset + length}) is outside an object of ${plaintextSize} bytes`);
|
|
221
|
+
}
|
|
222
|
+
const n = segments(plaintextSize);
|
|
223
|
+
const first = Math.min(Math.floor(offset / exports.SEGMENT_SIZE), n - 1);
|
|
224
|
+
const last = length === 0 ? first : Math.floor((offset + length - 1) / exports.SEGMENT_SIZE);
|
|
225
|
+
const storedEnd = last === n - 1 ? storedSize(plaintextSize) : exports.HEADER_SIZE + (last + 1) * exports.STORED_SEGMENT_SIZE;
|
|
226
|
+
const start = exports.HEADER_SIZE + first * exports.STORED_SEGMENT_SIZE;
|
|
227
|
+
return { firstSegment: first, storedOffset: start, storedLength: storedEnd - start, skip: offset - first * exports.SEGMENT_SIZE, length };
|
|
228
|
+
}
|
|
229
|
+
exports.locate = locate;
|
|
230
|
+
/** A located range, decrypted from exactly its stored bytes. */
|
|
231
|
+
async function decryptRange(keys, plaintextSize, r, stored) {
|
|
232
|
+
if (stored.length !== r.storedLength)
|
|
233
|
+
throw new errors_js_1.DataIntegrityError('the range is truncated', 'truncated');
|
|
234
|
+
const n = segments(plaintextSize);
|
|
235
|
+
const opened = [];
|
|
236
|
+
let total = 0;
|
|
237
|
+
for (let i = r.firstSegment, off = 0; off < stored.length; i++) {
|
|
238
|
+
if (i >= n)
|
|
239
|
+
throw new errors_js_1.DataIntegrityError('the range runs past the object', 'truncated');
|
|
240
|
+
const end = Math.min(off + exports.STORED_SEGMENT_SIZE, stored.length);
|
|
241
|
+
const plain = await keys.open(i, i === n - 1, stored.subarray(off, end));
|
|
242
|
+
opened.push(plain);
|
|
243
|
+
total += plain.length;
|
|
244
|
+
off = end;
|
|
245
|
+
}
|
|
246
|
+
if (r.skip + r.length > total)
|
|
247
|
+
throw new errors_js_1.DataIntegrityError('the range is truncated', 'truncated');
|
|
248
|
+
return (0, bytes_js_1.concat)(opened).slice(r.skip, r.skip + r.length);
|
|
249
|
+
}
|
|
250
|
+
exports.decryptRange = decryptRange;
|
|
251
|
+
/** [stored offset, stored length] of segment index. */
|
|
252
|
+
function segmentAt(plaintextSize, index) {
|
|
253
|
+
const n = segments(plaintextSize);
|
|
254
|
+
if (!(0, bytes_js_1.isInt)(index) || index < 0 || index >= n)
|
|
255
|
+
throw new errors_js_1.TeepinError(`tws1: segment ${index} of ${n}`);
|
|
256
|
+
const start = exports.HEADER_SIZE + index * exports.STORED_SEGMENT_SIZE;
|
|
257
|
+
if (index === n - 1)
|
|
258
|
+
return [start, storedSize(plaintextSize) - start];
|
|
259
|
+
return [start, exports.STORED_SEGMENT_SIZE];
|
|
260
|
+
}
|
|
261
|
+
exports.segmentAt = segmentAt;
|
|
262
|
+
function checkPartSize(partSize) {
|
|
263
|
+
if (!(0, bytes_js_1.isInt)(partSize) || partSize <= 0 || partSize % exports.SEGMENT_SIZE !== 0) {
|
|
264
|
+
throw new errors_js_1.TeepinError(`tws1: a part holds a positive multiple of ${exports.SEGMENT_SIZE} plaintext bytes`);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
function checkLayout(plaintextSize, partSize) {
|
|
268
|
+
if (!(0, bytes_js_1.isInt)(plaintextSize) || plaintextSize < 1)
|
|
269
|
+
throw new errors_js_1.TeepinError('tws1: a large object has at least one byte');
|
|
270
|
+
checkPartSize(partSize);
|
|
271
|
+
if (segments(plaintextSize) > exports.MAX_SEGMENTS)
|
|
272
|
+
throw new errors_js_1.TeepinError(`tws1: an object may have at most ${exports.MAX_SEGMENTS} segments`);
|
|
273
|
+
}
|
|
274
|
+
function partAt(plaintextSize, partSize, j) {
|
|
275
|
+
const plainFirst = j * partSize;
|
|
276
|
+
const plainSize = Math.min(partSize, plaintextSize - plainFirst);
|
|
277
|
+
const size = Math.ceil(plainSize / exports.SEGMENT_SIZE) * exports.TAG_SIZE + plainSize;
|
|
278
|
+
if (j === 0)
|
|
279
|
+
return { number: 1, plainFirst: 0, plainSize, storedFirst: 0, storedSize: size + exports.HEADER_SIZE };
|
|
280
|
+
const storedFirst = exports.HEADER_SIZE + (plainFirst / exports.SEGMENT_SIZE) * exports.STORED_SEGMENT_SIZE;
|
|
281
|
+
return { number: j + 1, plainFirst, plainSize, storedFirst, storedSize: size };
|
|
282
|
+
}
|
|
283
|
+
/** How many parts parts() makes, without making them. */
|
|
284
|
+
function partCount(plaintextSize, partSize) {
|
|
285
|
+
checkLayout(plaintextSize, partSize);
|
|
286
|
+
return Math.ceil(plaintextSize / partSize);
|
|
287
|
+
}
|
|
288
|
+
exports.partCount = partCount;
|
|
289
|
+
/** Every part of an object of plaintextSize cut into partSize plaintext bytes (a multiple of 64 KiB). */
|
|
290
|
+
function parts(plaintextSize, partSize) {
|
|
291
|
+
const n = partCount(plaintextSize, partSize);
|
|
292
|
+
const out = [];
|
|
293
|
+
for (let j = 0; j < n; j++)
|
|
294
|
+
out.push(partAt(plaintextSize, partSize, j));
|
|
295
|
+
return out;
|
|
296
|
+
}
|
|
297
|
+
exports.parts = parts;
|
|
298
|
+
/** Part number (1-based) of the layout parts() makes. */
|
|
299
|
+
function partOf(plaintextSize, partSize, number) {
|
|
300
|
+
const n = partCount(plaintextSize, partSize);
|
|
301
|
+
if (!(0, bytes_js_1.isInt)(number) || number < 1 || number > n)
|
|
302
|
+
throw new errors_js_1.TeepinError(`tws1: part ${number} of ${n}`);
|
|
303
|
+
return partAt(plaintextSize, partSize, number - 1);
|
|
304
|
+
}
|
|
305
|
+
exports.partOf = partOf;
|
|
306
|
+
/** One large object's encryption, sealed a part at a time in any order. */
|
|
307
|
+
class Stream {
|
|
308
|
+
size;
|
|
309
|
+
partSize;
|
|
310
|
+
partCount;
|
|
311
|
+
keys;
|
|
312
|
+
segmentCount;
|
|
313
|
+
constructor(keys, size, partSize) {
|
|
314
|
+
this.partCount = partCount(size, partSize);
|
|
315
|
+
this.keys = keys;
|
|
316
|
+
this.size = size;
|
|
317
|
+
this.partSize = partSize;
|
|
318
|
+
this.segmentCount = segments(size);
|
|
319
|
+
}
|
|
320
|
+
/** A new stream, with a fresh header. */
|
|
321
|
+
static async create(dek, size, partSize) {
|
|
322
|
+
partCount(size, partSize);
|
|
323
|
+
const { keys } = await newHeader(dek);
|
|
324
|
+
return new Stream(keys, size, partSize);
|
|
325
|
+
}
|
|
326
|
+
/** The stream an earlier header began, to seal its remaining parts. */
|
|
327
|
+
static async resume(dek, header, size, partSize) {
|
|
328
|
+
partCount(size, partSize);
|
|
329
|
+
return new Stream(await openHeader(dek, header), size, partSize);
|
|
330
|
+
}
|
|
331
|
+
/** The object's header (a copy): the start of part 1, kept to seal any part again after a restart. */
|
|
332
|
+
get header() {
|
|
333
|
+
return this.keys.header;
|
|
334
|
+
}
|
|
335
|
+
/** Part number, sealed from exactly its plaintext. */
|
|
336
|
+
async sealPart(number, plain) {
|
|
337
|
+
if (!(0, bytes_js_1.isInt)(number) || number < 1 || number > this.partCount)
|
|
338
|
+
throw new errors_js_1.TeepinError(`tws1: part ${number} of ${this.partCount}`);
|
|
339
|
+
const p = partAt(this.size, this.partSize, number - 1);
|
|
340
|
+
if (plain.length !== p.plainSize)
|
|
341
|
+
throw new errors_js_1.TeepinError(`tws1: part ${number} holds ${p.plainSize} plaintext bytes, not ${plain.length}`);
|
|
342
|
+
return (0, bytes_js_1.concat)(await sealSegments(this.keys, number, p.plainFirst / exports.SEGMENT_SIZE, plain, this.segmentCount - 1));
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
exports.Stream = Stream;
|
|
346
|
+
/**
|
|
347
|
+
* A stream whose size isn't known yet (section 22.1, E2 b), sealed a part at a time in any order. Every part but the
|
|
348
|
+
* last holds exactly partSize plaintext bytes; the last holds 1 to partSize and is sealed as the last, so its final
|
|
349
|
+
* segment carries the last flag. For the same key, header and plaintext it seals exactly the bytes Stream would, so
|
|
350
|
+
* storage and readers can't tell the two apart.
|
|
351
|
+
*/
|
|
352
|
+
class OpenStream {
|
|
353
|
+
partSize;
|
|
354
|
+
keys;
|
|
355
|
+
constructor(keys, partSize) {
|
|
356
|
+
checkPartSize(partSize);
|
|
357
|
+
this.keys = keys;
|
|
358
|
+
this.partSize = partSize;
|
|
359
|
+
}
|
|
360
|
+
/** A new stream, with a fresh header. */
|
|
361
|
+
static async create(dek, partSize) {
|
|
362
|
+
checkPartSize(partSize);
|
|
363
|
+
const { keys } = await newHeader(dek);
|
|
364
|
+
return new OpenStream(keys, partSize);
|
|
365
|
+
}
|
|
366
|
+
/** The object's header (a copy): the start of part 1. */
|
|
367
|
+
get header() {
|
|
368
|
+
return this.keys.header;
|
|
369
|
+
}
|
|
370
|
+
/** Part number, sealed from exactly its plaintext; last says it ends the stream. */
|
|
371
|
+
async sealPart(number, plain, last) {
|
|
372
|
+
return (0, bytes_js_1.concat)(await this.sealSegments(number, plain, last));
|
|
373
|
+
}
|
|
374
|
+
/** sealPart as its pieces (the header first on part 1), so a caller can drop the plaintext before joining them. */
|
|
375
|
+
async sealSegments(number, plain, last) {
|
|
376
|
+
if (!(0, bytes_js_1.isInt)(number) || number < 1)
|
|
377
|
+
throw new errors_js_1.TeepinError(`tws1: part ${number}`);
|
|
378
|
+
if (last && !(plain.length >= 1 && plain.length <= this.partSize)) {
|
|
379
|
+
throw new errors_js_1.TeepinError(`tws1: a last part holds 1 to ${this.partSize} plaintext bytes, not ${plain.length}`);
|
|
380
|
+
}
|
|
381
|
+
if (!last && plain.length !== this.partSize)
|
|
382
|
+
throw new errors_js_1.TeepinError(`tws1: part ${number} holds ${this.partSize} plaintext bytes, not ${plain.length}`);
|
|
383
|
+
const first = ((number - 1) * this.partSize) / exports.SEGMENT_SIZE;
|
|
384
|
+
const count = Math.ceil(plain.length / exports.SEGMENT_SIZE);
|
|
385
|
+
if (first + count > exports.MAX_SEGMENTS)
|
|
386
|
+
throw new errors_js_1.TeepinError(`tws1: an object may have at most ${exports.MAX_SEGMENTS} segments`);
|
|
387
|
+
return sealSegments(this.keys, number, first, plain, last ? first + count - 1 : -1);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
exports.OpenStream = OpenStream;
|
|
391
|
+
/** A part's sealed segments from first on, the one at lastIndex sealed as the stream's last; part 1 begins with the header. */
|
|
392
|
+
async function sealSegments(keys, number, first, plain, lastIndex) {
|
|
393
|
+
const out = number === 1 ? [keys.header] : [];
|
|
394
|
+
for (let off = 0; off < plain.length; off += exports.SEGMENT_SIZE) {
|
|
395
|
+
const i = first + off / exports.SEGMENT_SIZE;
|
|
396
|
+
out.push(await keys.seal(i, i === lastIndex, plain.subarray(off, off + exports.SEGMENT_SIZE)));
|
|
397
|
+
}
|
|
398
|
+
return out;
|
|
399
|
+
}
|
|
400
|
+
// --- needles (objects in a pack) --------------------------------------------
|
|
401
|
+
async function sha256(data) {
|
|
402
|
+
return new Uint8Array(await crypto.subtle.digest('SHA-256', data));
|
|
403
|
+
}
|
|
404
|
+
/** The 64-byte header that precedes an object in a pack. */
|
|
405
|
+
async function needle(objectId, stored) {
|
|
406
|
+
if (objectId.length !== 16)
|
|
407
|
+
throw new errors_js_1.TeepinError('tws1: an object id is 16 bytes');
|
|
408
|
+
const h = new Uint8Array(exports.NEEDLE_HEADER_SIZE);
|
|
409
|
+
h.set(NEEDLE_MAGIC);
|
|
410
|
+
h.set(objectId, 4);
|
|
411
|
+
new DataView(h.buffer).setBigUint64(20, BigInt(stored.length));
|
|
412
|
+
h.set(await sha256(stored), 28);
|
|
413
|
+
return h;
|
|
414
|
+
}
|
|
415
|
+
exports.needle = needle;
|
|
416
|
+
/** A pack being built: each object's needle, then its stored bytes. */
|
|
417
|
+
class Pack {
|
|
418
|
+
chunks = [];
|
|
419
|
+
length = 0;
|
|
420
|
+
/** The pack's size so far, in bytes. */
|
|
421
|
+
get size() {
|
|
422
|
+
return this.length;
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Appends an object's needle and a copy of its stored bytes; returns the offset of the stored bytes in the pack.
|
|
426
|
+
* Appends may overlap: each lands whole, and returns where its own bytes are.
|
|
427
|
+
*/
|
|
428
|
+
async appendNeedle(objectId, stored) {
|
|
429
|
+
const copy = stored.slice();
|
|
430
|
+
const head = await needle(objectId, copy);
|
|
431
|
+
this.chunks.push(head, copy);
|
|
432
|
+
const offset = this.length + exports.NEEDLE_HEADER_SIZE;
|
|
433
|
+
this.length = offset + copy.length;
|
|
434
|
+
return offset;
|
|
435
|
+
}
|
|
436
|
+
/** The whole pack (await every appendNeedle first). */
|
|
437
|
+
bytes() {
|
|
438
|
+
return (0, bytes_js_1.concat)(this.chunks);
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
exports.Pack = Pack;
|
|
442
|
+
/** Checks that a needle names this object, its size and its stored bytes' SHA-256; DataIntegrityError otherwise. */
|
|
443
|
+
async function checkNeedle(head, objectId, stored) {
|
|
444
|
+
const ok = head.length === exports.NEEDLE_HEADER_SIZE &&
|
|
445
|
+
(0, bytes_js_1.constantTimeEqual)(head.subarray(0, 4), NEEDLE_MAGIC) &&
|
|
446
|
+
(0, bytes_js_1.constantTimeEqual)(head.subarray(4, 20), objectId) &&
|
|
447
|
+
new DataView(head.buffer, head.byteOffset, head.length).getBigUint64(20) === BigInt(stored.length) &&
|
|
448
|
+
(0, bytes_js_1.constantTimeEqual)(head.subarray(60, 64), new Uint8Array(4)) &&
|
|
449
|
+
(0, bytes_js_1.constantTimeEqual)(head.subarray(28, 60), await sha256(stored));
|
|
450
|
+
if (!ok)
|
|
451
|
+
throw new errors_js_1.DataIntegrityError("the pack's needle does not match the object", 'needle');
|
|
452
|
+
}
|
|
453
|
+
exports.checkNeedle = checkNeedle;
|
|
454
|
+
/** The stored bytes (a copy) of the object at offset in a pack, after checking its needle. */
|
|
455
|
+
async function readNeedle(pack, offset, objectId, size) {
|
|
456
|
+
const start = offset - exports.NEEDLE_HEADER_SIZE;
|
|
457
|
+
if (!(0, bytes_js_1.isInt)(offset) || !(0, bytes_js_1.isInt)(size) || start < 0 || size < 0 || offset + size > pack.length) {
|
|
458
|
+
throw new errors_js_1.DataIntegrityError("the pack's needle does not match the object", 'needle');
|
|
459
|
+
}
|
|
460
|
+
const stored = pack.subarray(offset, offset + size);
|
|
461
|
+
await checkNeedle(pack.subarray(start, offset), objectId, stored);
|
|
462
|
+
return stored.slice();
|
|
463
|
+
}
|
|
464
|
+
exports.readNeedle = readNeedle;
|
|
465
|
+
/** A UUID string's 16 bytes (hyphens, braces and a urn:uuid: prefix are allowed). */
|
|
466
|
+
function objectIdBytes(objectId) {
|
|
467
|
+
const hex = objectId
|
|
468
|
+
.replace(/urn:/g, '')
|
|
469
|
+
.replace(/uuid:/g, '')
|
|
470
|
+
.replace(/^[{}]+|[{}]+$/g, '')
|
|
471
|
+
.replace(/-/g, '');
|
|
472
|
+
if (!/^[0-9a-fA-F]{32}$/.test(hex))
|
|
473
|
+
throw new errors_js_1.TeepinError(`tws1: ${objectId} is not a UUID`);
|
|
474
|
+
const out = new Uint8Array(16);
|
|
475
|
+
for (let i = 0; i < 16; i++)
|
|
476
|
+
out[i] = parseInt(hex.slice(2 * i, 2 * i + 2), 16);
|
|
477
|
+
return out;
|
|
478
|
+
}
|
|
479
|
+
exports.objectIdBytes = objectIdBytes;
|
|
480
|
+
//# sourceMappingURL=tws1.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tws1.js","sourceRoot":"","sources":["../../../src/direct/tws1.ts"],"names":[],"mappings":"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"}
|