From 33286075b9c2ecd27607b5674c68909dd528473a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Thu, 8 Mar 2018 11:47:28 +0100 Subject: [PATCH] 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. --- guix/hash.scm | 23 +++++++++++++++++------ 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()))