Authenticated Chat

From Second Life Wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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