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