/*
  Developed by Alexander Wilhelm.

  Commercial License.
*/
function Encryption()
{
this.key_public=null;
this.key_private=null;
this.lastAction=0;
this.error=false;
}
function create_keypair_(password)
{
var start=new Date();
var rsa=new RSAKey();
rsa.generate(1024,"10001");
var key_private=rsa.n.toString(16)+":"+rsa.d.toString(16)+":"+rsa.p.toString(16)+":"+rsa.q.toString(16);
this.key_public=encodeBase64(rsa.n.toString(16));
this.key_private=encodeBase64(AESEncryptCtr(key_private,str_sha256(password),256));
var end=new Date();
this.lastAction=end-start;
}
function encrypt_msg_(msg_plain)
{
var start=new Date();
var rsa=new RSAKey();
var rnd=new SecureRandom();
var rnd_bytes=new Array(256);
var msg_cipher=new Array(3);
rsa.setPublic(decodeBase64(this.key_public),"10001");
rnd.nextBytes(rnd_bytes);
var key_random=hex_sha256(hex_sha256(decodeHex(byteArrayToHexStr(rnd_bytes)))+hex_sha256(msg_plain[0]+"\n"+msg_plain[1]));
msg_cipher[0]=rsa.encrypt(key_random);
msg_cipher[0]=encodeBase64(msg_cipher[0]);
msg_cipher[1]=encodeBase64(AESEncryptCtr(encodeUTF8(msg_plain[0]),key_random,256));
msg_cipher[2]=encodeBase64(AESEncryptCtr(encodeUTF8(msg_plain[1]),key_random,256));
var end=new Date();
this.lastAction=end-start;
return msg_cipher;
}
function decrypt_msg_(msg_cipher,password)
{
var start=new Date();
var rsa=new RSAKey();
var msg_plain=new Array(2);
var key_private=AESDecryptCtr(decodeBase64(this.key_private),str_sha256(password),256);
if(key_private.match(/^[a-f0-9\:]+$/)!=key_private)
{
this.error=true;
var end=new Date();
this.lastAction=end-start;
return new Array(2);
}
var key_private=key_private.split(":");
rsa.setPrivateEx(key_private[0],"10001",key_private[1],key_private[2],key_private[3]);
var key_random=rsa.decrypt(decodeBase64(msg_cipher[0]));
if(key_random!=null)
{
msg_plain[0]=filter_(AESDecryptCtr(decodeBase64(msg_cipher[1]),key_random,256));
msg_plain[1]=filter_(AESDecryptCtr(decodeBase64(msg_cipher[2]),key_random,256));
var end=new Date();
this.lastAction=end-start;
return msg_plain;
}
else
{
this.error=true;
var end=new Date();
this.lastAction=end-start;
return new Array(2);
}
}
function recrypt_keypair_(password,new_password)
{
var start=new Date();
var key_private=AESDecryptCtr(decodeBase64(this.key_private),str_sha256(password),256);
this.key_private=encodeBase64(AESEncryptCtr(key_private,str_sha256(new_password),256));
var end=new Date();
this.lastAction=end-start;
if(privateKey==null)
{
this.error=true;
}
}
function fingerprint_(key)
{
var fingerprint="";
var fingerprint_pure=hex_sha256(key);
fingerprint_pure=fingerprint_pure.toUpperCase();
for(var i=0;i<16;i++){
fingerprint=fingerprint+fingerprint_pure.substr(i*8,8)+' ';
}
return fingerprint;
}
function filter_(input)
{
output=input.replace(/>/g,"&gt;");
output=output.replace(/</g,"&lt;");
output=output.replace(/\&#10;/g,"<br />");
return output;
}
Encryption.prototype.create_keypair=create_keypair_;
Encryption.prototype.encrypt_msg=encrypt_msg_;
Encryption.prototype.decrypt_msg=decrypt_msg_;
Encryption.prototype.recrypt_keypair=recrypt_keypair_;
Encryption.prototype.fingerprint=fingerprint_;
