@okxweb3/coin-ethereum
Version:
An Ethereum SDK for building Web3 wallets and applications.
126 lines • 5.24 kB
JavaScript
;
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