|
Packit |
d7e8d0 |
;;;; gpgme.lisp
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Copyright (C) 2006 g10 Code GmbH
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
;;; This file is part of GPGME-CL.
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
;;; GPGME-CL is free software; you can redistribute it and/or modify it
|
|
Packit |
d7e8d0 |
;;; under the terms of the GNU General Public License as published by
|
|
Packit |
d7e8d0 |
;;; the Free Software Foundation; either version 2 of the License, or
|
|
Packit |
d7e8d0 |
;;; (at your option) any later version.
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
;;; GPGME-CL is distributed in the hope that it will be useful, but
|
|
Packit |
d7e8d0 |
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
d7e8d0 |
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
d7e8d0 |
;;; Lesser General Public License for more details.
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
;;; You should have received a copy of the GNU General Public License
|
|
Packit |
d7e8d0 |
;;; along with GPGME; if not, write to the Free Software Foundation,
|
|
Packit |
d7e8d0 |
;;; Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; TODO
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Set up the library.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(in-package :gpgme)
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(deftype byte-array ()
|
|
Packit Service |
30b792 |
'(simple-array (unsigned-byte 8) (*)))
|
|
Packit Service |
30b792 |
|
|
Packit Service |
30b792 |
(deftype character-array ()
|
|
Packit Service |
30b792 |
'(simple-array character (*)))
|
|
Packit Service |
30b792 |
|
|
Packit |
d7e8d0 |
;;; Debugging.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defvar *debug* nil "If debugging output should be given or not.")
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Load the foreign library.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(define-foreign-library libgpgme
|
|
Packit |
d7e8d0 |
(:unix "libgpgme.so")
|
|
Packit |
d7e8d0 |
(t (:default "libgpgme")))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(use-foreign-library libgpgme)
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; System dependencies.
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
; Access to ERRNO.
|
|
Packit |
d7e8d0 |
(defcfun ("strerror" c-strerror) :string
|
|
Packit |
d7e8d0 |
(err :int))
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defun get-errno ()
|
|
Packit Service |
30b792 |
*errno*)
|
|
Packit Service |
30b792 |
|
|
Packit Service |
30b792 |
(defun set-errno (errno)
|
|
Packit Service |
30b792 |
(setf *errno* errno))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(define-condition system-error (error)
|
|
Packit |
d7e8d0 |
((errno :initarg :errno :reader system-error-errno))
|
|
Packit |
d7e8d0 |
(:report (lambda (c stream)
|
|
Packit |
d7e8d0 |
(format stream "System error: ~A: ~A"
|
|
Packit |
d7e8d0 |
(system-error-errno c)
|
|
Packit |
d7e8d0 |
(c-strerror (system-error-errno c)))))
|
|
Packit |
d7e8d0 |
(:documentation "Signalled when an errno is encountered."))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
; Needed to write passphrases.
|
|
Packit |
d7e8d0 |
(defcfun ("write" c-write) ssize-t
|
|
Packit |
d7e8d0 |
(fd :int)
|
|
Packit |
d7e8d0 |
(buffer :string) ; Actually :pointer, but we only need string.
|
|
Packit |
d7e8d0 |
(size size-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun system-write (fd buffer size)
|
|
Packit |
d7e8d0 |
(let ((res (c-write fd buffer size)))
|
|
Packit |
d7e8d0 |
(when (< res 0) (error 'system-error :errno (get-errno)))
|
|
Packit |
d7e8d0 |
res))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
;;; C Interface Definitions
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Data Type Interface
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Some new data types used for easier translation.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; The number of include certs. Translates to NIL for default.
|
|
Packit Service |
30b792 |
(defctype cert-int-t
|
|
Packit Service |
30b792 |
(:wrapper :int
|
|
Packit Service |
30b792 |
:from-c translate-cert-int-t-from-foreign
|
|
Packit Service |
30b792 |
:to-c translate-cert-int-t-to-foreign))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; A string that may be NIL to indicate a null pointer.
|
|
Packit Service |
30b792 |
(defctype string-or-nil-t
|
|
Packit Service |
30b792 |
(:wrapper :string
|
|
Packit Service |
30b792 |
:to-c translate-string-or-nil-t-to-foreign))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Some opaque data types used by GPGME.
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defctype gpgme-ctx-t
|
|
Packit Service |
30b792 |
(:wrapper :pointer
|
|
Packit Service |
30b792 |
:to-c translate-gpgme-ctx-t-to-foreign)
|
|
Packit Service |
30b792 |
"The GPGME context type.")
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defctype gpgme-data-t
|
|
Packit Service |
30b792 |
(:wrapper :pointer
|
|
Packit Service |
30b792 |
:to-c translate-gpgme-data-t-to-foreign)
|
|
Packit Service |
30b792 |
"The GPGME data object type.")
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Wrappers for the libgpg-error library.
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defctype gpgme-error-t
|
|
Packit Service |
30b792 |
(:wrapper gpg-error::gpg-error-t
|
|
Packit Service |
30b792 |
:from-c translate-gpgme-error-t-from-foreign
|
|
Packit Service |
30b792 |
:to-c translate-gpgme-error-t-to-foreign)
|
|
Packit Service |
30b792 |
"The GPGME error type.")
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defctype gpgme-error-no-signal-t
|
|
Packit Service |
30b792 |
(:wrapper gpg-error::gpg-error-t
|
|
Packit Service |
30b792 |
:from-c translate-gpgme-error-no-signal-t-from-foreign)
|
|
Packit |
d7e8d0 |
"The GPGME error type (this version does not signal conditions in translation.")
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defctype gpgme-err-code-t gpg-error::gpg-err-code-t
|
|
Packit |
d7e8d0 |
"The GPGME error code type.")
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defctype gpgme-err-source-t gpg-error::gpg-err-source-t
|
|
Packit |
d7e8d0 |
"The GPGME error source type.")
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-err-make (source code)
|
|
Packit |
d7e8d0 |
"Construct an error value from an error code and source."
|
|
Packit |
d7e8d0 |
(gpg-err-make source code))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-error (code)
|
|
Packit |
d7e8d0 |
"Construct an error value from an error code."
|
|
Packit |
d7e8d0 |
(gpgme-err-make :gpg-err-source-gpgme code))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-err-code (err)
|
|
Packit |
d7e8d0 |
"Retrieve an error code from the error value ERR."
|
|
Packit |
d7e8d0 |
(gpg-err-code err))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-err-source (err)
|
|
Packit |
d7e8d0 |
"Retrieve an error source from the error value ERR."
|
|
Packit |
d7e8d0 |
(gpg-err-source err))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-strerror (err)
|
|
Packit Service |
30b792 |
"Return a string containing a description of the error code."
|
|
Packit |
d7e8d0 |
(gpg-strerror err))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-strsource (err)
|
|
Packit Service |
30b792 |
"Return a string containing a description of the error source."
|
|
Packit |
d7e8d0 |
(gpg-strsource err))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-err-code-from-errno (err)
|
|
Packit |
d7e8d0 |
"Retrieve the error code for the system error. If the system error
|
|
Packit |
d7e8d0 |
is not mapped, :gpg-err-unknown-errno is returned."
|
|
Packit |
d7e8d0 |
(gpg-err-code-from-errno err))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-err-code-to-errno (code)
|
|
Packit |
d7e8d0 |
"Retrieve the system error for the error code. If this is not a
|
|
Packit |
d7e8d0 |
system error, 0 is returned."
|
|
Packit |
d7e8d0 |
(gpg-err-code-to-errno code))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-err-make-from-errno (source err)
|
|
Packit |
d7e8d0 |
(gpg-err-make-from-errno source err))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-error-from-errno (err)
|
|
Packit |
d7e8d0 |
(gpg-error-from-errno err))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcenum gpgme-data-encoding-t
|
|
Packit |
d7e8d0 |
"The possible encoding mode of gpgme-data-t objects."
|
|
Packit |
d7e8d0 |
(:none 0)
|
|
Packit |
d7e8d0 |
(:binary 1)
|
|
Packit |
d7e8d0 |
(:base64 2)
|
|
Packit Service |
30b792 |
(:armor 3)
|
|
Packit Service |
30b792 |
(:url 4)
|
|
Packit Service |
30b792 |
(:urlesc 5)
|
|
Packit Service |
30b792 |
(:url0 6)
|
|
Packit Service |
30b792 |
(:mime 7))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcenum gpgme-pubkey-algo-t
|
|
Packit |
d7e8d0 |
"Public key algorithms from libgcrypt."
|
|
Packit |
d7e8d0 |
(:rsa 1)
|
|
Packit |
d7e8d0 |
(:rsa-e 2)
|
|
Packit |
d7e8d0 |
(:rsa-s 3)
|
|
Packit |
d7e8d0 |
(:elg-e 16)
|
|
Packit |
d7e8d0 |
(:dsa 17)
|
|
Packit Service |
30b792 |
(:ecc 18)
|
|
Packit Service |
30b792 |
(:elg 20)
|
|
Packit Service |
30b792 |
(:ecdsa 301)
|
|
Packit Service |
30b792 |
(:ecdh 302)
|
|
Packit Service |
30b792 |
(:eddsa 303))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcenum gpgme-hash-algo-t
|
|
Packit |
d7e8d0 |
"Hash algorithms from libgcrypt."
|
|
Packit |
d7e8d0 |
(:none 0)
|
|
Packit |
d7e8d0 |
(:md5 1)
|
|
Packit |
d7e8d0 |
(:sha1 2)
|
|
Packit |
d7e8d0 |
(:rmd160 3)
|
|
Packit |
d7e8d0 |
(:md2 5)
|
|
Packit |
d7e8d0 |
(:tiger 6)
|
|
Packit |
d7e8d0 |
(:haval 7)
|
|
Packit |
d7e8d0 |
(:sha256 8)
|
|
Packit |
d7e8d0 |
(:sha384 9)
|
|
Packit |
d7e8d0 |
(:sha512 10)
|
|
Packit Service |
30b792 |
(:sha224 11)
|
|
Packit |
d7e8d0 |
(:md4 301)
|
|
Packit |
d7e8d0 |
(:crc32 302)
|
|
Packit |
d7e8d0 |
(:crc32-rfc1510 303)
|
|
Packit |
d7e8d0 |
(:crc24-rfc2440 304))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcenum gpgme-sig-mode-t
|
|
Packit |
d7e8d0 |
"The available signature modes."
|
|
Packit |
d7e8d0 |
(:none 0)
|
|
Packit |
d7e8d0 |
(:detach 1)
|
|
Packit |
d7e8d0 |
(:clear 2))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcenum gpgme-validity-t
|
|
Packit |
d7e8d0 |
"The available validities for a trust item or key."
|
|
Packit |
d7e8d0 |
(:unknown 0)
|
|
Packit |
d7e8d0 |
(:undefined 1)
|
|
Packit |
d7e8d0 |
(:never 2)
|
|
Packit |
d7e8d0 |
(:marginal 3)
|
|
Packit |
d7e8d0 |
(:full 4)
|
|
Packit |
d7e8d0 |
(:ultimate 5))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcenum gpgme-protocol-t
|
|
Packit |
d7e8d0 |
"The available protocols."
|
|
Packit |
d7e8d0 |
(:openpgp 0)
|
|
Packit Service |
30b792 |
(:cms 1)
|
|
Packit Service |
30b792 |
(:gpgconf 2)
|
|
Packit Service |
30b792 |
(:assuan 3)
|
|
Packit Service |
30b792 |
(:g13 4)
|
|
Packit Service |
30b792 |
(:uiserver 5)
|
|
Packit Service |
30b792 |
(:spawn 6)
|
|
Packit Service |
30b792 |
(:default 254)
|
|
Packit Service |
30b792 |
(:unknown 255))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defbitfield (gpgme-keylist-mode-t :unsigned-int)
|
|
Packit |
d7e8d0 |
"The available keylist mode flags."
|
|
Packit |
d7e8d0 |
(:local 1)
|
|
Packit |
d7e8d0 |
(:extern 2)
|
|
Packit |
d7e8d0 |
(:sigs 4)
|
|
Packit Service |
30b792 |
(:sig-notations)
|
|
Packit Service |
30b792 |
(:with-secret 16)
|
|
Packit Service |
30b792 |
(:with-tofu 32)
|
|
Packit Service |
30b792 |
(:ephemeral 128)
|
|
Packit |
d7e8d0 |
(:validate 256))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defbitfield (gpgme-sig-notation-flags-t :unsigned-int)
|
|
Packit |
d7e8d0 |
"The available signature notation flags."
|
|
Packit |
d7e8d0 |
(:human-readable 1)
|
|
Packit |
d7e8d0 |
(:critical 2))
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defctype gpgme-sig-notation-t
|
|
Packit Service |
30b792 |
(:wrapper :pointer
|
|
Packit Service |
30b792 |
:from-c translate-gpgme-sig-notation-t-from-foreign)
|
|
Packit |
d7e8d0 |
"Signature notation pointer type.")
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
;; FIXME: Doesn't this depend on endianness?
|
|
Packit |
d7e8d0 |
(defbitfield (gpgme-sig-notation-bitfield :unsigned-int)
|
|
Packit |
d7e8d0 |
(:human-readable 1)
|
|
Packit |
d7e8d0 |
(:critical 2))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcstruct gpgme-sig-notation
|
|
Packit |
d7e8d0 |
"Signature notations."
|
|
Packit |
d7e8d0 |
(next gpgme-sig-notation-t)
|
|
Packit |
d7e8d0 |
(name :pointer)
|
|
Packit |
d7e8d0 |
(value :pointer)
|
|
Packit |
d7e8d0 |
(name-len :int)
|
|
Packit |
d7e8d0 |
(value-len :int)
|
|
Packit |
d7e8d0 |
(flags gpgme-sig-notation-flags-t)
|
|
Packit |
d7e8d0 |
(bitfield gpgme-sig-notation-bitfield))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcenum gpgme-status-code-t
|
|
Packit |
d7e8d0 |
"The possible status codes for the edit operation."
|
|
Packit |
d7e8d0 |
(:eof 0)
|
|
Packit Service |
30b792 |
(:enter 1)
|
|
Packit Service |
30b792 |
(:leave 2)
|
|
Packit Service |
30b792 |
(:abort 3)
|
|
Packit Service |
30b792 |
(:goodsig 4)
|
|
Packit Service |
30b792 |
(:badsig 5)
|
|
Packit Service |
30b792 |
(:errsig 6)
|
|
Packit Service |
30b792 |
(:badarmor 7)
|
|
Packit Service |
30b792 |
(:rsa-or-idea 8)
|
|
Packit Service |
30b792 |
(:keyexpired 9)
|
|
Packit Service |
30b792 |
(:keyrevoked 10)
|
|
Packit Service |
30b792 |
(:trust-undefined 11)
|
|
Packit Service |
30b792 |
(:trust-never 12)
|
|
Packit Service |
30b792 |
(:trust-marginal 13)
|
|
Packit Service |
30b792 |
(:trust-fully 14)
|
|
Packit Service |
30b792 |
(:trust-ultimate 15)
|
|
Packit Service |
30b792 |
(:shm-info 16)
|
|
Packit Service |
30b792 |
(:shm-get 17)
|
|
Packit Service |
30b792 |
(:shm-get-bool 18)
|
|
Packit Service |
30b792 |
(:shm-get-hidden 19)
|
|
Packit Service |
30b792 |
(:need-passphrase 20)
|
|
Packit Service |
30b792 |
(:validsig 21)
|
|
Packit Service |
30b792 |
(:sig-id 22)
|
|
Packit Service |
30b792 |
(:enc-to 23)
|
|
Packit Service |
30b792 |
(:nodata 24)
|
|
Packit Service |
30b792 |
(:bad-passphrase 25)
|
|
Packit Service |
30b792 |
(:no-pubkey 26)
|
|
Packit Service |
30b792 |
(:no-seckey 27)
|
|
Packit Service |
30b792 |
(:need-passphrase-sym 28)
|
|
Packit Service |
30b792 |
(:decryption-failed 29)
|
|
Packit Service |
30b792 |
(:decryption-okay 30)
|
|
Packit Service |
30b792 |
(:missing-passphrase 31)
|
|
Packit Service |
30b792 |
(:good-passphrase 32)
|
|
Packit Service |
30b792 |
(:goodmdc 33)
|
|
Packit Service |
30b792 |
(:badmdc 34)
|
|
Packit Service |
30b792 |
(:errmdc 35)
|
|
Packit Service |
30b792 |
(:imported 36)
|
|
Packit Service |
30b792 |
(:import-ok 37)
|
|
Packit Service |
30b792 |
(:import-problem 38)
|
|
Packit Service |
30b792 |
(:import-res 39)
|
|
Packit Service |
30b792 |
(:file-start 40)
|
|
Packit Service |
30b792 |
(:file-done 41)
|
|
Packit Service |
30b792 |
(:file-error 42)
|
|
Packit Service |
30b792 |
(:begin-decryption 43)
|
|
Packit Service |
30b792 |
(:end-decryption 44)
|
|
Packit Service |
30b792 |
(:begin-encryption 45)
|
|
Packit Service |
30b792 |
(:end-encryption 46)
|
|
Packit Service |
30b792 |
(:delete-problem 47)
|
|
Packit Service |
30b792 |
(:get-bool 48)
|
|
Packit Service |
30b792 |
(:get-line 49)
|
|
Packit Service |
30b792 |
(:get-hidden 50)
|
|
Packit Service |
30b792 |
(:got-it 51)
|
|
Packit Service |
30b792 |
(:progress 52)
|
|
Packit Service |
30b792 |
(:sig-created 53)
|
|
Packit Service |
30b792 |
(:session-key 54)
|
|
Packit Service |
30b792 |
(:notation-name 55)
|
|
Packit Service |
30b792 |
(:notation-data 56)
|
|
Packit Service |
30b792 |
(:policy-url 57)
|
|
Packit Service |
30b792 |
(:begin-stream 58)
|
|
Packit Service |
30b792 |
(:end-stream 59)
|
|
Packit Service |
30b792 |
(:key-created 60)
|
|
Packit Service |
30b792 |
(:userid-hint 61)
|
|
Packit Service |
30b792 |
(:unexpected 62)
|
|
Packit Service |
30b792 |
(:inv-recp 63)
|
|
Packit Service |
30b792 |
(:no-recp 64)
|
|
Packit Service |
30b792 |
(:already-signed 65)
|
|
Packit Service |
30b792 |
(:sigexpired 66)
|
|
Packit Service |
30b792 |
(:expsig 67)
|
|
Packit Service |
30b792 |
(:expkeysig 68)
|
|
Packit Service |
30b792 |
(:truncated 69)
|
|
Packit Service |
30b792 |
(:error 70)
|
|
Packit Service |
30b792 |
(:newsig 71)
|
|
Packit Service |
30b792 |
(:revkeysig 72)
|
|
Packit Service |
30b792 |
(:sig-subpacket 73)
|
|
Packit Service |
30b792 |
(:need-passphrase-pin 74)
|
|
Packit Service |
30b792 |
(:sc-op-failure 75)
|
|
Packit Service |
30b792 |
(:sc-op-success 76)
|
|
Packit Service |
30b792 |
(:cardctrl 77)
|
|
Packit Service |
30b792 |
(:backup-key-created 78)
|
|
Packit Service |
30b792 |
(:pka-trust-bad 79)
|
|
Packit Service |
30b792 |
(:pka-trust-good 80)
|
|
Packit Service |
30b792 |
(:plaintext 81)
|
|
Packit Service |
30b792 |
(:inv-sgnr 82)
|
|
Packit Service |
30b792 |
(:no-sgnr 83)
|
|
Packit Service |
30b792 |
(:success 84)
|
|
Packit Service |
30b792 |
(:decryption-info 85)
|
|
Packit Service |
30b792 |
(:plaintext-length 86)
|
|
Packit Service |
30b792 |
(:mountpoint 87)
|
|
Packit Service |
30b792 |
(:pinentry-launched 88)
|
|
Packit Service |
30b792 |
(:attribute 89)
|
|
Packit Service |
30b792 |
(:begin-signing 90)
|
|
Packit Service |
30b792 |
(:key-not-created 91)
|
|
Packit Service |
30b792 |
(:inquire-maxlen 92)
|
|
Packit Service |
30b792 |
(:failure 93)
|
|
Packit Service |
30b792 |
(:key-considered 94)
|
|
Packit Service |
30b792 |
(:tofu-user 95)
|
|
Packit Service |
30b792 |
(:tofu-stats 96)
|
|
Packit Service |
30b792 |
(:tofu-stats-long 97)
|
|
Packit Service |
30b792 |
(:notation-flags 98)
|
|
Packit Service |
30b792 |
(:decryption-compliance-mode 99)
|
|
Packit Service |
30b792 |
(:verification-compliance-mode 100))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defctype gpgme-engine-info-t
|
|
Packit Service |
30b792 |
(:wrapper :pointer
|
|
Packit Service |
30b792 |
:from-c translate-gpgme-engine-info-t-to-foreign)
|
|
Packit |
d7e8d0 |
"The engine information structure pointer type.")
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcstruct gpgme-engine-info
|
|
Packit |
d7e8d0 |
"Engine information."
|
|
Packit |
d7e8d0 |
(next gpgme-engine-info-t)
|
|
Packit |
d7e8d0 |
(protocol gpgme-protocol-t)
|
|
Packit |
d7e8d0 |
(file-name :string)
|
|
Packit |
d7e8d0 |
(version :string)
|
|
Packit |
d7e8d0 |
(req-version :string)
|
|
Packit |
d7e8d0 |
(home-dir :string))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defctype gpgme-subkey-t
|
|
Packit Service |
30b792 |
(:wrapper :pointer
|
|
Packit Service |
30b792 |
:from-c translate-gpgme-subkey-t-from-foreign)
|
|
Packit Service |
30b792 |
"A subkey from a key.")
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
;; FIXME: Doesn't this depend on endianness?
|
|
Packit |
d7e8d0 |
(defbitfield (gpgme-subkey-bitfield :unsigned-int)
|
|
Packit |
d7e8d0 |
"The subkey bitfield."
|
|
Packit |
d7e8d0 |
(:revoked 1)
|
|
Packit |
d7e8d0 |
(:expired 2)
|
|
Packit |
d7e8d0 |
(:disabled 4)
|
|
Packit |
d7e8d0 |
(:invalid 8)
|
|
Packit |
d7e8d0 |
(:can-encrypt 16)
|
|
Packit |
d7e8d0 |
(:can-sign 32)
|
|
Packit |
d7e8d0 |
(:can-certify 64)
|
|
Packit |
d7e8d0 |
(:secret 128)
|
|
Packit |
d7e8d0 |
(:can-authenticate 256)
|
|
Packit Service |
30b792 |
(:is-qualified 512)
|
|
Packit Service |
30b792 |
(:is-cardkey 1024)
|
|
Packit Service |
30b792 |
(:is-de-vs 2048))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcstruct gpgme-subkey
|
|
Packit |
d7e8d0 |
"Subkey from a key."
|
|
Packit |
d7e8d0 |
(next gpgme-subkey-t)
|
|
Packit |
d7e8d0 |
(bitfield gpgme-subkey-bitfield)
|
|
Packit |
d7e8d0 |
(pubkey-algo gpgme-pubkey-algo-t)
|
|
Packit |
d7e8d0 |
(length :unsigned-int)
|
|
Packit |
d7e8d0 |
(keyid :string)
|
|
Packit |
d7e8d0 |
(-keyid :char :count 17)
|
|
Packit |
d7e8d0 |
(fpr :string)
|
|
Packit |
d7e8d0 |
(timestamp :long)
|
|
Packit |
d7e8d0 |
(expires :long))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defctype gpgme-key-sig-t
|
|
Packit Service |
30b792 |
(:wrapper :pointer
|
|
Packit Service |
30b792 |
:from-c translate-gpgme-key-sig-t-from-foreign)
|
|
Packit |
d7e8d0 |
"A signature on a user ID.")
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
;; FIXME: Doesn't this depend on endianness?
|
|
Packit |
d7e8d0 |
(defbitfield (gpgme-key-sig-bitfield :unsigned-int)
|
|
Packit |
d7e8d0 |
"The key signature bitfield."
|
|
Packit |
d7e8d0 |
(:revoked 1)
|
|
Packit |
d7e8d0 |
(:expired 2)
|
|
Packit |
d7e8d0 |
(:invalid 4)
|
|
Packit |
d7e8d0 |
(:exportable 16))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcstruct gpgme-key-sig
|
|
Packit |
d7e8d0 |
"A signature on a user ID."
|
|
Packit |
d7e8d0 |
(next gpgme-key-sig-t)
|
|
Packit |
d7e8d0 |
(bitfield gpgme-key-sig-bitfield)
|
|
Packit |
d7e8d0 |
(pubkey-algo gpgme-pubkey-algo-t)
|
|
Packit |
d7e8d0 |
(keyid :string)
|
|
Packit |
d7e8d0 |
(-keyid :char :count 17)
|
|
Packit |
d7e8d0 |
(timestamp :long)
|
|
Packit |
d7e8d0 |
(expires :long)
|
|
Packit |
d7e8d0 |
(status gpgme-error-no-signal-t)
|
|
Packit |
d7e8d0 |
(-class :unsigned-int)
|
|
Packit |
d7e8d0 |
(uid :string)
|
|
Packit |
d7e8d0 |
(name :string)
|
|
Packit |
d7e8d0 |
(email :string)
|
|
Packit |
d7e8d0 |
(comment :string)
|
|
Packit |
d7e8d0 |
(sig-class :unsigned-int))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defctype gpgme-user-id-t
|
|
Packit Service |
30b792 |
(:wrapper :pointer
|
|
Packit Service |
30b792 |
:from-c translate-gpgme-user-id-t-from-foreign)
|
|
Packit |
d7e8d0 |
"A user ID from a key.")
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
;; FIXME: Doesn't this depend on endianness?
|
|
Packit |
d7e8d0 |
(defbitfield (gpgme-user-id-bitfield :unsigned-int)
|
|
Packit |
d7e8d0 |
"The user ID bitfield."
|
|
Packit |
d7e8d0 |
(:revoked 1)
|
|
Packit |
d7e8d0 |
(:invalid 2))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcstruct gpgme-user-id
|
|
Packit |
d7e8d0 |
"A user ID from a key."
|
|
Packit |
d7e8d0 |
(next gpgme-user-id-t)
|
|
Packit |
d7e8d0 |
(bitfield gpgme-user-id-bitfield)
|
|
Packit |
d7e8d0 |
(validity gpgme-validity-t)
|
|
Packit |
d7e8d0 |
(uid :string)
|
|
Packit |
d7e8d0 |
(name :string)
|
|
Packit |
d7e8d0 |
(email :string)
|
|
Packit |
d7e8d0 |
(comment :string)
|
|
Packit |
d7e8d0 |
(signatures gpgme-key-sig-t)
|
|
Packit |
d7e8d0 |
(-last-keysig gpgme-key-sig-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defctype gpgme-key-t
|
|
Packit Service |
30b792 |
(:wrapper :pointer
|
|
Packit Service |
30b792 |
:from-c translate-gpgme-key-t-from-foreign
|
|
Packit Service |
30b792 |
:to-c translate-gpgme-key-t-to-foreign)
|
|
Packit |
d7e8d0 |
"A key from the keyring.")
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
;; FIXME: Doesn't this depend on endianness?
|
|
Packit |
d7e8d0 |
(defbitfield (gpgme-key-bitfield :unsigned-int)
|
|
Packit |
d7e8d0 |
"The key bitfield."
|
|
Packit |
d7e8d0 |
(:revoked 1)
|
|
Packit |
d7e8d0 |
(:expired 2)
|
|
Packit |
d7e8d0 |
(:disabled 4)
|
|
Packit |
d7e8d0 |
(:invalid 8)
|
|
Packit |
d7e8d0 |
(:can-encrypt 16)
|
|
Packit |
d7e8d0 |
(:can-sign 32)
|
|
Packit |
d7e8d0 |
(:can-certify 64)
|
|
Packit |
d7e8d0 |
(:secret 128)
|
|
Packit |
d7e8d0 |
(:can-authenticate 256)
|
|
Packit |
d7e8d0 |
(:is-qualified 512))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcstruct gpgme-key
|
|
Packit |
d7e8d0 |
"A signature on a user ID."
|
|
Packit |
d7e8d0 |
(-refs :unsigned-int)
|
|
Packit |
d7e8d0 |
(bitfield gpgme-key-bitfield)
|
|
Packit |
d7e8d0 |
(protocol gpgme-protocol-t)
|
|
Packit |
d7e8d0 |
(issuer-serial :string)
|
|
Packit |
d7e8d0 |
(issuer-name :string)
|
|
Packit |
d7e8d0 |
(chain-id :string)
|
|
Packit |
d7e8d0 |
(owner-trust gpgme-validity-t)
|
|
Packit |
d7e8d0 |
(subkeys gpgme-subkey-t)
|
|
Packit |
d7e8d0 |
(uids gpgme-user-id-t)
|
|
Packit |
d7e8d0 |
(-last-subkey gpgme-subkey-t)
|
|
Packit |
d7e8d0 |
(-last-uid gpgme-user-id-t)
|
|
Packit |
d7e8d0 |
(keylist-mode gpgme-keylist-mode-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; There is no support in CFFI to define callback C types and have
|
|
Packit |
d7e8d0 |
;;; automatic type checking with the callback definition.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defctype gpgme-passphrase-cb-t :pointer)
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defctype gpgme-progress-cb-t :pointer)
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defctype gpgme-edit-cb-t :pointer)
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
;;; Function Interface
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Context management functions.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_new" c-gpgme-new) gpgme-error-t
|
|
Packit |
d7e8d0 |
(ctx :pointer))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_release" c-gpgme-release) :void
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_set_protocol" c-gpgme-set-protocol) gpgme-error-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(proto gpgme-protocol-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_get_protocol" c-gpgme-get-protocol) gpgme-protocol-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_get_protocol_name" c-gpgme-get-protocol-name) :string
|
|
Packit |
d7e8d0 |
(proto gpgme-protocol-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_set_armor" c-gpgme-set-armor) :void
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(yes :boolean))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_get_armor" c-gpgme-get-armor) :boolean
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_set_textmode" c-gpgme-set-textmode) :void
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(yes :boolean))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_get_textmode" c-gpgme-get-textmode) :boolean
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defconstant +include-certs-default+ -256)
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_set_include_certs" c-gpgme-set-include-certs) :void
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(nr-of-certs cert-int-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_get_include_certs" c-gpgme-get-include-certs) cert-int-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_set_keylist_mode" c-gpgme-set-keylist-mode) gpgme-error-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(mode gpgme-keylist-mode-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_get_keylist_mode" c-gpgme-get-keylist-mode)
|
|
Packit |
d7e8d0 |
gpgme-keylist-mode-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_set_passphrase_cb" c-gpgme-set-passphrase-cb) :void
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(cb gpgme-passphrase-cb-t)
|
|
Packit |
d7e8d0 |
(hook-value :pointer))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_get_passphrase_cb" c-gpgme-get-passphrase-cb) :void
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(cb-p :pointer)
|
|
Packit |
d7e8d0 |
(hook-value-p :pointer))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_set_progress_cb" c-gpgme-set-progress-cb) :void
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(cb gpgme-progress-cb-t)
|
|
Packit |
d7e8d0 |
(hook-value :pointer))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_get_progress_cb" c-gpgme-get-progress-cb) :void
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(cb-p :pointer)
|
|
Packit |
d7e8d0 |
(hook-value-p :pointer))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_set_locale" c-gpgme-set-locale) gpgme-error-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(category :int)
|
|
Packit |
d7e8d0 |
(value string-or-nil-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_ctx_get_engine_info" c-gpgme-ctx-get-engine-info)
|
|
Packit |
d7e8d0 |
gpgme-engine-info-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_ctx_set_engine_info" c-gpgme-ctx-set-engine-info)
|
|
Packit |
d7e8d0 |
gpgme-error-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(proto gpgme-protocol-t)
|
|
Packit |
d7e8d0 |
(file-name string-or-nil-t)
|
|
Packit |
d7e8d0 |
(home-dir string-or-nil-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_pubkey_algo_name" c-gpgme-pubkey-algo-name) :string
|
|
Packit |
d7e8d0 |
(algo gpgme-pubkey-algo-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_hash_algo_name" c-gpgme-hash-algo-name) :string
|
|
Packit |
d7e8d0 |
(algo gpgme-hash-algo-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_signers_clear" c-gpgme-signers-clear) :void
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_signers_add" c-gpgme-signers-add) gpgme-error-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(key gpgme-key-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_signers_enum" c-gpgme-signers-enum) gpgme-key-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(seq :int))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_sig_notation_clear" c-gpgme-sig-notation-clear) :void
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_sig_notation_add" c-gpgme-sig-notation-add) gpgme-error-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(name :string)
|
|
Packit |
d7e8d0 |
(value string-or-nil-t)
|
|
Packit |
d7e8d0 |
(flags gpgme-sig-notation-flags-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_sig_notation_get" c-gpgme-sig-notation-get)
|
|
Packit |
d7e8d0 |
gpgme-sig-notation-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Run Control.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; There is no support in CFFI to define callback C types and have
|
|
Packit |
d7e8d0 |
;;; automatic type checking with the callback definition.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defctype gpgme-io-cb-t :pointer)
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defctype gpgme-register-io-cb-t :pointer)
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defctype gpgme-remove-io-cb-t :pointer)
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcenum gpgme-event-io-t
|
|
Packit |
d7e8d0 |
"The possible events on I/O event callbacks."
|
|
Packit |
d7e8d0 |
(:start 0)
|
|
Packit |
d7e8d0 |
(:done 1)
|
|
Packit |
d7e8d0 |
(:next-key 2)
|
|
Packit |
d7e8d0 |
(:next-trustitem 3))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defctype gpgme-event-io-cb-t :pointer)
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcstruct gpgme-io-cbs
|
|
Packit |
d7e8d0 |
"I/O callbacks."
|
|
Packit |
d7e8d0 |
(add gpgme-register-io-cb-t)
|
|
Packit |
d7e8d0 |
(add-priv :pointer)
|
|
Packit |
d7e8d0 |
(remove gpgme-remove-io-cb-t)
|
|
Packit |
d7e8d0 |
(event gpgme-event-io-cb-t)
|
|
Packit |
d7e8d0 |
(event-priv :pointer))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defctype gpgme-io-cbs-t :pointer)
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_set_io_cbs" c-gpgme-set-io-cbs) :void
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(io-cbs gpgme-io-cbs-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_get_io_cbs" c-gpgme-get-io-cbs) :void
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(io-cbs gpgme-io-cbs-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_wait" c-gpgme-wait) gpgme-ctx-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(status-p :pointer)
|
|
Packit |
d7e8d0 |
(hang :int))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Functions to handle data objects.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; There is no support in CFFI to define callback C types and have
|
|
Packit |
d7e8d0 |
;;; automatic type checking with the callback definition.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defctype gpgme-data-read-cb-t :pointer)
|
|
Packit |
d7e8d0 |
(defctype gpgme-data-write-cb-t :pointer)
|
|
Packit |
d7e8d0 |
(defctype gpgme-data-seek-cb-t :pointer)
|
|
Packit |
d7e8d0 |
(defctype gpgme-data-release-cb-t :pointer)
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcstruct gpgme-data-cbs
|
|
Packit |
d7e8d0 |
"Data callbacks."
|
|
Packit |
d7e8d0 |
(read gpgme-data-read-cb-t)
|
|
Packit |
d7e8d0 |
(write gpgme-data-write-cb-t)
|
|
Packit |
d7e8d0 |
(seek gpgme-data-seek-cb-t)
|
|
Packit |
d7e8d0 |
(release gpgme-data-release-cb-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defctype gpgme-data-cbs-t :pointer
|
|
Packit |
d7e8d0 |
"Data callbacks pointer.")
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_data_read" c-gpgme-data-read) ssize-t
|
|
Packit |
d7e8d0 |
(dh gpgme-data-t)
|
|
Packit |
d7e8d0 |
(buffer :pointer)
|
|
Packit |
d7e8d0 |
(size size-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_data_write" c-gpgme-data-write) ssize-t
|
|
Packit |
d7e8d0 |
(dh gpgme-data-t)
|
|
Packit |
d7e8d0 |
(buffer :pointer)
|
|
Packit |
d7e8d0 |
(size size-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_data_seek" c-gpgme-data-seek) off-t
|
|
Packit |
d7e8d0 |
(dh gpgme-data-t)
|
|
Packit |
d7e8d0 |
(offset off-t)
|
|
Packit |
d7e8d0 |
(whence :int))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_data_new" c-gpgme-data-new) gpgme-error-t
|
|
Packit |
d7e8d0 |
(dh-p :pointer))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_data_release" c-gpgme-data-release) :void
|
|
Packit |
d7e8d0 |
(dh gpgme-data-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_data_new_from_mem" c-gpgme-data-new-from-mem) gpgme-error-t
|
|
Packit |
d7e8d0 |
(dh-p :pointer)
|
|
Packit |
d7e8d0 |
(buffer :pointer)
|
|
Packit |
d7e8d0 |
(size size-t)
|
|
Packit |
d7e8d0 |
(copy :int))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_data_release_and_get_mem" c-gpgme-data-release-and-get-mem)
|
|
Packit |
d7e8d0 |
:pointer
|
|
Packit |
d7e8d0 |
(dh gpgme-data-t)
|
|
Packit |
d7e8d0 |
(len-p :pointer))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_data_new_from_cbs" c-gpgme-data-new-from-cbs) gpgme-error-t
|
|
Packit |
d7e8d0 |
(dh-p :pointer)
|
|
Packit |
d7e8d0 |
(cbs gpgme-data-cbs-t)
|
|
Packit |
d7e8d0 |
(handle :pointer))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_data_new_from_fd" c-gpgme-data-new-from-fd) gpgme-error-t
|
|
Packit |
d7e8d0 |
(dh-p :pointer)
|
|
Packit |
d7e8d0 |
(fd :int))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_data_new_from_stream" c-gpgme-data-new-from-stream)
|
|
Packit |
d7e8d0 |
gpgme-error-t
|
|
Packit |
d7e8d0 |
(dh-p :pointer)
|
|
Packit |
d7e8d0 |
(stream :pointer))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_data_get_encoding" c-gpgme-data-get-encoding)
|
|
Packit |
d7e8d0 |
gpgme-data-encoding-t
|
|
Packit |
d7e8d0 |
(dh gpgme-data-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_data_set_encoding" c-gpgme-data-set-encoding)
|
|
Packit |
d7e8d0 |
gpgme-error-t
|
|
Packit |
d7e8d0 |
(dh gpgme-data-t)
|
|
Packit |
d7e8d0 |
(enc gpgme-data-encoding-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_data_get_file_name" c-gpgme-data-get-file-name) :string
|
|
Packit |
d7e8d0 |
(dh gpgme-data-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_data_set_file_name" c-gpgme-data-set-file-name) gpgme-error-t
|
|
Packit |
d7e8d0 |
(dh gpgme-data-t)
|
|
Packit |
d7e8d0 |
(file-name string-or-nil-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_data_new_from_file" c-gpgme-data-new-from-file) gpgme-error-t
|
|
Packit |
d7e8d0 |
(dh-p :pointer)
|
|
Packit |
d7e8d0 |
(fname :string)
|
|
Packit |
d7e8d0 |
(copy :int))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_data_new_from_filepart" c-gpgme-data-new-from-filepart)
|
|
Packit |
d7e8d0 |
gpgme-error-t
|
|
Packit |
d7e8d0 |
(dh-p :pointer)
|
|
Packit |
d7e8d0 |
(fname :string)
|
|
Packit |
d7e8d0 |
(fp :pointer)
|
|
Packit |
d7e8d0 |
(offset off-t)
|
|
Packit |
d7e8d0 |
(length size-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Key and trust functions.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_get_key" c-gpgme-get-key) gpgme-error-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(fpr :string)
|
|
Packit |
d7e8d0 |
(key-p :pointer)
|
|
Packit |
d7e8d0 |
(secret :boolean))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_key_ref" c-gpgme-key-ref) :void
|
|
Packit |
d7e8d0 |
(key gpgme-key-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_key_unref" c-gpgme-key-unref) :void
|
|
Packit |
d7e8d0 |
(key gpgme-key-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Crypto operations.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_cancel" c-gpgme-cancel) gpgme-error-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defctype gpgme-invalid-key-t
|
|
Packit Service |
30b792 |
(:wrapper :pointer
|
|
Packit Service |
30b792 |
:from-c translate-gpgme-invalid-key-t-from-foreign)
|
|
Packit |
d7e8d0 |
"An invalid key structure.")
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcstruct gpgme-invalid-key
|
|
Packit |
d7e8d0 |
"An invalid key structure."
|
|
Packit |
d7e8d0 |
(next gpgme-invalid-key-t)
|
|
Packit |
d7e8d0 |
(fpr :string)
|
|
Packit |
d7e8d0 |
(reason gpgme-error-no-signal-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Encryption.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcstruct gpgme-op-encrypt-result
|
|
Packit |
d7e8d0 |
"Encryption result structure."
|
|
Packit |
d7e8d0 |
(invalid-recipients gpgme-invalid-key-t))
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defctype gpgme-op-encrypt-result-t
|
|
Packit Service |
30b792 |
(:wrapper :pointer
|
|
Packit Service |
30b792 |
:from-c translate-gpgme-op-encrypt-result-t-from-foreign)
|
|
Packit |
d7e8d0 |
"An encryption result structure.")
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_op_encrypt_result" c-gpgme-op-encrypt-result)
|
|
Packit |
d7e8d0 |
gpgme-op-encrypt-result-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defbitfield gpgme-encrypt-flags-t
|
|
Packit Service |
30b792 |
(:always-trust 1)
|
|
Packit Service |
30b792 |
(:no-encrypt-to 2)
|
|
Packit Service |
30b792 |
(:prepare 4)
|
|
Packit Service |
30b792 |
(:expect-sign 8)
|
|
Packit Service |
30b792 |
(:no-compress 16)
|
|
Packit Service |
30b792 |
(:symmetric 32)
|
|
Packit Service |
30b792 |
(:throw-keyids 64)
|
|
Packit Service |
30b792 |
(:wrap 128)
|
|
Packit Service |
30b792 |
(:want-address 256))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_op_encrypt_start" c-gpgme-op-encrypt-start) gpgme-error-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(recp :pointer) ; Key array.
|
|
Packit |
d7e8d0 |
(flags gpgme-encrypt-flags-t)
|
|
Packit |
d7e8d0 |
(plain gpgme-data-t)
|
|
Packit |
d7e8d0 |
(cipher gpgme-data-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_op_encrypt" c-gpgme-op-encrypt) gpgme-error-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(recp :pointer) ; Key array.
|
|
Packit |
d7e8d0 |
(flags gpgme-encrypt-flags-t)
|
|
Packit |
d7e8d0 |
(plain gpgme-data-t)
|
|
Packit |
d7e8d0 |
(cipher gpgme-data-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_op_encrypt_sign_start" c-gpgme-op-encrypt-sign-start)
|
|
Packit |
d7e8d0 |
gpgme-error-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(recp :pointer) ; Key array.
|
|
Packit |
d7e8d0 |
(flags gpgme-encrypt-flags-t)
|
|
Packit |
d7e8d0 |
(plain gpgme-data-t)
|
|
Packit |
d7e8d0 |
(cipher gpgme-data-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_op_encrypt_sign" c-gpgme-op-encrypt-sign) gpgme-error-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(recp :pointer) ; Key array.
|
|
Packit |
d7e8d0 |
(flags gpgme-encrypt-flags-t)
|
|
Packit |
d7e8d0 |
(plain gpgme-data-t)
|
|
Packit |
d7e8d0 |
(cipher gpgme-data-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Decryption.
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defctype gpgme-recipient-t
|
|
Packit Service |
30b792 |
(:wrapper :pointer
|
|
Packit Service |
30b792 |
:from-c translate-gpgme-recipient-t-from-foreign)
|
|
Packit |
d7e8d0 |
"A recipient structure.")
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcstruct gpgme-recipient
|
|
Packit |
d7e8d0 |
"Recipient structure."
|
|
Packit |
d7e8d0 |
(next gpgme-recipient-t)
|
|
Packit |
d7e8d0 |
(keyid :string)
|
|
Packit |
d7e8d0 |
(-keyid :char :count 17)
|
|
Packit |
d7e8d0 |
(pubkey-algo gpgme-pubkey-algo-t)
|
|
Packit |
d7e8d0 |
(status gpgme-error-no-signal-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defbitfield gpgme-op-decrypt-result-bitfield
|
|
Packit |
d7e8d0 |
"Decryption result structure bitfield."
|
|
Packit Service |
30b792 |
(:wrong-key-usage 1)
|
|
Packit Service |
30b792 |
(:is-de-vs 2)
|
|
Packit Service |
30b792 |
(:is-mine 4))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcstruct gpgme-op-decrypt-result
|
|
Packit |
d7e8d0 |
"Decryption result structure."
|
|
Packit |
d7e8d0 |
(unsupported-algorithm :string)
|
|
Packit |
d7e8d0 |
(bitfield gpgme-op-decrypt-result-bitfield)
|
|
Packit |
d7e8d0 |
(recipients gpgme-recipient-t)
|
|
Packit |
d7e8d0 |
(file-name :string))
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defctype gpgme-op-decrypt-result-t
|
|
Packit Service |
30b792 |
(:wrapper :pointer
|
|
Packit Service |
30b792 |
:from-c translate-gpgme-op-decrypt-result-t-from-foreign)
|
|
Packit |
d7e8d0 |
"A decryption result structure.")
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_op_decrypt_result" c-gpgme-op-decrypt-result)
|
|
Packit |
d7e8d0 |
gpgme-op-decrypt-result-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_op_decrypt_start" c-gpgme-op-decrypt-start) gpgme-error-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(cipher gpgme-data-t)
|
|
Packit |
d7e8d0 |
(plain gpgme-data-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_op_decrypt" c-gpgme-op-decrypt) gpgme-error-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(cipher gpgme-data-t)
|
|
Packit |
d7e8d0 |
(plain gpgme-data-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_op_decrypt_verify_start" c-gpgme-op-decrypt-verify-start)
|
|
Packit |
d7e8d0 |
gpgme-error-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(cipher gpgme-data-t)
|
|
Packit |
d7e8d0 |
(plain gpgme-data-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_op_decrypt_verify" c-gpgme-op-decrypt-verify) gpgme-error-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(cipher gpgme-data-t)
|
|
Packit |
d7e8d0 |
(plain gpgme-data-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Signing.
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defctype gpgme-new-signature-t
|
|
Packit Service |
30b792 |
(:wrapper :pointer
|
|
Packit Service |
30b792 |
:from-c translate-gpgme-new-signature-t-from-foreign)
|
|
Packit |
d7e8d0 |
"A new signature structure.")
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcstruct gpgme-new-signature
|
|
Packit |
d7e8d0 |
"New signature structure."
|
|
Packit |
d7e8d0 |
(next gpgme-new-signature-t)
|
|
Packit |
d7e8d0 |
(type gpgme-sig-mode-t)
|
|
Packit |
d7e8d0 |
(pubkey-algo gpgme-pubkey-algo-t)
|
|
Packit |
d7e8d0 |
(hash-algo gpgme-hash-algo-t)
|
|
Packit |
d7e8d0 |
(-obsolete-class :unsigned-long)
|
|
Packit |
d7e8d0 |
(timestamp :long)
|
|
Packit |
d7e8d0 |
(fpr :string)
|
|
Packit |
d7e8d0 |
(-obsolete-class-2 :unsigned-int)
|
|
Packit |
d7e8d0 |
(sig-class :unsigned-int))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcstruct gpgme-op-sign-result
|
|
Packit |
d7e8d0 |
"Signing result structure."
|
|
Packit |
d7e8d0 |
(invalid-signers gpgme-invalid-key-t)
|
|
Packit |
d7e8d0 |
(signatures gpgme-new-signature-t))
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defctype gpgme-op-sign-result-t
|
|
Packit Service |
30b792 |
(:wrapper :pointer
|
|
Packit Service |
30b792 |
:from-c translate-gpgme-op-sign-result-t-from-foreign)
|
|
Packit |
d7e8d0 |
"A signing result structure.")
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_op_sign_result" c-gpgme-op-sign-result)
|
|
Packit |
d7e8d0 |
gpgme-op-sign-result-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_op_sign_start" c-gpgme-op-sign-start) gpgme-error-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(plain gpgme-data-t)
|
|
Packit |
d7e8d0 |
(sig gpgme-data-t)
|
|
Packit |
d7e8d0 |
(mode gpgme-sig-mode-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_op_sign" c-gpgme-op-sign) gpgme-error-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(plain gpgme-data-t)
|
|
Packit |
d7e8d0 |
(sig gpgme-data-t)
|
|
Packit |
d7e8d0 |
(mode gpgme-sig-mode-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Verify.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defbitfield (gpgme-sigsum-t :unsigned-int)
|
|
Packit |
d7e8d0 |
"Flags used for the summary field in a gpgme-signature-t."
|
|
Packit |
d7e8d0 |
(:valid #x0001)
|
|
Packit |
d7e8d0 |
(:green #x0002)
|
|
Packit |
d7e8d0 |
(:red #x0004)
|
|
Packit |
d7e8d0 |
(:key-revoked #x0010)
|
|
Packit |
d7e8d0 |
(:key-expired #x0020)
|
|
Packit |
d7e8d0 |
(:sig-expired #x0040)
|
|
Packit |
d7e8d0 |
(:key-missing #x0080)
|
|
Packit |
d7e8d0 |
(:crl-missing #x0100)
|
|
Packit |
d7e8d0 |
(:crl-too-old #x0200)
|
|
Packit |
d7e8d0 |
(:bad-policy #x0400)
|
|
Packit Service |
30b792 |
(:sys-error #x0800)
|
|
Packit Service |
30b792 |
(:tofu-conflict #x1000))
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defctype gpgme-signature-t
|
|
Packit Service |
30b792 |
(:wrapper :pointer
|
|
Packit Service |
30b792 |
:from-c translate-gpgme-signature-t-from-foreign)
|
|
Packit |
d7e8d0 |
"A signature structure.")
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
;; FIXME: Doesn't this depend on endianness?
|
|
Packit |
d7e8d0 |
(defbitfield (gpgme-signature-bitfield :unsigned-int)
|
|
Packit |
d7e8d0 |
"The signature bitfield."
|
|
Packit Service |
30b792 |
(:wrong-key-usage 1)
|
|
Packit Service |
30b792 |
(:pka-trust 2)
|
|
Packit Service |
30b792 |
(:chain-model 4)
|
|
Packit Service |
30b792 |
(:is-de-vs 8))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcstruct gpgme-signature
|
|
Packit |
d7e8d0 |
"Signature structure."
|
|
Packit |
d7e8d0 |
(next gpgme-signature-t)
|
|
Packit |
d7e8d0 |
(summary gpgme-sigsum-t)
|
|
Packit |
d7e8d0 |
(fpr :string)
|
|
Packit |
d7e8d0 |
(status gpgme-error-no-signal-t)
|
|
Packit |
d7e8d0 |
(notations gpgme-sig-notation-t)
|
|
Packit |
d7e8d0 |
(timestamp :unsigned-long)
|
|
Packit |
d7e8d0 |
(exp-timestamp :unsigned-long)
|
|
Packit |
d7e8d0 |
(bitfield gpgme-signature-bitfield)
|
|
Packit |
d7e8d0 |
(validity gpgme-validity-t)
|
|
Packit |
d7e8d0 |
(validity-reason gpgme-error-no-signal-t)
|
|
Packit |
d7e8d0 |
(pubkey-algo gpgme-pubkey-algo-t)
|
|
Packit |
d7e8d0 |
(hash-algo gpgme-hash-algo-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcstruct gpgme-op-verify-result
|
|
Packit |
d7e8d0 |
"Verify result structure."
|
|
Packit |
d7e8d0 |
(signatures gpgme-signature-t)
|
|
Packit |
d7e8d0 |
(file-name :string))
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defctype gpgme-op-verify-result-t
|
|
Packit Service |
30b792 |
(:wrapper :pointer
|
|
Packit Service |
30b792 |
:from-c translate-gpgme-op-verify-result-t-from-foreign)
|
|
Packit |
d7e8d0 |
"A verify result structure.")
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_op_verify_result" c-gpgme-op-verify-result)
|
|
Packit |
d7e8d0 |
gpgme-op-verify-result-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_op_verify_start" c-gpgme-op-verify-start) gpgme-error-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(sig gpgme-data-t)
|
|
Packit |
d7e8d0 |
(signed-text gpgme-data-t)
|
|
Packit |
d7e8d0 |
(plaintext gpgme-data-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_op_verify" c-gpgme-op-verify) gpgme-error-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(sig gpgme-data-t)
|
|
Packit |
d7e8d0 |
(signed-text gpgme-data-t)
|
|
Packit |
d7e8d0 |
(plaintext gpgme-data-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Import.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defbitfield (gpgme-import-flags-t :unsigned-int)
|
|
Packit |
d7e8d0 |
"Flags used for the import status field."
|
|
Packit |
d7e8d0 |
(:new #x0001)
|
|
Packit |
d7e8d0 |
(:uid #x0002)
|
|
Packit |
d7e8d0 |
(:sig #x0004)
|
|
Packit |
d7e8d0 |
(:subkey #x0008)
|
|
Packit |
d7e8d0 |
(:secret #x0010))
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defctype gpgme-import-status-t
|
|
Packit Service |
30b792 |
(:wrapper :pointer
|
|
Packit Service |
30b792 |
:from-c translate-gpgme-import-status-t-from-foreign)
|
|
Packit |
d7e8d0 |
"An import status structure.")
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcstruct gpgme-import-status
|
|
Packit |
d7e8d0 |
"New import status structure."
|
|
Packit |
d7e8d0 |
(next gpgme-import-status-t)
|
|
Packit |
d7e8d0 |
(fpr :string)
|
|
Packit |
d7e8d0 |
(result gpgme-error-no-signal-t)
|
|
Packit |
d7e8d0 |
(status :unsigned-int))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcstruct gpgme-op-import-result
|
|
Packit |
d7e8d0 |
"Import result structure."
|
|
Packit |
d7e8d0 |
(considered :int)
|
|
Packit |
d7e8d0 |
(no-user-id :int)
|
|
Packit |
d7e8d0 |
(imported :int)
|
|
Packit |
d7e8d0 |
(imported-rsa :int)
|
|
Packit |
d7e8d0 |
(unchanged :int)
|
|
Packit |
d7e8d0 |
(new-user-ids :int)
|
|
Packit |
d7e8d0 |
(new-sub-keys :int)
|
|
Packit |
d7e8d0 |
(new-signatures :int)
|
|
Packit |
d7e8d0 |
(new-revocations :int)
|
|
Packit |
d7e8d0 |
(secret-read :int)
|
|
Packit |
d7e8d0 |
(secret-imported :int)
|
|
Packit |
d7e8d0 |
(secret-unchanged :int)
|
|
Packit |
d7e8d0 |
(skipped-new-keys :int)
|
|
Packit |
d7e8d0 |
(not-imported :int)
|
|
Packit |
d7e8d0 |
(imports gpgme-import-status-t))
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defctype gpgme-op-import-result-t
|
|
Packit Service |
30b792 |
(:wrapper :pointer
|
|
Packit Service |
30b792 |
:from-c translate-gpgme-op-import-result-t-from-foreign)
|
|
Packit |
d7e8d0 |
"An import status result structure.")
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_op_import_result" c-gpgme-op-import-result)
|
|
Packit |
d7e8d0 |
gpgme-op-import-result-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_op_import_start" c-gpgme-op-import-start) gpgme-error-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(keydata gpgme-data-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_op_import" c-gpgme-op-import) gpgme-error-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(keydata gpgme-data-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Export.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_op_export_start" c-gpgme-op-export-start) gpgme-error-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(pattern :string)
|
|
Packit |
d7e8d0 |
(reserved :unsigned-int)
|
|
Packit |
d7e8d0 |
(keydata gpgme-data-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_op_export" c-gpgme-op-export) gpgme-error-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(pattern :string)
|
|
Packit |
d7e8d0 |
(reserved :unsigned-int)
|
|
Packit |
d7e8d0 |
(keydata gpgme-data-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; FIXME: Extended export interfaces require array handling.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Key generation.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defbitfield (gpgme-genkey-flags-t :unsigned-int)
|
|
Packit |
d7e8d0 |
"Flags used for the key generation result bitfield."
|
|
Packit |
d7e8d0 |
(:primary #x0001)
|
|
Packit Service |
30b792 |
(:sub #x0002)
|
|
Packit Service |
30b792 |
(:uid #x0004))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcstruct gpgme-op-genkey-result
|
|
Packit |
d7e8d0 |
"Key generation result structure."
|
|
Packit |
d7e8d0 |
(bitfield gpgme-genkey-flags-t)
|
|
Packit |
d7e8d0 |
(fpr :string))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defctype gpgme-op-genkey-result-t :pointer
|
|
Packit |
d7e8d0 |
"A key generation result structure.")
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_op_genkey_result" c-gpgme-op-genkey-result)
|
|
Packit |
d7e8d0 |
gpgme-op-genkey-result-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_op_genkey_start" c-gpgme-op-genkey-start) gpgme-error-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(parms :string)
|
|
Packit |
d7e8d0 |
(pubkey gpgme-data-t)
|
|
Packit |
d7e8d0 |
(seckey gpgme-data-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_op_genkey" c-gpgme-op-genkey) gpgme-error-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(parms :string)
|
|
Packit |
d7e8d0 |
(pubkey gpgme-data-t)
|
|
Packit |
d7e8d0 |
(seckey gpgme-data-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Key deletion.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_op_delete_start" c-gpgme-op-delete-start) gpgme-error-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(key gpgme-key-t)
|
|
Packit |
d7e8d0 |
(allow-secret :int))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_op_delete" c-gpgme-op-delete) gpgme-error-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(key gpgme-key-t)
|
|
Packit |
d7e8d0 |
(allow-secret :int))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; FIXME: Add edit interfaces.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Keylist interface.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defbitfield (gpgme-keylist-flags-t :unsigned-int)
|
|
Packit |
d7e8d0 |
"Flags used for the key listing result bitfield."
|
|
Packit |
d7e8d0 |
(:truncated #x0001))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcstruct gpgme-op-keylist-result
|
|
Packit |
d7e8d0 |
"Key listing result structure."
|
|
Packit |
d7e8d0 |
(bitfield gpgme-keylist-flags-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defctype gpgme-op-keylist-result-t :pointer
|
|
Packit |
d7e8d0 |
"A key listing result structure.")
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_op_keylist_result" c-gpgme-op-keylist-result)
|
|
Packit |
d7e8d0 |
gpgme-op-keylist-result-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_op_keylist_start" c-gpgme-op-keylist-start) gpgme-error-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(pattern :string)
|
|
Packit |
d7e8d0 |
(secret_only :boolean))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; FIXME: Extended keylisting requires array handling.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_op_keylist_next" c-gpgme-op-keylist-next) gpgme-error-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(r-key :pointer))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_op_keylist_end" c-gpgme-op-keylist-end) gpgme-error-t
|
|
Packit |
d7e8d0 |
(ctx gpgme-ctx-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Various functions.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_check_version" c-gpgme-check-version) :string
|
|
Packit |
d7e8d0 |
(req-version string-or-nil-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_get_engine_info" c-gpgme-get-engine-info) gpgme-error-t
|
|
Packit |
d7e8d0 |
(engine-info-p :pointer))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_set_engine_info" c-gpgme-set-engine-info) gpgme-error-t
|
|
Packit |
d7e8d0 |
(proto gpgme-protocol-t)
|
|
Packit |
d7e8d0 |
(file-name string-or-nil-t)
|
|
Packit |
d7e8d0 |
(home-dir string-or-nil-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcfun ("gpgme_engine_check_version" c-gpgme-engine-check-verson)
|
|
Packit |
d7e8d0 |
gpgme-error-t
|
|
Packit |
d7e8d0 |
(proto gpgme-protocol-t))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
;;; L I S P I N T E R F A C E
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
;;; Lisp type translators.
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Both directions.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; cert-int-t is a helper type that takes care of representing the
|
|
Packit |
d7e8d0 |
;;; default number of certs as NIL.
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defun translate-cert-int-t-from-foreign (value)
|
|
Packit |
d7e8d0 |
(cond
|
|
Packit |
d7e8d0 |
((eql value +include-certs-default+) nil)
|
|
Packit |
d7e8d0 |
(t value)))
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defun translate-cert-int-t-to-foreign (value)
|
|
Packit |
d7e8d0 |
(cond
|
|
Packit |
d7e8d0 |
(value value)
|
|
Packit |
d7e8d0 |
(t +include-certs-default+)))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; string-or-nil-t translates a null pointer to NIL and vice versa.
|
|
Packit |
d7e8d0 |
;;; Translation from foreign null pointer already works as expected.
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defun translate-string-or-nil-t-to-foreign (value)
|
|
Packit |
d7e8d0 |
(cond
|
|
Packit |
d7e8d0 |
(value value)
|
|
Packit |
d7e8d0 |
(t (null-pointer))))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Output only.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; These type translators only convert from foreign type, because we
|
|
Packit |
d7e8d0 |
;;; never use these types in the other direction.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Convert gpgme-engine-info-t linked lists into a list of property
|
|
Packit |
d7e8d0 |
;;; lists. Note that this converter will automatically be invoked
|
|
Packit |
d7e8d0 |
;;; recursively.
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
;;; FIXME: Should we use a hash table (or struct, or clos) instead of
|
|
Packit |
d7e8d0 |
;;; property list, as recommended by the Lisp FAQ?
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defun translate-gpgme-engine-info-t-from-foreign (value)
|
|
Packit |
d7e8d0 |
(cond
|
|
Packit |
d7e8d0 |
((null-pointer-p value) nil)
|
|
Packit |
d7e8d0 |
(t (with-foreign-slots
|
|
Packit |
d7e8d0 |
((next protocol file-name version req-version home-dir)
|
|
Packit Service |
30b792 |
value (:struct gpgme-engine-info))
|
|
Packit |
d7e8d0 |
(append (list protocol (list
|
|
Packit |
d7e8d0 |
:file-name file-name
|
|
Packit |
d7e8d0 |
:version version
|
|
Packit |
d7e8d0 |
:req-version req-version
|
|
Packit |
d7e8d0 |
:home-dir home-dir))
|
|
Packit |
d7e8d0 |
next)))))
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defun translate-gpgme-invalid-key-t-from-foreign (value)
|
|
Packit |
d7e8d0 |
(cond
|
|
Packit |
d7e8d0 |
((null-pointer-p value) nil)
|
|
Packit |
d7e8d0 |
(t (with-foreign-slots
|
|
Packit |
d7e8d0 |
((next fpr reason)
|
|
Packit Service |
30b792 |
value (:struct gpgme-invalid-key))
|
|
Packit |
d7e8d0 |
(append (list (list :fpr fpr
|
|
Packit |
d7e8d0 |
:reason reason))
|
|
Packit |
d7e8d0 |
next)))))
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defun translate-gpgme-op-encrypt-result-t-from-foreign (value)
|
|
Packit |
d7e8d0 |
(cond
|
|
Packit |
d7e8d0 |
((null-pointer-p value) nil)
|
|
Packit |
d7e8d0 |
(t (with-foreign-slots
|
|
Packit |
d7e8d0 |
((invalid-recipients)
|
|
Packit Service |
30b792 |
value (:struct gpgme-op-encrypt-result))
|
|
Packit |
d7e8d0 |
(list :encrypt
|
|
Packit |
d7e8d0 |
(list :invalid-recipients invalid-recipients))))))
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defun translate-gpgme-recipient-t-from-foreign (value)
|
|
Packit |
d7e8d0 |
(cond
|
|
Packit |
d7e8d0 |
((null-pointer-p value) nil)
|
|
Packit |
d7e8d0 |
(t (with-foreign-slots
|
|
Packit |
d7e8d0 |
((next keyid pubkey-algo status)
|
|
Packit Service |
30b792 |
value (:struct gpgme-recipient))
|
|
Packit |
d7e8d0 |
(append (list (list :keyid keyid
|
|
Packit |
d7e8d0 |
:pubkey-algo pubkey-algo
|
|
Packit |
d7e8d0 |
:status status))
|
|
Packit |
d7e8d0 |
next)))))
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defun translate-gpgme-op-decrypt-result-t-from-foreign (value)
|
|
Packit |
d7e8d0 |
(cond
|
|
Packit |
d7e8d0 |
((null-pointer-p value) nil)
|
|
Packit |
d7e8d0 |
(t (with-foreign-slots
|
|
Packit |
d7e8d0 |
((unsupported-algorithm bitfield recipients file-name)
|
|
Packit Service |
30b792 |
value (:struct gpgme-op-decrypt-result))
|
|
Packit |
d7e8d0 |
(list :decrypt (list :unsupported-algorithm unsupported-algorithm
|
|
Packit |
d7e8d0 |
:bitfield bitfield
|
|
Packit |
d7e8d0 |
:recipients recipients
|
|
Packit |
d7e8d0 |
:file-name file-name))))))
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defun translate-gpgme-new-signature-t-from-foreign (value)
|
|
Packit |
d7e8d0 |
(cond
|
|
Packit |
d7e8d0 |
((null-pointer-p value) nil)
|
|
Packit |
d7e8d0 |
(t (with-foreign-slots
|
|
Packit |
d7e8d0 |
((next type pubkey-algo hash-algo timestamp fpr sig-class)
|
|
Packit Service |
30b792 |
value (:struct gpgme-new-signature))
|
|
Packit |
d7e8d0 |
(append (list (list :type type
|
|
Packit |
d7e8d0 |
:pubkey-algo pubkey-algo
|
|
Packit |
d7e8d0 |
:hash-algo hash-algo
|
|
Packit |
d7e8d0 |
:timestamp timestamp
|
|
Packit |
d7e8d0 |
:fpr fpr
|
|
Packit |
d7e8d0 |
:sig-class sig-class))
|
|
Packit |
d7e8d0 |
next)))))
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defun translate-gpgme-op-sign-result-t-from-foreign (value)
|
|
Packit |
d7e8d0 |
(cond
|
|
Packit |
d7e8d0 |
((null-pointer-p value) nil)
|
|
Packit |
d7e8d0 |
(t (with-foreign-slots
|
|
Packit |
d7e8d0 |
((invalid-signers signatures)
|
|
Packit Service |
30b792 |
value (:struct gpgme-op-sign-result))
|
|
Packit |
d7e8d0 |
(list :sign (list :invalid-signers invalid-signers
|
|
Packit |
d7e8d0 |
:signatures signatures))))))
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defun translate-gpgme-signature-t-from-foreign (value)
|
|
Packit |
d7e8d0 |
(cond
|
|
Packit |
d7e8d0 |
((null-pointer-p value) nil)
|
|
Packit |
d7e8d0 |
(t (with-foreign-slots
|
|
Packit |
d7e8d0 |
((next summary fpr status notations timestamp
|
|
Packit |
d7e8d0 |
exp-timestamp bitfield validity validity-reason
|
|
Packit |
d7e8d0 |
pubkey-algo hash-algo)
|
|
Packit Service |
30b792 |
value (:struct gpgme-signature))
|
|
Packit |
d7e8d0 |
(append (list (list :summary summary
|
|
Packit |
d7e8d0 |
:fpr fpr
|
|
Packit |
d7e8d0 |
:status status
|
|
Packit |
d7e8d0 |
:notations notations
|
|
Packit |
d7e8d0 |
:timestamp timestamp
|
|
Packit |
d7e8d0 |
:exp-timestamp exp-timestamp
|
|
Packit |
d7e8d0 |
:bitfield bitfield
|
|
Packit |
d7e8d0 |
:validity validity
|
|
Packit |
d7e8d0 |
:validity-reason validity-reason
|
|
Packit |
d7e8d0 |
:pubkey-algo pubkey-algo))
|
|
Packit |
d7e8d0 |
next)))))
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defun translate-gpgme-op-verify-result-t-from-foreign (value)
|
|
Packit |
d7e8d0 |
(cond
|
|
Packit |
d7e8d0 |
((null-pointer-p value) nil)
|
|
Packit |
d7e8d0 |
(t (with-foreign-slots
|
|
Packit |
d7e8d0 |
((signatures file-name)
|
|
Packit Service |
30b792 |
value (:struct gpgme-op-verify-result))
|
|
Packit |
d7e8d0 |
(list :verify (list :signatures signatures
|
|
Packit |
d7e8d0 |
:file-name file-name))))))
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defun translate-gpgme-import-status-t-from-foreign (value)
|
|
Packit |
d7e8d0 |
(cond
|
|
Packit |
d7e8d0 |
((null-pointer-p value) nil)
|
|
Packit |
d7e8d0 |
(t (with-foreign-slots
|
|
Packit |
d7e8d0 |
((next fpr result status)
|
|
Packit Service |
30b792 |
value (:struct gpgme-import-status))
|
|
Packit |
d7e8d0 |
(append (list (list :fpr fpr
|
|
Packit |
d7e8d0 |
:result result
|
|
Packit |
d7e8d0 |
:status status))
|
|
Packit |
d7e8d0 |
next)))))
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defun translate-gpgme-op-import-result-t-from-foreign (value)
|
|
Packit |
d7e8d0 |
(cond
|
|
Packit |
d7e8d0 |
((null-pointer-p value) nil)
|
|
Packit |
d7e8d0 |
(t (with-foreign-slots
|
|
Packit |
d7e8d0 |
((considered no-user-id imported imported-rsa unchanged
|
|
Packit |
d7e8d0 |
new-user-ids new-sub-keys new-signatures
|
|
Packit |
d7e8d0 |
new-revocations secret-read secret-imported
|
|
Packit |
d7e8d0 |
secret-unchanged skipped-new-keys not-imported
|
|
Packit |
d7e8d0 |
imports)
|
|
Packit Service |
30b792 |
value (:struct gpgme-op-import-result))
|
|
Packit |
d7e8d0 |
(list :verify (list :considered considered
|
|
Packit |
d7e8d0 |
:no-user-id no-user-id
|
|
Packit |
d7e8d0 |
:imported imported
|
|
Packit |
d7e8d0 |
:imported-rsa imported-rsa
|
|
Packit |
d7e8d0 |
:unchanged unchanged
|
|
Packit |
d7e8d0 |
:new-user-ids new-user-ids
|
|
Packit |
d7e8d0 |
:new-sub-keys new-sub-keys
|
|
Packit |
d7e8d0 |
:new-signatures new-signatures
|
|
Packit |
d7e8d0 |
:new-revocations new-revocations
|
|
Packit |
d7e8d0 |
:secret-read secret-read
|
|
Packit |
d7e8d0 |
:secret-imported secret-imported
|
|
Packit |
d7e8d0 |
:secret-unchanged secret-unchanged
|
|
Packit |
d7e8d0 |
:skipped-new-keys skipped-new-keys
|
|
Packit |
d7e8d0 |
:not-imported not-imported
|
|
Packit |
d7e8d0 |
:imports imports))))))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Error handling.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Use gpgme-error-no-signal-t to suppress automatic error handling
|
|
Packit |
d7e8d0 |
;;; at translation time.
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
;;; FIXME: Part of this probably should be in gpg-error!
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(define-condition gpgme-error (error)
|
|
Packit |
d7e8d0 |
((value :initarg :gpgme-error :reader gpgme-error-value))
|
|
Packit |
d7e8d0 |
(:report (lambda (c stream)
|
|
Packit |
d7e8d0 |
(format stream "GPGME returned error: ~A (~A)"
|
|
Packit |
d7e8d0 |
(gpgme-strerror (gpgme-error-value c))
|
|
Packit |
d7e8d0 |
(gpgme-strsource (gpgme-error-value c)))))
|
|
Packit |
d7e8d0 |
(:documentation "Signalled when a GPGME function returns an error."))
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defun translate-gpgme-error-t-from-foreign (value)
|
|
Packit |
d7e8d0 |
"Raise a GPGME-ERROR if VALUE is non-zero."
|
|
Packit |
d7e8d0 |
(when (not (eql (gpgme-err-code value) :gpg-err-no-error))
|
|
Packit |
d7e8d0 |
(error 'gpgme-error :gpgme-error value))
|
|
Packit |
d7e8d0 |
(gpg-err-canonicalize value))
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defun translate-gpgme-error-t-to-foreign (value)
|
|
Packit |
d7e8d0 |
"Canonicalize the error value."
|
|
Packit |
d7e8d0 |
(if (eql (gpgme-err-code value) :gpg-err-no-error)
|
|
Packit |
d7e8d0 |
0
|
|
Packit |
d7e8d0 |
(gpg-err-as-value value)))
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defun translate-gpgme-error-no-signal-t-from-foreign (value)
|
|
Packit |
d7e8d0 |
"Canonicalize the error value."
|
|
Packit |
d7e8d0 |
(gpg-err-canonicalize value))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; *INTERNAL* Lispy Function Interface that is still close to the C
|
|
Packit |
d7e8d0 |
;;; interface.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Passphrase callback management.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Maybe: Instead, use subclassing, and provide a customizable
|
|
Packit |
d7e8d0 |
;;; default implementation for ease-of-use.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defvar *passphrase-handles* (make-hash-table)
|
|
Packit |
d7e8d0 |
"Hash table with GPGME context address as key and the corresponding
|
|
Packit |
d7e8d0 |
passphrase callback object as value.")
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcallback passphrase-cb gpgme-error-t ((handle :pointer)
|
|
Packit |
d7e8d0 |
(uid-hint :string)
|
|
Packit |
d7e8d0 |
(passphrase-info :string)
|
|
Packit |
d7e8d0 |
(prev-was-bad :boolean)
|
|
Packit |
d7e8d0 |
(fd :int))
|
|
Packit |
d7e8d0 |
(handler-case
|
|
Packit |
d7e8d0 |
(let* ((passphrase-cb
|
|
Packit |
d7e8d0 |
(gethash (pointer-address handle) *passphrase-handles*))
|
|
Packit |
d7e8d0 |
(passphrase
|
|
Packit |
d7e8d0 |
(cond
|
|
Packit |
d7e8d0 |
((functionp passphrase-cb)
|
|
Packit |
d7e8d0 |
(concatenate 'string
|
|
Packit |
d7e8d0 |
(funcall passphrase-cb uid-hint passphrase-info
|
|
Packit |
d7e8d0 |
prev-was-bad)
|
|
Packit |
d7e8d0 |
'(#\Newline)))
|
|
Packit |
d7e8d0 |
(t (concatenate 'string passphrase-cb '(#\Newline)))))
|
|
Packit |
d7e8d0 |
(passphrase-len (length passphrase))
|
|
Packit |
d7e8d0 |
;; FIXME: Could be more robust.
|
|
Packit |
d7e8d0 |
(res (system-write fd passphrase passphrase-len)))
|
|
Packit |
d7e8d0 |
(cond
|
|
Packit |
d7e8d0 |
((< res passphrase-len) ; FIXME: Blech. A weak attempt to be robust.
|
|
Packit |
d7e8d0 |
(gpgme-error :gpg-err-inval))
|
|
Packit |
d7e8d0 |
(t (gpgme-error :gpg-err-no-error))))
|
|
Packit |
d7e8d0 |
(gpgme-error (err) (gpgme-error-value err))
|
|
Packit |
d7e8d0 |
(system-error (err) (gpgme-error-from-errno (system-error-errno err)))
|
|
Packit |
d7e8d0 |
;; FIXME: The original error gets lost here.
|
|
Packit |
d7e8d0 |
(condition (err) (progn
|
|
Packit |
d7e8d0 |
(when *debug*
|
|
Packit |
d7e8d0 |
(format t "DEBUG: passphrase-cb: Unexpressable: ~A~%"
|
|
Packit |
d7e8d0 |
err))
|
|
Packit |
d7e8d0 |
(gpgme-error :gpg-err-general)))))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; CTX is a C-pointer to the context.
|
|
Packit |
d7e8d0 |
(defun gpgme-set-passphrase-cb (ctx cb)
|
|
Packit |
d7e8d0 |
"Set the passphrase callback for CTX."
|
|
Packit |
d7e8d0 |
(let ((handle (pointer-address ctx)))
|
|
Packit |
d7e8d0 |
(cond
|
|
Packit |
d7e8d0 |
(cb (setf (gethash handle *passphrase-handles*) cb)
|
|
Packit |
d7e8d0 |
(c-gpgme-set-passphrase-cb ctx (callback passphrase-cb) ctx))
|
|
Packit |
d7e8d0 |
(t (c-gpgme-set-passphrase-cb ctx (null-pointer) (null-pointer))
|
|
Packit |
d7e8d0 |
(remhash handle *passphrase-handles*)))))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Progress callback management.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Maybe: Instead, use subclassing, and provide a customizable
|
|
Packit |
d7e8d0 |
;;; default implementation for ease-of-use.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defvar *progress-handles* (make-hash-table)
|
|
Packit |
d7e8d0 |
"Hash table with GPGME context address as key and the corresponding
|
|
Packit |
d7e8d0 |
progress callback object as value.")
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcallback progress-cb :void ((handle :pointer)
|
|
Packit |
d7e8d0 |
(what :string)
|
|
Packit |
d7e8d0 |
(type :int)
|
|
Packit |
d7e8d0 |
(current :int)
|
|
Packit |
d7e8d0 |
(total :int))
|
|
Packit |
d7e8d0 |
(handler-case
|
|
Packit |
d7e8d0 |
(let* ((progress-cb
|
|
Packit |
d7e8d0 |
(gethash (pointer-address handle) *progress-handles*)))
|
|
Packit |
d7e8d0 |
(funcall progress-cb what type current total))
|
|
Packit |
d7e8d0 |
;; FIXME: The original error gets lost here.
|
|
Packit |
d7e8d0 |
(condition (err) (when *debug*
|
|
Packit |
d7e8d0 |
(format t "DEBUG: progress-cb: Unexpressable: ~A~%"
|
|
Packit |
d7e8d0 |
err)))))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; CTX is a C-pointer to the context.
|
|
Packit |
d7e8d0 |
(defun gpgme-set-progress-cb (ctx cb)
|
|
Packit |
d7e8d0 |
"Set the progress callback for CTX."
|
|
Packit |
d7e8d0 |
(let ((handle (pointer-address ctx)))
|
|
Packit |
d7e8d0 |
(cond
|
|
Packit |
d7e8d0 |
(cb (setf (gethash handle *progress-handles*) cb)
|
|
Packit |
d7e8d0 |
(c-gpgme-set-progress-cb ctx (callback progress-cb) ctx))
|
|
Packit |
d7e8d0 |
(t (c-gpgme-set-progress-cb ctx (null-pointer) (null-pointer))
|
|
Packit |
d7e8d0 |
(remhash handle *progress-handles*)))))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Context management.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-new (&key (protocol :openpgp) armor textmode include-certs
|
|
Packit |
d7e8d0 |
keylist-mode passphrase progress file-name home-dir)
|
|
Packit |
d7e8d0 |
"Allocate a new GPGME context."
|
|
Packit |
d7e8d0 |
(with-foreign-object (ctx-p 'gpgme-ctx-t)
|
|
Packit |
d7e8d0 |
(c-gpgme-new ctx-p)
|
|
Packit |
d7e8d0 |
(let ((ctx (mem-ref ctx-p 'gpgme-ctx-t)))
|
|
Packit |
d7e8d0 |
;;; Set locale?
|
|
Packit |
d7e8d0 |
(gpgme-set-protocol ctx protocol)
|
|
Packit |
d7e8d0 |
(gpgme-set-armor ctx armor)
|
|
Packit |
d7e8d0 |
(gpgme-set-textmode ctx textmode)
|
|
Packit |
d7e8d0 |
(when include-certs (gpgme-set-include-certs ctx include-certs))
|
|
Packit |
d7e8d0 |
(when keylist-mode (gpgme-set-keylist-mode ctx keylist-mode))
|
|
Packit |
d7e8d0 |
(gpgme-set-passphrase-cb ctx passphrase)
|
|
Packit |
d7e8d0 |
(gpgme-set-progress-cb ctx progress)
|
|
Packit |
d7e8d0 |
(gpgme-set-engine-info ctx protocol
|
|
Packit |
d7e8d0 |
:file-name file-name :home-dir home-dir)
|
|
Packit |
d7e8d0 |
(when *debug* (format t "DEBUG: gpgme-new: ~A~%" ctx))
|
|
Packit |
d7e8d0 |
ctx)))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-release (ctx)
|
|
Packit |
d7e8d0 |
"Release a GPGME context."
|
|
Packit |
d7e8d0 |
(when *debug* (format t "DEBUG: gpgme-release: ~A~%" ctx))
|
|
Packit |
d7e8d0 |
(c-gpgme-release ctx))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-set-protocol (ctx proto)
|
|
Packit |
d7e8d0 |
"Set the protocol to be used by CTX to PROTO."
|
|
Packit |
d7e8d0 |
(c-gpgme-set-protocol ctx proto))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-get-protocol (ctx)
|
|
Packit |
d7e8d0 |
"Get the protocol used with CTX."
|
|
Packit |
d7e8d0 |
(c-gpgme-get-protocol ctx))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; FIXME: How to do pretty printing?
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
;;; gpgme-get-protocol-name
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-set-armor (ctx armor)
|
|
Packit |
d7e8d0 |
"If ARMOR is true, enable armor mode in CTX, disable it otherwise."
|
|
Packit |
d7e8d0 |
(c-gpgme-set-armor ctx armor))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-armor-p (ctx)
|
|
Packit |
d7e8d0 |
"Return true if armor mode is set for CTX."
|
|
Packit |
d7e8d0 |
(c-gpgme-get-armor ctx))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-set-textmode (ctx textmode)
|
|
Packit |
d7e8d0 |
"If TEXTMODE is true, enable text mode mode in CTX, disable it otherwise."
|
|
Packit |
d7e8d0 |
(c-gpgme-set-textmode ctx textmode))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-textmode-p (ctx)
|
|
Packit |
d7e8d0 |
"Return true if text mode mode is set for CTX."
|
|
Packit |
d7e8d0 |
(c-gpgme-get-textmode ctx))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-set-include-certs (ctx &optional certs)
|
|
Packit |
d7e8d0 |
"Include up to CERTS certificates in an S/MIME message."
|
|
Packit |
d7e8d0 |
(c-gpgme-set-include-certs ctx certs))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-get-include-certs (ctx)
|
|
Packit |
d7e8d0 |
"Return the number of certs to include in an S/MIME message,
|
|
Packit |
d7e8d0 |
or NIL if the default is used."
|
|
Packit |
d7e8d0 |
(c-gpgme-get-include-certs ctx))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-get-keylist-mode (ctx)
|
|
Packit |
d7e8d0 |
"Get the keylist mode in CTX."
|
|
Packit |
d7e8d0 |
(c-gpgme-get-keylist-mode ctx))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-set-keylist-mode (ctx mode)
|
|
Packit |
d7e8d0 |
"Set the keylist mode in CTX."
|
|
Packit |
d7e8d0 |
(c-gpgme-set-keylist-mode ctx mode))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; FIXME: How to handle locale? cffi-grovel?
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-get-engine-info (&optional ctx)
|
|
Packit |
d7e8d0 |
"Retrieve the engine info for CTX, or the default if CTX is omitted."
|
|
Packit |
d7e8d0 |
(cond
|
|
Packit |
d7e8d0 |
(ctx (c-gpgme-ctx-get-engine-info ctx))
|
|
Packit |
d7e8d0 |
(t (with-foreign-object (info-p 'gpgme-engine-info-t)
|
|
Packit |
d7e8d0 |
(c-gpgme-get-engine-info info-p)
|
|
Packit |
d7e8d0 |
(mem-ref info-p 'gpgme-engine-info-t)))))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-set-engine-info (ctx proto &key file-name home-dir)
|
|
Packit |
d7e8d0 |
"Set the engine info for CTX, or the default if CTX is NIL."
|
|
Packit |
d7e8d0 |
(cond
|
|
Packit |
d7e8d0 |
(ctx (c-gpgme-ctx-set-engine-info ctx proto file-name home-dir))
|
|
Packit |
d7e8d0 |
(t (c-gpgme-set-engine-info proto file-name home-dir))))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; FIXME: How to do pretty printing?
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
;;; gpgme_pubkey_algo_name, gpgme_hash_algo_name
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-set-signers (ctx keys)
|
|
Packit |
d7e8d0 |
"Set the signers for the context CTX."
|
|
Packit |
d7e8d0 |
(c-gpgme-signers-clear ctx)
|
|
Packit |
d7e8d0 |
(dolist (key keys) (c-gpgme-signers-add ctx key)))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-set-sig-notation (ctx notations)
|
|
Packit |
d7e8d0 |
"Set the sig notation for the context CTX."
|
|
Packit |
d7e8d0 |
(c-gpgme-sig-notation-clear ctx)
|
|
Packit |
d7e8d0 |
(dolist (notation notations)
|
|
Packit |
d7e8d0 |
(c-gpgme-sig-notation-add
|
|
Packit |
d7e8d0 |
ctx (first notation) (second notation) (third notation))))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-get-sig-notation (ctx)
|
|
Packit |
d7e8d0 |
"Get the signature notation data for the context CTX."
|
|
Packit |
d7e8d0 |
(c-gpgme-sig-notation-get ctx))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; FIXME: Add I/O callback interface, for integration with clg.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; FIXME: Add gpgme_wait?
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Streams
|
|
Packit |
d7e8d0 |
;;; -------
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
;;; GPGME uses standard streams. You can define your own streams, or
|
|
Packit |
d7e8d0 |
;;; use the existing file or string streams.
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
;;; A stream-spec is either a stream, or a list with a stream as its
|
|
Packit |
d7e8d0 |
;;; first argument followed by keyword parameters: encoding,
|
|
Packit |
d7e8d0 |
;;; file-name.
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
;;; FIXME: Eventually, we should provide a class that can be mixed
|
|
Packit |
d7e8d0 |
;;; into stream classes and which provides accessors for encoding and
|
|
Packit |
d7e8d0 |
;;; file-names. This interface should be provided in addition to the
|
|
Packit |
d7e8d0 |
;;; above sleazy interface, because the sleazy interface is easier to
|
|
Packit |
d7e8d0 |
;;; use (less typing), and is quite sufficient in a number of cases.
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
;;; For best results, streams with element type (unsigned-byte 8)
|
|
Packit |
d7e8d0 |
;;; should be used. Character streams may work if armor mode is used.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Do we need to provide access to GPGME data objects through streams
|
|
Packit |
d7e8d0 |
;;; as well? It seems to me that specific optimizations, like
|
|
Packit |
d7e8d0 |
;;; directly writing to file descriptors, is better done by extending
|
|
Packit |
d7e8d0 |
;;; the sleazy syntax (stream-spec) instead of customized streams.
|
|
Packit |
d7e8d0 |
;;; Customized streams do buffering, and this may mess up things. Mmh.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defvar *data-handles* (make-hash-table)
|
|
Packit |
d7e8d0 |
"Hash table with GPGME data user callback handle address as key
|
|
Packit |
d7e8d0 |
and the corresponding stream as value.")
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; The release callback removes the stream from the *data-handles*
|
|
Packit |
d7e8d0 |
;;; hash and releases the CBS structure that is used as the key in
|
|
Packit Service |
30b792 |
;;; that hash. It is implicitly invoked (through GPGME) by
|
|
Packit |
d7e8d0 |
;;; gpgme-data-release.
|
|
Packit |
d7e8d0 |
(defcallback data-release-cb :void ((handle :pointer))
|
|
Packit |
d7e8d0 |
(unwind-protect (remhash (pointer-address handle) *data-handles*)
|
|
Packit |
d7e8d0 |
(when (not (null-pointer-p handle)) (foreign-free handle))))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcallback data-read-cb ssize-t ((handle :pointer) (buffer :pointer)
|
|
Packit Service |
30b792 |
(size size-t))
|
|
Packit |
d7e8d0 |
(when *debug* (format t "DEBUG: gpgme-data-read-cb: want ~A~%" size))
|
|
Packit |
d7e8d0 |
(let ((stream (gethash (pointer-address handle) *data-handles*)))
|
|
Packit |
d7e8d0 |
(cond
|
|
Packit |
d7e8d0 |
(stream
|
|
Packit |
d7e8d0 |
(let* ((stream-type (stream-element-type stream))
|
|
Packit Service |
30b792 |
(seq (make-array size :element-type stream-type))
|
|
Packit Service |
30b792 |
(read (read-sequence seq stream)))
|
|
Packit Service |
30b792 |
(cond
|
|
Packit Service |
30b792 |
((equal stream-type '(unsigned-byte 8))
|
|
Packit Service |
30b792 |
(dotimes (i read)
|
|
Packit Service |
30b792 |
(setf (mem-aref buffer :unsigned-char i)
|
|
Packit Service |
30b792 |
(aref (the byte-array seq) i))))
|
|
Packit Service |
30b792 |
((eql stream-type 'character)
|
|
Packit Service |
30b792 |
(dotimes (i read)
|
|
Packit Service |
30b792 |
(setf (mem-aref buffer :unsigned-char i)
|
|
Packit Service |
30b792 |
(char-code (aref (the character-array seq) i)))))
|
|
Packit Service |
30b792 |
(t
|
|
Packit Service |
30b792 |
(dotimes (i read)
|
|
Packit Service |
30b792 |
(setf (mem-aref buffer :unsigned-char i)
|
|
Packit Service |
30b792 |
(coerce (aref seq i) '(unsigned-byte 8))))))
|
|
Packit Service |
30b792 |
(when *debug* (format t "DEBUG: gpgme-data-read-cb: read ~A~%" read))
|
|
Packit Service |
30b792 |
read))
|
|
Packit Service |
30b792 |
(t
|
|
Packit Service |
30b792 |
(set-errno +ebadf+)
|
|
Packit Service |
30b792 |
-1))))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defcallback data-write-cb ssize-t ((handle :pointer) (buffer :pointer)
|
|
Packit Service |
30b792 |
(size size-t))
|
|
Packit |
d7e8d0 |
(when *debug* (format t "DEBUG: gpgme-data-write-cb: want ~A~%" size))
|
|
Packit |
d7e8d0 |
(let ((stream (gethash (pointer-address handle) *data-handles*)))
|
|
Packit |
d7e8d0 |
(cond
|
|
Packit |
d7e8d0 |
(stream
|
|
Packit |
d7e8d0 |
(let* ((stream-type (stream-element-type stream))
|
|
Packit Service |
30b792 |
(seq (make-array size :element-type stream-type)))
|
|
Packit Service |
30b792 |
(cond
|
|
Packit Service |
30b792 |
((equal stream-type '(unsigned-byte 8))
|
|
Packit Service |
30b792 |
(dotimes (i size)
|
|
Packit Service |
30b792 |
(setf (aref (the byte-array seq) i)
|
|
Packit Service |
30b792 |
(mem-aref buffer :unsigned-char i))))
|
|
Packit Service |
30b792 |
((eql stream-type 'character)
|
|
Packit Service |
30b792 |
(dotimes (i size)
|
|
Packit Service |
30b792 |
(setf (aref (the character-array seq) i)
|
|
Packit Service |
30b792 |
(code-char (mem-aref buffer :unsigned-char i)))))
|
|
Packit Service |
30b792 |
(t
|
|
Packit Service |
30b792 |
(dotimes (i size)
|
|
Packit Service |
30b792 |
(setf (aref seq i)
|
|
Packit Service |
30b792 |
(coerce (mem-aref buffer :unsigned-char i) stream-type)))))
|
|
Packit Service |
30b792 |
(write-sequence seq stream)
|
|
Packit Service |
30b792 |
size))
|
|
Packit Service |
30b792 |
(t
|
|
Packit Service |
30b792 |
(set-errno +ebadf+)
|
|
Packit Service |
30b792 |
-1))))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; This little helper macro allows us to swallow the cbs structure by
|
|
Packit |
d7e8d0 |
;;; simply setting it to a null pointer, but still protect against
|
|
Packit |
d7e8d0 |
;;; conditions.
|
|
Packit |
d7e8d0 |
(defmacro with-cbs-swallowed ((cbs) &body body)
|
|
Packit Service |
30b792 |
`(let ((,cbs (foreign-alloc '(:struct gpgme-data-cbs))))
|
|
Packit |
d7e8d0 |
(unwind-protect (progn ,@body)
|
|
Packit |
d7e8d0 |
(when (not (null-pointer-p ,cbs)) (foreign-free ,cbs)))))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-data-new (stream &key encoding file-name)
|
|
Packit |
d7e8d0 |
"Allocate a new GPGME data object for STREAM."
|
|
Packit |
d7e8d0 |
(with-foreign-object (dh-p 'gpgme-data-t)
|
|
Packit |
d7e8d0 |
;;; We allocate one CBS structure for each stream we wrap in a
|
|
Packit |
d7e8d0 |
;;; data object. Although we could also share all these
|
|
Packit |
d7e8d0 |
;;; structures, as they contain the very same callbacks, we need a
|
|
Packit |
d7e8d0 |
;;; unique C pointer as handle anyway to look up the stream in the
|
|
Packit |
d7e8d0 |
;;; callback. This is a convenient one to use.
|
|
Packit |
d7e8d0 |
(with-cbs-swallowed (cbs)
|
|
Packit Service |
30b792 |
(setf (foreign-slot-value cbs '(:struct gpgme-data-cbs) 'read)
|
|
Packit Service |
30b792 |
(callback data-read-cb))
|
|
Packit Service |
30b792 |
(setf (foreign-slot-value cbs '(:struct gpgme-data-cbs) 'write)
|
|
Packit Service |
30b792 |
(callback data-write-cb))
|
|
Packit Service |
30b792 |
(setf (foreign-slot-value cbs '(:struct gpgme-data-cbs) 'seek)
|
|
Packit Service |
30b792 |
(null-pointer))
|
|
Packit Service |
30b792 |
(setf (foreign-slot-value cbs '(:struct gpgme-data-cbs) 'release)
|
|
Packit Service |
30b792 |
(callback data-release-cb))
|
|
Packit |
d7e8d0 |
(c-gpgme-data-new-from-cbs dh-p cbs cbs)
|
|
Packit |
d7e8d0 |
(let ((dh (mem-ref dh-p 'gpgme-data-t)))
|
|
Packit |
d7e8d0 |
(when encoding (gpgme-data-set-encoding dh encoding))
|
|
Packit |
d7e8d0 |
(when file-name (gpgme-data-set-file-name dh file-name))
|
|
Packit |
d7e8d0 |
;;; Install the stream into the hash table and swallow the cbs
|
|
Packit |
d7e8d0 |
;;; structure while protecting against any errors.
|
|
Packit |
d7e8d0 |
(unwind-protect
|
|
Packit |
d7e8d0 |
(progn
|
|
Packit |
d7e8d0 |
(setf (gethash (pointer-address cbs) *data-handles*) stream)
|
|
Packit |
d7e8d0 |
(setf cbs (null-pointer)))
|
|
Packit |
d7e8d0 |
(when (not (null-pointer-p cbs)) (c-gpgme-data-release dh)))
|
|
Packit |
d7e8d0 |
(when *debug* (format t "DEBUG: gpgme-data-new: ~A~%" dh))
|
|
Packit |
d7e8d0 |
dh))))
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
;;; This function releases a GPGME data object. It implicitly
|
|
Packit |
d7e8d0 |
;;; invokes the data-release-cb function to clean up associated junk.
|
|
Packit |
d7e8d0 |
(defun gpgme-data-release (dh)
|
|
Packit |
d7e8d0 |
"Release a GPGME data object."
|
|
Packit |
d7e8d0 |
(when *debug* (format t "DEBUG: gpgme-data-release: ~A~%" dh))
|
|
Packit |
d7e8d0 |
(c-gpgme-data-release dh))
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defclass data ()
|
|
Packit Service |
30b792 |
(c-data) ; The C data object pointer
|
|
Packit Service |
30b792 |
(:documentation "The GPGME data type."))
|
|
Packit Service |
30b792 |
|
|
Packit Service |
30b792 |
(defmethod initialize-instance :after ((data data) &key streamspec
|
|
Packit Service |
30b792 |
&allow-other-keys)
|
|
Packit Service |
30b792 |
(let ((c-data (if (listp streamspec)
|
|
Packit Service |
30b792 |
(apply #'gpgme-data-new streamspec)
|
|
Packit Service |
30b792 |
(gpgme-data-new streamspec)))
|
|
Packit Service |
30b792 |
(cleanup t))
|
|
Packit Service |
30b792 |
(unwind-protect
|
|
Packit Service |
30b792 |
(progn
|
|
Packit Service |
30b792 |
(setf (slot-value data 'c-data) c-data)
|
|
Packit Service |
30b792 |
(finalize data (lambda () (gpgme-data-release c-data)))
|
|
Packit Service |
30b792 |
(setf cleanup nil))
|
|
Packit Service |
30b792 |
(if cleanup (gpgme-data-release c-data)))))
|
|
Packit Service |
30b792 |
|
|
Packit Service |
30b792 |
(defun translate-gpgme-data-t-to-foreign (value)
|
|
Packit Service |
30b792 |
;; Allow a pointer to be passed directly for the finalizer to work.
|
|
Packit Service |
30b792 |
(cond
|
|
Packit Service |
30b792 |
((null value) (null-pointer))
|
|
Packit Service |
30b792 |
((pointerp value) value)
|
|
Packit Service |
30b792 |
(t (slot-value value 'c-data))))
|
|
Packit Service |
30b792 |
|
|
Packit |
d7e8d0 |
(defmacro with-gpgme-data ((dh streamspec) &body body)
|
|
Packit Service |
30b792 |
`(let ((,dh (make-instance 'data :streamspec ,streamspec)))
|
|
Packit Service |
30b792 |
,@body))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-data-get-encoding (dh)
|
|
Packit |
d7e8d0 |
"Get the encoding associated with the data object DH."
|
|
Packit |
d7e8d0 |
(c-gpgme-data-get-encoding dh))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-data-set-encoding (dh encoding)
|
|
Packit |
d7e8d0 |
"Set the encoding associated with the data object DH to ENCODING."
|
|
Packit |
d7e8d0 |
(c-gpgme-data-set-encoding dh encoding))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-data-get-file-name (dh)
|
|
Packit |
d7e8d0 |
"Get the file name associated with the data object DH."
|
|
Packit |
d7e8d0 |
(c-gpgme-data-get-file-name dh))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-data-set-file-name (dh file-name)
|
|
Packit |
d7e8d0 |
"Set the file name associated with the data object DH to FILE-NAME."
|
|
Packit |
d7e8d0 |
(c-gpgme-data-set-file-name dh file-name))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; FIXME: Add key accessor interfaces.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-get-key (ctx fpr &optional secret)
|
|
Packit |
d7e8d0 |
"Get the key with the fingerprint FPR from the context CTX."
|
|
Packit |
d7e8d0 |
(with-foreign-object (key-p 'gpgme-key-t)
|
|
Packit |
d7e8d0 |
(c-gpgme-get-key ctx fpr key-p secret)
|
|
Packit |
d7e8d0 |
(mem-ref key-p 'gpgme-key-t)))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-key-ref (key)
|
|
Packit |
d7e8d0 |
"Acquire an additional reference to the key KEY."
|
|
Packit |
d7e8d0 |
(when *debug* (format t "DEBUG: gpgme-key-ref: ~A~%" key))
|
|
Packit |
d7e8d0 |
(c-gpgme-key-ref key))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-key-unref (key)
|
|
Packit |
d7e8d0 |
"Release a reference to the key KEY."
|
|
Packit |
d7e8d0 |
(when *debug* (format t "DEBUG: gpgme-key-unref: ~A~%" key))
|
|
Packit |
d7e8d0 |
(c-gpgme-key-unref key))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; FIXME: We REALLY need pretty printing for keys and all the other
|
|
Packit |
d7e8d0 |
;;; big structs.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Various interfaces.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun gpgme-check-version (&optional req-version)
|
|
Packit |
d7e8d0 |
(c-gpgme-check-version req-version))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
;;; The *EXPORTED* CLOS interface.
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; The context type.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; We wrap the C context pointer into a class object to be able to
|
|
Packit |
d7e8d0 |
;;; stick a finalizer on it.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defclass context ()
|
|
Packit |
d7e8d0 |
(c-ctx ; The C context object pointer.
|
|
Packit |
d7e8d0 |
signers ; The list of signers.
|
|
Packit |
d7e8d0 |
sig-notation) ; The list of signers.
|
|
Packit |
d7e8d0 |
(:documentation "The GPGME context type."))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defmethod initialize-instance :after ((ctx context) &rest rest
|
|
Packit |
d7e8d0 |
&key &allow-other-keys)
|
|
Packit |
d7e8d0 |
(let ((c-ctx (apply #'gpgme-new rest))
|
|
Packit |
d7e8d0 |
(cleanup t))
|
|
Packit |
d7e8d0 |
(unwind-protect
|
|
Packit |
d7e8d0 |
(progn (setf (slot-value ctx 'c-ctx) c-ctx)
|
|
Packit |
d7e8d0 |
(finalize ctx (lambda () (gpgme-release c-ctx)))
|
|
Packit |
d7e8d0 |
(setf cleanup nil))
|
|
Packit |
d7e8d0 |
(if cleanup (gpgme-release c-ctx)))))
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defun translate-gpgme-ctx-t-to-foreign (value)
|
|
Packit |
d7e8d0 |
;; Allow a pointer to be passed directly for the finalizer to work.
|
|
Packit |
d7e8d0 |
(if (pointerp value) value (slot-value value 'c-ctx)))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defmacro context (&rest rest)
|
|
Packit |
d7e8d0 |
"Create a new GPGME context."
|
|
Packit |
d7e8d0 |
`(make-instance 'context ,@rest))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; The context type: Accessor functions.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; The context type: Accessor functions: Protocol.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defgeneric protocol (ctx)
|
|
Packit |
d7e8d0 |
(:documentation "Get the protocol of CONTEXT."))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defmethod protocol ((ctx context))
|
|
Packit |
d7e8d0 |
(gpgme-get-protocol ctx))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defgeneric (setf protocol) (protocol ctx)
|
|
Packit |
d7e8d0 |
(:documentation "Set the protocol of CONTEXT to PROTOCOL."))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; FIXME: Adjust translator to reject invalid protocols. Currently,
|
|
Packit Service |
30b792 |
;;; specifying an invalid protocol throws a "NIL is not 32 signed int"
|
|
Packit |
d7e8d0 |
;;; error. This is suboptimal.
|
|
Packit |
d7e8d0 |
(defmethod (setf protocol) (protocol (ctx context))
|
|
Packit |
d7e8d0 |
(gpgme-set-protocol ctx protocol))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; The context type: Accessor functions: Armor.
|
|
Packit |
d7e8d0 |
;;; FIXME: Is it good style to make foop setf-able? Or should it be
|
|
Packit |
d7e8d0 |
;;; foo/foop for set/get?
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defgeneric armorp (ctx)
|
|
Packit |
d7e8d0 |
(:documentation "Get the armor flag of CONTEXT."))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defmethod armorp ((ctx context))
|
|
Packit |
d7e8d0 |
(gpgme-armor-p ctx))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defgeneric (setf armorp) (armor ctx)
|
|
Packit |
d7e8d0 |
(:documentation "Set the armor flag of CONTEXT to ARMOR."))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defmethod (setf armorp) (armor (ctx context))
|
|
Packit |
d7e8d0 |
(gpgme-set-armor ctx armor))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; The context type: Accessor functions: Textmode.
|
|
Packit |
d7e8d0 |
;;; FIXME: Is it good style to make foop setf-able? Or should it be
|
|
Packit |
d7e8d0 |
;;; foo/foop for set/get?
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defgeneric textmodep (ctx)
|
|
Packit |
d7e8d0 |
(:documentation "Get the text mode flag of CONTEXT."))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defmethod textmodep ((ctx context))
|
|
Packit |
d7e8d0 |
(gpgme-textmode-p ctx))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defgeneric (setf textmodep) (textmode ctx)
|
|
Packit |
d7e8d0 |
(:documentation "Set the text mode flag of CONTEXT to TEXTMODE."))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defmethod (setf textmodep) (textmode (ctx context))
|
|
Packit |
d7e8d0 |
(gpgme-set-textmode ctx textmode))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; The context type: Accessor functions: Include Certs.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defgeneric include-certs (ctx)
|
|
Packit |
d7e8d0 |
(:documentation "Get the number of included certificates in an
|
|
Packit |
d7e8d0 |
S/MIME message, or NIL if the default is used."))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defmethod include-certs ((ctx context))
|
|
Packit |
d7e8d0 |
(gpgme-get-include-certs ctx))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defgeneric (setf include-certs) (certs ctx)
|
|
Packit |
d7e8d0 |
(:documentation "Return the number of certificates to include in an
|
|
Packit |
d7e8d0 |
S/MIME message, or NIL if the default is used."))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defmethod (setf include-certs) (certs (ctx context))
|
|
Packit |
d7e8d0 |
(gpgme-set-include-certs ctx certs))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; The context type: Accessor functions: Engine info.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defgeneric engine-info (ctx)
|
|
Packit |
d7e8d0 |
(:documentation "Retrieve the engine info for CTX."))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defmethod engine-info ((ctx context))
|
|
Packit |
d7e8d0 |
(gpgme-get-engine-info ctx))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defgeneric (setf engine-info) (info ctx)
|
|
Packit |
d7e8d0 |
(:documentation "Set the engine info for CTX."))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defmethod (setf engine-info) (info (ctx context))
|
|
Packit |
d7e8d0 |
(dolist (proto '(:openpgp :cms))
|
|
Packit |
d7e8d0 |
(let ((pinfo (getf info proto)))
|
|
Packit |
d7e8d0 |
(when pinfo
|
|
Packit |
d7e8d0 |
(gpgme-set-engine-info ctx proto :file-name (getf pinfo :file-name)
|
|
Packit |
d7e8d0 |
:home-dir (getf pinfo :home-dir))))))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; The context type: Accessor functions: Keylist mode.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defgeneric keylist-mode (ctx)
|
|
Packit |
d7e8d0 |
(:documentation "Get the keylist mode of CTX."))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defmethod keylist-mode ((ctx context))
|
|
Packit |
d7e8d0 |
(gpgme-get-keylist-mode ctx))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defgeneric (setf keylist-mode) (mode ctx)
|
|
Packit |
d7e8d0 |
(:documentation "Set the keylist mode of CTX to MODE."))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defmethod (setf keylist-mode) (mode (ctx context))
|
|
Packit |
d7e8d0 |
(gpgme-set-keylist-mode ctx mode))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; The context type: Accessor functions: Signers.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defgeneric signers (ctx)
|
|
Packit |
d7e8d0 |
(:documentation "Get the signers of CTX."))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defmethod signers ((ctx context))
|
|
Packit |
d7e8d0 |
(slot-value ctx 'signers))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defgeneric (setf signers) (signers ctx)
|
|
Packit |
d7e8d0 |
(:documentation "Set the signers of CTX to SIGNERS."))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defmethod (setf keylist-mode) (signers (ctx context))
|
|
Packit |
d7e8d0 |
(gpgme-set-signers ctx signers)
|
|
Packit |
d7e8d0 |
(setf (slot-value ctx 'signers) signers))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; The context type: Accessor functions: Sig notations.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defgeneric sig-notations (ctx)
|
|
Packit |
d7e8d0 |
(:documentation "Get the signature notations of CTX."))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defmethod sig-notations ((ctx context))
|
|
Packit |
d7e8d0 |
(slot-value ctx 'signers))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defgeneric (setf sig-notations) (notations ctx)
|
|
Packit |
d7e8d0 |
(:documentation "Set the signatire notations of CTX to NOTATIONS."))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defmethod (setf sig-notations) (notations (ctx context))
|
|
Packit |
d7e8d0 |
(gpgme-set-signers ctx notations)
|
|
Packit |
d7e8d0 |
(setf (slot-value ctx 'notations) notations))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; The context type: Support macros.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defmacro with-context ((ctx &rest rest) &body body)
|
|
Packit |
d7e8d0 |
`(let ((,ctx (make-instance 'context ,@rest)))
|
|
Packit |
d7e8d0 |
,@body))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; The key type.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defclass key ()
|
|
Packit |
d7e8d0 |
(c-key) ; The C key object pointer.
|
|
Packit |
d7e8d0 |
(:documentation "The GPGME key type."))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; In the initializer, we swallow the c-key argument.
|
|
Packit |
d7e8d0 |
(defmethod initialize-instance :after ((key key) &key c-key
|
|
Packit |
d7e8d0 |
&allow-other-keys)
|
|
Packit |
d7e8d0 |
(setf (slot-value key 'c-key) c-key)
|
|
Packit |
d7e8d0 |
(finalize key (lambda () (gpgme-key-unref c-key))))
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defun translate-gpgme-key-t-from-foreign (value)
|
|
Packit |
d7e8d0 |
(when *debug* (format t "DEBUG: import key: ~A~%" value))
|
|
Packit |
d7e8d0 |
(make-instance 'key :c-key value))
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defun translate-gpgme-key-t-to-foreign (value)
|
|
Packit |
d7e8d0 |
;; Allow a pointer to be passed directly for the finalizer to work.
|
|
Packit |
d7e8d0 |
(if (pointerp value) value (slot-value value 'c-key)))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defmethod print-object ((key key) stream)
|
|
Packit |
d7e8d0 |
(print-unreadable-object (key stream :type t :identity t)
|
|
Packit |
d7e8d0 |
(format stream "~s" (fpr key))))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; The key type: Accessor functions.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; FIXME: The bitfield and flags contain redundant information at
|
|
Packit |
d7e8d0 |
;;; this point. FIXME: Deal nicer with zero-length name (policy url)
|
|
Packit |
d7e8d0 |
;;; and zero length value (omit?) and human-readable (convert to string).
|
|
Packit |
d7e8d0 |
;;; FIXME: Turn binary data into sequence or vector or what it should be.
|
|
Packit |
d7e8d0 |
;;; FIXME: Turn the whole thing into a hash?
|
|
Packit Service |
30b792 |
(defun translate-gpgme-sig-notation-t-from-foreign (value)
|
|
Packit |
d7e8d0 |
(cond
|
|
Packit |
d7e8d0 |
((null-pointer-p value) nil)
|
|
Packit |
d7e8d0 |
(t (with-foreign-slots
|
|
Packit |
d7e8d0 |
((next name value name-len value-len flags bitfield)
|
|
Packit Service |
30b792 |
value (:struct gpgme-sig-notation))
|
|
Packit |
d7e8d0 |
(append (list (list
|
|
Packit |
d7e8d0 |
:name name
|
|
Packit |
d7e8d0 |
:value value
|
|
Packit |
d7e8d0 |
:name-len name-len
|
|
Packit |
d7e8d0 |
:value-len value-len
|
|
Packit |
d7e8d0 |
:flags flags
|
|
Packit |
d7e8d0 |
:bitfield bitfield))
|
|
Packit |
d7e8d0 |
next)))))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; FIXME: Deal nicer with timestamps. bitfield field name?
|
|
Packit Service |
30b792 |
(defun translate-gpgme-subkey-t-from-foreign (value)
|
|
Packit |
d7e8d0 |
(cond
|
|
Packit |
d7e8d0 |
((null-pointer-p value) nil)
|
|
Packit |
d7e8d0 |
(t (with-foreign-slots
|
|
Packit |
d7e8d0 |
((next bitfield pubkey-algo length keyid fpr timestamp expires)
|
|
Packit Service |
30b792 |
value (:struct gpgme-subkey))
|
|
Packit |
d7e8d0 |
(append (list (list
|
|
Packit |
d7e8d0 |
:bitfield bitfield
|
|
Packit |
d7e8d0 |
:pubkey-algo pubkey-algo
|
|
Packit |
d7e8d0 |
:length length
|
|
Packit |
d7e8d0 |
:keyid keyid
|
|
Packit |
d7e8d0 |
:fpr fpr
|
|
Packit |
d7e8d0 |
:timestamp timestamp
|
|
Packit |
d7e8d0 |
:expires expires))
|
|
Packit |
d7e8d0 |
next)))))
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defun translate-gpgme-key-sig-t-from-foreign (value)
|
|
Packit |
d7e8d0 |
(cond
|
|
Packit |
d7e8d0 |
((null-pointer-p value) nil)
|
|
Packit |
d7e8d0 |
(t (with-foreign-slots
|
|
Packit |
d7e8d0 |
((next bitfield pubkey-algo keyid timestamp expires status
|
|
Packit |
d7e8d0 |
uid name email comment sig-class)
|
|
Packit Service |
30b792 |
value (:struct gpgme-key-sig))
|
|
Packit |
d7e8d0 |
(append (list (list
|
|
Packit |
d7e8d0 |
:bitfield bitfield
|
|
Packit |
d7e8d0 |
:pubkey-algo pubkey-algo
|
|
Packit |
d7e8d0 |
:keyid keyid
|
|
Packit |
d7e8d0 |
:timestamp timestamp
|
|
Packit |
d7e8d0 |
:expires expires
|
|
Packit |
d7e8d0 |
:status status
|
|
Packit |
d7e8d0 |
:uid uid
|
|
Packit |
d7e8d0 |
:name name
|
|
Packit |
d7e8d0 |
:email email
|
|
Packit |
d7e8d0 |
:comment comment
|
|
Packit |
d7e8d0 |
:sig-class sig-class))
|
|
Packit |
d7e8d0 |
next)))))
|
|
Packit |
d7e8d0 |
|
|
Packit Service |
30b792 |
(defun translate-gpgme-user-id-t-from-foreign (value)
|
|
Packit |
d7e8d0 |
(cond
|
|
Packit |
d7e8d0 |
((null-pointer-p value) nil)
|
|
Packit |
d7e8d0 |
(t (with-foreign-slots
|
|
Packit |
d7e8d0 |
((next bitfield validity uid name email comment signatures)
|
|
Packit Service |
30b792 |
value (:struct gpgme-user-id))
|
|
Packit |
d7e8d0 |
(append (list (list
|
|
Packit |
d7e8d0 |
:bitfield bitfield
|
|
Packit |
d7e8d0 |
:validity validity
|
|
Packit |
d7e8d0 |
:uid uid
|
|
Packit |
d7e8d0 |
:name name
|
|
Packit |
d7e8d0 |
:email email
|
|
Packit |
d7e8d0 |
:comment comment
|
|
Packit |
d7e8d0 |
:signatures signatures))
|
|
Packit |
d7e8d0 |
next)))))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun key-data (key)
|
|
Packit |
d7e8d0 |
(with-slots (c-key) key
|
|
Packit |
d7e8d0 |
(with-foreign-slots
|
|
Packit |
d7e8d0 |
((bitfield protocol issuer-serial issuer-name chain-id
|
|
Packit |
d7e8d0 |
owner-trust subkeys uids keylist-mode)
|
|
Packit Service |
30b792 |
c-key (:struct gpgme-key))
|
|
Packit |
d7e8d0 |
(list
|
|
Packit |
d7e8d0 |
:bitfield bitfield
|
|
Packit |
d7e8d0 |
:protocol protocol
|
|
Packit |
d7e8d0 |
:issuer-serial issuer-serial
|
|
Packit |
d7e8d0 |
:issuer-name issuer-name
|
|
Packit |
d7e8d0 |
:chain-id chain-id
|
|
Packit |
d7e8d0 |
:owner-trust owner-trust
|
|
Packit |
d7e8d0 |
:subkeys subkeys
|
|
Packit |
d7e8d0 |
:uids uids
|
|
Packit |
d7e8d0 |
:keylist-mode keylist-mode))
|
|
Packit |
d7e8d0 |
))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defgeneric fpr (key)
|
|
Packit |
d7e8d0 |
(:documentation "Get the primary fingerprint of the key."))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defmethod fpr ((key key))
|
|
Packit |
d7e8d0 |
(getf (car (getf (key-data key) :subkeys)) :fpr))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; The context type: Crypto-Operations.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defgeneric get-key (ctx fpr &optional secret)
|
|
Packit |
d7e8d0 |
(:documentation "Get the (secret) key FPR from CTX."))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defmethod get-key ((ctx context) fpr &optional secret)
|
|
Packit |
d7e8d0 |
(gpgme-get-key ctx fpr secret))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Encrypt.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defgeneric op-encrypt (ctx recp plain cipher &key always-trust sign)
|
|
Packit |
d7e8d0 |
(:documentation "Encrypt."))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defmethod op-encrypt ((ctx context) recp plain cipher
|
|
Packit |
d7e8d0 |
&key always-trust sign)
|
|
Packit |
d7e8d0 |
(with-foreign-object (c-recp :pointer (+ 1 (length recp)))
|
|
Packit |
d7e8d0 |
(dotimes (i (length recp))
|
|
Packit |
d7e8d0 |
(setf (mem-aref c-recp 'gpgme-key-t i) (elt recp i)))
|
|
Packit |
d7e8d0 |
(setf (mem-aref c-recp :pointer (length recp)) (null-pointer))
|
|
Packit |
d7e8d0 |
(with-gpgme-data (in plain)
|
|
Packit |
d7e8d0 |
(with-gpgme-data (out cipher)
|
|
Packit |
d7e8d0 |
(let ((flags))
|
|
Packit |
d7e8d0 |
(if always-trust (push :always-trust flags))
|
|
Packit |
d7e8d0 |
(cond
|
|
Packit |
d7e8d0 |
(sign
|
|
Packit |
d7e8d0 |
(c-gpgme-op-encrypt-sign ctx c-recp flags in out)
|
|
Packit |
d7e8d0 |
(append (c-gpgme-op-encrypt-result ctx)
|
|
Packit |
d7e8d0 |
(c-gpgme-op-sign-result ctx)))
|
|
Packit |
d7e8d0 |
(t
|
|
Packit |
d7e8d0 |
(c-gpgme-op-encrypt ctx c-recp flags in out)
|
|
Packit |
d7e8d0 |
(c-gpgme-op-encrypt-result ctx))))))))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Decrypt.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defgeneric op-decrypt (ctx cipher plain &key verify)
|
|
Packit |
d7e8d0 |
(:documentation "Decrypt."))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defmethod op-decrypt ((ctx context) cipher plain &key verify)
|
|
Packit |
d7e8d0 |
(with-gpgme-data (in cipher)
|
|
Packit |
d7e8d0 |
(with-gpgme-data (out plain)
|
|
Packit |
d7e8d0 |
(cond
|
|
Packit |
d7e8d0 |
(verify
|
|
Packit |
d7e8d0 |
(c-gpgme-op-decrypt-verify ctx in out)
|
|
Packit |
d7e8d0 |
(append (c-gpgme-op-decrypt-result ctx)
|
|
Packit |
d7e8d0 |
(c-gpgme-op-verify-result ctx)))
|
|
Packit |
d7e8d0 |
(t
|
|
Packit |
d7e8d0 |
(c-gpgme-op-decrypt ctx in out)
|
|
Packit |
d7e8d0 |
(c-gpgme-op-decrypt-result ctx))))))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Signing.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defgeneric op-sign (ctx plain sig &optional mode)
|
|
Packit |
d7e8d0 |
(:documentation "Sign."))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defmethod op-sign ((ctx context) plain sig &optional (mode :none))
|
|
Packit |
d7e8d0 |
(with-gpgme-data (in plain)
|
|
Packit |
d7e8d0 |
(with-gpgme-data (out sig)
|
|
Packit |
d7e8d0 |
(c-gpgme-op-sign ctx in out mode)
|
|
Packit |
d7e8d0 |
(c-gpgme-op-sign-result ctx))))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Verify.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defgeneric op-verify (ctx sig text &key detached)
|
|
Packit |
d7e8d0 |
(:documentation "Verify."))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defmethod op-verify ((ctx context) sig text &key detached)
|
|
Packit |
d7e8d0 |
(with-gpgme-data (in sig)
|
|
Packit |
d7e8d0 |
(with-gpgme-data (on text)
|
|
Packit |
d7e8d0 |
(c-gpgme-op-verify ctx in (if detached on nil)
|
|
Packit |
d7e8d0 |
(if detached nil on))
|
|
Packit |
d7e8d0 |
(c-gpgme-op-verify-result ctx))))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Import.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defgeneric op-import (ctx keydata)
|
|
Packit |
d7e8d0 |
(:documentation "Import."))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defmethod op-import ((ctx context) keydata)
|
|
Packit |
d7e8d0 |
(with-gpgme-data (in keydata)
|
|
Packit |
d7e8d0 |
(c-gpgme-op-import ctx in)
|
|
Packit |
d7e8d0 |
(c-gpgme-op-import-result ctx)))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Export.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defgeneric op-export (ctx pattern keydata)
|
|
Packit |
d7e8d0 |
(:documentation "Export public key data matching PATTERN to the
|
|
Packit |
d7e8d0 |
stream KEYDATA."))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defmethod op-export ((ctx context) pattern keydata)
|
|
Packit |
d7e8d0 |
(with-gpgme-data (dh keydata)
|
|
Packit |
d7e8d0 |
(c-gpgme-op-export ctx pattern 0 dh)))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;; Key generation.
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
;;; Initialization
|
|
Packit |
d7e8d0 |
;;;
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defun check-version (&optional req-version)
|
|
Packit |
d7e8d0 |
"Check that the GPGME version requirement is satisfied."
|
|
Packit |
d7e8d0 |
(gpgme-check-version req-version))
|
|
Packit |
d7e8d0 |
|
|
Packit |
d7e8d0 |
(defparameter *version* (check-version)
|
|
Packit |
d7e8d0 |
"The version number of GPGME used.")
|