agent: Improve concurrency when Libgcrypt 1.8 is used.
[gnupg.git] / agent / agent.h
1 /* agent.h - Global definitions for the agent
2  * Copyright (C) 2001, 2002, 2003, 2005, 2011 Free Software Foundation, Inc.
3  * Copyright (C) 2015 g10 Code GmbH.
4  *
5  * This file is part of GnuPG.
6  *
7  * GnuPG is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * GnuPG is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, see <https://www.gnu.org/licenses/>.
19  */
20
21 #ifndef AGENT_H
22 #define AGENT_H
23
24 #ifdef GPG_ERR_SOURCE_DEFAULT
25 #error GPG_ERR_SOURCE_DEFAULT already defined
26 #endif
27 #define GPG_ERR_SOURCE_DEFAULT  GPG_ERR_SOURCE_GPGAGENT
28 #include <gpg-error.h>
29 #define map_assuan_err(a) \
30         map_assuan_err_with_source (GPG_ERR_SOURCE_DEFAULT, (a))
31 #include <errno.h>
32
33 #include <gcrypt.h>
34 #include "../common/util.h"
35 #include "../common/membuf.h"
36 #include "../common/sysutils.h" /* (gnupg_fd_t) */
37 #include "../common/session-env.h"
38 #include "../common/shareddefs.h"
39
40 /* To convey some special hash algorithms we use algorithm numbers
41    reserved for application use. */
42 #ifndef GCRY_MODULE_ID_USER
43 #define GCRY_MODULE_ID_USER 1024
44 #endif
45 #define MD_USER_TLS_MD5SHA1 (GCRY_MODULE_ID_USER+1)
46
47 /* Maximum length of a digest.  */
48 #define MAX_DIGEST_LEN 64
49
50 /* The maximum length of a passphrase (in bytes).  Note: this is
51    further contrained by the Assuan line length (and any other text on
52    the same line).  However, the Assuan line length is 1k bytes so
53    this shouldn't be a problem in practice.  */
54 #define MAX_PASSPHRASE_LEN 255
55
56
57 /* A large struct name "opt" to keep global flags */
58 struct
59 {
60   unsigned int debug;  /* Debug flags (DBG_foo_VALUE) */
61   int verbose;         /* Verbosity level */
62   int quiet;           /* Be as quiet as possible */
63   int dry_run;         /* Don't change any persistent data */
64   int batch;           /* Batch mode */
65
66   /* True if we handle sigusr2.  */
67   int sigusr2_enabled;
68
69   /* Environment settings gathered at program start or changed using the
70      Assuan command UPDATESTARTUPTTY. */
71   session_env_t startup_env;
72   char *startup_lc_ctype;
73   char *startup_lc_messages;
74
75   /* Enable pinentry debugging (--debug 1024 should also be used).  */
76   int debug_pinentry;
77
78   /* Filename of the program to start as pinentry.  */
79   const char *pinentry_program;
80
81   /* Filename of the program to handle smartcard tasks.  */
82   const char *scdaemon_program;
83
84   int disable_scdaemon;         /* Never use the SCdaemon. */
85
86   int no_grab;         /* Don't let the pinentry grab the keyboard */
87
88   /* The name of the file pinentry shall touch before exiting.  If
89      this is not set the file name of the standard socket is used. */
90   const char *pinentry_touch_file;
91
92   /* A string where the first character is used by the pinentry as a
93      custom invisible character.  */
94   char *pinentry_invisible_char;
95
96   /* The timeout value for the Pinentry in seconds.  This is passed to
97      the pinentry if it is not 0.  It is up to the pinentry to act
98      upon this timeout value.  */
99   unsigned long pinentry_timeout;
100
101   /* The default and maximum TTL of cache entries. */
102   unsigned long def_cache_ttl;     /* Default. */
103   unsigned long def_cache_ttl_ssh; /* for SSH. */
104   unsigned long max_cache_ttl;     /* Default. */
105   unsigned long max_cache_ttl_ssh; /* for SSH. */
106
107   /* Flag disallowing bypassing of the warning.  */
108   int enforce_passphrase_constraints;
109
110   /* The require minmum length of a passphrase. */
111   unsigned int min_passphrase_len;
112
113   /* The minimum number of non-alpha characters in a passphrase.  */
114   unsigned int min_passphrase_nonalpha;
115
116   /* File name with a patternfile or NULL if not enabled.  */
117   const char *check_passphrase_pattern;
118
119   /* If not 0 the user is asked to change his passphrase after these
120      number of days.  */
121   unsigned int max_passphrase_days;
122
123   /* If set, a passphrase history will be written and checked at each
124      passphrase change.  */
125   int enable_passphrase_history;
126
127   int running_detached; /* We are running detached from the tty. */
128
129   /* If this global option is true, the passphrase cache is ignored
130      for signing operations.  */
131   int ignore_cache_for_signing;
132
133   /* If this global option is true, the user is allowed to
134      interactively mark certificate in trustlist.txt as trusted. */
135   int allow_mark_trusted;
136
137   /* If this global option is true, the Assuan command
138      PRESET_PASSPHRASE is allowed.  */
139   int allow_preset_passphrase;
140
141   /* If this global option is true, the Assuan option
142      pinentry-mode=loopback is allowed.  */
143   int allow_loopback_pinentry;
144
145   /* Allow the use of an external password cache.  If this option is
146      enabled (which is the default) we send an option to Pinentry
147      to allow it to enable such a cache.  */
148   int allow_external_cache;
149
150   /* If this global option is true, the Assuan option of Pinentry
151      allow-emacs-prompt is allowed.  */
152   int allow_emacs_pinentry;
153
154   int keep_tty;      /* Don't switch the TTY (for pinentry) on request */
155   int keep_display;  /* Don't switch the DISPLAY (for pinentry) on request */
156
157   /* This global option indicates the use of an extra socket. Note
158      that we use a hack for cleanup handling in gpg-agent.c: If the
159      value is less than 2 the name has not yet been malloced. */
160   int extra_socket;
161
162   /* This global option indicates the use of an extra socket for web
163      browsers. Note that we use a hack for cleanup handling in
164      gpg-agent.c: If the value is less than 2 the name has not yet
165      been malloced. */
166   int browser_socket;
167 } opt;
168
169
170 /* Bit values for the --debug option.  */
171 #define DBG_COMMAND_VALUE 1     /* debug commands i/o */
172 #define DBG_MPI_VALUE     2     /* debug mpi details */
173 #define DBG_CRYPTO_VALUE  4     /* debug low level crypto */
174 #define DBG_MEMORY_VALUE  32    /* debug memory allocation stuff */
175 #define DBG_CACHE_VALUE   64    /* debug the caching */
176 #define DBG_MEMSTAT_VALUE 128   /* show memory statistics */
177 #define DBG_HASHING_VALUE 512   /* debug hashing operations */
178 #define DBG_IPC_VALUE     1024  /* Enable Assuan debugging.  */
179
180 /* Test macros for the debug option.  */
181 #define DBG_COMMAND (opt.debug & DBG_COMMAND_VALUE)
182 #define DBG_CRYPTO  (opt.debug & DBG_CRYPTO_VALUE)
183 #define DBG_MEMORY  (opt.debug & DBG_MEMORY_VALUE)
184 #define DBG_CACHE   (opt.debug & DBG_CACHE_VALUE)
185 #define DBG_HASHING (opt.debug & DBG_HASHING_VALUE)
186 #define DBG_IPC     (opt.debug & DBG_IPC_VALUE)
187
188 /* Forward reference for local definitions in command.c.  */
189 struct server_local_s;
190
191 /* Declaration of objects from command-ssh.c.  */
192 struct ssh_control_file_s;
193 typedef struct ssh_control_file_s *ssh_control_file_t;
194
195 /* Forward reference for local definitions in call-scd.c.  */
196 struct scd_local_s;
197
198 /* Collection of data per session (aka connection). */
199 struct server_control_s
200 {
201   /* Private data used to fire up the connection thread.  We use this
202      structure do avoid an extra allocation for only a few bytes while
203      spawning a new connection thread.  */
204   struct {
205     gnupg_fd_t fd;
206   } thread_startup;
207
208   /* Flag indicating the connection is run in restricted mode.
209      A value of 1 if used for --extra-socket,
210      a value of 2 is used for --browser-socket.  */
211   int restricted;
212
213   /* Private data of the server (command.c). */
214   struct server_local_s *server_local;
215
216   /* Private data of the SCdaemon (call-scd.c). */
217   struct scd_local_s *scd_local;
218
219   /* Environment settings for the connection.  */
220   session_env_t session_env;
221   char *lc_ctype;
222   char *lc_messages;
223
224   /* The current pinentry mode.  */
225   pinentry_mode_t pinentry_mode;
226
227   /* The TTL used for the --preset option of certain commands.  */
228   int cache_ttl_opt_preset;
229
230   /* Information on the currently used digest (for signing commands).  */
231   struct {
232     int algo;
233     unsigned char value[MAX_DIGEST_LEN];
234     int valuelen;
235     int raw_value: 1;
236   } digest;
237   unsigned char keygrip[20];
238   int have_keygrip;
239
240   /* A flag to enable a hack to send the PKAUTH command instead of the
241      PKSIGN command to the scdaemon.  */
242   int use_auth_call;
243
244   /* A flag to inhibit enforced passphrase change during an explicit
245      passwd command.  */
246   int in_passwd;
247
248   /* The current S2K which might be different from the calibrated
249      count. */
250   unsigned long s2k_count;
251 };
252
253
254 /* Information pertaining to pinentry requests.  */
255 struct pin_entry_info_s
256 {
257   int min_digits; /* min. number of digits required or 0 for freeform entry */
258   int max_digits; /* max. number of allowed digits allowed*/
259   int max_tries;  /* max. number of allowed tries.  */
260   int failed_tries; /* Number of tries so far failed.  */
261   int with_qualitybar; /* Set if the quality bar should be displayed.  */
262   int with_repeat;  /* Request repetition of the passphrase.  */
263   int repeat_okay;  /* Repetition worked. */
264   gpg_error_t (*check_cb)(struct pin_entry_info_s *); /* CB used to check
265                                                          the PIN */
266   void *check_cb_arg;  /* optional argument which might be of use in the CB */
267   const char *cb_errtext; /* used by the cb to display a specific error */
268   size_t max_length;   /* Allocated length of the buffer PIN. */
269   char pin[1];         /* The buffer to hold the PIN or passphrase.
270                           It's actual allocated length is given by
271                           MAX_LENGTH (above).  */
272 };
273
274
275 /* Types of the private keys.  */
276 enum
277   {
278     PRIVATE_KEY_UNKNOWN = 0,      /* Type of key is not known.  */
279     PRIVATE_KEY_CLEAR = 1,        /* The key is not protected.  */
280     PRIVATE_KEY_PROTECTED = 2,    /* The key is protected.  */
281     PRIVATE_KEY_SHADOWED = 3,     /* The key is a stub for a smartcard
282                                      based key.  */
283     PROTECTED_SHARED_SECRET = 4,  /* RFU.  */
284     PRIVATE_KEY_OPENPGP_NONE = 5  /* openpgp-native with protection "none". */
285   };
286
287
288 /* Values for the cache_mode arguments. */
289 typedef enum
290   {
291     CACHE_MODE_IGNORE = 0, /* Special mode to bypass the cache. */
292     CACHE_MODE_ANY,        /* Any mode except ignore matches. */
293     CACHE_MODE_NORMAL,     /* Normal cache (gpg-agent). */
294     CACHE_MODE_USER,       /* GET_PASSPHRASE related cache. */
295     CACHE_MODE_SSH,        /* SSH related cache. */
296     CACHE_MODE_NONCE       /* This is a non-predictable nonce.  */
297   }
298 cache_mode_t;
299
300 /* The TTL is seconds used for adding a new nonce mode cache item.  */
301 #define CACHE_TTL_NONCE 120
302
303 /* The TTL in seconds used by the --preset option of some commands.
304    This is the default value changeable by an OPTION command.  */
305 #define CACHE_TTL_OPT_PRESET 900
306
307
308 /* The type of a function to lookup a TTL by a keygrip.  */
309 typedef int (*lookup_ttl_t)(const char *hexgrip);
310
311
312 /* This is a special version of the usual _() gettext macro.  It
313    assumes a server connection control variable with the name "ctrl"
314    and uses that to translate a string according to the locale set for
315    the connection.  The macro LunderscoreIMPL is used by i18n to
316    actually define the inline function when needed.  */
317 #ifdef ENABLE_NLS
318 #define L_(a) agent_Lunderscore (ctrl, (a))
319 #define LunderscorePROTO                                            \
320   static inline const char *agent_Lunderscore (ctrl_t ctrl,         \
321                                                const char *string)  \
322     GNUPG_GCC_ATTR_FORMAT_ARG(2);
323 #define LunderscoreIMPL                                         \
324   static inline const char *                                    \
325   agent_Lunderscore (ctrl_t ctrl, const char *string)           \
326   {                                                             \
327     return ctrl? i18n_localegettext (ctrl->lc_messages, string) \
328       /*     */: gettext (string);                              \
329   }
330 #else
331 #define L_(a) (a)
332 #endif
333
334
335 /*-- gpg-agent.c --*/
336 void agent_exit (int rc)
337                 GPGRT_ATTR_NORETURN; /* Also implemented in other tools */
338 void agent_set_progress_cb (void (*cb)(ctrl_t ctrl, const char *what,
339                                        int printchar, int current, int total),
340                             ctrl_t ctrl);
341 gpg_error_t agent_copy_startup_env (ctrl_t ctrl);
342 const char *get_agent_socket_name (void);
343 const char *get_agent_ssh_socket_name (void);
344 int get_agent_active_connection_count (void);
345 #ifdef HAVE_W32_SYSTEM
346 void *get_agent_scd_notify_event (void);
347 #endif
348 void agent_sighup_action (void);
349 int map_pk_openpgp_to_gcry (int openpgp_algo);
350
351 /*-- command.c --*/
352 gpg_error_t agent_inq_pinentry_launched (ctrl_t ctrl, unsigned long pid,
353                                          const char *extra);
354 gpg_error_t agent_write_status (ctrl_t ctrl, const char *keyword, ...)
355      GPGRT_ATTR_SENTINEL(0);
356 gpg_error_t agent_print_status (ctrl_t ctrl, const char *keyword,
357                                 const char *format, ...)
358      GPGRT_ATTR_PRINTF(3,4);
359 void bump_key_eventcounter (void);
360 void bump_card_eventcounter (void);
361 void start_command_handler (ctrl_t, gnupg_fd_t, gnupg_fd_t);
362 gpg_error_t pinentry_loopback (ctrl_t, const char *keyword,
363                                unsigned char **buffer, size_t *size,
364                                size_t max_length);
365
366 #ifdef HAVE_W32_SYSTEM
367 int serve_mmapped_ssh_request (ctrl_t ctrl,
368                                unsigned char *request, size_t maxreqlen);
369 #endif /*HAVE_W32_SYSTEM*/
370
371 /*-- command-ssh.c --*/
372 ssh_control_file_t ssh_open_control_file (void);
373 void ssh_close_control_file (ssh_control_file_t cf);
374 gpg_error_t ssh_read_control_file (ssh_control_file_t cf,
375                                    char *r_hexgrip, int *r_disabled,
376                                    int *r_ttl, int *r_confirm);
377 gpg_error_t ssh_search_control_file (ssh_control_file_t cf,
378                                      const char *hexgrip,
379                                      int *r_disabled,
380                                      int *r_ttl, int *r_confirm);
381
382 void start_command_handler_ssh (ctrl_t, gnupg_fd_t);
383
384 /*-- findkey.c --*/
385 int agent_write_private_key (const unsigned char *grip,
386                              const void *buffer, size_t length, int force);
387 gpg_error_t agent_key_from_file (ctrl_t ctrl,
388                                  const char *cache_nonce,
389                                  const char *desc_text,
390                                  const unsigned char *grip,
391                                  unsigned char **shadow_info,
392                                  cache_mode_t cache_mode,
393                                  lookup_ttl_t lookup_ttl,
394                                  gcry_sexp_t *result,
395                                  char **r_passphrase);
396 gpg_error_t agent_raw_key_from_file (ctrl_t ctrl, const unsigned char *grip,
397                                      gcry_sexp_t *result);
398 gpg_error_t agent_public_key_from_file (ctrl_t ctrl,
399                                         const unsigned char *grip,
400                                         gcry_sexp_t *result);
401 int agent_is_dsa_key (gcry_sexp_t s_key);
402 int agent_is_eddsa_key (gcry_sexp_t s_key);
403 int agent_key_available (const unsigned char *grip);
404 gpg_error_t agent_key_info_from_file (ctrl_t ctrl, const unsigned char *grip,
405                                       int *r_keytype,
406                                       unsigned char **r_shadow_info);
407 gpg_error_t agent_delete_key (ctrl_t ctrl, const char *desc_text,
408                               const unsigned char *grip, int force);
409
410 /*-- call-pinentry.c --*/
411 void initialize_module_call_pinentry (void);
412 void agent_query_dump_state (void);
413 void agent_reset_query (ctrl_t ctrl);
414 int pinentry_active_p (ctrl_t ctrl, int waitseconds);
415 gpg_error_t agent_askpin (ctrl_t ctrl,
416                           const char *desc_text, const char *prompt_text,
417                           const char *inital_errtext,
418                           struct pin_entry_info_s *pininfo,
419                           const char *keyinfo, cache_mode_t cache_mode);
420 int agent_get_passphrase (ctrl_t ctrl, char **retpass,
421                           const char *desc, const char *prompt,
422                           const char *errtext, int with_qualitybar,
423                           const char *keyinfo, cache_mode_t cache_mode);
424 int agent_get_confirmation (ctrl_t ctrl, const char *desc, const char *ok,
425                             const char *notokay, int with_cancel);
426 int agent_show_message (ctrl_t ctrl, const char *desc, const char *ok_btn);
427 int agent_popup_message_start (ctrl_t ctrl,
428                                const char *desc, const char *ok_btn);
429 void agent_popup_message_stop (ctrl_t ctrl);
430 int agent_clear_passphrase (ctrl_t ctrl,
431                             const char *keyinfo, cache_mode_t cache_mode);
432
433 /*-- cache.c --*/
434 void initialize_module_cache (void);
435 void deinitialize_module_cache (void);
436 void agent_flush_cache (void);
437 int agent_put_cache (const char *key, cache_mode_t cache_mode,
438                      const char *data, int ttl);
439 char *agent_get_cache (const char *key, cache_mode_t cache_mode);
440 void agent_store_cache_hit (const char *key);
441
442
443 /*-- pksign.c --*/
444 int agent_pksign_do (ctrl_t ctrl, const char *cache_nonce,
445                      const char *desc_text,
446                      gcry_sexp_t *signature_sexp,
447                      cache_mode_t cache_mode, lookup_ttl_t lookup_ttl,
448                      const void *overridedata, size_t overridedatalen);
449 int agent_pksign (ctrl_t ctrl, const char *cache_nonce,
450                   const char *desc_text,
451                   membuf_t *outbuf, cache_mode_t cache_mode);
452
453 /*-- pkdecrypt.c --*/
454 int agent_pkdecrypt (ctrl_t ctrl, const char *desc_text,
455                      const unsigned char *ciphertext, size_t ciphertextlen,
456                      membuf_t *outbuf, int *r_padding);
457
458 /*-- genkey.c --*/
459 int check_passphrase_constraints (ctrl_t ctrl, const char *pw,
460                                   char **failed_constraint);
461 gpg_error_t agent_ask_new_passphrase (ctrl_t ctrl, const char *prompt,
462                                       char **r_passphrase);
463 int agent_genkey (ctrl_t ctrl, const char *cache_nonce,
464                   const char *keyparam, size_t keyparmlen,
465                   int no_protection, const char *override_passphrase,
466                   int preset, membuf_t *outbuf);
467 gpg_error_t agent_protect_and_store (ctrl_t ctrl, gcry_sexp_t s_skey,
468                                      char **passphrase_addr);
469
470 /*-- protect.c --*/
471 unsigned long get_standard_s2k_count (void);
472 unsigned char get_standard_s2k_count_rfc4880 (void);
473 int agent_protect (const unsigned char *plainkey, const char *passphrase,
474                    unsigned char **result, size_t *resultlen,
475                    unsigned long s2k_count, int use_ocb);
476 int agent_unprotect (ctrl_t ctrl,
477                      const unsigned char *protectedkey, const char *passphrase,
478                      gnupg_isotime_t protected_at,
479                      unsigned char **result, size_t *resultlen);
480 int agent_private_key_type (const unsigned char *privatekey);
481 unsigned char *make_shadow_info (const char *serialno, const char *idstring);
482 int agent_shadow_key (const unsigned char *pubkey,
483                       const unsigned char *shadow_info,
484                       unsigned char **result);
485 int agent_get_shadow_info (const unsigned char *shadowkey,
486                            unsigned char const **shadow_info);
487 gpg_error_t parse_shadow_info (const unsigned char *shadow_info,
488                                char **r_hexsn, char **r_idstr, int *r_pinlen);
489 gpg_error_t s2k_hash_passphrase (const char *passphrase, int hashalgo,
490                                  int s2kmode,
491                                  const unsigned char *s2ksalt,
492                                  unsigned int s2kcount,
493                                  unsigned char *key, size_t keylen);
494 gpg_error_t agent_write_shadow_key (const unsigned char *grip,
495                                     const char *serialno, const char *keyid,
496                                     const unsigned char *pkbuf, int force);
497
498
499 /*-- trustlist.c --*/
500 void initialize_module_trustlist (void);
501 gpg_error_t agent_istrusted (ctrl_t ctrl, const char *fpr, int *r_disabled);
502 gpg_error_t agent_listtrusted (void *assuan_context);
503 gpg_error_t agent_marktrusted (ctrl_t ctrl, const char *name,
504                                const char *fpr, int flag);
505 void agent_reload_trustlist (void);
506
507
508 /*-- divert-scd.c --*/
509 int divert_pksign (ctrl_t ctrl,
510                    const unsigned char *digest, size_t digestlen, int algo,
511                    const unsigned char *shadow_info, unsigned char **r_sig,
512                    size_t *r_siglen);
513 int divert_pkdecrypt (ctrl_t ctrl,
514                       const unsigned char *cipher,
515                       const unsigned char *shadow_info,
516                       char **r_buf, size_t *r_len, int *r_padding);
517 int divert_generic_cmd (ctrl_t ctrl,
518                         const char *cmdline, void *assuan_context);
519 int divert_writekey (ctrl_t ctrl, int force, const char *serialno,
520                      const char *id, const char *keydata, size_t keydatalen);
521
522
523 /*-- call-scd.c --*/
524 void initialize_module_call_scd (void);
525 void agent_scd_dump_state (void);
526 int agent_scd_check_running (void);
527 void agent_scd_check_aliveness (void);
528 int agent_reset_scd (ctrl_t ctrl);
529 int agent_card_learn (ctrl_t ctrl,
530                       void (*kpinfo_cb)(void*, const char *),
531                       void *kpinfo_cb_arg,
532                       void (*certinfo_cb)(void*, const char *),
533                       void *certinfo_cb_arg,
534                       void (*sinfo_cb)(void*, const char *,
535                                        size_t, const char *),
536                       void *sinfo_cb_arg);
537 int agent_card_serialno (ctrl_t ctrl, char **r_serialno);
538 int agent_card_pksign (ctrl_t ctrl,
539                        const char *keyid,
540                        int (*getpin_cb)(void *, const char *, char*, size_t),
541                        void *getpin_cb_arg,
542                        int mdalgo,
543                        const unsigned char *indata, size_t indatalen,
544                        unsigned char **r_buf, size_t *r_buflen);
545 int agent_card_pkdecrypt (ctrl_t ctrl,
546                           const char *keyid,
547                           int (*getpin_cb)(void *, const char *, char*,size_t),
548                           void *getpin_cb_arg,
549                           const unsigned char *indata, size_t indatalen,
550                           char **r_buf, size_t *r_buflen, int *r_padding);
551 int agent_card_readcert (ctrl_t ctrl,
552                          const char *id, char **r_buf, size_t *r_buflen);
553 int agent_card_readkey (ctrl_t ctrl, const char *id, unsigned char **r_buf);
554 int agent_card_writekey (ctrl_t ctrl, int force, const char *serialno,
555                          const char *id, const char *keydata,
556                          size_t keydatalen,
557                          int (*getpin_cb)(void *, const char *, char*, size_t),
558                          void *getpin_cb_arg);
559 gpg_error_t agent_card_getattr (ctrl_t ctrl, const char *name, char **result);
560 int agent_card_scd (ctrl_t ctrl, const char *cmdline,
561                     int (*getpin_cb)(void *, const char *, char*, size_t),
562                     void *getpin_cb_arg, void *assuan_context);
563
564
565 /*-- learncard.c --*/
566 int agent_handle_learn (ctrl_t ctrl, int send, void *assuan_context, int force);
567
568
569 /*-- cvt-openpgp.c --*/
570 gpg_error_t
571 extract_private_key (gcry_sexp_t s_key, int req_private_key_data,
572                      const char **r_algoname, int *r_npkey, int *r_nskey,
573                      const char **r_format,
574                      gcry_mpi_t *mpi_array, int arraysize,
575                      gcry_sexp_t *r_curve, gcry_sexp_t *r_flags);
576
577 #endif /*AGENT_H*/