/**
* Creates a 40-bit or 128-bit WEP key.
*
* @param length Length of the WEP key. Either 40 or 128 (default). (Optional)
* @return Returns a string.
* @author Alan McCollough (amccollough@anmc.org)
* @version 1, September 21, 2004
*/
function createWEPKey() {
var baseKey = "";
var key = "";
var defaultLength = 128;
var length = defaultLength;
/* If user has passed in a specfic key length, and they want a 40-bit key,
change the value of length to 40 instead of 128.
Of course, a 40-bit WEP key is trivial to crack, but that is not my problem. */
if (arrayLen(arguments) eq 1) {
if(val(arguments[1]) eq 40)
length = 40;
}
/*
CF generated UUIDs look like this:
73B96C47-F5F1-0F5C-488C7C5170101FA0
8 chars - 4 chars - 4 chars - 16 chars
First off, generate a base key
*/
baseKey = mid(createUUID(),20,16) & mid(createUUID(),15,4) & mid(createUUID(),10,4) & mid(createUUID(),25,2);
/* Create a 40-bit or 128-bit key, as the user requested */
switch(length) {
case "40": {
key = mid(baseKey,10,10);
break;
}
case "128": {
key = baseKey;
break;
}
} //end switch
return key;
}
/**
* Generates a password the length you specify.
*
* @param numberOfCharacters Lengh for the generated password.
* @return Returns a string.
* @author Tony Blackmon (fluid@sc.rr.com)
* @version 1, April 25, 2002
*/
function generatePassword(numberofCharacters) {
var placeCharacter = "";
var currentPlace=0;
var group=0;
var subGroup=0;
for(currentPlace=1; currentPlace lte numberofCharacters; currentPlace = currentPlace+1) {
group = randRange(1,4);
switch(group) {
case "1":
subGroup = rand();
switch(subGroup) {
case "0":
placeCharacter = placeCharacter & chr(randRange(33,46));
break;
case "1":
placeCharacter = placeCharacter & chr(randRange(58,64));
break;
}
case "2":
placeCharacter = placeCharacter & chr(randRange(97,122));
break;
case "3":
placeCharacter = placeCharacter & chr(randRange(65,90));
break;
case "4":
placeCharacter = placeCharacter & chr(randRange(48,57));
break;
}
}
return placeCharacter;
}
/**
* Decryption of the Password for an IPSWITCH IMail-Account (Tested for IMail 6).
* The algorithm is from http://www.w00w00.org/advisories/imailpass.html.
* Thanks to Mike Davis who discovered this algorithem.
*
* @param stAccountname iMail account name. (Required)
* @param stEncryptedPassword iMail encryptes password. (Required)
* @return Returns a string.
* @author Stephan Scheele (stephan@stephan-t-scheele.de)
* @version 1, June 26, 2002
*/
function iMailPasswordDecryption(stAccountname, stEncryptedPassword){
/** Building the ASCII-Encryted - Structure */
var stASCII_Encrypted=structNew();
/** Build the Account-Array */
var aAccount=ArrayNew(2);
/** Convert every letter to ASCII */
var stTempAccountname=LCase(stAccountname);
/** Build the Password-Encryped Array */
var aPassword=ArrayNew(1);
var stTEMPEncryptedPassword=stEncryptedPassword;
var aASCIIResult = ArrayNew(1);
var zaehler=1;
var Loop=1;
var intASCII_difference="";
var stringPassword="";
StructInsert(stASCII_Encrypted, "00", -97);
StructInsert(stASCII_Encrypted, "01", -96);
StructInsert(stASCII_Encrypted, "02", -95);
StructInsert(stASCII_Encrypted, "03", -94);
StructInsert(stASCII_Encrypted, "04", -93);
StructInsert(stASCII_Encrypted, "05", -92);
StructInsert(stASCII_Encrypted, "06", -91);
StructInsert(stASCII_Encrypted, "07", -90);
StructInsert(stASCII_Encrypted, "08", -89);
StructInsert(stASCII_Encrypted, "09", -88);
StructInsert(stASCII_Encrypted, "0A", -87);
StructInsert(stASCII_Encrypted, "0B", -86);
StructInsert(stASCII_Encrypted, "0C", -85);
StructInsert(stASCII_Encrypted, "0D", -84);
StructInsert(stASCII_Encrypted, "0E", -83);
StructInsert(stASCII_Encrypted, "0F", -82);
StructInsert(stASCII_Encrypted, "10", -81);
StructInsert(stASCII_Encrypted, "11", -80);
StructInsert(stASCII_Encrypted, "12", -79);
StructInsert(stASCII_Encrypted, "13", -78);
StructInsert(stASCII_Encrypted, "14", -77);
StructInsert(stASCII_Encrypted, "15", -76);
StructInsert(stASCII_Encrypted, "16", -75);
StructInsert(stASCII_Encrypted, "17", -74);
StructInsert(stASCII_Encrypted, "18", -73);
StructInsert(stASCII_Encrypted, "19", -72);
StructInsert(stASCII_Encrypted, "1A", -71);
StructInsert(stASCII_Encrypted, "1B", -70);
StructInsert(stASCII_Encrypted, "1C", -69);
StructInsert(stASCII_Encrypted, "1D", -68);
StructInsert(stASCII_Encrypted, "1E", -67);
StructInsert(stASCII_Encrypted, "1F", -66);
StructInsert(stASCII_Encrypted, "20", -65);
StructInsert(stASCII_Encrypted, "21", -64);
StructInsert(stASCII_Encrypted, "22", -63);
StructInsert(stASCII_Encrypted, "23", -62);
StructInsert(stASCII_Encrypted, "24", -61);
StructInsert(stASCII_Encrypted, "25", -60);
StructInsert(stASCII_Encrypted, "26", -59);
StructInsert(stASCII_Encrypted, "27", -58);
StructInsert(stASCII_Encrypted, "28", -57);
StructInsert(stASCII_Encrypted, "29", -56);
StructInsert(stASCII_Encrypted, "2A", -55);
StructInsert(stASCII_Encrypted, "2B", -54);
StructInsert(stASCII_Encrypted, "2C", -53);
StructInsert(stASCII_Encrypted, "2D", -52);
StructInsert(stASCII_Encrypted, "2E", -51);
StructInsert(stASCII_Encrypted, "2F", -50);
StructInsert(stASCII_Encrypted, "30", -49);
StructInsert(stASCII_Encrypted, "31", -48);
StructInsert(stASCII_Encrypted, "32", -47);
StructInsert(stASCII_Encrypted, "33", -46);
StructInsert(stASCII_Encrypted, "34", -45);
StructInsert(stASCII_Encrypted, "35", -44);
StructInsert(stASCII_Encrypted, "36", -43);
StructInsert(stASCII_Encrypted, "37", -42);
StructInsert(stASCII_Encrypted, "38", -41);
StructInsert(stASCII_Encrypted, "39", -40);
StructInsert(stASCII_Encrypted, "3A", -39);
StructInsert(stASCII_Encrypted, "3B", -38);
StructInsert(stASCII_Encrypted, "3C", -37);
StructInsert(stASCII_Encrypted, "3D", -36);
StructInsert(stASCII_Encrypted, "3E", -35);
StructInsert(stASCII_Encrypted, "3F", -34);
StructInsert(stASCII_Encrypted, "40", -33);
StructInsert(stASCII_Encrypted, "41", -32);
StructInsert(stASCII_Encrypted, "42", -31);
StructInsert(stASCII_Encrypted, "43", -30);
StructInsert(stASCII_Encrypted, "44", -29);
StructInsert(stASCII_Encrypted, "45", -28);
StructInsert(stASCII_Encrypted, "46", -27);
StructInsert(stASCII_Encrypted, "47", -26);
StructInsert(stASCII_Encrypted, "48", -25);
StructInsert(stASCII_Encrypted, "49", -24);
StructInsert(stASCII_Encrypted, "4A", -23);
StructInsert(stASCII_Encrypted, "4B", -22);
StructInsert(stASCII_Encrypted, "4C", -21);
StructInsert(stASCII_Encrypted, "4D", -20);
StructInsert(stASCII_Encrypted, "4E", -19);
StructInsert(stASCII_Encrypted, "4F", -18);
StructInsert(stASCII_Encrypted, "50", -17);
StructInsert(stASCII_Encrypted, "51", -16);
StructInsert(stASCII_Encrypted, "52", -15);
StructInsert(stASCII_Encrypted, "53", -14);
StructInsert(stASCII_Encrypted, "54", -13);
StructInsert(stASCII_Encrypted, "55", -12);
StructInsert(stASCII_Encrypted, "56", -11);
StructInsert(stASCII_Encrypted, "57", -10);
StructInsert(stASCII_Encrypted, "58", -9);
StructInsert(stASCII_Encrypted, "59", -8);
StructInsert(stASCII_Encrypted, "5A", -7);
StructInsert(stASCII_Encrypted, "5B", -6);
StructInsert(stASCII_Encrypted, "5C", -5);
StructInsert(stASCII_Encrypted, "5D", -4);
StructInsert(stASCII_Encrypted, "5E", -3);
StructInsert(stASCII_Encrypted, "5F", -2);
StructInsert(stASCII_Encrypted, "60", -1);
StructInsert(stASCII_Encrypted, "61", 0);
StructInsert(stASCII_Encrypted, "62", 1);
StructInsert(stASCII_Encrypted, "63", 2);
StructInsert(stASCII_Encrypted, "64", 3);
StructInsert(stASCII_Encrypted, "65", 4);
StructInsert(stASCII_Encrypted, "66", 5);
StructInsert(stASCII_Encrypted, "67", 6);
StructInsert(stASCII_Encrypted, "68", 7);
StructInsert(stASCII_Encrypted, "69", 8);
StructInsert(stASCII_Encrypted, "6A", 9);
StructInsert(stASCII_Encrypted, "6B", 10);
StructInsert(stASCII_Encrypted, "6C", 11);
StructInsert(stASCII_Encrypted, "6D", 12);
StructInsert(stASCII_Encrypted, "6E", 13);
StructInsert(stASCII_Encrypted, "6F", 14);
StructInsert(stASCII_Encrypted, "70", 15);
StructInsert(stASCII_Encrypted, "71", 16);
StructInsert(stASCII_Encrypted, "72", 17);
StructInsert(stASCII_Encrypted, "73", 18);
StructInsert(stASCII_Encrypted, "74", 19);
StructInsert(stASCII_Encrypted, "75", 20);
StructInsert(stASCII_Encrypted, "76", 21);
StructInsert(stASCII_Encrypted, "77", 22);
StructInsert(stASCII_Encrypted, "78", 23);
StructInsert(stASCII_Encrypted, "79", 24);
StructInsert(stASCII_Encrypted, "7A", 25);
StructInsert(stASCII_Encrypted, "7B", 26);
StructInsert(stASCII_Encrypted, "7C", 27);
StructInsert(stASCII_Encrypted, "7D", 28);
StructInsert(stASCII_Encrypted, "7E", 29);
StructInsert(stASCII_Encrypted, "7F", 30);
StructInsert(stASCII_Encrypted, "80", 31);
StructInsert(stASCII_Encrypted, "81", 32);
StructInsert(stASCII_Encrypted, "82", 33);
StructInsert(stASCII_Encrypted, "83", 34);
StructInsert(stASCII_Encrypted, "84", 35);
StructInsert(stASCII_Encrypted, "85", 36);
StructInsert(stASCII_Encrypted, "86", 37);
StructInsert(stASCII_Encrypted, "87", 38);
StructInsert(stASCII_Encrypted, "88", 39);
StructInsert(stASCII_Encrypted, "89", 40);
StructInsert(stASCII_Encrypted, "8A", 41);
StructInsert(stASCII_Encrypted, "8B", 42);
StructInsert(stASCII_Encrypted, "8C", 43);
StructInsert(stASCII_Encrypted, "8D", 44);
StructInsert(stASCII_Encrypted, "8E", 45);
StructInsert(stASCII_Encrypted, "8F", 46);
StructInsert(stASCII_Encrypted, "90", 47);
StructInsert(stASCII_Encrypted, "91", 48);
StructInsert(stASCII_Encrypted, "92", 49);
StructInsert(stASCII_Encrypted, "93", 50);
StructInsert(stASCII_Encrypted, "94", 51);
StructInsert(stASCII_Encrypted, "95", 52);
StructInsert(stASCII_Encrypted, "96", 53);
StructInsert(stASCII_Encrypted, "97", 54);
StructInsert(stASCII_Encrypted, "98", 55);
StructInsert(stASCII_Encrypted, "99", 56);
StructInsert(stASCII_Encrypted, "9A", 57);
StructInsert(stASCII_Encrypted, "9B", 58);
StructInsert(stASCII_Encrypted, "9C", 59);
StructInsert(stASCII_Encrypted, "9D", 60);
StructInsert(stASCII_Encrypted, "9E", 61);
StructInsert(stASCII_Encrypted, "9F", 62);
StructInsert(stASCII_Encrypted, "A0", 63);
StructInsert(stASCII_Encrypted, "A1", 64);
StructInsert(stASCII_Encrypted, "A2", 65);
StructInsert(stASCII_Encrypted, "A3", 66);
StructInsert(stASCII_Encrypted, "A4", 67);
StructInsert(stASCII_Encrypted, "A5", 68);
StructInsert(stASCII_Encrypted, "A6", 69);
StructInsert(stASCII_Encrypted, "A7", 70);
StructInsert(stASCII_Encrypted, "A8", 71);
StructInsert(stASCII_Encrypted, "A9", 72);
StructInsert(stASCII_Encrypted, "AA", 73);
StructInsert(stASCII_Encrypted, "AB", 74);
StructInsert(stASCII_Encrypted, "AC", 75);
StructInsert(stASCII_Encrypted, "AD", 76);
StructInsert(stASCII_Encrypted, "AE", 77);
StructInsert(stASCII_Encrypted, "AF", 78);
StructInsert(stASCII_Encrypted, "B0", 79);
StructInsert(stASCII_Encrypted, "B1", 80);
StructInsert(stASCII_Encrypted, "B2", 81);
StructInsert(stASCII_Encrypted, "B3", 82);
StructInsert(stASCII_Encrypted, "B4", 83);
StructInsert(stASCII_Encrypted, "B5", 84);
StructInsert(stASCII_Encrypted, "B6", 85);
StructInsert(stASCII_Encrypted, "B7", 86);
StructInsert(stASCII_Encrypted, "B8", 87);
StructInsert(stASCII_Encrypted, "B9", 88);
StructInsert(stASCII_Encrypted, "BA", 89);
StructInsert(stASCII_Encrypted, "BB", 90);
StructInsert(stASCII_Encrypted, "BC", 91);
StructInsert(stASCII_Encrypted, "BD", 92);
StructInsert(stASCII_Encrypted, "BE", 93);
StructInsert(stASCII_Encrypted, "BF", 94);
StructInsert(stASCII_Encrypted, "C0", 95);
StructInsert(stASCII_Encrypted, "C1", 96);
StructInsert(stASCII_Encrypted, "C2", 97);
StructInsert(stASCII_Encrypted, "C3", 98);
StructInsert(stASCII_Encrypted, "C4", 99);
StructInsert(stASCII_Encrypted, "C5", 100);
StructInsert(stASCII_Encrypted, "C6", 101);
StructInsert(stASCII_Encrypted, "C7", 102);
StructInsert(stASCII_Encrypted, "C8", 103);
StructInsert(stASCII_Encrypted, "C9", 104);
StructInsert(stASCII_Encrypted, "CA", 105);
StructInsert(stASCII_Encrypted, "CB", 106);
StructInsert(stASCII_Encrypted, "CC", 107);
StructInsert(stASCII_Encrypted, "CD", 108);
StructInsert(stASCII_Encrypted, "CE", 109);
StructInsert(stASCII_Encrypted, "CF", 110);
StructInsert(stASCII_Encrypted, "D0", 111);
StructInsert(stASCII_Encrypted, "D1", 112);
StructInsert(stASCII_Encrypted, "D2", 113);
StructInsert(stASCII_Encrypted, "D3", 114);
StructInsert(stASCII_Encrypted, "D4", 115);
StructInsert(stASCII_Encrypted, "D5", 116);
StructInsert(stASCII_Encrypted, "D6", 117);
StructInsert(stASCII_Encrypted, "D7", 118);
StructInsert(stASCII_Encrypted, "D8", 119);
StructInsert(stASCII_Encrypted, "D9", 120);
StructInsert(stASCII_Encrypted, "DA", 121);
StructInsert(stASCII_Encrypted, "DB", 122);
StructInsert(stASCII_Encrypted, "DC", 123);
StructInsert(stASCII_Encrypted, "DD", 124);
StructInsert(stASCII_Encrypted, "DE", 125);
StructInsert(stASCII_Encrypted, "DF", 126);
StructInsert(stASCII_Encrypted, "E0", 127);
StructInsert(stASCII_Encrypted, "E1", 128);
StructInsert(stASCII_Encrypted, "E2", 129);
StructInsert(stASCII_Encrypted, "E3", 130);
StructInsert(stASCII_Encrypted, "E4", 131);
StructInsert(stASCII_Encrypted, "E5", 132);
StructInsert(stASCII_Encrypted, "E6", 133);
StructInsert(stASCII_Encrypted, "E7", 134);
StructInsert(stASCII_Encrypted, "E8", 135);
StructInsert(stASCII_Encrypted, "E9", 136);
StructInsert(stASCII_Encrypted, "EA", 137);
StructInsert(stASCII_Encrypted, "EB", 138);
StructInsert(stASCII_Encrypted, "EC", 139);
StructInsert(stASCII_Encrypted, "ED", 140);
StructInsert(stASCII_Encrypted, "EE", 141);
StructInsert(stASCII_Encrypted, "EF", 142);
StructInsert(stASCII_Encrypted, "F0", 143);
StructInsert(stASCII_Encrypted, "F1", 144);
StructInsert(stASCII_Encrypted, "F2", 145);
StructInsert(stASCII_Encrypted, "F3", 146);
StructInsert(stASCII_Encrypted, "F4", 147);
StructInsert(stASCII_Encrypted, "F5", 148);
StructInsert(stASCII_Encrypted, "F6", 149);
StructInsert(stASCII_Encrypted, "F7", 150);
StructInsert(stASCII_Encrypted, "F8", 151);
StructInsert(stASCII_Encrypted, "F9", 152);
StructInsert(stASCII_Encrypted, "FA", 153);
StructInsert(stASCII_Encrypted, "FB", 154);
StructInsert(stASCII_Encrypted, "FC", 155);
StructInsert(stASCII_Encrypted, "FD", 156);
StructInsert(stASCII_Encrypted, "FE", 157);
StructInsert(stASCII_Encrypted, "FF", 158);
for(Loop=1; Loop LT val((Len(stAccountname)+1)); Loop = Loop + 1){
aAccount[1][Loop]=Asc(Left(stTempAccountname, 1));
stTempAccountname=RemoveChars(stTempAccountname, 1, 1);
}
/** Calculate differences between the each letter and the first letter */
for(Loop=1; Loop LT val((Len(stAccountname)+1)); Loop = Loop + 1){
aAccount[2][Loop]=aAccount[1][1]-aAccount[1][Loop];
}
/** Calculate differences between the ASCII-value of the first letter and ASCII-value of a*/
intASCII_difference= aAccount[1][1] - 97;
/** Convert every letter to ASCII */
for(Loop=1; Loop LT val((Len(stEncryptedPassword)/2)+1); Loop = Loop + 1){
aPassword[Loop]=stASCII_Encrypted[Left(stTEMPEncryptedPassword, 2)];
stTEMPEncryptedPassword=RemoveChars(stTEMPEncryptedPassword, 1, 2);
}
/** Add Differences to password-ASCII-Values AND take off intASCII_difference*/
for(Loop=1; Loop LT val((Len(stEncryptedPassword)/2)+1); Loop = Loop + 1){
aASCIIResult[Loop] = aPassword[Loop] + aAccount[2][zaehler] - intASCII_difference;
/** If the AccountName is shorter then the Password the Account_Counter is put to 1 again */
if (zaehler LT Val(Len(stAccountname))) zaehler = zaehler + 1;
else zaehler = 1;
}
/** Write the Passwort*/
stringPassword="";
for(Loop=1; Loop LT val((Len(stEncryptedPassword)/2)+1); Loop = Loop + 1){
stringPassword = stringPassword & CHR(aASCIIResult[Loop]);
}
return stringPassword;
}
/**
* Returns true if user is authenticated.
*
* @return Returns a boolean.
* @author Raymond Camden (ray@camdenfamily.com)
* @version 1, April 29, 2002
*/
function IsLoggedIn() {
return getAuthUser() neq "";
}
/**
* Checks if the URL (maybe a key) was manipulated or if the form was copied and changed.
*
* @return Returns a boolean.
* @author Stephan Scheele (stephan@stephan-t-scheele.de)
* @version 1, July 2, 2002
*/
function isManipulated(){
if (CGI.HTTP_REFERER eq "") return true;
else if (REReplaceNoCase(REReplaceNoCase(CGI.HTTP_REFERER, ".*//", "","all"), "/.*", "","all") neq CGI.HTTP_HOST) return true;
else return false;
}
/**
* Checks to see if the current page is being run on a secure server.
*
* @param localServers If the current server matches one of the servers in this list, the UDF will return true. Defaults to an empty string. (Optional)
* @return Returns a boolean.
* @author Mike Hughes (mike@gne-ws.com)
* @version 1, February 17, 2004
*/
function IsSecureSite() {
if(arrayLen(arguments)) localServers = arguments[1];
if(cgi.server_port_secure OR listFindNoCase(localServers, cgi.server_name)) return true;
else return false;
}
/**
* Generates an 8-character random password free of annoying similar-looking characters such as 1 or l.
*
* @return Returns a string.
* @author Alan McCollough (amccollough@anmc.org)
* @version 1, December 18, 2001
*/
function MakePassword()
{
var valid_password = 0;
var loopindex = 0;
var this_char = "";
var seed = "";
var new_password = "";
var new_password_seed = "";
while (valid_password eq 0){
new_password = "";
new_password_seed = CreateUUID();
for(loopindex=20; loopindex LT 35; loopindex = loopindex + 2){
this_char = inputbasen(mid(new_password_seed, loopindex,2),16);
seed = int(inputbasen(mid(new_password_seed,loopindex/2-9,1),16) mod 3)+1;
switch(seed){
case "1": {
new_password = new_password & chr(int((this_char mod 9) + 48));
break;
}
case "2": {
new_password = new_password & chr(int((this_char mod 26) + 65));
break;
}
case "3": {
new_password = new_password & chr(int((this_char mod 26) + 97));
break;
}
} //end switch
}
valid_password = iif(refind("(O|o|0|i|l|1|I|5|S)",new_password) gt 0,0,1);
}
return new_password;
}
/**
* Produces a 128-bit condensed representation (message digest) of a message using the RSA MD5 algorithm.
* Original custom tag code by Tim McCarthy (tim@timmcc.com) - 2/2001
*
* @param message Text you want to hash.
* @return Returns a string.
* @author Rob Brooks-Bilson (rbils@amkor.com)
* @version 1, November 29, 2001
*/
function MD5(message)
{
Var hex_msg = "";
Var hex_msg_len = 0;
Var padded_hex_msg = "";
Var temp = "";
Var var1 = ArrayNew(1);
Var f = 0;
Var h = ArrayNew(1);
Var i = 0;
Var j = 0;
Var k = ArrayNew(1);
Var m = ArrayNew(1);
Var n = 0;
Var s = ArrayNew(1);
Var t = ArrayNew(1);
// convert the msg to ASCII binary-coded form
for (i=1; i LTE Len(message); i=i+1) {
hex_msg = hex_msg & Right("0"&FormatBaseN(Asc(Mid(message,i,1)),16),2);
}
// compute the msg length in bits
hex_msg_len = Right(RepeatString("0",15)&FormatBaseN(8*Len(message),16),16);
for (i=1; i LTE 8; i=i+1) {
temp = temp & Mid(hex_msg_len,-2*(i-8)+1,2);
}
hex_msg_len = temp;
// pad the msg to make it a multiple of 512 bits long
padded_hex_msg = hex_msg & "80" & RepeatString("0",128-((Len(hex_msg)+2+16) Mod 128)) & hex_msg_len;
// initialize MD buffer
h[1] = InputBaseN("0x67452301",16);
h[2] = InputBaseN("0xefcdab89",16);
h[3] = InputBaseN("0x98badcfe",16);
h[4] = InputBaseN("0x10325476",16);
var1[1] = "a";
var1[2] = "b";
var1[3] = "c";
var1[4] = "d";
// look at my crazy nested if action - courtesy of no elseif statement!
for (i=1; i LTE 64; i=i+1) {
t[i] = Int(2^32*abs(sin(i)));
if (i LE 16){
if (i EQ 1){
k[i] = 0;
}
else {
k[i] = k[i-1] + 1;
}
s[i] = 5*((i-1) MOD 4) + 7;
}
else {
if (i LE 32) {
if (i EQ 17) {
k[i] = 1;
}
else {
k[i] = (k[i-1]+5) MOD 16;
}
s[i] = 0.5*((i-1) MOD 4)*((i-1) MOD 4) + 3.5*((i-1) MOD 4) + 5;
}
else {
if(i LE 48) {
if (i EQ 33) {
k[i] = 5;
}
else {
k[i] = (k[i-1]+3) MOD 16;
}
s[i] = 6*((i-1) MOD 4) + ((i-1) MOD 2) + 4;
}
else {
if (i EQ 49) {
k[i] = 0;
}
else {
k[i] = (k[i-1]+7) MOD 16;
}
s[i] = 0.5*((i-1) MOD 4)*((i-1) MOD 4) + 3.5*((i-1) MOD 4) + 6;
}
}
}
}
// process the msg 512 bits at a time
for (n=1; n LTE Evaluate(Len(padded_hex_msg)/128); n=n+1) {
a = h[1];
b = h[2];
c = h[3];
d = h[4];
msg_block = Mid(padded_hex_msg,128*(n-1)+1,128);
for (i=1; i LTE 16; i=i+1) {
sub_block = "";
for (j=1; j LTE 4; j=j+1) {
sub_block = sub_block & Mid(msg_block,8*i-2*j+1,2);
}
m[i] = InputBaseN(sub_block,16);
}
for (i=1; i LTE 64; i=i+1) {
if (i LE 16) {
f = BitOr(BitAnd(Evaluate(var1[2]),Evaluate(var1[3])),BitAnd(BitNot(Evaluate(var1[2])),Evaluate(var1[4])));
}
else {
if (i LE 32) {
f = BitOr(BitAnd(Evaluate(var1[2]),Evaluate(var1[4])),BitAnd(Evaluate(var1[3]),BitNot(Evaluate(var1[4]))));
}
else {
if (i LE 48) {
f = BitXor(BitXor(Evaluate(var1[2]),Evaluate(var1[3])),Evaluate(var1[4]));
}
else {
f = BitXor(Evaluate(var1[3]),BitOr(Evaluate(var1[2]),BitNot(Evaluate(var1[4]))));
}
}
}
temp = Evaluate(var1[1]) + f + m[k[i]+1] + t[i];
while ((temp LT -2^31) OR (temp GE 2^31)) {
temp = temp - Sgn(temp)*2^32;
}
temp = Evaluate(var1[2]) + BitOr(BitSHLN(temp,s[i]),BitSHRN(temp,32-s[i]));
while ((temp LT -2^31) OR (temp GE 2^31)) {
temp = temp - Sgn(temp)*2^32;
}
temp = SetVariable(var1[1],temp);
temp = var1[4];
var1[4] = var1[3];
var1[3] = var1[2];
var1[2] = var1[1];
var1[1] = temp;
}
h[1] = h[1] + a;
h[2] = h[2] + b;
h[3] = h[3] + c;
h[4] = h[4] + d;
for (i=1; i LTE 4; i=i+1) {
while ((h[i] LT -2^31) OR (h[i] GE 2^31)) {
h[i] = h[i] - Sgn(h[i])*2^32;
}
}
}
for (i=1; i LTE 4; i=i+1) {
h[i] = Right(RepeatString("0",7)&UCase(FormatBaseN(h[i],16)),8);
}
for (i=1; i LTE 4; i=i+1) {
temp = "";
for (j=1; j LTE 4; j=j+1) {
temp = temp & Mid(h[i],-2*(j-4)+1,2);
}
h[i] = temp;
}
Return h[1] & h[2] & h[3] & h[4];
}
/**
* A function does RC4 encryption by using a key and the string.
*
* @param strPwd The key to use for encryption. (Required)
* @param plaintxt Text to encrypt. (Required)
* @return Returns a string.
* @author Michael Krock (michael.krock@avv.com)
* @version 1, January 28, 2004
*/
function RC4(strPwd,plaintxt) {
var sbox = ArrayNew(1);
var key = ArrayNew(1);
var tempSwap = 0;
var a = 0;
var b = 0;
var intLength = len(strPwd);
var temp = 0;
var i = 0;
var j = 0;
var k = 0;
var cipherby = 0;
var cipher = '';
for(a=0; a lte 255; a=a+1) {
key[a + 1] = asc(mid(strPwd,(a MOD intLength)+1,1));
sbox[a + 1] = a;
}
for(a=0; a lte 255; a=a+1) {
b = (b + sbox[a + 1] + key[a + 1]) Mod 256;
tempSwap = sbox[a + 1];
sbox[a + 1] = sbox[b + 1];
sbox[b + 1] = tempSwap;
}
for(a=1; a lte len(plaintxt); a=a+1) {
i = (i + 1) mod 256;
j = (j + sbox[i + 1]) Mod 256;
temp = sbox[i + 1];
sbox[i + 1] = sbox[j + 1];
sbox[j + 1] = temp;
k = sbox[((sbox[i + 1] + sbox[j + 1]) mod 256) + 1];
cipherby = BitXor(asc(mid(plaintxt, a, 1)), k);
cipher = cipher & chr(cipherby);
}
return cipher;
}
/**
* Produces a 160-bit condensed representation (message digest) of a message using the RIPEMD-160 algorithm.
* Original custom tag code by Tim McCarthy (tim@timmcc.com) - 2/2001
*
* @param message Text you want to hash.
* @return Returns a string.
* @author Rob Brooks-Bilson (rbils@amkor.com)
* @version 1, November 29, 2001
*/
function Ripemd160(message)
{
Var hex_msg = "";
Var hex_msg_len = 0;
Var padded_hex_msg = "";
Var msg_block = "";
Var sub_block = "";
Var num = 0;
Var temp = "";
Var rho = ArrayNew(1);
Var pi = ArrayNew(1);
Var shift = ArrayNew(2);
Var a1 = 0;
Var a2 = 0;
Var b1 = 0;
Var b2 = 0;
Var c1 = 0;
Var c2 = 0;
Var d1 = 0;
Var d2 = 0;
Var e1 = 0;
Var e2 = 0;
Var f1 = 0;
Var f2 = 0;
Var k1 = ArrayNew(1);
Var k2 = ArrayNew(1);
Var r1 = ArrayNew(1);
Var r2 = ArrayNew(1);
Var s1 = ArrayNew(1);
Var s2 = ArrayNew(1);
Var var1 = ArrayNew(1);
Var var2 = ArrayNew(1);
Var h = ArrayNew(1);
Var i = 0;
Var j = 0;
Var n = 0;
Var t = 0;
Var x = ArrayNew(1);
// convert the msg to ASCII binary-coded form
for (i=1; i LTE Len(message); i=i+1) {
hex_msg = hex_msg & Right("0"&FormatBaseN(Asc(Mid(message,i,1)),16),2);
}
// compute the msg length in bits
hex_msg_len = Right(RepeatString("0",15)&FormatBaseN(8*Len(message),16),16);
for (i=1; i LTE 8; i=i+1) {
temp = temp & Mid(hex_msg_len,-2*(i-8)+1,2);
}
hex_msg_len = temp;
// pad the msg to make it a multiple of 512 bits long
padded_hex_msg = hex_msg & "80" & RepeatString("0",128-((Len(hex_msg)+2+16) Mod 128)) & hex_msg_len;
// define permutations
rho[1] = 7;
rho[2] = 4;
rho[3] = 13;
rho[4] = 1;
rho[5] = 10;
rho[6] = 6;
rho[7] = 15;
rho[8] = 3;
rho[9] = 12;
rho[10] = 0;
rho[11] = 9;
rho[12] = 5;
rho[13] = 2;
rho[14] = 14;
rho[15] = 11;
rho[16] = 8;
for (i=1; i LTE 16; i=i+1) {
pi[i] = (9*(i-1)+5) Mod 16;
}
// define shifts
shift[1][1] = 11;
shift[1][2] = 14;
shift[1][3] = 15;
shift[1][4] = 12;
shift[1][5] = 5;
shift[1][6] = 8;
shift[1][7] = 7;
shift[1][8] = 9;
shift[1][9] = 11;
shift[1][10] = 13;
shift[1][11] = 14;
shift[1][12] = 15;
shift[1][13] = 6;
shift[1][14] = 7;
shift[1][15] = 9;
shift[1][16] = 8;
shift[2][1] = 12;
shift[2][2] = 13;
shift[2][3] = 11;
shift[2][4] = 15;
shift[2][5] = 6;
shift[2][6] = 9;
shift[2][7] = 9;
shift[2][8] = 7;
shift[2][9] = 12;
shift[2][10] = 15;
shift[2][11] = 11;
shift[2][12] = 13;
shift[2][13] = 7;
shift[2][14] = 8;
shift[2][15] = 7;
shift[2][16] = 7;
shift[3][1] = 13;
shift[3][2] = 15;
shift[3][3] = 14;
shift[3][4] = 11;
shift[3][5] = 7;
shift[3][6] = 7;
shift[3][7] = 6;
shift[3][8] = 8;
shift[3][9] = 13;
shift[3][10] = 14;
shift[3][11] = 13;
shift[3][12] = 12;
shift[3][13] = 5;
shift[3][14] = 5;
shift[3][15] = 6;
shift[3][16] = 9;
shift[4][1] = 14;
shift[4][2] = 11;
shift[4][3] = 12;
shift[4][4] = 14;
shift[4][5] = 8;
shift[4][6] = 6;
shift[4][7] = 5;
shift[4][8] = 5;
shift[4][9] = 15;
shift[4][10] = 12;
shift[4][11] = 15;
shift[4][12] = 14;
shift[4][13] = 9;
shift[4][14] = 9;
shift[4][15] = 8;
shift[4][16] = 6;
shift[5][1] = 15;
shift[5][2] = 12;
shift[5][3] = 13;
shift[5][4] = 13;
shift[5][5] = 9;
shift[5][6] = 5;
shift[5][7] = 8;
shift[5][8] = 6;
shift[5][9] = 14;
shift[5][10] = 11;
shift[5][11] = 12;
shift[5][12] = 11;
shift[5][13] = 8;
shift[5][14] = 6;
shift[5][15] = 5;
shift[5][16] = 5;
for (i=1; i LTE 16; i=i+1) {
// define constants
k1[i] = 0;
k1[i+16] = Int(2^30*Sqr(2));
k1[i+32] = Int(2^30*Sqr(3));
k1[i+48] = Int(2^30*Sqr(5));
k1[i+64] = Int(2^30*Sqr(7));
k2[i] = Int(2^30*2^(1/3));
k2[i+16] = Int(2^30*3^(1/3));
k2[i+32] = Int(2^30*5^(1/3));
k2[i+48] = Int(2^30*7^(1/3));
k2[i+64] = 0;
// define word order
r1[i] = i-1;
r1[i+16] = rho[i];
r1[i+32] = rho[rho[i]+1];
r1[i+48] = rho[rho[rho[i]+1]+1];
r1[i+64] = rho[rho[rho[rho[i]+1]+1]+1];
r2[i] = pi[i];
r2[i+16] = rho[pi[i]+1];
r2[i+32] = rho[rho[pi[i]+1]+1];
r2[i+48] = rho[rho[rho[pi[i]+1]+1]+1];
r2[i+64] = rho[rho[rho[rho[pi[i]+1]+1]+1]+1];
// define rotations
s1[i] = shift[1][r1[i]+1];
s1[i+16] = shift[2][r1[i+16]+1];
s1[i+32] = shift[3][r1[i+32]+1];
s1[i+48] = shift[4][r1[i+48]+1];
s1[i+64] = shift[5][r1[i+64]+1];
s2[i] = shift[1][r2[i]+1];
s2[i+16] = shift[2][r2[i+16]+1];
s2[i+32] = shift[3][r2[i+32]+1];
s2[i+48] = shift[4][r2[i+48]+1];
s2[i+64] = shift[5][r2[i+64]+1];
}
// define buffers
h[1] = InputBaseN("0x67452301",16);
h[2] = InputBaseN("0xefcdab89",16);
h[3] = InputBaseN("0x98badcfe",16);
h[4] = InputBaseN("0x10325476",16);
h[5] = InputBaseN("0xc3d2e1f0",16);
var1[1] = "a1";
var1[2] = "b1";
var1[3] = "c1";
var1[4] = "d1";
var1[5] = "e1";
var2[1] = "a2";
var2[2] = "b2";
var2[3] = "c2";
var2[4] = "d2";
var2[5] = "e2";
// process msg in 16-word blocks
for (n=1; n LTE Evaluate(Len(padded_hex_msg)/128); n=n+1) {
a1 = h[1];
b1 = h[2];
c1 = h[3];
d1 = h[4];
e1 = h[5];
a2 = h[1];
b2 = h[2];
c2 = h[3];
d2 = h[4];
e2 = h[5];
msg_block = Mid(padded_hex_msg,128*(n-1)+1,128);
for (i=1; i LTE 16; i=i+1) {
sub_block = "";
for (j=1; j LTE 4; j=j+1) {
sub_block = sub_block & Mid(msg_block,8*i-2*j+1,2);
}
x[i] = InputBaseN(sub_block,16);
}
for (j=1; j LTE 80; j=j+1) {
// nonlinear functions
if (j LE 16) {
f1 = BitXor(BitXor(Evaluate(var1[2]),Evaluate(var1[3])),Evaluate(var1[4]));
f2 = BitXor(Evaluate(var2[2]),BitOr(Evaluate(var2[3]),BitNot(Evaluate(var2[4]))));
}
else {
if (j LE 32) {
f1 = BitOr(BitAnd(Evaluate(var1[2]),Evaluate(var1[3])),BitAnd(BitNot(Evaluate(var1[2])),Evaluate(var1[4])));
f2 = BitOr(BitAnd(Evaluate(var2[2]),Evaluate(var2[4])),BitAnd(Evaluate(var2[3]),BitNot(Evaluate(var2[4]))));
}
else {
if (j LE 48) {
f1 = BitXor(BitOr(Evaluate(var1[2]),BitNot(Evaluate(var1[3]))),Evaluate(var1[4]));
f2 = BitXor(BitOr(Evaluate(var2[2]),BitNot(Evaluate(var2[3]))),Evaluate(var2[4]));
}
else {
if (j LE 64) {
f1 = BitOr(BitAnd(Evaluate(var1[2]),Evaluate(var1[4])),BitAnd(Evaluate(var1[3]),BitNot(Evaluate(var1[4]))));
f2 = BitOr(BitAnd(Evaluate(var2[2]),Evaluate(var2[3])),BitAnd(BitNot(Evaluate(var2[2])),Evaluate(var2[4])));
}
else {
f1 = BitXor(Evaluate(var1[2]),BitOr(Evaluate(var1[3]),BitNot(Evaluate(var1[4]))));
f2 = BitXor(BitXor(Evaluate(var2[2]),Evaluate(var2[3])),Evaluate(var2[4]));
}
}
}
}
temp = Evaluate(var1[1]) + f1 + x[r1[j]+1] + k1[j];
while ((temp LT -2^31) OR (temp GE 2^31)) {
temp = temp - Sgn(temp)*2^32;
}
temp = BitOr(BitSHLN(temp,s1[j]),BitSHRN(temp,32-s1[j])) + Evaluate(var1[5]);
while ((temp LT -2^31) OR (temp GE 2^31)) {
temp = temp - Sgn(temp)*2^32;
}
temp = SetVariable(var1[1],temp);
temp = SetVariable(var1[3],BitOr(BitSHLN(Evaluate(var1[3]),10),BitSHRN(Evaluate(var1[3]),32-10)));
temp = var1[5];
var1[5] = var1[4];
var1[4] = var1[3];
var1[3] = var1[2];
var1[2] = var1[1];
var1[1] = temp;
temp = Evaluate(var2[1]) + f2 + x[r2[j]+1] + k2[j];
while ((temp LT -2^31) OR (temp GE 2^31)) {
temp = temp - Sgn(temp)*2^32;
}
temp = BitOr(BitSHLN(temp,s2[j]),BitSHRN(temp,32-s2[j])) + Evaluate(var2[5]);
while ((temp LT -2^31) OR (temp GE 2^31)) {
temp = temp - Sgn(temp)*2^32;
}
temp = SetVariable(var2[1],temp);
temp = SetVariable(var2[3],BitOr(BitSHLN(Evaluate(var2[3]),10),BitSHRN(Evaluate(var2[3]),32-10)));
temp = var2[5];
var2[5] = var2[4];
var2[4] = var2[3];
var2[3] = var2[2];
var2[2] = var2[1];
var2[1] = temp;
}
t = h[2] + c1 + d2;
h[2] = h[3] + d1 + e2;
h[3] = h[4] + e1 + a2;
h[4] = h[5] + a1 + b2;
h[5] = h[1] + b1 + c2;
h[1] = t;
for (i=1; i LTE 5; i=i+1) {
while ((h[i] LT -2^31) OR (h[i] GE 2^31)) {
h[i] = h[i] - Sgn(h[i])*2^32;
}
}
}
for (i=1; i LTE 5; i=i+1) {
h[i] = Right(RepeatString("0",7)&UCase(FormatBaseN(h[i],16)),8);
}
for (i=1; i LTE 5; i=i+1) {
temp = "";
for (j=1; j LTE 4; j=j+1) {
temp = temp & Mid(h[i],-2*(j-4)+1,2);
}
h[i] = temp;
}
Return h[1] & h[2] & h[3] & h[4] & h[5];
}
/**
* Caesar-cypher encryption that replaces each English letter with the one 13 places forward or back along the alphabet.
*
* @param string String you wish to rot13 encrypt.
* @return Returns a string.
* @author Rob Brooks-Bilson (rbils@amkor.com)
* @version 1.0, August 23, 2001
*/
function rot13(string)
{
var i=0;
var j=0;
var k=0;
var out="";
for (i=1; i LTE Len(String); i=i+1){
j=Asc(Mid(string, i, 1));
if(j GTE 65 AND j LTE 90){
j=((J-52) MOD 26)+65;
}
else if(j GTE 97 AND j LTE 122){
j=((j-84) MOD 26)+97;
}
out=out&Chr(j);
}
return out;
}
/**
* This function validates user permissions against required permissions using Bit, List or custom validation.
*
* @param model String, "bit" or "list" (Required)
* @param requiredPermission Permissions required for access. (Required)
* @param userPermissions Permissions of the user. (Required)
* @return Returns a boolean.
* @author Rob Rusher (rob@robrusher.com)
* @version 1, September 27, 2002
*/
function Secure(model, requiredPermission, userPermissions) {
var permitted = false;
// Switch to appropriate security model
switch( model ) {
// Bit Validation
case "bit":
{
if ( BitAnd( userPermissions, requiredPermission ) ) {
permitted = true;
}
break;
}
// List Validation
case "list":
{
if ( ListFindNoCase( userPermissions, requiredPermission ) ) {
permitted = true;
}
break;
}
default: {
// Define custom validation here.
permitted = true;
}
}
return (permitted);
}
/**
* This function validates user permissions against required permissions using either Bit, List or custom validation.
*
* @param mode String, "bit" or "list" (Required)
* @param requiredPermission Permissions required for access. (Required)
* @param userPermissions Permissions of the user. (Required)
* @param failureXFA Fusebox XFA (Optional)
* @return Returns a boolean.
* @author Rob Rusher (rob@robrusher.com)
* @version 1, October 15, 2002
*/
function SecureMX(model, requiredPermission, userPermissions) {
var permitted = false;
// Switch to appropriate security model
switch( model ) {
// Bit Validation
case "bit":
{
if ( BitAnd( userPermissions, requiredPermission ) ) {
permitted = true;
}
break;
}
// List Validation
case "list":
{
if ( ListFindNoCase( userPermissions, requiredPermission ) ) {
permitted = true;
}
break;
}
// Define custom validation here
default:
{
include( model & ".cfm" );
permitted = true;
}
}
// If not permitted and an Exit FuseAction is defined
if ( NOT permitted and isDefined( "attributes.failureXFA" ) ) {
location( "#request.self#?fuseaction=#attributes.failureXFA#", 1 );
}
return (permitted);
}
/**
* Produces a 160-bit condensed representation (message digest) of message using the Secure Hash Algorithm (SHA-1).
* Original custom tag code by Tim McCarthy (tim@timmcc.com) - 2/2001
*
* @param message Text you want to hash.
* @return Returns a string.
* @author Rob Brooks-Bilson (rbils@amkor.com)
* @version 1, November 28, 2001
*/
function sha1(message)
{
Var hex_msg = "";
Var hex_msg_len = 0;
Var padded_hex_msg = "";
Var msg_block = "";
Var num = 0;
Var temp = "";
Var h = ArrayNew(1);
Var w = ArrayNew(1);
Var a = "";
Var b = "";
Var c = "";
Var d = "";
Var e = "";
Var f = "";
Var i = 0;
Var k = "";
Var n = 0;
Var t = 0;
// convert the msg to ASCII binary-coded form
for (i=1; i LTE Len(message); i=i+1) {
hex_msg = hex_msg & Right("0"&FormatBaseN(Asc(Mid(message,i,1)),16),2);
}
// compute the msg length in bits
hex_msg_len = FormatBaseN(8*Len(message),16);
// pad the msg to make it a multiple of 512 bits long
padded_hex_msg = hex_msg & "80" & RepeatString("0",128-((Len(hex_msg)+2+16) Mod 128)) & RepeatString("0",16-Len(hex_msg_len)) & hex_msg_len;
// initialize the buffers
h[1] = InputBaseN("0x67452301",16);
h[2] = InputBaseN("0xefcdab89",16);
h[3] = InputBaseN("0x98badcfe",16);
h[4] = InputBaseN("0x10325476",16);
h[5] = InputBaseN("0xc3d2e1f0",16);
// process the msg 512 bits at a time
for (n=1; n LTE Evaluate(Len(padded_hex_msg)/128); n=n+1) {
msg_block = Mid(padded_hex_msg,128*(n-1)+1,128);
a = h[1];
b = h[2];
c = h[3];
d = h[4];
e = h[5];
for (t=0; t LTE 79; t=t+1) {
// nonlinear functions and constants
// this code mess is courtesy of the lack of an elseif() function
if (t LE 19) {
f = BitOr(BitAnd(b,c),BitAnd(BitNot(b),d));
k = InputBaseN("0x5a827999",16);
}
else {
if (t LE 39) {
f = BitXor(BitXor(b,c),d);
k = InputBaseN("0x6ed9eba1",16);
}
else {
if (t LE 59) {
f = BitOr(BitOr(BitAnd(b,c),BitAnd(b,d)),BitAnd(c,d));
k = InputBaseN("0x8f1bbcdc",16);
}
else {
f = BitXor(BitXor(b,c),d);
k = InputBaseN("0xca62c1d6",16);
}
}
}
// transform the msg block from 16 32-bit words to 80 32-bit words
if (t LE 15) {
w[t+1] = InputBaseN(Mid(msg_block,8*t+1,8),16);
}
else {
num = BitXor(BitXor(BitXor(w[t-3+1],w[t-8+1]),w[t-14+1]),w[t-16+1]);
w[t+1] = BitOr(BitSHLN(num,1),BitSHRN(num,32-1));
}
temp = BitOr(BitSHLN(a,5),BitSHRN(a,32-5)) + f + e + w[t+1] + k;
e = d;
d = c;
c = BitOr(BitSHLN(b,30),BitSHRN(b,32-30));
b = a;
a = temp;
num = a;
while ((num LT -2^31) OR (num GE 2^31)) {
num = num - Sgn(num)*2^32;
}
a = num;
}
h[1] = h[1] + a;
h[2] = h[2] + b;
h[3] = h[3] + c;
h[4] = h[4] + d;
h[5] = h[5] + e;
for (i=1; i LTE 5; i=i+1) {
while ((h[i] LT -2^31) OR (h[i] GE 2^31)) {
h[i] = h[i] - Sgn(h[i])*2^32;
}
}
}
for (i=1; i LTE 5; i=i+1) {
h[i] = RepeatString("0",8-Len(FormatBaseN(h[i],16))) & UCase(FormatBaseN(h[i],16));
}
Return h[1] & h[2] & h[3] & h[4] & h[5];
}
/**
* Produces a 256-bit condensed representation (message digest) of message using the Secure Hash Algorithm (SHA-256).
* Original custom tag code by Tim McCarthy (tim@timmcc.com) - 8/2001
*
* @param message Text you want to hash.
* @return Returns a string.
* @author Rob Brooks-Bilson (rbils@amkor.com)
* @version 1.0, November 28, 2001
*/
function sha256(message){
// convert the msg to ASCII binary-coded form
var hex_msg="";
// compute the msg length in bits
var hex_msg_len=FormatBaseN(8*Len(message),16);
var padded_hex_msg="";
var prime=ArrayNew(1);
var msg_block="";
var bgsig0=0;
var bgsig1=0;
var ch=0;
var maj=0;
var t1=0;
var t2=0;
var a=0;
var b=0;
var c=0;
var d=0;
var e=0;
var f=0;
var g=0;
var h=ArrayNew(1);
var i=0;
var k=ArrayNew(1);
var n=0;
var t=0;
var w=ArrayNew(1);
var hh=0;
for (i=1; i LTE Len(message); i=i+1) {
hex_msg = hex_msg & Right("0"&FormatBaseN(Asc(Mid(message,i,1)),16),2);
}
// pad the msg to make it a multiple of 512 bits long --->
padded_hex_msg = hex_msg & "80" & RepeatString("0",128-((Len(hex_msg)+2+16) Mod 128)) & RepeatString("0",16-Len(hex_msg_len)) & hex_msg_len;
// first sixty-four prime numbers
prime[1] = 2;
prime[2] = 3;
prime[3] = 5;
prime[4] = 7;
prime[5] = 11;
prime[6] = 13;
prime[7] = 17;
prime[8] = 19;
prime[9] = 23;
prime[10] = 29;
prime[11] = 31;
prime[12] = 37;
prime[13] = 41;
prime[14] = 43;
prime[15] = 47;
prime[16] = 53;
prime[17] = 59;
prime[18] = 61;
prime[19] = 67;
prime[20] = 71;
prime[21] = 73;
prime[22] = 79;
prime[23] = 83;
prime[24] = 89;
prime[25] = 97;
prime[26] = 101;
prime[27] = 103;
prime[28] = 107;
prime[29] = 109;
prime[30] = 113;
prime[31] = 127;
prime[32] = 131;
prime[33] = 137;
prime[34] = 139;
prime[35] = 149;
prime[36] = 151;
prime[37] = 157;
prime[38] = 163;
prime[39] = 167;
prime[40] = 173;
prime[41] = 179;
prime[42] = 181;
prime[43] = 191;
prime[44] = 193;
prime[45] = 197;
prime[46] = 199;
prime[47] = 211;
prime[48] = 223;
prime[49] = 227;
prime[50] = 229;
prime[51] = 233;
prime[52] = 239;
prime[53] = 241;
prime[54] = 251;
prime[55] = 257;
prime[56] = 263;
prime[57] = 269;
prime[58] = 271;
prime[59] = 277;
prime[60] = 281;
prime[61] = 283;
prime[62] = 293;
prime[63] = 307;
prime[64] = 311;
// constants
for (i=1; i LTE 64; i=i+1) {
k[i] = Int(prime[i]^(1/3)*2^32);
}
// initial hash values
for (i=1; i LTE 8; i=i+1) {
h[i] = Int(Sqr(prime[i])*2^32);
while ((h[i] LT -2^31) OR (h[i] GE 2^31)) {
h[i] = h[i] - Sgn(h[i])*2^32;
}
}
// process the msg 512 bits at a time
for (n=1; n LTE (Len(padded_hex_msg)/128); n=n+1) {
// initialize the eight working variables
a = h[1];
b = h[2];
c = h[3];
d = h[4];
e = h[5];
f = h[6];
g = h[7];
hh = h[8];
// nonlinear functions and message schedule
msg_block = Mid(padded_hex_msg,128*(n-1)+1,128);
for (t=0; t LTE 63; t=t+1) {
if (t LE 15) {
w[t+1] = InputBaseN(Mid(msg_block,8*t+1,8),16);
}
else {
smsig0 = BitXor(BitXor(BitOr(BitSHRN(w[t-15+1],7),BitSHLN(w[t-15+1],32-7)),BitOr(BitSHRN(w[t-15+1],18),BitSHLN(w[t-15+1],32-18))),BitSHRN(w[t-15+1],3));
smsig1 = BitXor(BitXor(BitOr(BitSHRN(w[t-2+1],17),BitSHLN(w[t-2+1],32-17)),BitOr(BitSHRN(w[t-2+1],19),BitSHLN(w[t-2+1],32-19))),BitSHRN(w[t-2+1],10));
w[t+1] = smsig1 + w[t-7+1] + smsig0 + w[t-16+1];
}
while ((w[t+1] LT -2^31) OR (w[t+1] GE 2^31)) {
w[t+1] = w[t+1] - Sgn(w[t+1])*2^32;
}
bgsig0 = BitXor(BitXor(BitOr(BitSHRN(a,2),BitSHLN(a,32-2)),BitOr(BitSHRN(a,13),BitSHLN(a,32-13))),BitOr(BitSHRN(a,22),BitSHLN(a,32-22)));
bgsig1 = BitXor(BitXor(BitOr(BitSHRN(e,6),BitSHLN(e,32-6)),BitOr(BitSHRN(e,11),BitSHLN(e,32-11))),BitOr(BitSHRN(e,25),BitSHLN(e,32-25)));
ch = BitXor(BitAnd(e,f),BitAnd(BitNot(e),g));
maj = BitXor(BitXor(BitAnd(a,b),BitAnd(a,c)),BitAnd(b,c));
t1 = hh + bgsig1 + ch + k[t+1] + w[t+1];
t2 = bgsig0 + maj;
hh = g;
g = f;
f = e;
e = d + t1;
d = c;
c = b;
b = a;
a = t1 + t2;
while ((a LT -2^31) OR (a GE 2^31)) {
a = a - Sgn(a)*2^32;
}
while ((e LT -2^31) OR (e GE 2^31)) {
e = e - Sgn(e)*2^32;
}
}
h[1] = h[1] + a;
h[2] = h[2] + b;
h[3] = h[3] + c;
h[4] = h[4] + d;
h[5] = h[5] + e;
h[6] = h[6] + f;
h[7] = h[7] + g;
h[8] = h[8] + hh;
for (i=1; i LTE 8; i=i+1) {
while ((h[i] LT -2^31) OR (h[i] GE 2^31)) {
h[i] = h[i] - Sgn(h[i])*2^32;
}
}
}
for (i=1; i LTE 8; i=i+1) {
h[i] = RepeatString("0",8-Len(FormatBaseN(h[i],16))) & UCase(FormatBaseN(h[i],16));
}
return (h[1] & h[2] & h[3] & h[4] & h[5] & h[6] & h[7] & h[8]);
}
/**
* Used along with URLHash to verify the URL integrity.
*
* @author John Bartlett (jbartlett@strangejourney.com)
* @version 1, January 7, 2002
*/
function URLCheckHash()
{
var tmp=CGI.Query_String;
var listL=0;
var loop=0;
var URLVar="";
var HashData="";
if (IsDefined("URL.Hash"))
{
if (URL.Hash NEQ "")
{
listL=ListLen(tmp,"&");
URLVar=ListGetAt(tmp,ListL,"&");
if (Left(UCase(URLVar),5) EQ "HASH=")
{
tmp=ListDeleteAt(tmp,ListL,"&");
}
HashData=cgi.Server_Name & cgi.Remote_Addr & cgi.Script_Name & tmp;
if (URL.Hash EQ Hash(HashData)) return 1;
else return 0;
} else return 0;
} else return 0;
}
/**
* Add security by encrypting and decrypting URL variables. See URLEncrypt.
* Mod by David Heard - added decode
*
* @param nKey The encryption key to use. (Required)
* @param QueryString Defaults to CGI.Query_String (Optional)
* @return Writes to the URL scope.
* @author Timothy Heald (theald@schoollink.net)
* @version 3, October 9, 2002
*/
function urlDecrypt(key){
var queryString = cgi.path_info;
var scope = "url";
var stuff = "";
var oldcheck = "";
var newcheck = "";
var i = 0;
var thisPair = "";
var thisName = "";
var thisValue = "";
// see if a scope is provided if it is set it otherwise set it to url
if(arrayLen(arguments) gt 1){
scope = arguments[2];
}
if ((right(queryString,3) neq "htm") or (findNoCase("&",queryString) neq 0) or (findNoCase("=",queryString) neq 0)){
stuff = 'not encrypted, or corrupted url';
} else {
// remove /index.htm
querystring = replace(queryString, right(queryString,10),'');
// remove the leading slash
querystring = replace(queryString, left(queryString,1),'');
// grab the old checksum
if (len(querystring) GT 2) {
oldcheck = right(querystring, 2);
querystring = rereplace(querystring, "(.*)..", "\1");
}
// check the checksum
newcheck = left(hash(querystring & key),2);
if (newcheck NEQ oldcheck) {
return querystring;
}
//decrypt the passed value
queryString = cfusion_decrypt(queryString, key);
// set the variables
for(i = 0; i lt listLen(queryString, '&'); i = i + 1){
// Break up the list into seprate name=value pairs
thisPair = listGetAt(queryString, i + 1, '&');
// Get the name
thisName = listGetAt(thisPair, 1, '=');
// Get the value
thisValue = listGetAt(thisPair, 2, '=');
// Set the name with the scope
thisName = scope & '.' & thisName;
// Set the variable
setVariable(thisName, thisValue);
}
}
return stuff;
}
/**
* Add security by encrypting and decrypting URL variables.
*
* @param cQueryString Query string to encrypt. (Required)
* @param nKey Key to use for encryption. (Required)
* @return Returns an encrypted query string.
* @author Timothy Heald (theald@schoollink.net)
* @version 2, February 19, 2003
*/
function urlEncrypt(queryString, key){
// encode the string
var uue = cfusion_encrypt(queryString, key);
// make a checksum of the endoed string
var checksum = left(hash(uue & key),2);
// assemble the URL
queryString = "/" & uue & checksum &"/index.htm";
return queryString;
}
/**
* URL Security tool to prevent a user from changing any part of a URL.
*
* @param URLValue The string to hash.
* @return Returns a string.
* @author John Bartlett (jbartlett@strangejourney.com)
* @version 1, January 7, 2002
*/
function URLHash(URLValue)
{
var HashData =cgi.Server_Name & cgi.Remote_Addr & cgi.Script_Name & URLValue;
return URLValue & "&hash=" & LCase(Hash(HashData));
}