one 2.6.19 → 2.6.21
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/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/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/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/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/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 +1 -0
- package/src/one.ts +3 -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/specs/OneCrypto.nitro.ts +19 -0
- package/types/index.d.ts +1 -0
- 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/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/specs/OneCrypto.nitro.d.ts +2 -0
- package/types/platform/specs/OneCrypto.nitro.d.ts.map +1 -1
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { bytesToBase64, bytesToHex, utf8Encode } from "./bytes.mjs";
|
|
2
|
+
import { bufferSourceRange } from "./digest.mjs";
|
|
3
|
+
|
|
4
|
+
const DIGEST_ALGORITHMS = [
|
|
5
|
+
"MD5",
|
|
6
|
+
"SHA-1",
|
|
7
|
+
"SHA-256",
|
|
8
|
+
"SHA-384",
|
|
9
|
+
"SHA-512"
|
|
10
|
+
];
|
|
11
|
+
function assertDigestAlgorithm(algorithm, verb) {
|
|
12
|
+
if (!DIGEST_ALGORITHMS.includes(algorithm)) {
|
|
13
|
+
throw new Error(`${verb}: unknown algorithm ${JSON.stringify(algorithm)}. Expected one of: ${DIGEST_ALGORITHMS.join(", ")}`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function createDigestApi(source) {
|
|
17
|
+
async function digest(algorithm, data) {
|
|
18
|
+
assertDigestAlgorithm(algorithm, "Crypto.digest");
|
|
19
|
+
const { buffer, offset, length } = bufferSourceRange(data, "Crypto.digest");
|
|
20
|
+
return source(algorithm, buffer, offset, length);
|
|
21
|
+
}
|
|
22
|
+
async function digestString(algorithm, data, options = {}) {
|
|
23
|
+
assertDigestAlgorithm(algorithm, "Crypto.digestString");
|
|
24
|
+
if (typeof data !== "string") {
|
|
25
|
+
throw new TypeError("Crypto.digestString: data must be a string");
|
|
26
|
+
}
|
|
27
|
+
const encoding = options?.encoding ?? "hex";
|
|
28
|
+
if (encoding !== "hex" && encoding !== "base64") {
|
|
29
|
+
throw new Error(`Crypto.digestString: encoding must be 'hex' or 'base64'`);
|
|
30
|
+
}
|
|
31
|
+
const bytes = utf8Encode(data);
|
|
32
|
+
const hashed = new Uint8Array(await source(algorithm, bytes.buffer, 0, bytes.length));
|
|
33
|
+
return encoding === "base64" ? bytesToBase64(hashed) : bytesToHex(hashed);
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
digest,
|
|
37
|
+
digestString
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export { DIGEST_ALGORITHMS, assertDigestAlgorithm, createDigestApi };
|
|
42
|
+
//# sourceMappingURL=digest-api.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"digest-api.js","names":[],"sources":["esm/platform/crypto/digest-api.js"],"sourcesContent":["import { bytesToBase64, bytesToHex, utf8Encode } from \"./bytes\";\nimport { bufferSourceRange } from \"./digest\";\nconst DIGEST_ALGORITHMS = [\n \"MD5\",\n \"SHA-1\",\n \"SHA-256\",\n \"SHA-384\",\n \"SHA-512\"\n];\nfunction assertDigestAlgorithm(algorithm, verb) {\n if (!DIGEST_ALGORITHMS.includes(algorithm)) {\n throw new Error(\n `${verb}: unknown algorithm ${JSON.stringify(algorithm)}. Expected one of: ${DIGEST_ALGORITHMS.join(\", \")}`\n );\n }\n}\nfunction createDigestApi(source) {\n async function digest(algorithm, data) {\n assertDigestAlgorithm(algorithm, \"Crypto.digest\");\n const { buffer, offset, length } = bufferSourceRange(data, \"Crypto.digest\");\n return source(algorithm, buffer, offset, length);\n }\n async function digestString(algorithm, data, options = {}) {\n assertDigestAlgorithm(algorithm, \"Crypto.digestString\");\n if (typeof data !== \"string\") {\n throw new TypeError(\"Crypto.digestString: data must be a string\");\n }\n const encoding = options?.encoding ?? \"hex\";\n if (encoding !== \"hex\" && encoding !== \"base64\") {\n throw new Error(`Crypto.digestString: encoding must be 'hex' or 'base64'`);\n }\n const bytes = utf8Encode(data);\n const hashed = new Uint8Array(await source(algorithm, bytes.buffer, 0, bytes.length));\n return encoding === \"base64\" ? bytesToBase64(hashed) : bytesToHex(hashed);\n }\n return { digest, digestString };\n}\nexport {\n DIGEST_ALGORITHMS,\n assertDigestAlgorithm,\n createDigestApi\n};\n//# sourceMappingURL=digest-api.js.map\n"],"mappings":";;;;AAEA,MAAM,oBAAoB;CACxB;CACA;CACA;CACA;CACA;AACF;AACA,SAAS,sBAAsB,WAAW,MAAM;CAC9C,IAAI,CAAC,kBAAkB,SAAS,SAAS,GAAG;EAC1C,MAAM,IAAI,MACR,GAAG,KAAK,sBAAsB,KAAK,UAAU,SAAS,EAAE,qBAAqB,kBAAkB,KAAK,IAAI,GAC1G;CACF;AACF;AACA,SAAS,gBAAgB,QAAQ;CAC/B,eAAe,OAAO,WAAW,MAAM;EACrC,sBAAsB,WAAW,eAAe;EAChD,MAAM,EAAE,QAAQ,QAAQ,WAAW,kBAAkB,MAAM,eAAe;EAC1E,OAAO,OAAO,WAAW,QAAQ,QAAQ,MAAM;CACjD;CACA,eAAe,aAAa,WAAW,MAAM,UAAU,CAAC,GAAG;EACzD,sBAAsB,WAAW,qBAAqB;EACtD,IAAI,OAAO,SAAS,UAAU;GAC5B,MAAM,IAAI,UAAU,4CAA4C;EAClE;EACA,MAAM,WAAW,SAAS,YAAY;EACtC,IAAI,aAAa,SAAS,aAAa,UAAU;GAC/C,MAAM,IAAI,MAAM,yDAAyD;EAC3E;EACA,MAAM,QAAQ,WAAW,IAAI;EAC7B,MAAM,SAAS,IAAI,WAAW,MAAM,OAAO,WAAW,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC;EACpF,OAAO,aAAa,WAAW,cAAc,MAAM,IAAI,WAAW,MAAM;CAC1E;CACA,OAAO;EAAE;EAAQ;CAAa;AAChC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { bytesToBase64, bytesToHex, utf8Encode } from "./bytes.native.js";
|
|
2
|
+
import { bufferSourceRange } from "./digest.native.js";
|
|
3
|
+
|
|
4
|
+
var DIGEST_ALGORITHMS = [
|
|
5
|
+
"MD5",
|
|
6
|
+
"SHA-1",
|
|
7
|
+
"SHA-256",
|
|
8
|
+
"SHA-384",
|
|
9
|
+
"SHA-512"
|
|
10
|
+
];
|
|
11
|
+
function assertDigestAlgorithm(algorithm, verb) {
|
|
12
|
+
if (!DIGEST_ALGORITHMS.includes(algorithm)) {
|
|
13
|
+
throw new Error(`${verb}: unknown algorithm ${JSON.stringify(algorithm)}. Expected one of: ${DIGEST_ALGORITHMS.join(", ")}`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function createDigestApi(source) {
|
|
17
|
+
async function digest(algorithm, data) {
|
|
18
|
+
assertDigestAlgorithm(algorithm, "Crypto.digest");
|
|
19
|
+
var { buffer, offset, length } = bufferSourceRange(data, "Crypto.digest");
|
|
20
|
+
return source(algorithm, buffer, offset, length);
|
|
21
|
+
}
|
|
22
|
+
async function digestString(algorithm, data) {
|
|
23
|
+
var options = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
|
|
24
|
+
var _ref;
|
|
25
|
+
assertDigestAlgorithm(algorithm, "Crypto.digestString");
|
|
26
|
+
if (typeof data !== "string") {
|
|
27
|
+
throw new TypeError("Crypto.digestString: data must be a string");
|
|
28
|
+
}
|
|
29
|
+
var encoding = (_ref = options === null || options === void 0 ? void 0 : options.encoding) !== null && _ref !== void 0 ? _ref : "hex";
|
|
30
|
+
if (encoding !== "hex" && encoding !== "base64") {
|
|
31
|
+
throw new Error(`Crypto.digestString: encoding must be 'hex' or 'base64'`);
|
|
32
|
+
}
|
|
33
|
+
var bytes = utf8Encode(data);
|
|
34
|
+
var hashed = new Uint8Array(await source(algorithm, bytes.buffer, 0, bytes.length));
|
|
35
|
+
return encoding === "base64" ? bytesToBase64(hashed) : bytesToHex(hashed);
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
digest,
|
|
39
|
+
digestString
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export { DIGEST_ALGORITHMS, assertDigestAlgorithm, createDigestApi };
|
|
44
|
+
//# sourceMappingURL=digest-api.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"digest-api.native.js","names":[],"sources":["esm/platform/crypto/digest-api.native.js"],"sourcesContent":["import { bytesToBase64, bytesToHex, utf8Encode } from \"./bytes\";\nimport { bufferSourceRange } from \"./digest\";\nvar DIGEST_ALGORITHMS = [\n \"MD5\",\n \"SHA-1\",\n \"SHA-256\",\n \"SHA-384\",\n \"SHA-512\"\n];\nfunction assertDigestAlgorithm(algorithm, verb) {\n if (!DIGEST_ALGORITHMS.includes(algorithm)) {\n throw new Error(`${verb}: unknown algorithm ${JSON.stringify(algorithm)}. Expected one of: ${DIGEST_ALGORITHMS.join(\", \")}`);\n }\n}\nfunction createDigestApi(source) {\n async function digest(algorithm, data) {\n assertDigestAlgorithm(algorithm, \"Crypto.digest\");\n var { buffer, offset, length } = bufferSourceRange(data, \"Crypto.digest\");\n return source(algorithm, buffer, offset, length);\n }\n async function digestString(algorithm, data) {\n var options = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};\n var _ref;\n assertDigestAlgorithm(algorithm, \"Crypto.digestString\");\n if (typeof data !== \"string\") {\n throw new TypeError(\"Crypto.digestString: data must be a string\");\n }\n var encoding = (_ref = options === null || options === void 0 ? void 0 : options.encoding) !== null && _ref !== void 0 ? _ref : \"hex\";\n if (encoding !== \"hex\" && encoding !== \"base64\") {\n throw new Error(`Crypto.digestString: encoding must be 'hex' or 'base64'`);\n }\n var bytes = utf8Encode(data);\n var hashed = new Uint8Array(await source(algorithm, bytes.buffer, 0, bytes.length));\n return encoding === \"base64\" ? bytesToBase64(hashed) : bytesToHex(hashed);\n }\n return {\n digest,\n digestString\n };\n}\nexport {\n DIGEST_ALGORITHMS,\n assertDigestAlgorithm,\n createDigestApi\n};\n//# sourceMappingURL=digest-api.js.map\n"],"mappings":";;;;AAEA,IAAI,oBAAoB;CACtB;CACA;CACA;CACA;CACA;AACF;AACA,SAAS,sBAAsB,WAAW,MAAM;CAC9C,IAAI,CAAC,kBAAkB,SAAS,SAAS,GAAG;EAC1C,MAAM,IAAI,MAAM,GAAG,KAAK,sBAAsB,KAAK,UAAU,SAAS,EAAE,qBAAqB,kBAAkB,KAAK,IAAI,GAAG;CAC7H;AACF;AACA,SAAS,gBAAgB,QAAQ;CAC/B,eAAe,OAAO,WAAW,MAAM;EACrC,sBAAsB,WAAW,eAAe;EAChD,IAAI,EAAE,QAAQ,QAAQ,WAAW,kBAAkB,MAAM,eAAe;EACxE,OAAO,OAAO,WAAW,QAAQ,QAAQ,MAAM;CACjD;CACA,eAAe,aAAa,WAAW,MAAM;EAC3C,IAAI,UAAU,UAAU,SAAS,KAAK,UAAU,OAAO,KAAK,IAAI,UAAU,KAAK,CAAC;EAChF,IAAI;EACJ,sBAAsB,WAAW,qBAAqB;EACtD,IAAI,OAAO,SAAS,UAAU;GAC5B,MAAM,IAAI,UAAU,4CAA4C;EAClE;EACA,IAAI,YAAY,OAAO,YAAY,QAAQ,YAAY,KAAK,IAAI,KAAK,IAAI,QAAQ,cAAc,QAAQ,SAAS,KAAK,IAAI,OAAO;EAChI,IAAI,aAAa,SAAS,aAAa,UAAU;GAC/C,MAAM,IAAI,MAAM,yDAAyD;EAC3E;EACA,IAAI,QAAQ,WAAW,IAAI;EAC3B,IAAI,SAAS,IAAI,WAAW,MAAM,OAAO,WAAW,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC;EAClF,OAAO,aAAa,WAAW,cAAc,MAAM,IAAI,WAAW,MAAM;CAC1E;CACA,OAAO;EACL;EACA;CACF;AACF"}
|
|
@@ -3,24 +3,32 @@ function namedError(name, message) {
|
|
|
3
3
|
error.name = name;
|
|
4
4
|
return error;
|
|
5
5
|
}
|
|
6
|
+
function bufferSourceRange(data, verb) {
|
|
7
|
+
let buffer;
|
|
8
|
+
let offset = 0;
|
|
9
|
+
let length;
|
|
10
|
+
if (data instanceof ArrayBuffer) {
|
|
11
|
+
buffer = data;
|
|
12
|
+
length = data.byteLength;
|
|
13
|
+
} else if (ArrayBuffer.isView(data) && data.buffer instanceof ArrayBuffer) {
|
|
14
|
+
buffer = data.buffer;
|
|
15
|
+
offset = data.byteOffset;
|
|
16
|
+
length = data.byteLength;
|
|
17
|
+
} else {
|
|
18
|
+
throw new TypeError(`${verb}: expected an ArrayBuffer or view.`);
|
|
19
|
+
}
|
|
20
|
+
new Uint8Array(buffer, offset, length);
|
|
21
|
+
return {
|
|
22
|
+
buffer,
|
|
23
|
+
offset,
|
|
24
|
+
length
|
|
25
|
+
};
|
|
26
|
+
}
|
|
6
27
|
function installDigestPolyfill(source, target = globalThis) {
|
|
7
28
|
const crypto = target.crypto;
|
|
8
29
|
if (crypto == null || typeof crypto.subtle?.digest === "function") return;
|
|
9
30
|
const digest = async (algorithm, data) => {
|
|
10
|
-
|
|
11
|
-
let offset = 0;
|
|
12
|
-
let length;
|
|
13
|
-
if (data instanceof ArrayBuffer) {
|
|
14
|
-
buffer = data;
|
|
15
|
-
length = data.byteLength;
|
|
16
|
-
} else if (ArrayBuffer.isView(data) && data.buffer instanceof ArrayBuffer) {
|
|
17
|
-
buffer = data.buffer;
|
|
18
|
-
offset = data.byteOffset;
|
|
19
|
-
length = data.byteLength;
|
|
20
|
-
} else {
|
|
21
|
-
throw new TypeError("crypto.subtle.digest: expected an ArrayBuffer or view.");
|
|
22
|
-
}
|
|
23
|
-
new Uint8Array(buffer, offset, length);
|
|
31
|
+
const { buffer, offset, length } = bufferSourceRange(data, "crypto.subtle.digest");
|
|
24
32
|
let name;
|
|
25
33
|
if (algorithm !== null && (typeof algorithm === "object" || typeof algorithm === "function")) {
|
|
26
34
|
const value = algorithm.name;
|
|
@@ -44,5 +52,5 @@ function installDigestPolyfill(source, target = globalThis) {
|
|
|
44
52
|
else crypto.subtle.digest = digest;
|
|
45
53
|
}
|
|
46
54
|
|
|
47
|
-
export { installDigestPolyfill };
|
|
55
|
+
export { bufferSourceRange, installDigestPolyfill };
|
|
48
56
|
//# sourceMappingURL=digest.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"digest.js","names":[],"sources":["esm/platform/crypto/digest.js"],"sourcesContent":["function namedError(name, message) {\n const error = new Error(message);\n error.name = name;\n return error;\n}\nfunction
|
|
1
|
+
{"version":3,"file":"digest.js","names":[],"sources":["esm/platform/crypto/digest.js"],"sourcesContent":["function namedError(name, message) {\n const error = new Error(message);\n error.name = name;\n return error;\n}\nfunction bufferSourceRange(data, verb) {\n let buffer;\n let offset = 0;\n let length;\n if (data instanceof ArrayBuffer) {\n buffer = data;\n length = data.byteLength;\n } else if (ArrayBuffer.isView(data) && data.buffer instanceof ArrayBuffer) {\n buffer = data.buffer;\n offset = data.byteOffset;\n length = data.byteLength;\n } else {\n throw new TypeError(`${verb}: expected an ArrayBuffer or view.`);\n }\n new Uint8Array(buffer, offset, length);\n return { buffer, offset, length };\n}\nfunction installDigestPolyfill(source, target = globalThis) {\n const crypto = target.crypto;\n if (crypto == null || typeof crypto.subtle?.digest === \"function\") return;\n const digest = async (algorithm, data) => {\n const { buffer, offset, length } = bufferSourceRange(data, \"crypto.subtle.digest\");\n let name;\n if (algorithm !== null && (typeof algorithm === \"object\" || typeof algorithm === \"function\")) {\n const value = algorithm.name;\n if (value === void 0) {\n throw new TypeError(\"crypto.subtle.digest: algorithm.name is required.\");\n }\n name = `${value}`;\n } else {\n name = `${algorithm}`;\n }\n if (!/^sha-(1|256|384|512)$/i.test(name)) {\n throw namedError(\"NotSupportedError\", `Unsupported digest algorithm: ${name}.`);\n }\n try {\n return await source(name.toUpperCase(), buffer, offset, length);\n } catch (error) {\n throw namedError(\n \"OperationError\",\n error instanceof Error ? error.message : \"Native digest failed.\"\n );\n }\n };\n if (crypto.subtle == null) crypto.subtle = { digest };\n else crypto.subtle.digest = digest;\n}\nexport {\n bufferSourceRange,\n installDigestPolyfill\n};\n//# sourceMappingURL=digest.js.map\n"],"mappings":";AAAA,SAAS,WAAW,MAAM,SAAS;CACjC,MAAM,QAAQ,IAAI,MAAM,OAAO;CAC/B,MAAM,OAAO;CACb,OAAO;AACT;AACA,SAAS,kBAAkB,MAAM,MAAM;CACrC,IAAI;CACJ,IAAI,SAAS;CACb,IAAI;CACJ,IAAI,gBAAgB,aAAa;EAC/B,SAAS;EACT,SAAS,KAAK;CAChB,OAAO,IAAI,YAAY,OAAO,IAAI,KAAK,KAAK,kBAAkB,aAAa;EACzE,SAAS,KAAK;EACd,SAAS,KAAK;EACd,SAAS,KAAK;CAChB,OAAO;EACL,MAAM,IAAI,UAAU,GAAG,KAAK,mCAAmC;CACjE;CACA,IAAI,WAAW,QAAQ,QAAQ,MAAM;CACrC,OAAO;EAAE;EAAQ;EAAQ;CAAO;AAClC;AACA,SAAS,sBAAsB,QAAQ,SAAS,YAAY;CAC1D,MAAM,SAAS,OAAO;CACtB,IAAI,UAAU,QAAQ,OAAO,OAAO,QAAQ,WAAW,YAAY;CACnE,MAAM,SAAS,OAAO,WAAW,SAAS;EACxC,MAAM,EAAE,QAAQ,QAAQ,WAAW,kBAAkB,MAAM,sBAAsB;EACjF,IAAI;EACJ,IAAI,cAAc,SAAS,OAAO,cAAc,YAAY,OAAO,cAAc,aAAa;GAC5F,MAAM,QAAQ,UAAU;GACxB,IAAI,UAAU,KAAK,GAAG;IACpB,MAAM,IAAI,UAAU,mDAAmD;GACzE;GACA,OAAO,GAAG;EACZ,OAAO;GACL,OAAO,GAAG;EACZ;EACA,IAAI,CAAC,yBAAyB,KAAK,IAAI,GAAG;GACxC,MAAM,WAAW,qBAAqB,iCAAiC,KAAK,EAAE;EAChF;EACA,IAAI;GACF,OAAO,MAAM,OAAO,KAAK,YAAY,GAAG,QAAQ,QAAQ,MAAM;EAChE,SAAS,OAAO;GACd,MAAM,WACJ,kBACA,iBAAiB,QAAQ,MAAM,UAAU,uBAC3C;EACF;CACF;CACA,IAAI,OAAO,UAAU,MAAM,OAAO,SAAS,EAAE,OAAO;MAC/C,OAAO,OAAO,SAAS;AAC9B"}
|
|
@@ -3,26 +3,34 @@ function namedError(name, message) {
|
|
|
3
3
|
error.name = name;
|
|
4
4
|
return error;
|
|
5
5
|
}
|
|
6
|
+
function bufferSourceRange(data, verb) {
|
|
7
|
+
var buffer;
|
|
8
|
+
var offset = 0;
|
|
9
|
+
var length;
|
|
10
|
+
if (data instanceof ArrayBuffer) {
|
|
11
|
+
buffer = data;
|
|
12
|
+
length = data.byteLength;
|
|
13
|
+
} else if (ArrayBuffer.isView(data) && data.buffer instanceof ArrayBuffer) {
|
|
14
|
+
buffer = data.buffer;
|
|
15
|
+
offset = data.byteOffset;
|
|
16
|
+
length = data.byteLength;
|
|
17
|
+
} else {
|
|
18
|
+
throw new TypeError(`${verb}: expected an ArrayBuffer or view.`);
|
|
19
|
+
}
|
|
20
|
+
new Uint8Array(buffer, offset, length);
|
|
21
|
+
return {
|
|
22
|
+
buffer,
|
|
23
|
+
offset,
|
|
24
|
+
length
|
|
25
|
+
};
|
|
26
|
+
}
|
|
6
27
|
function installDigestPolyfill(source) {
|
|
7
28
|
var target = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : globalThis;
|
|
8
29
|
var _crypto_subtle;
|
|
9
30
|
var crypto = target.crypto;
|
|
10
31
|
if (crypto == null || typeof ((_crypto_subtle = crypto.subtle) === null || _crypto_subtle === void 0 ? void 0 : _crypto_subtle.digest) === "function") return;
|
|
11
32
|
var digest = async function digest2(algorithm, data) {
|
|
12
|
-
var buffer;
|
|
13
|
-
var offset = 0;
|
|
14
|
-
var length;
|
|
15
|
-
if (data instanceof ArrayBuffer) {
|
|
16
|
-
buffer = data;
|
|
17
|
-
length = data.byteLength;
|
|
18
|
-
} else if (ArrayBuffer.isView(data) && data.buffer instanceof ArrayBuffer) {
|
|
19
|
-
buffer = data.buffer;
|
|
20
|
-
offset = data.byteOffset;
|
|
21
|
-
length = data.byteLength;
|
|
22
|
-
} else {
|
|
23
|
-
throw new TypeError("crypto.subtle.digest: expected an ArrayBuffer or view.");
|
|
24
|
-
}
|
|
25
|
-
new Uint8Array(buffer, offset, length);
|
|
33
|
+
var { buffer, offset, length } = bufferSourceRange(data, "crypto.subtle.digest");
|
|
26
34
|
var name;
|
|
27
35
|
if (algorithm !== null && (typeof algorithm === "object" || typeof algorithm === "function")) {
|
|
28
36
|
var value = algorithm.name;
|
|
@@ -46,5 +54,5 @@ function installDigestPolyfill(source) {
|
|
|
46
54
|
else crypto.subtle.digest = digest;
|
|
47
55
|
}
|
|
48
56
|
|
|
49
|
-
export { installDigestPolyfill };
|
|
57
|
+
export { bufferSourceRange, installDigestPolyfill };
|
|
50
58
|
//# sourceMappingURL=digest.native.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"digest.native.js","names":[],"sources":["esm/platform/crypto/digest.native.js"],"sourcesContent":["function namedError(name, message) {\n var error = new Error(message);\n error.name = name;\n return error;\n}\nfunction installDigestPolyfill(source) {\n var target = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : globalThis;\n var _crypto_subtle;\n var crypto = target.crypto;\n if (crypto == null || typeof ((_crypto_subtle = crypto.subtle) === null || _crypto_subtle === void 0 ? void 0 : _crypto_subtle.digest) === \"function\") return;\n var digest = async function digest2(algorithm, data) {\n var buffer
|
|
1
|
+
{"version":3,"file":"digest.native.js","names":[],"sources":["esm/platform/crypto/digest.native.js"],"sourcesContent":["function namedError(name, message) {\n var error = new Error(message);\n error.name = name;\n return error;\n}\nfunction bufferSourceRange(data, verb) {\n var buffer;\n var offset = 0;\n var length;\n if (data instanceof ArrayBuffer) {\n buffer = data;\n length = data.byteLength;\n } else if (ArrayBuffer.isView(data) && data.buffer instanceof ArrayBuffer) {\n buffer = data.buffer;\n offset = data.byteOffset;\n length = data.byteLength;\n } else {\n throw new TypeError(`${verb}: expected an ArrayBuffer or view.`);\n }\n new Uint8Array(buffer, offset, length);\n return {\n buffer,\n offset,\n length\n };\n}\nfunction installDigestPolyfill(source) {\n var target = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : globalThis;\n var _crypto_subtle;\n var crypto = target.crypto;\n if (crypto == null || typeof ((_crypto_subtle = crypto.subtle) === null || _crypto_subtle === void 0 ? void 0 : _crypto_subtle.digest) === \"function\") return;\n var digest = async function digest2(algorithm, data) {\n var { buffer, offset, length } = bufferSourceRange(data, \"crypto.subtle.digest\");\n var name;\n if (algorithm !== null && (typeof algorithm === \"object\" || typeof algorithm === \"function\")) {\n var value = algorithm.name;\n if (value === void 0) {\n throw new TypeError(\"crypto.subtle.digest: algorithm.name is required.\");\n }\n name = `${value}`;\n } else {\n name = `${algorithm}`;\n }\n if (!/^sha-(1|256|384|512)$/i.test(name)) {\n throw namedError(\"NotSupportedError\", `Unsupported digest algorithm: ${name}.`);\n }\n try {\n return await source(name.toUpperCase(), buffer, offset, length);\n } catch (error) {\n throw namedError(\"OperationError\", error instanceof Error ? error.message : \"Native digest failed.\");\n }\n };\n if (crypto.subtle == null) crypto.subtle = {\n digest\n };\n else crypto.subtle.digest = digest;\n}\nexport {\n bufferSourceRange,\n installDigestPolyfill\n};\n//# sourceMappingURL=digest.js.map\n"],"mappings":";AAAA,SAAS,WAAW,MAAM,SAAS;CACjC,IAAI,QAAQ,IAAI,MAAM,OAAO;CAC7B,MAAM,OAAO;CACb,OAAO;AACT;AACA,SAAS,kBAAkB,MAAM,MAAM;CACrC,IAAI;CACJ,IAAI,SAAS;CACb,IAAI;CACJ,IAAI,gBAAgB,aAAa;EAC/B,SAAS;EACT,SAAS,KAAK;CAChB,OAAO,IAAI,YAAY,OAAO,IAAI,KAAK,KAAK,kBAAkB,aAAa;EACzE,SAAS,KAAK;EACd,SAAS,KAAK;EACd,SAAS,KAAK;CAChB,OAAO;EACL,MAAM,IAAI,UAAU,GAAG,KAAK,mCAAmC;CACjE;CACA,IAAI,WAAW,QAAQ,QAAQ,MAAM;CACrC,OAAO;EACL;EACA;EACA;CACF;AACF;AACA,SAAS,sBAAsB,QAAQ;CACrC,IAAI,SAAS,UAAU,SAAS,KAAK,UAAU,OAAO,KAAK,IAAI,UAAU,KAAK;CAC9E,IAAI;CACJ,IAAI,SAAS,OAAO;CACpB,IAAI,UAAU,QAAQ,SAAS,iBAAiB,OAAO,YAAY,QAAQ,mBAAmB,KAAK,IAAI,KAAK,IAAI,eAAe,YAAY,YAAY;CACvJ,IAAI,SAAS,eAAe,QAAQ,WAAW,MAAM;EACnD,IAAI,EAAE,QAAQ,QAAQ,WAAW,kBAAkB,MAAM,sBAAsB;EAC/E,IAAI;EACJ,IAAI,cAAc,SAAS,OAAO,cAAc,YAAY,OAAO,cAAc,aAAa;GAC5F,IAAI,QAAQ,UAAU;GACtB,IAAI,UAAU,KAAK,GAAG;IACpB,MAAM,IAAI,UAAU,mDAAmD;GACzE;GACA,OAAO,GAAG;EACZ,OAAO;GACL,OAAO,GAAG;EACZ;EACA,IAAI,CAAC,yBAAyB,KAAK,IAAI,GAAG;GACxC,MAAM,WAAW,qBAAqB,iCAAiC,KAAK,EAAE;EAChF;EACA,IAAI;GACF,OAAO,MAAM,OAAO,KAAK,YAAY,GAAG,QAAQ,QAAQ,MAAM;EAChE,SAAS,OAAO;GACd,MAAM,WAAW,kBAAkB,iBAAiB,QAAQ,MAAM,UAAU,uBAAuB;EACrG;CACF;CACA,IAAI,OAAO,UAAU,MAAM,OAAO,SAAS,EACzC,OACF;MACK,OAAO,OAAO,SAAS;AAC9B"}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import { createAesApi } from "./aes.mjs";
|
|
2
|
+
import { createDigestApi } from "./digest-api.mjs";
|
|
1
3
|
import { formatUuidV4, installCryptoPolyfill } from "./random.mjs";
|
|
4
|
+
import { webAesEngine, webDigestSource } from "./web.mjs";
|
|
2
5
|
|
|
3
6
|
function fill(bytes) {
|
|
4
7
|
const getRandomValues = globalThis.crypto?.getRandomValues;
|
|
@@ -18,6 +21,16 @@ const source = {
|
|
|
18
21
|
function installCrypto() {
|
|
19
22
|
installCryptoPolyfill(source);
|
|
20
23
|
}
|
|
24
|
+
const aes = createAesApi(webAesEngine);
|
|
25
|
+
const digestApi = createDigestApi(webDigestSource);
|
|
26
|
+
const AESEncryptionKey = aes.AESEncryptionKey;
|
|
27
|
+
const AESSealedData = aes.AESSealedData;
|
|
28
|
+
const Crypto = Object.freeze({
|
|
29
|
+
digest: digestApi.digest,
|
|
30
|
+
digestString: digestApi.digestString,
|
|
31
|
+
aesEncrypt: aes.aesEncrypt,
|
|
32
|
+
aesDecrypt: aes.aesDecrypt
|
|
33
|
+
});
|
|
21
34
|
|
|
22
|
-
export { installCrypto };
|
|
35
|
+
export { AESEncryptionKey, AESSealedData, Crypto, installCrypto };
|
|
23
36
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["esm/platform/crypto/index.js"],"sourcesContent":["import { formatUuidV4, installCryptoPolyfill } from \"./random\";\nfunction fill(bytes) {\n const getRandomValues = globalThis.crypto?.getRandomValues;\n if (typeof getRandomValues !== \"function\") {\n throw new Error(\"secure random: web crypto is unavailable in this browser.\");\n }\n getRandomValues.call(globalThis.crypto, bytes);\n}\nconst source = {\n fill,\n randomUUID() {\n const bytes = new Uint8Array(16);\n fill(bytes);\n return formatUuidV4(bytes);\n }\n};\nfunction installCrypto() {\n installCryptoPolyfill(source);\n}\nexport {\n installCrypto\n};\n//# sourceMappingURL=index.js.map\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["esm/platform/crypto/index.js"],"sourcesContent":["import { createAesApi } from \"./aes\";\nimport { createDigestApi } from \"./digest-api\";\nimport { formatUuidV4, installCryptoPolyfill } from \"./random\";\nimport { webAesEngine, webDigestSource } from \"./web\";\nfunction fill(bytes) {\n const getRandomValues = globalThis.crypto?.getRandomValues;\n if (typeof getRandomValues !== \"function\") {\n throw new Error(\"secure random: web crypto is unavailable in this browser.\");\n }\n getRandomValues.call(globalThis.crypto, bytes);\n}\nconst source = {\n fill,\n randomUUID() {\n const bytes = new Uint8Array(16);\n fill(bytes);\n return formatUuidV4(bytes);\n }\n};\nfunction installCrypto() {\n installCryptoPolyfill(source);\n}\nconst aes = createAesApi(webAesEngine);\nconst digestApi = createDigestApi(webDigestSource);\nconst AESEncryptionKey = aes.AESEncryptionKey;\nconst AESSealedData = aes.AESSealedData;\nconst Crypto = Object.freeze({\n digest: digestApi.digest,\n digestString: digestApi.digestString,\n aesEncrypt: aes.aesEncrypt,\n aesDecrypt: aes.aesDecrypt\n});\nexport {\n AESEncryptionKey,\n AESSealedData,\n Crypto,\n installCrypto\n};\n//# sourceMappingURL=index.js.map\n"],"mappings":";;;;;;AAIA,SAAS,KAAK,OAAO;CACnB,MAAM,kBAAkB,WAAW,QAAQ;CAC3C,IAAI,OAAO,oBAAoB,YAAY;EACzC,MAAM,IAAI,MAAM,2DAA2D;CAC7E;CACA,gBAAgB,KAAK,WAAW,QAAQ,KAAK;AAC/C;AACA,MAAM,SAAS;CACb;CACA,aAAa;EACX,MAAM,QAAQ,IAAI,WAAW,EAAE;EAC/B,KAAK,KAAK;EACV,OAAO,aAAa,KAAK;CAC3B;AACF;AACA,SAAS,gBAAgB;CACvB,sBAAsB,MAAM;AAC9B;AACA,MAAM,MAAM,aAAa,YAAY;AACrC,MAAM,YAAY,gBAAgB,eAAe;AACjD,MAAM,mBAAmB,IAAI;AAC7B,MAAM,gBAAgB,IAAI;AAC1B,MAAM,SAAS,OAAO,OAAO;CAC3B,QAAQ,UAAU;CAClB,cAAc,UAAU;CACxB,YAAY,IAAI;CAChB,YAAY,IAAI;AAClB,CAAC"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { createAesApi } from "./aes.native.js";
|
|
1
2
|
import { installDigestPolyfill } from "./digest.native.js";
|
|
3
|
+
import { createDigestApi } from "./digest-api.native.js";
|
|
2
4
|
import { NitroModules } from "react-native-nitro-modules";
|
|
3
5
|
import { installCryptoPolyfill } from "./random.native.js";
|
|
4
6
|
|
|
@@ -14,6 +16,37 @@ var nativeSource = {
|
|
|
14
16
|
return native().randomUUID();
|
|
15
17
|
}
|
|
16
18
|
};
|
|
19
|
+
function required() {
|
|
20
|
+
if (!NitroModules.hasHybridObject("OneCrypto")) {
|
|
21
|
+
throw new Error("Crypto needs a native build that includes one");
|
|
22
|
+
}
|
|
23
|
+
return native();
|
|
24
|
+
}
|
|
25
|
+
var aesEngine = {
|
|
26
|
+
async seal(key, iv, plaintext, additionalData, tagLength) {
|
|
27
|
+
var sealed = await required().aesEncrypt(key.buffer, iv.buffer, plaintext.buffer, additionalData === null || additionalData === void 0 ? void 0 : additionalData.buffer, tagLength);
|
|
28
|
+
return new Uint8Array(sealed);
|
|
29
|
+
},
|
|
30
|
+
async open(key, iv, ciphertextWithTag, additionalData, tagLength) {
|
|
31
|
+
var opened = await required().aesDecrypt(key.buffer, iv.buffer, ciphertextWithTag.buffer, additionalData === null || additionalData === void 0 ? void 0 : additionalData.buffer, tagLength);
|
|
32
|
+
return new Uint8Array(opened);
|
|
33
|
+
},
|
|
34
|
+
random(bytes) {
|
|
35
|
+
required().fillRandomBytes(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
var aes = createAesApi(aesEngine);
|
|
39
|
+
var digestApi = createDigestApi(function(algorithm, buffer, offset, length) {
|
|
40
|
+
return required().digest(algorithm, buffer, offset, length);
|
|
41
|
+
});
|
|
42
|
+
var AESEncryptionKey = aes.AESEncryptionKey;
|
|
43
|
+
var AESSealedData = aes.AESSealedData;
|
|
44
|
+
var Crypto = Object.freeze({
|
|
45
|
+
digest: digestApi.digest,
|
|
46
|
+
digestString: digestApi.digestString,
|
|
47
|
+
aesEncrypt: aes.aesEncrypt,
|
|
48
|
+
aesDecrypt: aes.aesDecrypt
|
|
49
|
+
});
|
|
17
50
|
function installCrypto() {
|
|
18
51
|
if (!NitroModules.hasHybridObject("OneCrypto")) {
|
|
19
52
|
return;
|
|
@@ -24,5 +57,5 @@ function installCrypto() {
|
|
|
24
57
|
});
|
|
25
58
|
}
|
|
26
59
|
|
|
27
|
-
export { installCrypto };
|
|
60
|
+
export { AESEncryptionKey, AESSealedData, Crypto, installCrypto };
|
|
28
61
|
//# sourceMappingURL=index.native.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.native.js","names":[],"sources":["esm/platform/crypto/index.native.js"],"sourcesContent":["import { installDigestPolyfill } from \"./digest\";\nimport { NitroModules } from \"react-native-nitro-modules\";\nimport { installCryptoPolyfill } from \"./random\";\nvar hybrid;\nfunction native() {\n return hybrid !== null && hybrid !== void 0 ? hybrid : hybrid = NitroModules.createHybridObject(\"OneCrypto\");\n}\nvar nativeSource = {\n fill(bytes) {\n native().fillRandomBytes(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n },\n randomUUID: function randomUUID() {\n return native().randomUUID();\n }\n};\nfunction installCrypto() {\n if (!NitroModules.hasHybridObject(\"OneCrypto\")) {\n return;\n }\n installCryptoPolyfill(nativeSource);\n installDigestPolyfill(function(algorithm, buffer, offset, length) {\n return native().digest(algorithm, buffer, offset, length);\n });\n}\nexport {\n installCrypto\n};\n//# sourceMappingURL=index.native.js.map\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.native.js","names":[],"sources":["esm/platform/crypto/index.native.js"],"sourcesContent":["import { createAesApi } from \"./aes\";\nimport { installDigestPolyfill } from \"./digest\";\nimport { createDigestApi } from \"./digest-api\";\nimport { NitroModules } from \"react-native-nitro-modules\";\nimport { installCryptoPolyfill } from \"./random\";\nvar hybrid;\nfunction native() {\n return hybrid !== null && hybrid !== void 0 ? hybrid : hybrid = NitroModules.createHybridObject(\"OneCrypto\");\n}\nvar nativeSource = {\n fill(bytes) {\n native().fillRandomBytes(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n },\n randomUUID: function randomUUID() {\n return native().randomUUID();\n }\n};\nfunction required() {\n if (!NitroModules.hasHybridObject(\"OneCrypto\")) {\n throw new Error(\"Crypto needs a native build that includes one\");\n }\n return native();\n}\nvar aesEngine = {\n async seal(key, iv, plaintext, additionalData, tagLength) {\n var sealed = await required().aesEncrypt(key.buffer, iv.buffer, plaintext.buffer, additionalData === null || additionalData === void 0 ? void 0 : additionalData.buffer, tagLength);\n return new Uint8Array(sealed);\n },\n async open(key, iv, ciphertextWithTag, additionalData, tagLength) {\n var opened = await required().aesDecrypt(key.buffer, iv.buffer, ciphertextWithTag.buffer, additionalData === null || additionalData === void 0 ? void 0 : additionalData.buffer, tagLength);\n return new Uint8Array(opened);\n },\n random(bytes) {\n required().fillRandomBytes(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n }\n};\nvar aes = createAesApi(aesEngine);\nvar digestApi = createDigestApi(function(algorithm, buffer, offset, length) {\n return required().digest(algorithm, buffer, offset, length);\n});\nvar AESEncryptionKey = aes.AESEncryptionKey;\nvar AESSealedData = aes.AESSealedData;\nvar Crypto = Object.freeze({\n digest: digestApi.digest,\n digestString: digestApi.digestString,\n aesEncrypt: aes.aesEncrypt,\n aesDecrypt: aes.aesDecrypt\n});\nfunction installCrypto() {\n if (!NitroModules.hasHybridObject(\"OneCrypto\")) {\n return;\n }\n installCryptoPolyfill(nativeSource);\n installDigestPolyfill(function(algorithm, buffer, offset, length) {\n return native().digest(algorithm, buffer, offset, length);\n });\n}\nexport {\n AESEncryptionKey,\n AESSealedData,\n Crypto,\n installCrypto\n};\n//# sourceMappingURL=index.native.js.map\n"],"mappings":";;;;;;;AAKA,IAAI;AACJ,SAAS,SAAS;CAChB,OAAO,WAAW,QAAQ,WAAW,KAAK,IAAI,SAAS,SAAS,aAAa,mBAAmB,WAAW;AAC7G;AACA,IAAI,eAAe;CACjB,KAAK,OAAO;EACV,OAAO,CAAC,CAAC,gBAAgB,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;CAC3E;CACA,YAAY,SAAS,aAAa;EAChC,OAAO,OAAO,CAAC,CAAC,WAAW;CAC7B;AACF;AACA,SAAS,WAAW;CAClB,IAAI,CAAC,aAAa,gBAAgB,WAAW,GAAG;EAC9C,MAAM,IAAI,MAAM,+CAA+C;CACjE;CACA,OAAO,OAAO;AAChB;AACA,IAAI,YAAY;CACd,MAAM,KAAK,KAAK,IAAI,WAAW,gBAAgB,WAAW;EACxD,IAAI,SAAS,MAAM,SAAS,CAAC,CAAC,WAAW,IAAI,QAAQ,GAAG,QAAQ,UAAU,QAAQ,mBAAmB,QAAQ,mBAAmB,KAAK,IAAI,KAAK,IAAI,eAAe,QAAQ,SAAS;EAClL,OAAO,IAAI,WAAW,MAAM;CAC9B;CACA,MAAM,KAAK,KAAK,IAAI,mBAAmB,gBAAgB,WAAW;EAChE,IAAI,SAAS,MAAM,SAAS,CAAC,CAAC,WAAW,IAAI,QAAQ,GAAG,QAAQ,kBAAkB,QAAQ,mBAAmB,QAAQ,mBAAmB,KAAK,IAAI,KAAK,IAAI,eAAe,QAAQ,SAAS;EAC1L,OAAO,IAAI,WAAW,MAAM;CAC9B;CACA,OAAO,OAAO;EACZ,SAAS,CAAC,CAAC,gBAAgB,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;CAC7E;AACF;AACA,IAAI,MAAM,aAAa,SAAS;AAChC,IAAI,YAAY,gBAAgB,SAAS,WAAW,QAAQ,QAAQ,QAAQ;CAC1E,OAAO,SAAS,CAAC,CAAC,OAAO,WAAW,QAAQ,QAAQ,MAAM;AAC5D,CAAC;AACD,IAAI,mBAAmB,IAAI;AAC3B,IAAI,gBAAgB,IAAI;AACxB,IAAI,SAAS,OAAO,OAAO;CACzB,QAAQ,UAAU;CAClB,cAAc,UAAU;CACxB,YAAY,IAAI;CAChB,YAAY,IAAI;AAClB,CAAC;AACD,SAAS,gBAAgB;CACvB,IAAI,CAAC,aAAa,gBAAgB,WAAW,GAAG;EAC9C;CACF;CACA,sBAAsB,YAAY;CAClC,sBAAsB,SAAS,WAAW,QAAQ,QAAQ,QAAQ;EAChE,OAAO,OAAO,CAAC,CAAC,OAAO,WAAW,QAAQ,QAAQ,MAAM;CAC1D,CAAC;AACH"}
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
function subtle(verb) {
|
|
2
|
+
const found = globalThis.crypto?.subtle;
|
|
3
|
+
if (!found) {
|
|
4
|
+
throw new Error(`${verb} needs a browser with WebCrypto or a native build that includes one`);
|
|
5
|
+
}
|
|
6
|
+
return found;
|
|
7
|
+
}
|
|
8
|
+
const webDigestSource = async (algorithm, buffer, offset, length) => {
|
|
9
|
+
if (algorithm === "MD5") {
|
|
10
|
+
throw new Error("Crypto.digest: MD5 needs an iOS or Android build");
|
|
11
|
+
}
|
|
12
|
+
return subtle("Crypto.digest").digest(algorithm, new Uint8Array(buffer, offset, length));
|
|
13
|
+
};
|
|
14
|
+
async function importKey(raw) {
|
|
15
|
+
return subtle("Crypto.aesEncrypt").importKey("raw", raw, "AES-GCM", false, ["encrypt", "decrypt"]);
|
|
16
|
+
}
|
|
17
|
+
const webAesEngine = {
|
|
18
|
+
async seal(key, iv, plaintext, additionalData, tagLength) {
|
|
19
|
+
const sealed = await subtle("Crypto.aesEncrypt").encrypt({
|
|
20
|
+
name: "AES-GCM",
|
|
21
|
+
iv,
|
|
22
|
+
tagLength: tagLength * 8,
|
|
23
|
+
...additionalData ? { additionalData } : {}
|
|
24
|
+
}, await importKey(key), plaintext);
|
|
25
|
+
return new Uint8Array(sealed);
|
|
26
|
+
},
|
|
27
|
+
async open(key, iv, ciphertextWithTag, additionalData, tagLength) {
|
|
28
|
+
try {
|
|
29
|
+
const opened = await subtle("Crypto.aesDecrypt").decrypt({
|
|
30
|
+
name: "AES-GCM",
|
|
31
|
+
iv,
|
|
32
|
+
tagLength: tagLength * 8,
|
|
33
|
+
...additionalData ? { additionalData } : {}
|
|
34
|
+
}, await importKey(key), ciphertextWithTag);
|
|
35
|
+
return new Uint8Array(opened);
|
|
36
|
+
} catch {
|
|
37
|
+
throw new Error("Crypto.aesDecrypt: authentication failed");
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
random(bytes) {
|
|
41
|
+
const getRandomValues = globalThis.crypto?.getRandomValues;
|
|
42
|
+
if (typeof getRandomValues !== "function") {
|
|
43
|
+
throw new Error("secure random: web crypto is unavailable in this browser.");
|
|
44
|
+
}
|
|
45
|
+
getRandomValues.call(globalThis.crypto, bytes);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export { webAesEngine, webDigestSource };
|
|
50
|
+
//# sourceMappingURL=web.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.js","names":[],"sources":["esm/platform/crypto/web.js"],"sourcesContent":["function subtle(verb) {\n const found = globalThis.crypto?.subtle;\n if (!found) {\n throw new Error(`${verb} needs a browser with WebCrypto or a native build that includes one`);\n }\n return found;\n}\nconst webDigestSource = async (algorithm, buffer, offset, length) => {\n if (algorithm === \"MD5\") {\n throw new Error(\"Crypto.digest: MD5 needs an iOS or Android build\");\n }\n return subtle(\"Crypto.digest\").digest(algorithm, new Uint8Array(buffer, offset, length));\n};\nasync function importKey(raw) {\n return subtle(\"Crypto.aesEncrypt\").importKey(\"raw\", raw, \"AES-GCM\", false, [\n \"encrypt\",\n \"decrypt\"\n ]);\n}\nconst webAesEngine = {\n async seal(key, iv, plaintext, additionalData, tagLength) {\n const sealed = await subtle(\"Crypto.aesEncrypt\").encrypt(\n {\n name: \"AES-GCM\",\n iv,\n tagLength: tagLength * 8,\n ...additionalData ? { additionalData } : {}\n },\n await importKey(key),\n plaintext\n );\n return new Uint8Array(sealed);\n },\n async open(key, iv, ciphertextWithTag, additionalData, tagLength) {\n try {\n const opened = await subtle(\"Crypto.aesDecrypt\").decrypt(\n {\n name: \"AES-GCM\",\n iv,\n tagLength: tagLength * 8,\n ...additionalData ? { additionalData } : {}\n },\n await importKey(key),\n ciphertextWithTag\n );\n return new Uint8Array(opened);\n } catch {\n throw new Error(\"Crypto.aesDecrypt: authentication failed\");\n }\n },\n random(bytes) {\n const getRandomValues = globalThis.crypto?.getRandomValues;\n if (typeof getRandomValues !== \"function\") {\n throw new Error(\"secure random: web crypto is unavailable in this browser.\");\n }\n getRandomValues.call(globalThis.crypto, bytes);\n }\n};\nexport {\n webAesEngine,\n webDigestSource\n};\n//# sourceMappingURL=web.js.map\n"],"mappings":";AAAA,SAAS,OAAO,MAAM;CACpB,MAAM,QAAQ,WAAW,QAAQ;CACjC,IAAI,CAAC,OAAO;EACV,MAAM,IAAI,MAAM,GAAG,KAAK,oEAAoE;CAC9F;CACA,OAAO;AACT;AACA,MAAM,kBAAkB,OAAO,WAAW,QAAQ,QAAQ,WAAW;CACnE,IAAI,cAAc,OAAO;EACvB,MAAM,IAAI,MAAM,kDAAkD;CACpE;CACA,OAAO,OAAO,eAAe,CAAC,CAAC,OAAO,WAAW,IAAI,WAAW,QAAQ,QAAQ,MAAM,CAAC;AACzF;AACA,eAAe,UAAU,KAAK;CAC5B,OAAO,OAAO,mBAAmB,CAAC,CAAC,UAAU,OAAO,KAAK,WAAW,OAAO,CACzE,WACA,SACF,CAAC;AACH;AACA,MAAM,eAAe;CACnB,MAAM,KAAK,KAAK,IAAI,WAAW,gBAAgB,WAAW;EACxD,MAAM,SAAS,MAAM,OAAO,mBAAmB,CAAC,CAAC,QAC/C;GACE,MAAM;GACN;GACA,WAAW,YAAY;GACvB,GAAG,iBAAiB,EAAE,eAAe,IAAI,CAAC;EAC5C,GACA,MAAM,UAAU,GAAG,GACnB,SACF;EACA,OAAO,IAAI,WAAW,MAAM;CAC9B;CACA,MAAM,KAAK,KAAK,IAAI,mBAAmB,gBAAgB,WAAW;EAChE,IAAI;GACF,MAAM,SAAS,MAAM,OAAO,mBAAmB,CAAC,CAAC,QAC/C;IACE,MAAM;IACN;IACA,WAAW,YAAY;IACvB,GAAG,iBAAiB,EAAE,eAAe,IAAI,CAAC;GAC5C,GACA,MAAM,UAAU,GAAG,GACnB,iBACF;GACA,OAAO,IAAI,WAAW,MAAM;EAC9B,QAAQ;GACN,MAAM,IAAI,MAAM,0CAA0C;EAC5D;CACF;CACA,OAAO,OAAO;EACZ,MAAM,kBAAkB,WAAW,QAAQ;EAC3C,IAAI,OAAO,oBAAoB,YAAY;GACzC,MAAM,IAAI,MAAM,2DAA2D;EAC7E;EACA,gBAAgB,KAAK,WAAW,QAAQ,KAAK;CAC/C;AACF"}
|
|
@@ -15,9 +15,10 @@ import { SpeechSynthesis } from "./speech-synthesis/index.mjs";
|
|
|
15
15
|
import { Browser } from "./browser/index.mjs";
|
|
16
16
|
import { Updates } from "./updates/index.mjs";
|
|
17
17
|
import { Network, useNetworkState } from "./network/index.mjs";
|
|
18
|
+
import { AESEncryptionKey, AESSealedData, Crypto } from "./crypto/index.mjs";
|
|
18
19
|
import { Localization, useCalendars, useLocales } from "./localization/index.mjs";
|
|
19
20
|
import { SecureStore } from "./secure-store/index.mjs";
|
|
20
21
|
import { Auth } from "./auth/index.mjs";
|
|
21
22
|
import { Speech } from "./speech/index.mjs";
|
|
22
23
|
|
|
23
|
-
export { Auth, Barometer, Battery, Brightness, Browser, Clipboard, Color, Fonts, LightSensor, Localization, MenuAction, Network, Pedometer, SecureStore, Speech, SpeechSynthesis, SplitView, ToolbarHost, ToolbarItem, Updates, ZoomTransitionAlignmentRectDetector, ZoomTransitionEnabler, ZoomTransitionSource, useAudioPlayer, useAudioPlayerStatus, useBatteryLevel, useBatteryState, useCalendars, useFonts, useLocales, useLowPowerMode, useNetworkState, usePowerState };
|
|
24
|
+
export { AESEncryptionKey, AESSealedData, Auth, Barometer, Battery, Brightness, Browser, Clipboard, Color, Crypto, Fonts, LightSensor, Localization, MenuAction, Network, Pedometer, SecureStore, Speech, SpeechSynthesis, SplitView, ToolbarHost, ToolbarItem, Updates, ZoomTransitionAlignmentRectDetector, ZoomTransitionEnabler, ZoomTransitionSource, useAudioPlayer, useAudioPlayerStatus, useBatteryLevel, useBatteryState, useCalendars, useFonts, useLocales, useLowPowerMode, useNetworkState, usePowerState };
|
|
@@ -15,9 +15,10 @@ import { SpeechSynthesis } from "./speech-synthesis/index.native.js";
|
|
|
15
15
|
import { Browser } from "./browser/index.native.js";
|
|
16
16
|
import { Updates } from "./updates/index.native.js";
|
|
17
17
|
import { Network, useNetworkState } from "./network/index.native.js";
|
|
18
|
+
import { AESEncryptionKey, AESSealedData, Crypto } from "./crypto/index.native.js";
|
|
18
19
|
import { Localization, useCalendars, useLocales } from "./localization/index.native.js";
|
|
19
20
|
import { SecureStore } from "./secure-store/index.native.js";
|
|
20
21
|
import { Auth } from "./auth/index.native.js";
|
|
21
22
|
import { Speech } from "./speech/index.native.js";
|
|
22
23
|
|
|
23
|
-
export { Auth, Barometer, Battery, Brightness, Browser, Clipboard, Color, Fonts, LightSensor, Localization, MenuAction, Network, Pedometer, SecureStore, Speech, SpeechSynthesis, SplitView, ToolbarHost, ToolbarItem, Updates, ZoomTransitionAlignmentRectDetector, ZoomTransitionEnabler, ZoomTransitionSource, useAudioPlayer, useAudioPlayerStatus, useBatteryLevel, useBatteryState, useCalendars, useFonts, useLocales, useLowPowerMode, useNetworkState, usePowerState };
|
|
24
|
+
export { AESEncryptionKey, AESSealedData, Auth, Barometer, Battery, Brightness, Browser, Clipboard, Color, Crypto, Fonts, LightSensor, Localization, MenuAction, Network, Pedometer, SecureStore, Speech, SpeechSynthesis, SplitView, ToolbarHost, ToolbarItem, Updates, ZoomTransitionAlignmentRectDetector, ZoomTransitionEnabler, ZoomTransitionSource, useAudioPlayer, useAudioPlayerStatus, useBatteryLevel, useBatteryState, useCalendars, useFonts, useLocales, useLowPowerMode, useNetworkState, usePowerState };
|
|
@@ -17,6 +17,8 @@ namespace margelo::nitro::one {
|
|
|
17
17
|
prototype.registerHybridMethod("fillRandomBytes", &HybridOneCryptoSpec::fillRandomBytes);
|
|
18
18
|
prototype.registerHybridMethod("randomUUID", &HybridOneCryptoSpec::randomUUID);
|
|
19
19
|
prototype.registerHybridMethod("digest", &HybridOneCryptoSpec::digest);
|
|
20
|
+
prototype.registerHybridMethod("aesEncrypt", &HybridOneCryptoSpec::aesEncrypt);
|
|
21
|
+
prototype.registerHybridMethod("aesDecrypt", &HybridOneCryptoSpec::aesDecrypt);
|
|
20
22
|
});
|
|
21
23
|
}
|
|
22
24
|
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
#include <NitroModules/ArrayBuffer.hpp>
|
|
19
19
|
#include <string>
|
|
20
20
|
#include <NitroModules/Promise.hpp>
|
|
21
|
+
#include <optional>
|
|
21
22
|
|
|
22
23
|
namespace margelo::nitro::one {
|
|
23
24
|
|
|
@@ -46,13 +47,15 @@ namespace margelo::nitro::one {
|
|
|
46
47
|
|
|
47
48
|
public:
|
|
48
49
|
// Properties
|
|
49
|
-
|
|
50
|
+
|
|
50
51
|
|
|
51
52
|
public:
|
|
52
53
|
// Methods
|
|
53
54
|
virtual void fillRandomBytes(const std::shared_ptr<ArrayBuffer>& buffer, double offset, double length) = 0;
|
|
54
55
|
virtual std::string randomUUID() = 0;
|
|
55
56
|
virtual std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>> digest(const std::string& algorithm, const std::shared_ptr<ArrayBuffer>& buffer, double offset, double length) = 0;
|
|
57
|
+
virtual std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>> aesEncrypt(const std::shared_ptr<ArrayBuffer>& key, const std::shared_ptr<ArrayBuffer>& iv, const std::shared_ptr<ArrayBuffer>& plaintext, const std::optional<std::shared_ptr<ArrayBuffer>>& additionalData, double tagLength) = 0;
|
|
58
|
+
virtual std::shared_ptr<Promise<std::shared_ptr<ArrayBuffer>>> aesDecrypt(const std::shared_ptr<ArrayBuffer>& key, const std::shared_ptr<ArrayBuffer>& iv, const std::shared_ptr<ArrayBuffer>& ciphertext, const std::optional<std::shared_ptr<ArrayBuffer>>& additionalData, double tagLength) = 0;
|
|
56
59
|
|
|
57
60
|
protected:
|
|
58
61
|
// Hybrid Setup
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "one",
|
|
3
|
-
"version": "2.6.
|
|
3
|
+
"version": "2.6.21",
|
|
4
4
|
"description": "One is a React framework for web, iOS, and Android apps.",
|
|
5
5
|
"license": "BSD-3-Clause",
|
|
6
6
|
"sideEffects": [
|
|
@@ -236,18 +236,18 @@
|
|
|
236
236
|
"@react-navigation/native-stack": "8.0.0-alpha.58",
|
|
237
237
|
"@react-navigation/routers": "8.0.0-alpha.20",
|
|
238
238
|
"@ungap/structured-clone": "^1.2.0",
|
|
239
|
-
"@vxrn/color-scheme": "2.6.
|
|
240
|
-
"@vxrn/compiler": "2.6.
|
|
241
|
-
"@vxrn/resolve": "2.6.
|
|
242
|
-
"@vxrn/tslib-lite": "2.6.
|
|
243
|
-
"@vxrn/use-isomorphic-layout-effect": "2.6.
|
|
244
|
-
"@vxrn/utils": "2.6.
|
|
245
|
-
"@vxrn/vite-plugin-metro": "2.6.
|
|
239
|
+
"@vxrn/color-scheme": "2.6.21",
|
|
240
|
+
"@vxrn/compiler": "2.6.21",
|
|
241
|
+
"@vxrn/resolve": "2.6.21",
|
|
242
|
+
"@vxrn/tslib-lite": "2.6.21",
|
|
243
|
+
"@vxrn/use-isomorphic-layout-effect": "2.6.21",
|
|
244
|
+
"@vxrn/utils": "2.6.21",
|
|
245
|
+
"@vxrn/vite-plugin-metro": "2.6.21",
|
|
246
246
|
"babel-dead-code-elimination": "1.0.10",
|
|
247
247
|
"babel-plugin-module-resolver": "^5.0.2",
|
|
248
248
|
"citty": "^0.1.6",
|
|
249
249
|
"core-js": "^3.38.1",
|
|
250
|
-
"create-vxrn": "2.6.
|
|
250
|
+
"create-vxrn": "2.6.21",
|
|
251
251
|
"escape-string-regexp": "^5.0.0",
|
|
252
252
|
"fast-deep-equal": "^3.1.3",
|
|
253
253
|
"fast-glob": "^3.3.3",
|
|
@@ -269,7 +269,7 @@
|
|
|
269
269
|
"tsconfig-paths": "^4",
|
|
270
270
|
"use-latest-callback": "^0.2.3",
|
|
271
271
|
"vite": "^8.2.2",
|
|
272
|
-
"vxrn": "2.6.
|
|
272
|
+
"vxrn": "2.6.21",
|
|
273
273
|
"web-streams-polyfill": "^4.3.0",
|
|
274
274
|
"ws": "^8.21.0",
|
|
275
275
|
"xxhashjs": "^0.2.2"
|
|
@@ -337,7 +337,7 @@
|
|
|
337
337
|
"@types/react-dom": "^19.2.2",
|
|
338
338
|
"@types/react-test-renderer": "^19.1.0",
|
|
339
339
|
"@types/xxhashjs": "^0.2.4",
|
|
340
|
-
"@vxrn/emitter": "2.6.
|
|
340
|
+
"@vxrn/emitter": "2.6.21",
|
|
341
341
|
"depcheck": "^1.4.7",
|
|
342
342
|
"esbuild": "^0.25.12",
|
|
343
343
|
"immer": "^10.1.1",
|
|
@@ -513,7 +513,7 @@
|
|
|
513
513
|
}
|
|
514
514
|
}
|
|
515
515
|
},
|
|
516
|
-
"releaseSourceCommit": "
|
|
516
|
+
"releaseSourceCommit": "e08c1bc6bc698fb2ae68b3d47a52b39a764657ed",
|
|
517
517
|
"repository": {
|
|
518
518
|
"type": "git",
|
|
519
519
|
"url": "git+https://github.com/onejs/one.git",
|
package/src/index.ts
CHANGED
package/src/one.ts
CHANGED
|
@@ -27,6 +27,7 @@ import {
|
|
|
27
27
|
Purchases,
|
|
28
28
|
ImageManipulator,
|
|
29
29
|
Device,
|
|
30
|
+
Crypto as NativeCrypto,
|
|
30
31
|
Localization,
|
|
31
32
|
Motion,
|
|
32
33
|
BackgroundTasks,
|
|
@@ -157,6 +158,7 @@ export type OneAPI = {
|
|
|
157
158
|
readonly Purchases: typeof Purchases
|
|
158
159
|
readonly ImageManipulator: typeof ImageManipulator
|
|
159
160
|
readonly Device: typeof Device
|
|
161
|
+
readonly Crypto: typeof NativeCrypto
|
|
160
162
|
readonly Localization: typeof Localization
|
|
161
163
|
readonly Motion: typeof Motion
|
|
162
164
|
readonly BackgroundTasks: typeof BackgroundTasks
|
|
@@ -268,6 +270,7 @@ export const One: OneAPI = Object.freeze({
|
|
|
268
270
|
Purchases,
|
|
269
271
|
ImageManipulator,
|
|
270
272
|
Device,
|
|
273
|
+
Crypto: NativeCrypto,
|
|
271
274
|
Localization,
|
|
272
275
|
Motion,
|
|
273
276
|
BackgroundTasks,
|