one 2.6.20 → 2.6.22
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/android/src/main/java/dev/onejs/onenative/OneNativeCameraManager.kt +24 -0
- package/android/src/main/java/dev/onejs/onenative/OneNativeCameraView.kt +197 -2
- package/cpp/HybridOneCrypto.cpp +327 -1
- package/cpp/HybridOneCrypto.hpp +8 -0
- package/dist/cjs/index.cjs +25 -22
- package/dist/cjs/index.native.cjs +25 -22
- package/dist/cjs/index.native.js +25 -22
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/one.cjs +1 -0
- package/dist/cjs/one.native.cjs +1 -0
- package/dist/cjs/one.native.js +1 -0
- package/dist/cjs/one.native.js.map +1 -1
- package/dist/cjs/platform/camera/index.cjs +3 -2
- package/dist/cjs/platform/camera/index.native.cjs +89 -3
- package/dist/cjs/platform/camera/index.native.js +89 -3
- package/dist/cjs/platform/camera/index.native.js.map +1 -1
- package/dist/cjs/platform/crypto/aes.cjs +259 -0
- package/dist/cjs/platform/crypto/aes.native.cjs +343 -0
- package/dist/cjs/platform/crypto/aes.native.js +345 -0
- package/dist/cjs/platform/crypto/aes.native.js.map +1 -0
- package/dist/cjs/platform/crypto/bytes.cjs +132 -0
- package/dist/cjs/platform/crypto/bytes.native.cjs +175 -0
- package/dist/cjs/platform/crypto/bytes.native.js +177 -0
- package/dist/cjs/platform/crypto/bytes.native.js.map +1 -0
- package/dist/cjs/platform/crypto/digest-api.cjs +65 -0
- package/dist/cjs/platform/crypto/digest-api.native.cjs +69 -0
- package/dist/cjs/platform/crypto/digest-api.native.js +71 -0
- package/dist/cjs/platform/crypto/digest-api.native.js.map +1 -0
- package/dist/cjs/platform/crypto/digest.cjs +26 -15
- package/dist/cjs/platform/crypto/digest.native.cjs +26 -15
- package/dist/cjs/platform/crypto/digest.native.js +26 -15
- package/dist/cjs/platform/crypto/digest.native.js.map +1 -1
- package/dist/cjs/platform/crypto/index.cjs +19 -1
- package/dist/cjs/platform/crypto/index.native.cjs +39 -1
- package/dist/cjs/platform/crypto/index.native.js +39 -1
- package/dist/cjs/platform/crypto/index.native.js.map +1 -1
- package/dist/cjs/platform/crypto/types.cjs +16 -0
- package/dist/cjs/platform/crypto/types.native.cjs +18 -0
- package/dist/cjs/platform/crypto/types.native.js +20 -0
- package/dist/cjs/platform/crypto/types.native.js.map +1 -0
- package/dist/cjs/platform/crypto/web.cjs +73 -0
- package/dist/cjs/platform/extras.cjs +4 -0
- package/dist/cjs/platform/extras.native.cjs +4 -0
- package/dist/cjs/platform/extras.native.js +4 -0
- package/dist/cjs/platform/extras.native.js.map +1 -1
- package/dist/cjs/platform/specs/OneNativeCameraNativeComponent.cjs +37 -21
- package/dist/cjs/platform/specs/OneNativeCameraNativeComponent.native.cjs +37 -21
- package/dist/cjs/platform/specs/OneNativeCameraNativeComponent.native.js +37 -21
- package/dist/cjs/platform/specs/OneNativeCameraNativeComponent.native.js.map +3 -3
- package/dist/cjs/router/router.cjs +4 -1
- package/dist/esm/index.js +2 -2
- package/dist/esm/index.mjs +2 -2
- package/dist/esm/index.native.js +2 -2
- package/dist/esm/one.mjs +2 -1
- package/dist/esm/one.mjs.map +1 -1
- package/dist/esm/one.native.js +2 -1
- package/dist/esm/one.native.js.map +1 -1
- package/dist/esm/platform/camera/index.mjs +4 -2
- package/dist/esm/platform/camera/index.mjs.map +1 -1
- package/dist/esm/platform/camera/index.native.js +90 -4
- package/dist/esm/platform/camera/index.native.js.map +1 -1
- package/dist/esm/platform/crypto/aes.mjs +236 -0
- package/dist/esm/platform/crypto/aes.mjs.map +1 -0
- package/dist/esm/platform/crypto/aes.native.js +318 -0
- package/dist/esm/platform/crypto/aes.native.js.map +1 -0
- package/dist/esm/platform/crypto/bytes.mjs +104 -0
- package/dist/esm/platform/crypto/bytes.mjs.map +1 -0
- package/dist/esm/platform/crypto/bytes.native.js +145 -0
- package/dist/esm/platform/crypto/bytes.native.js.map +1 -0
- package/dist/esm/platform/crypto/digest-api.mjs +42 -0
- package/dist/esm/platform/crypto/digest-api.mjs.map +1 -0
- package/dist/esm/platform/crypto/digest-api.native.js +44 -0
- package/dist/esm/platform/crypto/digest-api.native.js.map +1 -0
- package/dist/esm/platform/crypto/digest.mjs +23 -15
- package/dist/esm/platform/crypto/digest.mjs.map +1 -1
- package/dist/esm/platform/crypto/digest.native.js +23 -15
- package/dist/esm/platform/crypto/digest.native.js.map +1 -1
- package/dist/esm/platform/crypto/index.mjs +14 -1
- package/dist/esm/platform/crypto/index.mjs.map +1 -1
- package/dist/esm/platform/crypto/index.native.js +34 -1
- package/dist/esm/platform/crypto/index.native.js.map +1 -1
- package/dist/esm/platform/crypto/types.mjs +0 -0
- package/dist/esm/platform/crypto/types.native.js +0 -0
- package/dist/esm/platform/crypto/web.mjs +50 -0
- package/dist/esm/platform/crypto/web.mjs.map +1 -0
- package/dist/esm/platform/extras.mjs +2 -1
- package/dist/esm/platform/extras.native.js +2 -1
- package/dist/esm/platform/specs/OneNativeCameraNativeComponent.mjs +25 -9
- package/dist/esm/platform/specs/OneNativeCameraNativeComponent.mjs.map +3 -3
- package/dist/esm/platform/specs/OneNativeCameraNativeComponent.native.js +25 -9
- package/dist/esm/platform/specs/OneNativeCameraNativeComponent.native.js.map +3 -3
- package/dist/esm/router/router.mjs +5 -2
- package/dist/esm/router/router.mjs.map +1 -1
- package/ios/OneNativeCameraComponentView.mm +28 -0
- package/ios/OneNativeCameraView.swift +163 -0
- package/nitrogen/generated/shared/c++/HybridOneCryptoSpec.cpp +2 -0
- package/nitrogen/generated/shared/c++/HybridOneCryptoSpec.hpp +4 -1
- package/package.json +12 -12
- package/src/index.ts +4 -0
- package/src/one.ts +3 -0
- package/src/platform/camera/index.native.tsx +116 -12
- package/src/platform/camera/index.tsx +15 -4
- package/src/platform/camera/types.ts +22 -0
- package/src/platform/crypto/aes.ts +345 -0
- package/src/platform/crypto/bytes.ts +120 -0
- package/src/platform/crypto/digest-api.ts +50 -0
- package/src/platform/crypto/digest.ts +24 -15
- package/src/platform/crypto/index.native.ts +68 -0
- package/src/platform/crypto/index.ts +31 -0
- package/src/platform/crypto/types.ts +64 -0
- package/src/platform/crypto/web.ts +69 -0
- package/src/platform/extras.ts +15 -0
- package/src/platform/index.native.ts +4 -0
- package/src/platform/index.ts +4 -0
- package/src/platform/specs/OneCrypto.nitro.ts +19 -0
- package/src/platform/specs/OneNativeCameraNativeComponent.ts +35 -2
- package/src/router/router.ts +7 -4
- package/types/index.d.ts +2 -1
- package/types/index.d.ts.map +1 -1
- package/types/one.d.ts +2 -1
- package/types/one.d.ts.map +1 -1
- package/types/platform/camera/index.d.ts +3 -3
- package/types/platform/camera/index.d.ts.map +1 -1
- package/types/platform/camera/index.native.d.ts +3 -3
- package/types/platform/camera/index.native.d.ts.map +1 -1
- package/types/platform/camera/types.d.ts +18 -0
- package/types/platform/camera/types.d.ts.map +1 -1
- package/types/platform/crypto/aes.d.ts +211 -0
- package/types/platform/crypto/aes.d.ts.map +1 -0
- package/types/platform/crypto/bytes.d.ts +8 -0
- package/types/platform/crypto/bytes.d.ts.map +1 -0
- package/types/platform/crypto/digest-api.d.ts +9 -0
- package/types/platform/crypto/digest-api.d.ts.map +1 -0
- package/types/platform/crypto/digest.d.ts +5 -0
- package/types/platform/crypto/digest.d.ts.map +1 -1
- package/types/platform/crypto/index.d.ts +127 -0
- package/types/platform/crypto/index.d.ts.map +1 -1
- package/types/platform/crypto/index.native.d.ts +127 -0
- package/types/platform/crypto/index.native.d.ts.map +1 -1
- package/types/platform/crypto/types.d.ts +43 -0
- package/types/platform/crypto/types.d.ts.map +1 -0
- package/types/platform/crypto/web.d.ts +5 -0
- package/types/platform/crypto/web.d.ts.map +1 -0
- package/types/platform/extras.d.ts +2 -0
- package/types/platform/extras.d.ts.map +1 -1
- package/types/platform/index.d.ts +1 -1
- package/types/platform/index.d.ts.map +1 -1
- package/types/platform/index.native.d.ts +1 -1
- package/types/platform/index.native.d.ts.map +1 -1
- package/types/platform/specs/OneCrypto.nitro.d.ts +2 -0
- package/types/platform/specs/OneCrypto.nitro.d.ts.map +1 -1
- package/types/platform/specs/OneNativeCameraNativeComponent.d.ts +18 -2
- package/types/platform/specs/OneNativeCameraNativeComponent.d.ts.map +1 -1
- package/types/router/router.d.ts.map +1 -1
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { base64ToBytes, bytesToBase64, bytesToHex, concatBytes, exactBytes, hexToBytes } from "./bytes.mjs";
|
|
2
|
+
|
|
3
|
+
const KEY_SIZES = [
|
|
4
|
+
128,
|
|
5
|
+
192,
|
|
6
|
+
256
|
|
7
|
+
];
|
|
8
|
+
const TAG_LENGTHS = [
|
|
9
|
+
16,
|
|
10
|
+
15,
|
|
11
|
+
14,
|
|
12
|
+
13,
|
|
13
|
+
12,
|
|
14
|
+
8,
|
|
15
|
+
4
|
|
16
|
+
];
|
|
17
|
+
const DEFAULT_IV_LENGTH = 12;
|
|
18
|
+
const DEFAULT_TAG_LENGTH = 16;
|
|
19
|
+
function assertTagLength(tagLength, verb) {
|
|
20
|
+
if (!TAG_LENGTHS.includes(tagLength)) {
|
|
21
|
+
throw new Error(`${verb}: tagLength must be one of: ${TAG_LENGTHS.join(", ")}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function toBytes(input, verb) {
|
|
25
|
+
if (typeof input === "string") return base64ToBytes(input, verb);
|
|
26
|
+
if (input instanceof ArrayBuffer) return new Uint8Array(input.slice(0));
|
|
27
|
+
if (ArrayBuffer.isView(input) && input.buffer instanceof ArrayBuffer) {
|
|
28
|
+
return exactBytes(new Uint8Array(input.buffer, input.byteOffset, input.byteLength));
|
|
29
|
+
}
|
|
30
|
+
throw new TypeError(`${verb}: expected a base64 string, Uint8Array, or ArrayBuffer`);
|
|
31
|
+
}
|
|
32
|
+
const sealedParts = /* @__PURE__ */ new WeakMap();
|
|
33
|
+
const keyBytes = /* @__PURE__ */ new WeakMap();
|
|
34
|
+
function encodeParts(bytes, encoding) {
|
|
35
|
+
return encoding === "base64" ? bytesToBase64(bytes) : exactBytes(bytes);
|
|
36
|
+
}
|
|
37
|
+
function createAesApi(engine) {
|
|
38
|
+
class AESEncryptionKey {
|
|
39
|
+
size;
|
|
40
|
+
constructor(bytes) {
|
|
41
|
+
if (!KEY_SIZES.includes(bytes.length * 8)) {
|
|
42
|
+
throw new Error(`Crypto.AESEncryptionKey: key must be 128, 192, or 256 bits, got ${bytes.length * 8}`);
|
|
43
|
+
}
|
|
44
|
+
this.size = bytes.length * 8;
|
|
45
|
+
keyBytes.set(this, exactBytes(bytes));
|
|
46
|
+
}
|
|
47
|
+
static async generate(size = 256) {
|
|
48
|
+
if (!KEY_SIZES.includes(size)) {
|
|
49
|
+
throw new Error(`Crypto.AESEncryptionKey.generate: size must be one of: ${KEY_SIZES.join(", ")}`);
|
|
50
|
+
}
|
|
51
|
+
const bytes = new Uint8Array(size / 8);
|
|
52
|
+
engine.random(bytes);
|
|
53
|
+
return new AESEncryptionKey(bytes);
|
|
54
|
+
}
|
|
55
|
+
static async import(input, encoding) {
|
|
56
|
+
const verb = "Crypto.AESEncryptionKey.import";
|
|
57
|
+
let bytes;
|
|
58
|
+
if (typeof input === "string") {
|
|
59
|
+
if (encoding === "hex") bytes = hexToBytes(input, verb);
|
|
60
|
+
else if (encoding === "base64") bytes = base64ToBytes(input, verb);
|
|
61
|
+
else throw new Error(`${verb}: encoding must be 'hex' or 'base64'`);
|
|
62
|
+
} else if (input instanceof Uint8Array) {
|
|
63
|
+
bytes = exactBytes(input);
|
|
64
|
+
} else {
|
|
65
|
+
throw new TypeError(`${verb}: expected bytes or an encoded string`);
|
|
66
|
+
}
|
|
67
|
+
if (!KEY_SIZES.includes(bytes.length * 8)) {
|
|
68
|
+
throw new Error(`${verb}: key must be 128, 192, or 256 bits, got ${bytes.length * 8}`);
|
|
69
|
+
}
|
|
70
|
+
return new AESEncryptionKey(bytes);
|
|
71
|
+
}
|
|
72
|
+
async bytes() {
|
|
73
|
+
return exactBytes(keyBytes.get(this));
|
|
74
|
+
}
|
|
75
|
+
async encoded(encoding) {
|
|
76
|
+
const bytes = keyBytes.get(this);
|
|
77
|
+
if (encoding === "hex") return bytesToHex(bytes);
|
|
78
|
+
if (encoding === "base64") return bytesToBase64(bytes);
|
|
79
|
+
throw new Error(`Crypto.AESEncryptionKey.encoded: encoding must be 'hex' or 'base64'`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
class AESSealedData {
|
|
83
|
+
constructor(parts) {
|
|
84
|
+
if (parts.iv.length === 0) throw new Error("Crypto.AESSealedData: iv must not be empty");
|
|
85
|
+
assertTagLength(parts.tag.length, "Crypto.AESSealedData");
|
|
86
|
+
sealedParts.set(this, parts);
|
|
87
|
+
}
|
|
88
|
+
static fromCombined(combined, config = {}) {
|
|
89
|
+
const verb = "Crypto.AESSealedData.fromCombined";
|
|
90
|
+
const ivLength = config.ivLength ?? DEFAULT_IV_LENGTH;
|
|
91
|
+
const tagLength = config.tagLength ?? DEFAULT_TAG_LENGTH;
|
|
92
|
+
assertTagLength(tagLength, verb);
|
|
93
|
+
if (!Number.isInteger(ivLength) || ivLength <= 0) {
|
|
94
|
+
throw new Error(`${verb}: ivLength must be a positive integer`);
|
|
95
|
+
}
|
|
96
|
+
const bytes = toBytes(combined, verb);
|
|
97
|
+
if (bytes.length < ivLength + tagLength) {
|
|
98
|
+
throw new Error(`${verb}: combined data is shorter than its iv and tag`);
|
|
99
|
+
}
|
|
100
|
+
return new AESSealedData({
|
|
101
|
+
iv: exactBytes(bytes.subarray(0, ivLength)),
|
|
102
|
+
ciphertext: exactBytes(bytes.subarray(ivLength, bytes.length - tagLength)),
|
|
103
|
+
tag: exactBytes(bytes.subarray(bytes.length - tagLength))
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
static fromParts(ivInput, ciphertextInput, tagOrLength) {
|
|
107
|
+
const verb = "Crypto.AESSealedData.fromParts";
|
|
108
|
+
const iv = toBytes(ivInput, verb);
|
|
109
|
+
const ciphertext = toBytes(ciphertextInput, verb);
|
|
110
|
+
if (tagOrLength === void 0 || typeof tagOrLength === "number") {
|
|
111
|
+
const tagLength = tagOrLength ?? DEFAULT_TAG_LENGTH;
|
|
112
|
+
assertTagLength(tagLength, verb);
|
|
113
|
+
if (ciphertext.length < tagLength) {
|
|
114
|
+
throw new Error(`${verb}: ciphertext is shorter than its tag`);
|
|
115
|
+
}
|
|
116
|
+
return new AESSealedData({
|
|
117
|
+
iv,
|
|
118
|
+
ciphertext: exactBytes(ciphertext.subarray(0, ciphertext.length - tagLength)),
|
|
119
|
+
tag: exactBytes(ciphertext.subarray(ciphertext.length - tagLength))
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
const tag = toBytes(tagOrLength, verb);
|
|
123
|
+
assertTagLength(tag.length, verb);
|
|
124
|
+
return new AESSealedData({
|
|
125
|
+
iv,
|
|
126
|
+
ciphertext,
|
|
127
|
+
tag
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
static fromSeal(iv, ciphertextWithTag, tagLength) {
|
|
131
|
+
return new AESSealedData({
|
|
132
|
+
iv,
|
|
133
|
+
ciphertext: exactBytes(ciphertextWithTag.subarray(0, ciphertextWithTag.length - tagLength)),
|
|
134
|
+
tag: exactBytes(ciphertextWithTag.subarray(ciphertextWithTag.length - tagLength))
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
get ivSize() {
|
|
138
|
+
return sealedParts.get(this).iv.length;
|
|
139
|
+
}
|
|
140
|
+
get tagSize() {
|
|
141
|
+
return sealedParts.get(this).tag.length;
|
|
142
|
+
}
|
|
143
|
+
get combinedSize() {
|
|
144
|
+
const parts = sealedParts.get(this);
|
|
145
|
+
return parts.iv.length + parts.ciphertext.length + parts.tag.length;
|
|
146
|
+
}
|
|
147
|
+
async iv(encoding) {
|
|
148
|
+
return encodeParts(sealedParts.get(this).iv, encoding);
|
|
149
|
+
}
|
|
150
|
+
async tag(encoding) {
|
|
151
|
+
return encodeParts(sealedParts.get(this).tag, encoding);
|
|
152
|
+
}
|
|
153
|
+
async ciphertext(options) {
|
|
154
|
+
const parts = sealedParts.get(this);
|
|
155
|
+
const bytes = options?.includeTag ? concatBytes([parts.ciphertext, parts.tag]) : parts.ciphertext;
|
|
156
|
+
return encodeParts(bytes, options?.encoding);
|
|
157
|
+
}
|
|
158
|
+
async combined(encoding) {
|
|
159
|
+
const parts = sealedParts.get(this);
|
|
160
|
+
return encodeParts(concatBytes([
|
|
161
|
+
parts.iv,
|
|
162
|
+
parts.ciphertext,
|
|
163
|
+
parts.tag
|
|
164
|
+
]), encoding);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
async function keyMaterial(key, verb) {
|
|
168
|
+
const own = keyBytes.get(key);
|
|
169
|
+
if (own) return exactBytes(own);
|
|
170
|
+
if (key && typeof key.bytes === "function") return exactBytes(await key.bytes());
|
|
171
|
+
throw new TypeError(`${verb}: expected an AESEncryptionKey`);
|
|
172
|
+
}
|
|
173
|
+
async function partsOf(sealed, verb) {
|
|
174
|
+
const own = sealedParts.get(sealed);
|
|
175
|
+
if (own) {
|
|
176
|
+
return {
|
|
177
|
+
iv: exactBytes(own.iv),
|
|
178
|
+
ciphertext: exactBytes(own.ciphertext),
|
|
179
|
+
tag: exactBytes(own.tag)
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
if (sealed && typeof sealed.iv === "function" && typeof sealed.combined === "function") {
|
|
183
|
+
const iv = exactBytes(await sealed.iv());
|
|
184
|
+
const tag = exactBytes(await sealed.tag());
|
|
185
|
+
const ciphertext = exactBytes(await sealed.ciphertext({
|
|
186
|
+
encoding: "bytes",
|
|
187
|
+
includeTag: false
|
|
188
|
+
}));
|
|
189
|
+
return {
|
|
190
|
+
iv,
|
|
191
|
+
ciphertext,
|
|
192
|
+
tag
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
throw new TypeError(`${verb}: expected an AESSealedData`);
|
|
196
|
+
}
|
|
197
|
+
async function aesEncrypt(plaintext, key, options = {}) {
|
|
198
|
+
const verb = "Crypto.aesEncrypt";
|
|
199
|
+
const tagLength = options.tagLength ?? DEFAULT_TAG_LENGTH;
|
|
200
|
+
assertTagLength(tagLength, verb);
|
|
201
|
+
let iv;
|
|
202
|
+
const nonce = options.nonce;
|
|
203
|
+
if (nonce && "bytes" in nonce && nonce.bytes !== void 0) {
|
|
204
|
+
iv = toBytes(nonce.bytes, verb);
|
|
205
|
+
if (iv.length === 0) throw new Error(`${verb}: nonce bytes must not be empty`);
|
|
206
|
+
} else {
|
|
207
|
+
const length = nonce && "length" in nonce && nonce.length !== void 0 ? nonce.length : DEFAULT_IV_LENGTH;
|
|
208
|
+
if (!Number.isInteger(length) || length <= 0) {
|
|
209
|
+
throw new Error(`${verb}: nonce length must be a positive integer`);
|
|
210
|
+
}
|
|
211
|
+
iv = new Uint8Array(length);
|
|
212
|
+
engine.random(iv);
|
|
213
|
+
}
|
|
214
|
+
const additionalData = options.additionalData === void 0 ? void 0 : toBytes(options.additionalData, verb);
|
|
215
|
+
const plainBytes = toBytes(plaintext, verb);
|
|
216
|
+
const sealed = await engine.seal(await keyMaterial(key, verb), iv, plainBytes, additionalData, tagLength);
|
|
217
|
+
const actualTag = sealed.length - plainBytes.length;
|
|
218
|
+
return AESSealedData.fromSeal(iv, sealed, actualTag > 0 ? actualTag : tagLength);
|
|
219
|
+
}
|
|
220
|
+
async function aesDecrypt(sealedData, key, options = {}) {
|
|
221
|
+
const verb = "Crypto.aesDecrypt";
|
|
222
|
+
const parts = await partsOf(sealedData, verb);
|
|
223
|
+
const additionalData = options.additionalData === void 0 ? void 0 : toBytes(options.additionalData, verb);
|
|
224
|
+
const plaintext = await engine.open(await keyMaterial(key, verb), parts.iv, concatBytes([parts.ciphertext, parts.tag]), additionalData, parts.tag.length);
|
|
225
|
+
return options.output === "base64" ? bytesToBase64(plaintext) : plaintext;
|
|
226
|
+
}
|
|
227
|
+
return {
|
|
228
|
+
AESEncryptionKey,
|
|
229
|
+
AESSealedData,
|
|
230
|
+
aesEncrypt,
|
|
231
|
+
aesDecrypt
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
export { assertTagLength, createAesApi, toBytes };
|
|
236
|
+
//# sourceMappingURL=aes.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aes.js","names":[],"sources":["esm/platform/crypto/aes.js"],"sourcesContent":["import { base64ToBytes, bytesToBase64, bytesToHex, concatBytes, exactBytes, hexToBytes } from \"./bytes\";\nconst KEY_SIZES = [128, 192, 256];\nconst TAG_LENGTHS = [16, 15, 14, 13, 12, 8, 4];\nconst DEFAULT_IV_LENGTH = 12;\nconst DEFAULT_TAG_LENGTH = 16;\nfunction assertTagLength(tagLength, verb) {\n if (!TAG_LENGTHS.includes(tagLength)) {\n throw new Error(`${verb}: tagLength must be one of: ${TAG_LENGTHS.join(\", \")}`);\n }\n}\nfunction toBytes(input, verb) {\n if (typeof input === \"string\") return base64ToBytes(input, verb);\n if (input instanceof ArrayBuffer) return new Uint8Array(input.slice(0));\n if (ArrayBuffer.isView(input) && input.buffer instanceof ArrayBuffer) {\n return exactBytes(new Uint8Array(input.buffer, input.byteOffset, input.byteLength));\n }\n throw new TypeError(`${verb}: expected a base64 string, Uint8Array, or ArrayBuffer`);\n}\nconst sealedParts = /* @__PURE__ */ new WeakMap();\nconst keyBytes = /* @__PURE__ */ new WeakMap();\nfunction encodeParts(bytes, encoding) {\n return encoding === \"base64\" ? bytesToBase64(bytes) : exactBytes(bytes);\n}\nfunction createAesApi(engine) {\n class AESEncryptionKey {\n size;\n // construct through generate or import; direct construction still\n // validates, so a key object can never hold a non-AES length.\n constructor(bytes) {\n if (!KEY_SIZES.includes(bytes.length * 8)) {\n throw new Error(\n `Crypto.AESEncryptionKey: key must be 128, 192, or 256 bits, got ${bytes.length * 8}`\n );\n }\n this.size = bytes.length * 8;\n keyBytes.set(this, exactBytes(bytes));\n }\n static async generate(size = 256) {\n if (!KEY_SIZES.includes(size)) {\n throw new Error(`Crypto.AESEncryptionKey.generate: size must be one of: ${KEY_SIZES.join(\", \")}`);\n }\n const bytes = new Uint8Array(size / 8);\n engine.random(bytes);\n return new AESEncryptionKey(bytes);\n }\n static async import(input, encoding) {\n const verb = \"Crypto.AESEncryptionKey.import\";\n let bytes;\n if (typeof input === \"string\") {\n if (encoding === \"hex\") bytes = hexToBytes(input, verb);\n else if (encoding === \"base64\") bytes = base64ToBytes(input, verb);\n else throw new Error(`${verb}: encoding must be 'hex' or 'base64'`);\n } else if (input instanceof Uint8Array) {\n bytes = exactBytes(input);\n } else {\n throw new TypeError(`${verb}: expected bytes or an encoded string`);\n }\n if (!KEY_SIZES.includes(bytes.length * 8)) {\n throw new Error(`${verb}: key must be 128, 192, or 256 bits, got ${bytes.length * 8}`);\n }\n return new AESEncryptionKey(bytes);\n }\n async bytes() {\n return exactBytes(keyBytes.get(this));\n }\n async encoded(encoding) {\n const bytes = keyBytes.get(this);\n if (encoding === \"hex\") return bytesToHex(bytes);\n if (encoding === \"base64\") return bytesToBase64(bytes);\n throw new Error(`Crypto.AESEncryptionKey.encoded: encoding must be 'hex' or 'base64'`);\n }\n }\n class AESSealedData {\n // construct through fromCombined or fromParts. direct construction still\n // validates, so sealed data can never carry an empty iv or a tag gcm\n // does not allow.\n constructor(parts) {\n if (parts.iv.length === 0) throw new Error(\"Crypto.AESSealedData: iv must not be empty\");\n assertTagLength(parts.tag.length, \"Crypto.AESSealedData\");\n sealedParts.set(this, parts);\n }\n static fromCombined(combined, config = {}) {\n const verb = \"Crypto.AESSealedData.fromCombined\";\n const ivLength = config.ivLength ?? DEFAULT_IV_LENGTH;\n const tagLength = config.tagLength ?? DEFAULT_TAG_LENGTH;\n assertTagLength(tagLength, verb);\n if (!Number.isInteger(ivLength) || ivLength <= 0) {\n throw new Error(`${verb}: ivLength must be a positive integer`);\n }\n const bytes = toBytes(combined, verb);\n if (bytes.length < ivLength + tagLength) {\n throw new Error(`${verb}: combined data is shorter than its iv and tag`);\n }\n return new AESSealedData({\n iv: exactBytes(bytes.subarray(0, ivLength)),\n ciphertext: exactBytes(bytes.subarray(ivLength, bytes.length - tagLength)),\n tag: exactBytes(bytes.subarray(bytes.length - tagLength))\n });\n }\n static fromParts(ivInput, ciphertextInput, tagOrLength) {\n const verb = \"Crypto.AESSealedData.fromParts\";\n const iv = toBytes(ivInput, verb);\n const ciphertext = toBytes(ciphertextInput, verb);\n if (tagOrLength === void 0 || typeof tagOrLength === \"number\") {\n const tagLength = tagOrLength ?? DEFAULT_TAG_LENGTH;\n assertTagLength(tagLength, verb);\n if (ciphertext.length < tagLength) {\n throw new Error(`${verb}: ciphertext is shorter than its tag`);\n }\n return new AESSealedData({\n iv,\n ciphertext: exactBytes(ciphertext.subarray(0, ciphertext.length - tagLength)),\n tag: exactBytes(ciphertext.subarray(ciphertext.length - tagLength))\n });\n }\n const tag = toBytes(tagOrLength, verb);\n assertTagLength(tag.length, verb);\n return new AESSealedData({ iv, ciphertext, tag });\n }\n // internal: aesEncrypt builds sealed data from engine output without\n // going through the public parsers (which would just re-split it).\n static fromSeal(iv, ciphertextWithTag, tagLength) {\n return new AESSealedData({\n iv,\n ciphertext: exactBytes(ciphertextWithTag.subarray(0, ciphertextWithTag.length - tagLength)),\n tag: exactBytes(ciphertextWithTag.subarray(ciphertextWithTag.length - tagLength))\n });\n }\n get ivSize() {\n return sealedParts.get(this).iv.length;\n }\n get tagSize() {\n return sealedParts.get(this).tag.length;\n }\n get combinedSize() {\n const parts = sealedParts.get(this);\n return parts.iv.length + parts.ciphertext.length + parts.tag.length;\n }\n async iv(encoding) {\n return encodeParts(sealedParts.get(this).iv, encoding);\n }\n async tag(encoding) {\n return encodeParts(sealedParts.get(this).tag, encoding);\n }\n async ciphertext(options) {\n const parts = sealedParts.get(this);\n const bytes = options?.includeTag ? concatBytes([parts.ciphertext, parts.tag]) : parts.ciphertext;\n return encodeParts(bytes, options?.encoding);\n }\n async combined(encoding) {\n const parts = sealedParts.get(this);\n return encodeParts(concatBytes([parts.iv, parts.ciphertext, parts.tag]), encoding);\n }\n }\n async function keyMaterial(key, verb) {\n const own = keyBytes.get(key);\n if (own) return exactBytes(own);\n if (key && typeof key.bytes === \"function\") return exactBytes(await key.bytes());\n throw new TypeError(`${verb}: expected an AESEncryptionKey`);\n }\n async function partsOf(sealed, verb) {\n const own = sealedParts.get(sealed);\n if (own) {\n return {\n iv: exactBytes(own.iv),\n ciphertext: exactBytes(own.ciphertext),\n tag: exactBytes(own.tag)\n };\n }\n if (sealed && typeof sealed.iv === \"function\" && typeof sealed.combined === \"function\") {\n const iv = exactBytes(await sealed.iv());\n const tag = exactBytes(await sealed.tag());\n const ciphertext = exactBytes(await sealed.ciphertext({ encoding: \"bytes\", includeTag: false }));\n return { iv, ciphertext, tag };\n }\n throw new TypeError(`${verb}: expected an AESSealedData`);\n }\n async function aesEncrypt(plaintext, key, options = {}) {\n const verb = \"Crypto.aesEncrypt\";\n const tagLength = options.tagLength ?? DEFAULT_TAG_LENGTH;\n assertTagLength(tagLength, verb);\n let iv;\n const nonce = options.nonce;\n if (nonce && \"bytes\" in nonce && nonce.bytes !== void 0) {\n iv = toBytes(nonce.bytes, verb);\n if (iv.length === 0) throw new Error(`${verb}: nonce bytes must not be empty`);\n } else {\n const length = nonce && \"length\" in nonce && nonce.length !== void 0 ? nonce.length : DEFAULT_IV_LENGTH;\n if (!Number.isInteger(length) || length <= 0) {\n throw new Error(`${verb}: nonce length must be a positive integer`);\n }\n iv = new Uint8Array(length);\n engine.random(iv);\n }\n const additionalData = options.additionalData === void 0 ? void 0 : toBytes(options.additionalData, verb);\n const plainBytes = toBytes(plaintext, verb);\n const sealed = await engine.seal(\n await keyMaterial(key, verb),\n iv,\n plainBytes,\n additionalData,\n tagLength\n );\n const actualTag = sealed.length - plainBytes.length;\n return AESSealedData.fromSeal(iv, sealed, actualTag > 0 ? actualTag : tagLength);\n }\n async function aesDecrypt(sealedData, key, options = {}) {\n const verb = \"Crypto.aesDecrypt\";\n const parts = await partsOf(sealedData, verb);\n const additionalData = options.additionalData === void 0 ? void 0 : toBytes(options.additionalData, verb);\n const plaintext = await engine.open(\n await keyMaterial(key, verb),\n parts.iv,\n concatBytes([parts.ciphertext, parts.tag]),\n additionalData,\n parts.tag.length\n );\n return options.output === \"base64\" ? bytesToBase64(plaintext) : plaintext;\n }\n return { AESEncryptionKey, AESSealedData, aesEncrypt, aesDecrypt };\n}\nexport {\n assertTagLength,\n createAesApi,\n toBytes\n};\n//# sourceMappingURL=aes.js.map\n"],"mappings":"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"}
|
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
import { base64ToBytes, bytesToBase64, bytesToHex, concatBytes, exactBytes, hexToBytes } from "./bytes.native.js";
|
|
2
|
+
|
|
3
|
+
function _class_call_check(instance, Constructor) {
|
|
4
|
+
if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
|
|
5
|
+
}
|
|
6
|
+
function _defineProperties(target, props) {
|
|
7
|
+
for (var i = 0; i < props.length; i++) {
|
|
8
|
+
var descriptor = props[i];
|
|
9
|
+
descriptor.enumerable = descriptor.enumerable || false;
|
|
10
|
+
descriptor.configurable = true;
|
|
11
|
+
if ("value" in descriptor) descriptor.writable = true;
|
|
12
|
+
Object.defineProperty(target, descriptor.key, descriptor);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function _create_class(Constructor, protoProps, staticProps) {
|
|
16
|
+
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
|
|
17
|
+
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
18
|
+
return Constructor;
|
|
19
|
+
}
|
|
20
|
+
function _define_property(obj, key, value) {
|
|
21
|
+
if (key in obj) {
|
|
22
|
+
Object.defineProperty(obj, key, {
|
|
23
|
+
value,
|
|
24
|
+
enumerable: true,
|
|
25
|
+
configurable: true,
|
|
26
|
+
writable: true
|
|
27
|
+
});
|
|
28
|
+
} else obj[key] = value;
|
|
29
|
+
return obj;
|
|
30
|
+
}
|
|
31
|
+
var KEY_SIZES = [
|
|
32
|
+
128,
|
|
33
|
+
192,
|
|
34
|
+
256
|
|
35
|
+
];
|
|
36
|
+
var TAG_LENGTHS = [
|
|
37
|
+
16,
|
|
38
|
+
15,
|
|
39
|
+
14,
|
|
40
|
+
13,
|
|
41
|
+
12,
|
|
42
|
+
8,
|
|
43
|
+
4
|
|
44
|
+
];
|
|
45
|
+
var DEFAULT_IV_LENGTH = 12;
|
|
46
|
+
var DEFAULT_TAG_LENGTH = 16;
|
|
47
|
+
function assertTagLength(tagLength, verb) {
|
|
48
|
+
if (!TAG_LENGTHS.includes(tagLength)) {
|
|
49
|
+
throw new Error(`${verb}: tagLength must be one of: ${TAG_LENGTHS.join(", ")}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function toBytes(input, verb) {
|
|
53
|
+
if (typeof input === "string") return base64ToBytes(input, verb);
|
|
54
|
+
if (input instanceof ArrayBuffer) return new Uint8Array(input.slice(0));
|
|
55
|
+
if (ArrayBuffer.isView(input) && input.buffer instanceof ArrayBuffer) {
|
|
56
|
+
return exactBytes(new Uint8Array(input.buffer, input.byteOffset, input.byteLength));
|
|
57
|
+
}
|
|
58
|
+
throw new TypeError(`${verb}: expected a base64 string, Uint8Array, or ArrayBuffer`);
|
|
59
|
+
}
|
|
60
|
+
var sealedParts = /* @__PURE__ */ new WeakMap();
|
|
61
|
+
var keyBytes = /* @__PURE__ */ new WeakMap();
|
|
62
|
+
function encodeParts(bytes, encoding) {
|
|
63
|
+
return encoding === "base64" ? bytesToBase64(bytes) : exactBytes(bytes);
|
|
64
|
+
}
|
|
65
|
+
function createAesApi(engine) {
|
|
66
|
+
var AESEncryptionKey = /* @__PURE__ */ (function() {
|
|
67
|
+
"use strict";
|
|
68
|
+
function AESEncryptionKey2(bytes) {
|
|
69
|
+
_class_call_check(this, AESEncryptionKey2);
|
|
70
|
+
_define_property(this, "size", void 0);
|
|
71
|
+
if (!KEY_SIZES.includes(bytes.length * 8)) {
|
|
72
|
+
throw new Error(`Crypto.AESEncryptionKey: key must be 128, 192, or 256 bits, got ${bytes.length * 8}`);
|
|
73
|
+
}
|
|
74
|
+
this.size = bytes.length * 8;
|
|
75
|
+
keyBytes.set(this, exactBytes(bytes));
|
|
76
|
+
}
|
|
77
|
+
_create_class(AESEncryptionKey2, [{
|
|
78
|
+
key: "bytes",
|
|
79
|
+
value: async function bytes() {
|
|
80
|
+
return exactBytes(keyBytes.get(this));
|
|
81
|
+
}
|
|
82
|
+
}, {
|
|
83
|
+
key: "encoded",
|
|
84
|
+
value: async function encoded(encoding) {
|
|
85
|
+
var bytes = keyBytes.get(this);
|
|
86
|
+
if (encoding === "hex") return bytesToHex(bytes);
|
|
87
|
+
if (encoding === "base64") return bytesToBase64(bytes);
|
|
88
|
+
throw new Error(`Crypto.AESEncryptionKey.encoded: encoding must be 'hex' or 'base64'`);
|
|
89
|
+
}
|
|
90
|
+
}], [{
|
|
91
|
+
key: "generate",
|
|
92
|
+
value: async function generate() {
|
|
93
|
+
var size = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 256;
|
|
94
|
+
if (!KEY_SIZES.includes(size)) {
|
|
95
|
+
throw new Error(`Crypto.AESEncryptionKey.generate: size must be one of: ${KEY_SIZES.join(", ")}`);
|
|
96
|
+
}
|
|
97
|
+
var bytes = new Uint8Array(size / 8);
|
|
98
|
+
engine.random(bytes);
|
|
99
|
+
return new AESEncryptionKey2(bytes);
|
|
100
|
+
}
|
|
101
|
+
}, {
|
|
102
|
+
key: "import",
|
|
103
|
+
value: async function _import(input, encoding) {
|
|
104
|
+
var verb = "Crypto.AESEncryptionKey.import";
|
|
105
|
+
var bytes;
|
|
106
|
+
if (typeof input === "string") {
|
|
107
|
+
if (encoding === "hex") bytes = hexToBytes(input, verb);
|
|
108
|
+
else if (encoding === "base64") bytes = base64ToBytes(input, verb);
|
|
109
|
+
else throw new Error(`${verb}: encoding must be 'hex' or 'base64'`);
|
|
110
|
+
} else if (input instanceof Uint8Array) {
|
|
111
|
+
bytes = exactBytes(input);
|
|
112
|
+
} else {
|
|
113
|
+
throw new TypeError(`${verb}: expected bytes or an encoded string`);
|
|
114
|
+
}
|
|
115
|
+
if (!KEY_SIZES.includes(bytes.length * 8)) {
|
|
116
|
+
throw new Error(`${verb}: key must be 128, 192, or 256 bits, got ${bytes.length * 8}`);
|
|
117
|
+
}
|
|
118
|
+
return new AESEncryptionKey2(bytes);
|
|
119
|
+
}
|
|
120
|
+
}]);
|
|
121
|
+
return AESEncryptionKey2;
|
|
122
|
+
})();
|
|
123
|
+
var AESSealedData = /* @__PURE__ */ (function() {
|
|
124
|
+
"use strict";
|
|
125
|
+
function AESSealedData2(parts) {
|
|
126
|
+
_class_call_check(this, AESSealedData2);
|
|
127
|
+
if (parts.iv.length === 0) throw new Error("Crypto.AESSealedData: iv must not be empty");
|
|
128
|
+
assertTagLength(parts.tag.length, "Crypto.AESSealedData");
|
|
129
|
+
sealedParts.set(this, parts);
|
|
130
|
+
}
|
|
131
|
+
_create_class(AESSealedData2, [
|
|
132
|
+
{
|
|
133
|
+
key: "ivSize",
|
|
134
|
+
get: function get() {
|
|
135
|
+
return sealedParts.get(this).iv.length;
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
key: "tagSize",
|
|
140
|
+
get: function get() {
|
|
141
|
+
return sealedParts.get(this).tag.length;
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
key: "combinedSize",
|
|
146
|
+
get: function get() {
|
|
147
|
+
var parts = sealedParts.get(this);
|
|
148
|
+
return parts.iv.length + parts.ciphertext.length + parts.tag.length;
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
key: "iv",
|
|
153
|
+
value: async function iv(encoding) {
|
|
154
|
+
return encodeParts(sealedParts.get(this).iv, encoding);
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
key: "tag",
|
|
159
|
+
value: async function tag(encoding) {
|
|
160
|
+
return encodeParts(sealedParts.get(this).tag, encoding);
|
|
161
|
+
}
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
key: "ciphertext",
|
|
165
|
+
value: async function ciphertext(options) {
|
|
166
|
+
var parts = sealedParts.get(this);
|
|
167
|
+
var bytes = (options === null || options === void 0 ? void 0 : options.includeTag) ? concatBytes([parts.ciphertext, parts.tag]) : parts.ciphertext;
|
|
168
|
+
return encodeParts(bytes, options === null || options === void 0 ? void 0 : options.encoding);
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
key: "combined",
|
|
173
|
+
value: async function combined(encoding) {
|
|
174
|
+
var parts = sealedParts.get(this);
|
|
175
|
+
return encodeParts(concatBytes([
|
|
176
|
+
parts.iv,
|
|
177
|
+
parts.ciphertext,
|
|
178
|
+
parts.tag
|
|
179
|
+
]), encoding);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
], [
|
|
183
|
+
{
|
|
184
|
+
key: "fromCombined",
|
|
185
|
+
value: function fromCombined(combined) {
|
|
186
|
+
var config = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
|
|
187
|
+
var _config_ivLength, _config_tagLength;
|
|
188
|
+
var verb = "Crypto.AESSealedData.fromCombined";
|
|
189
|
+
var ivLength = (_config_ivLength = config.ivLength) !== null && _config_ivLength !== void 0 ? _config_ivLength : DEFAULT_IV_LENGTH;
|
|
190
|
+
var tagLength = (_config_tagLength = config.tagLength) !== null && _config_tagLength !== void 0 ? _config_tagLength : DEFAULT_TAG_LENGTH;
|
|
191
|
+
assertTagLength(tagLength, verb);
|
|
192
|
+
if (!Number.isInteger(ivLength) || ivLength <= 0) {
|
|
193
|
+
throw new Error(`${verb}: ivLength must be a positive integer`);
|
|
194
|
+
}
|
|
195
|
+
var bytes = toBytes(combined, verb);
|
|
196
|
+
if (bytes.length < ivLength + tagLength) {
|
|
197
|
+
throw new Error(`${verb}: combined data is shorter than its iv and tag`);
|
|
198
|
+
}
|
|
199
|
+
return new AESSealedData2({
|
|
200
|
+
iv: exactBytes(bytes.subarray(0, ivLength)),
|
|
201
|
+
ciphertext: exactBytes(bytes.subarray(ivLength, bytes.length - tagLength)),
|
|
202
|
+
tag: exactBytes(bytes.subarray(bytes.length - tagLength))
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
key: "fromParts",
|
|
208
|
+
value: function fromParts(ivInput, ciphertextInput, tagOrLength) {
|
|
209
|
+
var verb = "Crypto.AESSealedData.fromParts";
|
|
210
|
+
var iv = toBytes(ivInput, verb);
|
|
211
|
+
var ciphertext = toBytes(ciphertextInput, verb);
|
|
212
|
+
if (tagOrLength === void 0 || typeof tagOrLength === "number") {
|
|
213
|
+
var tagLength = tagOrLength !== null && tagOrLength !== void 0 ? tagOrLength : DEFAULT_TAG_LENGTH;
|
|
214
|
+
assertTagLength(tagLength, verb);
|
|
215
|
+
if (ciphertext.length < tagLength) {
|
|
216
|
+
throw new Error(`${verb}: ciphertext is shorter than its tag`);
|
|
217
|
+
}
|
|
218
|
+
return new AESSealedData2({
|
|
219
|
+
iv,
|
|
220
|
+
ciphertext: exactBytes(ciphertext.subarray(0, ciphertext.length - tagLength)),
|
|
221
|
+
tag: exactBytes(ciphertext.subarray(ciphertext.length - tagLength))
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
var tag = toBytes(tagOrLength, verb);
|
|
225
|
+
assertTagLength(tag.length, verb);
|
|
226
|
+
return new AESSealedData2({
|
|
227
|
+
iv,
|
|
228
|
+
ciphertext,
|
|
229
|
+
tag
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
key: "fromSeal",
|
|
235
|
+
value: (function fromSeal(iv, ciphertextWithTag, tagLength) {
|
|
236
|
+
return new AESSealedData2({
|
|
237
|
+
iv,
|
|
238
|
+
ciphertext: exactBytes(ciphertextWithTag.subarray(0, ciphertextWithTag.length - tagLength)),
|
|
239
|
+
tag: exactBytes(ciphertextWithTag.subarray(ciphertextWithTag.length - tagLength))
|
|
240
|
+
});
|
|
241
|
+
})
|
|
242
|
+
}
|
|
243
|
+
]);
|
|
244
|
+
return AESSealedData2;
|
|
245
|
+
})();
|
|
246
|
+
async function keyMaterial(key, verb) {
|
|
247
|
+
var own = keyBytes.get(key);
|
|
248
|
+
if (own) return exactBytes(own);
|
|
249
|
+
if (key && typeof key.bytes === "function") return exactBytes(await key.bytes());
|
|
250
|
+
throw new TypeError(`${verb}: expected an AESEncryptionKey`);
|
|
251
|
+
}
|
|
252
|
+
async function partsOf(sealed, verb) {
|
|
253
|
+
var own = sealedParts.get(sealed);
|
|
254
|
+
if (own) {
|
|
255
|
+
return {
|
|
256
|
+
iv: exactBytes(own.iv),
|
|
257
|
+
ciphertext: exactBytes(own.ciphertext),
|
|
258
|
+
tag: exactBytes(own.tag)
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
if (sealed && typeof sealed.iv === "function" && typeof sealed.combined === "function") {
|
|
262
|
+
var iv = exactBytes(await sealed.iv());
|
|
263
|
+
var tag = exactBytes(await sealed.tag());
|
|
264
|
+
var ciphertext = exactBytes(await sealed.ciphertext({
|
|
265
|
+
encoding: "bytes",
|
|
266
|
+
includeTag: false
|
|
267
|
+
}));
|
|
268
|
+
return {
|
|
269
|
+
iv,
|
|
270
|
+
ciphertext,
|
|
271
|
+
tag
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
throw new TypeError(`${verb}: expected an AESSealedData`);
|
|
275
|
+
}
|
|
276
|
+
async function aesEncrypt(plaintext, key) {
|
|
277
|
+
var options = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
|
|
278
|
+
var _options_tagLength;
|
|
279
|
+
var verb = "Crypto.aesEncrypt";
|
|
280
|
+
var tagLength = (_options_tagLength = options.tagLength) !== null && _options_tagLength !== void 0 ? _options_tagLength : DEFAULT_TAG_LENGTH;
|
|
281
|
+
assertTagLength(tagLength, verb);
|
|
282
|
+
var iv;
|
|
283
|
+
var nonce = options.nonce;
|
|
284
|
+
if (nonce && "bytes" in nonce && nonce.bytes !== void 0) {
|
|
285
|
+
iv = toBytes(nonce.bytes, verb);
|
|
286
|
+
if (iv.length === 0) throw new Error(`${verb}: nonce bytes must not be empty`);
|
|
287
|
+
} else {
|
|
288
|
+
var length = nonce && "length" in nonce && nonce.length !== void 0 ? nonce.length : DEFAULT_IV_LENGTH;
|
|
289
|
+
if (!Number.isInteger(length) || length <= 0) {
|
|
290
|
+
throw new Error(`${verb}: nonce length must be a positive integer`);
|
|
291
|
+
}
|
|
292
|
+
iv = new Uint8Array(length);
|
|
293
|
+
engine.random(iv);
|
|
294
|
+
}
|
|
295
|
+
var additionalData = options.additionalData === void 0 ? void 0 : toBytes(options.additionalData, verb);
|
|
296
|
+
var plainBytes = toBytes(plaintext, verb);
|
|
297
|
+
var sealed = await engine.seal(await keyMaterial(key, verb), iv, plainBytes, additionalData, tagLength);
|
|
298
|
+
var actualTag = sealed.length - plainBytes.length;
|
|
299
|
+
return AESSealedData.fromSeal(iv, sealed, actualTag > 0 ? actualTag : tagLength);
|
|
300
|
+
}
|
|
301
|
+
async function aesDecrypt(sealedData, key) {
|
|
302
|
+
var options = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
|
|
303
|
+
var verb = "Crypto.aesDecrypt";
|
|
304
|
+
var parts = await partsOf(sealedData, verb);
|
|
305
|
+
var additionalData = options.additionalData === void 0 ? void 0 : toBytes(options.additionalData, verb);
|
|
306
|
+
var plaintext = await engine.open(await keyMaterial(key, verb), parts.iv, concatBytes([parts.ciphertext, parts.tag]), additionalData, parts.tag.length);
|
|
307
|
+
return options.output === "base64" ? bytesToBase64(plaintext) : plaintext;
|
|
308
|
+
}
|
|
309
|
+
return {
|
|
310
|
+
AESEncryptionKey,
|
|
311
|
+
AESSealedData,
|
|
312
|
+
aesEncrypt,
|
|
313
|
+
aesDecrypt
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
export { assertTagLength, createAesApi, toBytes };
|
|
318
|
+
//# sourceMappingURL=aes.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aes.native.js","names":[],"sources":["esm/platform/crypto/aes.native.js"],"sourcesContent":["import { base64ToBytes, bytesToBase64, bytesToHex, concatBytes, exactBytes, hexToBytes } from \"./bytes\";\nfunction _class_call_check(instance, Constructor) {\n if (!(instance instanceof Constructor)) throw new TypeError(\"Cannot call a class as a function\");\n}\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\nfunction _create_class(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\nfunction _define_property(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else obj[key] = value;\n return obj;\n}\nvar KEY_SIZES = [\n 128,\n 192,\n 256\n];\nvar TAG_LENGTHS = [\n 16,\n 15,\n 14,\n 13,\n 12,\n 8,\n 4\n];\nvar DEFAULT_IV_LENGTH = 12;\nvar DEFAULT_TAG_LENGTH = 16;\nfunction assertTagLength(tagLength, verb) {\n if (!TAG_LENGTHS.includes(tagLength)) {\n throw new Error(`${verb}: tagLength must be one of: ${TAG_LENGTHS.join(\", \")}`);\n }\n}\nfunction toBytes(input, verb) {\n if (typeof input === \"string\") return base64ToBytes(input, verb);\n if (input instanceof ArrayBuffer) return new Uint8Array(input.slice(0));\n if (ArrayBuffer.isView(input) && input.buffer instanceof ArrayBuffer) {\n return exactBytes(new Uint8Array(input.buffer, input.byteOffset, input.byteLength));\n }\n throw new TypeError(`${verb}: expected a base64 string, Uint8Array, or ArrayBuffer`);\n}\nvar sealedParts = /* @__PURE__ */ new WeakMap();\nvar keyBytes = /* @__PURE__ */ new WeakMap();\nfunction encodeParts(bytes, encoding) {\n return encoding === \"base64\" ? bytesToBase64(bytes) : exactBytes(bytes);\n}\nfunction createAesApi(engine) {\n var AESEncryptionKey = /* @__PURE__ */ (function() {\n \"use strict\";\n function AESEncryptionKey2(bytes) {\n _class_call_check(this, AESEncryptionKey2);\n _define_property(this, \"size\", void 0);\n if (!KEY_SIZES.includes(bytes.length * 8)) {\n throw new Error(`Crypto.AESEncryptionKey: key must be 128, 192, or 256 bits, got ${bytes.length * 8}`);\n }\n this.size = bytes.length * 8;\n keyBytes.set(this, exactBytes(bytes));\n }\n _create_class(AESEncryptionKey2, [\n {\n key: \"bytes\",\n value: async function bytes() {\n return exactBytes(keyBytes.get(this));\n }\n },\n {\n key: \"encoded\",\n value: async function encoded(encoding) {\n var bytes = keyBytes.get(this);\n if (encoding === \"hex\") return bytesToHex(bytes);\n if (encoding === \"base64\") return bytesToBase64(bytes);\n throw new Error(`Crypto.AESEncryptionKey.encoded: encoding must be 'hex' or 'base64'`);\n }\n }\n ], [\n {\n key: \"generate\",\n value: async function generate() {\n var size = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 256;\n if (!KEY_SIZES.includes(size)) {\n throw new Error(`Crypto.AESEncryptionKey.generate: size must be one of: ${KEY_SIZES.join(\", \")}`);\n }\n var bytes = new Uint8Array(size / 8);\n engine.random(bytes);\n return new AESEncryptionKey2(bytes);\n }\n },\n {\n key: \"import\",\n value: async function _import(input, encoding) {\n var verb = \"Crypto.AESEncryptionKey.import\";\n var bytes;\n if (typeof input === \"string\") {\n if (encoding === \"hex\") bytes = hexToBytes(input, verb);\n else if (encoding === \"base64\") bytes = base64ToBytes(input, verb);\n else throw new Error(`${verb}: encoding must be 'hex' or 'base64'`);\n } else if (input instanceof Uint8Array) {\n bytes = exactBytes(input);\n } else {\n throw new TypeError(`${verb}: expected bytes or an encoded string`);\n }\n if (!KEY_SIZES.includes(bytes.length * 8)) {\n throw new Error(`${verb}: key must be 128, 192, or 256 bits, got ${bytes.length * 8}`);\n }\n return new AESEncryptionKey2(bytes);\n }\n }\n ]);\n return AESEncryptionKey2;\n })();\n var AESSealedData = /* @__PURE__ */ (function() {\n \"use strict\";\n function AESSealedData2(parts) {\n _class_call_check(this, AESSealedData2);\n if (parts.iv.length === 0) throw new Error(\"Crypto.AESSealedData: iv must not be empty\");\n assertTagLength(parts.tag.length, \"Crypto.AESSealedData\");\n sealedParts.set(this, parts);\n }\n _create_class(AESSealedData2, [\n {\n key: \"ivSize\",\n get: function get() {\n return sealedParts.get(this).iv.length;\n }\n },\n {\n key: \"tagSize\",\n get: function get() {\n return sealedParts.get(this).tag.length;\n }\n },\n {\n key: \"combinedSize\",\n get: function get() {\n var parts = sealedParts.get(this);\n return parts.iv.length + parts.ciphertext.length + parts.tag.length;\n }\n },\n {\n key: \"iv\",\n value: async function iv(encoding) {\n return encodeParts(sealedParts.get(this).iv, encoding);\n }\n },\n {\n key: \"tag\",\n value: async function tag(encoding) {\n return encodeParts(sealedParts.get(this).tag, encoding);\n }\n },\n {\n key: \"ciphertext\",\n value: async function ciphertext(options) {\n var parts = sealedParts.get(this);\n var bytes = (options === null || options === void 0 ? void 0 : options.includeTag) ? concatBytes([\n parts.ciphertext,\n parts.tag\n ]) : parts.ciphertext;\n return encodeParts(bytes, options === null || options === void 0 ? void 0 : options.encoding);\n }\n },\n {\n key: \"combined\",\n value: async function combined(encoding) {\n var parts = sealedParts.get(this);\n return encodeParts(concatBytes([\n parts.iv,\n parts.ciphertext,\n parts.tag\n ]), encoding);\n }\n }\n ], [\n {\n key: \"fromCombined\",\n value: function fromCombined(combined) {\n var config = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};\n var _config_ivLength, _config_tagLength;\n var verb = \"Crypto.AESSealedData.fromCombined\";\n var ivLength = (_config_ivLength = config.ivLength) !== null && _config_ivLength !== void 0 ? _config_ivLength : DEFAULT_IV_LENGTH;\n var tagLength = (_config_tagLength = config.tagLength) !== null && _config_tagLength !== void 0 ? _config_tagLength : DEFAULT_TAG_LENGTH;\n assertTagLength(tagLength, verb);\n if (!Number.isInteger(ivLength) || ivLength <= 0) {\n throw new Error(`${verb}: ivLength must be a positive integer`);\n }\n var bytes = toBytes(combined, verb);\n if (bytes.length < ivLength + tagLength) {\n throw new Error(`${verb}: combined data is shorter than its iv and tag`);\n }\n return new AESSealedData2({\n iv: exactBytes(bytes.subarray(0, ivLength)),\n ciphertext: exactBytes(bytes.subarray(ivLength, bytes.length - tagLength)),\n tag: exactBytes(bytes.subarray(bytes.length - tagLength))\n });\n }\n },\n {\n key: \"fromParts\",\n value: function fromParts(ivInput, ciphertextInput, tagOrLength) {\n var verb = \"Crypto.AESSealedData.fromParts\";\n var iv = toBytes(ivInput, verb);\n var ciphertext = toBytes(ciphertextInput, verb);\n if (tagOrLength === void 0 || typeof tagOrLength === \"number\") {\n var tagLength = tagOrLength !== null && tagOrLength !== void 0 ? tagOrLength : DEFAULT_TAG_LENGTH;\n assertTagLength(tagLength, verb);\n if (ciphertext.length < tagLength) {\n throw new Error(`${verb}: ciphertext is shorter than its tag`);\n }\n return new AESSealedData2({\n iv,\n ciphertext: exactBytes(ciphertext.subarray(0, ciphertext.length - tagLength)),\n tag: exactBytes(ciphertext.subarray(ciphertext.length - tagLength))\n });\n }\n var tag = toBytes(tagOrLength, verb);\n assertTagLength(tag.length, verb);\n return new AESSealedData2({\n iv,\n ciphertext,\n tag\n });\n }\n },\n {\n key: \"fromSeal\",\n value: (\n // internal: aesEncrypt builds sealed data from engine output without\n // going through the public parsers (which would just re-split it).\n function fromSeal(iv, ciphertextWithTag, tagLength) {\n return new AESSealedData2({\n iv,\n ciphertext: exactBytes(ciphertextWithTag.subarray(0, ciphertextWithTag.length - tagLength)),\n tag: exactBytes(ciphertextWithTag.subarray(ciphertextWithTag.length - tagLength))\n });\n }\n )\n }\n ]);\n return AESSealedData2;\n })();\n async function keyMaterial(key, verb) {\n var own = keyBytes.get(key);\n if (own) return exactBytes(own);\n if (key && typeof key.bytes === \"function\") return exactBytes(await key.bytes());\n throw new TypeError(`${verb}: expected an AESEncryptionKey`);\n }\n async function partsOf(sealed, verb) {\n var own = sealedParts.get(sealed);\n if (own) {\n return {\n iv: exactBytes(own.iv),\n ciphertext: exactBytes(own.ciphertext),\n tag: exactBytes(own.tag)\n };\n }\n if (sealed && typeof sealed.iv === \"function\" && typeof sealed.combined === \"function\") {\n var iv = exactBytes(await sealed.iv());\n var tag = exactBytes(await sealed.tag());\n var ciphertext = exactBytes(await sealed.ciphertext({\n encoding: \"bytes\",\n includeTag: false\n }));\n return {\n iv,\n ciphertext,\n tag\n };\n }\n throw new TypeError(`${verb}: expected an AESSealedData`);\n }\n async function aesEncrypt(plaintext, key) {\n var options = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};\n var _options_tagLength;\n var verb = \"Crypto.aesEncrypt\";\n var tagLength = (_options_tagLength = options.tagLength) !== null && _options_tagLength !== void 0 ? _options_tagLength : DEFAULT_TAG_LENGTH;\n assertTagLength(tagLength, verb);\n var iv;\n var nonce = options.nonce;\n if (nonce && \"bytes\" in nonce && nonce.bytes !== void 0) {\n iv = toBytes(nonce.bytes, verb);\n if (iv.length === 0) throw new Error(`${verb}: nonce bytes must not be empty`);\n } else {\n var length = nonce && \"length\" in nonce && nonce.length !== void 0 ? nonce.length : DEFAULT_IV_LENGTH;\n if (!Number.isInteger(length) || length <= 0) {\n throw new Error(`${verb}: nonce length must be a positive integer`);\n }\n iv = new Uint8Array(length);\n engine.random(iv);\n }\n var additionalData = options.additionalData === void 0 ? void 0 : toBytes(options.additionalData, verb);\n var plainBytes = toBytes(plaintext, verb);\n var sealed = await engine.seal(await keyMaterial(key, verb), iv, plainBytes, additionalData, tagLength);\n var actualTag = sealed.length - plainBytes.length;\n return AESSealedData.fromSeal(iv, sealed, actualTag > 0 ? actualTag : tagLength);\n }\n async function aesDecrypt(sealedData, key) {\n var options = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};\n var verb = \"Crypto.aesDecrypt\";\n var parts = await partsOf(sealedData, verb);\n var additionalData = options.additionalData === void 0 ? void 0 : toBytes(options.additionalData, verb);\n var plaintext = await engine.open(await keyMaterial(key, verb), parts.iv, concatBytes([\n parts.ciphertext,\n parts.tag\n ]), additionalData, parts.tag.length);\n return options.output === \"base64\" ? bytesToBase64(plaintext) : plaintext;\n }\n return {\n AESEncryptionKey,\n AESSealedData,\n aesEncrypt,\n aesDecrypt\n };\n}\nexport {\n assertTagLength,\n createAesApi,\n toBytes\n};\n//# sourceMappingURL=aes.js.map\n"],"mappings":"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"}
|