Compare commits

..

No commits in common. "mistress" and "v1.0" have entirely different histories.

8 changed files with 133 additions and 78 deletions

View file

@ -1,8 +0,0 @@
;; -*- lisp-data -*-
((synopsis "Rabbit stream cipher.")
(license "Public Domain")
(category crypt)
(test-dependencies test)
(maintainer "Lilianna Smólska")
(author "Martin Boesgaard, Mette Vesterager, Thomas Christensen and Erik Zenner")
(components (extension rabbit (source "rabbit.sld"))))

25
rabbit.meta Normal file
View file

@ -0,0 +1,25 @@
;; -*- Hen -*-
((egg "rabbit.egg") ; This should never change
; List here all the files that should be bundled as part of your egg.
(files "rabbit.setup" "rabbit.meta" "rabbit.scm" "rabbitlib.c" "tests")
; Your egg's license:
(license "Public Domain")
; Pick one from the list of categories (see below) for your egg and
; enter it here.
(category crypt)
; A list of eggs mpi depends on.
(test-depends test)
(maintainer "Ivan Raikov")
(author "Martin Boesgaard, Mette Vesterager, Thomas Christensen and Erik Zenner")
(synopsis "Rabbit stream cipher"))

View file

@ -1,4 +0,0 @@
;; -*- lisp-data -*-
(repo git "git://git.linuxposting.xyz/afiw/chicken-rabbit.git")
(uri targz "https://git.linuxposting.xyz/afiw/chicken-rabbit/archive/{egg-release}.tar.gz")
(release "3.0")

View file

@ -6,46 +6,66 @@
;; Based on lambdanative rabbit lib, ported to Chicken Scheme by Ivan Raikov ;; Based on lambdanative rabbit lib, ported to Chicken Scheme by Ivan Raikov
(define debuglevel (make-parameter 0)) (module rabbit
(define (logger level . x)
(if (>= (debuglevel) level) (apply printf (append (list "rabbit: ") x)))) (rabbit-debuglevel
rabbit-make
rabbit-destroy!
rabbit-encode!
rabbit-decode!)
(import scheme chicken foreign)
(import (only extras printf))
(define rabbit-debuglevel (make-parameter 0))
(define (rabbit-log level . x)
(if (>= (rabbit-debuglevel) level) (apply printf (append (list "rabbit: ") x))))
#> #>
#define C_bytevector_length(x) (C_header_size(x)) #define C_bytevector_length(x) (C_header_size(x))
#include "rabbitlib.c" #include "rabbitlib.c"
<# <#
(define (make-context key) ; key must be at least 24 bytes
(logger 1 "make-context " (utf8->string key)) (define (rabbit-make key) ;; key must be at least 24 bytes
(rabbit-log 1 "rabbit-make " (blob->string key))
((foreign-safe-lambda* nonnull-c-pointer ((scheme-object key)) ((foreign-safe-lambda* nonnull-c-pointer ((scheme-object key))
#<<EOT #<<END
int len; int len; void* keydata, *result;
void *keydata, *result; len = C_bytevector_length(key);
len = C_bytevector_length(key); keydata = C_c_bytevector (key);
keydata = C_c_bytevector(key); result = (void *)_rabbit_make(keydata, len);
result = (void *)_rabbit_make(keydata, len); C_return (result);
C_return(result); END
EOT ) key)
) 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) (define (rabbit-destroy! ctx)
(logger 2 "encode/decode " ctx " " v) (rabbit-log 1 "rabbit-destroy " ctx)
(if (bytevector? v) ((foreign-lambda* void ((nonnull-c-pointer ctx))
#<<END
_rabbit_destroy(ctx);
END
) ctx)
)
(define (rabbit-encode! ctx v)
(rabbit-log 2 "rabbit-encode/decode " ctx " " v)
(if (blob? v)
(begin (begin
((foreign-lambda* void ((nonnull-c-pointer ctx) (scheme-object v)) ((foreign-lambda* void ((nonnull-c-pointer ctx) (scheme-object v))
#<<EOT #<<EOF
int len; int len; void* data;
void *data; data = C_c_bytevector (v);
data = C_c_bytevector(v);
len = C_bytevector_length(v); len = C_bytevector_length(v);
_rabbit_encode(ctx, data, len); _rabbit_encode(ctx,data,len);
EOT EOF
) ctx v) ) ctx v)
v) v)
#f)) #f))
(define decode! encode!) (define rabbit-decode! rabbit-encode!)
)

20
rabbit.setup Normal file
View file

@ -0,0 +1,20 @@
;; -*- Hen -*-
(define (dynld-name fn)
(make-pathname #f fn ##sys#load-dynamic-extension))
(compile -S -O2 -d0 -I. -s rabbit.scm -j rabbit)
(compile -O2 -d0 -s rabbit.import.scm)
(install-extension
; Name of your extension:
'rabbit
; Files to install for your extension:
`(,(dynld-name "rabbit") ,(dynld-name "rabbit.import") )
; Assoc list with properties for your extension:
`((version 1.0)
))

View file

@ -1,14 +0,0 @@
(define-library rabbit
(import
(scheme base)
(chicken base)
(chicken bytevector)
(chicken foreign)
(chicken format))
(export
debuglevel
make-context
destroy-context!
encode!
decode!)
(include "rabbit.scm"))

View file

@ -0,0 +1,7 @@
;; -*- scheme -*-
(repo git "git://github.com/iraikov/chicken-rabbit.git")
(uri targz "https://github.com/iraikov/chicken-rabbit/tarball/{egg-release}")
(uri files-list "http://code.call-cc.org/files-list?egg={egg-name};egg-release={egg-release};chicken-release={chicken-release}" old-uri)
(release "1.0")

View file

@ -1,23 +1,32 @@
(import (use rabbit srfi-4 test)
(scheme base)
(chicken base) (randomize)
(chicken random)
(chicken bytevector) (define (random-blob n)
(rabbit) (let ((v (make-u8vector n)))
(test)) (let loop ((n n))
(if (> n 0)
(begin
(u8vector-set! v (- n 1) (random 255))
(loop (- n 1)))
(u8vector->blob v)))
))
(test-group "rabbit 1000 random vectors" (test-group "rabbit 1000 random vectors"
(let loop ((n 1000)) (let loop ((n 1000))
(test-assert (test-assert
(if (= n 0) (if (= n 0) #t
#t (if (let* (
(if (let* ((keylen (+ (pseudo-random-integer 10) 24)) (keylen (+ (random 10) 24))
(key (random-bytes (make-bytevector keylen))) (key (random-blob keylen))
(datalen (pseudo-random-integer 100000)) (datalen (random 100000))
(data (random-bytes (make-bytevector datalen))) (data (random-blob datalen))
(ctx (make-context key))) (ctx (rabbit-make key))
(let ((res (not (equal? data (decode! ctx (encode! ctx data)))))) )
(destroy-context! ctx) (let ((res (not (equal? data (rabbit-decode! ctx (rabbit-encode! ctx data))))))
(rabbit-destroy! ctx)
res)) res))
#f #f
(loop (- n 1))))))) (loop (- n 1)))))))
;; eof