Authenticated Chat

From Second Life Wiki
Revision as of 19:55, 29 August 2007 by Strife Onizuka (talk | contribs)
Jump to navigation Jump to search

Here's a method of authenticating chat with shared secret.


//By: Gigs Taggart
//Modified by Strife Onizuka
//Released under BSD license

string  gSetupNotecardName = "setup";

string  gPassword;
integer gSeed;

key     gSetupQueryId;
integer gSetupNotecardLine;

//to sign a message we hash message+gSecret+llGetKey()
string sign_message(string message)
{
    string hash = llMD5String(message + gPassword + (string)llGetKey(), gSeed);
    return message + hash;
}

//to verify a message we do all the same stuff except we get the sender's key
integer verify_message(string raw, key sender)
{
    string hash = llMD5String(llDeleteSubString(message, -32, -1) + gPassword + (string)sender, gSeed);
    return llGetSubString(message, -32, -1) == hash;
}

readSettingsNotecard()
{
   gSetupNotecardLine = 0;
   gSetupQueryId = llGetNotecardLine(gSetupNotecardName, gSetupNotecardLine); 
}


default
{
    state_entry()
    {
         readSettingsNotecard();
    }
    dataserver(key queryId, string data)
    {
        if(queryId == gSetupQueryId) 
        {
            if(data != EOF)
            {
                integer split = llSubStringIndex(data, "=");
                if(~split)
                {
                    string setting = llDeleteSubString(data, split, -1);
                    string value   = llDeleteSubString(data, 0,  split);
                    if (setting == "password")
                    {
                        gPassword = value;
                    }
                    else if(setting == "seed")
                    {
                        gSeed = (integer)value;
                    }
                }
                gSetupQueryId = llGetNotecardLine(gSetupNotecardName, ++gSetupNotecardLine); 
            }
            else
            {
                state running;   
            }
        }
    }           
    changed(integer change)
    {
        llResetScript();
    }
}

state running
{

    changed(integer change)
    {
        llResetScript();
    }
}

Notecard

Name: "setup"

password=secret
seed=0xdeadbeef