| /**
Requirements:
 - a initial string from which I create a key ($string)
 - for decryption:
   - given a base64 encoded string to be decrypted -> return clear text
 - for encryption:
   - given a clear Text -> return a base64 encoded string
 - every object is instanziated by the initial string:
   var encObj = new sswEncrypter($string);
   var aClearText = encObj.decrypt(base64encodedString);
   var aBase64EncodedString = encObj.encrypt(aClearText);
*/
var Crypto = require('crypto')
function pack_an_md5($string) {
    var hash = Crypto.createHash('md5');
    hash.update($string);
    var value = hash.digest('hex');
    var tpack = new Buffer(value,'hex');
    return tpack;
}
function encrypt(clearText,key,ivStr) {
    var iv = Crypto.randomBytes(16);
    if( ! (typeof ivStr === 'undefined') && (typeof ivStr === 'string')) {
	for(var i =0; i<ivStr.length && i<16; i++) {
	    iv[i] = ivStr.charCodeAt(i);
	}
	if(ivStr.length>=16) {
	    console.log('warning ivStr length is too much');
	}
    }
    var cipher = Crypto.createCipheriv('aes-128-cbc', new Buffer(key), iv);
    var encrypted = cipher.update(clearText);
    var finalBuffer = Buffer.concat([encrypted, cipher.final()]);
    //Need to retain IV for decryption, prepended, we know the length
    var encryptedHex = iv.toString('hex') + finalBuffer.toString('hex')
    return (new Buffer(encryptedHex,'hex')).toString('base64');
}
//var encryptedArray = encryptedHex.split(':');
function decryptHex(encryptedHex,key) {
    var encryptedArray = [encryptedHex.substr(0,32),encryptedHex.substr(32)];
    //console.log('encrypted arr',encryptedArray);
    var iv = new Buffer(encryptedArray[0], 'hex');
    var encrypted = new Buffer(encryptedArray[1], 'hex');
    var decipher = Crypto.createDecipheriv('aes-128-cbc', new Buffer(key), iv);
    var decrypted = decipher.update(encrypted);
    var clearText = Buffer.concat([decrypted, decipher.final()]).toString();
    return clearText;
}
var aes128Encrypter = function(string) {
    this.key = pack_an_md5(string);
}
aes128Encrypter.prototype = {
    encrypt: function(clearText,ivStr) {
	return encrypt(clearText,this.key,ivStr);
    },
    decrypt: function(base64EncodedString) {
	return decryptHex((new Buffer(base64EncodedString,'base64')).toString('hex'),this.key);
    },
    getIV: function(base64EncodedString) {
	var ivHex = (new Buffer(base64EncodedString,'base64')).toString('hex').substr(0,32);
	return new Buffer(ivHex,'hex');
    },
}
module.exports = aes128Encrypter;
 |