UNPKG

@okxweb3/coin-ethereum

Version:

An Ethereum SDK for building Web3 wallets and applications.

126 lines 5.24 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getEncryptionPublicKey = exports.decryptSafely = exports.decrypt = exports.encryptSafely = exports.encrypt = void 0; const nacl = require('./nacl-fast'); const naclUtil = require('./nacl-util'); const index_1 = require("./index"); function encrypt({ publicKey, data, version, }) { if ((0, index_1.isNullish)(publicKey)) { throw new Error('Missing publicKey parameter'); } else if ((0, index_1.isNullish)(data)) { throw new Error('Missing data parameter'); } else if ((0, index_1.isNullish)(version)) { throw new Error('Missing version parameter'); } switch (version) { case 'x25519-xsalsa20-poly1305': { const ephemeralKeyPair = nacl.box.keyPair(); let pubKeyUInt8Array; try { pubKeyUInt8Array = naclUtil.decodeBase64(publicKey); } catch (err) { throw new Error('Bad public key'); } const msgParamsUInt8Array = naclUtil.decodeUTF8(data); const nonce = nacl.randomBytes(nacl.box.nonceLength); const encryptedMessage = nacl.box(msgParamsUInt8Array, nonce, pubKeyUInt8Array, ephemeralKeyPair.secretKey); const output = { version: 'x25519-xsalsa20-poly1305', nonce: naclUtil.encodeBase64(nonce), ephemPublicKey: naclUtil.encodeBase64(ephemeralKeyPair.publicKey), ciphertext: naclUtil.encodeBase64(encryptedMessage), }; return output; } default: throw new Error('Encryption type/version not supported'); } } exports.encrypt = encrypt; function encryptSafely({ publicKey, data, version, }) { if ((0, index_1.isNullish)(publicKey)) { throw new Error('Missing publicKey parameter'); } else if ((0, index_1.isNullish)(data)) { throw new Error('Missing data parameter'); } else if ((0, index_1.isNullish)(version)) { throw new Error('Missing version parameter'); } const DEFAULT_PADDING_LENGTH = 2 ** 11; const NACL_EXTRA_BYTES = 16; if (typeof data === 'object' && 'toJSON' in data) { throw new Error('Cannot encrypt with toJSON property. Please remove toJSON property'); } const dataWithPadding = { data, padding: '', }; const dataLength = Buffer.byteLength(JSON.stringify(dataWithPadding), 'utf-8'); const modVal = dataLength % DEFAULT_PADDING_LENGTH; let padLength = 0; if (modVal > 0) { padLength = DEFAULT_PADDING_LENGTH - modVal - NACL_EXTRA_BYTES; } dataWithPadding.padding = '0'.repeat(padLength); const paddedMessage = JSON.stringify(dataWithPadding); return encrypt({ publicKey, data: paddedMessage, version }); } exports.encryptSafely = encryptSafely; function decrypt({ encryptedData, privateKey, }) { if ((0, index_1.isNullish)(encryptedData)) { throw new Error('Missing encryptedData parameter'); } else if ((0, index_1.isNullish)(privateKey)) { throw new Error('Missing privateKey parameter'); } switch (encryptedData.version) { case 'x25519-xsalsa20-poly1305': { const recieverPrivateKeyUint8Array = nacl_decodeHex(privateKey); const recieverEncryptionPrivateKey = nacl.box.keyPair.fromSecretKey(recieverPrivateKeyUint8Array).secretKey; const nonce = naclUtil.decodeBase64(encryptedData.nonce); const ciphertext = naclUtil.decodeBase64(encryptedData.ciphertext); const ephemPublicKey = naclUtil.decodeBase64(encryptedData.ephemPublicKey); const decryptedMessage = nacl.box.open(ciphertext, nonce, ephemPublicKey, recieverEncryptionPrivateKey); let output; try { output = naclUtil.encodeUTF8(decryptedMessage); } catch (err) { throw new Error('Decryption failed.'); } if (output) { return output; } throw new Error('Decryption failed.'); } default: throw new Error('Encryption type/version not supported.'); } } exports.decrypt = decrypt; function decryptSafely({ encryptedData, privateKey, }) { if ((0, index_1.isNullish)(encryptedData)) { throw new Error('Missing encryptedData parameter'); } else if ((0, index_1.isNullish)(privateKey)) { throw new Error('Missing privateKey parameter'); } const dataWithPadding = JSON.parse(decrypt({ encryptedData, privateKey })); return dataWithPadding.data; } exports.decryptSafely = decryptSafely; function getEncryptionPublicKey(privateKey) { const privateKeyUint8Array = nacl_decodeHex(privateKey); const encryptionPublicKey = nacl.box.keyPair.fromSecretKey(privateKeyUint8Array).publicKey; return naclUtil.encodeBase64(encryptionPublicKey); } exports.getEncryptionPublicKey = getEncryptionPublicKey; function nacl_decodeHex(msgHex) { const msgBase64 = Buffer.from(msgHex, 'hex').toString('base64'); return naclUtil.decodeBase64(msgBase64); } //# sourceMappingURL=encryption.js.map