File: common.scm

package info (click to toggle)
guile-gcrypt 0.3.0-3
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 320 kB
  • sloc: lisp: 2,101; makefile: 68; sh: 11
file content (386 lines) | stat: -rw-r--r-- 10,720 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
;;; guile-gcrypt --- crypto tooling for guile
;;; Copyright © 2013, 2014, 2015, 2019, 2020 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2019 Mathieu Othacehe <m.othacehe@gmail.com>
;;;
;;; This file is part of guile-gcrypt.
;;;
;;; guile-gcrypt is free software; you can redistribute it and/or modify it
;;; under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 3 of the License, or
;;; (at your option) any later version.
;;;
;;; guile-gcrypt is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
;;; General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with guile-gcrypt.  If not, see <http://www.gnu.org/licenses/>.

(define-module (gcrypt common)
  #:use-module (gcrypt internal)
  #:use-module (system foreign)
  #:use-module (ice-9 match)
  #:re-export (gcrypt-version)
  #:export (gcrypt-error
            strip-error-source
            error-code=?
            error-source
            error-string))

;;; Commentary:
;;;
;;; Common code for the GNU Libgcrypt bindings.
;;;
;;; Code:

(define-syntax GPG_ERR_SOURCE_GCRYPT              ;from <gpg-error.h>
  (identifier-syntax 1))

