aboutsummaryrefslogtreecommitdiff
path: root/module/crypto.scm
blob: df71ffbb6ccc0ddefe47ea35190dbdfe4e64edbd (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
34
35
36
(define-module (crypto)
  :use-module (rnrs bytevectors)
  :use-module (system foreign)
  :use-module (ice-9 format)
  :use-module (srfi srfi-88)
  :export (sha256 checksum->string))

(define-once libcrypto (dynamic-link "libcrypto"))

(define SHA_DIGEST_LENGTH       20)
(define SHA224_DIGEST_LENGTH    28)
(define SHA256_DIGEST_LENGTH    32)
(define SHA384_DIGEST_LENGTH    48)
(define SHA512_DIGEST_LENGTH    64)

(define SHA256
 ((@ (system foreign) pointer->procedure)
  '* (dynamic-func "SHA256" libcrypto)
  `(* ,(@ (system foreign) size_t) *)))

(define (sha256 msg)
  (define md (make-bytevector SHA256_DIGEST_LENGTH))
  (define bv
    (cond ((bytevector? msg) msg)
          ((string? msg) (string->utf8 msg))
          (else (scm-error 'wrong-type-arg "sha256"
                           "Wrong type argument. Expected string or bytevector, got ~s"
                           (list msg) (list msg)))))
  (SHA256 ((@ (system foreign) bytevector->pointer) bv)
          (bytevector-length bv)
          ((@ (system foreign) bytevector->pointer) md))
  md)

(define* (checksum->string md optional: port)
  (format port "~{~2'0x~}" (bytevector->u8-list md)))