﻿
//
// 'Extended' Tiny Encryption Algorithm
//
// Algorithm: David Wheeler & Roger Needham, Cambridge University Computer Lab
//            http://www.cl.cam.ac.uk/ftp/papers/djw-rmn/djw-rmn-tea.html (1994)
//            http://www.cl.cam.ac.uk/ftp/users/djw3/xtea.ps (1997)
//
// JavaScript implementation: Chris Veness, Movable Type Ltd: www.movable-type.co.uk
//

function decrypt(val, key)
{
  var v = new Array(2), k = new Array(4), s = "", i;

  k[0] = Str4ToLong(key.substr(0,4));
  k[1] = Str4ToLong(key.substr(4,4));
  k[2] = Str4ToLong(key.substr(8,4));
  k[3] = Str4ToLong(key.substr(12,4));

  val = unescape(val); // corrected NVS 2005.04.27
  for (i=0; i<val.length; i+=8) {  // decode val into s in 64-bit (8 char) blocks
    v[0] = Str4ToLong(val.substr(i,4));
    v[1] = Str4ToLong(val.substr(i+4,4));
    decode(v, k);
    s += LongToStr4(v[0]) + LongToStr4(v[1]);
  }

  if (s.indexOf("\x00") != -1) {
    // strip trailing null chars resulting from filling 4-char blocks
    s = s.substr(0, s.indexOf("\x00"));
  }

  return(unescape(s));
}

function decode(v, k)
{
  var y = v[0], z = v[1];
  var delta = 0x9E3779B9, sum = delta*32;

  while (sum != 0) {
    z -= (y<<4 ^ y>>>5)+y ^ sum+k[sum>>>11 & 3];
    sum -= delta;
    y -= (z<<4 ^ z>>>5)+z ^ sum+k[sum & 3];
  }
  v[0] = y; v[1] = z;
}

function Str4ToLong(s)  // convert 4 chars of s to a numeric long
{
  var v = s.charCodeAt(0) +
    (s.charCodeAt(1)<<8) +
    (s.charCodeAt(2)<<16) +
    (s.charCodeAt(3)<<24);
  return(isNaN(v) ? 0 : v);
}

function LongToStr4(v)  // convert a numeric long to 4 char string
{
  var s = String.fromCharCode(v & 0xFF, v>>8 & 0xFF, v>>16 & 0xFF, v>>24 & 0xFF);
  return(s);
}
