summaryrefslogtreecommitdiff
path: root/guix/pk-crypto.scm
diff options
context:
space:
mode:
Diffstat (limited to 'guix/pk-crypto.scm')
-rw-r--r--guix/pk-crypto.scm22
1 files changed, 18 insertions, 4 deletions
diff --git a/guix/pk-crypto.scm b/guix/pk-crypto.scm
index 481d3f2463..71104128c1 100644
--- a/guix/pk-crypto.scm
+++ b/guix/pk-crypto.scm
@@ -134,11 +134,16 @@ thrown along with 'gcry-error'."
(proc (pointer->procedure int ptr `(* * ,size_t ,int))))
(lambda (str)
"Parse STR and return the corresponding gcrypt s-expression."
+
+ ;; When STR comes from 'canonical-sexp->string', it may contain
+ ;; characters that are really meant to be interpreted as bytes as in a C
+ ;; 'char *'. Thus, convert STR to ISO-8859-1 so the byte values of the
+ ;; characters are preserved.
(let* ((sexp (bytevector->pointer (make-bytevector (sizeof '*))))
- (err (proc sexp (string->pointer str) 0 1)))
+ (err (proc sexp (string->pointer str "ISO-8859-1") 0 1)))
(if (= 0 err)
(pointer->canonical-sexp (dereference-pointer sexp))
- (throw 'gcry-error err))))))
+ (throw 'gcry-error 'string->canonical-sexp err))))))
(define-syntax GCRYSEXP_FMT_ADVANCED
(identifier-syntax 3))
@@ -291,7 +296,7 @@ is 'private-key'.)"
(canonical-sexp->pointer secret-key))))
(if (= 0 err)
(pointer->canonical-sexp (dereference-pointer sig))
- (throw 'gry-error err))))))
+ (throw 'gcry-error 'sign err))))))
(define verify
(let* ((ptr (libgcrypt-func "gcry_pk_verify"))
@@ -313,7 +318,7 @@ s-expression like: (genkey (rsa (nbits 4:2048)))."
(err (proc key (canonical-sexp->pointer params))))
(if (zero? err)
(pointer->canonical-sexp (dereference-pointer key))
- (throw 'gcry-error err))))))
+ (throw 'gcry-error 'generate-key err))))))
(define find-sexp-token
(let* ((ptr (libgcrypt-func "gcry_sexp_find_token"))
@@ -398,4 +403,13 @@ use pattern matching."
(write sexp)))))
+(define (gcrypt-error-printer port key args default-printer)
+ "Print the gcrypt error specified by ARGS."
+ (match args
+ ((proc err)
+ (format port "In procedure ~a: ~a: ~a"
+ proc (error-source err) (error-string err)))))
+
+(set-exception-printer! 'gcry-error gcrypt-error-printer)
+
;;; pk-crypto.scm ends here