(define-module (gnubba sha1) #:use-module (rnrs bytevectors) #:use-module (system foreign) #:use-module (ice-9 iconv) #:export (sha1)) (define-syntax GCRY_MD_SHA1 ;; Value defined in /usr/include/gcrypt.h (identifier-syntax 2)) (define* (sha1 string #:optional style) (hex-string (sha1-bytevector (string->bytevector string "UTF-8")))) (define (hex-string bv) "Convert bytevector into string of two-digit hex numbers." (string-concatenate (map (lambda (n) (let ((s (number->string n 16))) (if (eq? 1 (string-length s)) (string-concatenate (list "0" s)) s))) (bytevector->u8-list bv)))) (define sha1-bytevector (let ((hash (pointer->procedure void (dynamic-func "gcry_md_hash_buffer" (dynamic-link "libgcrypt")) `(,int * * ,size_t)))) (lambda (bv) "Return the SHA256 of BV as a bytevector." (let ((digest (make-bytevector 20))) (hash GCRY_MD_SHA1 (bytevector->pointer digest) (bytevector->pointer bv) (bytevector-length bv)) digest))))