(define-inlinable (strip-error-source error)
  "Strip the error source bits from ERROR, a libgpg-error error code."
  (logand error #xfffff))

(define-inlinable (gcrypt-error value)
  "Return VALUE as a libgpg-error code originating from Libgcrypt."
  (logior (ash GPG_ERR_SOURCE_GCRYPT 24)
          (strip-error-source value)))

(define-inlinable (error-code=? error1 error2)
  "Return true if ERROR1 and ERROR2 denote the same error code, regardless of
the error source."
  (= (strip-error-source error1) (strip-error-source error2)))

(define-syntax define-error-codes
  (syntax-rules ()
    "Define one variable for each error code given, using
GPG_ERR_SOURCE_GCRYPT as the error source."
    ((_ name value rest ...)
     (begin
       (define-public name value)
       (define-error-codes rest ...)))
    ((_)
     #t)))

;; GPG_ERR_ values of 'gpg_err_code_t' in <gpg-error.h>.
(define-error-codes
  error/no-error 0
  error/general 1
  error/unknown-packet 2
  error/unknown-version 3
  error/public-key-algo 4
  error/digest-algo 5
  error/bad-public-key 6
  error/bad-secret-key 7
  error/bad-signature 8
  error/no-public-key 9
  error/checksum 10
  error/bad-passphrase 11
  error/cipher-algo 12
  error/keyring-open 13
  error/invalid-packet 14
  error/invalid-armor 15
  error/no-user-id 16
  error/no-secret-key 17
  error/wrong-secret-key 18
  error/bad-key 19
  error/compr-algo 20
  error/no-prime 21
  error/no-encoding-method 22
  error/no-encryption-scheme 23
  error/no-signature-scheme 24
  error/invalid-attr 25
  error/no-value 26
  error/not-found 27
  error/value-not-found 28
  error/syntax 29
  error/bad-mpi 30
  error/invalid-passphrase 31
  error/sig-class 32
  error/resource-limit 33
  error/invalid-keyring 34
  error/trustdb 35
  error/bad-cert 36
  error/invalid-user-id 37
  error/unexpected 38
  error/time-conflict 39
  error/keyserver 40
  error/wrong-public-key-algo 41
  error/weak-key 43
  ;; The answer.
  error/invalid-key-length 44
  error/invalid-argument 45
  error/bad-uri 46
  error/invalid-uri 47
  error/network 48
  error/unknown-host 49
  error/selftest-failed 50
  error/not-encrypted 51
  error/not-processed 52
  error/unusable-public-key 53
  error/unusable-secret-key 54
  error/invalid-value 55
  error/bad-cert-chain 56
  error/missing-cert 57
  error/no-data 58
  error/bug 59
  error/not-supported 60
  error/invalid-op 61
  error/timeout 62
  error/internal 63
  error/eof-gcrypt 64
  error/invalid-object 65
  error/too-short 66
  error/too-large 67
  error/no-obj 68
  error/not-implemented 69
  error/conflict 70
  error/invalid-cipher-mode 71
  error/invalid-flag 72
  error/invalid-handle 73
  error/truncated 74
  error/incomplete-line 75
  error/invalid-response 76
  error/no-agent 77
  error/agent 78
  error/invalid-data 79
  error/assuan-server-fault 80
  error/assuan 81
  error/invalid-session-key 82
  error/invalid-sexp 83
  error/unsupported-algorithm 84
  error/no-pin-entry 85
  error/pin-entry 86
  error/bad-pin 87
  error/invalid-name 88
  error/bad-data 89
  error/invalid-parameter 90
  error/wrong-card 91
  error/no-dirmngr 92
  error/dirmngr 93
  error/cert-revoked 94
  error/no-crl-known 95
  error/crl-too-old 96
  error/line-too-long 97
  error/not-trusted 98
  error/canceled 99
  error/bad-ca-cert 100
  error/cert-expired 101
  error/cert-too-young 102
  error/unsupported-cert 103
  error/unknown-sexp 104
  error/unsupported-protection 105
  error/corrupted-protection 106
  error/ambiguous-name 107
  error/card 108
  error/card-reset 109
  error/card-removed 110
  error/invalid-card 111
  error/card-not-present 112
  error/no-pkcs15-app 113
  error/not-confirmed 114
  error/configuration 115
  error/no-policy-match 116
  error/invalid-index 117
  error/invalid-id 118
  error/no-scdaemon 119
  error/scdaemon 120
  error/unsupported-protocol 121
  error/bad-pin-method 122
  error/card-not-initialized 123
  error/unsupported-operation 124
  error/wrong-key-usage 125
  error/nothing-found 126
  error/wrong-blob-type 127
  error/missing-value 128
  error/hardware 129
  error/pin-blocked 130
  error/use-conditions 131
  error/pin-not-synced 132
  error/invalid-crl 133
  error/bad-ber 134
  error/invalid-ber 135
  error/element-not-found 136
  error/identifier-not-found 137
  error/invalid-tag 138
  error/invalid-length 139
  error/invalid-keyinfo 140
  error/unexpected-tag 141
  error/not-der-encoded 142
  error/no-cms-obj 143
  error/invalid-cms-obj 144
  error/unknown-cms-obj 145
  error/unsupported-cms-obj 146
  error/unsupported-encoding 147
  error/unsupported-cms-version 148
  error/unknown-algorithm 149
  error/invalid-engine 150
  error/public-key-not-trusted 151
  error/decrypt-failed 152
  error/key-expired 153
  error/sig-expired 154
  error/encoding-problem 155
  error/invalid-state 156
  error/dup-value 157
  error/missing-action 158
  error/module-not-found 159
  error/invalid-oid-string 160
  error/invalid-time 161
  error/invalid-crl-obj 162
  error/unsupported-crl-version 163
  error/invalid-cert-obj 164
  error/unknown-name 165
  error/locale-problem 166
  error/not-locked 167
  error/protocol-violation 168
  error/invalid-mac 169
  error/invalid-request 170
  error/unknown-extn 171
  error/unknown-crit-extn 172
  error/locked 173
  error/unknown-option 174
  error/unknown-command 175
  error/not-operational 176
  error/no-passphrase 177
  error/no-pin 178
  error/not-enabled 179
  error/no-engine 180
  error/missing-key 181
  error/too-many 182
  error/limit-reached 183
  error/not-initialized 184
  error/missing-issuer-cert 185
  error/no-keyserver 186
  error/invalid-curve 187
  error/unknown-curve 188
  error/dup-key 189
  error/ambiguous 190
  error/no-crypt-ctx 191
  error/wrong-crypt-ctx 192
  error/bad-crypt-ctx 193
  error/crypt-ctx-conflict 194
  error/broken-public-key 195
  error/broken-secret-key 196
  error/mac-algo 197
  error/fully-canceled 198
  error/unfinished 199
  error/buffer-too-short 200
  error/sexp-invalid-len-spec 201
  error/sexp-string-too-long 202
  error/sexp-unmatched-paren 203
  error/sexp-not-canonical 204
  error/sexp-bad-character 205
  error/sexp-bad-quotation 206
  error/sexp-zero-prefix 207
  error/sexp-nested-dh 208
  error/sexp-unmatched-dh 209
  error/sexp-unexpected-punc 210
  error/sexp-bad-hex-char 211
  error/sexp-odd-hex-numbers 212
  error/sexp-bad-oct-char 213
  error/subkeys-exp-or-rev 217
  error/db-corrupted 218
  error/server-failed 219
  error/no-name 220
  error/no-key 221
  error/legacy-key 222
  error/request-too-short 223
  error/request-too-long 224
  error/obj-term-state 225
  error/no-cert-chain 226
  error/cert-too-large 227
  error/invalid-record 228
  error/bad-mac 229
  error/unexpected-msg 230
  error/compr-failed 231
  error/would-wrap 232
  error/fatal-alert 233
  error/no-cipher 234
  error/missing-client-cert 235
  error/close-notify 236
  error/ticket-expired 237
  error/bad-ticket 238
  error/unknown-identity 239
  error/bad-hs-cert 240
  error/bad-hs-cert-req 241
  error/bad-hs-cert-ver 242
  error/bad-hs-change-cipher 243
  error/bad-hs-client-hello 244
  error/bad-hs-server-hello 245
  error/bad-hs-server-hello-done 246
  error/bad-hs-finished 247
  error/bad-hs-server-kex 248
  error/bad-hs-client-kex 249
  error/bogus-string 250
  error/forbidden 251
  error/key-disabled 252
  error/key-on-card 253
  error/invalid-lock-obj 254
  error/true 255
  error/false 256
  error/ass-general 257
  error/ass-accept-failed 258
  error/ass-connect-failed 259
  error/ass-invalid-response 260
  error/ass-invalid-value 261
  error/ass-incomplete-line 262
  error/ass-line-too-long 263
  error/ass-nested-commands 264
  error/ass-no-data-cb 265
  error/ass-no-inquire-cb 266
  error/ass-not-a-server 267
  error/ass-not-a-client 268
  error/ass-server-start 269
  error/ass-read-error 270
  error/ass-write-error 271
  error/ass-too-much-data 273
  error/ass-unexpected-cmd 274
  error/ass-unknown-cmd 275
  error/ass-syntax 276
  error/ass-canceled 277
  error/ass-no-input 278
  error/ass-no-output 279
  error/ass-parameter 280
  error/ass-unknown-inquire 281
  error/engine-too-old 300
  error/window-too-small 301
  error/window-too-large 302
  error/missing-envvar 303
  error/user-id-exists 304
  error/name-exists 305
  error/dup-name 306
  error/too-young 307
  error/too-old 308
  error/unknown-flag 309
  error/invalid-order 310
  error/already-fetched 311
  error/try-later 312
  error/wrong-name 313
  error/no-auth 314
  error/bad-auth 315
  error/system-bug 666)

(define error-source
  (let ((proc (libgcrypt->procedure '* "gcry_strsource" (list int))))
    (lambda (err)
      "Return the error source (a string) for ERR, an error code as thrown
along with 'gcry-error'."
      (pointer->string (proc err)))))

(define error-string
  (let ((proc (libgcrypt->procedure '* "gcry_strerror" (list int))))
    (lambda (err)
      "Return the error description (a string) for ERR, an error code as
thrown along with 'gcry-error'."
      (pointer->string (proc err)))))

(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)

;;; gcrypt.scm ends here