Patch title: Release 94 bulk changes
Abstract:
File: /pliant/util/crypto/rc4.pli
Key:
    Removed line
    Added line
abstract
  [This is RC4 Pliant implementation.] ; eol
  [See ] ; link "CipherSaber Home Page" "http://ciphersaber.gurus.com/" ; [ for more details about the algorithm.] ; eol

constant rc4_bits 8

module "legal.pli"


type RC4Ctx
  field Int x y
  field (Array Int 2^rc4_bits) perm

function rc4_init ctx key laps
  arg_w RC4Ctx ctx ; arg Str key ; arg Int laps
  var Str lkey := legal_key key
  implicit ctx
    for (var Int i) 0 2^rc4_bits-1
      perm i := i
    var Int j := 0
    for (var Int l) 1 laps
      for (var Int i) 0 2^rc4_bits-1
        j := j+perm:i+(lkey i%lkey:len):number .and. 2^rc4_bits-1
        j := j+perm:i+(key i%key:len):number .and. 2^rc4_bits-1
        swap perm:i perm:j
    x := 0 ; y := 0

function rc4_byte ctx -> result
  arg_rw RC4Ctx ctx ; arg Int result
  implicit ctx
    x := x+1 .and. 2^rc4_bits-1
    y := y+perm:x .and. 2^rc4_bits-1
    var Int i := perm:x+perm:y .and. 255
    swap perm:x perm:y
    result := perm i


doc
  [And a simple added routine for ciphering a bloc of memory.]

module "/pliant/language/unsafe.pli"

function rc4_cipher ctx src dest size
  arg_rw RC4Ctx ctx ; arg Address src dest ; arg Int size
  for (var Int i) 0 size-1
    (dest translate Byte i) map uInt8 := ((src translate Byte i) map uInt8) .xor. (rc4_byte:ctx .and. 255)

export RC4Ctx '. perm' rc4_bits
export rc4_init rc4_byte rc4_cipher