Compare commits
5 commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b289073f0a | |||
|
|
16608b0ee9 | ||
|
|
1c1cdc0d20 | ||
|
|
3fc6f5e678 | ||
|
|
88c262ddd4 |
7 changed files with 78 additions and 133 deletions
8
rabbit.egg
Normal file
8
rabbit.egg
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
;; -*- 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
25
rabbit.meta
|
|
@ -1,25 +0,0 @@
|
||||||
;; -*- 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"))
|
|
||||||
|
|
@ -1,7 +1,4 @@
|
||||||
;; -*- scheme -*-
|
;; -*- lisp-data -*-
|
||||||
|
(repo git "git://git.linuxposting.xyz/afiw/chicken-rabbit.git")
|
||||||
(repo git "git://github.com/iraikov/chicken-rabbit.git")
|
(uri targz "https://git.linuxposting.xyz/afiw/chicken-rabbit/archive/{egg-release}.tar.gz")
|
||||||
(uri targz "https://github.com/iraikov/chicken-rabbit/tarball/{egg-release}")
|
(release "3.0")
|
||||||
(uri files-list "http://code.call-cc.org/files-list?egg={egg-name};egg-release={egg-release};chicken-release={chicken-release}" old-uri)
|
|
||||||
|
|
||||||
(release "v1.1")
|
|
||||||
|
|
|
||||||
80
rabbit.scm
80
rabbit.scm
|
|
@ -6,66 +6,46 @@
|
||||||
|
|
||||||
;; Based on lambdanative rabbit lib, ported to Chicken Scheme by Ivan Raikov
|
;; Based on lambdanative rabbit lib, ported to Chicken Scheme by Ivan Raikov
|
||||||
|
|
||||||
(module rabbit
|
(define debuglevel (make-parameter 0))
|
||||||
|
(define (logger level . x)
|
||||||
(rabbit-debuglevel
|
(if (>= (debuglevel) level) (apply printf (append (list "rabbit: ") x))))
|
||||||
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
|
||||||
(define (rabbit-make key) ;; key must be at least 24 bytes
|
(logger 1 "make-context " (utf8->string key))
|
||||||
(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))
|
||||||
#<<END
|
#<<EOT
|
||||||
int len; void* keydata, *result;
|
int len;
|
||||||
len = C_bytevector_length(key);
|
void *keydata, *result;
|
||||||
keydata = C_c_bytevector (key);
|
len = C_bytevector_length(key);
|
||||||
result = (void *)_rabbit_make(keydata, len);
|
keydata = C_c_bytevector(key);
|
||||||
C_return (result);
|
result = (void *)_rabbit_make(keydata, len);
|
||||||
END
|
C_return(result);
|
||||||
) key)
|
EOT
|
||||||
)
|
) key))
|
||||||
|
|
||||||
|
(define (destroy-context! ctx)
|
||||||
|
(logger 1 "destroy-context " ctx)
|
||||||
|
((foreign-lambda* void ((nonnull-c-pointer ctx)) "_rabbit_destroy(ctx);") ctx))
|
||||||
|
|
||||||
(define (rabbit-destroy! ctx)
|
(define (encode! ctx v)
|
||||||
(rabbit-log 1 "rabbit-destroy " ctx)
|
(logger 2 "encode/decode " ctx " " v)
|
||||||
((foreign-lambda* void ((nonnull-c-pointer ctx))
|
(if (bytevector? v)
|
||||||
#<<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))
|
||||||
#<<EOF
|
#<<EOT
|
||||||
int len; void* data;
|
int len;
|
||||||
data = C_c_bytevector (v);
|
void *data;
|
||||||
len = C_bytevector_length(v);
|
data = C_c_bytevector(v);
|
||||||
_rabbit_encode(ctx,data,len);
|
len = C_bytevector_length(v);
|
||||||
EOF
|
_rabbit_encode(ctx, data, len);
|
||||||
) ctx v)
|
EOT
|
||||||
|
) ctx v)
|
||||||
v)
|
v)
|
||||||
#f))
|
#f))
|
||||||
|
|
||||||
(define rabbit-decode! rabbit-encode!)
|
(define decode! encode!)
|
||||||
|
|
||||||
)
|
|
||||||
|
|
|
||||||
20
rabbit.setup
20
rabbit.setup
|
|
@ -1,20 +0,0 @@
|
||||||
;; -*- 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 "v1.1")
|
|
||||||
))
|
|
||||||
|
|
||||||
14
rabbit.sld
Normal file
14
rabbit.sld
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
(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"))
|
||||||
|
|
@ -1,32 +1,23 @@
|
||||||
(use rabbit srfi-4 test)
|
(import
|
||||||
|
(scheme base)
|
||||||
(randomize)
|
(chicken base)
|
||||||
|
(chicken random)
|
||||||
(define (random-blob n)
|
(chicken bytevector)
|
||||||
(let ((v (make-u8vector n)))
|
(rabbit)
|
||||||
(let loop ((n n))
|
(test))
|
||||||
(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) #t
|
(if (= n 0)
|
||||||
(if (let* (
|
#t
|
||||||
(keylen (+ (random 10) 24))
|
(if (let* ((keylen (+ (pseudo-random-integer 10) 24))
|
||||||
(key (random-blob keylen))
|
(key (random-bytes (make-bytevector keylen)))
|
||||||
(datalen (random 100000))
|
(datalen (pseudo-random-integer 100000))
|
||||||
(data (random-blob datalen))
|
(data (random-bytes (make-bytevector datalen)))
|
||||||
(ctx (rabbit-make key))
|
(ctx (make-context key)))
|
||||||
)
|
(let ((res (not (equal? data (decode! ctx (encode! ctx data))))))
|
||||||
(let ((res (not (equal? data (rabbit-decode! ctx (rabbit-encode! ctx data))))))
|
(destroy-context! ctx)
|
||||||
(rabbit-destroy! ctx)
|
res))
|
||||||
res))
|
#f
|
||||||
#f
|
(loop (- n 1)))))))
|
||||||
(loop (- n 1)))))))
|
|
||||||
|
|
||||||
;; eof
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue