gpg: Do not bail on an invalid packet in the local keyring.
[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 /* Flags used with app_change_pin.  */
29 #define APP_CHANGE_FLAG_RESET    1  /* PIN Reset mode.  */
30 #define APP_CHANGE_FLAG_NULLPIN  2  /* NULL PIN mode.  */
31 #define APP_CHANGE_FLAG_CLEAR    4  /* Clear the given PIN.  */
32
33 /* Flags used with app_genkey.  */
34 #define APP_GENKEY_FLAG_FORCE    1  /* Force overwriting existing key.  */
35
36 /* Flags used with app_writekey.  */
37 #define APP_WRITEKEY_FLAG_FORCE  1  /* Force overwriting existing key.  */
38
39 /* Flags used with app_readkey.  */
40 #define APP_READKEY_FLAG_INFO    1  /* Send also a KEYPAIRINFO line.  */
41
42 /* Bit flags set by the decipher function into R_INFO.  */
43 #define APP_DECIPHER_INFO_NOPAD  1  /* Padding has been removed.  */
44
45
46
47 struct app_local_s;  /* Defined by all app-*.c.  */
48
49 struct app_ctx_s {
50   struct app_ctx_s *next;
51
52   npth_mutex_t lock;
53
54   /* Number of connections currently using this application context.
55      If this is not 0 the application has been initialized and the
56      function pointers may be used.  Note that for unsupported
57      operations the particular function pointer is set to NULL */
58   unsigned int ref_count;
59
60   /* Used reader slot. */
61   int slot;
62
63   unsigned char *serialno; /* Serialnumber in raw form, allocated. */
64   size_t serialnolen;      /* Length in octets of serialnumber. */
65   const char *cardtype;    /* NULL or string with the token's type.  */
66   const char *apptype;
67   unsigned int cardversion;/* Firmware version of the token or 0.  */
68   unsigned int appversion; /* Version of the application or 0.     */
69   unsigned int card_status;
70   unsigned int reset_requested:1;
71   unsigned int periodical_check_needed:1;
72   unsigned int did_chv1:1;
73   unsigned int force_chv1:1;   /* True if the card does not cache CHV1. */
74   unsigned int did_chv2:1;
75   unsigned int did_chv3:1;
76   struct app_local_s *app_local;  /* Local to the application. */
77   struct {
78     void (*deinit) (app_t app);
79     gpg_error_t (*learn_status) (app_t app, ctrl_t ctrl, unsigned int flags);
80     gpg_error_t (*readcert) (app_t app, const char *certid,
81                      unsigned char **cert, size_t *certlen);
82     gpg_error_t (*readkey) (app_t app, ctrl_t ctrl,
83                             const char *certid, unsigned int flags,
84                             unsigned char **pk, size_t *pklen);
85     gpg_error_t (*getattr) (app_t app, ctrl_t ctrl, const char *name);
86     gpg_error_t (*setattr) (app_t app, const char *name,
87                     gpg_error_t (*pincb)(void*, const char *, char **),
88                     void *pincb_arg,
89                     const unsigned char *value, size_t valuelen);
90     gpg_error_t (*sign) (app_t app,
91                  const char *keyidstr, int hashalgo,
92                  gpg_error_t (*pincb)(void*, const char *, char **),
93                  void *pincb_arg,
94                  const void *indata, size_t indatalen,
95                  unsigned char **outdata, size_t *outdatalen );
96     gpg_error_t (*auth) (app_t app, const char *keyidstr,
97                  gpg_error_t (*pincb)(void*, const char *, char **),
98                  void *pincb_arg,
99                  const void *indata, size_t indatalen,
100                  unsigned char **outdata, size_t *outdatalen);
101     gpg_error_t (*decipher) (app_t app, const char *keyidstr,
102                              gpg_error_t (*pincb)(void*, const char *, char **),
103                              void *pincb_arg,
104                              const void *indata, size_t indatalen,
105                              unsigned char **outdata, size_t *outdatalen,
106                              unsigned int *r_info);
107     gpg_error_t (*writecert) (app_t app, ctrl_t ctrl,
108                               const char *certid,
109                               gpg_error_t (*pincb)(void*,const char *,char **),
110                               void *pincb_arg,
111                               const unsigned char *data, size_t datalen);
112     gpg_error_t (*writekey) (app_t app, ctrl_t ctrl,
113                              const char *keyid, unsigned int flags,
114                              gpg_error_t (*pincb)(void*,const char *,char **),
115                              void *pincb_arg,
116                              const unsigned char *pk, size_t pklen);
117     gpg_error_t (*genkey) (app_t app, ctrl_t ctrl,
118                            const char *keyref, const char *keytype,
119                            unsigned int flags, time_t createtime,
120                            gpg_error_t (*pincb)(void*, const char *, char **),
121                            void *pincb_arg);
122     gpg_error_t (*change_pin) (app_t app, ctrl_t ctrl,
123                        const char *chvnostr, unsigned int flags,
124                        gpg_error_t (*pincb)(void*, const char *, char **),
125                        void *pincb_arg);
126     gpg_error_t (*check_pin) (app_t app, const char *keyidstr,
127                       gpg_error_t (*pincb)(void*, const char *, char **),
128                       void *pincb_arg);
129     int (*with_keygrip) (app_t app, ctrl_t ctrl, int action,
130                          const char *keygrip_str);
131   } fnc;
132 };
133
134 enum
135  {
136   KEYGRIP_ACTION_SEND_DATA,
137   KEYGRIP_ACTION_WRITE_STATUS,
138   KEYGRIP_ACTION_LOOKUP
139  };
140
141 /*-- app-help.c --*/
142 unsigned int app_help_count_bits (const unsigned char *a, size_t len);
143 gpg_error_t app_help_get_keygrip_string_pk (const void *pk, size_t pklen,
144                                             char *hexkeygrip);
145 gpg_error_t app_help_get_keygrip_string (ksba_cert_t cert, char *hexkeygrip);
146 gpg_error_t app_help_pubkey_from_cert (const void *cert, size_t certlen,
147                                        unsigned char **r_pk, size_t *r_pklen);
148 size_t app_help_read_length_of_cert (int slot, int fid, size_t *r_certoff);
149
150
151 /*-- app.c --*/
152 void app_update_priority_list (const char *arg);
153 void app_send_card_list (ctrl_t ctrl);
154 char *app_get_serialno (app_t app);
155
156 void app_dump_state (void);
157 void application_notify_card_reset (int slot);
158 gpg_error_t check_application_conflict (const char *name, app_t app);
159 gpg_error_t app_reset (app_t app, ctrl_t ctrl, int send_reset);
160 gpg_error_t select_application (ctrl_t ctrl, const char *name, app_t *r_app,
161                                 int scan, const unsigned char *serialno_bin,
162                                 size_t serialno_bin_len);
163 char *get_supported_applications (void);
164 void release_application (app_t app, int locked_already);
165 gpg_error_t app_munge_serialno (app_t app);
166 gpg_error_t app_write_learn_status (app_t app, ctrl_t ctrl,
167                                     unsigned int flags);
168 gpg_error_t app_readcert (app_t app, ctrl_t ctrl, const char *certid,
169                   unsigned char **cert, size_t *certlen);
170 gpg_error_t app_readkey (app_t app, ctrl_t ctrl,
171                          const char *keyid, unsigned int flags,
172                          unsigned char **pk, size_t *pklen);
173 gpg_error_t app_getattr (app_t app, ctrl_t ctrl, const char *name);
174 gpg_error_t app_setattr (app_t app, ctrl_t ctrl, const char *name,
175                  gpg_error_t (*pincb)(void*, const char *, char **),
176                  void *pincb_arg,
177                  const unsigned char *value, size_t valuelen);
178 gpg_error_t app_sign (app_t app, ctrl_t ctrl, const char *keyidstr, int hashalgo,
179               gpg_error_t (*pincb)(void*, const char *, char **),
180               void *pincb_arg,
181               const void *indata, size_t indatalen,
182               unsigned char **outdata, size_t *outdatalen );
183 gpg_error_t app_auth (app_t app, ctrl_t ctrl, const char *keyidstr,
184                       gpg_error_t (*pincb)(void*, const char *, char **),
185                       void *pincb_arg,
186                       const void *indata, size_t indatalen,
187                       unsigned char **outdata, size_t *outdatalen);
188 gpg_error_t app_decipher (app_t app, ctrl_t ctrl, const char *keyidstr,
189                           gpg_error_t (*pincb)(void*, const char *, char **),
190                           void *pincb_arg,
191                           const void *indata, size_t indatalen,
192                           unsigned char **outdata, size_t *outdatalen,
193                           unsigned int *r_info);
194 gpg_error_t app_writecert (app_t app, ctrl_t ctrl,
195                            const char *certidstr,
196                            gpg_error_t (*pincb)(void*, const char *, char **),
197                            void *pincb_arg,
198                            const unsigned char *keydata, size_t keydatalen);
199 gpg_error_t app_writekey (app_t app, ctrl_t ctrl,
200                           const char *keyidstr, unsigned int flags,
201                           gpg_error_t (*pincb)(void*, const char *, char **),
202                           void *pincb_arg,
203                           const unsigned char *keydata, size_t keydatalen);
204 gpg_error_t app_genkey (app_t app, ctrl_t ctrl,
205                         const char *keynostr, const char *keytype,
206                         unsigned int flags, time_t createtime,
207                         gpg_error_t (*pincb)(void*, const char *, char **),
208                         void *pincb_arg);
209 gpg_error_t app_get_challenge (app_t app, ctrl_t ctrl, size_t nbytes,
210                                unsigned char *buffer);
211 gpg_error_t app_change_pin (app_t app, ctrl_t ctrl,
212                             const char *chvnostr, unsigned int flags,
213                             gpg_error_t (*pincb)(void*, const char *, char **),
214                             void *pincb_arg);
215 gpg_error_t app_check_pin (app_t app, ctrl_t ctrl, const char *keyidstr,
216                    gpg_error_t (*pincb)(void*, const char *, char **),
217                    void *pincb_arg);
218 app_t app_do_with_keygrip (ctrl_t ctrl, int action, const char *keygrip_str);
219
220
221 /*-- app-openpgp.c --*/
222 gpg_error_t app_select_openpgp (app_t app);
223
224 /*-- app-nks.c --*/
225 gpg_error_t app_select_nks (app_t app);
226
227 /*-- app-dinsig.c --*/
228 gpg_error_t app_select_dinsig (app_t app);
229
230 /*-- app-p15.c --*/
231 gpg_error_t app_select_p15 (app_t app);
232
233 /*-- app-geldkarte.c --*/
234 gpg_error_t app_select_geldkarte (app_t app);
235
236 /*-- app-sc-hsm.c --*/
237 gpg_error_t app_select_sc_hsm (app_t app);
238
239 /*-- app-piv.c --*/
240 gpg_error_t app_select_piv (app_t app);
241
242
243 #endif /*GNUPG_SCD_APP_COMMON_H*/