chicken-rabbit/rabbit.scm

51 lines
1.5 KiB
Scheme

;; Rabbit stream cipher
;; written by Martin Boesgaard, Mette Vesterager, Thomas Christensen and Erik Zenner
;; public domain
;; key is 128 bit == 16 characters
;; iv is 64 bit = 8 characters
;; Based on lambdanative rabbit lib, ported to Chicken Scheme by Ivan Raikov
(define debuglevel (make-parameter 0))
(define (logger level . x)
(if (>= (debuglevel) level) (apply printf (append (list "rabbit: ") x))))
#>
#define C_bytevector_length(x) (C_header_size(x))
#include "rabbitlib.c"
<#
(define (make-context key) ; key must be at least 24 bytes
(logger 1 "make-context " (utf8->string key))
((foreign-safe-lambda* nonnull-c-pointer ((scheme-object key))
#<<EOT
int len;
void *keydata, *result;
len = C_bytevector_length(key);
keydata = C_c_bytevector(key);
result = (void *)_rabbit_make(keydata, len);
C_return(result);
EOT
) key))
(define (destroy-context! ctx)
(logger 1 "destroy-context " ctx)
((foreign-lambda* void ((nonnull-c-pointer ctx)) "_rabbit_destroy(ctx);") ctx))
(define (encode! ctx v)
(logger 2 "encode/decode " ctx " " v)
(if (bytevector? v)
(begin
((foreign-lambda* void ((nonnull-c-pointer ctx) (scheme-object v))
#<<EOT
int len;
void *data;
data = C_c_bytevector(v);
len = C_bytevector_length(v);
_rabbit_encode(ctx, data, len);
EOT
) ctx v)
v)
#f))
(define decode! encode!)