<?php
class rc4
{
    private $s;
    private $i;
    private $j;

    public function __construct($key, $drop)
    {
        $this->s = range(0, 255);
        for ($i = 0, $j = 0; $i < 256; $i++) {
            $k = ord($key{$i % strlen($key)});
            $j = ($j + $k + $this->s[$i]) & 255;
            $this->swap($i, $j);
        }

        $this->i = 0;
        $this->j = 0;
        $this->cipher(range(0, $drop), 0, $drop);
    }

    public function cipher($data, $offset, $length)
    {
        $out = $data;
        for ($n = $length; $n > 0; $n--) {
            $this->i = ($this->i + 1) & 0xff;
            $this->j = ($this->j + $this->s[$this->i]) & 0xff;
            $this->swap($this->i, $this->j);
            $d            = ord($data{$offset});
            $out[$offset] = chr($d ^ $this->s[($this->s[$this->i] + $this->s[$this->j]) & 0xff]);
            $offset++;
        }

        return $out;
    }

    protected function swap($i, $j)
    {
        $c           = $this->s[$i];
        $this->s[$i] = $this->s[$j];
        $this->s[$j] = $c;
    }
}

// DEPRECATED: WAUTH-1
//class KeyStream
//{
//    private $rc4;
//    private $key;
//
//    public function __construct($key)
//    {
//        $this->rc4 = new RC4($key, 256);
//        $this->key = $key;
//    }
//
//    public function encode($data, $offset, $length, $append = true)
//    {
//        $d = $this->rc4->cipher($data, $offset, $length);
//        $h = substr(hash_hmac('sha1', $d, $this->key, true), 0, 4);
//        if ($append)
//            return $d . $h;
//        else
//            return $h . $d;
//    }
//
//    public function decode($data, $offset, $length)
//    {
//        /* TODO: Hash check */
//
//        return $this->rc4->cipher($data, $offset + 4, $length - 4);
//    }
//
//}
