UNPKG

@digitalcredentials/x25519-key-agreement-key-2020

Version:

An X25519 (Curve25519) DH (Diffie-Hellman) key implementation to work with the X25519 2020 Crypto suite.

60 lines (52 loc) 1.79 kB
/*! * Copyright (c) 2021-2022 Digital Bazaar, Inc. All rights reserved. */ import * as crypto from 'crypto'; import * as cryptoNacl from './crypto-nacl.js'; import {promisify} from 'util'; const PUBLIC_KEY_DER_PREFIX = new Uint8Array([ 48, 42, 48, 5, 6, 3, 43, 101, 110, 3, 33, 0 ]); const PRIVATE_KEY_DER_PREFIX = new Uint8Array([ 48, 46, 2, 1, 0, 48, 5, 6, 3, 43, 101, 110, 4, 34, 4, 32 ]); async function deriveSecretNative({privateKey, remotePublicKey}) { const nodePrivateKey = crypto.createPrivateKey({ key: Buffer.concat([PRIVATE_KEY_DER_PREFIX, privateKey]), format: 'der', type: 'pkcs8' }); const nodePublicKey = crypto.createPublicKey({ key: Buffer.concat([PUBLIC_KEY_DER_PREFIX, remotePublicKey]), format: 'der', type: 'spki' }); return crypto.diffieHellman({ privateKey: nodePrivateKey, publicKey: nodePublicKey, }); } async function generateKeyPairNative() { const generateKeyPairAsync = promisify(crypto.generateKeyPair); const publicKeyEncoding = {format: 'der', type: 'spki'}; const privateKeyEncoding = {format: 'der', type: 'pkcs8'}; const {publicKey: publicDerBytes, privateKey: privateDerBytes} = await generateKeyPairAsync('x25519', { publicKeyEncoding, privateKeyEncoding }); const publicKey = publicDerBytes.slice(12, 12 + 32); const privateKey = privateDerBytes.slice(16, 16 + 32); return {publicKey, privateKey}; } let deriveSecret; let generateKeyPair; if(crypto.diffieHellman) { deriveSecret = deriveSecretNative; generateKeyPair = generateKeyPairNative; } else { deriveSecret = cryptoNacl.deriveSecret; generateKeyPair = cryptoNacl.generateKeyPair; } export {deriveSecret, generateKeyPair}; const {ed25519SecretKeyToX25519} = cryptoNacl; export {ed25519SecretKeyToX25519};