    var loadTime = (new Date()).getTime();  
    var key;
    var prng;
        
    
    function setKey() {
    
    	    var s = document.addForm.key.value;
    	    var hexDigits = "0123456789abcdefABCDEF";
	    var hs = "", i, bogus = false;

	    for (i = 0; i < s.length; i++) {
		var c = s.charAt(i);
		if (hexDigits.indexOf(c) >= 0) {
	    	    hs += c;
		} else {
		    bogus = true;
		}
	    }
	    if (bogus) {
	    	alert("Error: Improper character(s) in hexadecimal key.");
	    }
	    if (hs.length > (keySizeInBits / 4)) {
	    	//alert("Warning: hexadecimal key exceeds " +
		    //  (keySizeInBits / 4) + " digit maximum; truncated.");
		document.addForm.key.value = hs = hs.slice(0, 64);
	    } else {

	    	while (hs.length < (keySizeInBits / 4)) {
		    hs += "0";
		}
    	    }
	    key =  hexToByteArray(hs);
    //	}
    }
    
    function Generate_key() {
    	var i, j, k = "";
	
    	var i, j, k = "";
	
	addEntropyTime();
	var seed = keyFromEntropy();
	
    	var prng = new AESprng(seed);
	    var hexDigits = "0123456789ABCDEF";
	    
	    for (i = 0; i < 64; i++) {
	    	k += hexDigits.charAt(prng.nextInt(15));
	    }

    	document.addForm.key.value = k;
	delete prng;
    }
    
    function Encrypt_text() {
	var v, i;
	
    	if (document.addForm.key.value.length == 0) {
	   // alert("Please specify a key with which to encrypt the message.");
	    return;
	}
    	if (document.getElementById("txtLink").value.length == 0) {
	    //alert("No plain text to encrypt!  Please enter or paste plain text in the field above.");
	    return;
	}
    	document.getElementById("cipher").value = "";
    	setKey();

	addEntropyTime();
    	prng = new AESprng(keyFromEntropy());
	var plaintext = encode_utf8(document.getElementById("txtLink").value);
	
	//  Compute MD5 sum of message text and add to header
	
	md5_init();
	for (i = 0; i < plaintext.length; i++) {
	    md5_update(plaintext.charCodeAt(i));
	}
	md5_finish();
	var header = "";
	for (i = 0; i < digestBits.length; i++) {
	    header += String.fromCharCode(digestBits[i]);
	}
	
	
	i = plaintext.length;
	header += String.fromCharCode(i >>> 24);
	header += String.fromCharCode(i >>> 16);
	header += String.fromCharCode(i >>> 8);
	header += String.fromCharCode(i & 0xFF);

	var ct = rijndaelEncrypt(header + plaintext, key, "CBC");
    	    v = armour_hex(ct);
	document.getElementById("cipher").value = v;
	return v;
    	delete prng;
    }
    
    function determineArmourType(s) {
    	var kt, pcg, phex, pb64, pmin;
	
	pcg = s.indexOf(codegroupSentinel);
	phex = s.indexOf(hexSentinel);
	pb64 = s.indexOf(base64sent);
	if (pcg == -1) {
	    pcg = s.length;
	}
	if (phex == -1) {
	    phex = s.length;
	}
	if (pb64 == -1) {
	    pb64 = s.length;
	}
	pmin = Math.min(pcg, Math.min(phex, pb64));
	if (pmin < s.length) {
	    if (pmin == pcg) {
	    	kt = 0;
	    } else if (pmin == phex) {
	    	kt = 1;
	    } else {
	    	kt = 2;
	    }
	} else {
    		kt = 1;
	}
	return kt;
    }
    
    function Decrypt_text() {
	
    	if (document.addForm.key.value.length == 0) {
	   // alert("Please specify a key with which to decrypt the message.");
	    return;
	}
    	if (document.getElementById("cipher").value.length == 0) {
	    //alert("No cipher text to decrypt!  Please enter or paste cipher text in the field above.");
	    return;
	}
    	//document.getElementById("txtLink").value = "";
    	setKey();
	var ct = new Array(), kt;
	kt = determineArmourType(document.getElementById("cipher").value);
    	if (kt == 0) {
    	    ct = disarm_codegroup(document.getElementById("cipher").value);
	} else if (kt == 1) {
    	    ct = disarm_hex(document.getElementById("cipher").value);
	} else if (kt == 2) {
    	    ct = disarm_base64(document.getElementById("cipher").value);
	}

	var result = rijndaelDecrypt(ct, key, "CBC");
	
	var header = result.slice(0, 20);
	result = result.slice(20);
	
	var dl = (header[16] << 24) | (header[17] << 16) | (header[18] << 8) | header[19];
    	if ((dl < 0) || (dl > result.length)) {
	    //alert("Message (length " + result.length + ") truncated.  " +
	    //	dl + " characters expected.");
	    //	Try to sauve qui peut by setting length to entire message
    	    dl = result.length;
	}
	
	var i, plaintext = "";
	
	md5_init();
	for (i = 0; i < dl; i++) {
	    plaintext += String.fromCharCode(result[i]);
	    md5_update(result[i]);
	}
	md5_finish();

	for (i = 0; i < digestBits.length; i++) {
	    if (digestBits[i] != header[i]) {
	    //	alert("Message corrupted.  Checksum of decrypted message does not match.");
		break;
	    }
	}
	
	//  That's it; plug plaintext into the result field
	
	//document.getElementById("txtLink").value = decode_utf8(plaintext);
	return decode_utf8(plaintext);
    }
