fst – Rev 1

Subversion Repositories:
Rev:
'use strict';

const crypto = require('crypto')

// Always 16 for AES.
const IV_LENGTH = 16

function encrypt(text, secret) {
  secret = linearFeedback256(secret)
  let iv = crypto.randomBytes(IV_LENGTH)
  let cipher = crypto.createCipheriv('aes-256-cbc', new Buffer(secret), iv)
  let encrypted = cipher.update(text)

  encrypted = Buffer.concat([encrypted, cipher.final()]);

  return iv.toString('hex') + ':' + encrypted.toString('hex')
}

function decrypt(text, secret) {
  secret = linearFeedback256(secret)
  let textParts = text.toString().split(':')
  let iv = new Buffer(textParts.shift(), 'hex')
  let encryptedText = new Buffer(textParts.join(':'), 'hex')
  let decipher = crypto.createDecipheriv('aes-256-cbc', new Buffer(secret), iv)
  let decrypted = decipher.update(encryptedText)

  decrypted = Buffer.concat([decrypted, decipher.final()])

  return decrypted.toString()
}

// First 256 bytes, 32 characters linear feedback shift.
function linearFeedback256(secret) {
  do {
    secret = secret.repeat(2)
  } while(secret.length < 32)
  return secret.substr(0, 32)
}

module.exports = { decrypt, encrypt }