summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--guix/pk-crypto.scm7
-rw-r--r--tests/pk-crypto.scm12
2 files changed, 17 insertions, 2 deletions
diff --git a/guix/pk-crypto.scm b/guix/pk-crypto.scm
index 0e7affcce8..cf18faea04 100644
--- a/guix/pk-crypto.scm
+++ b/guix/pk-crypto.scm
@@ -298,8 +298,11 @@ return #f if not found."
(if (= index len)
result
(loop (+ 1 index)
- (proc (or (canonical-sexp-nth sexp index)
- (canonical-sexp-nth-data sexp index))
+ ;; XXX: Call 'nth-data' *before* 'nth' to work around
+ ;; <https://bugs.g10code.com/gnupg/issue1594>, which
+ ;; affects 1.6.0 and earlier versions.
+ (proc (or (canonical-sexp-nth-data sexp index)
+ (canonical-sexp-nth sexp index))
result)))))
(error "sexp is not a list" sexp)))
diff --git a/tests/pk-crypto.scm b/tests/pk-crypto.scm
index a894a60531..de775d2e19 100644
--- a/tests/pk-crypto.scm
+++ b/tests/pk-crypto.scm
@@ -209,6 +209,18 @@
(map (compose canonical-sexp->sexp sexp->canonical-sexp)
lst)))
+(let ((sexp `(signature
+ (public-key
+ (rsa
+ (n ,(make-bytevector 1024 1))
+ (e ,(base16-string->bytevector "010001")))))))
+ (test-equal "https://bugs.g10code.com/gnupg/issue1594"
+ ;; The gcrypt bug above was primarily affecting our uses in
+ ;; 'canonical-sexp->sexp', typically when applied to a signature sexp (in
+ ;; 'guix authenticate -verify') with a "big" RSA key, such as 4096 bits.
+ sexp
+ (canonical-sexp->sexp (sexp->canonical-sexp sexp))))
+
(test-end)