Blame lang/cl/gpgme.lisp

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.")