This commit is contained in:
Daniel Lugo 2021-12-12 10:40:25 -04:00
parent 4b74d5e13d
commit be14e77e01

View file

@ -1,6 +1,9 @@
const { Buffer } = require("buffer");
const Crypto = require("crypto");
const FieldError = require("../fieldError")
/**
* @format
*/
const { Buffer } = require('buffer')
const Crypto = require('crypto')
const FieldError = require('../fieldError')
/**
* @typedef {object} EncryptedMessageBuffer
@ -21,102 +24,108 @@ const FieldError = require("../fieldError")
*/
const generateRandomString = (length = 16) =>
new Promise((resolve, reject) => {
Crypto.randomBytes(length, (err, buffer) => {
if (err) {
reject(err)
return
}
new Promise((resolve, reject) => {
Crypto.randomBytes(length, (err, buffer) => {
if (err) {
reject(err)
return
}
const token = buffer.toString('hex')
resolve(token)
})
const token = buffer.toString('hex')
resolve(token)
})
})
/**
* @param {string} value
*/
const convertUTF8ToBuffer = (value) => Buffer.from(value, 'utf-8');
const convertUTF8ToBuffer = value => Buffer.from(value, 'utf-8')
/**
* @param {string} value
*/
const convertBase64ToBuffer = (value) => Buffer.from(value, 'base64');
const convertBase64ToBuffer = value => Buffer.from(value, 'base64')
/**
* @param {Buffer} buffer
*/
const convertBufferToBase64 = (buffer) => buffer.toString("base64");
const convertBufferToBase64 = buffer => buffer.toString('base64')
/**
* @param {Buffer | string} key
*/
const processKey = (key) => {
if (Buffer.isBuffer(key)) {
return key;
}
const convertedKey = convertBase64ToBuffer(key);
return convertedKey;
};
const processKey = key => {
if (Buffer.isBuffer(key)) {
return key
}
const convertedKey = convertBase64ToBuffer(key)
return convertedKey
}
/**
* @param {EncryptedMessageBuffer | EncryptedMessageResponse} encryptedMessage
* @returns {EncryptedMessageResponse}
*/
const convertToEncryptedMessageResponse = (encryptedMessage) => {
if (Buffer.isBuffer(encryptedMessage.ciphertext) &&
Buffer.isBuffer(encryptedMessage.iv) &&
Buffer.isBuffer(encryptedMessage.mac) &&
Buffer.isBuffer(encryptedMessage.ephemPublicKey)) {
return {
ciphertext: convertBufferToBase64(encryptedMessage.ciphertext),
iv: convertBufferToBase64(encryptedMessage.iv),
mac: convertBufferToBase64(encryptedMessage.mac),
ephemPublicKey: convertBufferToBase64(encryptedMessage.ephemPublicKey),
metadata: encryptedMessage.metadata
};
const convertToEncryptedMessageResponse = encryptedMessage => {
if (
Buffer.isBuffer(encryptedMessage.ciphertext) &&
Buffer.isBuffer(encryptedMessage.iv) &&
Buffer.isBuffer(encryptedMessage.mac) &&
Buffer.isBuffer(encryptedMessage.ephemPublicKey)
) {
return {
ciphertext: convertBufferToBase64(encryptedMessage.ciphertext),
iv: convertBufferToBase64(encryptedMessage.iv),
mac: convertBufferToBase64(encryptedMessage.mac),
ephemPublicKey: convertBufferToBase64(encryptedMessage.ephemPublicKey),
metadata: encryptedMessage.metadata
}
}
if (typeof encryptedMessage.ciphertext === "string") {
// @ts-ignore
return encryptedMessage;
}
if (typeof encryptedMessage.ciphertext === 'string') {
// @ts-ignore
return encryptedMessage
}
throw new FieldError({
field: "encryptedMessage",
message: "Unknown encrypted message format"
});
};
throw new FieldError({
field: 'encryptedMessage',
message: 'Unknown encrypted message format'
})
}
/**
* @param {EncryptedMessageBuffer | EncryptedMessageResponse} encryptedMessage
* @returns {EncryptedMessageBuffer}
*/
const convertToEncryptedMessage = (encryptedMessage) => {
if (encryptedMessage.ciphertext instanceof Buffer &&
encryptedMessage.iv instanceof Buffer &&
encryptedMessage.mac instanceof Buffer &&
encryptedMessage.ephemPublicKey instanceof Buffer) {
// @ts-ignore
return encryptedMessage;
const convertToEncryptedMessage = encryptedMessage => {
if (
encryptedMessage.ciphertext instanceof Buffer &&
encryptedMessage.iv instanceof Buffer &&
encryptedMessage.mac instanceof Buffer &&
encryptedMessage.ephemPublicKey instanceof Buffer
) {
// @ts-ignore
return encryptedMessage
}
if (
typeof encryptedMessage.ciphertext === 'string' &&
typeof encryptedMessage.iv === 'string' &&
typeof encryptedMessage.mac === 'string' &&
typeof encryptedMessage.ephemPublicKey === 'string'
) {
return {
ciphertext: convertBase64ToBuffer(encryptedMessage.ciphertext),
iv: convertBase64ToBuffer(encryptedMessage.iv),
mac: convertBase64ToBuffer(encryptedMessage.mac),
ephemPublicKey: convertBase64ToBuffer(encryptedMessage.ephemPublicKey),
metadata: encryptedMessage.metadata
}
if (typeof encryptedMessage.ciphertext === "string" &&
typeof encryptedMessage.iv === "string" &&
typeof encryptedMessage.mac === "string" &&
typeof encryptedMessage.ephemPublicKey === "string") {
return {
ciphertext: convertBase64ToBuffer(encryptedMessage.ciphertext),
iv: convertBase64ToBuffer(encryptedMessage.iv),
mac: convertBase64ToBuffer(encryptedMessage.mac),
ephemPublicKey: convertBase64ToBuffer(encryptedMessage.ephemPublicKey),
metadata: encryptedMessage.metadata
};
}
throw new FieldError({
field: "encryptedMessage",
message: "Unknown encrypted message format"
});
};
}
throw new FieldError({
field: 'encryptedMessage',
message: 'Unknown encrypted message format'
})
}
module.exports = {
generateRandomString,
@ -125,5 +134,5 @@ module.exports = {
convertBufferToBase64,
convertToEncryptedMessage,
convertToEncryptedMessageResponse,
processKey,
processKey
}