UNPKG

jsencrypt

Version:

A Javascript library to perform OpenSSL RSA Encryption, Decryption, and Key Generation.

266 lines (187 loc) 9.75 kB
var keySizes = [128, 256, 512, 1024]; var pbkeys = [ "-----BEGIN PUBLIC KEY-----\ MCwwDQYJKoZIhvcNAQEBBQADGwAwGAIRAMJYzPtURyEUNRX7j6bQhg8CAwEAAQ==\ -----END PUBLIC KEY-----", "-----BEGIN PUBLIC KEY-----\ MDwwDQYJKoZIhvcNAQEBBQADKwAwKAIhAKqSOLiJmFJZ9VaqAWbUGQLPK1dzkMUM\ i/fTISSSdKxZAgMBAAE=\ -----END PUBLIC KEY-----", "-----BEGIN PUBLIC KEY-----\ MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAOt7ZGR2Jb3aAe8xTWN/z9e5KL0MTn34\ gtCweIbnCc9BE+0z6WJVhnXRBgukdmB7iidrQInZDcDNxiZGFjI8ubMCAwEAAQ==\ -----END PUBLIC KEY-----", "-----BEGIN PUBLIC KEY-----\ MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyuL7vgD69afw7jYLnJdbDPWr5\ BIlt8lmt9IfzjOYJ/YJkTrAuk/ZEEOvuPA4TVflOCuwJtT6oZlb8E8HOh82j5LVM\ XFDzkHpjzBfO9OaT66j7RPADdxRpsGUmk2pEHoLk/EXK0lTtsGv0i8OFDVSyxjuf\ SCUGerkpV/+uafgJqwIDAQAB\ -----END PUBLIC KEY-----" ]; var prkeys = [ "-----BEGIN RSA PRIVATE KEY-----\ MGQCAQACEQDCWMz7VEchFDUV+4+m0IYPAgMBAAECEBRARpPF02eZ0fSeC7z1P4EC\ CQDih/7h09mLQQIJANug/jPgzE1PAgkAxUrYa+pMT4ECCQCd460bin4VDQIJANdx\ V5Pdim/H\ -----END RSA PRIVATE KEY-----", "-----BEGIN RSA PRIVATE KEY-----\ MIGqAgEAAiEAqpI4uImYUln1VqoBZtQZAs8rV3OQxQyL99MhJJJ0rFkCAwEAAQIg\ AMaNb3lgse8qyGwZeYg5XOIBGEstbBHGR4moDB7CfWkCEQDcWO73QkRCx4cgXyRo\ 8itzAhEAxit+llKWGIBOZBSpkBKuAwIRAJwZdNE95NXaPGQ2grjGNvkCEBuQmT8X\ pcEqt7y8EwnzTzkCEEIIS4UUKS8ZDrxtOmYcgdA=\ -----END RSA PRIVATE KEY-----", "-----BEGIN RSA PRIVATE KEY-----\ MIIBOgIBAAJBAOt7ZGR2Jb3aAe8xTWN/z9e5KL0MTn34gtCweIbnCc9BE+0z6WJV\ hnXRBgukdmB7iidrQInZDcDNxiZGFjI8ubMCAwEAAQJAONQmfjglE5QxM1BqpMCL\ oDwHINh/eNcoesSb0bKgI2vSpbehdxTfVZ6P+i+U1CVRy2xUryWBu5pyOotyEdtS\ QQIhAPldH+5H0G9klbwjJu2L85ZW1QbHWOLrtiLWK14rfwWdAiEA8b+xc/ATCSvw\ vesWWP0GwW524zRqZh7VX+XU2Xpqw48CIHtLhEI41+J8BV0ktFa34BTxkhrr7hMl\ IMVQx9ikAQYxAiEA3AWqvSlQOfW6+y8+PKm1f1FJdQpcmCsR6mDkczceenMCIApw\ Y30Gma+YVSrIkkyd6lZMv+zxSNaBAblzm2o9Abfx\ -----END RSA PRIVATE KEY-----", "-----BEGIN RSA PRIVATE KEY-----\ MIICWwIBAAKBgQCyuL7vgD69afw7jYLnJdbDPWr5BIlt8lmt9IfzjOYJ/YJkTrAu\ k/ZEEOvuPA4TVflOCuwJtT6oZlb8E8HOh82j5LVMXFDzkHpjzBfO9OaT66j7RPAD\ dxRpsGUmk2pEHoLk/EXK0lTtsGv0i8OFDVSyxjufSCUGerkpV/+uafgJqwIDAQAB\ AoGAcwdvdO0A9J6zhoz1NNro2G6+XBosbgRu7gSWQA5uvP1aoD75LHF1LqgJgiNL\ F+zc8fsbor/x3SdJUyNQOSK1GnUtpnNXZV50XVk9mdJAWdgVWDcDUdKm7oQ2fbkv\ hjcTFZHUErXMi3zOQrWv5x5sd948Koq0Kg0ohIrOf8uhkQkCQQDX4IK8BHdfuNdz\ BohKsMFLdtQL06Lwz68qfplnFyQCKG+2zC2ALrkNAK/83x/+dFT84CiWzVDF5bFD\ TUMq+CYHAkEA0/Bfs9eXG5UnchvcMiNx6xlxtO9jT3Q5ZwVjjBly0QvdmXYRIcVi\ QF+D0pbNfi+YseNPLX/oJQDnbzYEbEK2PQJAJkQcyHk+M9CPGEujIyI70UWqBsKo\ EmmuEilIxfZbIqrKSqvcsOkXUk+54mgmwrMaUYzmhPy2Aa5agqSScG52RwJAGKK+\ XSdYV0p1NVxrsiBQo6VnhEK3Zor6CTGlKqnioM4iSi5hO224SAdSSW5iIKLjuvnT\ QFS35WU/gbvjs7nleQJAVSGtjX2HK4/yVU7dX+BCBiSrlReshr0So31l8fufydLw\ ahh8P6K19o8ysVAvZEnUECUlIR2Afpq5yabOCIkpbA==\ -----END RSA PRIVATE KEY-----" ]; $.each(keySizes, function(index, keySize){ var jse = new JSEncrypt({default_key_size:keySize}); var openssl_public_key = pbkeys[index]; var openssl_private_key = prkeys[index]; describe('JSEncrypt - '+keySize+' bit', function(){ //this.timeout(0); //Timout for test cases, zero means infinite. Needed for key sizes > 1024 describe('#getKey()', function(){ it('should be '+keySize+' bit long', function () { var key = jse.getKey(); var length = key.n.bitLength(); length = length%2===0 ? length: length+1; expect(length).to.equal(keySize); }); }); describe('#encrypt() | #decrypt()', function(){ //Tom Wu's RSA Object use paddingpkcs #1, type 2 var maxLength = (((jse.getKey().n.bitLength()+7)>>3)-11); var maxLengthBit = maxLength << 3; it('should encrypt/decrypt up to '+maxLengthBit+' bit', function () { var test = []; for (var i=0; i<maxLength;i++) test.push('a'); test = test.join(''); var encrypted = jse.encrypt(test); expect(encrypted).to.be.ok(); var decrypted = jse.decrypt(encrypted); expect(decrypted).to.be(test); }); it('should fail to encrypt more than '+maxLengthBit+' bit', function(){ var test = []; for (var i=0; i<(maxLength+1);i++) test.push('a'); test = test.join(''); var encrypted = jse.encrypt(test); expect(encrypted).to.not.be.ok(); }); }); describe('#getPublicKey()', function(){ var pkey = jse.getPublicKey(); it('should be a non-empty string', function(){ expect(pkey).to.be.a('string'); expect(pkey).to.not.be.empty(); }); it('should contain public header and footer and be wrapped at 64 chars', function(){ //For small bit keys, the public key may contain only one line var regex = /-----BEGIN PUBLIC KEY-----\n((.{64}\n)+(.{1,64}\n)?)|(.{1,64}\n)-----END PUBLIC KEY-----/; expect(pkey).to.match(regex); }); }); describe('#getPrivateKey()', function(){ var pkey = jse.getPrivateKey(); it('should be a non-empty string', function(){ expect(pkey).to.be.a('string'); expect(pkey).to.not.be.empty(); }); it('should contain private header and footer and be wrapped at 64 chars', function(){ var regex = /-----BEGIN RSA PRIVATE KEY-----\n(.{64}\n)+(.{1,64}\n)?-----END RSA PRIVATE KEY-----/; expect(pkey).to.match(regex); }); }); describe('#getPublicKeyB64()', function(){ var pkey = jse.getPublicKeyB64(); it('should be a non-empty string', function(){ expect(pkey).to.be.a('string'); expect(pkey).to.not.be.empty(); }); it('should not contain public header and footer,one line, base64 encoded', function(){ //regex to match base64 encoded string, reference: //http://stackoverflow.com/a/5885097/1446321 var regex = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$/; expect(pkey).to.match(regex); }); }); describe('#getPrivateKeyB64()', function(){ var pkey = jse.getPrivateKeyB64(); it('should be a non-empty string', function(){ expect(pkey).to.be.a('string'); expect(pkey).to.not.be.empty(); }); it('should not contain private header and footer,one line, base64 encoded', function(){ //regex to match base64 encoded string, reference: //http://stackoverflow.com/a/5885097/1446321 var regex = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$/; expect(pkey).to.match(regex); }); }); describe('#setPrivateKey()', function(){ var tmp = new JSEncrypt(); tmp.setPrivateKey(openssl_private_key); it('should correctly set the private key parameters',function(){ var params = ['n', 'e', 'd', 'p', 'q', 'dmp1', 'dmq1', 'coeff']; expect(tmp.key).to.be.ok(); expect(tmp.key).to.have.keys(params); $.each(params, function(index,value){ expect(tmp.key[value]).to.be.ok(); }); }); it('should both encrypt and decrypt',function(){ var test = 'test'; var enc = tmp.encrypt(test); expect(enc).to.be.ok(); var dec = tmp.decrypt(enc); expect(dec).to.be(test); }); }); describe('#setPublicKey()', function(){ var tmp = new JSEncrypt(); tmp.setPublicKey(openssl_public_key); it('should correctly set the public key parameters',function(){ var pub_params = ['n', 'e']; var priv_params = ['d', 'p', 'q', 'dmp1', 'dmq1', 'coeff']; expect(tmp.key).to.be.ok(); expect(tmp.key).to.have.keys(pub_params); $.each(pub_params, function(index,value){ expect(tmp.key[value]).to.be.ok(); }); $.each(priv_params, function(index,value){ expect(tmp.key[value]).to.not.be.ok(); }); }); it('should only encrypt',function(){ var test = 'test'; var enc = tmp.encrypt(test); var dec = tmp.decrypt(enc); expect(enc).to.be.ok(); expect(dec).to.not.be.ok(); }); }); }); });