/pliant/util/crypto/ciphersaber.pli
 
 1  abstract 
 2    [This is CipherSaber 2 Pliant implementation.] ; eol 
 3    [See ] ; link "CipherSaber Home Page" "http://ciphersaber.gurus.com/" ; [ for more details about the algorithm.] ; eol 
 4    [This implementation is compatibe with CipherSaber only if you use a resonably small key containing at most 'max_legal_key_bits' bits.] 
 5   
 6  module "/pliant/language/context.pli" 
 7  module "/pliant/language/stream.pli" 
 8  module "random.pli" 
 9  module "rc4.pli" 
 10   
 11  constant iv_length 10 
 12   
 13   
 14  function file_rc4_encode srcname key n destname 
 15    arg Str srcname key destname ; arg Int n 
 16    (var Stream src) open srcname in 
 17    (var Stream dest) open destname out 
 18    var Str rand := random_string:iv_length 
 19    dest writechars rand 
 20    rc4_init (var RC4Ctx ctx) key+rand n 
 21    while not src:atend 
 22      src raw_read addressof:(var Char c) 1 
 23      var Char e := character (c:number .xor. rc4_byte:ctx) 
 24      dest raw_write addressof:e 1 
 25   
 26  function file_rc4_decode srcname key n destname 
 27    arg Str srcname key destname ; arg Int n 
 28    (var Stream src) open srcname in 
 29    var Str rand := repeat iv_length " " 
 30    src raw_read rand:characters rand:len 
 31    rc4_init (var RC4Ctx ctx) key+rand n 
 32    (var Stream dest) open destname out 
 33    while not src:atend 
 34      src read_available (var Address adr) (var Int size) 
 35      rc4_cipher ctx adr adr size 
 36      dest raw_write adr size 
 37   
 38  export file_rc4_encode file_rc4_decode 
 39   
 40   
 41  doc 
 42    [Test it on a sample.] 
 43   
 44  if pliant_debugging_level>=2 and rc4_bits=8 and iv_length=10 
 45    function rc4_test 
 46      (var Stream src) open "file:/tmp/encoded.bin" out 
 47      src writechars "1234567890abcdef" 
 48      src close 
 49      file_rc4_decode "file:/tmp/encoded.bin" "xyz" 1 "file:/tmp/clear.bin" 
 50      (var Stream dest) open "file:/tmp/clear.bin" in 
 51      var Str clear := dest readline 
 52      if clear<>"U1w'Kn" 
 53        error error_id_unexpected "CipherSaber Pliant implemententation is buggy: "+clear 
 54    rc4_test