scd: Improve internal CCID driver.
[gnupg.git] / scd / app-common.h
1 /* app-common.h - Common declarations for all card applications
2  * Copyright (C) 2003, 2005, 2008 Free Software Foundation, Inc.
3  *
4  * This file is part of GnuPG.
5  *
6  * GnuPG is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * GnuPG is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, see <https://www.gnu.org/licenses/>.
18  *
19  * $Id$
20  */
21
22 #ifndef GNUPG_SCD_APP_COMMON_H
23 #define GNUPG_SCD_APP_COMMON_H
24
25 #include <npth.h>
26 #include <ksba.h>
27
28
29 #define APP_CHANGE_FLAG_RESET    1
30 #define APP_CHANGE_FLAG_NULLPIN  2
31
32 /* Bit flags set by the decipher function into R_INFO.  */
33 #define APP_DECIPHER_INFO_NOPAD  1  /* Padding has been removed.  */
34
35
36 struct app_local_s;  /* Defined by all app-*.c.  */
37
38 struct app_ctx_s {
39   struct app_ctx_s *next;
40
41   npth_mutex_t lock;
42
43   /* Number of connections currently using this application context.
44      If this is not 0 the application has been initialized and the
45      function pointers may be used.  Note that for unsupported
46      operations the particular function pointer is set to NULL */
47   unsigned int ref_count;
48
49   /* Used reader slot. */
50   int slot;
51
52   unsigned char *serialno; /* Serialnumber in raw form, allocated. */
53   size_t serialnolen;      /* Length in octets of serialnumber. */
54   const char *apptype;
55   unsigned int card_version;
56   unsigned int card_status;
57   unsigned int require_get_status:1;
58   unsigned int did_chv1:1;
59   unsigned int force_chv1:1;   /* True if the card does not cache CHV1. */
60   unsigned int did_chv2:1;
61   unsigned int did_chv3:1;
62   struct app_local_s *app_local;  /* Local to the application. */
63   struct {
64     void (*deinit) (app_t app);
65     gpg_error_t (*learn_status) (app_t app, ctrl_t ctrl, unsigned int flags);
66     gpg_error_t (*readcert) (app_t app, const char *certid,
67                      unsigned char **cert, size_t *certlen);
68     gpg_error_t (*readkey) (app_t app, int advanced, const char *certid,
69                     unsigned char **pk, size_t *pklen);
70     gpg_error_t (*getattr) (app_t app, ctrl_t ctrl, const char *name);
71     gpg_error_t (*setattr) (app_t app, const char *name,
72                     gpg_error_t (*pincb)(void*, const char *, char **),
73                     void *pincb_arg,
74                     const unsigned char *value, size_t valuelen);
75     gpg_error_t (*sign) (app_t app,
76                  const char *keyidstr, int hashalgo,
77                  gpg_error_t (*pincb)(void*, const char *, char **),
78                  void *pincb_arg,
79                  const void *indata, size_t indatalen,
80                  unsigned char **outdata, size_t *outdatalen );
81     gpg_error_t (*auth) (app_t app, const char *keyidstr,
82                  gpg_error_t (*pincb)(void*, const char *, char **),
83                  void *pincb_arg,
84                  const void *indata, size_t indatalen,
85                  unsigned char **outdata, size_t *outdatalen);
86     gpg_error_t (*decipher) (app_t app, const char *keyidstr,
87                              gpg_error_t (*pincb)(void*, const char *, char **),
88                              void *pincb_arg,
89                              const void *indata, size_t indatalen,
90                              unsigned char **outdata, size_t *outdatalen,
91                              unsigned int *r_info);
92     gpg_error_t (*writecert) (app_t app, ctrl_t ctrl,
93                               const char *certid,
94                               gpg_error_t (*pincb)(void*,const char *,char **),
95                               void *pincb_arg,
96                               const unsigned char *data, size_t datalen);
97     gpg_error_t (*writekey) (app_t app, ctrl_t ctrl,
98                              const char *keyid, unsigned int flags,
99                              gpg_error_t (*pincb)(void*,const char *,char **),
100                              void *pincb_arg,
101                              const unsigned char *pk, size_t pklen);
102     gpg_error_t (*genkey) (app_t app, ctrl_t ctrl,
103                            const char *keynostr, unsigned int flags,
104                            time_t createtime,
105                            gpg_error_t (*pincb)(void*, const char *, char **),
106                            void *pincb_arg);
107     gpg_error_t (*change_pin) (app_t app, ctrl_t ctrl,
108                        const char *chvnostr, unsigned int flags,
109                        gpg_error_t (*pincb)(void*, const char *, char **),
110                        void *pincb_arg);
111     gpg_error_t (*check_pin) (app_t app, const char *keyidstr,
112                       gpg_error_t (*pincb)(void*, const char *, char **),
113                       void *pincb_arg);
114   } fnc;
115 };
116
117 /*-- app-help.c --*/
118 unsigned int app_help_count_bits (const unsigned char *a, size_t len);
119 gpg_error_t app_help_get_keygrip_string (ksba_cert_t cert, char *hexkeygrip);
120 size_t app_help_read_length_of_cert (int slot, int fid, size_t *r_certoff);
121
122
123 /*-- app.c --*/
124 void app_dump_state (void);
125 void application_notify_card_reset (int slot);
126 gpg_error_t check_application_conflict (const char *name, app_t app);
127 gpg_error_t app_reset (app_t app, ctrl_t ctrl, int send_reset);
128 gpg_error_t select_application (ctrl_t ctrl, const char *name, app_t *r_app,
129                                 int scan);
130 char *get_supported_applications (void);
131 void release_application (app_t app);
132 gpg_error_t app_munge_serialno (app_t app);
133 gpg_error_t app_get_serial_and_stamp (app_t app, char **serial, time_t *stamp);
134 gpg_error_t app_write_learn_status (app_t app, ctrl_t ctrl,
135                                     unsigned int flags);
136 gpg_error_t app_readcert (app_t app, ctrl_t ctrl, const char *certid,
137                   unsigned char **cert, size_t *certlen);
138 gpg_error_t app_readkey (app_t app, ctrl_t ctrl, int advanced,
139                  const char *keyid, unsigned char **pk, size_t *pklen);
140 gpg_error_t app_getattr (app_t app, ctrl_t ctrl, const char *name);
141 gpg_error_t app_setattr (app_t app, ctrl_t ctrl, const char *name,
142                  gpg_error_t (*pincb)(void*, const char *, char **),
143                  void *pincb_arg,
144                  const unsigned char *value, size_t valuelen);
145 gpg_error_t app_sign (app_t app, ctrl_t ctrl, const char *keyidstr, int hashalgo,
146               gpg_error_t (*pincb)(void*, const char *, char **),
147               void *pincb_arg,
148               const void *indata, size_t indatalen,
149               unsigned char **outdata, size_t *outdatalen );
150 gpg_error_t app_auth (app_t app, ctrl_t ctrl, const char *keyidstr,
151                       gpg_error_t (*pincb)(void*, const char *, char **),
152                       void *pincb_arg,
153                       const void *indata, size_t indatalen,
154                       unsigned char **outdata, size_t *outdatalen);
155 gpg_error_t app_decipher (app_t app, ctrl_t ctrl, const char *keyidstr,
156                           gpg_error_t (*pincb)(void*, const char *, char **),
157                           void *pincb_arg,
158                           const void *indata, size_t indatalen,
159                           unsigned char **outdata, size_t *outdatalen,
160                           unsigned int *r_info);
161 gpg_error_t app_writecert (app_t app, ctrl_t ctrl,
162                            const char *certidstr,
163                            gpg_error_t (*pincb)(void*, const char *, char **),
164                            void *pincb_arg,
165                            const unsigned char *keydata, size_t keydatalen);
166 gpg_error_t app_writekey (app_t app, ctrl_t ctrl,
167                           const char *keyidstr, unsigned int flags,
168                           gpg_error_t (*pincb)(void*, const char *, char **),
169                           void *pincb_arg,
170                           const unsigned char *keydata, size_t keydatalen);
171 gpg_error_t app_genkey (app_t app, ctrl_t ctrl,
172                         const char *keynostr, unsigned int flags,
173                         time_t createtime,
174                         gpg_error_t (*pincb)(void*, const char *, char **),
175                         void *pincb_arg);
176 gpg_error_t app_get_challenge (app_t app, ctrl_t ctrl, size_t nbytes,
177                                unsigned char *buffer);
178 gpg_error_t app_change_pin (app_t app, ctrl_t ctrl,
179                     const char *chvnostr, int reset_mode,
180                     gpg_error_t (*pincb)(void*, const char *, char **),
181                     void *pincb_arg);
182 gpg_error_t app_check_pin (app_t app, ctrl_t ctrl, const char *keyidstr,
183                    gpg_error_t (*pincb)(void*, const char *, char **),
184                    void *pincb_arg);
185
186
187 /*-- app-openpgp.c --*/
188 gpg_error_t app_select_openpgp (app_t app);
189
190 /*-- app-nks.c --*/
191 gpg_error_t app_select_nks (app_t app);
192
193 /*-- app-dinsig.c --*/
194 gpg_error_t app_select_dinsig (app_t app);
195
196 /*-- app-p15.c --*/
197 gpg_error_t app_select_p15 (app_t app);
198
199 /*-- app-geldkarte.c --*/
200 gpg_error_t app_select_geldkarte (app_t app);
201
202 /*-- app-sc-hsm.c --*/
203 gpg_error_t app_select_sc_hsm (app_t app);
204
205
206 #endif /*GNUPG_SCD_APP_COMMON_H*/