diff options
author | Ludovic Courtès <ludo@gnu.org> | 2018-03-08 11:47:28 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2018-03-08 11:56:20 +0100 |
commit | 33286075b9c2ecd27607b5674c68909dd528473a (patch) | |
tree | bd438924700e215fe9cba3d1168dba6e6dfad597 | |
parent | 3aab8851442713f6ad748ffebb055c5e9eae1bd4 (diff) |
hash: Add 'sha1'.
* guix/hash.scm (GCRY_MD_SHA1): New macro.
(bytevector-hash): New procedure.
(sha256): Express in terms of 'bytevector-hash'.
(sha1): New procedure.
* tests/hash.scm ("sha1, empty", "sha1, hello"): New tests.
-rw-r--r-- | guix/hash.scm | 23 | ||||
-rw-r--r-- | tests/hash.scm | 8 |
2 files changed, 25 insertions, 6 deletions
diff --git a/guix/hash.scm b/guix/hash.scm index 773b9d4777..39834043e1 100644 --- a/guix/hash.scm +++ b/guix/hash.scm @@ -23,7 +23,9 @@ #:use-module (system foreign) #:use-module ((guix build utils) #:select (dump-port)) #:use-module (srfi srfi-11) - #:export (sha256 + #:use-module (srfi srfi-26) + #:export (sha1 + sha256 open-sha256-port port-sha256 file-sha256 @@ -44,17 +46,26 @@ ;; Value as of Libgcrypt 1.5.2. (identifier-syntax 8)) -(define sha256 +(define-syntax GCRY_MD_SHA1 + (identifier-syntax 2)) + +(define bytevector-hash (let ((hash (pointer->procedure void (libgcrypt-func "gcry_md_hash_buffer") `(,int * * ,size_t)))) - (lambda (bv) - "Return the SHA256 of BV as a bytevector." - (let ((digest (make-bytevector (/ 256 8)))) - (hash GCRY_MD_SHA256 (bytevector->pointer digest) + (lambda (bv type size) + "Return the hash TYPE, of SIZE bytes, of BV as a bytevector." + (let ((digest (make-bytevector size))) + (hash type (bytevector->pointer digest) (bytevector->pointer bv) (bytevector-length bv)) digest)))) +(define sha1 + (cut bytevector-hash <> GCRY_MD_SHA1 20)) + +(define sha256 + (cut bytevector-hash <> GCRY_MD_SHA256 (/ 256 8))) + (define open-sha256-md (let ((open (pointer->procedure int (libgcrypt-func "gcry_md_open") diff --git a/tests/hash.scm b/tests/hash.scm index b4cf2b61d6..da87616eec 100644 --- a/tests/hash.scm +++ b/tests/hash.scm @@ -40,6 +40,14 @@ (test-begin "hash") +(test-equal "sha1, empty" + (base16-string->bytevector "da39a3ee5e6b4b0d3255bfef95601890afd80709") + (sha1 #vu8())) + +(test-equal "sha1, hello" + (base16-string->bytevector "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed") + (sha1 (string->utf8 "hello world"))) + (test-equal "sha256, empty" %empty-sha256 (sha256 #vu8())) |