@sebastienrousseau/crypto-lib 0.0.3 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +304 -314
- package/dist/accel/index.d.ts +11 -0
- package/dist/accel/index.d.ts.map +1 -0
- package/dist/accel/index.js +31 -0
- package/dist/accel/native-pqc-bridge.d.ts +18 -0
- package/dist/accel/native-pqc-bridge.d.ts.map +1 -0
- package/dist/accel/native-pqc-bridge.js +100 -0
- package/dist/accel/wasm-bridge.d.ts +35 -0
- package/dist/accel/wasm-bridge.d.ts.map +1 -0
- package/dist/accel/wasm-bridge.js +161 -0
- package/dist/accel/webcrypto-bridge.d.ts +32 -0
- package/dist/accel/webcrypto-bridge.d.ts.map +1 -0
- package/dist/accel/webcrypto-bridge.js +179 -0
- package/dist/accel/webcrypto-modern.d.ts +40 -0
- package/dist/accel/webcrypto-modern.d.ts.map +1 -0
- package/dist/accel/webcrypto-modern.js +213 -0
- package/dist/accel/worker-pool.d.ts +23 -0
- package/dist/accel/worker-pool.d.ts.map +1 -0
- package/dist/accel/worker-pool.js +119 -0
- package/dist/bin/cryptolib.d.ts +9 -7
- package/dist/bin/cryptolib.d.ts.map +1 -1
- package/dist/bin/cryptolib.js +25 -16
- package/dist/config/config.d.ts.map +1 -1
- package/dist/crypto.d.ts +43 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +107 -0
- package/dist/enums.d.ts +29 -29
- package/dist/enums.d.ts.map +1 -1
- package/dist/enums.js +54 -54
- package/dist/errors.d.ts +14 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +22 -0
- package/dist/high-level/index.d.ts +11 -0
- package/dist/high-level/index.d.ts.map +1 -0
- package/dist/high-level/index.js +53 -0
- package/dist/high-level/key-wrap.d.ts +16 -0
- package/dist/high-level/key-wrap.d.ts.map +1 -0
- package/dist/high-level/key-wrap.js +93 -0
- package/dist/high-level/multi-recipient.d.ts +25 -0
- package/dist/high-level/multi-recipient.d.ts.map +1 -0
- package/dist/high-level/multi-recipient.js +122 -0
- package/dist/high-level/password-encrypt.d.ts +14 -0
- package/dist/high-level/password-encrypt.d.ts.map +1 -0
- package/dist/high-level/password-encrypt.js +93 -0
- package/dist/high-level/sealedbox.d.ts +13 -0
- package/dist/high-level/sealedbox.d.ts.map +1 -0
- package/dist/high-level/sealedbox.js +119 -0
- package/dist/high-level/secretbox.d.ts +7 -0
- package/dist/high-level/secretbox.d.ts.map +1 -0
- package/dist/high-level/secretbox.js +54 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +59 -0
- package/dist/key/key.d.ts +6 -13
- package/dist/key/key.d.ts.map +1 -1
- package/dist/key/key.js +20 -14
- package/dist/key/keystore.d.ts +11 -0
- package/dist/key/keystore.d.ts.map +1 -0
- package/dist/key/keystore.js +87 -0
- package/dist/keys/index.d.ts +7 -0
- package/dist/keys/index.d.ts.map +1 -0
- package/dist/keys/index.js +22 -0
- package/dist/keys/keygen.d.ts +16 -0
- package/dist/keys/keygen.d.ts.map +1 -0
- package/dist/keys/keygen.js +128 -0
- package/dist/keys/keyring.d.ts +35 -0
- package/dist/keys/keyring.d.ts.map +1 -0
- package/dist/keys/keyring.js +136 -0
- package/dist/keys/serialize.d.ts +30 -0
- package/dist/keys/serialize.d.ts.map +1 -0
- package/dist/keys/serialize.js +120 -0
- package/dist/lib/decrypt.d.ts +4 -1
- package/dist/lib/decrypt.d.ts.map +1 -1
- package/dist/lib/decrypt.js +43 -51
- package/dist/lib/encrypt.d.ts +1 -1
- package/dist/lib/encrypt.d.ts.map +1 -1
- package/dist/lib/encrypt.js +29 -45
- package/dist/lib/generate.d.ts.map +1 -1
- package/dist/lib/generate.js +56 -63
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +17 -7
- package/dist/lib/key-output.d.ts +7 -0
- package/dist/lib/key-output.d.ts.map +1 -0
- package/dist/lib/key-output.js +50 -0
- package/dist/lib/reformat.d.ts +6 -1
- package/dist/lib/reformat.d.ts.map +1 -1
- package/dist/lib/reformat.js +37 -61
- package/dist/lib/revoke.d.ts +2 -2
- package/dist/lib/revoke.d.ts.map +1 -1
- package/dist/lib/revoke.js +33 -50
- package/dist/lib/session.d.ts.map +1 -1
- package/dist/lib/session.js +21 -36
- package/dist/lib/sign.d.ts.map +1 -1
- package/dist/lib/sign.js +36 -43
- package/dist/lib/verify.d.ts +1 -3
- package/dist/lib/verify.d.ts.map +1 -1
- package/dist/lib/verify.js +25 -30
- package/dist/modern/aead.d.ts +17 -0
- package/dist/modern/aead.d.ts.map +1 -0
- package/dist/modern/aead.js +51 -0
- package/dist/modern/aes.d.ts +35 -0
- package/dist/modern/aes.d.ts.map +1 -0
- package/dist/modern/aes.js +82 -0
- package/dist/modern/cost-limits.d.ts +11 -0
- package/dist/modern/cost-limits.d.ts.map +1 -0
- package/dist/modern/cost-limits.js +35 -0
- package/dist/modern/curves.d.ts +86 -0
- package/dist/modern/curves.d.ts.map +1 -0
- package/dist/modern/curves.js +171 -0
- package/dist/modern/ecdh.d.ts +11 -0
- package/dist/modern/ecdh.d.ts.map +1 -0
- package/dist/modern/ecdh.js +28 -0
- package/dist/modern/fn-dsa.d.ts +19 -0
- package/dist/modern/fn-dsa.d.ts.map +1 -0
- package/dist/modern/fn-dsa.js +57 -0
- package/dist/modern/hash.d.ts +13 -0
- package/dist/modern/hash.d.ts.map +1 -0
- package/dist/modern/hash.js +45 -0
- package/dist/modern/hpke.d.ts +47 -0
- package/dist/modern/hpke.d.ts.map +1 -0
- package/dist/modern/hpke.js +207 -0
- package/dist/modern/index.d.ts +40 -0
- package/dist/modern/index.d.ts.map +1 -0
- package/dist/modern/index.js +194 -0
- package/dist/modern/kdf.d.ts +23 -0
- package/dist/modern/kdf.d.ts.map +1 -0
- package/dist/modern/kdf.js +67 -0
- package/dist/modern/mac.d.ts +51 -0
- package/dist/modern/mac.d.ts.map +1 -0
- package/dist/modern/mac.js +119 -0
- package/dist/modern/password.d.ts +40 -0
- package/dist/modern/password.d.ts.map +1 -0
- package/dist/modern/password.js +123 -0
- package/dist/modern/pq-hash-sign.d.ts +18 -0
- package/dist/modern/pq-hash-sign.d.ts.map +1 -0
- package/dist/modern/pq-hash-sign.js +73 -0
- package/dist/modern/pq-kem.d.ts +88 -0
- package/dist/modern/pq-kem.d.ts.map +1 -0
- package/dist/modern/pq-kem.js +270 -0
- package/dist/modern/pq-sign.d.ts +30 -0
- package/dist/modern/pq-sign.d.ts.map +1 -0
- package/dist/modern/pq-sign.js +94 -0
- package/dist/modern/pq.d.ts +38 -0
- package/dist/modern/pq.d.ts.map +1 -0
- package/dist/modern/pq.js +80 -0
- package/dist/modern/signing.d.ts +16 -0
- package/dist/modern/signing.d.ts.map +1 -0
- package/dist/modern/signing.js +34 -0
- package/dist/protocols/index.d.ts +7 -0
- package/dist/protocols/index.d.ts.map +1 -0
- package/dist/protocols/index.js +46 -0
- package/dist/protocols/iso20022.d.ts +51 -0
- package/dist/protocols/iso20022.d.ts.map +1 -0
- package/dist/protocols/iso20022.js +145 -0
- package/dist/protocols/opaque/ake.d.ts +51 -0
- package/dist/protocols/opaque/ake.d.ts.map +1 -0
- package/dist/protocols/opaque/ake.js +102 -0
- package/dist/protocols/opaque/client.d.ts +45 -0
- package/dist/protocols/opaque/client.d.ts.map +1 -0
- package/dist/protocols/opaque/client.js +63 -0
- package/dist/protocols/opaque/config.d.ts +14 -0
- package/dist/protocols/opaque/config.d.ts.map +1 -0
- package/dist/protocols/opaque/config.js +18 -0
- package/dist/protocols/opaque/credentials.d.ts +29 -0
- package/dist/protocols/opaque/credentials.d.ts.map +1 -0
- package/dist/protocols/opaque/credentials.js +61 -0
- package/dist/protocols/opaque/envelope.d.ts +36 -0
- package/dist/protocols/opaque/envelope.d.ts.map +1 -0
- package/dist/protocols/opaque/envelope.js +77 -0
- package/dist/protocols/opaque/ksf.d.ts +15 -0
- package/dist/protocols/opaque/ksf.d.ts.map +1 -0
- package/dist/protocols/opaque/ksf.js +27 -0
- package/dist/protocols/opaque/messages.d.ts +61 -0
- package/dist/protocols/opaque/messages.d.ts.map +1 -0
- package/dist/protocols/opaque/messages.js +94 -0
- package/dist/protocols/opaque/server.d.ts +33 -0
- package/dist/protocols/opaque/server.d.ts.map +1 -0
- package/dist/protocols/opaque/server.js +74 -0
- package/dist/protocols/opaque/suite.d.ts +58 -0
- package/dist/protocols/opaque/suite.d.ts.map +1 -0
- package/dist/protocols/opaque/suite.js +115 -0
- package/dist/protocols/pake.d.ts +14 -0
- package/dist/protocols/pake.d.ts.map +1 -0
- package/dist/protocols/pake.js +33 -0
- package/dist/protocols/pqxdh.d.ts +53 -0
- package/dist/protocols/pqxdh.d.ts.map +1 -0
- package/dist/protocols/pqxdh.js +143 -0
- package/dist/protocols/ratchet.d.ts +52 -0
- package/dist/protocols/ratchet.d.ts.map +1 -0
- package/dist/protocols/ratchet.js +187 -0
- package/dist/protocols/threshold.d.ts +23 -0
- package/dist/protocols/threshold.d.ts.map +1 -0
- package/dist/protocols/threshold.js +191 -0
- package/dist/registry.d.ts +20 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +399 -0
- package/dist/streaming/index.d.ts +7 -0
- package/dist/streaming/index.d.ts.map +1 -0
- package/dist/streaming/index.js +15 -0
- package/dist/streaming/stream-aead.d.ts +17 -0
- package/dist/streaming/stream-aead.d.ts.map +1 -0
- package/dist/streaming/stream-aead.js +125 -0
- package/dist/streaming/stream-hash.d.ts +9 -0
- package/dist/streaming/stream-hash.d.ts.map +1 -0
- package/dist/streaming/stream-hash.js +52 -0
- package/dist/streaming/web-streams.d.ts +17 -0
- package/dist/streaming/web-streams.d.ts.map +1 -0
- package/dist/streaming/web-streams.js +114 -0
- package/dist/tokens/index.d.ts +5 -0
- package/dist/tokens/index.d.ts.map +1 -0
- package/dist/tokens/index.js +15 -0
- package/dist/tokens/key-rotation.d.ts +20 -0
- package/dist/tokens/key-rotation.d.ts.map +1 -0
- package/dist/tokens/key-rotation.js +76 -0
- package/dist/tokens/paseto.d.ts +46 -0
- package/dist/tokens/paseto.d.ts.map +1 -0
- package/dist/tokens/paseto.js +200 -0
- package/dist/types/types.d.ts +24 -16
- package/dist/types/types.d.ts.map +1 -1
- package/dist/utils.d.ts +13 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +56 -0
- package/package.json +77 -142
- package/dist/COPYRIGHT +0 -15
- package/dist/Report.txt +0 -160
- package/dist/bin/cryptolib.js.map +0 -1
- package/dist/config/config.js.map +0 -1
- package/dist/data/decrypted.txt +0 -1
- package/dist/data/detached.sig +0 -1
- package/dist/data/encrypted.txt +0 -1
- package/dist/data/signed.sig +0 -1
- package/dist/enums.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/key/key.js.map +0 -1
- package/dist/key/rsa-reformat.cert +0 -1
- package/dist/key/rsa-reformat.key +0 -1
- package/dist/key/rsa-reformat.pub +0 -1
- package/dist/key/rsa-revoke.key +0 -1
- package/dist/key/rsa-revoke.pub +0 -1
- package/dist/key/rsa.cert +0 -1
- package/dist/key/rsa.key +0 -1
- package/dist/key/rsa.pub +0 -1
- package/dist/lib/decrypt.js.map +0 -1
- package/dist/lib/encrypt.js.map +0 -1
- package/dist/lib/generate.js.map +0 -1
- package/dist/lib/index.js.map +0 -1
- package/dist/lib/reformat.js.map +0 -1
- package/dist/lib/revoke.js.map +0 -1
- package/dist/lib/session.js.map +0 -1
- package/dist/lib/sign.js.map +0 -1
- package/dist/lib/verify.js.map +0 -1
- package/dist/package.json +0 -143
- package/dist/types/types.js.map +0 -1
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.detectModernWebCrypto = detectModernWebCrypto;
|
|
37
|
+
exports._resetModernWebCryptoDetection = _resetModernWebCryptoDetection;
|
|
38
|
+
exports.modernChaCha20Encrypt = modernChaCha20Encrypt;
|
|
39
|
+
exports.modernChaCha20Decrypt = modernChaCha20Decrypt;
|
|
40
|
+
exports.modernSha3Hash = modernSha3Hash;
|
|
41
|
+
const chacha_js_1 = require("@noble/ciphers/chacha.js");
|
|
42
|
+
const utils_js_1 = require("@noble/ciphers/utils.js");
|
|
43
|
+
const sha3_js_1 = require("@noble/hashes/sha3.js");
|
|
44
|
+
const nodeCrypto = __importStar(require("node:crypto"));
|
|
45
|
+
function asBufferSource(view) {
|
|
46
|
+
return view;
|
|
47
|
+
}
|
|
48
|
+
const HEX_RE = /^[0-9a-fA-F]*$/;
|
|
49
|
+
const NONCE_LENGTH = 12;
|
|
50
|
+
const TAG_LENGTH = 16;
|
|
51
|
+
function toBytes(input, encoding = "utf8") {
|
|
52
|
+
if (input instanceof Uint8Array)
|
|
53
|
+
return input;
|
|
54
|
+
if (encoding === "hex") {
|
|
55
|
+
if (!HEX_RE.test(input)) {
|
|
56
|
+
throw new Error("Invalid hex string");
|
|
57
|
+
}
|
|
58
|
+
return Buffer.from(input, "hex");
|
|
59
|
+
}
|
|
60
|
+
return Buffer.from(input, "utf8");
|
|
61
|
+
}
|
|
62
|
+
function getSubtle() {
|
|
63
|
+
try {
|
|
64
|
+
if (nodeCrypto.webcrypto &&
|
|
65
|
+
nodeCrypto.webcrypto.subtle &&
|
|
66
|
+
typeof nodeCrypto.webcrypto.subtle.encrypt === "function") {
|
|
67
|
+
return nodeCrypto.webcrypto.subtle;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
let _modernDetectionCache;
|
|
75
|
+
function checkSupport(supports, subtle, op, alg) {
|
|
76
|
+
try {
|
|
77
|
+
return !!supports.call(subtle, op, alg);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function detectModernWebCrypto() {
|
|
84
|
+
if (_modernDetectionCache !== undefined)
|
|
85
|
+
return _modernDetectionCache;
|
|
86
|
+
const subtle = getSubtle();
|
|
87
|
+
const result = {
|
|
88
|
+
chacha20poly1305: false,
|
|
89
|
+
sha3: false,
|
|
90
|
+
mlKem: false,
|
|
91
|
+
argon2: false,
|
|
92
|
+
kmac: false,
|
|
93
|
+
};
|
|
94
|
+
if (subtle) {
|
|
95
|
+
const supports = subtle["supports"];
|
|
96
|
+
if (typeof supports === "function") {
|
|
97
|
+
const fn = supports;
|
|
98
|
+
result.chacha20poly1305 = checkSupport(fn, subtle, "encrypt", "ChaCha20-Poly1305");
|
|
99
|
+
result.sha3 = checkSupport(fn, subtle, "digest", "SHA3-256");
|
|
100
|
+
result.mlKem = checkSupport(fn, subtle, "deriveBits", "ML-KEM-768");
|
|
101
|
+
result.argon2 = checkSupport(fn, subtle, "deriveBits", "Argon2id");
|
|
102
|
+
result.kmac = checkSupport(fn, subtle, "sign", "KMAC256");
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
_modernDetectionCache = result;
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
function _resetModernWebCryptoDetection() {
|
|
109
|
+
_modernDetectionCache = undefined;
|
|
110
|
+
}
|
|
111
|
+
async function modernChaCha20Encrypt(options) {
|
|
112
|
+
const key = toBytes(options.key, "hex");
|
|
113
|
+
if (key.length !== 32) {
|
|
114
|
+
throw new Error(`Key must be 32 bytes (256 bits), got ${key.length}`);
|
|
115
|
+
}
|
|
116
|
+
const plaintext = toBytes(options.plaintext, "utf8");
|
|
117
|
+
const nonce = (0, utils_js_1.randomBytes)(NONCE_LENGTH);
|
|
118
|
+
const support = detectModernWebCrypto();
|
|
119
|
+
if (support.chacha20poly1305) {
|
|
120
|
+
const subtle = getSubtle();
|
|
121
|
+
const cryptoKey = await subtle.importKey("raw", asBufferSource(key), { name: "ChaCha20-Poly1305" }, false, ["encrypt"]);
|
|
122
|
+
const algParams = {
|
|
123
|
+
name: "ChaCha20-Poly1305",
|
|
124
|
+
iv: asBufferSource(nonce),
|
|
125
|
+
tagLength: TAG_LENGTH * 8,
|
|
126
|
+
};
|
|
127
|
+
if (options.aad) {
|
|
128
|
+
algParams["additionalData"] = options.aad;
|
|
129
|
+
}
|
|
130
|
+
const encrypted = await subtle.encrypt(algParams, cryptoKey, asBufferSource(plaintext));
|
|
131
|
+
const sealed = new Uint8Array(encrypted);
|
|
132
|
+
const combined = new Uint8Array(NONCE_LENGTH + sealed.length);
|
|
133
|
+
combined.set(nonce);
|
|
134
|
+
combined.set(sealed, NONCE_LENGTH);
|
|
135
|
+
return {
|
|
136
|
+
ciphertext: Buffer.from(combined).toString("base64"),
|
|
137
|
+
accelerated: true,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
const cipher = (0, chacha_js_1.chacha20poly1305)(key, nonce, options.aad);
|
|
141
|
+
const sealed = cipher.encrypt(plaintext);
|
|
142
|
+
const combined = new Uint8Array(NONCE_LENGTH + sealed.length);
|
|
143
|
+
combined.set(nonce);
|
|
144
|
+
combined.set(sealed, NONCE_LENGTH);
|
|
145
|
+
return {
|
|
146
|
+
ciphertext: Buffer.from(combined).toString("base64"),
|
|
147
|
+
accelerated: false,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
async function modernChaCha20Decrypt(options) {
|
|
151
|
+
const key = toBytes(options.key, "hex");
|
|
152
|
+
if (key.length !== 32) {
|
|
153
|
+
throw new Error(`Key must be 32 bytes (256 bits), got ${key.length}`);
|
|
154
|
+
}
|
|
155
|
+
const combined = Buffer.from(options.ciphertext, "base64");
|
|
156
|
+
if (combined.length < NONCE_LENGTH + TAG_LENGTH) {
|
|
157
|
+
throw new Error("Ciphertext too short — missing nonce or auth tag");
|
|
158
|
+
}
|
|
159
|
+
const nonce = combined.subarray(0, NONCE_LENGTH);
|
|
160
|
+
const sealed = combined.subarray(NONCE_LENGTH);
|
|
161
|
+
const support = detectModernWebCrypto();
|
|
162
|
+
if (support.chacha20poly1305) {
|
|
163
|
+
const subtle = getSubtle();
|
|
164
|
+
const cryptoKey = await subtle.importKey("raw", asBufferSource(key), { name: "ChaCha20-Poly1305" }, false, ["decrypt"]);
|
|
165
|
+
const algParams = {
|
|
166
|
+
name: "ChaCha20-Poly1305",
|
|
167
|
+
iv: asBufferSource(nonce),
|
|
168
|
+
tagLength: TAG_LENGTH * 8,
|
|
169
|
+
};
|
|
170
|
+
if (options.aad) {
|
|
171
|
+
algParams["additionalData"] = options.aad;
|
|
172
|
+
}
|
|
173
|
+
const decrypted = await subtle.decrypt(algParams, cryptoKey, asBufferSource(sealed));
|
|
174
|
+
return {
|
|
175
|
+
plaintext: new Uint8Array(decrypted),
|
|
176
|
+
accelerated: true,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
const cipher = (0, chacha_js_1.chacha20poly1305)(key, nonce, options.aad);
|
|
180
|
+
const plaintext = cipher.decrypt(sealed);
|
|
181
|
+
return {
|
|
182
|
+
plaintext,
|
|
183
|
+
accelerated: false,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
async function modernSha3Hash(options) {
|
|
187
|
+
const data = toBytes(options.data, "utf8");
|
|
188
|
+
const support = detectModernWebCrypto();
|
|
189
|
+
if (support.sha3) {
|
|
190
|
+
const subtle = getSubtle();
|
|
191
|
+
const digest = await subtle.digest(options.algorithm, asBufferSource(data));
|
|
192
|
+
return {
|
|
193
|
+
digest: Buffer.from(digest).toString("hex"),
|
|
194
|
+
accelerated: true,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
let digest;
|
|
198
|
+
switch (options.algorithm) {
|
|
199
|
+
case "SHA3-256":
|
|
200
|
+
digest = (0, sha3_js_1.sha3_256)(data);
|
|
201
|
+
break;
|
|
202
|
+
case "SHA3-512":
|
|
203
|
+
digest = (0, sha3_js_1.sha3_512)(data);
|
|
204
|
+
break;
|
|
205
|
+
default:
|
|
206
|
+
throw new Error(`Unsupported SHA-3 algorithm: ${options.algorithm}`);
|
|
207
|
+
}
|
|
208
|
+
return {
|
|
209
|
+
digest: Buffer.from(digest).toString("hex"),
|
|
210
|
+
accelerated: false,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=webcrypto-modern.js.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface WorkerPoolOptions {
|
|
2
|
+
size?: number;
|
|
3
|
+
workerScript?: string;
|
|
4
|
+
}
|
|
5
|
+
export interface WorkerTask {
|
|
6
|
+
modulePath: string;
|
|
7
|
+
functionName: string;
|
|
8
|
+
args: unknown[];
|
|
9
|
+
}
|
|
10
|
+
export declare class WorkerPool {
|
|
11
|
+
private workers;
|
|
12
|
+
private queue;
|
|
13
|
+
private terminated;
|
|
14
|
+
readonly size: number;
|
|
15
|
+
constructor(options?: WorkerPoolOptions);
|
|
16
|
+
execute<T = unknown>(task: WorkerTask): Promise<T>;
|
|
17
|
+
shutdown(): Promise<void>;
|
|
18
|
+
get pending(): number;
|
|
19
|
+
get active(): number;
|
|
20
|
+
private dispatch;
|
|
21
|
+
private processQueue;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=worker-pool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-pool.d.ts","sourceRoot":"","sources":["../../src/accel/worker-pool.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,iBAAiB;IAEhC,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAGD,MAAM,WAAW,UAAU;IAEzB,UAAU,EAAE,MAAM,CAAC;IAEnB,YAAY,EAAE,MAAM,CAAC;IAErB,IAAI,EAAE,OAAO,EAAE,CAAC;CACjB;AAiED,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,UAAU,CAAS;IAE3B,SAAgB,IAAI,EAAE,MAAM,CAAC;gBAEjB,OAAO,GAAE,iBAAsB;IA6B3C,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC;IA2B5C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB/B,IAAI,OAAO,IAAI,MAAM,CAEpB;IAKD,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,OAAO,CAAC,QAAQ;IAsChB,OAAO,CAAC,YAAY;CAMrB"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WorkerPool = void 0;
|
|
4
|
+
const node_worker_threads_1 = require("node:worker_threads");
|
|
5
|
+
const node_os_1 = require("node:os");
|
|
6
|
+
const WORKER_SCRIPT = `
|
|
7
|
+
const { parentPort } = require("node:worker_threads");
|
|
8
|
+
const { isAbsolute } = require("node:path");
|
|
9
|
+
const { pathToFileURL } = require("node:url");
|
|
10
|
+
|
|
11
|
+
parentPort.on("message", async (msg) => {
|
|
12
|
+
try {
|
|
13
|
+
// import() needs a file:// URL for absolute paths on Windows
|
|
14
|
+
// ("D:\\..." is read as a URL with scheme "d:").
|
|
15
|
+
const specifier = isAbsolute(msg.modulePath)
|
|
16
|
+
? pathToFileURL(msg.modulePath).href
|
|
17
|
+
: msg.modulePath;
|
|
18
|
+
const mod = await import(specifier);
|
|
19
|
+
const fn = mod[msg.functionName];
|
|
20
|
+
if (typeof fn !== "function") {
|
|
21
|
+
throw new Error(\`"\${msg.functionName}" is not a function in \${msg.modulePath}\`);
|
|
22
|
+
}
|
|
23
|
+
const result = await fn(...msg.args);
|
|
24
|
+
parentPort.postMessage({ success: true, result });
|
|
25
|
+
} catch (err) {
|
|
26
|
+
parentPort.postMessage({
|
|
27
|
+
success: false,
|
|
28
|
+
error: err instanceof Error ? err.message : String(err),
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
`;
|
|
33
|
+
class WorkerPool {
|
|
34
|
+
workers = [];
|
|
35
|
+
queue = [];
|
|
36
|
+
terminated = false;
|
|
37
|
+
size;
|
|
38
|
+
constructor(options = {}) {
|
|
39
|
+
if (!node_worker_threads_1.isMainThread) {
|
|
40
|
+
throw new Error("WorkerPool must be created from the main thread");
|
|
41
|
+
}
|
|
42
|
+
this.size = Math.max(1, options.size ?? Math.floor((0, node_os_1.cpus)().length / 2));
|
|
43
|
+
const script = options.workerScript ?? undefined;
|
|
44
|
+
for (let i = 0; i < this.size; i++) {
|
|
45
|
+
const worker = script
|
|
46
|
+
? new node_worker_threads_1.Worker(script)
|
|
47
|
+
: new node_worker_threads_1.Worker(WORKER_SCRIPT, { eval: true });
|
|
48
|
+
this.workers.push({ worker, busy: false });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
execute(task) {
|
|
52
|
+
if (this.terminated) {
|
|
53
|
+
return Promise.reject(new Error("WorkerPool has been shut down"));
|
|
54
|
+
}
|
|
55
|
+
return new Promise((resolve, reject) => {
|
|
56
|
+
const pending = {
|
|
57
|
+
task,
|
|
58
|
+
resolve: resolve,
|
|
59
|
+
reject,
|
|
60
|
+
};
|
|
61
|
+
const available = this.workers.find((w) => !w.busy);
|
|
62
|
+
if (available) {
|
|
63
|
+
this.dispatch(available, pending);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
this.queue.push(pending);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
async shutdown() {
|
|
71
|
+
this.terminated = true;
|
|
72
|
+
for (const pending of this.queue) {
|
|
73
|
+
pending.reject(new Error("WorkerPool is shutting down"));
|
|
74
|
+
}
|
|
75
|
+
this.queue = [];
|
|
76
|
+
const terminations = this.workers.map((entry) => entry.worker.terminate());
|
|
77
|
+
await Promise.all(terminations);
|
|
78
|
+
this.workers = [];
|
|
79
|
+
}
|
|
80
|
+
get pending() {
|
|
81
|
+
return this.queue.length;
|
|
82
|
+
}
|
|
83
|
+
get active() {
|
|
84
|
+
return this.workers.filter((w) => w.busy).length;
|
|
85
|
+
}
|
|
86
|
+
dispatch(entry, pending) {
|
|
87
|
+
entry.busy = true;
|
|
88
|
+
const handler = (msg) => {
|
|
89
|
+
entry.worker.off("message", handler);
|
|
90
|
+
entry.worker.off("error", errorHandler);
|
|
91
|
+
entry.busy = false;
|
|
92
|
+
if (msg.success) {
|
|
93
|
+
pending.resolve(msg.result);
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
pending.reject(new Error(msg.error ?? "Worker task failed"));
|
|
97
|
+
}
|
|
98
|
+
this.processQueue(entry);
|
|
99
|
+
};
|
|
100
|
+
const errorHandler = (err) => {
|
|
101
|
+
entry.worker.off("message", handler);
|
|
102
|
+
entry.worker.off("error", errorHandler);
|
|
103
|
+
entry.busy = false;
|
|
104
|
+
pending.reject(err);
|
|
105
|
+
this.processQueue(entry);
|
|
106
|
+
};
|
|
107
|
+
entry.worker.on("message", handler);
|
|
108
|
+
entry.worker.on("error", errorHandler);
|
|
109
|
+
entry.worker.postMessage(pending.task);
|
|
110
|
+
}
|
|
111
|
+
processQueue(entry) {
|
|
112
|
+
if (this.queue.length > 0) {
|
|
113
|
+
const next = this.queue.shift();
|
|
114
|
+
this.dispatch(entry, next);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
exports.WorkerPool = WorkerPool;
|
|
119
|
+
//# sourceMappingURL=worker-pool.js.map
|
package/dist/bin/cryptolib.d.ts
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { dataDecrypt, dataEncrypt, dataGenerate, dataReformat, dataRevoke, dataSessionKey, dataSign, dataVerify } from "../types/types";
|
|
2
|
-
|
|
3
|
-
export declare function
|
|
2
|
+
import type { ArmoredKeyResult } from "../lib/reformat.js";
|
|
3
|
+
export declare function decrypt(data: dataDecrypt): Promise<{
|
|
4
|
+
data: string;
|
|
5
|
+
signatureValid: boolean;
|
|
6
|
+
}>;
|
|
7
|
+
export declare function encrypt(data: dataEncrypt): Promise<string>;
|
|
4
8
|
export declare function generate(data: dataGenerate): Promise<object>;
|
|
5
|
-
export declare function reformat(data: dataReformat): Promise<
|
|
9
|
+
export declare function reformat(data: dataReformat): Promise<ArmoredKeyResult>;
|
|
6
10
|
export declare function session(data: dataSessionKey): Promise<import("openpgp").SessionKey>;
|
|
7
|
-
export declare function revoke(data: dataRevoke): Promise<
|
|
11
|
+
export declare function revoke(data: dataRevoke): Promise<ArmoredKeyResult>;
|
|
8
12
|
export declare function sign(data: dataSign): Promise<string>;
|
|
9
|
-
export declare function verify(data: dataVerify): Promise<import("openpgp").VerifyMessageResult
|
|
10
|
-
data: import("openpgp").WebStream<string>;
|
|
11
|
-
}>;
|
|
13
|
+
export declare function verify(data: dataVerify): Promise<import("openpgp").VerifyMessageResult<GenericWebStream<T>>>;
|
|
12
14
|
declare const _default: {
|
|
13
15
|
decrypt: typeof decrypt;
|
|
14
16
|
encrypt: typeof encrypt;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cryptolib.d.ts","sourceRoot":"","sources":["../../src/bin/cryptolib.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,cAAc,EACd,QAAQ,EACR,UAAU,EACX,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"cryptolib.d.ts","sourceRoot":"","sources":["../../src/bin/cryptolib.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EACX,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,cAAc,EACd,QAAQ,EACR,UAAU,EACX,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAkB3D,wBAAsB,OAAO,CAAC,IAAI,EAAE,WAAW;;;GAG9C;AAkBD,wBAAsB,OAAO,CAAC,IAAI,EAAE,WAAW,mBAG9C;AAwBD,wBAAsB,QAAQ,CAAC,IAAI,EAAE,YAAY,mBAGhD;AAGD,wBAAsB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAG5E;AAoBD,wBAAsB,OAAO,CAAC,IAAI,EAAE,cAAc,yCAGjD;AAgBD,wBAAsB,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAGxE;AAiBD,wBAAsB,IAAI,CAAC,IAAI,EAAE,QAAQ,mBAGxC;AAiBD,wBAAsB,MAAM,CAAC,IAAI,EAAE,UAAU,uEAG5C;;;;;;;;;;;AAOD,wBAiBE"}
|
package/dist/bin/cryptolib.js
CHANGED
|
@@ -15,56 +15,65 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
15
15
|
}) : function(o, v) {
|
|
16
16
|
o["default"] = v;
|
|
17
17
|
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
};
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
25
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.
|
|
36
|
+
exports.decrypt = decrypt;
|
|
37
|
+
exports.encrypt = encrypt;
|
|
38
|
+
exports.generate = generate;
|
|
39
|
+
exports.reformat = reformat;
|
|
40
|
+
exports.session = session;
|
|
41
|
+
exports.revoke = revoke;
|
|
42
|
+
exports.sign = sign;
|
|
43
|
+
exports.verify = verify;
|
|
27
44
|
const key = __importStar(require("../lib"));
|
|
28
45
|
async function decrypt(data) {
|
|
29
46
|
const decrypt = await key.decrypt.default(data);
|
|
30
47
|
return decrypt;
|
|
31
48
|
}
|
|
32
|
-
exports.decrypt = decrypt;
|
|
33
49
|
async function encrypt(data) {
|
|
34
50
|
const encrypt = await key.encrypt.default(data);
|
|
35
51
|
return encrypt;
|
|
36
52
|
}
|
|
37
|
-
exports.encrypt = encrypt;
|
|
38
53
|
async function generate(data) {
|
|
39
54
|
const generate = await key.generate.default(data);
|
|
40
55
|
return generate;
|
|
41
56
|
}
|
|
42
|
-
exports.generate = generate;
|
|
43
57
|
async function reformat(data) {
|
|
44
58
|
const reformat = await key.reformat.default(data);
|
|
45
59
|
return reformat;
|
|
46
60
|
}
|
|
47
|
-
exports.reformat = reformat;
|
|
48
61
|
async function session(data) {
|
|
49
62
|
const verify = await key.session.default(data);
|
|
50
63
|
return verify;
|
|
51
64
|
}
|
|
52
|
-
exports.session = session;
|
|
53
65
|
async function revoke(data) {
|
|
54
66
|
const revoke = await key.revoke.default(data);
|
|
55
67
|
return revoke;
|
|
56
68
|
}
|
|
57
|
-
exports.revoke = revoke;
|
|
58
69
|
async function sign(data) {
|
|
59
70
|
const sign = await key.sign.default(data);
|
|
60
71
|
return sign;
|
|
61
72
|
}
|
|
62
|
-
exports.sign = sign;
|
|
63
73
|
async function verify(data) {
|
|
64
74
|
const verify = await key.verify.default(data);
|
|
65
75
|
return verify;
|
|
66
76
|
}
|
|
67
|
-
exports.verify = verify;
|
|
68
77
|
exports.default = {
|
|
69
78
|
decrypt,
|
|
70
79
|
encrypt,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":";;;;;;AAGA,wBAgEE"}
|
package/dist/crypto.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type HashAlgorithm } from "./modern/hash";
|
|
2
|
+
import { type KeyAlgorithm, type KeyMetadata, type GeneratedKeyPair } from "./keys/keygen";
|
|
3
|
+
import { type HashPasswordResult, type VerifyPasswordResult } from "./modern/password";
|
|
4
|
+
import { getAlgorithm, isDeprecated, recommended, listAlgorithms } from "./registry";
|
|
5
|
+
import { type HmacAlgorithm } from "./modern/mac";
|
|
6
|
+
export type SignAlgorithm = "ed25519" | "ed448" | "ecdsa-p256" | "ecdsa-p384" | "schnorr" | "ml-dsa-44" | "ml-dsa-65" | "ml-dsa-87";
|
|
7
|
+
export interface VerifyPasswordOptions {
|
|
8
|
+
password: string | Uint8Array;
|
|
9
|
+
hash: string;
|
|
10
|
+
salt: string;
|
|
11
|
+
params: {
|
|
12
|
+
t: number;
|
|
13
|
+
m: number;
|
|
14
|
+
p: number;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export interface HmacVerifyOptions {
|
|
18
|
+
algorithm: HmacAlgorithm;
|
|
19
|
+
key: string | Uint8Array;
|
|
20
|
+
data: string | Uint8Array;
|
|
21
|
+
mac: string;
|
|
22
|
+
}
|
|
23
|
+
export declare const crypto: {
|
|
24
|
+
readonly randomKey: () => string;
|
|
25
|
+
readonly encrypt: (key: string | Uint8Array, plaintext: string | Uint8Array) => string;
|
|
26
|
+
readonly decrypt: (key: string | Uint8Array, ciphertext: string) => Uint8Array;
|
|
27
|
+
readonly hash: (algorithm: HashAlgorithm, data: string | Uint8Array) => string;
|
|
28
|
+
readonly generateKeyPair: (algorithm: KeyAlgorithm, metadata?: KeyMetadata) => GeneratedKeyPair;
|
|
29
|
+
readonly sign: (algorithm: SignAlgorithm, privateKeyHex: string, message: string | Uint8Array) => string;
|
|
30
|
+
readonly verify: (algorithm: SignAlgorithm, publicKeyHex: string, message: string | Uint8Array, signatureHex: string) => boolean;
|
|
31
|
+
readonly hashPassword: (password: string | Uint8Array) => HashPasswordResult;
|
|
32
|
+
readonly verifyPassword: (options: VerifyPasswordOptions) => VerifyPasswordResult;
|
|
33
|
+
readonly verifyPasswordPhc: (password: string | Uint8Array, phc: string) => VerifyPasswordResult;
|
|
34
|
+
readonly hmac: (algorithm: HmacAlgorithm, key: string | Uint8Array, data: string | Uint8Array) => string;
|
|
35
|
+
readonly hmacVerify: (options: HmacVerifyOptions) => boolean;
|
|
36
|
+
readonly registry: {
|
|
37
|
+
readonly get: typeof getAlgorithm;
|
|
38
|
+
readonly list: typeof listAlgorithms;
|
|
39
|
+
readonly recommended: typeof recommended;
|
|
40
|
+
readonly isDeprecated: typeof isDeprecated;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=crypto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"AA0BA,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACtB,MAAM,eAAe,CAAC;AAavB,OAAO,EAIL,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EAC1B,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,cAAc,EACf,MAAM,YAAY,CAAC;AACpB,OAAO,EAA2B,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAI3E,MAAM,MAAM,aAAa,GACrB,SAAS,GACT,OAAO,GACP,YAAY,GACZ,YAAY,GACZ,SAAS,GACT,WAAW,GACX,WAAW,GACX,WAAW,CAAC;AAGhB,MAAM,WAAW,qBAAqB;IAEpC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAAC;IAE9B,IAAI,EAAE,MAAM,CAAC;IAEb,IAAI,EAAE,MAAM,CAAC;IAEb,MAAM,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7C;AAGD,MAAM,WAAW,iBAAiB;IAEhC,SAAS,EAAE,aAAa,CAAC;IAEzB,GAAG,EAAE,MAAM,GAAG,UAAU,CAAC;IAEzB,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IAE1B,GAAG,EAAE,MAAM,CAAC;CACb;AAKD,eAAO,MAAM,MAAM;8BAWJ,MAAM;4BAgBN,MAAM,GAAG,UAAU,aAAa,MAAM,GAAG,UAAU,KAAG,MAAM;4BAiB5D,MAAM,GAAG,UAAU,cAAc,MAAM,KAAG,UAAU;+BAgBjD,aAAa,QAAQ,MAAM,GAAG,UAAU,KAAG,MAAM;0CAkBpD,YAAY,aACZ,WAAW,KACrB,gBAAgB;+BAmBN,aAAa,iBACT,MAAM,WACZ,MAAM,GAAG,UAAU,KAC3B,MAAM;iCA0CI,aAAa,gBACV,MAAM,WACX,MAAM,GAAG,UAAU,gBACd,MAAM,KACnB,OAAO;sCAsCa,MAAM,GAAG,UAAU,KAAG,kBAAkB;uCAoBvC,qBAAqB,KAAG,oBAAoB;2CAsBxD,MAAM,GAAG,UAAU,OACxB,MAAM,KACV,oBAAoB;+BAkBV,aAAa,OACnB,MAAM,GAAG,UAAU,QAClB,MAAM,GAAG,UAAU,KACxB,MAAM;mCAoBW,iBAAiB,KAAG,OAAO;;;;;;;CAoBvC,CAAC"}
|
package/dist/crypto.js
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.crypto = void 0;
|
|
4
|
+
const secretbox_1 = require("./high-level/secretbox");
|
|
5
|
+
const hash_1 = require("./modern/hash");
|
|
6
|
+
const keygen_1 = require("./keys/keygen");
|
|
7
|
+
const signing_1 = require("./modern/signing");
|
|
8
|
+
const curves_1 = require("./modern/curves");
|
|
9
|
+
const pq_sign_1 = require("./modern/pq-sign");
|
|
10
|
+
const password_1 = require("./modern/password");
|
|
11
|
+
const utils_js_1 = require("@noble/ciphers/utils.js");
|
|
12
|
+
const registry_1 = require("./registry");
|
|
13
|
+
const mac_1 = require("./modern/mac");
|
|
14
|
+
const errors_1 = require("./errors");
|
|
15
|
+
exports.crypto = {
|
|
16
|
+
randomKey() {
|
|
17
|
+
return Buffer.from((0, utils_js_1.randomBytes)(32)).toString("hex");
|
|
18
|
+
},
|
|
19
|
+
encrypt(key, plaintext) {
|
|
20
|
+
return (0, secretbox_1.seal)(key, plaintext).sealed;
|
|
21
|
+
},
|
|
22
|
+
decrypt(key, ciphertext) {
|
|
23
|
+
return (0, secretbox_1.open)(key, ciphertext);
|
|
24
|
+
},
|
|
25
|
+
hash(algorithm, data) {
|
|
26
|
+
return (0, hash_1.hash)({ algorithm, data }).digest;
|
|
27
|
+
},
|
|
28
|
+
generateKeyPair(algorithm, metadata) {
|
|
29
|
+
return (0, keygen_1.generateKeyPair)(algorithm, metadata);
|
|
30
|
+
},
|
|
31
|
+
sign(algorithm, privateKeyHex, message) {
|
|
32
|
+
switch (algorithm) {
|
|
33
|
+
case "ed25519":
|
|
34
|
+
return (0, signing_1.ed25519Sign)(privateKeyHex, message).signature;
|
|
35
|
+
case "ed448":
|
|
36
|
+
return (0, curves_1.ed448Sign)(privateKeyHex, message).signature;
|
|
37
|
+
case "ecdsa-p256":
|
|
38
|
+
return (0, curves_1.p256Sign)(privateKeyHex, message).signature;
|
|
39
|
+
case "ecdsa-p384":
|
|
40
|
+
return (0, curves_1.p384Sign)(privateKeyHex, message).signature;
|
|
41
|
+
case "schnorr":
|
|
42
|
+
return (0, curves_1.schnorrSign)(privateKeyHex, message).signature;
|
|
43
|
+
case "ml-dsa-44":
|
|
44
|
+
return (0, pq_sign_1.mlDsaSign)(44, privateKeyHex, message).signature;
|
|
45
|
+
case "ml-dsa-65":
|
|
46
|
+
return (0, pq_sign_1.mlDsaSign)(65, privateKeyHex, message).signature;
|
|
47
|
+
case "ml-dsa-87":
|
|
48
|
+
return (0, pq_sign_1.mlDsaSign)(87, privateKeyHex, message).signature;
|
|
49
|
+
default:
|
|
50
|
+
throw new errors_1.CryptoError(`Unsupported signing algorithm: ${algorithm}`, errors_1.CryptoErrorCode.UNSUPPORTED_ALGORITHM);
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
verify(algorithm, publicKeyHex, message, signatureHex) {
|
|
54
|
+
switch (algorithm) {
|
|
55
|
+
case "ed25519":
|
|
56
|
+
return (0, signing_1.ed25519Verify)(publicKeyHex, message, signatureHex).valid;
|
|
57
|
+
case "ed448":
|
|
58
|
+
return (0, curves_1.ed448Verify)(publicKeyHex, message, signatureHex).valid;
|
|
59
|
+
case "ecdsa-p256":
|
|
60
|
+
return (0, curves_1.p256Verify)(publicKeyHex, message, signatureHex).valid;
|
|
61
|
+
case "ecdsa-p384":
|
|
62
|
+
return (0, curves_1.p384Verify)(publicKeyHex, message, signatureHex).valid;
|
|
63
|
+
case "schnorr":
|
|
64
|
+
return (0, curves_1.schnorrVerify)(publicKeyHex, message, signatureHex).valid;
|
|
65
|
+
case "ml-dsa-44":
|
|
66
|
+
return (0, pq_sign_1.mlDsaVerify)(44, publicKeyHex, message, signatureHex).valid;
|
|
67
|
+
case "ml-dsa-65":
|
|
68
|
+
return (0, pq_sign_1.mlDsaVerify)(65, publicKeyHex, message, signatureHex).valid;
|
|
69
|
+
case "ml-dsa-87":
|
|
70
|
+
return (0, pq_sign_1.mlDsaVerify)(87, publicKeyHex, message, signatureHex).valid;
|
|
71
|
+
default:
|
|
72
|
+
throw new errors_1.CryptoError(`Unsupported verify algorithm: ${algorithm}`, errors_1.CryptoErrorCode.UNSUPPORTED_ALGORITHM);
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
hashPassword(password) {
|
|
76
|
+
return (0, password_1.hashPassword)({ password });
|
|
77
|
+
},
|
|
78
|
+
verifyPassword(options) {
|
|
79
|
+
return (0, password_1.verifyPassword)({
|
|
80
|
+
password: options.password,
|
|
81
|
+
hash: options.hash,
|
|
82
|
+
salt: options.salt,
|
|
83
|
+
params: options.params,
|
|
84
|
+
});
|
|
85
|
+
},
|
|
86
|
+
verifyPasswordPhc(password, phc) {
|
|
87
|
+
return (0, password_1.verifyPasswordPhc)({ password, phc });
|
|
88
|
+
},
|
|
89
|
+
hmac(algorithm, key, data) {
|
|
90
|
+
return (0, mac_1.computeHmac)({ algorithm, key, data }).mac;
|
|
91
|
+
},
|
|
92
|
+
hmacVerify(options) {
|
|
93
|
+
return (0, mac_1.verifyHmac)({
|
|
94
|
+
algorithm: options.algorithm,
|
|
95
|
+
key: options.key,
|
|
96
|
+
data: options.data,
|
|
97
|
+
mac: options.mac,
|
|
98
|
+
}).valid;
|
|
99
|
+
},
|
|
100
|
+
registry: {
|
|
101
|
+
get: registry_1.getAlgorithm,
|
|
102
|
+
list: registry_1.listAlgorithms,
|
|
103
|
+
recommended: registry_1.recommended,
|
|
104
|
+
isDeprecated: registry_1.isDeprecated,
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
//# sourceMappingURL=crypto.js.map
|