New encryption/decryption mechanism

This commit is contained in:
Daniel Lugo 2022-01-17 17:04:48 -04:00
parent 71fbd69024
commit d4dd47a334
2 changed files with 39 additions and 20 deletions

View file

@ -17,6 +17,7 @@ const Big = require('big.js').default
const { evolve } = require('ramda') const { evolve } = require('ramda')
const path = require('path') const path = require('path')
const cors = require('cors') const cors = require('cors')
const ECCrypto = require('eccrypto')
const getListPage = require('../utils/paginate') const getListPage = require('../utils/paginate')
const auth = require('../services/auth/auth') const auth = require('../services/auth/auth')
@ -46,7 +47,7 @@ module.exports = async (
_app, _app,
config, config,
mySocketsEvents, mySocketsEvents,
{ serverPort, CA, CA_KEY, useTLS } { serverPort, useTLS, CA, CA_KEY, runPrivateKey, runPublicKey }
) => { ) => {
/** /**
* @typedef {import('express').Application} Application * @typedef {import('express').Application} Application
@ -100,7 +101,8 @@ module.exports = async (
const APIStatus = { const APIStatus = {
message: APIHealth.data, message: APIHealth.data,
responseTime: APIHealth.headers['x-response-time'], responseTime: APIHealth.headers['x-response-time'],
success: true success: true,
encryptionPublicKey: runPublicKey.toString('base64')
} }
return { return {
LNDStatus, LNDStatus,
@ -112,7 +114,8 @@ module.exports = async (
const APIStatus = { const APIStatus = {
message: err?.response?.data, message: err?.response?.data,
responseTime: err?.response?.headers['x-response-time'], responseTime: err?.response?.headers['x-response-time'],
success: false success: false,
encryptionPublicKey: runPublicKey.toString('base64')
} }
logger.warn('Failed to retrieve API status', APIStatus) logger.warn('Failed to retrieve API status', APIStatus)
return { return {
@ -270,13 +273,15 @@ module.exports = async (
logger.info('Decrypting ECC message...') logger.info('Decrypting ECC message...')
const decryptedMessage = await ECC.decryptMessage({ const asBuffers = await ECC.convertToEncryptedMessage(req.body)
deviceId,
encryptedMessage: req.body const decryptedMessage = await ECCrypto.decrypt(
}) runPrivateKey,
asBuffers
)
// eslint-disable-next-line // eslint-disable-next-line
req.body = JSON.parse(decryptedMessage) req.body = JSON.parse(decryptedMessage.toString('utf8'))
return next() return next()
} catch (err) { } catch (err) {

View file

@ -2,6 +2,20 @@
* @prettier * @prettier
*/ */
// @ts-check // @ts-check
const ECCrypto = require('eccrypto')
const ECC = require('../utils/ECC')
/**
* This API run's private key.
*/
const runPrivateKey = ECCrypto.generatePrivate()
/**
* This API run's public key.
*/
const runPublicKey = ECCrypto.getPublic(runPrivateKey)
process.on('uncaughtException', e => { process.on('uncaughtException', e => {
console.log('something bad happened!') console.log('something bad happened!')
console.log(e) console.log(e)
@ -21,7 +35,6 @@ const server = program => {
const { Logger: CommonLogger } = require('shock-common') const { Logger: CommonLogger } = require('shock-common')
const binaryParser = require('socket.io-msgpack-parser') const binaryParser = require('socket.io-msgpack-parser')
const ECC = require('../utils/ECC')
const LightningServices = require('../utils/lightningServices') const LightningServices = require('../utils/lightningServices')
const app = Express() const app = Express()
@ -117,20 +130,19 @@ const server = program => {
// TODO // TODO
} }
const authorized = ECC.isAuthorizedDevice({ const authorized = ECC.devicePublicKeys.has(deviceId)
deviceId
})
// Using classic promises syntax to avoid // Using classic promises syntax to avoid
// modifying res.send's return type // modifying res.send's return type
if (authorized && process.env.SHOCK_ENCRYPTION_ECC !== 'false') { if (authorized && process.env.SHOCK_ENCRYPTION_ECC !== 'false') {
ECC.encryptMessage({ const devicePub = Buffer.from(ECC.devicePublicKeys.get(deviceId))
deviceId,
message: args[0] ECCrypto.encrypt(devicePub, Buffer.from(args[0], 'utf-8')).then(
}).then(encryptedMessage => { encryptedMessage => {
args[0] = JSON.stringify(encryptedMessage) args[0] = JSON.stringify(encryptedMessage)
oldSend.apply(res, args) oldSend.apply(res, args)
}) }
)
} }
if (!authorized || process.env.SHOCK_ENCRYPTION_ECC === 'false') { if (!authorized || process.env.SHOCK_ENCRYPTION_ECC === 'false') {
@ -337,7 +349,9 @@ const server = program => {
serverPort, serverPort,
useTLS: program.useTLS, useTLS: program.useTLS,
CA, CA,
CA_KEY CA_KEY,
runPrivateKey,
runPublicKey
} }
) )