| |
| /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 | |
| |