summaryrefslogtreecommitdiff
path: root/sha1.scm
blob: 6b3cb374d5e53294275e13046ba75e0dc479fad1 (about) (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
(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))))