1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-07-16 00:06:11 +00:00
seahub/media/js/client_crypto.js
llj df16f6f312 [v2] improvements ('random_key' --> 'file_key', and etc)
* 'KEEP_ENC_REPO_PASSWD' --> 'SERVER_CRYPTO'
* random_key --> file_key. added client_crypto.js
* file upload/update: don't encrypt when file size is 0
* combine 'sjcl.min.js' and 'codecBytes.js' into 'sjcl.js'
* added 'repo_create_js_fils.html', 'included' it
2013-10-17 11:04:19 +08:00

63 lines
2.3 KiB
JavaScript

var salt = sjcl.codec.bytes.toBits([0xda, 0x90, 0x45, 0xc3, 0x06, 0xc7, 0xcc, 0x26]);
// gen magic_str
function gen_magic_str(repo_id, passwd) {
var magic_array = sjcl.misc.pbkdf2(repo_id + passwd, salt, 1000, 32*8, null);
var magic_str = sjcl.codec.hex.fromBits(magic_array); //convert to hex
return magic_str;
}
function FileKey(passwd) {
this.passwd = passwd;
}
FileKey.prototype.pre = function() {
var passwd = this.passwd;
var key_array = sjcl.misc.pbkdf2(passwd, salt, 1000, 32*8, null);
var iv_array = sjcl.misc.pbkdf2(key_array, salt, 10, 32*8, null);
var key = sjcl.codec.hex.fromBits(key_array);
var iv = sjcl.codec.hex.fromBits(iv_array);
return {key: key, iv:iv};
};
// generate an encrypted file key
FileKey.prototype.gen_enc = function() {
var file_key_array;
if (window.crypto && window.crypto.getRandomValues) {
file_key_array = new Uint32Array(8);
window.crypto.getRandomValues(file_key_array);
} else {
file_key_array = [];
for (var i = 0; i < 8; i++) {
file_key_array.push(parseInt(Math.random() * Math.pow(2,32)));
}
}
var pre = this.pre();
var key = pre.key, iv = pre.iv;
var encrypted_file_key_obj = CryptoJS.AES.encrypt(CryptoJS.lib.WordArray.create(file_key_array), CryptoJS.enc.Hex.parse(key), {iv: CryptoJS.enc.Hex.parse(iv)});
var encrypted_file_key = encrypted_file_key_obj.ciphertext.toString(CryptoJS.enc.Hex); // convert to hex
return encrypted_file_key;
};
FileKey.prototype.decrypt = function(encrypted_file_key) {
var pre = this.pre();
var key = pre.key, iv = pre.iv;
var file_key_array = CryptoJS.AES.decrypt(CryptoJS.enc.Hex.parse(encrypted_file_key).toString(CryptoJS.enc.Base64), CryptoJS.enc.Hex.parse(key), {iv: CryptoJS.enc.Hex.parse(iv)});
var file_key = file_key_array.toString(CryptoJS.enc.Hex);
return file_key;
};
// gen key, iv: used in file encrypt/decrypt
function gen_enc_key_iv(file_key) {
var enc_key_array = sjcl.misc.pbkdf2(sjcl.codec.hex.toBits(file_key), salt, 1000, 32*8, null);
var enc_iv_array = sjcl.misc.pbkdf2(enc_key_array, salt, 10, 32*8, null);
var enc_key = sjcl.codec.hex.fromBits(enc_key_array);
var enc_iv = sjcl.codec.hex.fromBits(enc_iv_array);
return {key: enc_key, iv:enc_iv};
}