micro-key-producer
Version:
Produces secure keys and passwords. Supports SSH, PGP, BLS, OTP, and many others
40 lines • 1.77 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.formatPublicKey = formatPublicKey;
exports.parseAddress = parseAddress;
exports.getKeys = getKeys;
/*! micro-key-producer - MIT License (c) 2024 Paul Miller (paulmillr.com) */
const ed25519_1 = require("@noble/curves/ed25519");
const sha3_1 = require("@noble/hashes/sha3");
const utils_1 = require("@noble/hashes/utils");
const base_1 = require("@scure/base");
const ADDRESS_VERSION = new Uint8Array([0x03]);
function formatPublicKey(pubBytes) {
// checksum = H(".onion checksum" || pubkey || version)
const checksum = (0, sha3_1.sha3_256)((0, utils_1.concatBytes)(base_1.utf8.decode('.onion checksum'), pubBytes, ADDRESS_VERSION));
// onion_address = base32(pubkey || checksum || version);
const addr = (0, utils_1.concatBytes)(pubBytes, checksum.slice(0, 2), ADDRESS_VERSION);
return `${base_1.base32.encode(addr).toLowerCase()}.onion`;
}
function parseAddress(address) {
if (!address.endsWith('.onion'))
throw new Error('Address must end with .onion');
const addr = base_1.base32.decode(address.replace(/\.onion$/, '').toUpperCase());
// skip last 3 bytes
const skip = addr.slice(0, addr.length - 3);
const key = formatPublicKey(skip);
if (key !== address)
throw new Error('Invalid checksum');
return skip;
}
function getKeys(seed) {
const { head, prefix, pointBytes } = ed25519_1.ed25519.utils.getExtendedPublicKey(seed);
const added = (0, utils_1.concatBytes)(head, prefix);
return {
publicKeyBytes: pointBytes,
publicKey: formatPublicKey(pointBytes),
privateKey: `ED25519-V3:${base_1.base64.encode(added)}`,
};
}
exports.default = getKeys;
//# sourceMappingURL=tor.js.map