Delete 100 files via Git Manager GUI
This commit is contained in:
-4
@@ -1,4 +0,0 @@
|
|||||||
import { sign } from './sign';
|
|
||||||
import { createSeaSignTool, SeaOptions, InternalSeaOptions } from './sea';
|
|
||||||
import { HookFunction, OptionalHookOptions, OptionalSignToolOptions, SignOptions, SignToolOptions, SignOptionsForDirectory, SignOptionsForFiles } from './types';
|
|
||||||
export { sign, SignOptions, SignToolOptions, HookFunction, OptionalSignToolOptions, OptionalHookOptions, createSeaSignTool, SeaOptions, InternalSeaOptions, SignOptionsForDirectory, SignOptionsForFiles };
|
|
||||||
-3
@@ -1,3 +0,0 @@
|
|||||||
import { sign } from './sign';
|
|
||||||
import { createSeaSignTool } from './sea';
|
|
||||||
export { sign, createSeaSignTool };
|
|
||||||
-61
@@ -1,61 +0,0 @@
|
|||||||
import { SignToolOptions } from './types';
|
|
||||||
/**
|
|
||||||
* Options for signing with a Node.js single executable application.
|
|
||||||
*
|
|
||||||
* @category Single executable applications
|
|
||||||
*/
|
|
||||||
export interface SeaOptions {
|
|
||||||
/**
|
|
||||||
* Full path to the Node.js single executable application. Needs to end with `.exe`.
|
|
||||||
*/
|
|
||||||
path: string;
|
|
||||||
/**
|
|
||||||
* A binary to use. Will use the current executable (process.execPath) by default.
|
|
||||||
*
|
|
||||||
* @defaultValue The Node.js {@link https://nodejs.org/api/process.html#processexecpath | `process.execPath`}
|
|
||||||
*/
|
|
||||||
bin?: string;
|
|
||||||
/**
|
|
||||||
* Options to pass to SignTool.
|
|
||||||
*/
|
|
||||||
windowsSign: SignToolOptions;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* This interface represents {@link SeaOptions} with all optional properties
|
|
||||||
* inferred by `@electron/windows-sign` if not passed in by the user.
|
|
||||||
*
|
|
||||||
* @category Single executable applications
|
|
||||||
*/
|
|
||||||
export interface InternalSeaOptions extends Required<SeaOptions> {
|
|
||||||
/**
|
|
||||||
* Directory of the Node.js single executable application.
|
|
||||||
*/
|
|
||||||
dir: string;
|
|
||||||
/**
|
|
||||||
* File name of the Node.js single executable application.
|
|
||||||
*/
|
|
||||||
filename: string;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* cross-dir uses new Error() stacks
|
|
||||||
* to figure out our directory in a way
|
|
||||||
* that's somewhat cross-compatible.
|
|
||||||
*
|
|
||||||
* We can't just use __dirname because it's
|
|
||||||
* undefined in ESM - and we can't use import.meta.url
|
|
||||||
* because TypeScript won't allow usage unless you're
|
|
||||||
* _only_ compiling for ESM.
|
|
||||||
*/
|
|
||||||
export declare const DIRNAME: string;
|
|
||||||
/**
|
|
||||||
* Uses Node's "Single Executable App" functionality
|
|
||||||
* to create a Node-driven signtool.exe that calls this
|
|
||||||
* module.
|
|
||||||
*
|
|
||||||
* This is useful with other tooling that _always_ calls
|
|
||||||
* a signtool.exe to sign. Some of those tools cannot be
|
|
||||||
* easily configured, but we _can_ override their signtool.exe.
|
|
||||||
*
|
|
||||||
* @category Single executable applications
|
|
||||||
*/
|
|
||||||
export declare function createSeaSignTool(options?: Partial<SeaOptions>): Promise<InternalSeaOptions>;
|
|
||||||
-213
@@ -1,213 +0,0 @@
|
|||||||
import { getDirname } from 'cross-dirname';
|
|
||||||
import path from 'path';
|
|
||||||
import os from 'os';
|
|
||||||
import fs from 'fs-extra';
|
|
||||||
import postject from 'postject';
|
|
||||||
import { spawnPromise } from './spawn';
|
|
||||||
import { log } from './utils/log';
|
|
||||||
/**
|
|
||||||
* cross-dir uses new Error() stacks
|
|
||||||
* to figure out our directory in a way
|
|
||||||
* that's somewhat cross-compatible.
|
|
||||||
*
|
|
||||||
* We can't just use __dirname because it's
|
|
||||||
* undefined in ESM - and we can't use import.meta.url
|
|
||||||
* because TypeScript won't allow usage unless you're
|
|
||||||
* _only_ compiling for ESM.
|
|
||||||
*/
|
|
||||||
export const DIRNAME = getDirname();
|
|
||||||
const FILENAMES = {
|
|
||||||
SEA_CONFIG: 'sea-config.json',
|
|
||||||
SEA_MAIN: 'sea.js',
|
|
||||||
SEA_BLOB: 'sea.blob',
|
|
||||||
SEA_RECEIVER: 'receiver.mjs'
|
|
||||||
};
|
|
||||||
const SEA_MAIN_SCRIPT = `
|
|
||||||
const bin = "%PATH_TO_BIN%";
|
|
||||||
const script = "%PATH_TO_SCRIPT%";
|
|
||||||
const options = %WINDOWS_SIGN_OPTIONS%
|
|
||||||
|
|
||||||
const { spawnSync } = require('child_process');
|
|
||||||
|
|
||||||
function main() {
|
|
||||||
console.log("@electron/windows-sign sea");
|
|
||||||
console.log({ bin, script });
|
|
||||||
|
|
||||||
try {
|
|
||||||
const spawn = spawnSync(
|
|
||||||
bin,
|
|
||||||
[ script, JSON.stringify(options), JSON.stringify(process.argv.slice(1)) ],
|
|
||||||
{ stdio: ['inherit', 'inherit', 'pipe'] }
|
|
||||||
);
|
|
||||||
|
|
||||||
if (spawn.status !== 0) {
|
|
||||||
throw new Error(\`Spawn failed with code: \${spawn.status}. Stderr: \${spawn.stderr}\`);
|
|
||||||
}
|
|
||||||
} catch (error) {
|
|
||||||
// Do not rethrow the error or write it to stdout/stderr. Then the process won't terminate.
|
|
||||||
// See: https://github.com/electron/windows-sign/pull/48
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
main();
|
|
||||||
`;
|
|
||||||
const SEA_RECEIVER_SCRIPT = `
|
|
||||||
import { sign } from '@electron/windows-sign';
|
|
||||||
import fs from 'fs-extra';
|
|
||||||
import path from 'path';
|
|
||||||
|
|
||||||
const logPath = path.join('electron-windows-sign.log');
|
|
||||||
const options = JSON.parse(process.argv[2]);
|
|
||||||
const signArgv = JSON.parse(process.argv[3]);
|
|
||||||
const files = signArgv.slice(-1);
|
|
||||||
|
|
||||||
try {
|
|
||||||
fs.appendFileSync(logPath, \`\\nCalled with: \${JSON.stringify(process.argv, null, 2)}\`);
|
|
||||||
|
|
||||||
sign({ ...options, files })
|
|
||||||
.then((result) => {
|
|
||||||
fs.appendFileSync(logPath, \`\\nSuccessfully signed with result: \${result}\`);
|
|
||||||
})
|
|
||||||
.catch((error) => {
|
|
||||||
fs.appendFileSync(logPath, \`\\nError from sign: \${error}\`);
|
|
||||||
throw new Error(error);
|
|
||||||
});
|
|
||||||
} catch (error) {
|
|
||||||
fs.appendFileSync(logPath, \`\\Error invoking sign: \${error}\`);
|
|
||||||
throw new Error(error);
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
/**
|
|
||||||
* Uses Node's "Single Executable App" functionality
|
|
||||||
* to create a Node-driven signtool.exe that calls this
|
|
||||||
* module.
|
|
||||||
*
|
|
||||||
* This is useful with other tooling that _always_ calls
|
|
||||||
* a signtool.exe to sign. Some of those tools cannot be
|
|
||||||
* easily configured, but we _can_ override their signtool.exe.
|
|
||||||
*
|
|
||||||
* @category Single executable applications
|
|
||||||
*/
|
|
||||||
export async function createSeaSignTool(options = {}) {
|
|
||||||
checkCompatibility();
|
|
||||||
const requiredOptions = await getOptions(options);
|
|
||||||
await createFiles(requiredOptions);
|
|
||||||
await createBlob(requiredOptions);
|
|
||||||
await createBinary(requiredOptions);
|
|
||||||
await createSeaReceiver(requiredOptions);
|
|
||||||
await cleanup(requiredOptions);
|
|
||||||
return requiredOptions;
|
|
||||||
}
|
|
||||||
async function createSeaReceiver(options) {
|
|
||||||
const receiverPath = path.join(options.dir, FILENAMES.SEA_RECEIVER);
|
|
||||||
await fs.ensureFile(receiverPath);
|
|
||||||
await fs.writeFile(receiverPath, SEA_RECEIVER_SCRIPT);
|
|
||||||
}
|
|
||||||
async function createFiles(options) {
|
|
||||||
const { dir, bin } = options;
|
|
||||||
const receiverPath = path.join(options.dir, FILENAMES.SEA_RECEIVER);
|
|
||||||
// sea-config.json
|
|
||||||
await fs.outputJSON(path.join(dir, FILENAMES.SEA_CONFIG), {
|
|
||||||
main: FILENAMES.SEA_MAIN,
|
|
||||||
output: FILENAMES.SEA_BLOB,
|
|
||||||
disableExperimentalSEAWarning: true
|
|
||||||
}, {
|
|
||||||
spaces: 2
|
|
||||||
});
|
|
||||||
// signtool.js
|
|
||||||
const binPath = bin || process.execPath;
|
|
||||||
const script = SEA_MAIN_SCRIPT
|
|
||||||
.replace('%PATH_TO_BIN%', escapeMaybe(binPath))
|
|
||||||
.replace('%PATH_TO_SCRIPT%', escapeMaybe(receiverPath))
|
|
||||||
.replace('%WINDOWS_SIGN_OPTIONS%', JSON.stringify(options.windowsSign));
|
|
||||||
await fs.outputFile(path.join(dir, FILENAMES.SEA_MAIN), script);
|
|
||||||
}
|
|
||||||
async function createBlob(options) {
|
|
||||||
const args = ['--experimental-sea-config', 'sea-config.json'];
|
|
||||||
const bin = process.execPath;
|
|
||||||
const cwd = options.dir;
|
|
||||||
log(`Calling ${bin} with options:`, args);
|
|
||||||
const { stderr, stdout } = await spawnPromise(bin, args, {
|
|
||||||
cwd
|
|
||||||
});
|
|
||||||
log('stdout:', stdout);
|
|
||||||
log('stderr:', stderr);
|
|
||||||
}
|
|
||||||
async function createBinary(options) {
|
|
||||||
const { dir, filename } = options;
|
|
||||||
log(`Creating ${filename} in ${dir}`);
|
|
||||||
// Copy Node over
|
|
||||||
const seaPath = path.join(dir, filename);
|
|
||||||
await fs.copyFile(process.execPath, seaPath);
|
|
||||||
// Remove the Node signature
|
|
||||||
const signtool = path.join(DIRNAME, '../../vendor/signtool.exe');
|
|
||||||
await spawnPromise(signtool, [
|
|
||||||
'remove',
|
|
||||||
'/s',
|
|
||||||
seaPath
|
|
||||||
]);
|
|
||||||
// Inject the blob
|
|
||||||
const blob = await fs.readFile(path.join(dir, FILENAMES.SEA_BLOB));
|
|
||||||
await postject.inject(seaPath, 'NODE_SEA_BLOB', blob, {
|
|
||||||
sentinelFuse: 'NODE_SEA_FUSE_fce680ab2cc467b6e072b8b5df1996b2'
|
|
||||||
});
|
|
||||||
}
|
|
||||||
async function cleanup(options) {
|
|
||||||
const { dir } = options;
|
|
||||||
const toRemove = [
|
|
||||||
FILENAMES.SEA_BLOB,
|
|
||||||
FILENAMES.SEA_MAIN,
|
|
||||||
FILENAMES.SEA_CONFIG
|
|
||||||
];
|
|
||||||
for (const file of toRemove) {
|
|
||||||
try {
|
|
||||||
await fs.remove(path.join(dir, file));
|
|
||||||
}
|
|
||||||
catch (error) {
|
|
||||||
console.warn(`Tried and failed to remove ${file}. Continuing.`, error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
async function getOptions(options) {
|
|
||||||
const cloned = { ...options };
|
|
||||||
if (!cloned.path) {
|
|
||||||
cloned.path = path.join(os.homedir(), '.electron', 'windows-sign', 'sea.exe');
|
|
||||||
await fs.ensureFile(cloned.path);
|
|
||||||
}
|
|
||||||
if (!cloned.bin) {
|
|
||||||
cloned.bin = process.execPath;
|
|
||||||
}
|
|
||||||
if (!cloned.windowsSign) {
|
|
||||||
throw new Error('Did not find windowsSign options, which are required');
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
path: cloned.path,
|
|
||||||
dir: path.dirname(cloned.path),
|
|
||||||
filename: path.basename(cloned.path),
|
|
||||||
bin: cloned.bin,
|
|
||||||
windowsSign: cloned.windowsSign
|
|
||||||
};
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Ensures that the current Node.js version supports SEA app generation and errors if not.
|
|
||||||
*/
|
|
||||||
function checkCompatibility() {
|
|
||||||
const version = process.versions.node;
|
|
||||||
const split = version.split('.');
|
|
||||||
const major = parseInt(split[0], 10);
|
|
||||||
if (major >= 20) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
throw new Error(`Your Node.js version (${process.version}) does not support Single Executable Applications. Please upgrade your version of Node.js.`);
|
|
||||||
}
|
|
||||||
/** Make sure that the input string has escaped backwards slashes
|
|
||||||
* - but never double-escaped backwards slashes.
|
|
||||||
*/
|
|
||||||
function escapeMaybe(input) {
|
|
||||||
const result = input.split(path.sep).join('\\\\');
|
|
||||||
if (result.includes('\\\\\\\\')) {
|
|
||||||
throw new Error(`Your passed input ${input} contains escaped slashes. Please do not escape them`);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
-8
@@ -1,8 +0,0 @@
|
|||||||
import { InternalSignOptions } from './types';
|
|
||||||
/**
|
|
||||||
* Sign with a hook function, basically letting everyone
|
|
||||||
* write completely custom sign logic
|
|
||||||
*
|
|
||||||
* @param {InternalSignOptions} options
|
|
||||||
*/
|
|
||||||
export declare function signWithHook(options: InternalSignOptions): Promise<void>;
|
|
||||||
-38
@@ -1,38 +0,0 @@
|
|||||||
import path from 'path';
|
|
||||||
import { log } from './utils/log';
|
|
||||||
let hookFunction;
|
|
||||||
function getHookFunction(options) {
|
|
||||||
if (options.hookFunction) {
|
|
||||||
return options.hookFunction;
|
|
||||||
}
|
|
||||||
if (options.hookModulePath) {
|
|
||||||
const module = require(path.resolve(options.hookModulePath));
|
|
||||||
if (module.default) {
|
|
||||||
return module.default;
|
|
||||||
}
|
|
||||||
if (typeof module === 'function') {
|
|
||||||
return module;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!hookFunction) {
|
|
||||||
throw new Error('No hook function found. Signing will not be possible. Please see the documentation for how to pass a hook function to @electron/windows-sign');
|
|
||||||
}
|
|
||||||
return hookFunction;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Sign with a hook function, basically letting everyone
|
|
||||||
* write completely custom sign logic
|
|
||||||
*
|
|
||||||
* @param {InternalSignOptions} options
|
|
||||||
*/
|
|
||||||
export async function signWithHook(options) {
|
|
||||||
hookFunction = getHookFunction(options);
|
|
||||||
for (const file of options.files) {
|
|
||||||
try {
|
|
||||||
await hookFunction(file);
|
|
||||||
}
|
|
||||||
catch (error) {
|
|
||||||
log(`Error signing ${file}`, error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-2
@@ -1,2 +0,0 @@
|
|||||||
import { InternalSignOptions } from './types';
|
|
||||||
export declare function signWithSignTool(options: InternalSignOptions): Promise<void>;
|
|
||||||
-111
@@ -1,111 +0,0 @@
|
|||||||
import path from 'path';
|
|
||||||
import { log } from './utils/log';
|
|
||||||
import { spawnPromise } from './spawn';
|
|
||||||
import { getDirname } from 'cross-dirname';
|
|
||||||
const DIRNAME = getDirname();
|
|
||||||
function getSigntoolArgs(options) {
|
|
||||||
// See the following url for docs
|
|
||||||
// https://learn.microsoft.com/en-us/dotnet/framework/tools/signtool-exe
|
|
||||||
const { certificateFile, certificatePassword, hash, timestampServer } = options;
|
|
||||||
const args = ['sign'];
|
|
||||||
// Automatically select cert
|
|
||||||
if (options.automaticallySelectCertificate) {
|
|
||||||
args.push('/a');
|
|
||||||
}
|
|
||||||
// Dual-sign
|
|
||||||
if (options.appendSignature) {
|
|
||||||
args.push('/as');
|
|
||||||
}
|
|
||||||
// Timestamp
|
|
||||||
if (hash === "sha256" /* HASHES.sha256 */) {
|
|
||||||
args.push('/tr', timestampServer);
|
|
||||||
args.push('/td', hash);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
args.push('/t', timestampServer);
|
|
||||||
}
|
|
||||||
// Certificate file
|
|
||||||
if (certificateFile) {
|
|
||||||
args.push('/f', path.resolve(certificateFile));
|
|
||||||
}
|
|
||||||
// Certificate password
|
|
||||||
if (certificatePassword) {
|
|
||||||
args.push('/p', certificatePassword);
|
|
||||||
}
|
|
||||||
// Hash
|
|
||||||
args.push('/fd', hash);
|
|
||||||
// Description
|
|
||||||
if (options.description) {
|
|
||||||
args.push('/d', options.description);
|
|
||||||
}
|
|
||||||
// Website
|
|
||||||
if (options.website) {
|
|
||||||
args.push('/du', options.website);
|
|
||||||
}
|
|
||||||
// Debug
|
|
||||||
if (options.debug) {
|
|
||||||
args.push('/debug');
|
|
||||||
}
|
|
||||||
if (options.signWithParams) {
|
|
||||||
const extraArgs = [];
|
|
||||||
if (Array.isArray(options.signWithParams)) {
|
|
||||||
extraArgs.push(...options.signWithParams);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Split up at spaces and doublequotes
|
|
||||||
extraArgs.push(...options.signWithParams.match(/(?:[^\s"]+|"[^"]*")+/g));
|
|
||||||
}
|
|
||||||
log('Parsed signWithParams as:', extraArgs);
|
|
||||||
args.push(...extraArgs);
|
|
||||||
}
|
|
||||||
return args;
|
|
||||||
}
|
|
||||||
async function execute(options) {
|
|
||||||
const { signToolPath, files } = options;
|
|
||||||
const args = getSigntoolArgs(options);
|
|
||||||
log('Executing signtool with args', { args, files });
|
|
||||||
const { code, stderr, stdout } = await spawnPromise(signToolPath, [...args, ...files], {
|
|
||||||
env: process.env,
|
|
||||||
cwd: process.cwd()
|
|
||||||
});
|
|
||||||
if (code !== 0) {
|
|
||||||
throw new Error(`Signtool exited with code ${code}. Stderr: ${stderr}. Stdout: ${stdout}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
export async function signWithSignTool(options) {
|
|
||||||
const certificatePassword = options.certificatePassword || process.env.WINDOWS_CERTIFICATE_PASSWORD;
|
|
||||||
const certificateFile = options.certificateFile || process.env.WINDOWS_CERTIFICATE_FILE;
|
|
||||||
const signWithParams = options.signWithParams || process.env.WINDOWS_SIGN_WITH_PARAMS;
|
|
||||||
const timestampServer = options.timestampServer || process.env.WINDOWS_TIMESTAMP_SERVER || 'http://timestamp.digicert.com';
|
|
||||||
const signToolPath = options.signToolPath || process.env.WINDOWS_SIGNTOOL_PATH || path.join(DIRNAME, '../../vendor/signtool.exe');
|
|
||||||
const description = options.description || process.env.WINDOWS_SIGN_DESCRIPTION;
|
|
||||||
const website = options.website || process.env.WINDOWS_SIGN_WEBSITE;
|
|
||||||
if (!certificateFile && !(signWithParams || signToolPath)) {
|
|
||||||
throw new Error('You must provide a certificateFile and a signToolPath or signing parameters');
|
|
||||||
}
|
|
||||||
if (!signToolPath && !signWithParams && !certificatePassword) {
|
|
||||||
throw new Error('You must provide a certificatePassword or signing parameters');
|
|
||||||
}
|
|
||||||
const internalOptions = {
|
|
||||||
appendSignature: false,
|
|
||||||
...options,
|
|
||||||
certificateFile,
|
|
||||||
certificatePassword,
|
|
||||||
signWithParams,
|
|
||||||
signToolPath,
|
|
||||||
description,
|
|
||||||
timestampServer,
|
|
||||||
website
|
|
||||||
};
|
|
||||||
const hashes = options.hashes == null || options.hashes.length === 0
|
|
||||||
? ["sha1" /* HASHES.sha1 */, "sha256" /* HASHES.sha256 */]
|
|
||||||
: options.hashes;
|
|
||||||
if (hashes.includes("sha1" /* HASHES.sha1 */)) {
|
|
||||||
await execute({ ...internalOptions, hash: "sha1" /* HASHES.sha1 */ });
|
|
||||||
// If we signed with SHA1, we need to append the SHA256 signature:
|
|
||||||
internalOptions.appendSignature = true;
|
|
||||||
}
|
|
||||||
if (hashes.includes("sha256" /* HASHES.sha256 */)) {
|
|
||||||
await execute({ ...internalOptions, hash: "sha256" /* HASHES.sha256 */ });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-13
@@ -1,13 +0,0 @@
|
|||||||
import { SignOptions } from './types';
|
|
||||||
/**
|
|
||||||
* This is the main function exported from this module. It'll
|
|
||||||
* look at your options, determine the best way to sign a file,
|
|
||||||
* and then return one of our internal functions to do the actual
|
|
||||||
* signing.
|
|
||||||
*
|
|
||||||
* @param options
|
|
||||||
* @returns {Promise<void>}
|
|
||||||
*
|
|
||||||
* @category Sign
|
|
||||||
*/
|
|
||||||
export declare function sign(options: SignOptions): Promise<void>;
|
|
||||||
-41
@@ -1,41 +0,0 @@
|
|||||||
import { getFilesToSign } from './files';
|
|
||||||
import { signWithHook } from './sign-with-hook';
|
|
||||||
import { signWithSignTool } from './sign-with-signtool';
|
|
||||||
import { enableDebugging, log } from './utils/log';
|
|
||||||
import { booleanFromEnv } from './utils/parse-env';
|
|
||||||
/**
|
|
||||||
* This is the main function exported from this module. It'll
|
|
||||||
* look at your options, determine the best way to sign a file,
|
|
||||||
* and then return one of our internal functions to do the actual
|
|
||||||
* signing.
|
|
||||||
*
|
|
||||||
* @param options
|
|
||||||
* @returns {Promise<void>}
|
|
||||||
*
|
|
||||||
* @category Sign
|
|
||||||
*/
|
|
||||||
export async function sign(options) {
|
|
||||||
const signJavaScript = options.signJavaScript || booleanFromEnv('WINDOWS_SIGN_JAVASCRIPT');
|
|
||||||
const hookModulePath = options.hookModulePath || process.env.WINDOWS_SIGN_HOOK_MODULE_PATH;
|
|
||||||
if (options.debug) {
|
|
||||||
enableDebugging();
|
|
||||||
}
|
|
||||||
log('Called with options', { options });
|
|
||||||
const files = getFilesToSign(options);
|
|
||||||
const internalOptions = {
|
|
||||||
...options,
|
|
||||||
signJavaScript,
|
|
||||||
hookModulePath,
|
|
||||||
files
|
|
||||||
};
|
|
||||||
// If a hook is provides, sign with the hook
|
|
||||||
if (internalOptions.hookFunction || internalOptions.hookModulePath) {
|
|
||||||
log('Signing with hook');
|
|
||||||
return signWithHook(internalOptions);
|
|
||||||
}
|
|
||||||
// If we're going with the defaults, we're signing
|
|
||||||
// with signtool. Custom signing tools are also
|
|
||||||
// handled here.
|
|
||||||
log('Signing with signtool');
|
|
||||||
return signWithSignTool(internalOptions);
|
|
||||||
}
|
|
||||||
-16
@@ -1,16 +0,0 @@
|
|||||||
/// <reference types="node" />
|
|
||||||
import { SpawnOptions } from 'child_process';
|
|
||||||
export interface SpawnPromiseResult {
|
|
||||||
stdout: string;
|
|
||||||
stderr: string;
|
|
||||||
code: number;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Spawn a process as a promise
|
|
||||||
*
|
|
||||||
* @param {string} name
|
|
||||||
* @param {Array<string>} args
|
|
||||||
* @param {SpawnOptions} [options]
|
|
||||||
* @returns {Promise<SpawnPromiseResult>}
|
|
||||||
*/
|
|
||||||
export declare function spawnPromise(name: string, args: Array<string>, options?: SpawnOptions): Promise<SpawnPromiseResult>;
|
|
||||||
-30
@@ -1,30 +0,0 @@
|
|||||||
import { log } from './utils/log';
|
|
||||||
/**
|
|
||||||
* Spawn a process as a promise
|
|
||||||
*
|
|
||||||
* @param {string} name
|
|
||||||
* @param {Array<string>} args
|
|
||||||
* @param {SpawnOptions} [options]
|
|
||||||
* @returns {Promise<SpawnPromiseResult>}
|
|
||||||
*/
|
|
||||||
export function spawnPromise(name, args, options) {
|
|
||||||
return new Promise((resolve) => {
|
|
||||||
const { spawn } = require('child_process');
|
|
||||||
const fork = spawn(name, args, options);
|
|
||||||
log(`Spawning ${name} with ${args}`);
|
|
||||||
let stdout = '';
|
|
||||||
let stderr = '';
|
|
||||||
fork.stdout.on('data', (data) => {
|
|
||||||
log(`Spawn ${name} stdout: ${data}`);
|
|
||||||
stdout += data;
|
|
||||||
});
|
|
||||||
fork.stderr.on('data', (data) => {
|
|
||||||
log(`Spawn ${name} stderr: ${data}`);
|
|
||||||
stderr += data;
|
|
||||||
});
|
|
||||||
fork.on('close', (code) => {
|
|
||||||
log(`Spawn ${name}: Child process exited with code ${code}`);
|
|
||||||
resolve({ stdout, stderr, code });
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
-143
@@ -1,143 +0,0 @@
|
|||||||
/**
|
|
||||||
* SHA-1 has been deprecated on Windows since 2016. We'll still dualsign.
|
|
||||||
* https://social.technet.microsoft.com/wiki/contents/articles/32288.windows-enforcement-of-sha1-certificates.aspx#Post-February_TwentySeventeen_Plan
|
|
||||||
*/
|
|
||||||
export declare const enum HASHES {
|
|
||||||
sha1 = "sha1",
|
|
||||||
sha256 = "sha256"
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Signing can be either by specifying a directory of files to sign.
|
|
||||||
*
|
|
||||||
* @category Sign
|
|
||||||
*/
|
|
||||||
export type SignOptions = SignOptionsForDirectory | SignOptionsForFiles;
|
|
||||||
/**
|
|
||||||
* Options for signing by passing a path to a directory to be codesigned.
|
|
||||||
*
|
|
||||||
* @category Sign
|
|
||||||
*/
|
|
||||||
export interface SignOptionsForDirectory extends SignToolOptions {
|
|
||||||
/**
|
|
||||||
* Path to the application directory. We will scan this
|
|
||||||
* directory for any `.dll`, `.exe`, `.msi`, or `.node` files and
|
|
||||||
* codesign them with `signtool.exe`.
|
|
||||||
*/
|
|
||||||
appDirectory: string;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Options for signing by passing an array of files to be codesigned.
|
|
||||||
*
|
|
||||||
* @category Sign
|
|
||||||
*/
|
|
||||||
export interface SignOptionsForFiles extends SignToolOptions {
|
|
||||||
/**
|
|
||||||
* Array of paths to files to be codesigned with `signtool.exe`.
|
|
||||||
*/
|
|
||||||
files: Array<string>;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @category Utility
|
|
||||||
*/
|
|
||||||
export interface SignToolOptions extends OptionalSignToolOptions, OptionalHookOptions {
|
|
||||||
}
|
|
||||||
export interface InternalSignOptions extends SignOptionsForFiles {
|
|
||||||
}
|
|
||||||
export interface InternalSignToolOptions extends OptionalSignToolOptions, OptionalHookOptions {
|
|
||||||
signToolPath: string;
|
|
||||||
timestampServer: string;
|
|
||||||
files: Array<string>;
|
|
||||||
hash: HASHES;
|
|
||||||
appendSignature?: boolean;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @category Utility
|
|
||||||
*/
|
|
||||||
export interface OptionalSignToolOptions {
|
|
||||||
/**
|
|
||||||
* Path to a `.pfx` code signing certificate.
|
|
||||||
* Will use `process.env.WINDOWS_CERTIFICATE_FILE` if this option is not provided.
|
|
||||||
*/
|
|
||||||
certificateFile?: string;
|
|
||||||
/**
|
|
||||||
* Password to {@link certificateFile}. If you don't provide this,
|
|
||||||
* you need to provide the {@link signWithParams} option.
|
|
||||||
* Will use `process.env.WINDOWS_CERTIFICATE_PASSWORD` if this option is not provided.
|
|
||||||
*/
|
|
||||||
certificatePassword?: string;
|
|
||||||
/**
|
|
||||||
* Path to a timestamp server.
|
|
||||||
* Will use `process.env.WINDOWS_TIMESTAMP_SERVER` if this option is not provided.
|
|
||||||
*
|
|
||||||
* @defaultValue http://timestamp.digicert.com
|
|
||||||
*/
|
|
||||||
timestampServer?: string;
|
|
||||||
/**
|
|
||||||
* Description of the signed content. Will be passed to `signtool.exe` as `/d`.
|
|
||||||
*/
|
|
||||||
description?: string;
|
|
||||||
/**
|
|
||||||
* URL for the expanded description of the signed content. Will be passed to `signtool.exe` as `/du`.
|
|
||||||
*/
|
|
||||||
website?: string;
|
|
||||||
/**
|
|
||||||
* Path to the `signtool.exe` used to sign. Will use `vendor/signtool.exe` if not provided.
|
|
||||||
*/
|
|
||||||
signToolPath?: string;
|
|
||||||
/**
|
|
||||||
* Additional parameters to pass to `signtool.exe`.
|
|
||||||
*
|
|
||||||
* @see Microsoft's {@link https://learn.microsoft.com/en-us/dotnet/framework/tools/signtool-exe SignTool.exe documentation}
|
|
||||||
*/
|
|
||||||
signWithParams?: string | Array<string>;
|
|
||||||
/**
|
|
||||||
* Enables debug logging.
|
|
||||||
*
|
|
||||||
* @defaultValue false
|
|
||||||
*/
|
|
||||||
debug?: boolean;
|
|
||||||
/**
|
|
||||||
* Automatically selects the best signing certificate according to SignTool. Will be passed to `signtool.exe` as `/a`.
|
|
||||||
*
|
|
||||||
* @defaultValue true
|
|
||||||
*/
|
|
||||||
automaticallySelectCertificate?: boolean;
|
|
||||||
/**
|
|
||||||
* Whether or not to sign JavaScript files.
|
|
||||||
*
|
|
||||||
* @defaultValue false
|
|
||||||
*/
|
|
||||||
signJavaScript?: boolean;
|
|
||||||
/**
|
|
||||||
* Hash algorithms to use for signing.
|
|
||||||
*/
|
|
||||||
hashes?: HASHES[];
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Custom function that is called sequentially for each file that needs to be signed.
|
|
||||||
*
|
|
||||||
* @param fileToSign Absolute path to the file to sign
|
|
||||||
*
|
|
||||||
* @category Utility
|
|
||||||
*/
|
|
||||||
export type HookFunction = (fileToSign: string) => void | Promise<void>;
|
|
||||||
/**
|
|
||||||
* @category Utility
|
|
||||||
*/
|
|
||||||
export interface OptionalHookOptions {
|
|
||||||
/**
|
|
||||||
* A hook function called for each file that needs to be signed.
|
|
||||||
* Use this for full control over your app's signing logic.
|
|
||||||
* `@electron/windows-sign` will not attempt to sign with SignTool if a custom hook is detected.
|
|
||||||
*/
|
|
||||||
hookFunction?: HookFunction;
|
|
||||||
/**
|
|
||||||
* A path to a JavaScript file, exporting a single function that will be called for each file that needs to be signed.
|
|
||||||
* Use this for full control over your app's signing logic.
|
|
||||||
* `@electron/windows-sign` will not attempt to sign with SignTool if a custom hook is detected.
|
|
||||||
*/
|
|
||||||
hookModulePath?: string;
|
|
||||||
}
|
|
||||||
export interface InternalHookOptions extends OptionalHookOptions {
|
|
||||||
files: Array<string>;
|
|
||||||
}
|
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
export {};
|
|
||||||
-2
@@ -1,2 +0,0 @@
|
|||||||
export declare function enableDebugging(): void;
|
|
||||||
export declare const log: import("debug").Debugger;
|
|
||||||
-5
@@ -1,5 +0,0 @@
|
|||||||
import { debug as debugModule } from 'debug';
|
|
||||||
export function enableDebugging() {
|
|
||||||
debugModule.enable('electron-windows-sign');
|
|
||||||
}
|
|
||||||
export const log = debugModule('electron-windows-sign');
|
|
||||||
-11
@@ -1,11 +0,0 @@
|
|||||||
/**
|
|
||||||
* Tries to parse an process.env string to a boolean.
|
|
||||||
* Will understand undefined as the default value
|
|
||||||
* Will understand "false", "False", "fAlse", or "0" as `false`
|
|
||||||
* Will understand everything else as true
|
|
||||||
*
|
|
||||||
* @export
|
|
||||||
* @param {string} name
|
|
||||||
* @return {*} {boolean}
|
|
||||||
*/
|
|
||||||
export declare function booleanFromEnv(name: string): boolean | undefined;
|
|
||||||
-20
@@ -1,20 +0,0 @@
|
|||||||
/**
|
|
||||||
* Tries to parse an process.env string to a boolean.
|
|
||||||
* Will understand undefined as the default value
|
|
||||||
* Will understand "false", "False", "fAlse", or "0" as `false`
|
|
||||||
* Will understand everything else as true
|
|
||||||
*
|
|
||||||
* @export
|
|
||||||
* @param {string} name
|
|
||||||
* @return {*} {boolean}
|
|
||||||
*/
|
|
||||||
export function booleanFromEnv(name) {
|
|
||||||
const value = process.env[name];
|
|
||||||
if (value === undefined) {
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
if (value.toLowerCase() === 'false' || value === '0') {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return !!value;
|
|
||||||
}
|
|
||||||
-70
@@ -1,70 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "@electron/windows-sign",
|
|
||||||
"version": "1.2.2",
|
|
||||||
"description": "Codesign Electron Windows apps",
|
|
||||||
"main": "dist/cjs/index.js",
|
|
||||||
"module": "dist/esm/index.js",
|
|
||||||
"files": [
|
|
||||||
"dist",
|
|
||||||
"entitlements",
|
|
||||||
"README.md",
|
|
||||||
"LICENSE",
|
|
||||||
"bin",
|
|
||||||
"vendor"
|
|
||||||
],
|
|
||||||
"bin": {
|
|
||||||
"electron-windows-sign": "bin/electron-windows-sign.js"
|
|
||||||
},
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+https://github.com/electron/windows-sign.git"
|
|
||||||
},
|
|
||||||
"author": {
|
|
||||||
"name": "Felix Rieseberg",
|
|
||||||
"email": "felix@felixrieseberg.com"
|
|
||||||
},
|
|
||||||
"license": "BSD-2-Clause",
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/electron/windows-sign/issues"
|
|
||||||
},
|
|
||||||
"homepage": "https://github.com/electron/windows-sign",
|
|
||||||
"publishConfig": {
|
|
||||||
"provenance": true
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"cross-dirname": "^0.1.0",
|
|
||||||
"debug": "^4.3.4",
|
|
||||||
"fs-extra": "^11.1.1",
|
|
||||||
"minimist": "^1.2.8",
|
|
||||||
"postject": "^1.0.0-alpha.6"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@types/debug": "^4.1.10",
|
|
||||||
"@types/fs-extra": "^11.0.3",
|
|
||||||
"@types/node": "^18.18.7",
|
|
||||||
"@typescript-eslint/eslint-plugin": "^5.62.0",
|
|
||||||
"@typescript-eslint/parser": "^5.62.0",
|
|
||||||
"eslint": "^8.52.0",
|
|
||||||
"eslint-config-eslint": "^9.0.0",
|
|
||||||
"eslint-config-standard": "^17.1.0",
|
|
||||||
"eslint-plugin-import": "^2.29.0",
|
|
||||||
"eslint-plugin-node": "^11.1.0",
|
|
||||||
"eslint-plugin-promise": "^6.1.1",
|
|
||||||
"globstar": "^1.0.0",
|
|
||||||
"standard": "^17.1.0",
|
|
||||||
"tsx": "^3.14.0",
|
|
||||||
"typedoc": "~0.25.13",
|
|
||||||
"typescript": "^5.2.2"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"build": "tsc && tsc -p tsconfig.esm.json",
|
|
||||||
"docs": "npx typedoc",
|
|
||||||
"lint": "eslint --ext .ts,.js src bin test",
|
|
||||||
"test:loader": "globstar -- node --loader tsx --test \"test/**/*.spec.ts\"",
|
|
||||||
"test": "globstar -- node --import tsx --test \"test/**/*.spec.ts\"",
|
|
||||||
"prepublishOnly": "yarn build"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=14.14"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
BIN
Binary file not shown.
-15
@@ -1,15 +0,0 @@
|
|||||||
The ISC License
|
|
||||||
|
|
||||||
Copyright (c) Isaac Z. Schlueter and Contributors
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
|
||||||
copyright notice and this permission notice appear in all copies.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
|
|
||||||
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
-71
@@ -1,71 +0,0 @@
|
|||||||
# fs-minipass
|
|
||||||
|
|
||||||
Filesystem streams based on [minipass](http://npm.im/minipass).
|
|
||||||
|
|
||||||
4 classes are exported:
|
|
||||||
|
|
||||||
- ReadStream
|
|
||||||
- ReadStreamSync
|
|
||||||
- WriteStream
|
|
||||||
- WriteStreamSync
|
|
||||||
|
|
||||||
When using `ReadStreamSync`, all of the data is made available
|
|
||||||
immediately upon consuming the stream. Nothing is buffered in memory
|
|
||||||
when the stream is constructed. If the stream is piped to a writer,
|
|
||||||
then it will synchronously `read()` and emit data into the writer as
|
|
||||||
fast as the writer can consume it. (That is, it will respect
|
|
||||||
backpressure.) If you call `stream.read()` then it will read the
|
|
||||||
entire file and return the contents.
|
|
||||||
|
|
||||||
When using `WriteStreamSync`, every write is flushed to the file
|
|
||||||
synchronously. If your writes all come in a single tick, then it'll
|
|
||||||
write it all out in a single tick. It's as synchronous as you are.
|
|
||||||
|
|
||||||
The async versions work much like their node builtin counterparts,
|
|
||||||
with the exception of introducing significantly less Stream machinery
|
|
||||||
overhead.
|
|
||||||
|
|
||||||
## USAGE
|
|
||||||
|
|
||||||
It's just streams, you pipe them or read() them or write() to them.
|
|
||||||
|
|
||||||
```js
|
|
||||||
import { ReadStream, WriteStream } from 'fs-minipass'
|
|
||||||
// or: const { ReadStream, WriteStream } = require('fs-minipass')
|
|
||||||
const readStream = new ReadStream('file.txt')
|
|
||||||
const writeStream = new WriteStream('output.txt')
|
|
||||||
writeStream.write('some file header or whatever\n')
|
|
||||||
readStream.pipe(writeStream)
|
|
||||||
```
|
|
||||||
|
|
||||||
## ReadStream(path, options)
|
|
||||||
|
|
||||||
Path string is required, but somewhat irrelevant if an open file
|
|
||||||
descriptor is passed in as an option.
|
|
||||||
|
|
||||||
Options:
|
|
||||||
|
|
||||||
- `fd` Pass in a numeric file descriptor, if the file is already open.
|
|
||||||
- `readSize` The size of reads to do, defaults to 16MB
|
|
||||||
- `size` The size of the file, if known. Prevents zero-byte read()
|
|
||||||
call at the end.
|
|
||||||
- `autoClose` Set to `false` to prevent the file descriptor from being
|
|
||||||
closed when the file is done being read.
|
|
||||||
|
|
||||||
## WriteStream(path, options)
|
|
||||||
|
|
||||||
Path string is required, but somewhat irrelevant if an open file
|
|
||||||
descriptor is passed in as an option.
|
|
||||||
|
|
||||||
Options:
|
|
||||||
|
|
||||||
- `fd` Pass in a numeric file descriptor, if the file is already open.
|
|
||||||
- `mode` The mode to create the file with. Defaults to `0o666`.
|
|
||||||
- `start` The position in the file to start reading. If not
|
|
||||||
specified, then the file will start writing at position zero, and be
|
|
||||||
truncated by default.
|
|
||||||
- `autoClose` Set to `false` to prevent the file descriptor from being
|
|
||||||
closed when the stream is ended.
|
|
||||||
- `flags` Flags to use when opening the file. Irrelevant if `fd` is
|
|
||||||
passed in, since file won't be opened in that case. Defaults to
|
|
||||||
`'a'` if a `pos` is specified, or `'w'` otherwise.
|
|
||||||
-118
@@ -1,118 +0,0 @@
|
|||||||
/// <reference types="node" />
|
|
||||||
/// <reference types="node" />
|
|
||||||
/// <reference types="node" />
|
|
||||||
import EE from 'events';
|
|
||||||
import { Minipass } from 'minipass';
|
|
||||||
declare const _autoClose: unique symbol;
|
|
||||||
declare const _close: unique symbol;
|
|
||||||
declare const _ended: unique symbol;
|
|
||||||
declare const _fd: unique symbol;
|
|
||||||
declare const _finished: unique symbol;
|
|
||||||
declare const _flags: unique symbol;
|
|
||||||
declare const _flush: unique symbol;
|
|
||||||
declare const _handleChunk: unique symbol;
|
|
||||||
declare const _makeBuf: unique symbol;
|
|
||||||
declare const _mode: unique symbol;
|
|
||||||
declare const _needDrain: unique symbol;
|
|
||||||
declare const _onerror: unique symbol;
|
|
||||||
declare const _onopen: unique symbol;
|
|
||||||
declare const _onread: unique symbol;
|
|
||||||
declare const _onwrite: unique symbol;
|
|
||||||
declare const _open: unique symbol;
|
|
||||||
declare const _path: unique symbol;
|
|
||||||
declare const _pos: unique symbol;
|
|
||||||
declare const _queue: unique symbol;
|
|
||||||
declare const _read: unique symbol;
|
|
||||||
declare const _readSize: unique symbol;
|
|
||||||
declare const _reading: unique symbol;
|
|
||||||
declare const _remain: unique symbol;
|
|
||||||
declare const _size: unique symbol;
|
|
||||||
declare const _write: unique symbol;
|
|
||||||
declare const _writing: unique symbol;
|
|
||||||
declare const _defaultFlag: unique symbol;
|
|
||||||
declare const _errored: unique symbol;
|
|
||||||
export type ReadStreamOptions = Minipass.Options<Minipass.ContiguousData> & {
|
|
||||||
fd?: number;
|
|
||||||
readSize?: number;
|
|
||||||
size?: number;
|
|
||||||
autoClose?: boolean;
|
|
||||||
};
|
|
||||||
export type ReadStreamEvents = Minipass.Events<Minipass.ContiguousData> & {
|
|
||||||
open: [fd: number];
|
|
||||||
};
|
|
||||||
export declare class ReadStream extends Minipass<Minipass.ContiguousData, Buffer, ReadStreamEvents> {
|
|
||||||
[_errored]: boolean;
|
|
||||||
[_fd]?: number;
|
|
||||||
[_path]: string;
|
|
||||||
[_readSize]: number;
|
|
||||||
[_reading]: boolean;
|
|
||||||
[_size]: number;
|
|
||||||
[_remain]: number;
|
|
||||||
[_autoClose]: boolean;
|
|
||||||
constructor(path: string, opt: ReadStreamOptions);
|
|
||||||
get fd(): number | undefined;
|
|
||||||
get path(): string;
|
|
||||||
write(): void;
|
|
||||||
end(): void;
|
|
||||||
[_open](): void;
|
|
||||||
[_onopen](er?: NodeJS.ErrnoException | null, fd?: number): void;
|
|
||||||
[_makeBuf](): Buffer;
|
|
||||||
[_read](): void;
|
|
||||||
[_onread](er?: NodeJS.ErrnoException | null, br?: number, buf?: Buffer): void;
|
|
||||||
[_close](): void;
|
|
||||||
[_onerror](er: NodeJS.ErrnoException): void;
|
|
||||||
[_handleChunk](br: number, buf: Buffer): boolean;
|
|
||||||
emit<Event extends keyof ReadStreamEvents>(ev: Event, ...args: ReadStreamEvents[Event]): boolean;
|
|
||||||
}
|
|
||||||
export declare class ReadStreamSync extends ReadStream {
|
|
||||||
[_open](): void;
|
|
||||||
[_read](): void;
|
|
||||||
[_close](): void;
|
|
||||||
}
|
|
||||||
export type WriteStreamOptions = {
|
|
||||||
fd?: number;
|
|
||||||
autoClose?: boolean;
|
|
||||||
mode?: number;
|
|
||||||
captureRejections?: boolean;
|
|
||||||
start?: number;
|
|
||||||
flags?: string;
|
|
||||||
};
|
|
||||||
export declare class WriteStream extends EE {
|
|
||||||
readable: false;
|
|
||||||
writable: boolean;
|
|
||||||
[_errored]: boolean;
|
|
||||||
[_writing]: boolean;
|
|
||||||
[_ended]: boolean;
|
|
||||||
[_queue]: Buffer[];
|
|
||||||
[_needDrain]: boolean;
|
|
||||||
[_path]: string;
|
|
||||||
[_mode]: number;
|
|
||||||
[_autoClose]: boolean;
|
|
||||||
[_fd]?: number;
|
|
||||||
[_defaultFlag]: boolean;
|
|
||||||
[_flags]: string;
|
|
||||||
[_finished]: boolean;
|
|
||||||
[_pos]?: number;
|
|
||||||
constructor(path: string, opt: WriteStreamOptions);
|
|
||||||
emit(ev: string, ...args: any[]): boolean;
|
|
||||||
get fd(): number | undefined;
|
|
||||||
get path(): string;
|
|
||||||
[_onerror](er: NodeJS.ErrnoException): void;
|
|
||||||
[_open](): void;
|
|
||||||
[_onopen](er?: null | NodeJS.ErrnoException, fd?: number): void;
|
|
||||||
end(buf: string, enc?: BufferEncoding): this;
|
|
||||||
end(buf?: Buffer, enc?: undefined): this;
|
|
||||||
write(buf: string, enc?: BufferEncoding): boolean;
|
|
||||||
write(buf: Buffer, enc?: undefined): boolean;
|
|
||||||
[_write](buf: Buffer): void;
|
|
||||||
[_onwrite](er?: null | NodeJS.ErrnoException, bw?: number): void;
|
|
||||||
[_flush](): void;
|
|
||||||
[_close](): void;
|
|
||||||
}
|
|
||||||
export declare class WriteStreamSync extends WriteStream {
|
|
||||||
[_open](): void;
|
|
||||||
[_close](): void;
|
|
||||||
[_write](buf: Buffer): void;
|
|
||||||
}
|
|
||||||
export {};
|
|
||||||
//# sourceMappingURL=index.d.ts.map
|
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
||||||
-430
@@ -1,430 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
||||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
||||||
};
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
exports.WriteStreamSync = exports.WriteStream = exports.ReadStreamSync = exports.ReadStream = void 0;
|
|
||||||
const events_1 = __importDefault(require("events"));
|
|
||||||
const fs_1 = __importDefault(require("fs"));
|
|
||||||
const minipass_1 = require("minipass");
|
|
||||||
const writev = fs_1.default.writev;
|
|
||||||
const _autoClose = Symbol('_autoClose');
|
|
||||||
const _close = Symbol('_close');
|
|
||||||
const _ended = Symbol('_ended');
|
|
||||||
const _fd = Symbol('_fd');
|
|
||||||
const _finished = Symbol('_finished');
|
|
||||||
const _flags = Symbol('_flags');
|
|
||||||
const _flush = Symbol('_flush');
|
|
||||||
const _handleChunk = Symbol('_handleChunk');
|
|
||||||
const _makeBuf = Symbol('_makeBuf');
|
|
||||||
const _mode = Symbol('_mode');
|
|
||||||
const _needDrain = Symbol('_needDrain');
|
|
||||||
const _onerror = Symbol('_onerror');
|
|
||||||
const _onopen = Symbol('_onopen');
|
|
||||||
const _onread = Symbol('_onread');
|
|
||||||
const _onwrite = Symbol('_onwrite');
|
|
||||||
const _open = Symbol('_open');
|
|
||||||
const _path = Symbol('_path');
|
|
||||||
const _pos = Symbol('_pos');
|
|
||||||
const _queue = Symbol('_queue');
|
|
||||||
const _read = Symbol('_read');
|
|
||||||
const _readSize = Symbol('_readSize');
|
|
||||||
const _reading = Symbol('_reading');
|
|
||||||
const _remain = Symbol('_remain');
|
|
||||||
const _size = Symbol('_size');
|
|
||||||
const _write = Symbol('_write');
|
|
||||||
const _writing = Symbol('_writing');
|
|
||||||
const _defaultFlag = Symbol('_defaultFlag');
|
|
||||||
const _errored = Symbol('_errored');
|
|
||||||
class ReadStream extends minipass_1.Minipass {
|
|
||||||
[_errored] = false;
|
|
||||||
[_fd];
|
|
||||||
[_path];
|
|
||||||
[_readSize];
|
|
||||||
[_reading] = false;
|
|
||||||
[_size];
|
|
||||||
[_remain];
|
|
||||||
[_autoClose];
|
|
||||||
constructor(path, opt) {
|
|
||||||
opt = opt || {};
|
|
||||||
super(opt);
|
|
||||||
this.readable = true;
|
|
||||||
this.writable = false;
|
|
||||||
if (typeof path !== 'string') {
|
|
||||||
throw new TypeError('path must be a string');
|
|
||||||
}
|
|
||||||
this[_errored] = false;
|
|
||||||
this[_fd] = typeof opt.fd === 'number' ? opt.fd : undefined;
|
|
||||||
this[_path] = path;
|
|
||||||
this[_readSize] = opt.readSize || 16 * 1024 * 1024;
|
|
||||||
this[_reading] = false;
|
|
||||||
this[_size] = typeof opt.size === 'number' ? opt.size : Infinity;
|
|
||||||
this[_remain] = this[_size];
|
|
||||||
this[_autoClose] =
|
|
||||||
typeof opt.autoClose === 'boolean' ? opt.autoClose : true;
|
|
||||||
if (typeof this[_fd] === 'number') {
|
|
||||||
this[_read]();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
this[_open]();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
get fd() {
|
|
||||||
return this[_fd];
|
|
||||||
}
|
|
||||||
get path() {
|
|
||||||
return this[_path];
|
|
||||||
}
|
|
||||||
//@ts-ignore
|
|
||||||
write() {
|
|
||||||
throw new TypeError('this is a readable stream');
|
|
||||||
}
|
|
||||||
//@ts-ignore
|
|
||||||
end() {
|
|
||||||
throw new TypeError('this is a readable stream');
|
|
||||||
}
|
|
||||||
[_open]() {
|
|
||||||
fs_1.default.open(this[_path], 'r', (er, fd) => this[_onopen](er, fd));
|
|
||||||
}
|
|
||||||
[_onopen](er, fd) {
|
|
||||||
if (er) {
|
|
||||||
this[_onerror](er);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
this[_fd] = fd;
|
|
||||||
this.emit('open', fd);
|
|
||||||
this[_read]();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
[_makeBuf]() {
|
|
||||||
return Buffer.allocUnsafe(Math.min(this[_readSize], this[_remain]));
|
|
||||||
}
|
|
||||||
[_read]() {
|
|
||||||
if (!this[_reading]) {
|
|
||||||
this[_reading] = true;
|
|
||||||
const buf = this[_makeBuf]();
|
|
||||||
/* c8 ignore start */
|
|
||||||
if (buf.length === 0) {
|
|
||||||
return process.nextTick(() => this[_onread](null, 0, buf));
|
|
||||||
}
|
|
||||||
/* c8 ignore stop */
|
|
||||||
fs_1.default.read(this[_fd], buf, 0, buf.length, null, (er, br, b) => this[_onread](er, br, b));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
[_onread](er, br, buf) {
|
|
||||||
this[_reading] = false;
|
|
||||||
if (er) {
|
|
||||||
this[_onerror](er);
|
|
||||||
}
|
|
||||||
else if (this[_handleChunk](br, buf)) {
|
|
||||||
this[_read]();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
[_close]() {
|
|
||||||
if (this[_autoClose] && typeof this[_fd] === 'number') {
|
|
||||||
const fd = this[_fd];
|
|
||||||
this[_fd] = undefined;
|
|
||||||
fs_1.default.close(fd, er => er ? this.emit('error', er) : this.emit('close'));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
[_onerror](er) {
|
|
||||||
this[_reading] = true;
|
|
||||||
this[_close]();
|
|
||||||
this.emit('error', er);
|
|
||||||
}
|
|
||||||
[_handleChunk](br, buf) {
|
|
||||||
let ret = false;
|
|
||||||
// no effect if infinite
|
|
||||||
this[_remain] -= br;
|
|
||||||
if (br > 0) {
|
|
||||||
ret = super.write(br < buf.length ? buf.subarray(0, br) : buf);
|
|
||||||
}
|
|
||||||
if (br === 0 || this[_remain] <= 0) {
|
|
||||||
ret = false;
|
|
||||||
this[_close]();
|
|
||||||
super.end();
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
emit(ev, ...args) {
|
|
||||||
switch (ev) {
|
|
||||||
case 'prefinish':
|
|
||||||
case 'finish':
|
|
||||||
return false;
|
|
||||||
case 'drain':
|
|
||||||
if (typeof this[_fd] === 'number') {
|
|
||||||
this[_read]();
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
case 'error':
|
|
||||||
if (this[_errored]) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
this[_errored] = true;
|
|
||||||
return super.emit(ev, ...args);
|
|
||||||
default:
|
|
||||||
return super.emit(ev, ...args);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.ReadStream = ReadStream;
|
|
||||||
class ReadStreamSync extends ReadStream {
|
|
||||||
[_open]() {
|
|
||||||
let threw = true;
|
|
||||||
try {
|
|
||||||
this[_onopen](null, fs_1.default.openSync(this[_path], 'r'));
|
|
||||||
threw = false;
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
if (threw) {
|
|
||||||
this[_close]();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
[_read]() {
|
|
||||||
let threw = true;
|
|
||||||
try {
|
|
||||||
if (!this[_reading]) {
|
|
||||||
this[_reading] = true;
|
|
||||||
do {
|
|
||||||
const buf = this[_makeBuf]();
|
|
||||||
/* c8 ignore start */
|
|
||||||
const br = buf.length === 0
|
|
||||||
? 0
|
|
||||||
: fs_1.default.readSync(this[_fd], buf, 0, buf.length, null);
|
|
||||||
/* c8 ignore stop */
|
|
||||||
if (!this[_handleChunk](br, buf)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} while (true);
|
|
||||||
this[_reading] = false;
|
|
||||||
}
|
|
||||||
threw = false;
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
if (threw) {
|
|
||||||
this[_close]();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
[_close]() {
|
|
||||||
if (this[_autoClose] && typeof this[_fd] === 'number') {
|
|
||||||
const fd = this[_fd];
|
|
||||||
this[_fd] = undefined;
|
|
||||||
fs_1.default.closeSync(fd);
|
|
||||||
this.emit('close');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.ReadStreamSync = ReadStreamSync;
|
|
||||||
class WriteStream extends events_1.default {
|
|
||||||
readable = false;
|
|
||||||
writable = true;
|
|
||||||
[_errored] = false;
|
|
||||||
[_writing] = false;
|
|
||||||
[_ended] = false;
|
|
||||||
[_queue] = [];
|
|
||||||
[_needDrain] = false;
|
|
||||||
[_path];
|
|
||||||
[_mode];
|
|
||||||
[_autoClose];
|
|
||||||
[_fd];
|
|
||||||
[_defaultFlag];
|
|
||||||
[_flags];
|
|
||||||
[_finished] = false;
|
|
||||||
[_pos];
|
|
||||||
constructor(path, opt) {
|
|
||||||
opt = opt || {};
|
|
||||||
super(opt);
|
|
||||||
this[_path] = path;
|
|
||||||
this[_fd] = typeof opt.fd === 'number' ? opt.fd : undefined;
|
|
||||||
this[_mode] = opt.mode === undefined ? 0o666 : opt.mode;
|
|
||||||
this[_pos] = typeof opt.start === 'number' ? opt.start : undefined;
|
|
||||||
this[_autoClose] =
|
|
||||||
typeof opt.autoClose === 'boolean' ? opt.autoClose : true;
|
|
||||||
// truncating makes no sense when writing into the middle
|
|
||||||
const defaultFlag = this[_pos] !== undefined ? 'r+' : 'w';
|
|
||||||
this[_defaultFlag] = opt.flags === undefined;
|
|
||||||
this[_flags] = opt.flags === undefined ? defaultFlag : opt.flags;
|
|
||||||
if (this[_fd] === undefined) {
|
|
||||||
this[_open]();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
emit(ev, ...args) {
|
|
||||||
if (ev === 'error') {
|
|
||||||
if (this[_errored]) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
this[_errored] = true;
|
|
||||||
}
|
|
||||||
return super.emit(ev, ...args);
|
|
||||||
}
|
|
||||||
get fd() {
|
|
||||||
return this[_fd];
|
|
||||||
}
|
|
||||||
get path() {
|
|
||||||
return this[_path];
|
|
||||||
}
|
|
||||||
[_onerror](er) {
|
|
||||||
this[_close]();
|
|
||||||
this[_writing] = true;
|
|
||||||
this.emit('error', er);
|
|
||||||
}
|
|
||||||
[_open]() {
|
|
||||||
fs_1.default.open(this[_path], this[_flags], this[_mode], (er, fd) => this[_onopen](er, fd));
|
|
||||||
}
|
|
||||||
[_onopen](er, fd) {
|
|
||||||
if (this[_defaultFlag] &&
|
|
||||||
this[_flags] === 'r+' &&
|
|
||||||
er &&
|
|
||||||
er.code === 'ENOENT') {
|
|
||||||
this[_flags] = 'w';
|
|
||||||
this[_open]();
|
|
||||||
}
|
|
||||||
else if (er) {
|
|
||||||
this[_onerror](er);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
this[_fd] = fd;
|
|
||||||
this.emit('open', fd);
|
|
||||||
if (!this[_writing]) {
|
|
||||||
this[_flush]();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
end(buf, enc) {
|
|
||||||
if (buf) {
|
|
||||||
//@ts-ignore
|
|
||||||
this.write(buf, enc);
|
|
||||||
}
|
|
||||||
this[_ended] = true;
|
|
||||||
// synthetic after-write logic, where drain/finish live
|
|
||||||
if (!this[_writing] &&
|
|
||||||
!this[_queue].length &&
|
|
||||||
typeof this[_fd] === 'number') {
|
|
||||||
this[_onwrite](null, 0);
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
write(buf, enc) {
|
|
||||||
if (typeof buf === 'string') {
|
|
||||||
buf = Buffer.from(buf, enc);
|
|
||||||
}
|
|
||||||
if (this[_ended]) {
|
|
||||||
this.emit('error', new Error('write() after end()'));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (this[_fd] === undefined || this[_writing] || this[_queue].length) {
|
|
||||||
this[_queue].push(buf);
|
|
||||||
this[_needDrain] = true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
this[_writing] = true;
|
|
||||||
this[_write](buf);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
[_write](buf) {
|
|
||||||
fs_1.default.write(this[_fd], buf, 0, buf.length, this[_pos], (er, bw) => this[_onwrite](er, bw));
|
|
||||||
}
|
|
||||||
[_onwrite](er, bw) {
|
|
||||||
if (er) {
|
|
||||||
this[_onerror](er);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (this[_pos] !== undefined && typeof bw === 'number') {
|
|
||||||
this[_pos] += bw;
|
|
||||||
}
|
|
||||||
if (this[_queue].length) {
|
|
||||||
this[_flush]();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
this[_writing] = false;
|
|
||||||
if (this[_ended] && !this[_finished]) {
|
|
||||||
this[_finished] = true;
|
|
||||||
this[_close]();
|
|
||||||
this.emit('finish');
|
|
||||||
}
|
|
||||||
else if (this[_needDrain]) {
|
|
||||||
this[_needDrain] = false;
|
|
||||||
this.emit('drain');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
[_flush]() {
|
|
||||||
if (this[_queue].length === 0) {
|
|
||||||
if (this[_ended]) {
|
|
||||||
this[_onwrite](null, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (this[_queue].length === 1) {
|
|
||||||
this[_write](this[_queue].pop());
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
const iovec = this[_queue];
|
|
||||||
this[_queue] = [];
|
|
||||||
writev(this[_fd], iovec, this[_pos], (er, bw) => this[_onwrite](er, bw));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
[_close]() {
|
|
||||||
if (this[_autoClose] && typeof this[_fd] === 'number') {
|
|
||||||
const fd = this[_fd];
|
|
||||||
this[_fd] = undefined;
|
|
||||||
fs_1.default.close(fd, er => er ? this.emit('error', er) : this.emit('close'));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.WriteStream = WriteStream;
|
|
||||||
class WriteStreamSync extends WriteStream {
|
|
||||||
[_open]() {
|
|
||||||
let fd;
|
|
||||||
// only wrap in a try{} block if we know we'll retry, to avoid
|
|
||||||
// the rethrow obscuring the error's source frame in most cases.
|
|
||||||
if (this[_defaultFlag] && this[_flags] === 'r+') {
|
|
||||||
try {
|
|
||||||
fd = fs_1.default.openSync(this[_path], this[_flags], this[_mode]);
|
|
||||||
}
|
|
||||||
catch (er) {
|
|
||||||
if (er?.code === 'ENOENT') {
|
|
||||||
this[_flags] = 'w';
|
|
||||||
return this[_open]();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw er;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
fd = fs_1.default.openSync(this[_path], this[_flags], this[_mode]);
|
|
||||||
}
|
|
||||||
this[_onopen](null, fd);
|
|
||||||
}
|
|
||||||
[_close]() {
|
|
||||||
if (this[_autoClose] && typeof this[_fd] === 'number') {
|
|
||||||
const fd = this[_fd];
|
|
||||||
this[_fd] = undefined;
|
|
||||||
fs_1.default.closeSync(fd);
|
|
||||||
this.emit('close');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
[_write](buf) {
|
|
||||||
// throw the original, but try to close if it fails
|
|
||||||
let threw = true;
|
|
||||||
try {
|
|
||||||
this[_onwrite](null, fs_1.default.writeSync(this[_fd], buf, 0, buf.length, this[_pos]));
|
|
||||||
threw = false;
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
if (threw) {
|
|
||||||
try {
|
|
||||||
this[_close]();
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
// ok error
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.WriteStreamSync = WriteStreamSync;
|
|
||||||
//# sourceMappingURL=index.js.map
|
|
||||||
-1
File diff suppressed because one or more lines are too long
-3
@@ -1,3 +0,0 @@
|
|||||||
{
|
|
||||||
"type": "commonjs"
|
|
||||||
}
|
|
||||||
-118
@@ -1,118 +0,0 @@
|
|||||||
/// <reference types="node" resolution-mode="require"/>
|
|
||||||
/// <reference types="node" resolution-mode="require"/>
|
|
||||||
/// <reference types="node" resolution-mode="require"/>
|
|
||||||
import EE from 'events';
|
|
||||||
import { Minipass } from 'minipass';
|
|
||||||
declare const _autoClose: unique symbol;
|
|
||||||
declare const _close: unique symbol;
|
|
||||||
declare const _ended: unique symbol;
|
|
||||||
declare const _fd: unique symbol;
|
|
||||||
declare const _finished: unique symbol;
|
|
||||||
declare const _flags: unique symbol;
|
|
||||||
declare const _flush: unique symbol;
|
|
||||||
declare const _handleChunk: unique symbol;
|
|
||||||
declare const _makeBuf: unique symbol;
|
|
||||||
declare const _mode: unique symbol;
|
|
||||||
declare const _needDrain: unique symbol;
|
|
||||||
declare const _onerror: unique symbol;
|
|
||||||
declare const _onopen: unique symbol;
|
|
||||||
declare const _onread: unique symbol;
|
|
||||||
declare const _onwrite: unique symbol;
|
|
||||||
declare const _open: unique symbol;
|
|
||||||
declare const _path: unique symbol;
|
|
||||||
declare const _pos: unique symbol;
|
|
||||||
declare const _queue: unique symbol;
|
|
||||||
declare const _read: unique symbol;
|
|
||||||
declare const _readSize: unique symbol;
|
|
||||||
declare const _reading: unique symbol;
|
|
||||||
declare const _remain: unique symbol;
|
|
||||||
declare const _size: unique symbol;
|
|
||||||
declare const _write: unique symbol;
|
|
||||||
declare const _writing: unique symbol;
|
|
||||||
declare const _defaultFlag: unique symbol;
|
|
||||||
declare const _errored: unique symbol;
|
|
||||||
export type ReadStreamOptions = Minipass.Options<Minipass.ContiguousData> & {
|
|
||||||
fd?: number;
|
|
||||||
readSize?: number;
|
|
||||||
size?: number;
|
|
||||||
autoClose?: boolean;
|
|
||||||
};
|
|
||||||
export type ReadStreamEvents = Minipass.Events<Minipass.ContiguousData> & {
|
|
||||||
open: [fd: number];
|
|
||||||
};
|
|
||||||
export declare class ReadStream extends Minipass<Minipass.ContiguousData, Buffer, ReadStreamEvents> {
|
|
||||||
[_errored]: boolean;
|
|
||||||
[_fd]?: number;
|
|
||||||
[_path]: string;
|
|
||||||
[_readSize]: number;
|
|
||||||
[_reading]: boolean;
|
|
||||||
[_size]: number;
|
|
||||||
[_remain]: number;
|
|
||||||
[_autoClose]: boolean;
|
|
||||||
constructor(path: string, opt: ReadStreamOptions);
|
|
||||||
get fd(): number | undefined;
|
|
||||||
get path(): string;
|
|
||||||
write(): void;
|
|
||||||
end(): void;
|
|
||||||
[_open](): void;
|
|
||||||
[_onopen](er?: NodeJS.ErrnoException | null, fd?: number): void;
|
|
||||||
[_makeBuf](): Buffer;
|
|
||||||
[_read](): void;
|
|
||||||
[_onread](er?: NodeJS.ErrnoException | null, br?: number, buf?: Buffer): void;
|
|
||||||
[_close](): void;
|
|
||||||
[_onerror](er: NodeJS.ErrnoException): void;
|
|
||||||
[_handleChunk](br: number, buf: Buffer): boolean;
|
|
||||||
emit<Event extends keyof ReadStreamEvents>(ev: Event, ...args: ReadStreamEvents[Event]): boolean;
|
|
||||||
}
|
|
||||||
export declare class ReadStreamSync extends ReadStream {
|
|
||||||
[_open](): void;
|
|
||||||
[_read](): void;
|
|
||||||
[_close](): void;
|
|
||||||
}
|
|
||||||
export type WriteStreamOptions = {
|
|
||||||
fd?: number;
|
|
||||||
autoClose?: boolean;
|
|
||||||
mode?: number;
|
|
||||||
captureRejections?: boolean;
|
|
||||||
start?: number;
|
|
||||||
flags?: string;
|
|
||||||
};
|
|
||||||
export declare class WriteStream extends EE {
|
|
||||||
readable: false;
|
|
||||||
writable: boolean;
|
|
||||||
[_errored]: boolean;
|
|
||||||
[_writing]: boolean;
|
|
||||||
[_ended]: boolean;
|
|
||||||
[_queue]: Buffer[];
|
|
||||||
[_needDrain]: boolean;
|
|
||||||
[_path]: string;
|
|
||||||
[_mode]: number;
|
|
||||||
[_autoClose]: boolean;
|
|
||||||
[_fd]?: number;
|
|
||||||
[_defaultFlag]: boolean;
|
|
||||||
[_flags]: string;
|
|
||||||
[_finished]: boolean;
|
|
||||||
[_pos]?: number;
|
|
||||||
constructor(path: string, opt: WriteStreamOptions);
|
|
||||||
emit(ev: string, ...args: any[]): boolean;
|
|
||||||
get fd(): number | undefined;
|
|
||||||
get path(): string;
|
|
||||||
[_onerror](er: NodeJS.ErrnoException): void;
|
|
||||||
[_open](): void;
|
|
||||||
[_onopen](er?: null | NodeJS.ErrnoException, fd?: number): void;
|
|
||||||
end(buf: string, enc?: BufferEncoding): this;
|
|
||||||
end(buf?: Buffer, enc?: undefined): this;
|
|
||||||
write(buf: string, enc?: BufferEncoding): boolean;
|
|
||||||
write(buf: Buffer, enc?: undefined): boolean;
|
|
||||||
[_write](buf: Buffer): void;
|
|
||||||
[_onwrite](er?: null | NodeJS.ErrnoException, bw?: number): void;
|
|
||||||
[_flush](): void;
|
|
||||||
[_close](): void;
|
|
||||||
}
|
|
||||||
export declare class WriteStreamSync extends WriteStream {
|
|
||||||
[_open](): void;
|
|
||||||
[_close](): void;
|
|
||||||
[_write](buf: Buffer): void;
|
|
||||||
}
|
|
||||||
export {};
|
|
||||||
//# sourceMappingURL=index.d.ts.map
|
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
||||||
-420
@@ -1,420 +0,0 @@
|
|||||||
import EE from 'events';
|
|
||||||
import fs from 'fs';
|
|
||||||
import { Minipass } from 'minipass';
|
|
||||||
const writev = fs.writev;
|
|
||||||
const _autoClose = Symbol('_autoClose');
|
|
||||||
const _close = Symbol('_close');
|
|
||||||
const _ended = Symbol('_ended');
|
|
||||||
const _fd = Symbol('_fd');
|
|
||||||
const _finished = Symbol('_finished');
|
|
||||||
const _flags = Symbol('_flags');
|
|
||||||
const _flush = Symbol('_flush');
|
|
||||||
const _handleChunk = Symbol('_handleChunk');
|
|
||||||
const _makeBuf = Symbol('_makeBuf');
|
|
||||||
const _mode = Symbol('_mode');
|
|
||||||
const _needDrain = Symbol('_needDrain');
|
|
||||||
const _onerror = Symbol('_onerror');
|
|
||||||
const _onopen = Symbol('_onopen');
|
|
||||||
const _onread = Symbol('_onread');
|
|
||||||
const _onwrite = Symbol('_onwrite');
|
|
||||||
const _open = Symbol('_open');
|
|
||||||
const _path = Symbol('_path');
|
|
||||||
const _pos = Symbol('_pos');
|
|
||||||
const _queue = Symbol('_queue');
|
|
||||||
const _read = Symbol('_read');
|
|
||||||
const _readSize = Symbol('_readSize');
|
|
||||||
const _reading = Symbol('_reading');
|
|
||||||
const _remain = Symbol('_remain');
|
|
||||||
const _size = Symbol('_size');
|
|
||||||
const _write = Symbol('_write');
|
|
||||||
const _writing = Symbol('_writing');
|
|
||||||
const _defaultFlag = Symbol('_defaultFlag');
|
|
||||||
const _errored = Symbol('_errored');
|
|
||||||
export class ReadStream extends Minipass {
|
|
||||||
[_errored] = false;
|
|
||||||
[_fd];
|
|
||||||
[_path];
|
|
||||||
[_readSize];
|
|
||||||
[_reading] = false;
|
|
||||||
[_size];
|
|
||||||
[_remain];
|
|
||||||
[_autoClose];
|
|
||||||
constructor(path, opt) {
|
|
||||||
opt = opt || {};
|
|
||||||
super(opt);
|
|
||||||
this.readable = true;
|
|
||||||
this.writable = false;
|
|
||||||
if (typeof path !== 'string') {
|
|
||||||
throw new TypeError('path must be a string');
|
|
||||||
}
|
|
||||||
this[_errored] = false;
|
|
||||||
this[_fd] = typeof opt.fd === 'number' ? opt.fd : undefined;
|
|
||||||
this[_path] = path;
|
|
||||||
this[_readSize] = opt.readSize || 16 * 1024 * 1024;
|
|
||||||
this[_reading] = false;
|
|
||||||
this[_size] = typeof opt.size === 'number' ? opt.size : Infinity;
|
|
||||||
this[_remain] = this[_size];
|
|
||||||
this[_autoClose] =
|
|
||||||
typeof opt.autoClose === 'boolean' ? opt.autoClose : true;
|
|
||||||
if (typeof this[_fd] === 'number') {
|
|
||||||
this[_read]();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
this[_open]();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
get fd() {
|
|
||||||
return this[_fd];
|
|
||||||
}
|
|
||||||
get path() {
|
|
||||||
return this[_path];
|
|
||||||
}
|
|
||||||
//@ts-ignore
|
|
||||||
write() {
|
|
||||||
throw new TypeError('this is a readable stream');
|
|
||||||
}
|
|
||||||
//@ts-ignore
|
|
||||||
end() {
|
|
||||||
throw new TypeError('this is a readable stream');
|
|
||||||
}
|
|
||||||
[_open]() {
|
|
||||||
fs.open(this[_path], 'r', (er, fd) => this[_onopen](er, fd));
|
|
||||||
}
|
|
||||||
[_onopen](er, fd) {
|
|
||||||
if (er) {
|
|
||||||
this[_onerror](er);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
this[_fd] = fd;
|
|
||||||
this.emit('open', fd);
|
|
||||||
this[_read]();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
[_makeBuf]() {
|
|
||||||
return Buffer.allocUnsafe(Math.min(this[_readSize], this[_remain]));
|
|
||||||
}
|
|
||||||
[_read]() {
|
|
||||||
if (!this[_reading]) {
|
|
||||||
this[_reading] = true;
|
|
||||||
const buf = this[_makeBuf]();
|
|
||||||
/* c8 ignore start */
|
|
||||||
if (buf.length === 0) {
|
|
||||||
return process.nextTick(() => this[_onread](null, 0, buf));
|
|
||||||
}
|
|
||||||
/* c8 ignore stop */
|
|
||||||
fs.read(this[_fd], buf, 0, buf.length, null, (er, br, b) => this[_onread](er, br, b));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
[_onread](er, br, buf) {
|
|
||||||
this[_reading] = false;
|
|
||||||
if (er) {
|
|
||||||
this[_onerror](er);
|
|
||||||
}
|
|
||||||
else if (this[_handleChunk](br, buf)) {
|
|
||||||
this[_read]();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
[_close]() {
|
|
||||||
if (this[_autoClose] && typeof this[_fd] === 'number') {
|
|
||||||
const fd = this[_fd];
|
|
||||||
this[_fd] = undefined;
|
|
||||||
fs.close(fd, er => er ? this.emit('error', er) : this.emit('close'));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
[_onerror](er) {
|
|
||||||
this[_reading] = true;
|
|
||||||
this[_close]();
|
|
||||||
this.emit('error', er);
|
|
||||||
}
|
|
||||||
[_handleChunk](br, buf) {
|
|
||||||
let ret = false;
|
|
||||||
// no effect if infinite
|
|
||||||
this[_remain] -= br;
|
|
||||||
if (br > 0) {
|
|
||||||
ret = super.write(br < buf.length ? buf.subarray(0, br) : buf);
|
|
||||||
}
|
|
||||||
if (br === 0 || this[_remain] <= 0) {
|
|
||||||
ret = false;
|
|
||||||
this[_close]();
|
|
||||||
super.end();
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
emit(ev, ...args) {
|
|
||||||
switch (ev) {
|
|
||||||
case 'prefinish':
|
|
||||||
case 'finish':
|
|
||||||
return false;
|
|
||||||
case 'drain':
|
|
||||||
if (typeof this[_fd] === 'number') {
|
|
||||||
this[_read]();
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
case 'error':
|
|
||||||
if (this[_errored]) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
this[_errored] = true;
|
|
||||||
return super.emit(ev, ...args);
|
|
||||||
default:
|
|
||||||
return super.emit(ev, ...args);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
export class ReadStreamSync extends ReadStream {
|
|
||||||
[_open]() {
|
|
||||||
let threw = true;
|
|
||||||
try {
|
|
||||||
this[_onopen](null, fs.openSync(this[_path], 'r'));
|
|
||||||
threw = false;
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
if (threw) {
|
|
||||||
this[_close]();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
[_read]() {
|
|
||||||
let threw = true;
|
|
||||||
try {
|
|
||||||
if (!this[_reading]) {
|
|
||||||
this[_reading] = true;
|
|
||||||
do {
|
|
||||||
const buf = this[_makeBuf]();
|
|
||||||
/* c8 ignore start */
|
|
||||||
const br = buf.length === 0
|
|
||||||
? 0
|
|
||||||
: fs.readSync(this[_fd], buf, 0, buf.length, null);
|
|
||||||
/* c8 ignore stop */
|
|
||||||
if (!this[_handleChunk](br, buf)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} while (true);
|
|
||||||
this[_reading] = false;
|
|
||||||
}
|
|
||||||
threw = false;
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
if (threw) {
|
|
||||||
this[_close]();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
[_close]() {
|
|
||||||
if (this[_autoClose] && typeof this[_fd] === 'number') {
|
|
||||||
const fd = this[_fd];
|
|
||||||
this[_fd] = undefined;
|
|
||||||
fs.closeSync(fd);
|
|
||||||
this.emit('close');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
export class WriteStream extends EE {
|
|
||||||
readable = false;
|
|
||||||
writable = true;
|
|
||||||
[_errored] = false;
|
|
||||||
[_writing] = false;
|
|
||||||
[_ended] = false;
|
|
||||||
[_queue] = [];
|
|
||||||
[_needDrain] = false;
|
|
||||||
[_path];
|
|
||||||
[_mode];
|
|
||||||
[_autoClose];
|
|
||||||
[_fd];
|
|
||||||
[_defaultFlag];
|
|
||||||
[_flags];
|
|
||||||
[_finished] = false;
|
|
||||||
[_pos];
|
|
||||||
constructor(path, opt) {
|
|
||||||
opt = opt || {};
|
|
||||||
super(opt);
|
|
||||||
this[_path] = path;
|
|
||||||
this[_fd] = typeof opt.fd === 'number' ? opt.fd : undefined;
|
|
||||||
this[_mode] = opt.mode === undefined ? 0o666 : opt.mode;
|
|
||||||
this[_pos] = typeof opt.start === 'number' ? opt.start : undefined;
|
|
||||||
this[_autoClose] =
|
|
||||||
typeof opt.autoClose === 'boolean' ? opt.autoClose : true;
|
|
||||||
// truncating makes no sense when writing into the middle
|
|
||||||
const defaultFlag = this[_pos] !== undefined ? 'r+' : 'w';
|
|
||||||
this[_defaultFlag] = opt.flags === undefined;
|
|
||||||
this[_flags] = opt.flags === undefined ? defaultFlag : opt.flags;
|
|
||||||
if (this[_fd] === undefined) {
|
|
||||||
this[_open]();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
emit(ev, ...args) {
|
|
||||||
if (ev === 'error') {
|
|
||||||
if (this[_errored]) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
this[_errored] = true;
|
|
||||||
}
|
|
||||||
return super.emit(ev, ...args);
|
|
||||||
}
|
|
||||||
get fd() {
|
|
||||||
return this[_fd];
|
|
||||||
}
|
|
||||||
get path() {
|
|
||||||
return this[_path];
|
|
||||||
}
|
|
||||||
[_onerror](er) {
|
|
||||||
this[_close]();
|
|
||||||
this[_writing] = true;
|
|
||||||
this.emit('error', er);
|
|
||||||
}
|
|
||||||
[_open]() {
|
|
||||||
fs.open(this[_path], this[_flags], this[_mode], (er, fd) => this[_onopen](er, fd));
|
|
||||||
}
|
|
||||||
[_onopen](er, fd) {
|
|
||||||
if (this[_defaultFlag] &&
|
|
||||||
this[_flags] === 'r+' &&
|
|
||||||
er &&
|
|
||||||
er.code === 'ENOENT') {
|
|
||||||
this[_flags] = 'w';
|
|
||||||
this[_open]();
|
|
||||||
}
|
|
||||||
else if (er) {
|
|
||||||
this[_onerror](er);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
this[_fd] = fd;
|
|
||||||
this.emit('open', fd);
|
|
||||||
if (!this[_writing]) {
|
|
||||||
this[_flush]();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
end(buf, enc) {
|
|
||||||
if (buf) {
|
|
||||||
//@ts-ignore
|
|
||||||
this.write(buf, enc);
|
|
||||||
}
|
|
||||||
this[_ended] = true;
|
|
||||||
// synthetic after-write logic, where drain/finish live
|
|
||||||
if (!this[_writing] &&
|
|
||||||
!this[_queue].length &&
|
|
||||||
typeof this[_fd] === 'number') {
|
|
||||||
this[_onwrite](null, 0);
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
write(buf, enc) {
|
|
||||||
if (typeof buf === 'string') {
|
|
||||||
buf = Buffer.from(buf, enc);
|
|
||||||
}
|
|
||||||
if (this[_ended]) {
|
|
||||||
this.emit('error', new Error('write() after end()'));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (this[_fd] === undefined || this[_writing] || this[_queue].length) {
|
|
||||||
this[_queue].push(buf);
|
|
||||||
this[_needDrain] = true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
this[_writing] = true;
|
|
||||||
this[_write](buf);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
[_write](buf) {
|
|
||||||
fs.write(this[_fd], buf, 0, buf.length, this[_pos], (er, bw) => this[_onwrite](er, bw));
|
|
||||||
}
|
|
||||||
[_onwrite](er, bw) {
|
|
||||||
if (er) {
|
|
||||||
this[_onerror](er);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (this[_pos] !== undefined && typeof bw === 'number') {
|
|
||||||
this[_pos] += bw;
|
|
||||||
}
|
|
||||||
if (this[_queue].length) {
|
|
||||||
this[_flush]();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
this[_writing] = false;
|
|
||||||
if (this[_ended] && !this[_finished]) {
|
|
||||||
this[_finished] = true;
|
|
||||||
this[_close]();
|
|
||||||
this.emit('finish');
|
|
||||||
}
|
|
||||||
else if (this[_needDrain]) {
|
|
||||||
this[_needDrain] = false;
|
|
||||||
this.emit('drain');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
[_flush]() {
|
|
||||||
if (this[_queue].length === 0) {
|
|
||||||
if (this[_ended]) {
|
|
||||||
this[_onwrite](null, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (this[_queue].length === 1) {
|
|
||||||
this[_write](this[_queue].pop());
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
const iovec = this[_queue];
|
|
||||||
this[_queue] = [];
|
|
||||||
writev(this[_fd], iovec, this[_pos], (er, bw) => this[_onwrite](er, bw));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
[_close]() {
|
|
||||||
if (this[_autoClose] && typeof this[_fd] === 'number') {
|
|
||||||
const fd = this[_fd];
|
|
||||||
this[_fd] = undefined;
|
|
||||||
fs.close(fd, er => er ? this.emit('error', er) : this.emit('close'));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
export class WriteStreamSync extends WriteStream {
|
|
||||||
[_open]() {
|
|
||||||
let fd;
|
|
||||||
// only wrap in a try{} block if we know we'll retry, to avoid
|
|
||||||
// the rethrow obscuring the error's source frame in most cases.
|
|
||||||
if (this[_defaultFlag] && this[_flags] === 'r+') {
|
|
||||||
try {
|
|
||||||
fd = fs.openSync(this[_path], this[_flags], this[_mode]);
|
|
||||||
}
|
|
||||||
catch (er) {
|
|
||||||
if (er?.code === 'ENOENT') {
|
|
||||||
this[_flags] = 'w';
|
|
||||||
return this[_open]();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw er;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
fd = fs.openSync(this[_path], this[_flags], this[_mode]);
|
|
||||||
}
|
|
||||||
this[_onopen](null, fd);
|
|
||||||
}
|
|
||||||
[_close]() {
|
|
||||||
if (this[_autoClose] && typeof this[_fd] === 'number') {
|
|
||||||
const fd = this[_fd];
|
|
||||||
this[_fd] = undefined;
|
|
||||||
fs.closeSync(fd);
|
|
||||||
this.emit('close');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
[_write](buf) {
|
|
||||||
// throw the original, but try to close if it fails
|
|
||||||
let threw = true;
|
|
||||||
try {
|
|
||||||
this[_onwrite](null, fs.writeSync(this[_fd], buf, 0, buf.length, this[_pos]));
|
|
||||||
threw = false;
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
if (threw) {
|
|
||||||
try {
|
|
||||||
this[_close]();
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
// ok error
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=index.js.map
|
|
||||||
-1
File diff suppressed because one or more lines are too long
-3
@@ -1,3 +0,0 @@
|
|||||||
{
|
|
||||||
"type": "module"
|
|
||||||
}
|
|
||||||
-72
@@ -1,72 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "@isaacs/fs-minipass",
|
|
||||||
"version": "4.0.1",
|
|
||||||
"main": "./dist/commonjs/index.js",
|
|
||||||
"scripts": {
|
|
||||||
"prepare": "tshy",
|
|
||||||
"pretest": "npm run prepare",
|
|
||||||
"test": "tap",
|
|
||||||
"preversion": "npm test",
|
|
||||||
"postversion": "npm publish",
|
|
||||||
"prepublishOnly": "git push origin --follow-tags",
|
|
||||||
"format": "prettier --write . --loglevel warn",
|
|
||||||
"typedoc": "typedoc --tsconfig .tshy/esm.json ./src/*.ts"
|
|
||||||
},
|
|
||||||
"keywords": [],
|
|
||||||
"author": "Isaac Z. Schlueter",
|
|
||||||
"license": "ISC",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/npm/fs-minipass.git"
|
|
||||||
},
|
|
||||||
"description": "fs read and write streams based on minipass",
|
|
||||||
"dependencies": {
|
|
||||||
"minipass": "^7.0.4"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@types/node": "^20.11.30",
|
|
||||||
"mutate-fs": "^2.1.1",
|
|
||||||
"prettier": "^3.2.5",
|
|
||||||
"tap": "^18.7.1",
|
|
||||||
"tshy": "^1.12.0",
|
|
||||||
"typedoc": "^0.25.12"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"dist"
|
|
||||||
],
|
|
||||||
"engines": {
|
|
||||||
"node": ">=18.0.0"
|
|
||||||
},
|
|
||||||
"tshy": {
|
|
||||||
"exports": {
|
|
||||||
"./package.json": "./package.json",
|
|
||||||
".": "./src/index.ts"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"exports": {
|
|
||||||
"./package.json": "./package.json",
|
|
||||||
".": {
|
|
||||||
"import": {
|
|
||||||
"types": "./dist/esm/index.d.ts",
|
|
||||||
"default": "./dist/esm/index.js"
|
|
||||||
},
|
|
||||||
"require": {
|
|
||||||
"types": "./dist/commonjs/index.d.ts",
|
|
||||||
"default": "./dist/commonjs/index.js"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"types": "./dist/commonjs/index.d.ts",
|
|
||||||
"type": "module",
|
|
||||||
"prettier": {
|
|
||||||
"semi": false,
|
|
||||||
"printWidth": 75,
|
|
||||||
"tabWidth": 2,
|
|
||||||
"useTabs": false,
|
|
||||||
"singleQuote": true,
|
|
||||||
"jsxSingleQuote": false,
|
|
||||||
"bracketSameLine": true,
|
|
||||||
"arrowParens": "avoid",
|
|
||||||
"endOfLine": "lf"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-12
@@ -1,12 +0,0 @@
|
|||||||
|
|
||||||
# Release History
|
|
||||||
|
|
||||||
## 1.1.1
|
|
||||||
|
|
||||||
- Add dependency on `debug` to log results of the file system checks
|
|
||||||
- Add `jest` tests
|
|
||||||
|
|
||||||
# 1.0.0
|
|
||||||
|
|
||||||
- First public release, a simple typescript library for checking whether a path exists
|
|
||||||
on the file system and optionally whether it points to a file or folder.
|
|
||||||
-20
@@ -1,20 +0,0 @@
|
|||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2015 Steve King
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
||||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
|
||||||
subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
||||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
||||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
export * from './src';
|
|
||||||
-7
@@ -1,7 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
function __export(m) {
|
|
||||||
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
|
|
||||||
}
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
__export(require("./src"));
|
|
||||||
//# sourceMappingURL=index.js.map
|
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":";;;;;AACA,2BAAsB"}
|
|
||||||
-19
@@ -1,19 +0,0 @@
|
|||||||
/**
|
|
||||||
* Synchronous validation of a path existing either as a file or as a directory.
|
|
||||||
*
|
|
||||||
* @param {string} path The path to check
|
|
||||||
* @param {number} type One or both of the exported numeric constants
|
|
||||||
*/
|
|
||||||
export declare function exists(path: string, type?: number): boolean;
|
|
||||||
/**
|
|
||||||
* Constant representing a file
|
|
||||||
*/
|
|
||||||
export declare const FILE = 1;
|
|
||||||
/**
|
|
||||||
* Constant representing a folder
|
|
||||||
*/
|
|
||||||
export declare const FOLDER = 2;
|
|
||||||
/**
|
|
||||||
* Constant representing either a file or a folder
|
|
||||||
*/
|
|
||||||
export declare const READABLE: number;
|
|
||||||
-55
@@ -1,55 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
||||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
||||||
};
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
const fs_1 = require("fs");
|
|
||||||
const debug_1 = __importDefault(require("debug"));
|
|
||||||
const log = debug_1.default('@kwsites/file-exists');
|
|
||||||
function check(path, isFile, isDirectory) {
|
|
||||||
log(`checking %s`, path);
|
|
||||||
try {
|
|
||||||
const stat = fs_1.statSync(path);
|
|
||||||
if (stat.isFile() && isFile) {
|
|
||||||
log(`[OK] path represents a file`);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (stat.isDirectory() && isDirectory) {
|
|
||||||
log(`[OK] path represents a directory`);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
log(`[FAIL] path represents something other than a file or directory`);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
catch (e) {
|
|
||||||
if (e.code === 'ENOENT') {
|
|
||||||
log(`[FAIL] path is not accessible: %o`, e);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
log(`[FATAL] %o`, e);
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Synchronous validation of a path existing either as a file or as a directory.
|
|
||||||
*
|
|
||||||
* @param {string} path The path to check
|
|
||||||
* @param {number} type One or both of the exported numeric constants
|
|
||||||
*/
|
|
||||||
function exists(path, type = exports.READABLE) {
|
|
||||||
return check(path, (type & exports.FILE) > 0, (type & exports.FOLDER) > 0);
|
|
||||||
}
|
|
||||||
exports.exists = exists;
|
|
||||||
/**
|
|
||||||
* Constant representing a file
|
|
||||||
*/
|
|
||||||
exports.FILE = 1;
|
|
||||||
/**
|
|
||||||
* Constant representing a folder
|
|
||||||
*/
|
|
||||||
exports.FOLDER = 2;
|
|
||||||
/**
|
|
||||||
* Constant representing either a file or a folder
|
|
||||||
*/
|
|
||||||
exports.READABLE = exports.FILE + exports.FOLDER;
|
|
||||||
//# sourceMappingURL=index.js.map
|
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;AAAA,2BAA8B;AAC9B,kDAA0B;AAE1B,MAAM,GAAG,GAAG,eAAK,CAAC,sBAAsB,CAAC,CAAC;AAE1C,SAAS,KAAK,CAAC,IAAY,EAAE,MAAe,EAAE,WAAoB;IAC/D,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAEzB,IAAI;QACD,MAAM,IAAI,GAAG,aAAQ,CAAC,IAAI,CAAC,CAAC;QAE5B,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,MAAM,EAAE;YAC1B,GAAG,CAAC,6BAA6B,CAAC,CAAC;YACnC,OAAO,IAAI,CAAC;SACd;QAED,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,WAAW,EAAE;YACpC,GAAG,CAAC,kCAAkC,CAAC,CAAC;YACxC,OAAO,IAAI,CAAC;SACd;QAED,GAAG,CAAC,iEAAiE,CAAC,CAAC;QACvE,OAAO,KAAK,CAAC;KACf;IAAC,OAAO,CAAC,EAAE;QACT,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE;YACtB,GAAG,CAAC,mCAAmC,EAAE,CAAC,CAAC,CAAC;YAC5C,OAAO,KAAK,CAAC;SACf;QAED,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QACrB,MAAM,CAAC,CAAC;KACV;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAgB,MAAM,CAAC,IAAY,EAAE,OAAe,gBAAQ;IACzD,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,GAAG,YAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,cAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9D,CAAC;AAFD,wBAEC;AAED;;GAEG;AACU,QAAA,IAAI,GAAG,CAAC,CAAC;AAEtB;;GAEG;AACU,QAAA,MAAM,GAAG,CAAC,CAAC;AAExB;;GAEG;AACU,QAAA,QAAQ,GAAG,YAAI,GAAG,cAAM,CAAC"}
|
|
||||||
-7
@@ -1,7 +0,0 @@
|
|||||||
export declare function statSync(...args: any[]): any;
|
|
||||||
export declare function addStatSyncMock(fn: any): void;
|
|
||||||
export declare function assertMocksUsed(): void;
|
|
||||||
declare const mockFs: {
|
|
||||||
statSync: typeof statSync;
|
|
||||||
};
|
|
||||||
export default mockFs;
|
|
||||||
-26
@@ -1,26 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
let statSyncMocks = [];
|
|
||||||
function statSync(...args) {
|
|
||||||
const mock = statSyncMocks.shift();
|
|
||||||
if (typeof mock !== 'function') {
|
|
||||||
throw new Error(`fs.statSync called without configuring a mock`);
|
|
||||||
}
|
|
||||||
return mock(...args);
|
|
||||||
}
|
|
||||||
exports.statSync = statSync;
|
|
||||||
function addStatSyncMock(fn) {
|
|
||||||
statSyncMocks.push(fn);
|
|
||||||
}
|
|
||||||
exports.addStatSyncMock = addStatSyncMock;
|
|
||||||
function assertMocksUsed() {
|
|
||||||
if (statSyncMocks.length) {
|
|
||||||
throw new Error(`fs.afterEach: statSync has ${statSyncMocks.length} unused mocks`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.assertMocksUsed = assertMocksUsed;
|
|
||||||
const mockFs = {
|
|
||||||
statSync,
|
|
||||||
};
|
|
||||||
exports.default = mockFs;
|
|
||||||
//# sourceMappingURL=fs.js.map
|
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../../test/__mocks__/fs.ts"],"names":[],"mappings":";;AACA,IAAI,aAAa,GAAU,EAAE,CAAC;AAE9B,SAAgB,QAAQ,CAAC,GAAG,IAAW;IACpC,MAAO,IAAI,GAAG,aAAa,CAAC,KAAK,EAAE,CAAC;IACpC,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE;QAC7B,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;KACnE;IAED,OAAO,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AACxB,CAAC;AAPD,4BAOC;AAED,SAAgB,eAAe,CAAC,EAAO;IACpC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1B,CAAC;AAFD,0CAEC;AAED,SAAgB,eAAe;IAC5B,IAAI,aAAa,CAAC,MAAM,EAAE;QACvB,MAAM,IAAI,KAAK,CAAC,8BAA8B,aAAa,CAAC,MAAM,eAAe,CAAC,CAAC;KACrF;AACJ,CAAC;AAJD,0CAIC;AAED,MAAM,MAAM,GAAG;IACZ,QAAQ;CACV,CAAA;AAED,kBAAe,MAAM,CAAC"}
|
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
export {};
|
|
||||||
-77
@@ -1,77 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
jest.mock('fs');
|
|
||||||
//@ts-ignore
|
|
||||||
const fs_1 = require("fs");
|
|
||||||
const src_1 = require("../src");
|
|
||||||
describe(`exists`, () => {
|
|
||||||
let statSync;
|
|
||||||
let statSyncMock;
|
|
||||||
let path;
|
|
||||||
beforeEach(() => {
|
|
||||||
path = `./path/${Math.random()}`;
|
|
||||||
fs_1.addStatSyncMock(statSyncMock = jest.fn(() => statSync()));
|
|
||||||
});
|
|
||||||
afterEach(() => {
|
|
||||||
fs_1.assertMocksUsed();
|
|
||||||
statSync = statSyncMock = undefined;
|
|
||||||
});
|
|
||||||
describe('known errors', () => {
|
|
||||||
beforeEach(() => givenStatSyncThrows({ code: 'ENOENT' }));
|
|
||||||
it('with type', () => {
|
|
||||||
expect(src_1.exists(path, src_1.READABLE)).toBe(false);
|
|
||||||
});
|
|
||||||
it('with type omitted', () => {
|
|
||||||
expect(src_1.exists(path)).toBe(false);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
describe('unknown errors', () => {
|
|
||||||
let err;
|
|
||||||
beforeEach(() => err = givenStatSyncThrows(new Error('something')));
|
|
||||||
it('with type', () => {
|
|
||||||
expect(() => src_1.exists(path, src_1.READABLE)).toThrow(err);
|
|
||||||
});
|
|
||||||
it('with type omitted', () => {
|
|
||||||
expect(() => src_1.exists(path)).toThrow(err);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
describe('path is a file', () => {
|
|
||||||
beforeEach(() => givenStatSyncIsA('file'));
|
|
||||||
existsReturns(true, false, true);
|
|
||||||
});
|
|
||||||
describe('path is a folder', () => {
|
|
||||||
beforeEach(() => givenStatSyncIsA('folder'));
|
|
||||||
existsReturns(false, true, true);
|
|
||||||
});
|
|
||||||
describe('path is unknown', () => {
|
|
||||||
beforeEach(() => givenStatSyncIsA('unknown'));
|
|
||||||
existsReturns(false, false, false);
|
|
||||||
});
|
|
||||||
function existsReturns(file, folder, readable) {
|
|
||||||
it('when searching for a file', () => {
|
|
||||||
expect(src_1.exists(path, src_1.FILE)).toBe(file);
|
|
||||||
});
|
|
||||||
it('when searching for a folder', () => {
|
|
||||||
expect(src_1.exists(path, src_1.FOLDER)).toBe(folder);
|
|
||||||
});
|
|
||||||
it('when searching for either', () => {
|
|
||||||
expect(src_1.exists(path, src_1.READABLE)).toBe(readable);
|
|
||||||
});
|
|
||||||
it('when searching without a type', () => {
|
|
||||||
expect(src_1.exists(path)).toBe(readable);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
function givenStatSyncThrows(err) {
|
|
||||||
statSync = () => { throw err; };
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
function givenStatSyncIsA(type) {
|
|
||||||
const mockStat = {
|
|
||||||
isFile() { return type === 'file'; },
|
|
||||||
isDirectory() { return type === 'folder'; },
|
|
||||||
};
|
|
||||||
statSync = () => mockStat;
|
|
||||||
return mockStat;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
//# sourceMappingURL=exists.spec.js.map
|
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"exists.spec.js","sourceRoot":"","sources":["../../test/exists.spec.ts"],"names":[],"mappings":"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"}
|
|
||||||
-42
@@ -1,42 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "@kwsites/file-exists",
|
|
||||||
"version": "1.1.1",
|
|
||||||
"main": "./dist/index.js",
|
|
||||||
"types": "./dist/index.d.ts",
|
|
||||||
"license": "MIT",
|
|
||||||
"repository": "git@github.com:kwsites/file-exists.git",
|
|
||||||
"author": "Steve King <steve@mydev.co>",
|
|
||||||
"contributors": [
|
|
||||||
{
|
|
||||||
"name": "Steve King",
|
|
||||||
"email": "steve@mydev.co"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"files": [
|
|
||||||
"dist/**/*.*"
|
|
||||||
],
|
|
||||||
"scripts": {
|
|
||||||
"clean": "rimraf ./dist",
|
|
||||||
"build": "yarn run clean && tsc",
|
|
||||||
"preversion": "yarn run clean && yarn run build && yarn test",
|
|
||||||
"postversion": "npm publish --access=public && git push && git push --tags",
|
|
||||||
"test": "jest --coverage",
|
|
||||||
"tsc": "tsc"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@babel/core": "^7.10.1",
|
|
||||||
"@babel/preset-env": "^7.10.1",
|
|
||||||
"@babel/preset-typescript": "^7.10.1",
|
|
||||||
"@types/debug": "^4.1.5",
|
|
||||||
"@types/jest": "^26.0.0",
|
|
||||||
"@types/node": "^10.12.0",
|
|
||||||
"babel-jest": "^26.0.1",
|
|
||||||
"jest": "^25.3.0",
|
|
||||||
"rimraf": "^2.6.2",
|
|
||||||
"ts-node": "^8.10.2",
|
|
||||||
"typescript": "^3.1.3"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"debug": "^4.1.1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-41
@@ -1,41 +0,0 @@
|
|||||||
# @kwsites/file-exists
|
|
||||||
|
|
||||||
Synchronous validation of a path existing either as a file or as a directory.
|
|
||||||
|
|
||||||
```
|
|
||||||
const { exists, FILE, FOLDER, READABLE } = require('@kwsites/file-exists');
|
|
||||||
|
|
||||||
// check for a folder existing
|
|
||||||
assert(exists(__dirname, FOLDER));
|
|
||||||
assert(!exists(__filename, FOLDER));
|
|
||||||
|
|
||||||
// check for a file existing
|
|
||||||
assert(!exists(__filename, FILE));
|
|
||||||
assert(exists(__filename, FILE));
|
|
||||||
|
|
||||||
// when no type is specified, both folders and files are allowed
|
|
||||||
assert(exists(__dirname));
|
|
||||||
assert(exists(__filename));
|
|
||||||
|
|
||||||
// alternatively specify both files and folders
|
|
||||||
assert(exists(__dirname, FILE + FOLDER));
|
|
||||||
|
|
||||||
// or just that the path is readable (can be either a file or folder)
|
|
||||||
assert(exists(__filename, READABLE));
|
|
||||||
```
|
|
||||||
|
|
||||||
## Troubleshooting
|
|
||||||
|
|
||||||
This library uses [debug](https://www.npmjs.com/package/debug) to handle logging,
|
|
||||||
to enable logging, use either the environment variable:
|
|
||||||
|
|
||||||
```
|
|
||||||
"DEBUG=@kwsites/file-exists" node ./your-app.js
|
|
||||||
```
|
|
||||||
|
|
||||||
Or explicitly enable logging using the `debug` library itself:
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
require('debug').enable('@kwsites/file-exists');
|
|
||||||
```
|
|
||||||
|
|
||||||
-21
@@ -1,21 +0,0 @@
|
|||||||
MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2018 kwsites
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
-49
@@ -1,49 +0,0 @@
|
|||||||
/**
|
|
||||||
* The `DeferredPromise` has a `promise` property in an initially pending state,
|
|
||||||
* that will be resolved when the `done` method is called or rejected when the
|
|
||||||
* `fail` method is called.
|
|
||||||
*/
|
|
||||||
export interface DeferredPromise<RESOLVES, REJECTS extends Error = Error> {
|
|
||||||
done(result: RESOLVES): void;
|
|
||||||
fail(error: REJECTS): void;
|
|
||||||
readonly status: DeferredPromiseStatus;
|
|
||||||
readonly fulfilled: boolean;
|
|
||||||
promise: Promise<RESOLVES>;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* The three states the DeferredPromise can be in - initially pending then either
|
|
||||||
* resolved or rejected when it is fulfilled.
|
|
||||||
*
|
|
||||||
* ```typescript
|
|
||||||
import {createDeferred, DeferredPromiseStatus} from '@kwsites/promise-deferred`;
|
|
||||||
|
|
||||||
const pending: DeferredPromiseStatus = 'pending';
|
|
||||||
expect(createDeferred()).toHaveProperty('status', pending);
|
|
||||||
```
|
|
||||||
*/
|
|
||||||
export declare type DeferredPromiseStatus = 'pending' | 'resolved' | 'rejected';
|
|
||||||
/**
|
|
||||||
* Creates a new `DeferredPromise`
|
|
||||||
*
|
|
||||||
* ```typescript
|
|
||||||
import {deferred} from '@kwsites/promise-deferred`;
|
|
||||||
```
|
|
||||||
*/
|
|
||||||
export declare function deferred<T extends any = void, E extends Error = Error>(): DeferredPromise<T, E>;
|
|
||||||
/**
|
|
||||||
* Alias of the exported `deferred` function, to help consumers wanting to use `deferred` as the
|
|
||||||
* local variable name rather than the factory import name, without needing to rename on import.
|
|
||||||
*
|
|
||||||
* ```typescript
|
|
||||||
import {createDeferred} from '@kwsites/promise-deferred`;
|
|
||||||
```
|
|
||||||
*/
|
|
||||||
export declare const createDeferred: typeof deferred;
|
|
||||||
/**
|
|
||||||
* Default export allows use as:
|
|
||||||
*
|
|
||||||
* ```typescript
|
|
||||||
import deferred from '@kwsites/promise-deferred`;
|
|
||||||
```
|
|
||||||
*/
|
|
||||||
export default deferred;
|
|
||||||
-59
@@ -1,59 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
exports.createDeferred = exports.deferred = void 0;
|
|
||||||
/**
|
|
||||||
* Creates a new `DeferredPromise`
|
|
||||||
*
|
|
||||||
* ```typescript
|
|
||||||
import {deferred} from '@kwsites/promise-deferred`;
|
|
||||||
```
|
|
||||||
*/
|
|
||||||
function deferred() {
|
|
||||||
let done;
|
|
||||||
let fail;
|
|
||||||
let status = 'pending';
|
|
||||||
const promise = new Promise((_done, _fail) => {
|
|
||||||
done = _done;
|
|
||||||
fail = _fail;
|
|
||||||
});
|
|
||||||
return {
|
|
||||||
promise,
|
|
||||||
done(result) {
|
|
||||||
if (status === 'pending') {
|
|
||||||
status = 'resolved';
|
|
||||||
done(result);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
fail(error) {
|
|
||||||
if (status === 'pending') {
|
|
||||||
status = 'rejected';
|
|
||||||
fail(error);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
get fulfilled() {
|
|
||||||
return status !== 'pending';
|
|
||||||
},
|
|
||||||
get status() {
|
|
||||||
return status;
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
exports.deferred = deferred;
|
|
||||||
/**
|
|
||||||
* Alias of the exported `deferred` function, to help consumers wanting to use `deferred` as the
|
|
||||||
* local variable name rather than the factory import name, without needing to rename on import.
|
|
||||||
*
|
|
||||||
* ```typescript
|
|
||||||
import {createDeferred} from '@kwsites/promise-deferred`;
|
|
||||||
```
|
|
||||||
*/
|
|
||||||
exports.createDeferred = deferred;
|
|
||||||
/**
|
|
||||||
* Default export allows use as:
|
|
||||||
*
|
|
||||||
* ```typescript
|
|
||||||
import deferred from '@kwsites/promise-deferred`;
|
|
||||||
```
|
|
||||||
*/
|
|
||||||
exports.default = deferred;
|
|
||||||
//# sourceMappingURL=index.js.map
|
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AA0BA;;;;;;GAMG;AACH,SAAgB,QAAQ;IACrB,IAAI,IAAyB,CAAC;IAC9B,IAAI,IAAwB,CAAC;IAC7B,IAAI,MAAM,GAA0B,SAAS,CAAC;IAE9C,MAAM,OAAO,GAAe,IAAI,OAAO,CAAI,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QACzD,IAAI,GAAG,KAAK,CAAC;QACb,IAAI,GAAG,KAAK,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,OAAO;QACJ,OAAO;QACP,IAAI,CAAE,MAAM;YACT,IAAI,MAAM,KAAK,SAAS,EAAE;gBACvB,MAAM,GAAG,UAAU,CAAC;gBACpB,IAAI,CAAC,MAAM,CAAC,CAAC;aACf;QACJ,CAAC;QACD,IAAI,CAAE,KAAK;YACR,IAAI,MAAM,KAAK,SAAS,EAAE;gBACvB,MAAM,GAAG,UAAU,CAAC;gBACpB,IAAI,CAAC,KAAK,CAAC,CAAC;aACd;QACJ,CAAC;QACD,IAAI,SAAS;YACV,OAAO,MAAM,KAAK,SAAS,CAAC;QAC/B,CAAC;QACD,IAAI,MAAM;YACP,OAAO,MAAM,CAAC;QACjB,CAAC;KACH,CAAC;AACL,CAAC;AA/BD,4BA+BC;AAED;;;;;;;GAOG;AACU,QAAA,cAAc,GAAG,QAAQ,CAAC;AAEvC;;;;;;GAMG;AACH,kBAAe,QAAQ,CAAC"}
|
|
||||||
-43
@@ -1,43 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "@kwsites/promise-deferred",
|
|
||||||
"description": "Minimalist creation of promise wrappers, exposing the ability to resolve or reject the inner promise",
|
|
||||||
"version": "1.1.1",
|
|
||||||
"private": false,
|
|
||||||
"author": "Steve King <steve@mydev.co>",
|
|
||||||
"contributors": [
|
|
||||||
{
|
|
||||||
"name": "Steve King",
|
|
||||||
"email": "steve@mydev.co"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"main": "./dist/index",
|
|
||||||
"types": "./dist/index",
|
|
||||||
"license": "MIT",
|
|
||||||
"repository": "git://github.com/kwsites/promise-deferred.git",
|
|
||||||
"devDependencies": {
|
|
||||||
"@babel/core": "^7.10.3",
|
|
||||||
"@babel/preset-env": "^7.10.3",
|
|
||||||
"@babel/preset-typescript": "^7.10.1",
|
|
||||||
"@types/jest": "^26.0.0",
|
|
||||||
"@types/node": "^14.0.13",
|
|
||||||
"babel-jest": "^26.1.0",
|
|
||||||
"babel-preset-env": "^1.7.0",
|
|
||||||
"jest": "^26.1.0",
|
|
||||||
"ts-node": "^8.10.2",
|
|
||||||
"typescript": "^3.9.5"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"LICENSE",
|
|
||||||
"dist/**/*.*"
|
|
||||||
],
|
|
||||||
"scripts": {
|
|
||||||
"clean": "git clean -fxd -e .idea -e node_modules",
|
|
||||||
"clean:modules": "git clean -fxd node_modules",
|
|
||||||
"build": "tsc --build",
|
|
||||||
"build:clean": "yarn run clean && tsc",
|
|
||||||
"preversion": "yarn run build:clean && yarn test",
|
|
||||||
"postversion": "npm publish --access=public && git push && git push --tags",
|
|
||||||
"test": "jest --coverage",
|
|
||||||
"tsc": "tsc"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-202
@@ -1,202 +0,0 @@
|
|||||||
|
|
||||||
Apache License
|
|
||||||
Version 2.0, January 2004
|
|
||||||
http://www.apache.org/licenses/
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction,
|
|
||||||
and distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by
|
|
||||||
the copyright owner that is granting the License.
|
|
||||||
|
|
||||||
"Legal Entity" shall mean the union of the acting entity and all
|
|
||||||
other entities that control, are controlled by, or are under common
|
|
||||||
control with that entity. For the purposes of this definition,
|
|
||||||
"control" means (i) the power, direct or indirect, to cause the
|
|
||||||
direction or management of such entity, whether by contract or
|
|
||||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity
|
|
||||||
exercising permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications,
|
|
||||||
including but not limited to software source code, documentation
|
|
||||||
source, and configuration files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical
|
|
||||||
transformation or translation of a Source form, including but
|
|
||||||
not limited to compiled object code, generated documentation,
|
|
||||||
and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or
|
|
||||||
Object form, made available under the License, as indicated by a
|
|
||||||
copyright notice that is included in or attached to the work
|
|
||||||
(an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
form, that is based on (or derived from) the Work and for which the
|
|
||||||
editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
of this License, Derivative Works shall not include works that remain
|
|
||||||
separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including
|
|
||||||
the original version of the Work and any modifications or additions
|
|
||||||
to that Work or Derivative Works thereof, that is intentionally
|
|
||||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
||||||
or by an individual or Legal Entity authorized to submit on behalf of
|
|
||||||
the copyright owner. For the purposes of this definition, "submitted"
|
|
||||||
means any form of electronic, verbal, or written communication sent
|
|
||||||
to the Licensor or its representatives, including but not limited to
|
|
||||||
communication on electronic mailing lists, source code control systems,
|
|
||||||
and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
Licensor for the purpose of discussing and improving the Work, but
|
|
||||||
excluding communication that is conspicuously marked or otherwise
|
|
||||||
designated in writing by the copyright owner as "Not a Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
||||||
on behalf of whom a Contribution has been received by Licensor and
|
|
||||||
subsequently incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
publicly display, publicly perform, sublicense, and distribute the
|
|
||||||
Work and such Derivative Works in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
(except as stated in this section) patent license to make, have made,
|
|
||||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
||||||
where such license applies only to those patent claims licensable
|
|
||||||
by such Contributor that are necessarily infringed by their
|
|
||||||
Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
with the Work to which such Contribution(s) was submitted. If You
|
|
||||||
institute patent litigation against any entity (including a
|
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
||||||
or a Contribution incorporated within the Work constitutes direct
|
|
||||||
or contributory patent infringement, then any patent licenses
|
|
||||||
granted to You under this License for that Work shall terminate
|
|
||||||
as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution. You may reproduce and distribute copies of the
|
|
||||||
Work or Derivative Works thereof in any medium, with or without
|
|
||||||
modifications, and in Source or Object form, provided that You
|
|
||||||
meet the following conditions:
|
|
||||||
|
|
||||||
(a) You must give any other recipients of the Work or
|
|
||||||
Derivative Works a copy of this License; and
|
|
||||||
|
|
||||||
(b) You must cause any modified files to carry prominent notices
|
|
||||||
stating that You changed the files; and
|
|
||||||
|
|
||||||
(c) You must retain, in the Source form of any Derivative Works
|
|
||||||
that You distribute, all copyright, patent, trademark, and
|
|
||||||
attribution notices from the Source form of the Work,
|
|
||||||
excluding those notices that do not pertain to any part of
|
|
||||||
the Derivative Works; and
|
|
||||||
|
|
||||||
(d) If the Work includes a "NOTICE" text file as part of its
|
|
||||||
distribution, then any Derivative Works that You distribute must
|
|
||||||
include a readable copy of the attribution notices contained
|
|
||||||
within such NOTICE file, excluding those notices that do not
|
|
||||||
pertain to any part of the Derivative Works, in at least one
|
|
||||||
of the following places: within a NOTICE text file distributed
|
|
||||||
as part of the Derivative Works; within the Source form or
|
|
||||||
documentation, if provided along with the Derivative Works; or,
|
|
||||||
within a display generated by the Derivative Works, if and
|
|
||||||
wherever such third-party notices normally appear. The contents
|
|
||||||
of the NOTICE file are for informational purposes only and
|
|
||||||
do not modify the License. You may add Your own attribution
|
|
||||||
notices within Derivative Works that You distribute, alongside
|
|
||||||
or as an addendum to the NOTICE text from the Work, provided
|
|
||||||
that such additional attribution notices cannot be construed
|
|
||||||
as modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and
|
|
||||||
may provide additional or different license terms and conditions
|
|
||||||
for use, reproduction, or distribution of Your modifications, or
|
|
||||||
for any such Derivative Works as a whole, provided Your use,
|
|
||||||
reproduction, and distribution of the Work otherwise complies with
|
|
||||||
the conditions stated in this License.
|
|
||||||
|
|
||||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
||||||
any Contribution intentionally submitted for inclusion in the Work
|
|
||||||
by You to the Licensor shall be under the terms and conditions of
|
|
||||||
this License, without any additional terms or conditions.
|
|
||||||
Notwithstanding the above, nothing herein shall supersede or modify
|
|
||||||
the terms of any separate license agreement you may have executed
|
|
||||||
with Licensor regarding such Contributions.
|
|
||||||
|
|
||||||
6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
except as required for reasonable and customary use in describing the
|
|
||||||
origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
||||||
agreed to in writing, Licensor provides the Work (and each
|
|
||||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
implied, including, without limitation, any warranties or conditions
|
|
||||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
||||||
appropriateness of using or redistributing the Work and assume any
|
|
||||||
risks associated with Your exercise of permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability. In no event and under no legal theory,
|
|
||||||
whether in tort (including negligence), contract, or otherwise,
|
|
||||||
unless required by applicable law (such as deliberate and grossly
|
|
||||||
negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
liable to You for damages, including any direct, indirect, special,
|
|
||||||
incidental, or consequential damages of any character arising as a
|
|
||||||
result of this License or out of the use or inability to use the
|
|
||||||
Work (including but not limited to damages for loss of goodwill,
|
|
||||||
work stoppage, computer failure or malfunction, or any and all
|
|
||||||
other commercial damages or losses), even if such Contributor
|
|
||||||
has been advised of the possibility of such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability. While redistributing
|
|
||||||
the Work or Derivative Works thereof, You may choose to offer,
|
|
||||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
||||||
or other liability obligations and/or rights consistent with this
|
|
||||||
License. However, in accepting such obligations, You may act only
|
|
||||||
on Your own behalf and on Your sole responsibility, not on behalf
|
|
||||||
of any other Contributor, and only if You agree to indemnify,
|
|
||||||
defend, and hold each Contributor harmless for any liability
|
|
||||||
incurred by, or claims asserted against, such Contributor by reason
|
|
||||||
of your accepting any such warranty or additional liability.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
APPENDIX: How to apply the Apache License to your work.
|
|
||||||
|
|
||||||
To apply the Apache License to your work, attach the following
|
|
||||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
||||||
replaced with your own identifying information. (Don't include
|
|
||||||
the brackets!) The text should be enclosed in the appropriate
|
|
||||||
comment syntax for the file format. We also recommend that a
|
|
||||||
file or class name and description of purpose be included on the
|
|
||||||
same "printed page" as the copyright notice for easier
|
|
||||||
identification within third-party archives.
|
|
||||||
|
|
||||||
Copyright [yyyy] [name of copyright owner]
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
-27
@@ -1,27 +0,0 @@
|
|||||||
# `@malept/cross-spawn-promise`
|
|
||||||
|
|
||||||
> A promisified version of [`cross-spawn`](https://npm.im/cross-spawn) with slightly different behavior & extra options.
|
|
||||||
|
|
||||||
[](https://github.com/malept/cross-spawn-promise/actions?query=workflow%3ACI)
|
|
||||||
[](https://www.npmjs.com/package/@malept/cross-spawn-promise)
|
|
||||||
[](https://codecov.io/gh/malept/cross-spawn-promise)
|
|
||||||
|
|
||||||
## Different Behavior
|
|
||||||
|
|
||||||
If the spawned process exits with a non-zero code, an `ExitCodeError` is thrown with the original
|
|
||||||
command, code, `stdout`, and `stderr` as properties.
|
|
||||||
|
|
||||||
If the spawned process is terminated by a signal on non-Windows platforms, an `ExitSignalError` is
|
|
||||||
thrown with the original command, signal name, `stdout`, and `stderr` as properties.
|
|
||||||
|
|
||||||
## Extra Options
|
|
||||||
|
|
||||||
- `logger`: a `Function` such as `console.log` or `debug(name)` to log some information
|
|
||||||
about the spawned process.
|
|
||||||
- `updateErrorCallback`: a callback which mutates the error before it is re-thrown. Most commonly,
|
|
||||||
this is used to augment the error message of `ENOENT` error to provide a more human-friendly
|
|
||||||
message as to how to install the missing executable.
|
|
||||||
|
|
||||||
## Legal
|
|
||||||
|
|
||||||
This module is licensed under the Apache 2.0 license.
|
|
||||||
-61
@@ -1,61 +0,0 @@
|
|||||||
/// <reference types="node" />
|
|
||||||
import { SpawnOptions } from "child_process";
|
|
||||||
export declare type LoggerFunction = (message: string) => void;
|
|
||||||
/**
|
|
||||||
* List of string arguments.
|
|
||||||
*/
|
|
||||||
export declare type CrossSpawnArgs = ReadonlyArray<string> | undefined;
|
|
||||||
export declare type CrossSpawnOptions = SpawnOptions & {
|
|
||||||
/**
|
|
||||||
* A `Function` such as `console.log` or `debug(name)` to log some information about the
|
|
||||||
* spawned process.
|
|
||||||
*/
|
|
||||||
logger?: LoggerFunction;
|
|
||||||
/**
|
|
||||||
* A callback which mutates the error before it is rethrown. Most commonly, this is used to
|
|
||||||
* augment the error message of `ENOENT` errors to provide a more human-friendly message as to
|
|
||||||
* how to install the missing executable.
|
|
||||||
*
|
|
||||||
* @param error - The error thrown from the `spawn` function
|
|
||||||
* @param hasLogger - Whether `logger` was set
|
|
||||||
*/
|
|
||||||
updateErrorCallback?: (error: Error, hasLogger: boolean) => void;
|
|
||||||
};
|
|
||||||
/**
|
|
||||||
* Wrapper error for when the spawn function itself emits an error.
|
|
||||||
*/
|
|
||||||
export declare class CrossSpawnError extends Error {
|
|
||||||
originalError: Error;
|
|
||||||
constructor(cmd: string, args: CrossSpawnArgs, originalError: Error, stderr: string);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Base error class for when a process does not exit with a status code of zero.
|
|
||||||
*/
|
|
||||||
export declare abstract class ExitError extends Error {
|
|
||||||
cmd: string;
|
|
||||||
args: CrossSpawnArgs;
|
|
||||||
stdout: string;
|
|
||||||
stderr: string;
|
|
||||||
constructor(cmd: string, args: CrossSpawnArgs, message: string, stdout: string, stderr: string);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* The error thrown when a process emits a non-zero exit code.
|
|
||||||
*/
|
|
||||||
export declare class ExitCodeError extends ExitError {
|
|
||||||
code: number;
|
|
||||||
constructor(cmd: string, args: CrossSpawnArgs, code: number, stdout: string, stderr: string);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* The error thrown when a process exits via a signal.
|
|
||||||
*/
|
|
||||||
export declare class ExitSignalError extends ExitError {
|
|
||||||
signal: string;
|
|
||||||
constructor(cmd: string, args: CrossSpawnArgs, signal: string, stdout: string, stderr: string);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* A wrapper around `cross-spawn`'s `spawn` function which can optionally log the command executed
|
|
||||||
* and/or change the error object via a callback.
|
|
||||||
*
|
|
||||||
* @param cmd - The command to run
|
|
||||||
*/
|
|
||||||
export declare function spawn(cmd: string, args?: CrossSpawnArgs, options?: CrossSpawnOptions): Promise<string>;
|
|
||||||
-113
@@ -1,113 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
||||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
||||||
};
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
exports.spawn = exports.ExitSignalError = exports.ExitCodeError = exports.ExitError = exports.CrossSpawnError = void 0;
|
|
||||||
const cross_spawn_1 = __importDefault(require("cross-spawn"));
|
|
||||||
function stringifyCommand(cmd, args) {
|
|
||||||
if (args && Array.isArray(args) && args.length > 0) {
|
|
||||||
return `${cmd} ${args.join(" ")}`;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return cmd;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Wrapper error for when the spawn function itself emits an error.
|
|
||||||
*/
|
|
||||||
class CrossSpawnError extends Error {
|
|
||||||
constructor(cmd, args, originalError, stderr) {
|
|
||||||
const fullCommand = stringifyCommand(cmd, args);
|
|
||||||
const errorMessage = originalError.message || originalError;
|
|
||||||
super(`Error executing command (${fullCommand}):\n${errorMessage}\n${stderr}`.trim());
|
|
||||||
this.originalError = originalError;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.CrossSpawnError = CrossSpawnError;
|
|
||||||
/**
|
|
||||||
* Base error class for when a process does not exit with a status code of zero.
|
|
||||||
*/
|
|
||||||
class ExitError extends Error {
|
|
||||||
constructor(cmd, args, message, stdout, stderr) {
|
|
||||||
super(message);
|
|
||||||
this.cmd = cmd;
|
|
||||||
this.args = args;
|
|
||||||
this.stdout = stdout;
|
|
||||||
this.stderr = stderr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.ExitError = ExitError;
|
|
||||||
/**
|
|
||||||
* The error thrown when a process emits a non-zero exit code.
|
|
||||||
*/
|
|
||||||
class ExitCodeError extends ExitError {
|
|
||||||
constructor(cmd, args, code, stdout, stderr) {
|
|
||||||
const fullCommand = stringifyCommand(cmd, args);
|
|
||||||
super(cmd, args, `Command failed with a non-zero return code (${code}):\n${fullCommand}\n${stdout}\n${stderr}`.trim(), stdout, stderr);
|
|
||||||
this.code = code;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.ExitCodeError = ExitCodeError;
|
|
||||||
/**
|
|
||||||
* The error thrown when a process exits via a signal.
|
|
||||||
*/
|
|
||||||
class ExitSignalError extends ExitError {
|
|
||||||
constructor(cmd, args, signal, stdout, stderr) {
|
|
||||||
const fullCommand = stringifyCommand(cmd, args);
|
|
||||||
super(cmd, args, `Command terminated via a signal (${signal}):\n${fullCommand}\n${stdout}\n${stderr}`.trim(), stdout, stderr);
|
|
||||||
this.signal = signal;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.ExitSignalError = ExitSignalError;
|
|
||||||
/**
|
|
||||||
* A wrapper around `cross-spawn`'s `spawn` function which can optionally log the command executed
|
|
||||||
* and/or change the error object via a callback.
|
|
||||||
*
|
|
||||||
* @param cmd - The command to run
|
|
||||||
*/
|
|
||||||
async function spawn(cmd, args, options) {
|
|
||||||
if (!options) {
|
|
||||||
options = {};
|
|
||||||
}
|
|
||||||
const { logger, updateErrorCallback, ...spawnOptions } = options;
|
|
||||||
if (logger)
|
|
||||||
logger(`Executing command ${stringifyCommand(cmd, args)}`);
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
let stdout = "";
|
|
||||||
let stderr = "";
|
|
||||||
const process = cross_spawn_1.default(cmd, args, spawnOptions);
|
|
||||||
if (process.stdout) {
|
|
||||||
process.stdout.on("data", (data) => {
|
|
||||||
stdout += data.toString();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (process.stderr) {
|
|
||||||
process.stderr.on("data",
|
|
||||||
/* istanbul ignore next */ (data) => {
|
|
||||||
stderr += data.toString();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
process.on("close", (code, signal) => {
|
|
||||||
if (code === 0) {
|
|
||||||
resolve(stdout);
|
|
||||||
}
|
|
||||||
else if (code === null) {
|
|
||||||
// Why: assume signal is not null if code is null
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
||||||
reject(new ExitSignalError(cmd, args, signal, stdout, stderr));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
reject(new ExitCodeError(cmd, args, code, stdout, stderr));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
process.on("error", (err) => {
|
|
||||||
if (updateErrorCallback) {
|
|
||||||
updateErrorCallback(err, !!logger);
|
|
||||||
}
|
|
||||||
reject(new CrossSpawnError(cmd, args, err, stderr));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
exports.spawn = spawn;
|
|
||||||
//# sourceMappingURL=index.js.map
|
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
||||||
-107
@@ -1,107 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "@malept/cross-spawn-promise",
|
|
||||||
"version": "2.0.0",
|
|
||||||
"description": "Promisified version of cross-spawn",
|
|
||||||
"main": "dist/src/index.js",
|
|
||||||
"repository": "https://github.com/malept/cross-spawn-promise",
|
|
||||||
"author": "Mark Lee",
|
|
||||||
"license": "Apache-2.0",
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 12.13.0"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"ava": "ava",
|
|
||||||
"build": "tsc",
|
|
||||||
"coverage": "nyc --reporter=lcov --reporter=text ava",
|
|
||||||
"docs": "typedoc src/index.ts",
|
|
||||||
"lint": "prettier --check . && eslint --ext .ts .",
|
|
||||||
"prepare": "husky install && yarn build",
|
|
||||||
"test": "yarn lint && yarn ava"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"dist"
|
|
||||||
],
|
|
||||||
"dependencies": {
|
|
||||||
"cross-spawn": "^7.0.1"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@istanbuljs/nyc-config-typescript": "^1.0.1",
|
|
||||||
"@types/cross-spawn": "^6.0.1",
|
|
||||||
"@types/node": "^15.14.0",
|
|
||||||
"@typescript-eslint/eslint-plugin": "^4.0.1",
|
|
||||||
"@typescript-eslint/parser": "^4.0.1",
|
|
||||||
"ava": "^3.3.0",
|
|
||||||
"eslint": "^7.0.0",
|
|
||||||
"eslint-config-prettier": "^8.0.0",
|
|
||||||
"eslint-plugin-ava": "^12.0.0",
|
|
||||||
"eslint-plugin-import": "^2.20.1",
|
|
||||||
"eslint-plugin-prettier": "^3.1.2",
|
|
||||||
"eslint-plugin-promise": "^5.1.0",
|
|
||||||
"eslint-plugin-tsdoc": "^0.2.5",
|
|
||||||
"husky": "^7.0.0",
|
|
||||||
"lint-staged": "^11.0.0",
|
|
||||||
"nyc": "^15.0.0",
|
|
||||||
"prettier": "^2.0.1",
|
|
||||||
"source-map-support": "^0.5.16",
|
|
||||||
"ts-node": "^10.0.0",
|
|
||||||
"typedoc": "^0.21.2",
|
|
||||||
"typescript": "~4.3.5"
|
|
||||||
},
|
|
||||||
"ava": {
|
|
||||||
"extensions": [
|
|
||||||
"ts"
|
|
||||||
],
|
|
||||||
"require": [
|
|
||||||
"ts-node/register"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"eslintConfig": {
|
|
||||||
"parser": "@typescript-eslint/parser",
|
|
||||||
"parserOptions": {
|
|
||||||
"ecmaVersion": "2019",
|
|
||||||
"sourceType": "module"
|
|
||||||
},
|
|
||||||
"plugins": [
|
|
||||||
"@typescript-eslint",
|
|
||||||
"eslint-plugin-tsdoc"
|
|
||||||
],
|
|
||||||
"extends": [
|
|
||||||
"eslint:recommended",
|
|
||||||
"plugin:@typescript-eslint/recommended",
|
|
||||||
"plugin:ava/recommended",
|
|
||||||
"plugin:import/errors",
|
|
||||||
"plugin:import/warnings",
|
|
||||||
"plugin:import/typescript",
|
|
||||||
"plugin:prettier/recommended",
|
|
||||||
"plugin:promise/recommended",
|
|
||||||
"prettier"
|
|
||||||
],
|
|
||||||
"rules": {
|
|
||||||
"strict": "error",
|
|
||||||
"tsdoc/syntax": "warn"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"eslintIgnore": [
|
|
||||||
"dist"
|
|
||||||
],
|
|
||||||
"funding": [
|
|
||||||
{
|
|
||||||
"type": "individual",
|
|
||||||
"url": "https://github.com/sponsors/malept"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "tidelift",
|
|
||||||
"url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"lint-staged": {
|
|
||||||
"*.{json,md,yml}": "prettier --write",
|
|
||||||
"*.ts": [
|
|
||||||
"prettier --write",
|
|
||||||
"eslint --fix"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"nyc": {
|
|
||||||
"extends": "@istanbuljs/nyc-config-typescript"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-19
@@ -1,19 +0,0 @@
|
|||||||
Copyright (c) 2016 Endless Mobile, Inc.
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
|
||||||
so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
-210
@@ -1,210 +0,0 @@
|
|||||||
# @malept/flatpak-bundler [](https://www.npmjs.com/package/@malept/flatpak-bundler) [](https://github.com/malept/flatpak-bundler/actions?query=workflow%3ACI)
|
|
||||||
Build [flatpaks](https://flatpak.org/) from Node.js.
|
|
||||||
|
|
||||||
# Quick Start
|
|
||||||
|
|
||||||
Install `@malept/flatpak-bundler`.
|
|
||||||
```shell
|
|
||||||
$ npm install @malept/flatpak-bundler
|
|
||||||
```
|
|
||||||
|
|
||||||
[Build a flatpak with a Node script](#hello-world).
|
|
||||||
|
|
||||||
Install and run it!
|
|
||||||
```shell
|
|
||||||
$ flatpak install --user --bundle hello.flatpak
|
|
||||||
$ flatpak run org.world.Hello
|
|
||||||
Hello, world!
|
|
||||||
```
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
This modules allows building flatpaks programmatically from Node. It requires
|
|
||||||
Node 10 or above and flatpak >= 0.6.13 to be installed on your system.
|
|
||||||
|
|
||||||
Under the hood, this is just a wrapper for the [flatpak-builder](https://docs.flatpak.org/en/latest/flatpak-builder.html)
|
|
||||||
tool with some extra sugar added.
|
|
||||||
|
|
||||||
With `flatpak-builder`, you specify a runtime, sandbox permissions and software
|
|
||||||
modules to build into your application, and build a flatpak from start to finish.
|
|
||||||
This module provides a few additional features:
|
|
||||||
|
|
||||||
- Supports auto installing flatpak runtime and app dependencies
|
|
||||||
- Supports exporting directly to the a single file flatpak bundle
|
|
||||||
- Supports easy copying files and creating symlinks directly in `/app`
|
|
||||||
|
|
||||||
The latter is particularly useful for [Electron](https://electronjs.org/) and
|
|
||||||
[nw.js](http://nwjs.io/) style Node applications, which often create packages
|
|
||||||
from prebuilt binaries and do not attempt to follow an autotools-like
|
|
||||||
[build api](https://github.com/cgwalters/build-api).
|
|
||||||
|
|
||||||
This module should make it easy to plug flatpak support into an Electron or nw.js
|
|
||||||
app packaging phase.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
### translateArch(arch)
|
|
||||||
|
|
||||||
Used to translate a Node-style arch (e.g., `x64`) into a Flatpak-compatible arch (e.g., `x86_64`).
|
|
||||||
|
|
||||||
If the arch is unknown, it will pass through the input value.
|
|
||||||
|
|
||||||
### bundle(manifest, buildOptions)
|
|
||||||
|
|
||||||
Takes an [app manifest](#manifest) and a build options object. It returns a Promise.
|
|
||||||
|
|
||||||
Both the manifest and options objects support both camelCase and dash-separated
|
|
||||||
variants of any option.
|
|
||||||
|
|
||||||
The promise is returned with a `finalBuildOptions` value. It contains the build
|
|
||||||
options after default values have been applied. Useful to read out the
|
|
||||||
`workingDir`, for example.
|
|
||||||
|
|
||||||
#### Manifest
|
|
||||||
|
|
||||||
This matches the format for [`flatpak-builder` app
|
|
||||||
manifests](https://docs.flatpak.org/en/latest/manifests.html), with a few extra
|
|
||||||
options added and camelCase variants supported.
|
|
||||||
|
|
||||||
- **id**: Required. The application id.
|
|
||||||
- **runtime**: Required. The runtime for your flatpak application.
|
|
||||||
- **sdk**: Required. The sdk for your flatpak application.
|
|
||||||
- **base**: An app to inherit from. Use the app as a "base" for `/app`
|
|
||||||
contents.
|
|
||||||
- **finishArgs**: The arguments to pass to `flatpak build-finish`. Use this to
|
|
||||||
add sandbox permissions. See the [Electron app example](#electron-app) for
|
|
||||||
some common app permissions.
|
|
||||||
- **modules**: If you need to build other software modules into you flatpak app
|
|
||||||
(anything not already in your runtime or base app), you can specify them
|
|
||||||
here.
|
|
||||||
|
|
||||||
#### Build Options
|
|
||||||
|
|
||||||
- **bundlePath**: Output location for a single file version of the flatpak. If
|
|
||||||
non supplied, the single file flatpak will not be created.
|
|
||||||
- **arch**: The architecture for the flatpak bundle. x86_64, i386 or arm.
|
|
||||||
- **workingDir**: The working directory to call `flatpak-builder` from.
|
|
||||||
Defaults to a new tmp directory.
|
|
||||||
- **buildDir**: The directory to build the application in. Defaults to
|
|
||||||
`${workingDir}/build`
|
|
||||||
- **repoDir**: The directory for a flatpak repo, can be used to publish to an
|
|
||||||
existing repo. Defaults to `${workingDir}/repo`
|
|
||||||
- **cleanTmpdirs**: Cleanup any tmp directories created during the build on
|
|
||||||
process exit. Defaults to true. Set false for easier debugging.
|
|
||||||
- **autoInstallRuntime**: Install/update the runtime while building. Defaults
|
|
||||||
to true if runtimeFlatpakref is set in the manifest.
|
|
||||||
- **autoInstallSdk**: Install/update the sdk while building. Defaults
|
|
||||||
to true if sdkFlatpakref is set in the manifest.
|
|
||||||
- **autoInstallBase**: Install/update the base app while building. Defaults
|
|
||||||
to true if baseFlatpakref is set in the manifest.
|
|
||||||
- **gpgSign**: The gpg key to use to sign the flatpak repo and bundle file.
|
|
||||||
- **gpgHomedir**: The gpg homedir to use when signing.
|
|
||||||
- **subject**: The single line subject to use for the flatpak repo commit
|
|
||||||
message.
|
|
||||||
- **body**: The description to use for the flatpak repo commit message.
|
|
||||||
- **files**: Files to copy directly into the app. Should be a list of [source,
|
|
||||||
dest] tuples. Source should be a relative/absolute path to a file/directory
|
|
||||||
to copy into the flatpak, and dest should be the path inside the app install
|
|
||||||
prefix (e.g. `/share/applications/`)
|
|
||||||
- **symlinks**: Symlinks to create in the app files. Should be a list of
|
|
||||||
[target, location] symlink tuples. Target can be either a relative or
|
|
||||||
absolute path inside the app install prefix, and location should be a
|
|
||||||
absolute path inside the prefix to create the symlink at.
|
|
||||||
- **extraExports**: Files to export outside of the flatpak sandbox, in addition
|
|
||||||
to the application desktop file, icons and appstream. File basename *must*
|
|
||||||
be prefixed with the app id. Should not be needed for common use.
|
|
||||||
- **runtimeFlatpakref**: A pathname or url to a flatpakref file to use to auto
|
|
||||||
install the runtime.
|
|
||||||
- **sdkFlatpakref**: A pathname or url to a flatpakref file to use to auto
|
|
||||||
install the sdk.
|
|
||||||
- **baseFlatpakref**: A pathname or url to a flatpakref file to use to auto
|
|
||||||
install the base app.
|
|
||||||
- **bundleRepoUrl**: Repo url for the single file bundle. Installing the bundle
|
|
||||||
will automatically configure a remote for this URL.
|
|
||||||
- **extraFlatpakBuilderArgs**: List of extra arguments to pass to the
|
|
||||||
[flatpak-builder](https://docs.flatpak.org/en/latest/flatpak-builder-command-reference.html) command.
|
|
||||||
- **extraFlatpakBuildExportArgs**: List of extra arguments to pass to the
|
|
||||||
[flatpak build-export](https://docs.flatpak.org/en/latest/flatpak-command-reference.html#flatpak-build-export) command.
|
|
||||||
- **extraFlatpakBuildBundleArgs**: List of extra arguments to pass to the
|
|
||||||
[flatpak build-bundle](https://docs.flatpak.org/en/latest/flatpak-command-reference.html#flatpak-build-bundle) command.
|
|
||||||
|
|
||||||
### Logging
|
|
||||||
To turn on debugging output, set the DEBUG environment variable:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
DEBUG=flatpak-bundler npm run my-flatpak-command
|
|
||||||
```
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
### Hello world
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
const flatpakBundler = require('@malept/flatpak-bundler')
|
|
||||||
const fs = require('fs-extra')
|
|
||||||
|
|
||||||
// Write a hello world script to disk
|
|
||||||
await fs.writeFile('hello',
|
|
||||||
`#!/bin/bash
|
|
||||||
echo "Hello, world!"`, { mode: 0o755 })
|
|
||||||
|
|
||||||
// Make a flatpak with it!
|
|
||||||
try {
|
|
||||||
await flatpakBundler.bundle({
|
|
||||||
id: 'org.world.Hello',
|
|
||||||
runtime: 'org.freedesktop.Platform',
|
|
||||||
runtimeVersion: '1.4',
|
|
||||||
sdk: 'org.freedesktop.Sdk',
|
|
||||||
}, {
|
|
||||||
bundlePath: 'hello.flatpak',
|
|
||||||
files: [
|
|
||||||
['hello', '/bin/hello']
|
|
||||||
],
|
|
||||||
runtimeFlatpakref: 'https://raw.githubusercontent.com/endlessm/flatpak-bundler/master/refs/freedesktop-runtime-1.4.flatpakref'
|
|
||||||
})
|
|
||||||
console.log('Flatpak built successfully')
|
|
||||||
} catch (error) {
|
|
||||||
console.error('Error building flatpak', error)
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Electron App
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
const flatpakBundler = require('@malept/flatpak-bundler')
|
|
||||||
|
|
||||||
try {
|
|
||||||
const finalBuildOptions = await flatpakBundler.bundle({ // Manifest
|
|
||||||
id: 'org.world.Hello',
|
|
||||||
base: 'io.atom.electron.BaseApp', // Electron base application
|
|
||||||
runtime: 'org.freedesktop.Platform', // Use the freedesktop runtime
|
|
||||||
runtimeVersion: '1.4',
|
|
||||||
sdk: 'org.freedesktop.Sdk',
|
|
||||||
finishArgs: [
|
|
||||||
'--share=ipc', '--socket=x11', // Allow app to show windows with X11
|
|
||||||
'--socket=pulseaudio', // Allow audio output
|
|
||||||
'--filesystem=home', // Allow access to users home directory
|
|
||||||
'--share=network', // Allow network access
|
|
||||||
'--device=dri' // Allow OpenGL rendering
|
|
||||||
],
|
|
||||||
renameDesktopFile: 'hello.desktop', // Rename the desktop file to agree with the app ID so flatpak will export it
|
|
||||||
renameIcon: 'hello' // Rename the icon to agree with the app ID so flatpak will export it
|
|
||||||
}, { // Build options
|
|
||||||
arch: 'x86_64',
|
|
||||||
baseFlatpakref: 'https://s3-us-west-2.amazonaws.com/electron-flatpak.endlessm.com/electron-base-app-master.flatpakref', // So we can auto install the runtime
|
|
||||||
bundlePath: 'dist/hello_x86_64.flatpak',
|
|
||||||
files: [
|
|
||||||
[ 'static/linux', '/share/' ], // Desktop file and icons
|
|
||||||
[ packagedFileDir, '/share/bar' ] // Application binaries and assets
|
|
||||||
],
|
|
||||||
gpgSign: '1234ABCD', // GPG key to sign with
|
|
||||||
runtimeFlatpakref: 'https://raw.githubusercontent.com/endlessm/flatpak-bundler/master/refs/freedesktop-runtime-1.4.flatpakref',
|
|
||||||
symlinks: [
|
|
||||||
[ '/share/bar/Bar', '/bin/Bar' ] // Create a symlink in /bin to to app executable
|
|
||||||
]
|
|
||||||
})
|
|
||||||
console.log('Flatpak built successfully.')
|
|
||||||
console.log(`Build dir and repo in ${finalBuildOptions.workingDir}`)
|
|
||||||
} catch (error) {
|
|
||||||
console.error('Error building flatpak', error)
|
|
||||||
}
|
|
||||||
```
|
|
||||||
-318
@@ -1,318 +0,0 @@
|
|||||||
'use strict'
|
|
||||||
|
|
||||||
const _ = require('lodash')
|
|
||||||
const childProcess = require('child_process')
|
|
||||||
const fs = require('fs-extra')
|
|
||||||
const path = require('path')
|
|
||||||
const { promisify } = require('util')
|
|
||||||
const tmp = require('tmp-promise')
|
|
||||||
|
|
||||||
const pkg = require('./package.json')
|
|
||||||
const logger = require('debug')(pkg.name)
|
|
||||||
|
|
||||||
const exec = promisify(childProcess.exec)
|
|
||||||
|
|
||||||
function kebabify (object) {
|
|
||||||
return _.cloneDeepWith(object, (value) => {
|
|
||||||
if (!value || typeof value !== 'object') return value
|
|
||||||
|
|
||||||
return Object.keys(value).reduce((newValue, key) => {
|
|
||||||
newValue[_.kebabCase(key)] = value[key]
|
|
||||||
return newValue
|
|
||||||
}, {})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function translateArch (arch) {
|
|
||||||
if (arch === 'ia32') return 'i386'
|
|
||||||
if (arch === 'x64') return 'x86_64'
|
|
||||||
if (arch === 'amd64') return 'x86_64'
|
|
||||||
if (arch === 'armv7l') return 'arm'
|
|
||||||
return arch
|
|
||||||
}
|
|
||||||
|
|
||||||
function getOptionsWithDefaults (options, manifest) {
|
|
||||||
const defaults = {
|
|
||||||
'build-dir': path.join(options['working-dir'], 'build'),
|
|
||||||
'repo-dir': path.join(options['working-dir'], 'repo'),
|
|
||||||
'manifest-path': path.join(options['working-dir'], 'manifest.json'),
|
|
||||||
'extra-flatpak-builder-args': [],
|
|
||||||
'extra-flatpak-build-bundle-args': [],
|
|
||||||
'extra-flatpak-build-export-args': [],
|
|
||||||
'clean-tmpdirs': true,
|
|
||||||
'auto-install-runtime': typeof options['runtime-flatpakref'] !== 'undefined',
|
|
||||||
'auto-install-sdk': typeof options['sdk-flatpakref'] !== 'undefined',
|
|
||||||
'auto-install-base': typeof options['base-flatpakref'] !== 'undefined'
|
|
||||||
}
|
|
||||||
options = _.defaults({}, options, defaults)
|
|
||||||
options['working-dir'] = path.resolve(options['working-dir'])
|
|
||||||
options['build-dir'] = path.resolve(options['build-dir'])
|
|
||||||
options['repo-dir'] = path.resolve(options['repo-dir'])
|
|
||||||
options['manifest-path'] = path.resolve(options['manifest-path'])
|
|
||||||
if (options['bundle-path']) options['bundle-path'] = path.resolve(options['bundle-path'])
|
|
||||||
return options
|
|
||||||
}
|
|
||||||
|
|
||||||
async function spawnWithLogging (options, command, args, allowFail) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
logger(`$ ${command} ${args.join(' ')}`)
|
|
||||||
const child = childProcess.spawn(command, args, { cwd: options['working-dir'] })
|
|
||||||
child.stdout.on('data', (data) => {
|
|
||||||
logger(`1> ${data}`)
|
|
||||||
})
|
|
||||||
child.stderr.on('data', (data) => {
|
|
||||||
logger(`2> ${data}`)
|
|
||||||
})
|
|
||||||
child.on('error', (error) => {
|
|
||||||
reject(error)
|
|
||||||
})
|
|
||||||
child.on('close', (code) => {
|
|
||||||
if (!allowFail && code !== 0) {
|
|
||||||
reject(new Error(`${command} failed with status code ${code}`))
|
|
||||||
}
|
|
||||||
resolve(code === 0)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
function addCommandLineOption (args, name, value) {
|
|
||||||
if (!value) return
|
|
||||||
|
|
||||||
args.push(`--${name}`)
|
|
||||||
if (value !== true) args.push(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
async function checkInstalled (id, options, version, checkUser) {
|
|
||||||
const args = ['info']
|
|
||||||
addCommandLineOption(args, 'show-commit', true)
|
|
||||||
addCommandLineOption(args, checkUser ? 'user' : 'system', true)
|
|
||||||
args.push([id, options.arch, version].join('/'))
|
|
||||||
return spawnWithLogging(options, 'flatpak', args, true)
|
|
||||||
}
|
|
||||||
|
|
||||||
let _flatpakBuilderVersion
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the flatpak-builder version in a comparable form (Array of Numbers).
|
|
||||||
*/
|
|
||||||
async function flatpakBuilderVersion () {
|
|
||||||
if (!_flatpakBuilderVersion) {
|
|
||||||
const versionString = _.last((await exec('flatpak-builder --version')).toString().split(' '))
|
|
||||||
_flatpakBuilderVersion = versionString.split('.').map(part => parseInt(part, 10))
|
|
||||||
}
|
|
||||||
|
|
||||||
return _flatpakBuilderVersion
|
|
||||||
}
|
|
||||||
|
|
||||||
async function addAssumeYesArg (args) {
|
|
||||||
if ((await flatpakBuilderVersion()) >= [0, 9, 9]) {
|
|
||||||
logger('flatpak-builder is new enough, adding --assumeyes')
|
|
||||||
addCommandLineOption(args, 'assumeyes', true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function ensureRef (options, manifest, type, version) {
|
|
||||||
const flatpakref = options[`${type}-flatpakref`]
|
|
||||||
const id = manifest[type]
|
|
||||||
if (!options[`auto-install-${type}`]) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
logger(`Ensuring ${type} is up to date`)
|
|
||||||
|
|
||||||
logger(`Checking for install of ${id}`)
|
|
||||||
const [userInstall, systemInstall] = await Promise.all([
|
|
||||||
checkInstalled(id, options, version, true),
|
|
||||||
checkInstalled(id, options, version, false)
|
|
||||||
])
|
|
||||||
if (!userInstall && !systemInstall) {
|
|
||||||
logger(`No install of ${id} found, trying to install from ${flatpakref}`)
|
|
||||||
if (!flatpakref) {
|
|
||||||
throw new Error(`Cannot install ${id} without flatpakref`)
|
|
||||||
}
|
|
||||||
const args = ['install']
|
|
||||||
addCommandLineOption(args, 'user', true)
|
|
||||||
addCommandLineOption(args, 'no-deps', true)
|
|
||||||
addCommandLineOption(args, 'arch', options.arch)
|
|
||||||
await addAssumeYesArg(args)
|
|
||||||
if (flatpakref.startsWith('app/') || flatpakref.startsWith('runtime/')) {
|
|
||||||
args.push(flatpakref)
|
|
||||||
} else {
|
|
||||||
addCommandLineOption(args, 'from', flatpakref)
|
|
||||||
}
|
|
||||||
return spawnWithLogging(options, 'flatpak', args)
|
|
||||||
}
|
|
||||||
|
|
||||||
logger(`Found install of ${id}, trying to update`)
|
|
||||||
const args = ['update']
|
|
||||||
addCommandLineOption(args, 'user', userInstall)
|
|
||||||
addCommandLineOption(args, 'no-deps', true)
|
|
||||||
addCommandLineOption(args, 'arch', options.arch)
|
|
||||||
await addAssumeYesArg(args)
|
|
||||||
args.push(id)
|
|
||||||
if (version) {
|
|
||||||
args.push(version)
|
|
||||||
}
|
|
||||||
return spawnWithLogging(options, 'flatpak', args)
|
|
||||||
}
|
|
||||||
|
|
||||||
async function ensureRuntime (options, manifest) {
|
|
||||||
return ensureRef(options, manifest, 'runtime', manifest['runtime-version'])
|
|
||||||
}
|
|
||||||
|
|
||||||
async function ensureSdk (options, manifest) {
|
|
||||||
return ensureRef(options, manifest, 'sdk', manifest['runtime-version'])
|
|
||||||
}
|
|
||||||
|
|
||||||
async function ensureBase (options, manifest) {
|
|
||||||
return ensureRef(options, manifest, 'base', manifest['base-version'])
|
|
||||||
}
|
|
||||||
|
|
||||||
async function ensureWorkingDir (options) {
|
|
||||||
if (!options['working-dir']) {
|
|
||||||
const dir = await tmp.dir({ prefix: 'flatpak-bundler', unsafeCleanup: options['clean-tmpdirs'] })
|
|
||||||
options['working-dir'] = dir.path
|
|
||||||
} else {
|
|
||||||
return fs.ensureDir(options['working-dir'])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function writeJsonFile (options, manifest) {
|
|
||||||
return fs.writeJson(options['manifest-path'], manifest, { space: ' ' })
|
|
||||||
}
|
|
||||||
|
|
||||||
async function copyFiles (options, manifest) {
|
|
||||||
if (!options.files) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
return Promise.all(options.files.map(async sourceDest => {
|
|
||||||
const source = path.resolve(sourceDest[0])
|
|
||||||
const dest = path.join(options['build-dir'], 'files', sourceDest[1])
|
|
||||||
let dir = dest
|
|
||||||
if (!dir.endsWith(path.sep)) {
|
|
||||||
dir = path.dirname(dir)
|
|
||||||
}
|
|
||||||
|
|
||||||
logger(`Copying ${source} to ${dest}`)
|
|
||||||
await fs.ensureDir(dir)
|
|
||||||
await fs.copy(source, dest)
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
|
|
||||||
async function createSymlinks (options, manifest) {
|
|
||||||
if (!options.symlinks) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
return Promise.all(options.symlinks.map(async ([targetPath, location]) => {
|
|
||||||
const target = path.join('/app', targetPath)
|
|
||||||
const dest = path.join(options['build-dir'], 'files', location)
|
|
||||||
|
|
||||||
logger(`Symlinking ${target} at ${dest}`)
|
|
||||||
await fs.ensureDir(path.dirname(dest))
|
|
||||||
await fs.symlink(target, dest)
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
|
|
||||||
async function copyExports (options, manifest) {
|
|
||||||
if (!options['extra-exports']) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
return Promise.all(options['extra-exports'].map(async source => {
|
|
||||||
const dest = path.join(options['build-dir'], 'export', source)
|
|
||||||
const dir = path.dirname(dest)
|
|
||||||
source = path.join(options['build-dir'], 'files', source)
|
|
||||||
|
|
||||||
logger(`Exporting ${source} to ${dest}`)
|
|
||||||
await fs.ensureDir(dir)
|
|
||||||
await fs.copy(source, dest)
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
|
|
||||||
async function flatpakBuilder (options, manifest, finish) {
|
|
||||||
const args = []
|
|
||||||
addCommandLineOption(args, 'arch', options.arch)
|
|
||||||
addCommandLineOption(args, 'force-clean', true)
|
|
||||||
// If we are not compiling anything, allow building without the platform and sdk
|
|
||||||
// installed. Allows automated builds on a minimal environment, for example.
|
|
||||||
if (!manifest.modules || manifest.modules.length === 0) {
|
|
||||||
addCommandLineOption(args, 'allow-missing-runtimes', true)
|
|
||||||
}
|
|
||||||
if (!finish) {
|
|
||||||
addCommandLineOption(args, 'build-only', true)
|
|
||||||
} else {
|
|
||||||
addCommandLineOption(args, 'finish-only', true)
|
|
||||||
}
|
|
||||||
await addAssumeYesArg(args)
|
|
||||||
args.push.apply(args, options['extra-flatpak-builder-args'])
|
|
||||||
|
|
||||||
args.push(options['build-dir'])
|
|
||||||
args.push(options['manifest-path'])
|
|
||||||
return spawnWithLogging(options, 'flatpak-builder', args)
|
|
||||||
}
|
|
||||||
|
|
||||||
async function flatpakBuildExport (options, manifest) {
|
|
||||||
const args = ['build-export']
|
|
||||||
addCommandLineOption(args, 'arch', options.arch)
|
|
||||||
addCommandLineOption(args, 'gpg-sign', options['gpg-sign'])
|
|
||||||
addCommandLineOption(args, 'gpg-homedir', options['gpg-homedir'])
|
|
||||||
addCommandLineOption(args, 'subject', options.subject)
|
|
||||||
addCommandLineOption(args, 'body', options.body)
|
|
||||||
if (options['build-runtime']) addCommandLineOption(args, 'runtime', true)
|
|
||||||
args.push.apply(args, options['extra-flatpak-build-export-args'])
|
|
||||||
|
|
||||||
args.push(options['repo-dir'])
|
|
||||||
args.push(options['build-dir'])
|
|
||||||
if (manifest.branch) args.push(manifest.branch)
|
|
||||||
return spawnWithLogging(options, 'flatpak', args)
|
|
||||||
}
|
|
||||||
|
|
||||||
async function flatpakBuildBundle (options, manifest) {
|
|
||||||
if (!options['bundle-path']) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
const args = ['build-bundle']
|
|
||||||
addCommandLineOption(args, 'arch', options.arch)
|
|
||||||
addCommandLineOption(args, 'gpg-keys', options['gpg-keys'])
|
|
||||||
addCommandLineOption(args, 'gpg-homedir', options['gpg-homedir'])
|
|
||||||
addCommandLineOption(args, 'repo-url', options['bundle-repo-url'])
|
|
||||||
if (options['build-runtime']) addCommandLineOption(args, 'runtime', true)
|
|
||||||
args.push.apply(args, options['extra-flatpak-build-bundle-args'])
|
|
||||||
|
|
||||||
args.push(options['repo-dir'])
|
|
||||||
args.push(options['bundle-path'])
|
|
||||||
args.push(manifest.id)
|
|
||||||
if (manifest.branch) args.push(manifest.branch)
|
|
||||||
|
|
||||||
await fs.ensureDir(path.dirname(options['bundle-path']))
|
|
||||||
return spawnWithLogging(options, 'flatpak', args)
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.bundle = async function (manifest, options) {
|
|
||||||
manifest = kebabify(manifest)
|
|
||||||
options = kebabify(options)
|
|
||||||
if (manifest['app-id']) manifest.id = manifest['app-id']
|
|
||||||
|
|
||||||
await ensureWorkingDir(options)
|
|
||||||
options = getOptionsWithDefaults(options, manifest)
|
|
||||||
options.arch = translateArch(options.arch)
|
|
||||||
|
|
||||||
logger(`Using manifest...\n${JSON.stringify(manifest, null, ' ')}`)
|
|
||||||
logger(`Using options...\n${JSON.stringify(options, null, ' ')}`)
|
|
||||||
await ensureRuntime(options, manifest)
|
|
||||||
await ensureSdk(options, manifest)
|
|
||||||
await ensureBase(options, manifest)
|
|
||||||
await writeJsonFile(options, manifest)
|
|
||||||
await flatpakBuilder(options, manifest, false)
|
|
||||||
await copyFiles(options, manifest)
|
|
||||||
await createSymlinks(options, manifest)
|
|
||||||
await flatpakBuilder(options, manifest, true)
|
|
||||||
await copyExports(options, manifest)
|
|
||||||
await flatpakBuildExport(options, manifest)
|
|
||||||
await flatpakBuildBundle(options, manifest)
|
|
||||||
return options
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.translateArch = translateArch
|
|
||||||
-46
@@ -1,46 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "@malept/flatpak-bundler",
|
|
||||||
"version": "0.4.0",
|
|
||||||
"description": "A small utility for packing files in a flatpak.",
|
|
||||||
"main": "index.js",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+https://github.com/malept/flatpak-bundler.git"
|
|
||||||
},
|
|
||||||
"keywords": [
|
|
||||||
"flatpak"
|
|
||||||
],
|
|
||||||
"author": "Matt Watson <mattdangerw@gmail.com>",
|
|
||||||
"license": "MIT",
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/malept/flatpak-bundler/issues"
|
|
||||||
},
|
|
||||||
"files": [],
|
|
||||||
"homepage": "https://github.com/malept/flatpak-bundler#readme",
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 10.0.0"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"debug": "^4.1.1",
|
|
||||||
"fs-extra": "^9.0.0",
|
|
||||||
"lodash": "^4.17.15",
|
|
||||||
"tmp-promise": "^3.0.2"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"husky": "^4.2.5",
|
|
||||||
"lint-staged": "^10.2.9",
|
|
||||||
"mocha": "^7.0.0",
|
|
||||||
"standard": "^14.0.0"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"lint": "standard",
|
|
||||||
"mocha": "mocha",
|
|
||||||
"test": "standard && mocha"
|
|
||||||
},
|
|
||||||
"husky": {
|
|
||||||
"pre-commit": "lint-staged"
|
|
||||||
},
|
|
||||||
"lint-staged": {
|
|
||||||
"*.js": "standard --fix"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-21
@@ -1,21 +0,0 @@
|
|||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2022 Paul Miller (https://paulmillr.com)
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the “Software”), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
-521
@@ -1,521 +0,0 @@
|
|||||||
# noble-hashes
|
|
||||||
|
|
||||||
Audited & minimal JS implementation of hash functions, MACs and KDFs.
|
|
||||||
|
|
||||||
- 🔒 [**Audited**](#security) by an independent security firm
|
|
||||||
- 🔻 Tree-shakeable: unused code is excluded from your builds
|
|
||||||
- 🏎 Fast: hand-optimized for caveats of JS engines
|
|
||||||
- 🔍 Reliable: chained / sliding window / DoS tests and fuzzing ensure correctness
|
|
||||||
- 🔁 No unrolled loops: makes it easier to verify and reduces source code size up to 5x
|
|
||||||
- 🦘 Includes SHA, RIPEMD, BLAKE, HMAC, HKDF, PBKDF, Scrypt, Argon2 & KangarooTwelve
|
|
||||||
- 🪶 48KB for everything, 4.8KB (2.36KB gzipped) for single-hash build
|
|
||||||
|
|
||||||
Take a glance at [GitHub Discussions](https://github.com/paulmillr/noble-hashes/discussions) for questions and support.
|
|
||||||
The library's initial development was funded by [Ethereum Foundation](https://ethereum.org/).
|
|
||||||
|
|
||||||
### This library belongs to _noble_ cryptography
|
|
||||||
|
|
||||||
> **noble cryptography** — high-security, easily auditable set of contained cryptographic libraries and tools.
|
|
||||||
|
|
||||||
- Zero or minimal dependencies
|
|
||||||
- Highly readable TypeScript / JS code
|
|
||||||
- PGP-signed releases and transparent NPM builds
|
|
||||||
- All libraries:
|
|
||||||
[ciphers](https://github.com/paulmillr/noble-ciphers),
|
|
||||||
[curves](https://github.com/paulmillr/noble-curves),
|
|
||||||
[hashes](https://github.com/paulmillr/noble-hashes),
|
|
||||||
[post-quantum](https://github.com/paulmillr/noble-post-quantum),
|
|
||||||
4kb [secp256k1](https://github.com/paulmillr/noble-secp256k1) /
|
|
||||||
[ed25519](https://github.com/paulmillr/noble-ed25519)
|
|
||||||
- [Check out homepage](https://paulmillr.com/noble/)
|
|
||||||
for reading resources, documentation and apps built with noble
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
> `npm install @noble/hashes`
|
|
||||||
|
|
||||||
> `deno add jsr:@noble/hashes`
|
|
||||||
|
|
||||||
> `deno doc jsr:@noble/hashes` # command-line documentation
|
|
||||||
|
|
||||||
We support all major platforms and runtimes.
|
|
||||||
For React Native, you may need a [polyfill for getRandomValues](https://github.com/LinusU/react-native-get-random-values).
|
|
||||||
A standalone file [noble-hashes.js](https://github.com/paulmillr/noble-hashes/releases) is also available.
|
|
||||||
|
|
||||||
```js
|
|
||||||
// import * from '@noble/hashes'; // Error: use sub-imports, to ensure small app size
|
|
||||||
import { sha256 } from '@noble/hashes/sha2.js'; // ESM & Common.js
|
|
||||||
sha256(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])); // returns Uint8Array
|
|
||||||
|
|
||||||
// Available modules
|
|
||||||
import { sha256, sha384, sha512, sha224, sha512_224, sha512_256 } from '@noble/hashes/sha2.js';
|
|
||||||
import { sha3_256, sha3_512, keccak_256, keccak_512, shake128, shake256 } from '@noble/hashes/sha3.js';
|
|
||||||
import { cshake256, turboshake256, kmac256, tuplehash256, k12, m14, keccakprg } from '@noble/hashes/sha3-addons.js';
|
|
||||||
import { blake3 } from '@noble/hashes/blake3.js';
|
|
||||||
import { blake2b, blake2s } from '@noble/hashes/blake2.js';
|
|
||||||
import { blake256, blake512 } from '@noble/hashes/blake1.js';
|
|
||||||
import { sha1, md5, ripemd160 } from '@noble/hashes/legacy.js';
|
|
||||||
import { hmac } from '@noble/hashes/hmac.js';
|
|
||||||
import { hkdf } from '@noble/hashes/hkdf.js';
|
|
||||||
import { pbkdf2, pbkdf2Async } from '@noble/hashes/pbkdf2.js';
|
|
||||||
import { scrypt, scryptAsync } from '@noble/hashes/scrypt.js';
|
|
||||||
import { argon2d, argon2i, argon2id } from '@noble/hashes/argon2.js';
|
|
||||||
import * as utils from '@noble/hashes/utils'; // bytesToHex, bytesToUtf8, concatBytes...
|
|
||||||
```
|
|
||||||
|
|
||||||
- [sha2: sha256, sha384, sha512](#sha2-sha256-sha384-sha512-and-others)
|
|
||||||
- [sha3: FIPS, SHAKE, Keccak](#sha3-fips-shake-keccak)
|
|
||||||
- [sha3-addons: cSHAKE, KMAC, K12, M14, TurboSHAKE](#sha3-addons-cshake-kmac-k12-m14-turboshake)
|
|
||||||
- [blake, blake2, blake3](#blake-blake2-blake3) | [legacy: sha1, md5, ripemd160](#legacy-sha1-md5-ripemd160)
|
|
||||||
- MACs: [hmac](#hmac) | [sha3-addons kmac](#sha3-addons-cshake-kmac-k12-m14-turboshake) | [blake3 key mode](#blake2b-blake2s-blake3)
|
|
||||||
- KDFs: [hkdf](#hkdf) | [pbkdf2](#pbkdf2) | [scrypt](#scrypt) | [argon2](#argon2)
|
|
||||||
- [utils](#utils)
|
|
||||||
- [Security](#security) | [Speed](#speed) | [Contributing & testing](#contributing--testing) | [License](#license)
|
|
||||||
|
|
||||||
### Implementations
|
|
||||||
|
|
||||||
Hash functions:
|
|
||||||
|
|
||||||
- `sha256()`: receive & return `Uint8Array`
|
|
||||||
- `sha256.create().update(a).update(b).digest()`: support partial updates
|
|
||||||
- `blake3.create({ context: 'e', dkLen: 32 })`: sometimes have options
|
|
||||||
- support little-endian architecture; also experimentally big-endian
|
|
||||||
- can hash up to 4GB per chunk, with any amount of chunks
|
|
||||||
|
|
||||||
#### sha2: sha256, sha384, sha512 and others
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { sha224, sha256, sha384, sha512, sha512_224, sha512_256 } from '@noble/hashes/sha2.js';
|
|
||||||
const res = sha256(Uint8Array.from([0xbc])); // basic
|
|
||||||
for (let hash of [sha256, sha384, sha512, sha224, sha512_224, sha512_256]) {
|
|
||||||
const arr = Uint8Array.from([0x10, 0x20, 0x30]);
|
|
||||||
const a = hash(arr);
|
|
||||||
const b = hash.create().update(arr).digest();
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
See [RFC 4634](https://datatracker.ietf.org/doc/html/rfc4634) and
|
|
||||||
[the paper on truncated SHA512/256](https://eprint.iacr.org/2010/548.pdf).
|
|
||||||
|
|
||||||
#### sha3: FIPS, SHAKE, Keccak
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import {
|
|
||||||
keccak_224, keccak_256, keccak_384, keccak_512,
|
|
||||||
sha3_224, sha3_256, sha3_384, sha3_512,
|
|
||||||
shake128, shake256,
|
|
||||||
} from '@noble/hashes/sha3.js';
|
|
||||||
for (let hash of [
|
|
||||||
sha3_224, sha3_256, sha3_384, sha3_512,
|
|
||||||
keccak_224, keccak_256, keccak_384, keccak_512,
|
|
||||||
]) {
|
|
||||||
const arr = Uint8Array.from([0x10, 0x20, 0x30]);
|
|
||||||
const a = hash(arr);
|
|
||||||
const b = hash.create().update(arr).digest();
|
|
||||||
}
|
|
||||||
const shka = shake128(Uint8Array.from([0x10]), { dkLen: 512 });
|
|
||||||
const shkb = shake256(Uint8Array.from([0x30]), { dkLen: 512 });
|
|
||||||
```
|
|
||||||
|
|
||||||
See [FIPS-202](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf),
|
|
||||||
[Website](https://keccak.team/keccak.html).
|
|
||||||
|
|
||||||
Check out [the differences between SHA-3 and Keccak](https://crypto.stackexchange.com/questions/15727/what-are-the-key-differences-between-the-draft-sha-3-standard-and-the-keccak-sub)
|
|
||||||
|
|
||||||
#### sha3-addons: cSHAKE, KMAC, K12, M14, TurboSHAKE
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import {
|
|
||||||
cshake128, cshake256,
|
|
||||||
k12,
|
|
||||||
keccakprg,
|
|
||||||
kmac128, kmac256,
|
|
||||||
m14,
|
|
||||||
parallelhash256,
|
|
||||||
tuplehash256,
|
|
||||||
turboshake128, turboshake256
|
|
||||||
} from '@noble/hashes/sha3-addons.js';
|
|
||||||
const data = Uint8Array.from([0x10, 0x20, 0x30]);
|
|
||||||
const ec1 = cshake128(data, { personalization: 'def' });
|
|
||||||
const ec2 = cshake256(data, { personalization: 'def' });
|
|
||||||
const et1 = turboshake128(data);
|
|
||||||
const et2 = turboshake256(data, { D: 0x05 });
|
|
||||||
// tuplehash(['ab', 'c']) !== tuplehash(['a', 'bc']) !== tuplehash([data])
|
|
||||||
const et3 = tuplehash256([utf8ToBytes('ab'), utf8ToBytes('c')]);
|
|
||||||
// Not parallel in JS (similar to blake3 / k12), added for compat
|
|
||||||
const ep1 = parallelhash256(data, { blockLen: 8 });
|
|
||||||
const kk = Uint8Array.from([0xca]);
|
|
||||||
const ek10 = kmac128(kk, data);
|
|
||||||
const ek11 = kmac256(kk, data);
|
|
||||||
const ek12 = k12(data);
|
|
||||||
const ek13 = m14(data);
|
|
||||||
// pseudo-random generator, first argument is capacity. XKCP recommends 254 bits capacity for 128-bit security strength.
|
|
||||||
// * with a capacity of 254 bits.
|
|
||||||
const p = keccakprg(254);
|
|
||||||
p.feed('test');
|
|
||||||
const rand1b = p.fetch(1);
|
|
||||||
```
|
|
||||||
|
|
||||||
- Full [NIST SP 800-185](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-185.pdf):
|
|
||||||
cSHAKE, KMAC, TupleHash, ParallelHash + XOF variants
|
|
||||||
- [Reduced-round Keccak](https://datatracker.ietf.org/doc/draft-irtf-cfrg-kangarootwelve/):
|
|
||||||
- 🦘 K12 aka KangarooTwelve
|
|
||||||
- M14 aka MarsupilamiFourteen
|
|
||||||
- TurboSHAKE
|
|
||||||
- [KeccakPRG](https://keccak.team/files/CSF-0.1.pdf): Pseudo-random generator based on Keccak
|
|
||||||
|
|
||||||
#### blake, blake2, blake3
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { blake224, blake256, blake384, blake512 } from '@noble/hashes/blake1.js';
|
|
||||||
import { blake2b, blake2s } from '@noble/hashes/blake2.js';
|
|
||||||
import { blake3 } from '@noble/hashes/blake3.js';
|
|
||||||
|
|
||||||
for (let hash of [
|
|
||||||
blake224, blake256, blake384, blake512,
|
|
||||||
blake2b, blake2s, blake3
|
|
||||||
]) {
|
|
||||||
const arr = Uint8Array.from([0x10, 0x20, 0x30]);
|
|
||||||
const a = hash(arr);
|
|
||||||
const b = hash.create().update(arr).digest();
|
|
||||||
}
|
|
||||||
|
|
||||||
// blake2 advanced usage
|
|
||||||
const ab = Uint8Array.from([0x01]);
|
|
||||||
blake2s(ab);
|
|
||||||
blake2s(ab, { key: new Uint8Array(32) });
|
|
||||||
blake2s(ab, { personalization: 'pers1234' });
|
|
||||||
blake2s(ab, { salt: 'salt1234' });
|
|
||||||
blake2b(ab);
|
|
||||||
blake2b(ab, { key: new Uint8Array(64) });
|
|
||||||
blake2b(ab, { personalization: 'pers1234pers1234' });
|
|
||||||
blake2b(ab, { salt: 'salt1234salt1234' });
|
|
||||||
|
|
||||||
// blake3 advanced usage
|
|
||||||
blake3(ab);
|
|
||||||
blake3(ab, { dkLen: 256 });
|
|
||||||
blake3(ab, { key: new Uint8Array(32) });
|
|
||||||
blake3(ab, { context: 'application-name' });
|
|
||||||
```
|
|
||||||
|
|
||||||
- Blake1 is legacy hash, one of SHA3 proposals. It is rarely used anywhere. See [pdf](https://www.aumasson.jp/blake/blake.pdf).
|
|
||||||
- Blake2 is popular fast hash. blake2b focuses on 64-bit platforms while blake2s is for 8-bit to 32-bit ones. See [RFC 7693](https://datatracker.ietf.org/doc/html/rfc7693), [Website](https://www.blake2.net)
|
|
||||||
- Blake3 is faster, reduced-round blake2. See [Website & specs](https://blake3.io)
|
|
||||||
|
|
||||||
#### legacy: sha1, md5, ripemd160
|
|
||||||
|
|
||||||
SHA1 (RFC 3174), MD5 (RFC 1321) and RIPEMD160 (RFC 2286) legacy, weak hash functions.
|
|
||||||
Don't use them in a new protocol. What "weak" means:
|
|
||||||
|
|
||||||
- Collisions can be made with 2^18 effort in MD5, 2^60 in SHA1, 2^80 in RIPEMD160.
|
|
||||||
- No practical pre-image attacks (only theoretical, 2^123.4)
|
|
||||||
- HMAC seems kinda ok: https://datatracker.ietf.org/doc/html/rfc6151
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { md5, ripemd160, sha1 } from '@noble/hashes/legacy.js';
|
|
||||||
for (let hash of [md5, ripemd160, sha1]) {
|
|
||||||
const arr = Uint8Array.from([0x10, 0x20, 0x30]);
|
|
||||||
const a = hash(arr);
|
|
||||||
const b = hash.create().update(arr).digest();
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
#### hmac
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { hmac } from '@noble/hashes/hmac.js';
|
|
||||||
import { sha256 } from '@noble/hashes/sha2.js';
|
|
||||||
const key = new Uint8Array(32).fill(1);
|
|
||||||
const msg = new Uint8Array(32).fill(2);
|
|
||||||
const mac1 = hmac(sha256, key, msg);
|
|
||||||
const mac2 = hmac.create(sha256, key).update(msg).digest();
|
|
||||||
```
|
|
||||||
|
|
||||||
Matches [RFC 2104](https://datatracker.ietf.org/doc/html/rfc2104).
|
|
||||||
|
|
||||||
#### hkdf
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { hkdf } from '@noble/hashes/hkdf.js';
|
|
||||||
import { randomBytes } from '@noble/hashes/utils.js';
|
|
||||||
import { sha256 } from '@noble/hashes/sha2.js';
|
|
||||||
const inputKey = randomBytes(32);
|
|
||||||
const salt = randomBytes(32);
|
|
||||||
const info = 'application-key';
|
|
||||||
const hk1 = hkdf(sha256, inputKey, salt, info, 32);
|
|
||||||
|
|
||||||
// == same as
|
|
||||||
import { extract, expand } from '@noble/hashes/hkdf.js';
|
|
||||||
import { sha256 } from '@noble/hashes/sha2.js';
|
|
||||||
const prk = extract(sha256, inputKey, salt);
|
|
||||||
const hk2 = expand(sha256, prk, info, 32);
|
|
||||||
```
|
|
||||||
|
|
||||||
Matches [RFC 5869](https://datatracker.ietf.org/doc/html/rfc5869).
|
|
||||||
|
|
||||||
#### pbkdf2
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { pbkdf2, pbkdf2Async } from '@noble/hashes/pbkdf2.js';
|
|
||||||
import { sha256 } from '@noble/hashes/sha2.js';
|
|
||||||
const pbkey1 = pbkdf2(sha256, 'password', 'salt', { c: 32, dkLen: 32 });
|
|
||||||
const pbkey2 = await pbkdf2Async(sha256, 'password', 'salt', { c: 32, dkLen: 32 });
|
|
||||||
const pbkey3 = await pbkdf2Async(sha256, Uint8Array.from([1, 2, 3]), Uint8Array.from([4, 5, 6]), {
|
|
||||||
c: 32,
|
|
||||||
dkLen: 32,
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
Matches [RFC 2898](https://datatracker.ietf.org/doc/html/rfc2898).
|
|
||||||
|
|
||||||
#### scrypt
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { scrypt, scryptAsync } from '@noble/hashes/scrypt.js';
|
|
||||||
const scr1 = scrypt('password', 'salt', { N: 2 ** 16, r: 8, p: 1, dkLen: 32 });
|
|
||||||
const scr2 = await scryptAsync('password', 'salt', { N: 2 ** 16, r: 8, p: 1, dkLen: 32 });
|
|
||||||
const scr3 = await scryptAsync(Uint8Array.from([1, 2, 3]), Uint8Array.from([4, 5, 6]), {
|
|
||||||
N: 2 ** 17,
|
|
||||||
r: 8,
|
|
||||||
p: 1,
|
|
||||||
dkLen: 32,
|
|
||||||
onProgress(percentage) {
|
|
||||||
console.log('progress', percentage);
|
|
||||||
},
|
|
||||||
maxmem: 2 ** 32 + 128 * 8 * 1, // N * r * p * 128 + (128*r*p)
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
Conforms to [RFC 7914](https://datatracker.ietf.org/doc/html/rfc7914),
|
|
||||||
[Website](https://www.tarsnap.com/scrypt.html)
|
|
||||||
|
|
||||||
- `N, r, p` are work factors. To understand them, see [the blog post](https://blog.filippo.io/the-scrypt-parameters/).
|
|
||||||
`r: 8, p: 1` are common. JS doesn't support parallelization, making increasing p meaningless.
|
|
||||||
- `dkLen` is the length of output bytes e.g. `32` or `64`
|
|
||||||
- `onProgress` can be used with async version of the function to report progress to a user.
|
|
||||||
- `maxmem` prevents DoS and is limited to `1GB + 1KB` (`2**30 + 2**10`), but can be adjusted using formula: `N * r * p * 128 + (128 * r * p)`
|
|
||||||
|
|
||||||
Time it takes to derive Scrypt key under different values of N (2\*\*N) on Apple M4 (mobile phones can be 1x-4x slower):
|
|
||||||
|
|
||||||
| N pow | Time | RAM |
|
|
||||||
| ----- | ---- | ----- |
|
|
||||||
| 16 | 0.1s | 64MB |
|
|
||||||
| 17 | 0.2s | 128MB |
|
|
||||||
| 18 | 0.4s | 256MB |
|
|
||||||
| 19 | 0.8s | 512MB |
|
|
||||||
| 20 | 1.5s | 1GB |
|
|
||||||
| 21 | 3.1s | 2GB |
|
|
||||||
| 22 | 6.2s | 4GB |
|
|
||||||
| 23 | 13s | 8GB |
|
|
||||||
| 24 | 27s | 16GB |
|
|
||||||
|
|
||||||
> [!NOTE]
|
|
||||||
> We support N larger than `2**20` where available, however,
|
|
||||||
> not all JS engines support >= 2GB ArrayBuffer-s.
|
|
||||||
> When using such N, you'll need to manually adjust `maxmem`, using formula above.
|
|
||||||
> Other JS implementations don't support large N-s.
|
|
||||||
|
|
||||||
#### argon2
|
|
||||||
|
|
||||||
```ts
|
|
||||||
import { argon2d, argon2i, argon2id } from '@noble/hashes/argon2.js';
|
|
||||||
const arg1 = argon2id('password', 'saltsalt', { t: 2, m: 65536, p: 1, maxmem: 2 ** 32 - 1 });
|
|
||||||
```
|
|
||||||
|
|
||||||
Argon2 [RFC 9106](https://datatracker.ietf.org/doc/html/rfc9106) implementation.
|
|
||||||
|
|
||||||
> [!WARNING]
|
|
||||||
> Argon2 can't be fast in JS, because there is no fast Uint64Array.
|
|
||||||
> It is suggested to use [Scrypt](#scrypt) instead.
|
|
||||||
> Being 5x slower than native code means brute-forcing attackers have bigger advantage.
|
|
||||||
|
|
||||||
#### utils
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { bytesToHex as toHex, randomBytes } from '@noble/hashes/utils';
|
|
||||||
console.log(toHex(randomBytes(32)));
|
|
||||||
```
|
|
||||||
|
|
||||||
- `bytesToHex` will convert `Uint8Array` to a hex string
|
|
||||||
- `randomBytes(bytes)` will produce cryptographically secure random `Uint8Array` of length `bytes`
|
|
||||||
|
|
||||||
## Security
|
|
||||||
|
|
||||||
The library has been independently audited:
|
|
||||||
|
|
||||||
- at version 1.0.0, in Jan 2022, by [Cure53](https://cure53.de)
|
|
||||||
- PDFs: [website](https://cure53.de/pentest-report_hashing-libs.pdf), [in-repo](./audit/2022-01-05-cure53-audit-nbl2.pdf)
|
|
||||||
- [Changes since audit](https://github.com/paulmillr/noble-hashes/compare/1.0.0..main).
|
|
||||||
- Scope: everything, besides `blake3`, `sha3-addons`, `sha1` and `argon2`, which have not been audited
|
|
||||||
- The audit has been funded by [Ethereum Foundation](https://ethereum.org/en/) with help of [Nomic Labs](https://nomiclabs.io)
|
|
||||||
|
|
||||||
It is tested against property-based, cross-library and Wycheproof vectors,
|
|
||||||
and is being fuzzed in [the separate repo](https://github.com/paulmillr/fuzzing).
|
|
||||||
|
|
||||||
If you see anything unusual: investigate and report.
|
|
||||||
|
|
||||||
### Constant-timeness
|
|
||||||
|
|
||||||
We're targetting algorithmic constant time. _JIT-compiler_ and _Garbage Collector_ make "constant time"
|
|
||||||
extremely hard to achieve [timing attack](https://en.wikipedia.org/wiki/Timing_attack) resistance
|
|
||||||
in a scripting language. Which means _any other JS library can't have
|
|
||||||
constant-timeness_. Even statically typed Rust, a language without GC,
|
|
||||||
[makes it harder to achieve constant-time](https://www.chosenplaintext.ca/open-source/rust-timing-shield/security)
|
|
||||||
for some cases. If your goal is absolute security, don't use any JS lib — including bindings to native ones.
|
|
||||||
Use low-level libraries & languages.
|
|
||||||
|
|
||||||
### Memory dumping
|
|
||||||
|
|
||||||
The library shares state buffers between hash
|
|
||||||
function calls. The buffers are zeroed-out after each call. However, if an attacker
|
|
||||||
can read application memory, you are doomed in any case:
|
|
||||||
|
|
||||||
- At some point, input will be a string and strings are immutable in JS:
|
|
||||||
there is no way to overwrite them with zeros. For example: deriving
|
|
||||||
key from `scrypt(password, salt)` where password and salt are strings
|
|
||||||
- Input from a file will stay in file buffers
|
|
||||||
- Input / output will be re-used multiple times in application which means it could stay in memory
|
|
||||||
- `await anything()` will always write all internal variables (including numbers)
|
|
||||||
to memory. With async functions / Promises there are no guarantees when the code
|
|
||||||
chunk would be executed. Which means attacker can have plenty of time to read data from memory
|
|
||||||
- There is no way to guarantee anything about zeroing sensitive data without
|
|
||||||
complex tests-suite which will dump process memory and verify that there is
|
|
||||||
no sensitive data left. For JS it means testing all browsers (incl. mobile),
|
|
||||||
which is complex. And of course it will be useless without using the same
|
|
||||||
test-suite in the actual application that consumes the library
|
|
||||||
|
|
||||||
### Supply chain security
|
|
||||||
|
|
||||||
- **Commits** are signed with PGP keys, to prevent forgery. Make sure to verify commit signatures
|
|
||||||
- **Releases** are transparent and built on GitHub CI. Make sure to verify [provenance](https://docs.npmjs.com/generating-provenance-statements) logs
|
|
||||||
- Use GitHub CLI to verify single-file builds:
|
|
||||||
`gh attestation verify --owner paulmillr noble-hashes.js`
|
|
||||||
- **Rare releasing** is followed to ensure less re-audit need for end-users
|
|
||||||
- **Dependencies** are minimized and locked-down: any dependency could get hacked and users will be downloading malware with every install.
|
|
||||||
- We make sure to use as few dependencies as possible
|
|
||||||
- Automatic dep updates are prevented by locking-down version ranges; diffs are checked with `npm-diff`
|
|
||||||
- **Dev Dependencies** are disabled for end-users; they are only used to develop / build the source code
|
|
||||||
|
|
||||||
For this package, there are 0 dependencies; and a few dev dependencies:
|
|
||||||
|
|
||||||
- micro-bmark, micro-should and jsbt are used for benchmarking / testing / build tooling and developed by the same author
|
|
||||||
- prettier, fast-check and typescript are used for code quality / test generation / ts compilation. It's hard to audit their source code thoroughly and fully because of their size
|
|
||||||
|
|
||||||
### Randomness
|
|
||||||
|
|
||||||
We're deferring to built-in
|
|
||||||
[crypto.getRandomValues](https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues)
|
|
||||||
which is considered cryptographically secure (CSPRNG).
|
|
||||||
|
|
||||||
In the past, browsers had bugs that made it weak: it may happen again.
|
|
||||||
Implementing a userspace CSPRNG to get resilient to the weakness
|
|
||||||
is even worse: there is no reliable userspace source of quality entropy.
|
|
||||||
|
|
||||||
### Quantum computers
|
|
||||||
|
|
||||||
Cryptographically relevant quantum computer, if built, will allow to
|
|
||||||
utilize Grover's algorithm to break hashes in 2^n/2 operations, instead of 2^n.
|
|
||||||
|
|
||||||
This means SHA256 should be replaced with SHA512, SHA3-256 with SHA3-512, SHAKE128 with SHAKE256 etc.
|
|
||||||
|
|
||||||
Australian ASD prohibits SHA256 and similar hashes [after 2030](https://www.cyber.gov.au/resources-business-and-government/essential-cyber-security/ism/cyber-security-guidelines/guidelines-cryptography).
|
|
||||||
|
|
||||||
## Speed
|
|
||||||
|
|
||||||
```sh
|
|
||||||
npm run bench:install && npm run bench
|
|
||||||
```
|
|
||||||
|
|
||||||
Benchmarks measured on Apple M4.
|
|
||||||
|
|
||||||
```
|
|
||||||
# 32B
|
|
||||||
sha256 x 1,968,503 ops/sec @ 508ns/op
|
|
||||||
sha512 x 740,740 ops/sec @ 1μs/op
|
|
||||||
sha3_256 x 287,686 ops/sec @ 3μs/op
|
|
||||||
sha3_512 x 288,267 ops/sec @ 3μs/op
|
|
||||||
k12 x 476,190 ops/sec @ 2μs/op
|
|
||||||
m14 x 423,190 ops/sec @ 2μs/op
|
|
||||||
blake2b x 464,252 ops/sec @ 2μs/op
|
|
||||||
blake2s x 766,871 ops/sec @ 1μs/op
|
|
||||||
blake3 x 879,507 ops/sec @ 1μs/op
|
|
||||||
|
|
||||||
# 1MB
|
|
||||||
sha256 x 331 ops/sec @ 3ms/op
|
|
||||||
sha512 x 129 ops/sec @ 7ms/op
|
|
||||||
sha3_256 x 38 ops/sec @ 25ms/op
|
|
||||||
sha3_512 x 20 ops/sec @ 47ms/op
|
|
||||||
k12 x 88 ops/sec @ 11ms/op
|
|
||||||
m14 x 62 ops/sec @ 15ms/op
|
|
||||||
blake2b x 69 ops/sec @ 14ms/op
|
|
||||||
blake2s x 57 ops/sec @ 17ms/op
|
|
||||||
blake3 x 72 ops/sec @ 13ms/op
|
|
||||||
|
|
||||||
# MAC
|
|
||||||
hmac(sha256) x 599,880 ops/sec @ 1μs/op
|
|
||||||
hmac(sha512) x 197,122 ops/sec @ 5μs/op
|
|
||||||
kmac256 x 87,981 ops/sec @ 11μs/op
|
|
||||||
blake3(key) x 796,812 ops/sec @ 1μs/op
|
|
||||||
|
|
||||||
# KDF
|
|
||||||
hkdf(sha256) x 259,942 ops/sec @ 3μs/op
|
|
||||||
blake3(context) x 424,808 ops/sec @ 2μs/op
|
|
||||||
pbkdf2(sha256, c: 2 ** 18) x 5 ops/sec @ 197ms/op
|
|
||||||
pbkdf2(sha512, c: 2 ** 18) x 1 ops/sec @ 630ms/op
|
|
||||||
scrypt(n: 2 ** 18, r: 8, p: 1) x 2 ops/sec @ 400ms/op
|
|
||||||
argon2id(t: 1, m: 256MB) 2881ms
|
|
||||||
```
|
|
||||||
|
|
||||||
Compare to native node.js implementation that uses C bindings instead of pure-js code:
|
|
||||||
|
|
||||||
```
|
|
||||||
# native (node) 32B
|
|
||||||
sha256 x 2,267,573 ops/sec
|
|
||||||
sha512 x 983,284 ops/sec
|
|
||||||
sha3_256 x 1,522,070 ops/sec
|
|
||||||
blake2b x 1,512,859 ops/sec
|
|
||||||
blake2s x 1,821,493 ops/sec
|
|
||||||
hmac(sha256) x 1,085,776 ops/sec
|
|
||||||
hkdf(sha256) x 312,109 ops/sec
|
|
||||||
# native (node) KDF
|
|
||||||
pbkdf2(sha256, c: 2 ** 18) x 5 ops/sec @ 197ms/op
|
|
||||||
pbkdf2(sha512, c: 2 ** 18) x 1 ops/sec @ 630ms/op
|
|
||||||
scrypt(n: 2 ** 18, r: 8, p: 1) x 2 ops/sec @ 378ms/op
|
|
||||||
```
|
|
||||||
|
|
||||||
It is possible to [make this library 4x+ faster](./benchmark/README.md) by
|
|
||||||
_doing code generation of full loop unrolls_. We've decided against it. Reasons:
|
|
||||||
|
|
||||||
- the library must be auditable, with minimum amount of code, and zero dependencies
|
|
||||||
- most method invocations with the lib are going to be something like hashing 32b to 64kb of data
|
|
||||||
- hashing big inputs is 10x faster with low-level languages, which means you should probably pick 'em instead
|
|
||||||
|
|
||||||
The current performance is good enough when compared to other projects; SHA256 takes only 900 nanoseconds to run.
|
|
||||||
|
|
||||||
## Contributing & testing
|
|
||||||
|
|
||||||
`test/misc` directory contains implementations of loop unrolling and md5.
|
|
||||||
|
|
||||||
- `npm install && npm run build && npm test` will build the code and run tests.
|
|
||||||
- `npm run lint` / `npm run format` will run linter / fix linter issues.
|
|
||||||
- `npm run bench` will run benchmarks, which may need their deps first (`npm run bench:install`)
|
|
||||||
- `npm run build:release` will build single file
|
|
||||||
- There is **additional** 20-min DoS test `npm run test:dos` and 2-hour "big" multicore test `npm run test:big`.
|
|
||||||
See [our approach to testing](./test/README.md)
|
|
||||||
|
|
||||||
Additional resources:
|
|
||||||
|
|
||||||
- NTT hashes are outside of scope of the library. You can view some of them in different repos:
|
|
||||||
- [Pedersen in micro-zk-proofs](https://github.com/paulmillr/micro-zk-proofs/blob/1ed5ce1253583b2e540eef7f3477fb52bf5344ff/src/pedersen.ts)
|
|
||||||
- [Poseidon in noble-curves](https://github.com/paulmillr/noble-curves/blob/3d124dd3ecec8b6634cc0b2ba1c183aded5304f9/src/abstract/poseidon.ts)
|
|
||||||
- Check out [guidelines](https://github.com/paulmillr/guidelines) for coding practices
|
|
||||||
- See [paulmillr.com/noble](https://paulmillr.com/noble/) for useful resources, articles, documentation and demos
|
|
||||||
related to the library.
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2022 Paul Miller [(https://paulmillr.com)](https://paulmillr.com)
|
|
||||||
|
|
||||||
See LICENSE file.
|
|
||||||
-17
@@ -1,17 +0,0 @@
|
|||||||
/**
|
|
||||||
* Internal assertion helpers.
|
|
||||||
* @module
|
|
||||||
* @deprecated
|
|
||||||
*/
|
|
||||||
import { abytes as ab, aexists as ae, anumber as an, aoutput as ao, type IHash as H } from './utils.ts';
|
|
||||||
/** @deprecated Use import from `noble/hashes/utils` module */
|
|
||||||
export declare const abytes: typeof ab;
|
|
||||||
/** @deprecated Use import from `noble/hashes/utils` module */
|
|
||||||
export declare const aexists: typeof ae;
|
|
||||||
/** @deprecated Use import from `noble/hashes/utils` module */
|
|
||||||
export declare const anumber: typeof an;
|
|
||||||
/** @deprecated Use import from `noble/hashes/utils` module */
|
|
||||||
export declare const aoutput: typeof ao;
|
|
||||||
/** @deprecated Use import from `noble/hashes/utils` module */
|
|
||||||
export type Hash = H;
|
|
||||||
//# sourceMappingURL=_assert.d.ts.map
|
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"_assert.d.ts","sourceRoot":"","sources":["src/_assert.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,MAAM,IAAI,EAAE,EACZ,OAAO,IAAI,EAAE,EACb,OAAO,IAAI,EAAE,EACb,OAAO,IAAI,EAAE,EACb,KAAK,KAAK,IAAI,CAAC,EAChB,MAAM,YAAY,CAAC;AACpB,8DAA8D;AAC9D,eAAO,MAAM,MAAM,EAAE,OAAO,EAAO,CAAC;AACpC,8DAA8D;AAC9D,eAAO,MAAM,OAAO,EAAE,OAAO,EAAO,CAAC;AACrC,8DAA8D;AAC9D,eAAO,MAAM,OAAO,EAAE,OAAO,EAAO,CAAC;AACrC,8DAA8D;AAC9D,eAAO,MAAM,OAAO,EAAE,OAAO,EAAO,CAAC;AACrC,8DAA8D;AAC9D,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC"}
|
|
||||||
-18
@@ -1,18 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
exports.aoutput = exports.anumber = exports.aexists = exports.abytes = void 0;
|
|
||||||
/**
|
|
||||||
* Internal assertion helpers.
|
|
||||||
* @module
|
|
||||||
* @deprecated
|
|
||||||
*/
|
|
||||||
const utils_ts_1 = require("./utils.js");
|
|
||||||
/** @deprecated Use import from `noble/hashes/utils` module */
|
|
||||||
exports.abytes = utils_ts_1.abytes;
|
|
||||||
/** @deprecated Use import from `noble/hashes/utils` module */
|
|
||||||
exports.aexists = utils_ts_1.aexists;
|
|
||||||
/** @deprecated Use import from `noble/hashes/utils` module */
|
|
||||||
exports.anumber = utils_ts_1.anumber;
|
|
||||||
/** @deprecated Use import from `noble/hashes/utils` module */
|
|
||||||
exports.aoutput = utils_ts_1.aoutput;
|
|
||||||
//# sourceMappingURL=_assert.js.map
|
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"_assert.js","sourceRoot":"","sources":["src/_assert.ts"],"names":[],"mappings":";;;AAAA;;;;GAIG;AACH,yCAMoB;AACpB,8DAA8D;AACjD,QAAA,MAAM,GAAc,iBAAE,CAAC;AACpC,8DAA8D;AACjD,QAAA,OAAO,GAAc,kBAAE,CAAC;AACrC,8DAA8D;AACjD,QAAA,OAAO,GAAc,kBAAE,CAAC;AACrC,8DAA8D;AACjD,QAAA,OAAO,GAAc,kBAAE,CAAC"}
|
|
||||||
-14
@@ -1,14 +0,0 @@
|
|||||||
/**
|
|
||||||
* Internal blake variable.
|
|
||||||
* For BLAKE2b, the two extra permutations for rounds 10 and 11 are SIGMA[10..11] = SIGMA[0..1].
|
|
||||||
*/
|
|
||||||
export declare const BSIGMA: Uint8Array;
|
|
||||||
export type Num4 = {
|
|
||||||
a: number;
|
|
||||||
b: number;
|
|
||||||
c: number;
|
|
||||||
d: number;
|
|
||||||
};
|
|
||||||
export declare function G1s(a: number, b: number, c: number, d: number, x: number): Num4;
|
|
||||||
export declare function G2s(a: number, b: number, c: number, d: number, x: number): Num4;
|
|
||||||
//# sourceMappingURL=_blake.d.ts.map
|
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"_blake.d.ts","sourceRoot":"","sources":["src/_blake.ts"],"names":[],"mappings":"AAMA;;;GAGG;AAEH,eAAO,MAAM,MAAM,EAAE,UAkBnB,CAAC;AAGH,MAAM,MAAM,IAAI,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;CAAE,CAAC;AAGnE,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAM/E;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAM/E"}
|
|
||||||
-50
@@ -1,50 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
exports.BSIGMA = void 0;
|
|
||||||
exports.G1s = G1s;
|
|
||||||
exports.G2s = G2s;
|
|
||||||
/**
|
|
||||||
* Internal helpers for blake hash.
|
|
||||||
* @module
|
|
||||||
*/
|
|
||||||
const utils_ts_1 = require("./utils.js");
|
|
||||||
/**
|
|
||||||
* Internal blake variable.
|
|
||||||
* For BLAKE2b, the two extra permutations for rounds 10 and 11 are SIGMA[10..11] = SIGMA[0..1].
|
|
||||||
*/
|
|
||||||
// prettier-ignore
|
|
||||||
exports.BSIGMA = Uint8Array.from([
|
|
||||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
|
||||||
14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3,
|
|
||||||
11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4,
|
|
||||||
7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8,
|
|
||||||
9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13,
|
|
||||||
2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9,
|
|
||||||
12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11,
|
|
||||||
13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10,
|
|
||||||
6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5,
|
|
||||||
10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0,
|
|
||||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
|
|
||||||
14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3,
|
|
||||||
// Blake1, unused in others
|
|
||||||
11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4,
|
|
||||||
7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8,
|
|
||||||
9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13,
|
|
||||||
2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9,
|
|
||||||
]);
|
|
||||||
// Mixing function G splitted in two halfs
|
|
||||||
function G1s(a, b, c, d, x) {
|
|
||||||
a = (a + b + x) | 0;
|
|
||||||
d = (0, utils_ts_1.rotr)(d ^ a, 16);
|
|
||||||
c = (c + d) | 0;
|
|
||||||
b = (0, utils_ts_1.rotr)(b ^ c, 12);
|
|
||||||
return { a, b, c, d };
|
|
||||||
}
|
|
||||||
function G2s(a, b, c, d, x) {
|
|
||||||
a = (a + b + x) | 0;
|
|
||||||
d = (0, utils_ts_1.rotr)(d ^ a, 8);
|
|
||||||
c = (c + d) | 0;
|
|
||||||
b = (0, utils_ts_1.rotr)(b ^ c, 7);
|
|
||||||
return { a, b, c, d };
|
|
||||||
}
|
|
||||||
//# sourceMappingURL=_blake.js.map
|
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"_blake.js","sourceRoot":"","sources":["src/_blake.ts"],"names":[],"mappings":";;;AAmCA,kBAMC;AAED,kBAMC;AAjDD;;;GAGG;AACH,yCAAkC;AAElC;;;GAGG;AACH,kBAAkB;AACL,QAAA,MAAM,GAA+B,UAAU,CAAC,IAAI,CAAC;IAChE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;IACpD,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACpD,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACpD,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;IACpD,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;IACpD,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;IACpD,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;IACpD,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;IACpD,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;IACpD,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IACpD,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;IACpD,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACpD,2BAA2B;IAC3B,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IACpD,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;IACpD,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;IACpD,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;CACrD,CAAC,CAAC;AAKH,0CAA0C;AAC1C,SAAgB,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS;IACvE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC,GAAG,IAAA,eAAI,EAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACpB,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC,GAAG,IAAA,eAAI,EAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACpB,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACxB,CAAC;AAED,SAAgB,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS,EAAE,CAAS;IACvE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC,GAAG,IAAA,eAAI,EAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACnB,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC,GAAG,IAAA,eAAI,EAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACnB,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACxB,CAAC"}
|
|
||||||
-51
@@ -1,51 +0,0 @@
|
|||||||
/**
|
|
||||||
* Internal Merkle-Damgard hash utils.
|
|
||||||
* @module
|
|
||||||
*/
|
|
||||||
import { type Input, Hash } from './utils.ts';
|
|
||||||
/** Polyfill for Safari 14. https://caniuse.com/mdn-javascript_builtins_dataview_setbiguint64 */
|
|
||||||
export declare function setBigUint64(view: DataView, byteOffset: number, value: bigint, isLE: boolean): void;
|
|
||||||
/** Choice: a ? b : c */
|
|
||||||
export declare function Chi(a: number, b: number, c: number): number;
|
|
||||||
/** Majority function, true if any two inputs is true. */
|
|
||||||
export declare function Maj(a: number, b: number, c: number): number;
|
|
||||||
/**
|
|
||||||
* Merkle-Damgard hash construction base class.
|
|
||||||
* Could be used to create MD5, RIPEMD, SHA1, SHA2.
|
|
||||||
*/
|
|
||||||
export declare abstract class HashMD<T extends HashMD<T>> extends Hash<T> {
|
|
||||||
protected abstract process(buf: DataView, offset: number): void;
|
|
||||||
protected abstract get(): number[];
|
|
||||||
protected abstract set(...args: number[]): void;
|
|
||||||
abstract destroy(): void;
|
|
||||||
protected abstract roundClean(): void;
|
|
||||||
readonly blockLen: number;
|
|
||||||
readonly outputLen: number;
|
|
||||||
readonly padOffset: number;
|
|
||||||
readonly isLE: boolean;
|
|
||||||
protected buffer: Uint8Array;
|
|
||||||
protected view: DataView;
|
|
||||||
protected finished: boolean;
|
|
||||||
protected length: number;
|
|
||||||
protected pos: number;
|
|
||||||
protected destroyed: boolean;
|
|
||||||
constructor(blockLen: number, outputLen: number, padOffset: number, isLE: boolean);
|
|
||||||
update(data: Input): this;
|
|
||||||
digestInto(out: Uint8Array): void;
|
|
||||||
digest(): Uint8Array;
|
|
||||||
_cloneInto(to?: T): T;
|
|
||||||
clone(): T;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Initial SHA-2 state: fractional parts of square roots of first 16 primes 2..53.
|
|
||||||
* Check out `test/misc/sha2-gen-iv.js` for recomputation guide.
|
|
||||||
*/
|
|
||||||
/** Initial SHA256 state. Bits 0..32 of frac part of sqrt of primes 2..19 */
|
|
||||||
export declare const SHA256_IV: Uint32Array;
|
|
||||||
/** Initial SHA224 state. Bits 32..64 of frac part of sqrt of primes 23..53 */
|
|
||||||
export declare const SHA224_IV: Uint32Array;
|
|
||||||
/** Initial SHA384 state. Bits 0..64 of frac part of sqrt of primes 23..53 */
|
|
||||||
export declare const SHA384_IV: Uint32Array;
|
|
||||||
/** Initial SHA512 state. Bits 0..64 of frac part of sqrt of primes 2..19 */
|
|
||||||
export declare const SHA512_IV: Uint32Array;
|
|
||||||
//# sourceMappingURL=_md.d.ts.map
|
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"_md.d.ts","sourceRoot":"","sources":["src/_md.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,KAAK,KAAK,EAAE,IAAI,EAAwD,MAAM,YAAY,CAAC;AAEpG,gGAAgG;AAChG,wBAAgB,YAAY,CAC1B,IAAI,EAAE,QAAQ,EACd,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,OAAO,GACZ,IAAI,CAUN;AAED,wBAAwB;AACxB,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,yDAAyD;AACzD,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;GAGG;AACH,8BAAsB,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,CAAC,CAAC,CAAE,SAAQ,IAAI,CAAC,CAAC,CAAC;IAC/D,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAC/D,SAAS,CAAC,QAAQ,CAAC,GAAG,IAAI,MAAM,EAAE;IAClC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;IAC/C,QAAQ,CAAC,OAAO,IAAI,IAAI;IACxB,SAAS,CAAC,QAAQ,CAAC,UAAU,IAAI,IAAI;IAErC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAGvB,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC;IAC7B,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC;IACzB,SAAS,CAAC,QAAQ,UAAS;IAC3B,SAAS,CAAC,MAAM,SAAK;IACrB,SAAS,CAAC,GAAG,SAAK;IAClB,SAAS,CAAC,SAAS,UAAS;gBAEhB,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO;IASjF,MAAM,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI;IA0BzB,UAAU,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI;IAkCjC,MAAM,IAAI,UAAU;IAOpB,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC;IAWrB,KAAK,IAAI,CAAC;CAGX;AAED;;;GAGG;AAEH,4EAA4E;AAC5E,eAAO,MAAM,SAAS,EAAE,WAEtB,CAAC;AAEH,8EAA8E;AAC9E,eAAO,MAAM,SAAS,EAAE,WAEtB,CAAC;AAEH,6EAA6E;AAC7E,eAAO,MAAM,SAAS,EAAE,WAGtB,CAAC;AAEH,4EAA4E;AAC5E,eAAO,MAAM,SAAS,EAAE,WAGtB,CAAC"}
|
|
||||||
-162
@@ -1,162 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
exports.SHA512_IV = exports.SHA384_IV = exports.SHA224_IV = exports.SHA256_IV = exports.HashMD = void 0;
|
|
||||||
exports.setBigUint64 = setBigUint64;
|
|
||||||
exports.Chi = Chi;
|
|
||||||
exports.Maj = Maj;
|
|
||||||
/**
|
|
||||||
* Internal Merkle-Damgard hash utils.
|
|
||||||
* @module
|
|
||||||
*/
|
|
||||||
const utils_ts_1 = require("./utils.js");
|
|
||||||
/** Polyfill for Safari 14. https://caniuse.com/mdn-javascript_builtins_dataview_setbiguint64 */
|
|
||||||
function setBigUint64(view, byteOffset, value, isLE) {
|
|
||||||
if (typeof view.setBigUint64 === 'function')
|
|
||||||
return view.setBigUint64(byteOffset, value, isLE);
|
|
||||||
const _32n = BigInt(32);
|
|
||||||
const _u32_max = BigInt(0xffffffff);
|
|
||||||
const wh = Number((value >> _32n) & _u32_max);
|
|
||||||
const wl = Number(value & _u32_max);
|
|
||||||
const h = isLE ? 4 : 0;
|
|
||||||
const l = isLE ? 0 : 4;
|
|
||||||
view.setUint32(byteOffset + h, wh, isLE);
|
|
||||||
view.setUint32(byteOffset + l, wl, isLE);
|
|
||||||
}
|
|
||||||
/** Choice: a ? b : c */
|
|
||||||
function Chi(a, b, c) {
|
|
||||||
return (a & b) ^ (~a & c);
|
|
||||||
}
|
|
||||||
/** Majority function, true if any two inputs is true. */
|
|
||||||
function Maj(a, b, c) {
|
|
||||||
return (a & b) ^ (a & c) ^ (b & c);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Merkle-Damgard hash construction base class.
|
|
||||||
* Could be used to create MD5, RIPEMD, SHA1, SHA2.
|
|
||||||
*/
|
|
||||||
class HashMD extends utils_ts_1.Hash {
|
|
||||||
constructor(blockLen, outputLen, padOffset, isLE) {
|
|
||||||
super();
|
|
||||||
this.finished = false;
|
|
||||||
this.length = 0;
|
|
||||||
this.pos = 0;
|
|
||||||
this.destroyed = false;
|
|
||||||
this.blockLen = blockLen;
|
|
||||||
this.outputLen = outputLen;
|
|
||||||
this.padOffset = padOffset;
|
|
||||||
this.isLE = isLE;
|
|
||||||
this.buffer = new Uint8Array(blockLen);
|
|
||||||
this.view = (0, utils_ts_1.createView)(this.buffer);
|
|
||||||
}
|
|
||||||
update(data) {
|
|
||||||
(0, utils_ts_1.aexists)(this);
|
|
||||||
data = (0, utils_ts_1.toBytes)(data);
|
|
||||||
(0, utils_ts_1.abytes)(data);
|
|
||||||
const { view, buffer, blockLen } = this;
|
|
||||||
const len = data.length;
|
|
||||||
for (let pos = 0; pos < len;) {
|
|
||||||
const take = Math.min(blockLen - this.pos, len - pos);
|
|
||||||
// Fast path: we have at least one block in input, cast it to view and process
|
|
||||||
if (take === blockLen) {
|
|
||||||
const dataView = (0, utils_ts_1.createView)(data);
|
|
||||||
for (; blockLen <= len - pos; pos += blockLen)
|
|
||||||
this.process(dataView, pos);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
buffer.set(data.subarray(pos, pos + take), this.pos);
|
|
||||||
this.pos += take;
|
|
||||||
pos += take;
|
|
||||||
if (this.pos === blockLen) {
|
|
||||||
this.process(view, 0);
|
|
||||||
this.pos = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.length += data.length;
|
|
||||||
this.roundClean();
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
digestInto(out) {
|
|
||||||
(0, utils_ts_1.aexists)(this);
|
|
||||||
(0, utils_ts_1.aoutput)(out, this);
|
|
||||||
this.finished = true;
|
|
||||||
// Padding
|
|
||||||
// We can avoid allocation of buffer for padding completely if it
|
|
||||||
// was previously not allocated here. But it won't change performance.
|
|
||||||
const { buffer, view, blockLen, isLE } = this;
|
|
||||||
let { pos } = this;
|
|
||||||
// append the bit '1' to the message
|
|
||||||
buffer[pos++] = 0b10000000;
|
|
||||||
(0, utils_ts_1.clean)(this.buffer.subarray(pos));
|
|
||||||
// we have less than padOffset left in buffer, so we cannot put length in
|
|
||||||
// current block, need process it and pad again
|
|
||||||
if (this.padOffset > blockLen - pos) {
|
|
||||||
this.process(view, 0);
|
|
||||||
pos = 0;
|
|
||||||
}
|
|
||||||
// Pad until full block byte with zeros
|
|
||||||
for (let i = pos; i < blockLen; i++)
|
|
||||||
buffer[i] = 0;
|
|
||||||
// Note: sha512 requires length to be 128bit integer, but length in JS will overflow before that
|
|
||||||
// You need to write around 2 exabytes (u64_max / 8 / (1024**6)) for this to happen.
|
|
||||||
// So we just write lowest 64 bits of that value.
|
|
||||||
setBigUint64(view, blockLen - 8, BigInt(this.length * 8), isLE);
|
|
||||||
this.process(view, 0);
|
|
||||||
const oview = (0, utils_ts_1.createView)(out);
|
|
||||||
const len = this.outputLen;
|
|
||||||
// NOTE: we do division by 4 later, which should be fused in single op with modulo by JIT
|
|
||||||
if (len % 4)
|
|
||||||
throw new Error('_sha2: outputLen should be aligned to 32bit');
|
|
||||||
const outLen = len / 4;
|
|
||||||
const state = this.get();
|
|
||||||
if (outLen > state.length)
|
|
||||||
throw new Error('_sha2: outputLen bigger than state');
|
|
||||||
for (let i = 0; i < outLen; i++)
|
|
||||||
oview.setUint32(4 * i, state[i], isLE);
|
|
||||||
}
|
|
||||||
digest() {
|
|
||||||
const { buffer, outputLen } = this;
|
|
||||||
this.digestInto(buffer);
|
|
||||||
const res = buffer.slice(0, outputLen);
|
|
||||||
this.destroy();
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
_cloneInto(to) {
|
|
||||||
to || (to = new this.constructor());
|
|
||||||
to.set(...this.get());
|
|
||||||
const { blockLen, buffer, length, finished, destroyed, pos } = this;
|
|
||||||
to.destroyed = destroyed;
|
|
||||||
to.finished = finished;
|
|
||||||
to.length = length;
|
|
||||||
to.pos = pos;
|
|
||||||
if (length % blockLen)
|
|
||||||
to.buffer.set(buffer);
|
|
||||||
return to;
|
|
||||||
}
|
|
||||||
clone() {
|
|
||||||
return this._cloneInto();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.HashMD = HashMD;
|
|
||||||
/**
|
|
||||||
* Initial SHA-2 state: fractional parts of square roots of first 16 primes 2..53.
|
|
||||||
* Check out `test/misc/sha2-gen-iv.js` for recomputation guide.
|
|
||||||
*/
|
|
||||||
/** Initial SHA256 state. Bits 0..32 of frac part of sqrt of primes 2..19 */
|
|
||||||
exports.SHA256_IV = Uint32Array.from([
|
|
||||||
0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,
|
|
||||||
]);
|
|
||||||
/** Initial SHA224 state. Bits 32..64 of frac part of sqrt of primes 23..53 */
|
|
||||||
exports.SHA224_IV = Uint32Array.from([
|
|
||||||
0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4,
|
|
||||||
]);
|
|
||||||
/** Initial SHA384 state. Bits 0..64 of frac part of sqrt of primes 23..53 */
|
|
||||||
exports.SHA384_IV = Uint32Array.from([
|
|
||||||
0xcbbb9d5d, 0xc1059ed8, 0x629a292a, 0x367cd507, 0x9159015a, 0x3070dd17, 0x152fecd8, 0xf70e5939,
|
|
||||||
0x67332667, 0xffc00b31, 0x8eb44a87, 0x68581511, 0xdb0c2e0d, 0x64f98fa7, 0x47b5481d, 0xbefa4fa4,
|
|
||||||
]);
|
|
||||||
/** Initial SHA512 state. Bits 0..64 of frac part of sqrt of primes 2..19 */
|
|
||||||
exports.SHA512_IV = Uint32Array.from([
|
|
||||||
0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1,
|
|
||||||
0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179,
|
|
||||||
]);
|
|
||||||
//# sourceMappingURL=_md.js.map
|
|
||||||
-1
File diff suppressed because one or more lines are too long
-55
@@ -1,55 +0,0 @@
|
|||||||
declare function fromBig(n: bigint, le?: boolean): {
|
|
||||||
h: number;
|
|
||||||
l: number;
|
|
||||||
};
|
|
||||||
declare function split(lst: bigint[], le?: boolean): Uint32Array[];
|
|
||||||
declare const toBig: (h: number, l: number) => bigint;
|
|
||||||
declare const shrSH: (h: number, _l: number, s: number) => number;
|
|
||||||
declare const shrSL: (h: number, l: number, s: number) => number;
|
|
||||||
declare const rotrSH: (h: number, l: number, s: number) => number;
|
|
||||||
declare const rotrSL: (h: number, l: number, s: number) => number;
|
|
||||||
declare const rotrBH: (h: number, l: number, s: number) => number;
|
|
||||||
declare const rotrBL: (h: number, l: number, s: number) => number;
|
|
||||||
declare const rotr32H: (_h: number, l: number) => number;
|
|
||||||
declare const rotr32L: (h: number, _l: number) => number;
|
|
||||||
declare const rotlSH: (h: number, l: number, s: number) => number;
|
|
||||||
declare const rotlSL: (h: number, l: number, s: number) => number;
|
|
||||||
declare const rotlBH: (h: number, l: number, s: number) => number;
|
|
||||||
declare const rotlBL: (h: number, l: number, s: number) => number;
|
|
||||||
declare function add(Ah: number, Al: number, Bh: number, Bl: number): {
|
|
||||||
h: number;
|
|
||||||
l: number;
|
|
||||||
};
|
|
||||||
declare const add3L: (Al: number, Bl: number, Cl: number) => number;
|
|
||||||
declare const add3H: (low: number, Ah: number, Bh: number, Ch: number) => number;
|
|
||||||
declare const add4L: (Al: number, Bl: number, Cl: number, Dl: number) => number;
|
|
||||||
declare const add4H: (low: number, Ah: number, Bh: number, Ch: number, Dh: number) => number;
|
|
||||||
declare const add5L: (Al: number, Bl: number, Cl: number, Dl: number, El: number) => number;
|
|
||||||
declare const add5H: (low: number, Ah: number, Bh: number, Ch: number, Dh: number, Eh: number) => number;
|
|
||||||
export { add, add3H, add3L, add4H, add4L, add5H, add5L, fromBig, rotlBH, rotlBL, rotlSH, rotlSL, rotr32H, rotr32L, rotrBH, rotrBL, rotrSH, rotrSL, shrSH, shrSL, split, toBig };
|
|
||||||
declare const u64: {
|
|
||||||
fromBig: typeof fromBig;
|
|
||||||
split: typeof split;
|
|
||||||
toBig: (h: number, l: number) => bigint;
|
|
||||||
shrSH: (h: number, _l: number, s: number) => number;
|
|
||||||
shrSL: (h: number, l: number, s: number) => number;
|
|
||||||
rotrSH: (h: number, l: number, s: number) => number;
|
|
||||||
rotrSL: (h: number, l: number, s: number) => number;
|
|
||||||
rotrBH: (h: number, l: number, s: number) => number;
|
|
||||||
rotrBL: (h: number, l: number, s: number) => number;
|
|
||||||
rotr32H: (_h: number, l: number) => number;
|
|
||||||
rotr32L: (h: number, _l: number) => number;
|
|
||||||
rotlSH: (h: number, l: number, s: number) => number;
|
|
||||||
rotlSL: (h: number, l: number, s: number) => number;
|
|
||||||
rotlBH: (h: number, l: number, s: number) => number;
|
|
||||||
rotlBL: (h: number, l: number, s: number) => number;
|
|
||||||
add: typeof add;
|
|
||||||
add3L: (Al: number, Bl: number, Cl: number) => number;
|
|
||||||
add3H: (low: number, Ah: number, Bh: number, Ch: number) => number;
|
|
||||||
add4L: (Al: number, Bl: number, Cl: number, Dl: number) => number;
|
|
||||||
add4H: (low: number, Ah: number, Bh: number, Ch: number, Dh: number) => number;
|
|
||||||
add5H: (low: number, Ah: number, Bh: number, Ch: number, Dh: number, Eh: number) => number;
|
|
||||||
add5L: (Al: number, Bl: number, Cl: number, Dl: number, El: number) => number;
|
|
||||||
};
|
|
||||||
export default u64;
|
|
||||||
//# sourceMappingURL=_u64.d.ts.map
|
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"_u64.d.ts","sourceRoot":"","sources":["src/_u64.ts"],"names":[],"mappings":"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AAK,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAAC,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAAC,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAAC,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAAC,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAAC,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAAC,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;IAAC,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAAC,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAAC,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAAC,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAAC,GAAG,EAAE,OAAO,GAAG,CAAC;IAAC,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;IAAC,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;CAOrpC,CAAC;AACF,eAAe,GAAG,CAAC"}
|
|
||||||
-90
@@ -1,90 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
exports.toBig = exports.shrSL = exports.shrSH = exports.rotrSL = exports.rotrSH = exports.rotrBL = exports.rotrBH = exports.rotr32L = exports.rotr32H = exports.rotlSL = exports.rotlSH = exports.rotlBL = exports.rotlBH = exports.add5L = exports.add5H = exports.add4L = exports.add4H = exports.add3L = exports.add3H = void 0;
|
|
||||||
exports.add = add;
|
|
||||||
exports.fromBig = fromBig;
|
|
||||||
exports.split = split;
|
|
||||||
/**
|
|
||||||
* Internal helpers for u64. BigUint64Array is too slow as per 2025, so we implement it using Uint32Array.
|
|
||||||
* @todo re-check https://issues.chromium.org/issues/42212588
|
|
||||||
* @module
|
|
||||||
*/
|
|
||||||
const U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);
|
|
||||||
const _32n = /* @__PURE__ */ BigInt(32);
|
|
||||||
function fromBig(n, le = false) {
|
|
||||||
if (le)
|
|
||||||
return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };
|
|
||||||
return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };
|
|
||||||
}
|
|
||||||
function split(lst, le = false) {
|
|
||||||
const len = lst.length;
|
|
||||||
let Ah = new Uint32Array(len);
|
|
||||||
let Al = new Uint32Array(len);
|
|
||||||
for (let i = 0; i < len; i++) {
|
|
||||||
const { h, l } = fromBig(lst[i], le);
|
|
||||||
[Ah[i], Al[i]] = [h, l];
|
|
||||||
}
|
|
||||||
return [Ah, Al];
|
|
||||||
}
|
|
||||||
const toBig = (h, l) => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);
|
|
||||||
exports.toBig = toBig;
|
|
||||||
// for Shift in [0, 32)
|
|
||||||
const shrSH = (h, _l, s) => h >>> s;
|
|
||||||
exports.shrSH = shrSH;
|
|
||||||
const shrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);
|
|
||||||
exports.shrSL = shrSL;
|
|
||||||
// Right rotate for Shift in [1, 32)
|
|
||||||
const rotrSH = (h, l, s) => (h >>> s) | (l << (32 - s));
|
|
||||||
exports.rotrSH = rotrSH;
|
|
||||||
const rotrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);
|
|
||||||
exports.rotrSL = rotrSL;
|
|
||||||
// Right rotate for Shift in (32, 64), NOTE: 32 is special case.
|
|
||||||
const rotrBH = (h, l, s) => (h << (64 - s)) | (l >>> (s - 32));
|
|
||||||
exports.rotrBH = rotrBH;
|
|
||||||
const rotrBL = (h, l, s) => (h >>> (s - 32)) | (l << (64 - s));
|
|
||||||
exports.rotrBL = rotrBL;
|
|
||||||
// Right rotate for shift===32 (just swaps l&h)
|
|
||||||
const rotr32H = (_h, l) => l;
|
|
||||||
exports.rotr32H = rotr32H;
|
|
||||||
const rotr32L = (h, _l) => h;
|
|
||||||
exports.rotr32L = rotr32L;
|
|
||||||
// Left rotate for Shift in [1, 32)
|
|
||||||
const rotlSH = (h, l, s) => (h << s) | (l >>> (32 - s));
|
|
||||||
exports.rotlSH = rotlSH;
|
|
||||||
const rotlSL = (h, l, s) => (l << s) | (h >>> (32 - s));
|
|
||||||
exports.rotlSL = rotlSL;
|
|
||||||
// Left rotate for Shift in (32, 64), NOTE: 32 is special case.
|
|
||||||
const rotlBH = (h, l, s) => (l << (s - 32)) | (h >>> (64 - s));
|
|
||||||
exports.rotlBH = rotlBH;
|
|
||||||
const rotlBL = (h, l, s) => (h << (s - 32)) | (l >>> (64 - s));
|
|
||||||
exports.rotlBL = rotlBL;
|
|
||||||
// JS uses 32-bit signed integers for bitwise operations which means we cannot
|
|
||||||
// simple take carry out of low bit sum by shift, we need to use division.
|
|
||||||
function add(Ah, Al, Bh, Bl) {
|
|
||||||
const l = (Al >>> 0) + (Bl >>> 0);
|
|
||||||
return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };
|
|
||||||
}
|
|
||||||
// Addition with more than 2 elements
|
|
||||||
const add3L = (Al, Bl, Cl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);
|
|
||||||
exports.add3L = add3L;
|
|
||||||
const add3H = (low, Ah, Bh, Ch) => (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;
|
|
||||||
exports.add3H = add3H;
|
|
||||||
const add4L = (Al, Bl, Cl, Dl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);
|
|
||||||
exports.add4L = add4L;
|
|
||||||
const add4H = (low, Ah, Bh, Ch, Dh) => (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;
|
|
||||||
exports.add4H = add4H;
|
|
||||||
const add5L = (Al, Bl, Cl, Dl, El) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);
|
|
||||||
exports.add5L = add5L;
|
|
||||||
const add5H = (low, Ah, Bh, Ch, Dh, Eh) => (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;
|
|
||||||
exports.add5H = add5H;
|
|
||||||
// prettier-ignore
|
|
||||||
const u64 = {
|
|
||||||
fromBig, split, toBig,
|
|
||||||
shrSH, shrSL,
|
|
||||||
rotrSH, rotrSL, rotrBH, rotrBL,
|
|
||||||
rotr32H, rotr32L,
|
|
||||||
rotlSH, rotlSL, rotlBH, rotlBL,
|
|
||||||
add, add3L, add3H, add4L, add4H, add5H, add5L,
|
|
||||||
};
|
|
||||||
exports.default = u64;
|
|
||||||
//# sourceMappingURL=_u64.js.map
|
|
||||||
-1
File diff suppressed because one or more lines are too long
-32
@@ -1,32 +0,0 @@
|
|||||||
import { type KDFInput } from './utils.ts';
|
|
||||||
/**
|
|
||||||
* Argon2 options.
|
|
||||||
* * t: time cost, m: mem cost in kb, p: parallelization.
|
|
||||||
* * key: optional key. personalization: arbitrary extra data.
|
|
||||||
* * dkLen: desired number of output bytes.
|
|
||||||
*/
|
|
||||||
export type ArgonOpts = {
|
|
||||||
t: number;
|
|
||||||
m: number;
|
|
||||||
p: number;
|
|
||||||
version?: number;
|
|
||||||
key?: KDFInput;
|
|
||||||
personalization?: KDFInput;
|
|
||||||
dkLen?: number;
|
|
||||||
asyncTick?: number;
|
|
||||||
maxmem?: number;
|
|
||||||
onProgress?: (progress: number) => void;
|
|
||||||
};
|
|
||||||
/** argon2d GPU-resistant version. */
|
|
||||||
export declare const argon2d: (password: KDFInput, salt: KDFInput, opts: ArgonOpts) => Uint8Array;
|
|
||||||
/** argon2i side-channel-resistant version. */
|
|
||||||
export declare const argon2i: (password: KDFInput, salt: KDFInput, opts: ArgonOpts) => Uint8Array;
|
|
||||||
/** argon2id, combining i+d, the most popular version from RFC 9106 */
|
|
||||||
export declare const argon2id: (password: KDFInput, salt: KDFInput, opts: ArgonOpts) => Uint8Array;
|
|
||||||
/** argon2d async GPU-resistant version. */
|
|
||||||
export declare const argon2dAsync: (password: KDFInput, salt: KDFInput, opts: ArgonOpts) => Promise<Uint8Array>;
|
|
||||||
/** argon2i async side-channel-resistant version. */
|
|
||||||
export declare const argon2iAsync: (password: KDFInput, salt: KDFInput, opts: ArgonOpts) => Promise<Uint8Array>;
|
|
||||||
/** argon2id async, combining i+d, the most popular version from RFC 9106 */
|
|
||||||
export declare const argon2idAsync: (password: KDFInput, salt: KDFInput, opts: ArgonOpts) => Promise<Uint8Array>;
|
|
||||||
//# sourceMappingURL=argon2.d.ts.map
|
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"argon2.d.ts","sourceRoot":"","sources":["src/argon2.ts"],"names":[],"mappings":"AAYA,OAAO,EAAqD,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAkK9F;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,QAAQ,CAAC;IACf,eAAe,CAAC,EAAE,QAAQ,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC,CAAC;AAuNF,qCAAqC;AACrC,eAAO,MAAM,OAAO,GAAI,UAAU,QAAQ,EAAE,MAAM,QAAQ,EAAE,MAAM,SAAS,KAAG,UACnC,CAAC;AAC5C,8CAA8C;AAC9C,eAAO,MAAM,OAAO,GAAI,UAAU,QAAQ,EAAE,MAAM,QAAQ,EAAE,MAAM,SAAS,KAAG,UACpC,CAAC;AAC3C,sEAAsE;AACtE,eAAO,MAAM,QAAQ,GAAI,UAAU,QAAQ,EAAE,MAAM,QAAQ,EAAE,MAAM,SAAS,KAAG,UACpC,CAAC;AAiE5C,2CAA2C;AAC3C,eAAO,MAAM,YAAY,GACvB,UAAU,QAAQ,EAClB,MAAM,QAAQ,EACd,MAAM,SAAS,KACd,OAAO,CAAC,UAAU,CAAmD,CAAC;AACzE,oDAAoD;AACpD,eAAO,MAAM,YAAY,GACvB,UAAU,QAAQ,EAClB,MAAM,QAAQ,EACd,MAAM,SAAS,KACd,OAAO,CAAC,UAAU,CAAkD,CAAC;AACxE,4EAA4E;AAC5E,eAAO,MAAM,aAAa,GACxB,UAAU,QAAQ,EAClB,MAAM,QAAQ,EACd,MAAM,SAAS,KACd,OAAO,CAAC,UAAU,CAAmD,CAAC"}
|
|
||||||
-401
@@ -1,401 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
exports.argon2idAsync = exports.argon2iAsync = exports.argon2dAsync = exports.argon2id = exports.argon2i = exports.argon2d = void 0;
|
|
||||||
/**
|
|
||||||
* Argon2 KDF from RFC 9106. Can be used to create a key from password and salt.
|
|
||||||
* We suggest to use Scrypt. JS Argon is 2-10x slower than native code because of 64-bitness:
|
|
||||||
* * argon uses uint64, but JS doesn't have fast uint64array
|
|
||||||
* * uint64 multiplication is 1/3 of time
|
|
||||||
* * `P` function would be very nice with u64, because most of value will be in registers,
|
|
||||||
* hovewer with u32 it will require 32 registers, which is too much.
|
|
||||||
* * JS arrays do slow bound checks, so reading from `A2_BUF` slows it down
|
|
||||||
* @module
|
|
||||||
*/
|
|
||||||
const _u64_ts_1 = require("./_u64.js");
|
|
||||||
const blake2_ts_1 = require("./blake2.js");
|
|
||||||
const utils_ts_1 = require("./utils.js");
|
|
||||||
const AT = { Argond2d: 0, Argon2i: 1, Argon2id: 2 };
|
|
||||||
const ARGON2_SYNC_POINTS = 4;
|
|
||||||
const abytesOrZero = (buf) => {
|
|
||||||
if (buf === undefined)
|
|
||||||
return Uint8Array.of();
|
|
||||||
return (0, utils_ts_1.kdfInputToBytes)(buf);
|
|
||||||
};
|
|
||||||
// u32 * u32 = u64
|
|
||||||
function mul(a, b) {
|
|
||||||
const aL = a & 0xffff;
|
|
||||||
const aH = a >>> 16;
|
|
||||||
const bL = b & 0xffff;
|
|
||||||
const bH = b >>> 16;
|
|
||||||
const ll = Math.imul(aL, bL);
|
|
||||||
const hl = Math.imul(aH, bL);
|
|
||||||
const lh = Math.imul(aL, bH);
|
|
||||||
const hh = Math.imul(aH, bH);
|
|
||||||
const carry = (ll >>> 16) + (hl & 0xffff) + lh;
|
|
||||||
const high = (hh + (hl >>> 16) + (carry >>> 16)) | 0;
|
|
||||||
const low = (carry << 16) | (ll & 0xffff);
|
|
||||||
return { h: high, l: low };
|
|
||||||
}
|
|
||||||
function mul2(a, b) {
|
|
||||||
// 2 * a * b (via shifts)
|
|
||||||
const { h, l } = mul(a, b);
|
|
||||||
return { h: ((h << 1) | (l >>> 31)) & 4294967295, l: (l << 1) & 4294967295 };
|
|
||||||
}
|
|
||||||
// BlaMka permutation for Argon2
|
|
||||||
// A + B + (2 * u32(A) * u32(B))
|
|
||||||
function blamka(Ah, Al, Bh, Bl) {
|
|
||||||
const { h: Ch, l: Cl } = mul2(Al, Bl);
|
|
||||||
// A + B + (2 * A * B)
|
|
||||||
const Rll = (0, _u64_ts_1.add3L)(Al, Bl, Cl);
|
|
||||||
return { h: (0, _u64_ts_1.add3H)(Rll, Ah, Bh, Ch), l: Rll | 0 };
|
|
||||||
}
|
|
||||||
// Temporary block buffer
|
|
||||||
const A2_BUF = new Uint32Array(256); // 1024 bytes (matrix 16x16)
|
|
||||||
function G(a, b, c, d) {
|
|
||||||
let Al = A2_BUF[2 * a], Ah = A2_BUF[2 * a + 1]; // prettier-ignore
|
|
||||||
let Bl = A2_BUF[2 * b], Bh = A2_BUF[2 * b + 1]; // prettier-ignore
|
|
||||||
let Cl = A2_BUF[2 * c], Ch = A2_BUF[2 * c + 1]; // prettier-ignore
|
|
||||||
let Dl = A2_BUF[2 * d], Dh = A2_BUF[2 * d + 1]; // prettier-ignore
|
|
||||||
({ h: Ah, l: Al } = blamka(Ah, Al, Bh, Bl));
|
|
||||||
({ Dh, Dl } = { Dh: Dh ^ Ah, Dl: Dl ^ Al });
|
|
||||||
({ Dh, Dl } = { Dh: (0, _u64_ts_1.rotr32H)(Dh, Dl), Dl: (0, _u64_ts_1.rotr32L)(Dh, Dl) });
|
|
||||||
({ h: Ch, l: Cl } = blamka(Ch, Cl, Dh, Dl));
|
|
||||||
({ Bh, Bl } = { Bh: Bh ^ Ch, Bl: Bl ^ Cl });
|
|
||||||
({ Bh, Bl } = { Bh: (0, _u64_ts_1.rotrSH)(Bh, Bl, 24), Bl: (0, _u64_ts_1.rotrSL)(Bh, Bl, 24) });
|
|
||||||
({ h: Ah, l: Al } = blamka(Ah, Al, Bh, Bl));
|
|
||||||
({ Dh, Dl } = { Dh: Dh ^ Ah, Dl: Dl ^ Al });
|
|
||||||
({ Dh, Dl } = { Dh: (0, _u64_ts_1.rotrSH)(Dh, Dl, 16), Dl: (0, _u64_ts_1.rotrSL)(Dh, Dl, 16) });
|
|
||||||
({ h: Ch, l: Cl } = blamka(Ch, Cl, Dh, Dl));
|
|
||||||
({ Bh, Bl } = { Bh: Bh ^ Ch, Bl: Bl ^ Cl });
|
|
||||||
({ Bh, Bl } = { Bh: (0, _u64_ts_1.rotrBH)(Bh, Bl, 63), Bl: (0, _u64_ts_1.rotrBL)(Bh, Bl, 63) });
|
|
||||||
(A2_BUF[2 * a] = Al), (A2_BUF[2 * a + 1] = Ah);
|
|
||||||
(A2_BUF[2 * b] = Bl), (A2_BUF[2 * b + 1] = Bh);
|
|
||||||
(A2_BUF[2 * c] = Cl), (A2_BUF[2 * c + 1] = Ch);
|
|
||||||
(A2_BUF[2 * d] = Dl), (A2_BUF[2 * d + 1] = Dh);
|
|
||||||
}
|
|
||||||
// prettier-ignore
|
|
||||||
function P(v00, v01, v02, v03, v04, v05, v06, v07, v08, v09, v10, v11, v12, v13, v14, v15) {
|
|
||||||
G(v00, v04, v08, v12);
|
|
||||||
G(v01, v05, v09, v13);
|
|
||||||
G(v02, v06, v10, v14);
|
|
||||||
G(v03, v07, v11, v15);
|
|
||||||
G(v00, v05, v10, v15);
|
|
||||||
G(v01, v06, v11, v12);
|
|
||||||
G(v02, v07, v08, v13);
|
|
||||||
G(v03, v04, v09, v14);
|
|
||||||
}
|
|
||||||
function block(x, xPos, yPos, outPos, needXor) {
|
|
||||||
for (let i = 0; i < 256; i++)
|
|
||||||
A2_BUF[i] = x[xPos + i] ^ x[yPos + i];
|
|
||||||
// columns (8)
|
|
||||||
for (let i = 0; i < 128; i += 16) {
|
|
||||||
// prettier-ignore
|
|
||||||
P(i, i + 1, i + 2, i + 3, i + 4, i + 5, i + 6, i + 7, i + 8, i + 9, i + 10, i + 11, i + 12, i + 13, i + 14, i + 15);
|
|
||||||
}
|
|
||||||
// rows (8)
|
|
||||||
for (let i = 0; i < 16; i += 2) {
|
|
||||||
// prettier-ignore
|
|
||||||
P(i, i + 1, i + 16, i + 17, i + 32, i + 33, i + 48, i + 49, i + 64, i + 65, i + 80, i + 81, i + 96, i + 97, i + 112, i + 113);
|
|
||||||
}
|
|
||||||
if (needXor)
|
|
||||||
for (let i = 0; i < 256; i++)
|
|
||||||
x[outPos + i] ^= A2_BUF[i] ^ x[xPos + i] ^ x[yPos + i];
|
|
||||||
else
|
|
||||||
for (let i = 0; i < 256; i++)
|
|
||||||
x[outPos + i] = A2_BUF[i] ^ x[xPos + i] ^ x[yPos + i];
|
|
||||||
(0, utils_ts_1.clean)(A2_BUF);
|
|
||||||
}
|
|
||||||
// Variable-Length Hash Function H'
|
|
||||||
function Hp(A, dkLen) {
|
|
||||||
const A8 = (0, utils_ts_1.u8)(A);
|
|
||||||
const T = new Uint32Array(1);
|
|
||||||
const T8 = (0, utils_ts_1.u8)(T);
|
|
||||||
T[0] = dkLen;
|
|
||||||
// Fast path
|
|
||||||
if (dkLen <= 64)
|
|
||||||
return blake2_ts_1.blake2b.create({ dkLen }).update(T8).update(A8).digest();
|
|
||||||
const out = new Uint8Array(dkLen);
|
|
||||||
let V = blake2_ts_1.blake2b.create({}).update(T8).update(A8).digest();
|
|
||||||
let pos = 0;
|
|
||||||
// First block
|
|
||||||
out.set(V.subarray(0, 32));
|
|
||||||
pos += 32;
|
|
||||||
// Rest blocks
|
|
||||||
for (; dkLen - pos > 64; pos += 32) {
|
|
||||||
const Vh = blake2_ts_1.blake2b.create({}).update(V);
|
|
||||||
Vh.digestInto(V);
|
|
||||||
Vh.destroy();
|
|
||||||
out.set(V.subarray(0, 32), pos);
|
|
||||||
}
|
|
||||||
// Last block
|
|
||||||
out.set((0, blake2_ts_1.blake2b)(V, { dkLen: dkLen - pos }), pos);
|
|
||||||
(0, utils_ts_1.clean)(V, T);
|
|
||||||
return (0, utils_ts_1.u32)(out);
|
|
||||||
}
|
|
||||||
// Used only inside process block!
|
|
||||||
function indexAlpha(r, s, laneLen, segmentLen, index, randL, sameLane = false) {
|
|
||||||
// This is ugly, but close enough to reference implementation.
|
|
||||||
let area;
|
|
||||||
if (r === 0) {
|
|
||||||
if (s === 0)
|
|
||||||
area = index - 1;
|
|
||||||
else if (sameLane)
|
|
||||||
area = s * segmentLen + index - 1;
|
|
||||||
else
|
|
||||||
area = s * segmentLen + (index == 0 ? -1 : 0);
|
|
||||||
}
|
|
||||||
else if (sameLane)
|
|
||||||
area = laneLen - segmentLen + index - 1;
|
|
||||||
else
|
|
||||||
area = laneLen - segmentLen + (index == 0 ? -1 : 0);
|
|
||||||
const startPos = r !== 0 && s !== ARGON2_SYNC_POINTS - 1 ? (s + 1) * segmentLen : 0;
|
|
||||||
const rel = area - 1 - mul(area, mul(randL, randL).h).h;
|
|
||||||
return (startPos + rel) % laneLen;
|
|
||||||
}
|
|
||||||
const maxUint32 = Math.pow(2, 32);
|
|
||||||
function isU32(num) {
|
|
||||||
return Number.isSafeInteger(num) && num >= 0 && num < maxUint32;
|
|
||||||
}
|
|
||||||
function argon2Opts(opts) {
|
|
||||||
const merged = {
|
|
||||||
version: 0x13,
|
|
||||||
dkLen: 32,
|
|
||||||
maxmem: maxUint32 - 1,
|
|
||||||
asyncTick: 10,
|
|
||||||
};
|
|
||||||
for (let [k, v] of Object.entries(opts))
|
|
||||||
if (v != null)
|
|
||||||
merged[k] = v;
|
|
||||||
const { dkLen, p, m, t, version, onProgress } = merged;
|
|
||||||
if (!isU32(dkLen) || dkLen < 4)
|
|
||||||
throw new Error('dkLen should be at least 4 bytes');
|
|
||||||
if (!isU32(p) || p < 1 || p >= Math.pow(2, 24))
|
|
||||||
throw new Error('p should be 1 <= p < 2^24');
|
|
||||||
if (!isU32(m))
|
|
||||||
throw new Error('m should be 0 <= m < 2^32');
|
|
||||||
if (!isU32(t) || t < 1)
|
|
||||||
throw new Error('t (iterations) should be 1 <= t < 2^32');
|
|
||||||
if (onProgress !== undefined && typeof onProgress !== 'function')
|
|
||||||
throw new Error('progressCb should be function');
|
|
||||||
/*
|
|
||||||
Memory size m MUST be an integer number of kibibytes from 8*p to 2^(32)-1. The actual number of blocks is m', which is m rounded down to the nearest multiple of 4*p.
|
|
||||||
*/
|
|
||||||
if (!isU32(m) || m < 8 * p)
|
|
||||||
throw new Error('memory should be at least 8*p bytes');
|
|
||||||
if (version !== 0x10 && version !== 0x13)
|
|
||||||
throw new Error('unknown version=' + version);
|
|
||||||
return merged;
|
|
||||||
}
|
|
||||||
function argon2Init(password, salt, type, opts) {
|
|
||||||
password = (0, utils_ts_1.kdfInputToBytes)(password);
|
|
||||||
salt = (0, utils_ts_1.kdfInputToBytes)(salt);
|
|
||||||
(0, utils_ts_1.abytes)(password);
|
|
||||||
(0, utils_ts_1.abytes)(salt);
|
|
||||||
if (!isU32(password.length))
|
|
||||||
throw new Error('password should be less than 4 GB');
|
|
||||||
if (!isU32(salt.length) || salt.length < 8)
|
|
||||||
throw new Error('salt should be at least 8 bytes and less than 4 GB');
|
|
||||||
if (!Object.values(AT).includes(type))
|
|
||||||
throw new Error('invalid type');
|
|
||||||
let { p, dkLen, m, t, version, key, personalization, maxmem, onProgress, asyncTick } = argon2Opts(opts);
|
|
||||||
// Validation
|
|
||||||
key = abytesOrZero(key);
|
|
||||||
personalization = abytesOrZero(personalization);
|
|
||||||
// H_0 = H^(64)(LE32(p) || LE32(T) || LE32(m) || LE32(t) ||
|
|
||||||
// LE32(v) || LE32(y) || LE32(length(P)) || P ||
|
|
||||||
// LE32(length(S)) || S || LE32(length(K)) || K ||
|
|
||||||
// LE32(length(X)) || X)
|
|
||||||
const h = blake2_ts_1.blake2b.create({});
|
|
||||||
const BUF = new Uint32Array(1);
|
|
||||||
const BUF8 = (0, utils_ts_1.u8)(BUF);
|
|
||||||
for (let item of [p, dkLen, m, t, version, type]) {
|
|
||||||
BUF[0] = item;
|
|
||||||
h.update(BUF8);
|
|
||||||
}
|
|
||||||
for (let i of [password, salt, key, personalization]) {
|
|
||||||
BUF[0] = i.length; // BUF is u32 array, this is valid
|
|
||||||
h.update(BUF8).update(i);
|
|
||||||
}
|
|
||||||
const H0 = new Uint32Array(18);
|
|
||||||
const H0_8 = (0, utils_ts_1.u8)(H0);
|
|
||||||
h.digestInto(H0_8);
|
|
||||||
// 256 u32 = 1024 (BLOCK_SIZE), fills A2_BUF on processing
|
|
||||||
// Params
|
|
||||||
const lanes = p;
|
|
||||||
// m' = 4 * p * floor (m / 4p)
|
|
||||||
const mP = 4 * p * Math.floor(m / (ARGON2_SYNC_POINTS * p));
|
|
||||||
//q = m' / p columns
|
|
||||||
const laneLen = Math.floor(mP / p);
|
|
||||||
const segmentLen = Math.floor(laneLen / ARGON2_SYNC_POINTS);
|
|
||||||
const memUsed = mP * 256;
|
|
||||||
if (!isU32(maxmem) || memUsed > maxmem)
|
|
||||||
throw new Error('mem should be less than 2**32, got: maxmem=' + maxmem + ', memused=' + memUsed);
|
|
||||||
const B = new Uint32Array(memUsed);
|
|
||||||
// Fill first blocks
|
|
||||||
for (let l = 0; l < p; l++) {
|
|
||||||
const i = 256 * laneLen * l;
|
|
||||||
// B[i][0] = H'^(1024)(H_0 || LE32(0) || LE32(i))
|
|
||||||
H0[17] = l;
|
|
||||||
H0[16] = 0;
|
|
||||||
B.set(Hp(H0, 1024), i);
|
|
||||||
// B[i][1] = H'^(1024)(H_0 || LE32(1) || LE32(i))
|
|
||||||
H0[16] = 1;
|
|
||||||
B.set(Hp(H0, 1024), i + 256);
|
|
||||||
}
|
|
||||||
let perBlock = () => { };
|
|
||||||
if (onProgress) {
|
|
||||||
const totalBlock = t * ARGON2_SYNC_POINTS * p * segmentLen;
|
|
||||||
// Invoke callback if progress changes from 10.01 to 10.02
|
|
||||||
// Allows to draw smooth progress bar on up to 8K screen
|
|
||||||
const callbackPer = Math.max(Math.floor(totalBlock / 10000), 1);
|
|
||||||
let blockCnt = 0;
|
|
||||||
perBlock = () => {
|
|
||||||
blockCnt++;
|
|
||||||
if (onProgress && (!(blockCnt % callbackPer) || blockCnt === totalBlock))
|
|
||||||
onProgress(blockCnt / totalBlock);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
(0, utils_ts_1.clean)(BUF, H0);
|
|
||||||
return { type, mP, p, t, version, B, laneLen, lanes, segmentLen, dkLen, perBlock, asyncTick };
|
|
||||||
}
|
|
||||||
function argon2Output(B, p, laneLen, dkLen) {
|
|
||||||
const B_final = new Uint32Array(256);
|
|
||||||
for (let l = 0; l < p; l++)
|
|
||||||
for (let j = 0; j < 256; j++)
|
|
||||||
B_final[j] ^= B[256 * (laneLen * l + laneLen - 1) + j];
|
|
||||||
const res = (0, utils_ts_1.u8)(Hp(B_final, dkLen));
|
|
||||||
(0, utils_ts_1.clean)(B_final);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
function processBlock(B, address, l, r, s, index, laneLen, segmentLen, lanes, offset, prev, dataIndependent, needXor) {
|
|
||||||
if (offset % laneLen)
|
|
||||||
prev = offset - 1;
|
|
||||||
let randL, randH;
|
|
||||||
if (dataIndependent) {
|
|
||||||
let i128 = index % 128;
|
|
||||||
if (i128 === 0) {
|
|
||||||
address[256 + 12]++;
|
|
||||||
block(address, 256, 2 * 256, 0, false);
|
|
||||||
block(address, 0, 2 * 256, 0, false);
|
|
||||||
}
|
|
||||||
randL = address[2 * i128];
|
|
||||||
randH = address[2 * i128 + 1];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
const T = 256 * prev;
|
|
||||||
randL = B[T];
|
|
||||||
randH = B[T + 1];
|
|
||||||
}
|
|
||||||
// address block
|
|
||||||
const refLane = r === 0 && s === 0 ? l : randH % lanes;
|
|
||||||
const refPos = indexAlpha(r, s, laneLen, segmentLen, index, randL, refLane == l);
|
|
||||||
const refBlock = laneLen * refLane + refPos;
|
|
||||||
// B[i][j] = G(B[i][j-1], B[l][z])
|
|
||||||
block(B, 256 * prev, 256 * refBlock, offset * 256, needXor);
|
|
||||||
}
|
|
||||||
function argon2(type, password, salt, opts) {
|
|
||||||
const { mP, p, t, version, B, laneLen, lanes, segmentLen, dkLen, perBlock } = argon2Init(password, salt, type, opts);
|
|
||||||
// Pre-loop setup
|
|
||||||
// [address, input, zero_block] format so we can pass single U32 to block function
|
|
||||||
const address = new Uint32Array(3 * 256);
|
|
||||||
address[256 + 6] = mP;
|
|
||||||
address[256 + 8] = t;
|
|
||||||
address[256 + 10] = type;
|
|
||||||
for (let r = 0; r < t; r++) {
|
|
||||||
const needXor = r !== 0 && version === 0x13;
|
|
||||||
address[256 + 0] = r;
|
|
||||||
for (let s = 0; s < ARGON2_SYNC_POINTS; s++) {
|
|
||||||
address[256 + 4] = s;
|
|
||||||
const dataIndependent = type == AT.Argon2i || (type == AT.Argon2id && r === 0 && s < 2);
|
|
||||||
for (let l = 0; l < p; l++) {
|
|
||||||
address[256 + 2] = l;
|
|
||||||
address[256 + 12] = 0;
|
|
||||||
let startPos = 0;
|
|
||||||
if (r === 0 && s === 0) {
|
|
||||||
startPos = 2;
|
|
||||||
if (dataIndependent) {
|
|
||||||
address[256 + 12]++;
|
|
||||||
block(address, 256, 2 * 256, 0, false);
|
|
||||||
block(address, 0, 2 * 256, 0, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// current block postion
|
|
||||||
let offset = l * laneLen + s * segmentLen + startPos;
|
|
||||||
// previous block position
|
|
||||||
let prev = offset % laneLen ? offset - 1 : offset + laneLen - 1;
|
|
||||||
for (let index = startPos; index < segmentLen; index++, offset++, prev++) {
|
|
||||||
perBlock();
|
|
||||||
processBlock(B, address, l, r, s, index, laneLen, segmentLen, lanes, offset, prev, dataIndependent, needXor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
(0, utils_ts_1.clean)(address);
|
|
||||||
return argon2Output(B, p, laneLen, dkLen);
|
|
||||||
}
|
|
||||||
/** argon2d GPU-resistant version. */
|
|
||||||
const argon2d = (password, salt, opts) => argon2(AT.Argond2d, password, salt, opts);
|
|
||||||
exports.argon2d = argon2d;
|
|
||||||
/** argon2i side-channel-resistant version. */
|
|
||||||
const argon2i = (password, salt, opts) => argon2(AT.Argon2i, password, salt, opts);
|
|
||||||
exports.argon2i = argon2i;
|
|
||||||
/** argon2id, combining i+d, the most popular version from RFC 9106 */
|
|
||||||
const argon2id = (password, salt, opts) => argon2(AT.Argon2id, password, salt, opts);
|
|
||||||
exports.argon2id = argon2id;
|
|
||||||
async function argon2Async(type, password, salt, opts) {
|
|
||||||
const { mP, p, t, version, B, laneLen, lanes, segmentLen, dkLen, perBlock, asyncTick } = argon2Init(password, salt, type, opts);
|
|
||||||
// Pre-loop setup
|
|
||||||
// [address, input, zero_block] format so we can pass single U32 to block function
|
|
||||||
const address = new Uint32Array(3 * 256);
|
|
||||||
address[256 + 6] = mP;
|
|
||||||
address[256 + 8] = t;
|
|
||||||
address[256 + 10] = type;
|
|
||||||
let ts = Date.now();
|
|
||||||
for (let r = 0; r < t; r++) {
|
|
||||||
const needXor = r !== 0 && version === 0x13;
|
|
||||||
address[256 + 0] = r;
|
|
||||||
for (let s = 0; s < ARGON2_SYNC_POINTS; s++) {
|
|
||||||
address[256 + 4] = s;
|
|
||||||
const dataIndependent = type == AT.Argon2i || (type == AT.Argon2id && r === 0 && s < 2);
|
|
||||||
for (let l = 0; l < p; l++) {
|
|
||||||
address[256 + 2] = l;
|
|
||||||
address[256 + 12] = 0;
|
|
||||||
let startPos = 0;
|
|
||||||
if (r === 0 && s === 0) {
|
|
||||||
startPos = 2;
|
|
||||||
if (dataIndependent) {
|
|
||||||
address[256 + 12]++;
|
|
||||||
block(address, 256, 2 * 256, 0, false);
|
|
||||||
block(address, 0, 2 * 256, 0, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// current block postion
|
|
||||||
let offset = l * laneLen + s * segmentLen + startPos;
|
|
||||||
// previous block position
|
|
||||||
let prev = offset % laneLen ? offset - 1 : offset + laneLen - 1;
|
|
||||||
for (let index = startPos; index < segmentLen; index++, offset++, prev++) {
|
|
||||||
perBlock();
|
|
||||||
processBlock(B, address, l, r, s, index, laneLen, segmentLen, lanes, offset, prev, dataIndependent, needXor);
|
|
||||||
// Date.now() is not monotonic, so in case if clock goes backwards we return return control too
|
|
||||||
const diff = Date.now() - ts;
|
|
||||||
if (!(diff >= 0 && diff < asyncTick)) {
|
|
||||||
await (0, utils_ts_1.nextTick)();
|
|
||||||
ts += diff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
(0, utils_ts_1.clean)(address);
|
|
||||||
return argon2Output(B, p, laneLen, dkLen);
|
|
||||||
}
|
|
||||||
/** argon2d async GPU-resistant version. */
|
|
||||||
const argon2dAsync = (password, salt, opts) => argon2Async(AT.Argond2d, password, salt, opts);
|
|
||||||
exports.argon2dAsync = argon2dAsync;
|
|
||||||
/** argon2i async side-channel-resistant version. */
|
|
||||||
const argon2iAsync = (password, salt, opts) => argon2Async(AT.Argon2i, password, salt, opts);
|
|
||||||
exports.argon2iAsync = argon2iAsync;
|
|
||||||
/** argon2id async, combining i+d, the most popular version from RFC 9106 */
|
|
||||||
const argon2idAsync = (password, salt, opts) => argon2Async(AT.Argon2id, password, salt, opts);
|
|
||||||
exports.argon2idAsync = argon2idAsync;
|
|
||||||
//# sourceMappingURL=argon2.js.map
|
|
||||||
-1
File diff suppressed because one or more lines are too long
-106
@@ -1,106 +0,0 @@
|
|||||||
import { Hash, type CHashO, type Input } from './utils.ts';
|
|
||||||
/** Blake1 options. Basically just "salt" */
|
|
||||||
export type BlakeOpts = {
|
|
||||||
salt?: Uint8Array;
|
|
||||||
};
|
|
||||||
declare abstract class BLAKE1<T extends BLAKE1<T>> extends Hash<T> {
|
|
||||||
protected finished: boolean;
|
|
||||||
protected length: number;
|
|
||||||
protected pos: number;
|
|
||||||
protected destroyed: boolean;
|
|
||||||
protected buffer: Uint8Array;
|
|
||||||
protected view: DataView;
|
|
||||||
protected salt: Uint32Array;
|
|
||||||
abstract compress(view: DataView, offset: number, withLength?: boolean): void;
|
|
||||||
protected abstract get(): number[];
|
|
||||||
protected abstract set(...args: number[]): void;
|
|
||||||
readonly blockLen: number;
|
|
||||||
readonly outputLen: number;
|
|
||||||
private lengthFlag;
|
|
||||||
private counterLen;
|
|
||||||
protected constants: Uint32Array;
|
|
||||||
constructor(blockLen: number, outputLen: number, lengthFlag: number, counterLen: number, saltLen: number, constants: Uint32Array, opts?: BlakeOpts);
|
|
||||||
update(data: Input): this;
|
|
||||||
destroy(): void;
|
|
||||||
_cloneInto(to?: T): T;
|
|
||||||
clone(): T;
|
|
||||||
digestInto(out: Uint8Array): void;
|
|
||||||
digest(): Uint8Array;
|
|
||||||
}
|
|
||||||
declare class Blake1_32 extends BLAKE1<Blake1_32> {
|
|
||||||
private v0;
|
|
||||||
private v1;
|
|
||||||
private v2;
|
|
||||||
private v3;
|
|
||||||
private v4;
|
|
||||||
private v5;
|
|
||||||
private v6;
|
|
||||||
private v7;
|
|
||||||
constructor(outputLen: number, IV: Uint32Array, lengthFlag: number, opts?: BlakeOpts);
|
|
||||||
protected get(): [number, number, number, number, number, number, number, number];
|
|
||||||
protected set(v0: number, v1: number, v2: number, v3: number, v4: number, v5: number, v6: number, v7: number): void;
|
|
||||||
destroy(): void;
|
|
||||||
compress(view: DataView, offset: number, withLength?: boolean): void;
|
|
||||||
}
|
|
||||||
declare class Blake1_64 extends BLAKE1<Blake1_64> {
|
|
||||||
private v0l;
|
|
||||||
private v0h;
|
|
||||||
private v1l;
|
|
||||||
private v1h;
|
|
||||||
private v2l;
|
|
||||||
private v2h;
|
|
||||||
private v3l;
|
|
||||||
private v3h;
|
|
||||||
private v4l;
|
|
||||||
private v4h;
|
|
||||||
private v5l;
|
|
||||||
private v5h;
|
|
||||||
private v6l;
|
|
||||||
private v6h;
|
|
||||||
private v7l;
|
|
||||||
private v7h;
|
|
||||||
constructor(outputLen: number, IV: Uint32Array, lengthFlag: number, opts?: BlakeOpts);
|
|
||||||
protected get(): [
|
|
||||||
number,
|
|
||||||
number,
|
|
||||||
number,
|
|
||||||
number,
|
|
||||||
number,
|
|
||||||
number,
|
|
||||||
number,
|
|
||||||
number,
|
|
||||||
number,
|
|
||||||
number,
|
|
||||||
number,
|
|
||||||
number,
|
|
||||||
number,
|
|
||||||
number,
|
|
||||||
number,
|
|
||||||
number
|
|
||||||
];
|
|
||||||
protected set(v0l: number, v0h: number, v1l: number, v1h: number, v2l: number, v2h: number, v3l: number, v3h: number, v4l: number, v4h: number, v5l: number, v5h: number, v6l: number, v6h: number, v7l: number, v7h: number): void;
|
|
||||||
destroy(): void;
|
|
||||||
compress(view: DataView, offset: number, withLength?: boolean): void;
|
|
||||||
}
|
|
||||||
export declare class BLAKE224 extends Blake1_32 {
|
|
||||||
constructor(opts?: BlakeOpts);
|
|
||||||
}
|
|
||||||
export declare class BLAKE256 extends Blake1_32 {
|
|
||||||
constructor(opts?: BlakeOpts);
|
|
||||||
}
|
|
||||||
export declare class BLAKE384 extends Blake1_64 {
|
|
||||||
constructor(opts?: BlakeOpts);
|
|
||||||
}
|
|
||||||
export declare class BLAKE512 extends Blake1_64 {
|
|
||||||
constructor(opts?: BlakeOpts);
|
|
||||||
}
|
|
||||||
/** blake1-224 hash function */
|
|
||||||
export declare const blake224: CHashO;
|
|
||||||
/** blake1-256 hash function */
|
|
||||||
export declare const blake256: CHashO;
|
|
||||||
/** blake1-384 hash function */
|
|
||||||
export declare const blake384: CHashO;
|
|
||||||
/** blake1-512 hash function */
|
|
||||||
export declare const blake512: CHashO;
|
|
||||||
export {};
|
|
||||||
//# sourceMappingURL=blake1.d.ts.map
|
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"blake1.d.ts","sourceRoot":"","sources":["src/blake1.ts"],"names":[],"mappings":"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"}
|
|
||||||
-459
@@ -1,459 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
exports.blake512 = exports.blake384 = exports.blake256 = exports.blake224 = exports.BLAKE512 = exports.BLAKE384 = exports.BLAKE256 = exports.BLAKE224 = void 0;
|
|
||||||
/**
|
|
||||||
* Blake1 legacy hash function, one of SHA3 proposals.
|
|
||||||
* Rarely used. Check out blake2 or blake3 instead.
|
|
||||||
* https://www.aumasson.jp/blake/blake.pdf
|
|
||||||
*
|
|
||||||
* In the best case, there are 0 allocations.
|
|
||||||
*
|
|
||||||
* Differences from blake2:
|
|
||||||
*
|
|
||||||
* - BE instead of LE
|
|
||||||
* - Paddings, similar to MD5, RIPEMD, SHA1, SHA2, but:
|
|
||||||
* - length flag is located before actual length
|
|
||||||
* - padding block is compressed differently (no lengths)
|
|
||||||
* Instead of msg[sigma[k]], we have `msg[sigma[k]] ^ constants[sigma[k-1]]`
|
|
||||||
* (-1 for g1, g2 without -1)
|
|
||||||
* - Salt is XOR-ed into constants instead of state
|
|
||||||
* - Salt is XOR-ed with output in `compress`
|
|
||||||
* - Additional rows (+64 bytes) in SIGMA for new rounds
|
|
||||||
* - Different round count:
|
|
||||||
* - 14 / 10 rounds in blake256 / blake2s
|
|
||||||
* - 16 / 12 rounds in blake512 / blake2b
|
|
||||||
* - blake512: G1b: rotr 24 -> 25, G2b: rotr 63 -> 11
|
|
||||||
* @module
|
|
||||||
*/
|
|
||||||
const _blake_ts_1 = require("./_blake.js");
|
|
||||||
const _md_ts_1 = require("./_md.js");
|
|
||||||
const u64 = require("./_u64.js");
|
|
||||||
// prettier-ignore
|
|
||||||
const utils_ts_1 = require("./utils.js");
|
|
||||||
// Empty zero-filled salt
|
|
||||||
const EMPTY_SALT = /* @__PURE__ */ new Uint32Array(8);
|
|
||||||
class BLAKE1 extends utils_ts_1.Hash {
|
|
||||||
constructor(blockLen, outputLen, lengthFlag, counterLen, saltLen, constants, opts = {}) {
|
|
||||||
super();
|
|
||||||
this.finished = false;
|
|
||||||
this.length = 0;
|
|
||||||
this.pos = 0;
|
|
||||||
this.destroyed = false;
|
|
||||||
const { salt } = opts;
|
|
||||||
this.blockLen = blockLen;
|
|
||||||
this.outputLen = outputLen;
|
|
||||||
this.lengthFlag = lengthFlag;
|
|
||||||
this.counterLen = counterLen;
|
|
||||||
this.buffer = new Uint8Array(blockLen);
|
|
||||||
this.view = (0, utils_ts_1.createView)(this.buffer);
|
|
||||||
if (salt) {
|
|
||||||
let slt = salt;
|
|
||||||
slt = (0, utils_ts_1.toBytes)(slt);
|
|
||||||
(0, utils_ts_1.abytes)(slt);
|
|
||||||
if (slt.length !== 4 * saltLen)
|
|
||||||
throw new Error('wrong salt length');
|
|
||||||
const salt32 = (this.salt = new Uint32Array(saltLen));
|
|
||||||
const sv = (0, utils_ts_1.createView)(slt);
|
|
||||||
this.constants = constants.slice();
|
|
||||||
for (let i = 0, offset = 0; i < salt32.length; i++, offset += 4) {
|
|
||||||
salt32[i] = sv.getUint32(offset, false);
|
|
||||||
this.constants[i] ^= salt32[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
this.salt = EMPTY_SALT;
|
|
||||||
this.constants = constants;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
update(data) {
|
|
||||||
(0, utils_ts_1.aexists)(this);
|
|
||||||
data = (0, utils_ts_1.toBytes)(data);
|
|
||||||
(0, utils_ts_1.abytes)(data);
|
|
||||||
// From _md, but update length before each compress
|
|
||||||
const { view, buffer, blockLen } = this;
|
|
||||||
const len = data.length;
|
|
||||||
let dataView;
|
|
||||||
for (let pos = 0; pos < len;) {
|
|
||||||
const take = Math.min(blockLen - this.pos, len - pos);
|
|
||||||
// Fast path: we have at least one block in input, cast it to view and process
|
|
||||||
if (take === blockLen) {
|
|
||||||
if (!dataView)
|
|
||||||
dataView = (0, utils_ts_1.createView)(data);
|
|
||||||
for (; blockLen <= len - pos; pos += blockLen) {
|
|
||||||
this.length += blockLen;
|
|
||||||
this.compress(dataView, pos);
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
buffer.set(data.subarray(pos, pos + take), this.pos);
|
|
||||||
this.pos += take;
|
|
||||||
pos += take;
|
|
||||||
if (this.pos === blockLen) {
|
|
||||||
this.length += blockLen;
|
|
||||||
this.compress(view, 0, true);
|
|
||||||
this.pos = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
destroy() {
|
|
||||||
this.destroyed = true;
|
|
||||||
if (this.salt !== EMPTY_SALT) {
|
|
||||||
(0, utils_ts_1.clean)(this.salt, this.constants);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_cloneInto(to) {
|
|
||||||
to || (to = new this.constructor());
|
|
||||||
to.set(...this.get());
|
|
||||||
const { buffer, length, finished, destroyed, constants, salt, pos } = this;
|
|
||||||
to.buffer.set(buffer);
|
|
||||||
to.constants = constants.slice();
|
|
||||||
to.destroyed = destroyed;
|
|
||||||
to.finished = finished;
|
|
||||||
to.length = length;
|
|
||||||
to.pos = pos;
|
|
||||||
to.salt = salt.slice();
|
|
||||||
return to;
|
|
||||||
}
|
|
||||||
clone() {
|
|
||||||
return this._cloneInto();
|
|
||||||
}
|
|
||||||
digestInto(out) {
|
|
||||||
(0, utils_ts_1.aexists)(this);
|
|
||||||
(0, utils_ts_1.aoutput)(out, this);
|
|
||||||
this.finished = true;
|
|
||||||
// Padding
|
|
||||||
const { buffer, blockLen, counterLen, lengthFlag, view } = this;
|
|
||||||
(0, utils_ts_1.clean)(buffer.subarray(this.pos)); // clean buf
|
|
||||||
const counter = BigInt((this.length + this.pos) * 8);
|
|
||||||
const counterPos = blockLen - counterLen - 1;
|
|
||||||
buffer[this.pos] |= 128; // End block flag
|
|
||||||
this.length += this.pos; // add unwritten length
|
|
||||||
// Not enough in buffer for length: write what we have.
|
|
||||||
if (this.pos > counterPos) {
|
|
||||||
this.compress(view, 0);
|
|
||||||
(0, utils_ts_1.clean)(buffer);
|
|
||||||
this.pos = 0;
|
|
||||||
}
|
|
||||||
// Difference with md: here we have lengthFlag!
|
|
||||||
buffer[counterPos] |= lengthFlag; // Length flag
|
|
||||||
// We always set 8 byte length flag. Because length will overflow significantly sooner.
|
|
||||||
(0, _md_ts_1.setBigUint64)(view, blockLen - 8, counter, false);
|
|
||||||
this.compress(view, 0, this.pos !== 0); // don't add length if length is not empty block?
|
|
||||||
// Write output
|
|
||||||
(0, utils_ts_1.clean)(buffer);
|
|
||||||
const v = (0, utils_ts_1.createView)(out);
|
|
||||||
const state = this.get();
|
|
||||||
for (let i = 0; i < this.outputLen / 4; ++i)
|
|
||||||
v.setUint32(i * 4, state[i]);
|
|
||||||
}
|
|
||||||
digest() {
|
|
||||||
const { buffer, outputLen } = this;
|
|
||||||
this.digestInto(buffer);
|
|
||||||
const res = buffer.slice(0, outputLen);
|
|
||||||
this.destroy();
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Constants
|
|
||||||
const B64C = /* @__PURE__ */ Uint32Array.from([
|
|
||||||
0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
|
|
||||||
0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
|
|
||||||
0x9216d5d9, 0x8979fb1b, 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96,
|
|
||||||
0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69,
|
|
||||||
]);
|
|
||||||
// first half of C512
|
|
||||||
const B32C = B64C.slice(0, 16);
|
|
||||||
const B256_IV = _md_ts_1.SHA256_IV.slice();
|
|
||||||
const B224_IV = _md_ts_1.SHA224_IV.slice();
|
|
||||||
const B384_IV = _md_ts_1.SHA384_IV.slice();
|
|
||||||
const B512_IV = _md_ts_1.SHA512_IV.slice();
|
|
||||||
function generateTBL256() {
|
|
||||||
const TBL = [];
|
|
||||||
for (let i = 0, j = 0; i < 14; i++, j += 16) {
|
|
||||||
for (let offset = 1; offset < 16; offset += 2) {
|
|
||||||
TBL.push(B32C[_blake_ts_1.BSIGMA[j + offset]]);
|
|
||||||
TBL.push(B32C[_blake_ts_1.BSIGMA[j + offset - 1]]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return new Uint32Array(TBL);
|
|
||||||
}
|
|
||||||
const TBL256 = /* @__PURE__ */ generateTBL256(); // C256[SIGMA[X]] precompute
|
|
||||||
// Reusable temporary buffer
|
|
||||||
const BLAKE256_W = /* @__PURE__ */ new Uint32Array(16);
|
|
||||||
class Blake1_32 extends BLAKE1 {
|
|
||||||
constructor(outputLen, IV, lengthFlag, opts = {}) {
|
|
||||||
super(64, outputLen, lengthFlag, 8, 4, B32C, opts);
|
|
||||||
this.v0 = IV[0] | 0;
|
|
||||||
this.v1 = IV[1] | 0;
|
|
||||||
this.v2 = IV[2] | 0;
|
|
||||||
this.v3 = IV[3] | 0;
|
|
||||||
this.v4 = IV[4] | 0;
|
|
||||||
this.v5 = IV[5] | 0;
|
|
||||||
this.v6 = IV[6] | 0;
|
|
||||||
this.v7 = IV[7] | 0;
|
|
||||||
}
|
|
||||||
get() {
|
|
||||||
const { v0, v1, v2, v3, v4, v5, v6, v7 } = this;
|
|
||||||
return [v0, v1, v2, v3, v4, v5, v6, v7];
|
|
||||||
}
|
|
||||||
// prettier-ignore
|
|
||||||
set(v0, v1, v2, v3, v4, v5, v6, v7) {
|
|
||||||
this.v0 = v0 | 0;
|
|
||||||
this.v1 = v1 | 0;
|
|
||||||
this.v2 = v2 | 0;
|
|
||||||
this.v3 = v3 | 0;
|
|
||||||
this.v4 = v4 | 0;
|
|
||||||
this.v5 = v5 | 0;
|
|
||||||
this.v6 = v6 | 0;
|
|
||||||
this.v7 = v7 | 0;
|
|
||||||
}
|
|
||||||
destroy() {
|
|
||||||
super.destroy();
|
|
||||||
this.set(0, 0, 0, 0, 0, 0, 0, 0);
|
|
||||||
}
|
|
||||||
compress(view, offset, withLength = true) {
|
|
||||||
for (let i = 0; i < 16; i++, offset += 4)
|
|
||||||
BLAKE256_W[i] = view.getUint32(offset, false);
|
|
||||||
// NOTE: we cannot re-use compress from blake2s, since there is additional xor over u256[SIGMA[e]]
|
|
||||||
let v00 = this.v0 | 0;
|
|
||||||
let v01 = this.v1 | 0;
|
|
||||||
let v02 = this.v2 | 0;
|
|
||||||
let v03 = this.v3 | 0;
|
|
||||||
let v04 = this.v4 | 0;
|
|
||||||
let v05 = this.v5 | 0;
|
|
||||||
let v06 = this.v6 | 0;
|
|
||||||
let v07 = this.v7 | 0;
|
|
||||||
let v08 = this.constants[0] | 0;
|
|
||||||
let v09 = this.constants[1] | 0;
|
|
||||||
let v10 = this.constants[2] | 0;
|
|
||||||
let v11 = this.constants[3] | 0;
|
|
||||||
const { h, l } = u64.fromBig(BigInt(withLength ? this.length * 8 : 0));
|
|
||||||
let v12 = (this.constants[4] ^ l) >>> 0;
|
|
||||||
let v13 = (this.constants[5] ^ l) >>> 0;
|
|
||||||
let v14 = (this.constants[6] ^ h) >>> 0;
|
|
||||||
let v15 = (this.constants[7] ^ h) >>> 0;
|
|
||||||
// prettier-ignore
|
|
||||||
for (let i = 0, k = 0, j = 0; i < 14; i++) {
|
|
||||||
({ a: v00, b: v04, c: v08, d: v12 } = (0, _blake_ts_1.G1s)(v00, v04, v08, v12, BLAKE256_W[_blake_ts_1.BSIGMA[k++]] ^ TBL256[j++]));
|
|
||||||
({ a: v00, b: v04, c: v08, d: v12 } = (0, _blake_ts_1.G2s)(v00, v04, v08, v12, BLAKE256_W[_blake_ts_1.BSIGMA[k++]] ^ TBL256[j++]));
|
|
||||||
({ a: v01, b: v05, c: v09, d: v13 } = (0, _blake_ts_1.G1s)(v01, v05, v09, v13, BLAKE256_W[_blake_ts_1.BSIGMA[k++]] ^ TBL256[j++]));
|
|
||||||
({ a: v01, b: v05, c: v09, d: v13 } = (0, _blake_ts_1.G2s)(v01, v05, v09, v13, BLAKE256_W[_blake_ts_1.BSIGMA[k++]] ^ TBL256[j++]));
|
|
||||||
({ a: v02, b: v06, c: v10, d: v14 } = (0, _blake_ts_1.G1s)(v02, v06, v10, v14, BLAKE256_W[_blake_ts_1.BSIGMA[k++]] ^ TBL256[j++]));
|
|
||||||
({ a: v02, b: v06, c: v10, d: v14 } = (0, _blake_ts_1.G2s)(v02, v06, v10, v14, BLAKE256_W[_blake_ts_1.BSIGMA[k++]] ^ TBL256[j++]));
|
|
||||||
({ a: v03, b: v07, c: v11, d: v15 } = (0, _blake_ts_1.G1s)(v03, v07, v11, v15, BLAKE256_W[_blake_ts_1.BSIGMA[k++]] ^ TBL256[j++]));
|
|
||||||
({ a: v03, b: v07, c: v11, d: v15 } = (0, _blake_ts_1.G2s)(v03, v07, v11, v15, BLAKE256_W[_blake_ts_1.BSIGMA[k++]] ^ TBL256[j++]));
|
|
||||||
({ a: v00, b: v05, c: v10, d: v15 } = (0, _blake_ts_1.G1s)(v00, v05, v10, v15, BLAKE256_W[_blake_ts_1.BSIGMA[k++]] ^ TBL256[j++]));
|
|
||||||
({ a: v00, b: v05, c: v10, d: v15 } = (0, _blake_ts_1.G2s)(v00, v05, v10, v15, BLAKE256_W[_blake_ts_1.BSIGMA[k++]] ^ TBL256[j++]));
|
|
||||||
({ a: v01, b: v06, c: v11, d: v12 } = (0, _blake_ts_1.G1s)(v01, v06, v11, v12, BLAKE256_W[_blake_ts_1.BSIGMA[k++]] ^ TBL256[j++]));
|
|
||||||
({ a: v01, b: v06, c: v11, d: v12 } = (0, _blake_ts_1.G2s)(v01, v06, v11, v12, BLAKE256_W[_blake_ts_1.BSIGMA[k++]] ^ TBL256[j++]));
|
|
||||||
({ a: v02, b: v07, c: v08, d: v13 } = (0, _blake_ts_1.G1s)(v02, v07, v08, v13, BLAKE256_W[_blake_ts_1.BSIGMA[k++]] ^ TBL256[j++]));
|
|
||||||
({ a: v02, b: v07, c: v08, d: v13 } = (0, _blake_ts_1.G2s)(v02, v07, v08, v13, BLAKE256_W[_blake_ts_1.BSIGMA[k++]] ^ TBL256[j++]));
|
|
||||||
({ a: v03, b: v04, c: v09, d: v14 } = (0, _blake_ts_1.G1s)(v03, v04, v09, v14, BLAKE256_W[_blake_ts_1.BSIGMA[k++]] ^ TBL256[j++]));
|
|
||||||
({ a: v03, b: v04, c: v09, d: v14 } = (0, _blake_ts_1.G2s)(v03, v04, v09, v14, BLAKE256_W[_blake_ts_1.BSIGMA[k++]] ^ TBL256[j++]));
|
|
||||||
}
|
|
||||||
this.v0 = (this.v0 ^ v00 ^ v08 ^ this.salt[0]) >>> 0;
|
|
||||||
this.v1 = (this.v1 ^ v01 ^ v09 ^ this.salt[1]) >>> 0;
|
|
||||||
this.v2 = (this.v2 ^ v02 ^ v10 ^ this.salt[2]) >>> 0;
|
|
||||||
this.v3 = (this.v3 ^ v03 ^ v11 ^ this.salt[3]) >>> 0;
|
|
||||||
this.v4 = (this.v4 ^ v04 ^ v12 ^ this.salt[0]) >>> 0;
|
|
||||||
this.v5 = (this.v5 ^ v05 ^ v13 ^ this.salt[1]) >>> 0;
|
|
||||||
this.v6 = (this.v6 ^ v06 ^ v14 ^ this.salt[2]) >>> 0;
|
|
||||||
this.v7 = (this.v7 ^ v07 ^ v15 ^ this.salt[3]) >>> 0;
|
|
||||||
(0, utils_ts_1.clean)(BLAKE256_W);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const BBUF = /* @__PURE__ */ new Uint32Array(32);
|
|
||||||
const BLAKE512_W = /* @__PURE__ */ new Uint32Array(32);
|
|
||||||
function generateTBL512() {
|
|
||||||
const TBL = [];
|
|
||||||
for (let r = 0, k = 0; r < 16; r++, k += 16) {
|
|
||||||
for (let offset = 1; offset < 16; offset += 2) {
|
|
||||||
TBL.push(B64C[_blake_ts_1.BSIGMA[k + offset] * 2 + 0]);
|
|
||||||
TBL.push(B64C[_blake_ts_1.BSIGMA[k + offset] * 2 + 1]);
|
|
||||||
TBL.push(B64C[_blake_ts_1.BSIGMA[k + offset - 1] * 2 + 0]);
|
|
||||||
TBL.push(B64C[_blake_ts_1.BSIGMA[k + offset - 1] * 2 + 1]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return new Uint32Array(TBL);
|
|
||||||
}
|
|
||||||
const TBL512 = /* @__PURE__ */ generateTBL512(); // C512[SIGMA[X]] precompute
|
|
||||||
// Mixing function G splitted in two halfs
|
|
||||||
function G1b(a, b, c, d, msg, k) {
|
|
||||||
const Xpos = 2 * _blake_ts_1.BSIGMA[k];
|
|
||||||
const Xl = msg[Xpos + 1] ^ TBL512[k * 2 + 1], Xh = msg[Xpos] ^ TBL512[k * 2]; // prettier-ignore
|
|
||||||
let Al = BBUF[2 * a + 1], Ah = BBUF[2 * a]; // prettier-ignore
|
|
||||||
let Bl = BBUF[2 * b + 1], Bh = BBUF[2 * b]; // prettier-ignore
|
|
||||||
let Cl = BBUF[2 * c + 1], Ch = BBUF[2 * c]; // prettier-ignore
|
|
||||||
let Dl = BBUF[2 * d + 1], Dh = BBUF[2 * d]; // prettier-ignore
|
|
||||||
// v[a] = (v[a] + v[b] + x) | 0;
|
|
||||||
let ll = u64.add3L(Al, Bl, Xl);
|
|
||||||
Ah = u64.add3H(ll, Ah, Bh, Xh) >>> 0;
|
|
||||||
Al = (ll | 0) >>> 0;
|
|
||||||
// v[d] = rotr(v[d] ^ v[a], 32)
|
|
||||||
({ Dh, Dl } = { Dh: Dh ^ Ah, Dl: Dl ^ Al });
|
|
||||||
({ Dh, Dl } = { Dh: u64.rotr32H(Dh, Dl), Dl: u64.rotr32L(Dh, Dl) });
|
|
||||||
// v[c] = (v[c] + v[d]) | 0;
|
|
||||||
({ h: Ch, l: Cl } = u64.add(Ch, Cl, Dh, Dl));
|
|
||||||
// v[b] = rotr(v[b] ^ v[c], 25)
|
|
||||||
({ Bh, Bl } = { Bh: Bh ^ Ch, Bl: Bl ^ Cl });
|
|
||||||
({ Bh, Bl } = { Bh: u64.rotrSH(Bh, Bl, 25), Bl: u64.rotrSL(Bh, Bl, 25) });
|
|
||||||
(BBUF[2 * a + 1] = Al), (BBUF[2 * a] = Ah);
|
|
||||||
(BBUF[2 * b + 1] = Bl), (BBUF[2 * b] = Bh);
|
|
||||||
(BBUF[2 * c + 1] = Cl), (BBUF[2 * c] = Ch);
|
|
||||||
(BBUF[2 * d + 1] = Dl), (BBUF[2 * d] = Dh);
|
|
||||||
}
|
|
||||||
function G2b(a, b, c, d, msg, k) {
|
|
||||||
const Xpos = 2 * _blake_ts_1.BSIGMA[k];
|
|
||||||
const Xl = msg[Xpos + 1] ^ TBL512[k * 2 + 1], Xh = msg[Xpos] ^ TBL512[k * 2]; // prettier-ignore
|
|
||||||
let Al = BBUF[2 * a + 1], Ah = BBUF[2 * a]; // prettier-ignore
|
|
||||||
let Bl = BBUF[2 * b + 1], Bh = BBUF[2 * b]; // prettier-ignore
|
|
||||||
let Cl = BBUF[2 * c + 1], Ch = BBUF[2 * c]; // prettier-ignore
|
|
||||||
let Dl = BBUF[2 * d + 1], Dh = BBUF[2 * d]; // prettier-ignore
|
|
||||||
// v[a] = (v[a] + v[b] + x) | 0;
|
|
||||||
let ll = u64.add3L(Al, Bl, Xl);
|
|
||||||
Ah = u64.add3H(ll, Ah, Bh, Xh);
|
|
||||||
Al = ll | 0;
|
|
||||||
// v[d] = rotr(v[d] ^ v[a], 16)
|
|
||||||
({ Dh, Dl } = { Dh: Dh ^ Ah, Dl: Dl ^ Al });
|
|
||||||
({ Dh, Dl } = { Dh: u64.rotrSH(Dh, Dl, 16), Dl: u64.rotrSL(Dh, Dl, 16) });
|
|
||||||
// v[c] = (v[c] + v[d]) | 0;
|
|
||||||
({ h: Ch, l: Cl } = u64.add(Ch, Cl, Dh, Dl));
|
|
||||||
// v[b] = rotr(v[b] ^ v[c], 11)
|
|
||||||
({ Bh, Bl } = { Bh: Bh ^ Ch, Bl: Bl ^ Cl });
|
|
||||||
({ Bh, Bl } = { Bh: u64.rotrSH(Bh, Bl, 11), Bl: u64.rotrSL(Bh, Bl, 11) });
|
|
||||||
(BBUF[2 * a + 1] = Al), (BBUF[2 * a] = Ah);
|
|
||||||
(BBUF[2 * b + 1] = Bl), (BBUF[2 * b] = Bh);
|
|
||||||
(BBUF[2 * c + 1] = Cl), (BBUF[2 * c] = Ch);
|
|
||||||
(BBUF[2 * d + 1] = Dl), (BBUF[2 * d] = Dh);
|
|
||||||
}
|
|
||||||
class Blake1_64 extends BLAKE1 {
|
|
||||||
constructor(outputLen, IV, lengthFlag, opts = {}) {
|
|
||||||
super(128, outputLen, lengthFlag, 16, 8, B64C, opts);
|
|
||||||
this.v0l = IV[0] | 0;
|
|
||||||
this.v0h = IV[1] | 0;
|
|
||||||
this.v1l = IV[2] | 0;
|
|
||||||
this.v1h = IV[3] | 0;
|
|
||||||
this.v2l = IV[4] | 0;
|
|
||||||
this.v2h = IV[5] | 0;
|
|
||||||
this.v3l = IV[6] | 0;
|
|
||||||
this.v3h = IV[7] | 0;
|
|
||||||
this.v4l = IV[8] | 0;
|
|
||||||
this.v4h = IV[9] | 0;
|
|
||||||
this.v5l = IV[10] | 0;
|
|
||||||
this.v5h = IV[11] | 0;
|
|
||||||
this.v6l = IV[12] | 0;
|
|
||||||
this.v6h = IV[13] | 0;
|
|
||||||
this.v7l = IV[14] | 0;
|
|
||||||
this.v7h = IV[15] | 0;
|
|
||||||
}
|
|
||||||
// prettier-ignore
|
|
||||||
get() {
|
|
||||||
let { v0l, v0h, v1l, v1h, v2l, v2h, v3l, v3h, v4l, v4h, v5l, v5h, v6l, v6h, v7l, v7h } = this;
|
|
||||||
return [v0l, v0h, v1l, v1h, v2l, v2h, v3l, v3h, v4l, v4h, v5l, v5h, v6l, v6h, v7l, v7h];
|
|
||||||
}
|
|
||||||
// prettier-ignore
|
|
||||||
set(v0l, v0h, v1l, v1h, v2l, v2h, v3l, v3h, v4l, v4h, v5l, v5h, v6l, v6h, v7l, v7h) {
|
|
||||||
this.v0l = v0l | 0;
|
|
||||||
this.v0h = v0h | 0;
|
|
||||||
this.v1l = v1l | 0;
|
|
||||||
this.v1h = v1h | 0;
|
|
||||||
this.v2l = v2l | 0;
|
|
||||||
this.v2h = v2h | 0;
|
|
||||||
this.v3l = v3l | 0;
|
|
||||||
this.v3h = v3h | 0;
|
|
||||||
this.v4l = v4l | 0;
|
|
||||||
this.v4h = v4h | 0;
|
|
||||||
this.v5l = v5l | 0;
|
|
||||||
this.v5h = v5h | 0;
|
|
||||||
this.v6l = v6l | 0;
|
|
||||||
this.v6h = v6h | 0;
|
|
||||||
this.v7l = v7l | 0;
|
|
||||||
this.v7h = v7h | 0;
|
|
||||||
}
|
|
||||||
destroy() {
|
|
||||||
super.destroy();
|
|
||||||
this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
|
|
||||||
}
|
|
||||||
compress(view, offset, withLength = true) {
|
|
||||||
for (let i = 0; i < 32; i++, offset += 4)
|
|
||||||
BLAKE512_W[i] = view.getUint32(offset, false);
|
|
||||||
this.get().forEach((v, i) => (BBUF[i] = v)); // First half from state.
|
|
||||||
BBUF.set(this.constants.subarray(0, 16), 16);
|
|
||||||
if (withLength) {
|
|
||||||
const { h, l } = u64.fromBig(BigInt(this.length * 8));
|
|
||||||
BBUF[24] = (BBUF[24] ^ h) >>> 0;
|
|
||||||
BBUF[25] = (BBUF[25] ^ l) >>> 0;
|
|
||||||
BBUF[26] = (BBUF[26] ^ h) >>> 0;
|
|
||||||
BBUF[27] = (BBUF[27] ^ l) >>> 0;
|
|
||||||
}
|
|
||||||
for (let i = 0, k = 0; i < 16; i++) {
|
|
||||||
G1b(0, 4, 8, 12, BLAKE512_W, k++);
|
|
||||||
G2b(0, 4, 8, 12, BLAKE512_W, k++);
|
|
||||||
G1b(1, 5, 9, 13, BLAKE512_W, k++);
|
|
||||||
G2b(1, 5, 9, 13, BLAKE512_W, k++);
|
|
||||||
G1b(2, 6, 10, 14, BLAKE512_W, k++);
|
|
||||||
G2b(2, 6, 10, 14, BLAKE512_W, k++);
|
|
||||||
G1b(3, 7, 11, 15, BLAKE512_W, k++);
|
|
||||||
G2b(3, 7, 11, 15, BLAKE512_W, k++);
|
|
||||||
G1b(0, 5, 10, 15, BLAKE512_W, k++);
|
|
||||||
G2b(0, 5, 10, 15, BLAKE512_W, k++);
|
|
||||||
G1b(1, 6, 11, 12, BLAKE512_W, k++);
|
|
||||||
G2b(1, 6, 11, 12, BLAKE512_W, k++);
|
|
||||||
G1b(2, 7, 8, 13, BLAKE512_W, k++);
|
|
||||||
G2b(2, 7, 8, 13, BLAKE512_W, k++);
|
|
||||||
G1b(3, 4, 9, 14, BLAKE512_W, k++);
|
|
||||||
G2b(3, 4, 9, 14, BLAKE512_W, k++);
|
|
||||||
}
|
|
||||||
this.v0l ^= BBUF[0] ^ BBUF[16] ^ this.salt[0];
|
|
||||||
this.v0h ^= BBUF[1] ^ BBUF[17] ^ this.salt[1];
|
|
||||||
this.v1l ^= BBUF[2] ^ BBUF[18] ^ this.salt[2];
|
|
||||||
this.v1h ^= BBUF[3] ^ BBUF[19] ^ this.salt[3];
|
|
||||||
this.v2l ^= BBUF[4] ^ BBUF[20] ^ this.salt[4];
|
|
||||||
this.v2h ^= BBUF[5] ^ BBUF[21] ^ this.salt[5];
|
|
||||||
this.v3l ^= BBUF[6] ^ BBUF[22] ^ this.salt[6];
|
|
||||||
this.v3h ^= BBUF[7] ^ BBUF[23] ^ this.salt[7];
|
|
||||||
this.v4l ^= BBUF[8] ^ BBUF[24] ^ this.salt[0];
|
|
||||||
this.v4h ^= BBUF[9] ^ BBUF[25] ^ this.salt[1];
|
|
||||||
this.v5l ^= BBUF[10] ^ BBUF[26] ^ this.salt[2];
|
|
||||||
this.v5h ^= BBUF[11] ^ BBUF[27] ^ this.salt[3];
|
|
||||||
this.v6l ^= BBUF[12] ^ BBUF[28] ^ this.salt[4];
|
|
||||||
this.v6h ^= BBUF[13] ^ BBUF[29] ^ this.salt[5];
|
|
||||||
this.v7l ^= BBUF[14] ^ BBUF[30] ^ this.salt[6];
|
|
||||||
this.v7h ^= BBUF[15] ^ BBUF[31] ^ this.salt[7];
|
|
||||||
(0, utils_ts_1.clean)(BBUF, BLAKE512_W);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
class BLAKE224 extends Blake1_32 {
|
|
||||||
constructor(opts = {}) {
|
|
||||||
super(28, B224_IV, 0, opts);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.BLAKE224 = BLAKE224;
|
|
||||||
class BLAKE256 extends Blake1_32 {
|
|
||||||
constructor(opts = {}) {
|
|
||||||
super(32, B256_IV, 1, opts);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.BLAKE256 = BLAKE256;
|
|
||||||
class BLAKE384 extends Blake1_64 {
|
|
||||||
constructor(opts = {}) {
|
|
||||||
super(48, B384_IV, 0, opts);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.BLAKE384 = BLAKE384;
|
|
||||||
class BLAKE512 extends Blake1_64 {
|
|
||||||
constructor(opts = {}) {
|
|
||||||
super(64, B512_IV, 1, opts);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.BLAKE512 = BLAKE512;
|
|
||||||
/** blake1-224 hash function */
|
|
||||||
exports.blake224 = (0, utils_ts_1.createOptHasher)((opts) => new BLAKE224(opts));
|
|
||||||
/** blake1-256 hash function */
|
|
||||||
exports.blake256 = (0, utils_ts_1.createOptHasher)((opts) => new BLAKE256(opts));
|
|
||||||
/** blake1-384 hash function */
|
|
||||||
exports.blake384 = (0, utils_ts_1.createOptHasher)((opts) => new BLAKE384(opts));
|
|
||||||
/** blake1-512 hash function */
|
|
||||||
exports.blake512 = (0, utils_ts_1.createOptHasher)((opts) => new BLAKE512(opts));
|
|
||||||
//# sourceMappingURL=blake1.js.map
|
|
||||||
-1
File diff suppressed because one or more lines are too long
-116
@@ -1,116 +0,0 @@
|
|||||||
import { Hash, type CHashO, type Input } from './utils.ts';
|
|
||||||
/** Blake hash options. dkLen is output length. key is used in MAC mode. salt is used in KDF mode. */
|
|
||||||
export type Blake2Opts = {
|
|
||||||
dkLen?: number;
|
|
||||||
key?: Input;
|
|
||||||
salt?: Input;
|
|
||||||
personalization?: Input;
|
|
||||||
};
|
|
||||||
/** Class, from which others are subclassed. */
|
|
||||||
export declare abstract class BLAKE2<T extends BLAKE2<T>> extends Hash<T> {
|
|
||||||
protected abstract compress(msg: Uint32Array, offset: number, isLast: boolean): void;
|
|
||||||
protected abstract get(): number[];
|
|
||||||
protected abstract set(...args: number[]): void;
|
|
||||||
abstract destroy(): void;
|
|
||||||
protected buffer: Uint8Array;
|
|
||||||
protected buffer32: Uint32Array;
|
|
||||||
protected finished: boolean;
|
|
||||||
protected destroyed: boolean;
|
|
||||||
protected length: number;
|
|
||||||
protected pos: number;
|
|
||||||
readonly blockLen: number;
|
|
||||||
readonly outputLen: number;
|
|
||||||
constructor(blockLen: number, outputLen: number);
|
|
||||||
update(data: Input): this;
|
|
||||||
digestInto(out: Uint8Array): void;
|
|
||||||
digest(): Uint8Array;
|
|
||||||
_cloneInto(to?: T): T;
|
|
||||||
clone(): T;
|
|
||||||
}
|
|
||||||
export declare class BLAKE2b extends BLAKE2<BLAKE2b> {
|
|
||||||
private v0l;
|
|
||||||
private v0h;
|
|
||||||
private v1l;
|
|
||||||
private v1h;
|
|
||||||
private v2l;
|
|
||||||
private v2h;
|
|
||||||
private v3l;
|
|
||||||
private v3h;
|
|
||||||
private v4l;
|
|
||||||
private v4h;
|
|
||||||
private v5l;
|
|
||||||
private v5h;
|
|
||||||
private v6l;
|
|
||||||
private v6h;
|
|
||||||
private v7l;
|
|
||||||
private v7h;
|
|
||||||
constructor(opts?: Blake2Opts);
|
|
||||||
protected get(): [
|
|
||||||
number,
|
|
||||||
number,
|
|
||||||
number,
|
|
||||||
number,
|
|
||||||
number,
|
|
||||||
number,
|
|
||||||
number,
|
|
||||||
number,
|
|
||||||
number,
|
|
||||||
number,
|
|
||||||
number,
|
|
||||||
number,
|
|
||||||
number,
|
|
||||||
number,
|
|
||||||
number,
|
|
||||||
number
|
|
||||||
];
|
|
||||||
protected set(v0l: number, v0h: number, v1l: number, v1h: number, v2l: number, v2h: number, v3l: number, v3h: number, v4l: number, v4h: number, v5l: number, v5h: number, v6l: number, v6h: number, v7l: number, v7h: number): void;
|
|
||||||
protected compress(msg: Uint32Array, offset: number, isLast: boolean): void;
|
|
||||||
destroy(): void;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Blake2b hash function. 64-bit. 1.5x slower than blake2s in JS.
|
|
||||||
* @param msg - message that would be hashed
|
|
||||||
* @param opts - dkLen output length, key for MAC mode, salt, personalization
|
|
||||||
*/
|
|
||||||
export declare const blake2b: CHashO;
|
|
||||||
export type Num16 = {
|
|
||||||
v0: number;
|
|
||||||
v1: number;
|
|
||||||
v2: number;
|
|
||||||
v3: number;
|
|
||||||
v4: number;
|
|
||||||
v5: number;
|
|
||||||
v6: number;
|
|
||||||
v7: number;
|
|
||||||
v8: number;
|
|
||||||
v9: number;
|
|
||||||
v10: number;
|
|
||||||
v11: number;
|
|
||||||
v12: number;
|
|
||||||
v13: number;
|
|
||||||
v14: number;
|
|
||||||
v15: number;
|
|
||||||
};
|
|
||||||
export declare function compress(s: Uint8Array, offset: number, msg: Uint32Array, rounds: number, v0: number, v1: number, v2: number, v3: number, v4: number, v5: number, v6: number, v7: number, v8: number, v9: number, v10: number, v11: number, v12: number, v13: number, v14: number, v15: number): Num16;
|
|
||||||
export declare class BLAKE2s extends BLAKE2<BLAKE2s> {
|
|
||||||
private v0;
|
|
||||||
private v1;
|
|
||||||
private v2;
|
|
||||||
private v3;
|
|
||||||
private v4;
|
|
||||||
private v5;
|
|
||||||
private v6;
|
|
||||||
private v7;
|
|
||||||
constructor(opts?: Blake2Opts);
|
|
||||||
protected get(): [number, number, number, number, number, number, number, number];
|
|
||||||
protected set(v0: number, v1: number, v2: number, v3: number, v4: number, v5: number, v6: number, v7: number): void;
|
|
||||||
protected compress(msg: Uint32Array, offset: number, isLast: boolean): void;
|
|
||||||
destroy(): void;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Blake2s hash function. Focuses on 8-bit to 32-bit platforms. 1.5x faster than blake2b in JS.
|
|
||||||
* @param msg - message that would be hashed
|
|
||||||
* @param opts - dkLen output length, key for MAC mode, salt, personalization
|
|
||||||
*/
|
|
||||||
export declare const blake2s: CHashO;
|
|
||||||
//# sourceMappingURL=blake2.d.ts.map
|
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"blake2.d.ts","sourceRoot":"","sources":["src/blake2.ts"],"names":[],"mappings":"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"}
|
|
||||||
-420
@@ -1,420 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
exports.blake2s = exports.BLAKE2s = exports.blake2b = exports.BLAKE2b = exports.BLAKE2 = void 0;
|
|
||||||
exports.compress = compress;
|
|
||||||
/**
|
|
||||||
* blake2b (64-bit) & blake2s (8 to 32-bit) hash functions.
|
|
||||||
* b could have been faster, but there is no fast u64 in js, so s is 1.5x faster.
|
|
||||||
* @module
|
|
||||||
*/
|
|
||||||
const _blake_ts_1 = require("./_blake.js");
|
|
||||||
const _md_ts_1 = require("./_md.js");
|
|
||||||
const u64 = require("./_u64.js");
|
|
||||||
// prettier-ignore
|
|
||||||
const utils_ts_1 = require("./utils.js");
|
|
||||||
// Same as SHA512_IV, but swapped endianness: LE instead of BE. iv[1] is iv[0], etc.
|
|
||||||
const B2B_IV = /* @__PURE__ */ Uint32Array.from([
|
|
||||||
0xf3bcc908, 0x6a09e667, 0x84caa73b, 0xbb67ae85, 0xfe94f82b, 0x3c6ef372, 0x5f1d36f1, 0xa54ff53a,
|
|
||||||
0xade682d1, 0x510e527f, 0x2b3e6c1f, 0x9b05688c, 0xfb41bd6b, 0x1f83d9ab, 0x137e2179, 0x5be0cd19,
|
|
||||||
]);
|
|
||||||
// Temporary buffer
|
|
||||||
const BBUF = /* @__PURE__ */ new Uint32Array(32);
|
|
||||||
// Mixing function G splitted in two halfs
|
|
||||||
function G1b(a, b, c, d, msg, x) {
|
|
||||||
// NOTE: V is LE here
|
|
||||||
const Xl = msg[x], Xh = msg[x + 1]; // prettier-ignore
|
|
||||||
let Al = BBUF[2 * a], Ah = BBUF[2 * a + 1]; // prettier-ignore
|
|
||||||
let Bl = BBUF[2 * b], Bh = BBUF[2 * b + 1]; // prettier-ignore
|
|
||||||
let Cl = BBUF[2 * c], Ch = BBUF[2 * c + 1]; // prettier-ignore
|
|
||||||
let Dl = BBUF[2 * d], Dh = BBUF[2 * d + 1]; // prettier-ignore
|
|
||||||
// v[a] = (v[a] + v[b] + x) | 0;
|
|
||||||
let ll = u64.add3L(Al, Bl, Xl);
|
|
||||||
Ah = u64.add3H(ll, Ah, Bh, Xh);
|
|
||||||
Al = ll | 0;
|
|
||||||
// v[d] = rotr(v[d] ^ v[a], 32)
|
|
||||||
({ Dh, Dl } = { Dh: Dh ^ Ah, Dl: Dl ^ Al });
|
|
||||||
({ Dh, Dl } = { Dh: u64.rotr32H(Dh, Dl), Dl: u64.rotr32L(Dh, Dl) });
|
|
||||||
// v[c] = (v[c] + v[d]) | 0;
|
|
||||||
({ h: Ch, l: Cl } = u64.add(Ch, Cl, Dh, Dl));
|
|
||||||
// v[b] = rotr(v[b] ^ v[c], 24)
|
|
||||||
({ Bh, Bl } = { Bh: Bh ^ Ch, Bl: Bl ^ Cl });
|
|
||||||
({ Bh, Bl } = { Bh: u64.rotrSH(Bh, Bl, 24), Bl: u64.rotrSL(Bh, Bl, 24) });
|
|
||||||
(BBUF[2 * a] = Al), (BBUF[2 * a + 1] = Ah);
|
|
||||||
(BBUF[2 * b] = Bl), (BBUF[2 * b + 1] = Bh);
|
|
||||||
(BBUF[2 * c] = Cl), (BBUF[2 * c + 1] = Ch);
|
|
||||||
(BBUF[2 * d] = Dl), (BBUF[2 * d + 1] = Dh);
|
|
||||||
}
|
|
||||||
function G2b(a, b, c, d, msg, x) {
|
|
||||||
// NOTE: V is LE here
|
|
||||||
const Xl = msg[x], Xh = msg[x + 1]; // prettier-ignore
|
|
||||||
let Al = BBUF[2 * a], Ah = BBUF[2 * a + 1]; // prettier-ignore
|
|
||||||
let Bl = BBUF[2 * b], Bh = BBUF[2 * b + 1]; // prettier-ignore
|
|
||||||
let Cl = BBUF[2 * c], Ch = BBUF[2 * c + 1]; // prettier-ignore
|
|
||||||
let Dl = BBUF[2 * d], Dh = BBUF[2 * d + 1]; // prettier-ignore
|
|
||||||
// v[a] = (v[a] + v[b] + x) | 0;
|
|
||||||
let ll = u64.add3L(Al, Bl, Xl);
|
|
||||||
Ah = u64.add3H(ll, Ah, Bh, Xh);
|
|
||||||
Al = ll | 0;
|
|
||||||
// v[d] = rotr(v[d] ^ v[a], 16)
|
|
||||||
({ Dh, Dl } = { Dh: Dh ^ Ah, Dl: Dl ^ Al });
|
|
||||||
({ Dh, Dl } = { Dh: u64.rotrSH(Dh, Dl, 16), Dl: u64.rotrSL(Dh, Dl, 16) });
|
|
||||||
// v[c] = (v[c] + v[d]) | 0;
|
|
||||||
({ h: Ch, l: Cl } = u64.add(Ch, Cl, Dh, Dl));
|
|
||||||
// v[b] = rotr(v[b] ^ v[c], 63)
|
|
||||||
({ Bh, Bl } = { Bh: Bh ^ Ch, Bl: Bl ^ Cl });
|
|
||||||
({ Bh, Bl } = { Bh: u64.rotrBH(Bh, Bl, 63), Bl: u64.rotrBL(Bh, Bl, 63) });
|
|
||||||
(BBUF[2 * a] = Al), (BBUF[2 * a + 1] = Ah);
|
|
||||||
(BBUF[2 * b] = Bl), (BBUF[2 * b + 1] = Bh);
|
|
||||||
(BBUF[2 * c] = Cl), (BBUF[2 * c + 1] = Ch);
|
|
||||||
(BBUF[2 * d] = Dl), (BBUF[2 * d + 1] = Dh);
|
|
||||||
}
|
|
||||||
function checkBlake2Opts(outputLen, opts = {}, keyLen, saltLen, persLen) {
|
|
||||||
(0, utils_ts_1.anumber)(keyLen);
|
|
||||||
if (outputLen < 0 || outputLen > keyLen)
|
|
||||||
throw new Error('outputLen bigger than keyLen');
|
|
||||||
const { key, salt, personalization } = opts;
|
|
||||||
if (key !== undefined && (key.length < 1 || key.length > keyLen))
|
|
||||||
throw new Error('key length must be undefined or 1..' + keyLen);
|
|
||||||
if (salt !== undefined && salt.length !== saltLen)
|
|
||||||
throw new Error('salt must be undefined or ' + saltLen);
|
|
||||||
if (personalization !== undefined && personalization.length !== persLen)
|
|
||||||
throw new Error('personalization must be undefined or ' + persLen);
|
|
||||||
}
|
|
||||||
/** Class, from which others are subclassed. */
|
|
||||||
class BLAKE2 extends utils_ts_1.Hash {
|
|
||||||
constructor(blockLen, outputLen) {
|
|
||||||
super();
|
|
||||||
this.finished = false;
|
|
||||||
this.destroyed = false;
|
|
||||||
this.length = 0;
|
|
||||||
this.pos = 0;
|
|
||||||
(0, utils_ts_1.anumber)(blockLen);
|
|
||||||
(0, utils_ts_1.anumber)(outputLen);
|
|
||||||
this.blockLen = blockLen;
|
|
||||||
this.outputLen = outputLen;
|
|
||||||
this.buffer = new Uint8Array(blockLen);
|
|
||||||
this.buffer32 = (0, utils_ts_1.u32)(this.buffer);
|
|
||||||
}
|
|
||||||
update(data) {
|
|
||||||
(0, utils_ts_1.aexists)(this);
|
|
||||||
data = (0, utils_ts_1.toBytes)(data);
|
|
||||||
(0, utils_ts_1.abytes)(data);
|
|
||||||
// Main difference with other hashes: there is flag for last block,
|
|
||||||
// so we cannot process current block before we know that there
|
|
||||||
// is the next one. This significantly complicates logic and reduces ability
|
|
||||||
// to do zero-copy processing
|
|
||||||
const { blockLen, buffer, buffer32 } = this;
|
|
||||||
const len = data.length;
|
|
||||||
const offset = data.byteOffset;
|
|
||||||
const buf = data.buffer;
|
|
||||||
for (let pos = 0; pos < len;) {
|
|
||||||
// If buffer is full and we still have input (don't process last block, same as blake2s)
|
|
||||||
if (this.pos === blockLen) {
|
|
||||||
(0, utils_ts_1.swap32IfBE)(buffer32);
|
|
||||||
this.compress(buffer32, 0, false);
|
|
||||||
(0, utils_ts_1.swap32IfBE)(buffer32);
|
|
||||||
this.pos = 0;
|
|
||||||
}
|
|
||||||
const take = Math.min(blockLen - this.pos, len - pos);
|
|
||||||
const dataOffset = offset + pos;
|
|
||||||
// full block && aligned to 4 bytes && not last in input
|
|
||||||
if (take === blockLen && !(dataOffset % 4) && pos + take < len) {
|
|
||||||
const data32 = new Uint32Array(buf, dataOffset, Math.floor((len - pos) / 4));
|
|
||||||
(0, utils_ts_1.swap32IfBE)(data32);
|
|
||||||
for (let pos32 = 0; pos + blockLen < len; pos32 += buffer32.length, pos += blockLen) {
|
|
||||||
this.length += blockLen;
|
|
||||||
this.compress(data32, pos32, false);
|
|
||||||
}
|
|
||||||
(0, utils_ts_1.swap32IfBE)(data32);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
buffer.set(data.subarray(pos, pos + take), this.pos);
|
|
||||||
this.pos += take;
|
|
||||||
this.length += take;
|
|
||||||
pos += take;
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
digestInto(out) {
|
|
||||||
(0, utils_ts_1.aexists)(this);
|
|
||||||
(0, utils_ts_1.aoutput)(out, this);
|
|
||||||
const { pos, buffer32 } = this;
|
|
||||||
this.finished = true;
|
|
||||||
// Padding
|
|
||||||
(0, utils_ts_1.clean)(this.buffer.subarray(pos));
|
|
||||||
(0, utils_ts_1.swap32IfBE)(buffer32);
|
|
||||||
this.compress(buffer32, 0, true);
|
|
||||||
(0, utils_ts_1.swap32IfBE)(buffer32);
|
|
||||||
const out32 = (0, utils_ts_1.u32)(out);
|
|
||||||
this.get().forEach((v, i) => (out32[i] = (0, utils_ts_1.swap8IfBE)(v)));
|
|
||||||
}
|
|
||||||
digest() {
|
|
||||||
const { buffer, outputLen } = this;
|
|
||||||
this.digestInto(buffer);
|
|
||||||
const res = buffer.slice(0, outputLen);
|
|
||||||
this.destroy();
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
_cloneInto(to) {
|
|
||||||
const { buffer, length, finished, destroyed, outputLen, pos } = this;
|
|
||||||
to || (to = new this.constructor({ dkLen: outputLen }));
|
|
||||||
to.set(...this.get());
|
|
||||||
to.buffer.set(buffer);
|
|
||||||
to.destroyed = destroyed;
|
|
||||||
to.finished = finished;
|
|
||||||
to.length = length;
|
|
||||||
to.pos = pos;
|
|
||||||
// @ts-ignore
|
|
||||||
to.outputLen = outputLen;
|
|
||||||
return to;
|
|
||||||
}
|
|
||||||
clone() {
|
|
||||||
return this._cloneInto();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.BLAKE2 = BLAKE2;
|
|
||||||
class BLAKE2b extends BLAKE2 {
|
|
||||||
constructor(opts = {}) {
|
|
||||||
const olen = opts.dkLen === undefined ? 64 : opts.dkLen;
|
|
||||||
super(128, olen);
|
|
||||||
// Same as SHA-512, but LE
|
|
||||||
this.v0l = B2B_IV[0] | 0;
|
|
||||||
this.v0h = B2B_IV[1] | 0;
|
|
||||||
this.v1l = B2B_IV[2] | 0;
|
|
||||||
this.v1h = B2B_IV[3] | 0;
|
|
||||||
this.v2l = B2B_IV[4] | 0;
|
|
||||||
this.v2h = B2B_IV[5] | 0;
|
|
||||||
this.v3l = B2B_IV[6] | 0;
|
|
||||||
this.v3h = B2B_IV[7] | 0;
|
|
||||||
this.v4l = B2B_IV[8] | 0;
|
|
||||||
this.v4h = B2B_IV[9] | 0;
|
|
||||||
this.v5l = B2B_IV[10] | 0;
|
|
||||||
this.v5h = B2B_IV[11] | 0;
|
|
||||||
this.v6l = B2B_IV[12] | 0;
|
|
||||||
this.v6h = B2B_IV[13] | 0;
|
|
||||||
this.v7l = B2B_IV[14] | 0;
|
|
||||||
this.v7h = B2B_IV[15] | 0;
|
|
||||||
checkBlake2Opts(olen, opts, 64, 16, 16);
|
|
||||||
let { key, personalization, salt } = opts;
|
|
||||||
let keyLength = 0;
|
|
||||||
if (key !== undefined) {
|
|
||||||
key = (0, utils_ts_1.toBytes)(key);
|
|
||||||
keyLength = key.length;
|
|
||||||
}
|
|
||||||
this.v0l ^= this.outputLen | (keyLength << 8) | (0x01 << 16) | (0x01 << 24);
|
|
||||||
if (salt !== undefined) {
|
|
||||||
salt = (0, utils_ts_1.toBytes)(salt);
|
|
||||||
const slt = (0, utils_ts_1.u32)(salt);
|
|
||||||
this.v4l ^= (0, utils_ts_1.swap8IfBE)(slt[0]);
|
|
||||||
this.v4h ^= (0, utils_ts_1.swap8IfBE)(slt[1]);
|
|
||||||
this.v5l ^= (0, utils_ts_1.swap8IfBE)(slt[2]);
|
|
||||||
this.v5h ^= (0, utils_ts_1.swap8IfBE)(slt[3]);
|
|
||||||
}
|
|
||||||
if (personalization !== undefined) {
|
|
||||||
personalization = (0, utils_ts_1.toBytes)(personalization);
|
|
||||||
const pers = (0, utils_ts_1.u32)(personalization);
|
|
||||||
this.v6l ^= (0, utils_ts_1.swap8IfBE)(pers[0]);
|
|
||||||
this.v6h ^= (0, utils_ts_1.swap8IfBE)(pers[1]);
|
|
||||||
this.v7l ^= (0, utils_ts_1.swap8IfBE)(pers[2]);
|
|
||||||
this.v7h ^= (0, utils_ts_1.swap8IfBE)(pers[3]);
|
|
||||||
}
|
|
||||||
if (key !== undefined) {
|
|
||||||
// Pad to blockLen and update
|
|
||||||
const tmp = new Uint8Array(this.blockLen);
|
|
||||||
tmp.set(key);
|
|
||||||
this.update(tmp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// prettier-ignore
|
|
||||||
get() {
|
|
||||||
let { v0l, v0h, v1l, v1h, v2l, v2h, v3l, v3h, v4l, v4h, v5l, v5h, v6l, v6h, v7l, v7h } = this;
|
|
||||||
return [v0l, v0h, v1l, v1h, v2l, v2h, v3l, v3h, v4l, v4h, v5l, v5h, v6l, v6h, v7l, v7h];
|
|
||||||
}
|
|
||||||
// prettier-ignore
|
|
||||||
set(v0l, v0h, v1l, v1h, v2l, v2h, v3l, v3h, v4l, v4h, v5l, v5h, v6l, v6h, v7l, v7h) {
|
|
||||||
this.v0l = v0l | 0;
|
|
||||||
this.v0h = v0h | 0;
|
|
||||||
this.v1l = v1l | 0;
|
|
||||||
this.v1h = v1h | 0;
|
|
||||||
this.v2l = v2l | 0;
|
|
||||||
this.v2h = v2h | 0;
|
|
||||||
this.v3l = v3l | 0;
|
|
||||||
this.v3h = v3h | 0;
|
|
||||||
this.v4l = v4l | 0;
|
|
||||||
this.v4h = v4h | 0;
|
|
||||||
this.v5l = v5l | 0;
|
|
||||||
this.v5h = v5h | 0;
|
|
||||||
this.v6l = v6l | 0;
|
|
||||||
this.v6h = v6h | 0;
|
|
||||||
this.v7l = v7l | 0;
|
|
||||||
this.v7h = v7h | 0;
|
|
||||||
}
|
|
||||||
compress(msg, offset, isLast) {
|
|
||||||
this.get().forEach((v, i) => (BBUF[i] = v)); // First half from state.
|
|
||||||
BBUF.set(B2B_IV, 16); // Second half from IV.
|
|
||||||
let { h, l } = u64.fromBig(BigInt(this.length));
|
|
||||||
BBUF[24] = B2B_IV[8] ^ l; // Low word of the offset.
|
|
||||||
BBUF[25] = B2B_IV[9] ^ h; // High word.
|
|
||||||
// Invert all bits for last block
|
|
||||||
if (isLast) {
|
|
||||||
BBUF[28] = ~BBUF[28];
|
|
||||||
BBUF[29] = ~BBUF[29];
|
|
||||||
}
|
|
||||||
let j = 0;
|
|
||||||
const s = _blake_ts_1.BSIGMA;
|
|
||||||
for (let i = 0; i < 12; i++) {
|
|
||||||
G1b(0, 4, 8, 12, msg, offset + 2 * s[j++]);
|
|
||||||
G2b(0, 4, 8, 12, msg, offset + 2 * s[j++]);
|
|
||||||
G1b(1, 5, 9, 13, msg, offset + 2 * s[j++]);
|
|
||||||
G2b(1, 5, 9, 13, msg, offset + 2 * s[j++]);
|
|
||||||
G1b(2, 6, 10, 14, msg, offset + 2 * s[j++]);
|
|
||||||
G2b(2, 6, 10, 14, msg, offset + 2 * s[j++]);
|
|
||||||
G1b(3, 7, 11, 15, msg, offset + 2 * s[j++]);
|
|
||||||
G2b(3, 7, 11, 15, msg, offset + 2 * s[j++]);
|
|
||||||
G1b(0, 5, 10, 15, msg, offset + 2 * s[j++]);
|
|
||||||
G2b(0, 5, 10, 15, msg, offset + 2 * s[j++]);
|
|
||||||
G1b(1, 6, 11, 12, msg, offset + 2 * s[j++]);
|
|
||||||
G2b(1, 6, 11, 12, msg, offset + 2 * s[j++]);
|
|
||||||
G1b(2, 7, 8, 13, msg, offset + 2 * s[j++]);
|
|
||||||
G2b(2, 7, 8, 13, msg, offset + 2 * s[j++]);
|
|
||||||
G1b(3, 4, 9, 14, msg, offset + 2 * s[j++]);
|
|
||||||
G2b(3, 4, 9, 14, msg, offset + 2 * s[j++]);
|
|
||||||
}
|
|
||||||
this.v0l ^= BBUF[0] ^ BBUF[16];
|
|
||||||
this.v0h ^= BBUF[1] ^ BBUF[17];
|
|
||||||
this.v1l ^= BBUF[2] ^ BBUF[18];
|
|
||||||
this.v1h ^= BBUF[3] ^ BBUF[19];
|
|
||||||
this.v2l ^= BBUF[4] ^ BBUF[20];
|
|
||||||
this.v2h ^= BBUF[5] ^ BBUF[21];
|
|
||||||
this.v3l ^= BBUF[6] ^ BBUF[22];
|
|
||||||
this.v3h ^= BBUF[7] ^ BBUF[23];
|
|
||||||
this.v4l ^= BBUF[8] ^ BBUF[24];
|
|
||||||
this.v4h ^= BBUF[9] ^ BBUF[25];
|
|
||||||
this.v5l ^= BBUF[10] ^ BBUF[26];
|
|
||||||
this.v5h ^= BBUF[11] ^ BBUF[27];
|
|
||||||
this.v6l ^= BBUF[12] ^ BBUF[28];
|
|
||||||
this.v6h ^= BBUF[13] ^ BBUF[29];
|
|
||||||
this.v7l ^= BBUF[14] ^ BBUF[30];
|
|
||||||
this.v7h ^= BBUF[15] ^ BBUF[31];
|
|
||||||
(0, utils_ts_1.clean)(BBUF);
|
|
||||||
}
|
|
||||||
destroy() {
|
|
||||||
this.destroyed = true;
|
|
||||||
(0, utils_ts_1.clean)(this.buffer32);
|
|
||||||
this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.BLAKE2b = BLAKE2b;
|
|
||||||
/**
|
|
||||||
* Blake2b hash function. 64-bit. 1.5x slower than blake2s in JS.
|
|
||||||
* @param msg - message that would be hashed
|
|
||||||
* @param opts - dkLen output length, key for MAC mode, salt, personalization
|
|
||||||
*/
|
|
||||||
exports.blake2b = (0, utils_ts_1.createOptHasher)((opts) => new BLAKE2b(opts));
|
|
||||||
// prettier-ignore
|
|
||||||
function compress(s, offset, msg, rounds, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) {
|
|
||||||
let j = 0;
|
|
||||||
for (let i = 0; i < rounds; i++) {
|
|
||||||
({ a: v0, b: v4, c: v8, d: v12 } = (0, _blake_ts_1.G1s)(v0, v4, v8, v12, msg[offset + s[j++]]));
|
|
||||||
({ a: v0, b: v4, c: v8, d: v12 } = (0, _blake_ts_1.G2s)(v0, v4, v8, v12, msg[offset + s[j++]]));
|
|
||||||
({ a: v1, b: v5, c: v9, d: v13 } = (0, _blake_ts_1.G1s)(v1, v5, v9, v13, msg[offset + s[j++]]));
|
|
||||||
({ a: v1, b: v5, c: v9, d: v13 } = (0, _blake_ts_1.G2s)(v1, v5, v9, v13, msg[offset + s[j++]]));
|
|
||||||
({ a: v2, b: v6, c: v10, d: v14 } = (0, _blake_ts_1.G1s)(v2, v6, v10, v14, msg[offset + s[j++]]));
|
|
||||||
({ a: v2, b: v6, c: v10, d: v14 } = (0, _blake_ts_1.G2s)(v2, v6, v10, v14, msg[offset + s[j++]]));
|
|
||||||
({ a: v3, b: v7, c: v11, d: v15 } = (0, _blake_ts_1.G1s)(v3, v7, v11, v15, msg[offset + s[j++]]));
|
|
||||||
({ a: v3, b: v7, c: v11, d: v15 } = (0, _blake_ts_1.G2s)(v3, v7, v11, v15, msg[offset + s[j++]]));
|
|
||||||
({ a: v0, b: v5, c: v10, d: v15 } = (0, _blake_ts_1.G1s)(v0, v5, v10, v15, msg[offset + s[j++]]));
|
|
||||||
({ a: v0, b: v5, c: v10, d: v15 } = (0, _blake_ts_1.G2s)(v0, v5, v10, v15, msg[offset + s[j++]]));
|
|
||||||
({ a: v1, b: v6, c: v11, d: v12 } = (0, _blake_ts_1.G1s)(v1, v6, v11, v12, msg[offset + s[j++]]));
|
|
||||||
({ a: v1, b: v6, c: v11, d: v12 } = (0, _blake_ts_1.G2s)(v1, v6, v11, v12, msg[offset + s[j++]]));
|
|
||||||
({ a: v2, b: v7, c: v8, d: v13 } = (0, _blake_ts_1.G1s)(v2, v7, v8, v13, msg[offset + s[j++]]));
|
|
||||||
({ a: v2, b: v7, c: v8, d: v13 } = (0, _blake_ts_1.G2s)(v2, v7, v8, v13, msg[offset + s[j++]]));
|
|
||||||
({ a: v3, b: v4, c: v9, d: v14 } = (0, _blake_ts_1.G1s)(v3, v4, v9, v14, msg[offset + s[j++]]));
|
|
||||||
({ a: v3, b: v4, c: v9, d: v14 } = (0, _blake_ts_1.G2s)(v3, v4, v9, v14, msg[offset + s[j++]]));
|
|
||||||
}
|
|
||||||
return { v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15 };
|
|
||||||
}
|
|
||||||
const B2S_IV = _md_ts_1.SHA256_IV;
|
|
||||||
class BLAKE2s extends BLAKE2 {
|
|
||||||
constructor(opts = {}) {
|
|
||||||
const olen = opts.dkLen === undefined ? 32 : opts.dkLen;
|
|
||||||
super(64, olen);
|
|
||||||
// Internal state, same as SHA-256
|
|
||||||
this.v0 = B2S_IV[0] | 0;
|
|
||||||
this.v1 = B2S_IV[1] | 0;
|
|
||||||
this.v2 = B2S_IV[2] | 0;
|
|
||||||
this.v3 = B2S_IV[3] | 0;
|
|
||||||
this.v4 = B2S_IV[4] | 0;
|
|
||||||
this.v5 = B2S_IV[5] | 0;
|
|
||||||
this.v6 = B2S_IV[6] | 0;
|
|
||||||
this.v7 = B2S_IV[7] | 0;
|
|
||||||
checkBlake2Opts(olen, opts, 32, 8, 8);
|
|
||||||
let { key, personalization, salt } = opts;
|
|
||||||
let keyLength = 0;
|
|
||||||
if (key !== undefined) {
|
|
||||||
key = (0, utils_ts_1.toBytes)(key);
|
|
||||||
keyLength = key.length;
|
|
||||||
}
|
|
||||||
this.v0 ^= this.outputLen | (keyLength << 8) | (0x01 << 16) | (0x01 << 24);
|
|
||||||
if (salt !== undefined) {
|
|
||||||
salt = (0, utils_ts_1.toBytes)(salt);
|
|
||||||
const slt = (0, utils_ts_1.u32)(salt);
|
|
||||||
this.v4 ^= (0, utils_ts_1.swap8IfBE)(slt[0]);
|
|
||||||
this.v5 ^= (0, utils_ts_1.swap8IfBE)(slt[1]);
|
|
||||||
}
|
|
||||||
if (personalization !== undefined) {
|
|
||||||
personalization = (0, utils_ts_1.toBytes)(personalization);
|
|
||||||
const pers = (0, utils_ts_1.u32)(personalization);
|
|
||||||
this.v6 ^= (0, utils_ts_1.swap8IfBE)(pers[0]);
|
|
||||||
this.v7 ^= (0, utils_ts_1.swap8IfBE)(pers[1]);
|
|
||||||
}
|
|
||||||
if (key !== undefined) {
|
|
||||||
// Pad to blockLen and update
|
|
||||||
(0, utils_ts_1.abytes)(key);
|
|
||||||
const tmp = new Uint8Array(this.blockLen);
|
|
||||||
tmp.set(key);
|
|
||||||
this.update(tmp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
get() {
|
|
||||||
const { v0, v1, v2, v3, v4, v5, v6, v7 } = this;
|
|
||||||
return [v0, v1, v2, v3, v4, v5, v6, v7];
|
|
||||||
}
|
|
||||||
// prettier-ignore
|
|
||||||
set(v0, v1, v2, v3, v4, v5, v6, v7) {
|
|
||||||
this.v0 = v0 | 0;
|
|
||||||
this.v1 = v1 | 0;
|
|
||||||
this.v2 = v2 | 0;
|
|
||||||
this.v3 = v3 | 0;
|
|
||||||
this.v4 = v4 | 0;
|
|
||||||
this.v5 = v5 | 0;
|
|
||||||
this.v6 = v6 | 0;
|
|
||||||
this.v7 = v7 | 0;
|
|
||||||
}
|
|
||||||
compress(msg, offset, isLast) {
|
|
||||||
const { h, l } = u64.fromBig(BigInt(this.length));
|
|
||||||
// prettier-ignore
|
|
||||||
const { v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15 } = compress(_blake_ts_1.BSIGMA, offset, msg, 10, this.v0, this.v1, this.v2, this.v3, this.v4, this.v5, this.v6, this.v7, B2S_IV[0], B2S_IV[1], B2S_IV[2], B2S_IV[3], l ^ B2S_IV[4], h ^ B2S_IV[5], isLast ? ~B2S_IV[6] : B2S_IV[6], B2S_IV[7]);
|
|
||||||
this.v0 ^= v0 ^ v8;
|
|
||||||
this.v1 ^= v1 ^ v9;
|
|
||||||
this.v2 ^= v2 ^ v10;
|
|
||||||
this.v3 ^= v3 ^ v11;
|
|
||||||
this.v4 ^= v4 ^ v12;
|
|
||||||
this.v5 ^= v5 ^ v13;
|
|
||||||
this.v6 ^= v6 ^ v14;
|
|
||||||
this.v7 ^= v7 ^ v15;
|
|
||||||
}
|
|
||||||
destroy() {
|
|
||||||
this.destroyed = true;
|
|
||||||
(0, utils_ts_1.clean)(this.buffer32);
|
|
||||||
this.set(0, 0, 0, 0, 0, 0, 0, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.BLAKE2s = BLAKE2s;
|
|
||||||
/**
|
|
||||||
* Blake2s hash function. Focuses on 8-bit to 32-bit platforms. 1.5x faster than blake2b in JS.
|
|
||||||
* @param msg - message that would be hashed
|
|
||||||
* @param opts - dkLen output length, key for MAC mode, salt, personalization
|
|
||||||
*/
|
|
||||||
exports.blake2s = (0, utils_ts_1.createOptHasher)((opts) => new BLAKE2s(opts));
|
|
||||||
//# sourceMappingURL=blake2.js.map
|
|
||||||
-1
File diff suppressed because one or more lines are too long
-11
@@ -1,11 +0,0 @@
|
|||||||
/**
|
|
||||||
* Blake2b hash function. Focuses on 64-bit platforms, but in JS speed different from Blake2s is negligible.
|
|
||||||
* @module
|
|
||||||
* @deprecated
|
|
||||||
*/
|
|
||||||
import { BLAKE2b as B2B, blake2b as b2b } from './blake2.ts';
|
|
||||||
/** @deprecated Use import from `noble/hashes/blake2` module */
|
|
||||||
export declare const BLAKE2b: typeof B2B;
|
|
||||||
/** @deprecated Use import from `noble/hashes/blake2` module */
|
|
||||||
export declare const blake2b: typeof b2b;
|
|
||||||
//# sourceMappingURL=blake2b.d.ts.map
|
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"blake2b.d.ts","sourceRoot":"","sources":["src/blake2b.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,aAAa,CAAC;AAC7D,+DAA+D;AAC/D,eAAO,MAAM,OAAO,EAAE,OAAO,GAAS,CAAC;AACvC,+DAA+D;AAC/D,eAAO,MAAM,OAAO,EAAE,OAAO,GAAS,CAAC"}
|
|
||||||
-14
@@ -1,14 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
exports.blake2b = exports.BLAKE2b = void 0;
|
|
||||||
/**
|
|
||||||
* Blake2b hash function. Focuses on 64-bit platforms, but in JS speed different from Blake2s is negligible.
|
|
||||||
* @module
|
|
||||||
* @deprecated
|
|
||||||
*/
|
|
||||||
const blake2_ts_1 = require("./blake2.js");
|
|
||||||
/** @deprecated Use import from `noble/hashes/blake2` module */
|
|
||||||
exports.BLAKE2b = blake2_ts_1.BLAKE2b;
|
|
||||||
/** @deprecated Use import from `noble/hashes/blake2` module */
|
|
||||||
exports.blake2b = blake2_ts_1.blake2b;
|
|
||||||
//# sourceMappingURL=blake2b.js.map
|
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"blake2b.js","sourceRoot":"","sources":["src/blake2b.ts"],"names":[],"mappings":";;;AAAA;;;;GAIG;AACH,2CAA6D;AAC7D,+DAA+D;AAClD,QAAA,OAAO,GAAe,mBAAG,CAAC;AACvC,+DAA+D;AAClD,QAAA,OAAO,GAAe,mBAAG,CAAC"}
|
|
||||||
-20
@@ -1,20 +0,0 @@
|
|||||||
/**
|
|
||||||
* Blake2s hash function. Focuses on 8-bit to 32-bit platforms. blake2b for 64-bit, but in JS it is slower.
|
|
||||||
* @module
|
|
||||||
* @deprecated
|
|
||||||
*/
|
|
||||||
import { G1s as G1s_n, G2s as G2s_n } from './_blake.ts';
|
|
||||||
import { BLAKE2s as B2S, blake2s as b2s, compress as compress_n } from './blake2.ts';
|
|
||||||
/** @deprecated Use import from `noble/hashes/blake2` module */
|
|
||||||
export declare const B2S_IV: Uint32Array;
|
|
||||||
/** @deprecated Use import from `noble/hashes/blake2` module */
|
|
||||||
export declare const G1s: typeof G1s_n;
|
|
||||||
/** @deprecated Use import from `noble/hashes/blake2` module */
|
|
||||||
export declare const G2s: typeof G2s_n;
|
|
||||||
/** @deprecated Use import from `noble/hashes/blake2` module */
|
|
||||||
export declare const compress: typeof compress_n;
|
|
||||||
/** @deprecated Use import from `noble/hashes/blake2` module */
|
|
||||||
export declare const BLAKE2s: typeof B2S;
|
|
||||||
/** @deprecated Use import from `noble/hashes/blake2` module */
|
|
||||||
export declare const blake2s: typeof b2s;
|
|
||||||
//# sourceMappingURL=blake2s.d.ts.map
|
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"blake2s.d.ts","sourceRoot":"","sources":["src/blake2s.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,GAAG,IAAI,KAAK,EAAE,GAAG,IAAI,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzD,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,OAAO,IAAI,GAAG,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,aAAa,CAAC;AACrF,+DAA+D;AAC/D,eAAO,MAAM,MAAM,EAAE,WAAuB,CAAC;AAC7C,+DAA+D;AAC/D,eAAO,MAAM,GAAG,EAAE,OAAO,KAAa,CAAC;AACvC,+DAA+D;AAC/D,eAAO,MAAM,GAAG,EAAE,OAAO,KAAa,CAAC;AACvC,+DAA+D;AAC/D,eAAO,MAAM,QAAQ,EAAE,OAAO,UAAuB,CAAC;AACtD,+DAA+D;AAC/D,eAAO,MAAM,OAAO,EAAE,OAAO,GAAS,CAAC;AACvC,+DAA+D;AAC/D,eAAO,MAAM,OAAO,EAAE,OAAO,GAAS,CAAC"}
|
|
||||||
Reference in New Issue
Block a user