openpgp: Use Libgcrypt's crc24 implementation.

This gives an 18% speedup on the wall-clock time of:

  guile -c '(use-modules (git) (guix git-authenticate)) (load-keyring-from-reference (repository-open ".") "keyring")'

* guix/openpgp.scm (crc24): Rewrite by calling out to 'bytevector-hash'.
This commit is contained in:
Ludovic Courtès 2020-06-23 18:11:35 +02:00
parent 4ebbd92c29
commit 6f233040d3
No known key found for this signature in database
GPG key ID: 090B11993D9AEBB5

View file

@ -1029,23 +1029,10 @@ (define* (get-openpgp-keyring port
(define (crc24 bv)
"Compute a CRC24 as described in RFC4880, Section 6.1."
(define poly #x1864cfb)
(let loop ((crc #xb704ce)
(index 0))
(if (= index (bytevector-length bv))
(logand crc #xffffff)
(let ((crc (logxor (ash (bytevector-u8-ref bv index) 16)
crc)))
(let inner ((i 0)
(crc crc))
(if (< i 8)
(let ((crc (ash crc 1)))
(inner (+ i 1)
(if (zero? (logand crc #x1000000))
crc
(logxor crc poly))))
(loop crc (+ index 1))))))))
;; We used to have it implemented in Scheme but the C version here makes
;; 'load-keyring-from-reference' 18% faster when loading the 72
;; ASCII-armored files of today's Guix keyring.
(bytevector->uint (bytevector-hash bv (hash-algorithm crc24-rfc2440))))
(define %begin-block-prefix "-----BEGIN ")
(define %begin-block-suffix "-----")