@libp2p/crypto
Version:
Crypto primitives for libp2p
52 lines • 2.03 kB
JavaScript
import { ed25519 as ed } from '@noble/curves/ed25519';
const PUBLIC_KEY_BYTE_LENGTH = 32;
const PRIVATE_KEY_BYTE_LENGTH = 64; // private key is actually 32 bytes but for historical reasons we concat private and public keys
const KEYS_BYTE_LENGTH = 32;
export { PUBLIC_KEY_BYTE_LENGTH as publicKeyLength };
export { PRIVATE_KEY_BYTE_LENGTH as privateKeyLength };
export function generateKey() {
// the actual private key (32 bytes)
const privateKeyRaw = ed.utils.randomPrivateKey();
const publicKey = ed.getPublicKey(privateKeyRaw);
// concatenated the public key to the private key
const privateKey = concatKeys(privateKeyRaw, publicKey);
return {
privateKey,
publicKey
};
}
/**
* Generate keypair from a 32 byte uint8array
*/
export function generateKeyFromSeed(seed) {
if (seed.length !== KEYS_BYTE_LENGTH) {
throw new TypeError('"seed" must be 32 bytes in length.');
}
else if (!(seed instanceof Uint8Array)) {
throw new TypeError('"seed" must be a node.js Buffer, or Uint8Array.');
}
// based on node forges algorithm, the seed is used directly as private key
const privateKeyRaw = seed;
const publicKey = ed.getPublicKey(privateKeyRaw);
const privateKey = concatKeys(privateKeyRaw, publicKey);
return {
privateKey,
publicKey
};
}
export function hashAndSign(privateKey, msg) {
const privateKeyRaw = privateKey.subarray(0, KEYS_BYTE_LENGTH);
return ed.sign(msg instanceof Uint8Array ? msg : msg.subarray(), privateKeyRaw);
}
export function hashAndVerify(publicKey, sig, msg) {
return ed.verify(sig, msg instanceof Uint8Array ? msg : msg.subarray(), publicKey);
}
function concatKeys(privateKeyRaw, publicKey) {
const privateKey = new Uint8Array(PRIVATE_KEY_BYTE_LENGTH);
for (let i = 0; i < KEYS_BYTE_LENGTH; i++) {
privateKey[i] = privateKeyRaw[i];
privateKey[KEYS_BYTE_LENGTH + i] = publicKey[i];
}
return privateKey;
}
//# sourceMappingURL=index.browser.js.map