bea618a8c258904d56e1f7f69703d3922aac318f
[gnupg.git] / tools / card-tool.h
1 /* card-tool.h - Common definitions for the gpg-card-tool
2  * Copyright (C) 2019 g10 Code GmbH
3  *
4  * This file is part of GnuPG.
5  *
6  * This file 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  * This file 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 Lesser 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://gnu.org/licenses/>.
18  * SPDX-License-Identifier: GPL-3.0-or-later
19  */
20
21 #ifndef GNUPG_CARD_TOOL_H
22 #define GNUPG_CARD_TOOL_H
23
24 #include "../common/session-env.h"
25
26
27 /* We keep all global options in the structure OPT.  */
28 struct
29 {
30   int verbose;
31   unsigned int debug;
32   int quiet;
33   int with_colons;
34   const char *gpg_program;
35   const char *gpgsm_program;
36   const char *agent_program;
37   int autostart;
38
39   /* Options passed to the gpg-agent: */
40   session_env_t session_env;
41   char *lc_ctype;
42   char *lc_messages;
43
44 } opt;
45
46 /* Debug values and macros.  */
47 #define DBG_IPC_VALUE      1024 /* Debug assuan communication.  */
48 #define DBG_EXTPROG_VALUE 16384 /* Debug external program calls */
49
50 #define DBG_IPC       (opt.debug & DBG_IPC_VALUE)
51 #define DBG_EXTPROG   (opt.debug & DBG_EXTPROG_VALUE)
52
53 /* The maximum length of a binary fingerprint.  */
54 #define MAX_FINGERPRINT_LEN  32
55
56
57 /*
58  * Data structures to store keyblocks (aka certificates).
59  */
60 struct pubkey_s
61 {
62   struct pubkey_s *next;   /* The next key.  */
63   unsigned char grip[KEYGRIP_LEN];
64   unsigned char fpr[MAX_FINGERPRINT_LEN];
65   unsigned char fprlen;     /* The used length of a FPR.  */
66   unsigned int grip_valid:1;/* The grip is valid.  */
67   unsigned int requested: 1;/* This is the requested grip.  */
68 };
69 typedef struct pubkey_s *pubkey_t;
70
71 struct userid_s
72 {
73   struct userid_s *next;
74   char *value;   /* Malloced.  */
75 };
76 typedef struct userid_s *userid_t;
77
78 struct keyblock_s
79 {
80   struct keyblock_s *next;  /* Allow to link several keyblocks.  */
81   int protocol;      /* GPGME_PROTOCOL_OPENPGP or _CMS. */
82   pubkey_t keys;     /* The key.  For OpenPGP primary + list of subkeys.  */
83   userid_t uids;     /* The list of user ids.  */
84 };
85 typedef struct keyblock_s *keyblock_t;
86
87
88
89 /* Enumeration of the known card application types. */
90 typedef enum
91   {
92    APP_TYPE_NONE,        /* Not yet known or for direct APDU sending.  */
93    APP_TYPE_OPENPGP,
94    APP_TYPE_NKS,
95    APP_TYPE_DINSIG,
96    APP_TYPE_P15,
97    APP_TYPE_GELDKARTE,
98    APP_TYPE_SC_HSM,
99    APP_TYPE_PIV,
100    APP_TYPE_UNKNOWN      /* Unknown by this tool.  */
101   } app_type_t;
102
103
104 /* OpenPGP card key attributes.  */
105 struct key_attr
106 {
107   int algo;              /* Algorithm identifier.  */
108   union {
109     unsigned int nbits;  /* Supported keysize.  */
110     const char *curve;   /* Name of curve.  */
111   };
112 };
113
114 /* An object to store information pertaining to a key pair as stored
115  * on a card.  This is commonly used as a linked list with all keys
116  * known for the current card.  */
117 struct key_info_s
118 {
119   struct key_info_s *next;
120
121   unsigned char grip[20];/* The keygrip.  */
122
123   unsigned char xflag;   /* Temporary flag to help processing a list. */
124
125   /* The three next items are mostly useful for OpenPGP cards.  */
126   unsigned char fprlen;  /* Use length of the next item.  */
127   unsigned char fpr[32]; /* The binary fingerprint of length FPRLEN.  */
128   u32 created;           /* The time the key was created.  */
129
130   char keyref[1];        /* String with the keyref (e.g. OPENPGP.1).  */
131 };
132 typedef struct key_info_s *key_info_t;
133
134
135 /*
136  * The object used to store information about a card.
137  */
138 struct card_info_s
139 {
140   int error;         /* private. */
141   char *reader;      /* Reader information.  */
142   char *cardtype;    /* NULL or type of the card.  */
143   char *apptypestr;  /* Malloced application type string.  */
144   app_type_t apptype;/* Translated from APPTYPESTR.  */
145   char *serialno;    /* malloced hex string. */
146   char *dispserialno;/* malloced string. */
147   char *disp_name;   /* malloced. */
148   char *disp_lang;   /* malloced. */
149   int  disp_sex;     /* 0 = unspecified, 1 = male, 2 = female */
150   char *pubkey_url;  /* malloced. */
151   char *login_data;  /* malloced. */
152   char *private_do[4]; /* malloced. */
153   char cafpr1len;     /* Length of the CA-fingerprint or 0 if invalid.  */
154   char cafpr2len;
155   char cafpr3len;
156   char cafpr1[20];
157   char cafpr2[20];
158   char cafpr3[20];
159   key_info_t kinfo;  /* Linked list with all keypair related data.  */
160   unsigned long sig_counter;
161   int chv1_cached;   /* For openpgp this is true if a PIN is not
162                         required for each signing.  Note that the
163                         gpg-agent might cache it anyway. */
164   int is_v2;         /* True if this is a v2 openpgp card.  */
165   int chvmaxlen[3];  /* Maximum allowed length of a CHV. */
166   int chvinfo[3];    /* Allowed retries for the CHV; 0 = blocked. */
167   unsigned char chvusage[2]; /* Data object 5F2F */
168   struct key_attr key_attr[3]; /* OpenPGP card key attributes.  */
169   struct {
170     unsigned int ki:1;     /* Key import available.  */
171     unsigned int aac:1;    /* Algorithm attributes are changeable.  */
172     unsigned int kdf:1;    /* KDF object to support PIN hashing available.  */
173     unsigned int bt:1;     /* Button for confirmation available.  */
174   } extcap;
175   unsigned int status_indicator;
176   int kdf_do_enabled;      /* True if card has a KDF object.  */
177   int uif[3];              /* True if User Interaction Flag is on.  */
178 };
179 typedef struct card_info_s *card_info_t;
180
181
182 /*-- card-tool-keys.c --*/
183 void release_keyblock (keyblock_t keyblock);
184 void flush_keyblock_cache (void);
185 gpg_error_t get_matching_keys (const unsigned char *keygrip, int protocol,
186                                keyblock_t *r_keyblock);
187 gpg_error_t test_get_matching_keys (const char *hexgrip);
188
189
190 /*-- card-tool-misc.c --*/
191 key_info_t find_kinfo (card_info_t info, const char *keyref);
192 void *hex_to_buffer (const char *string, size_t *r_length);
193
194
195 /*-- card-call-scd.c --*/
196 void release_card_info (card_info_t info);
197 const char *app_type_string (app_type_t app_type);
198
199 gpg_error_t scd_apdu (const char *hexapdu, unsigned int *r_sw);
200 gpg_error_t scd_learn (card_info_t info);
201 gpg_error_t scd_getattr (const char *name, struct card_info_s *info);
202 gpg_error_t scd_setattr (const char *name,
203                          const unsigned char *value, size_t valuelen);
204 gpg_error_t scd_writecert (const char *certidstr,
205                            const unsigned char *certdata, size_t certdatalen);
206 gpg_error_t scd_writekey (int keyno,
207                           const unsigned char *keydata, size_t keydatalen);
208 gpg_error_t scd_genkey (int keyno, int force, u32 *createtime);
209 gpg_error_t scd_serialno (char **r_serialno, const char *demand);
210 gpg_error_t scd_readcert (const char *certidstr,
211                           void **r_buf, size_t *r_buflen);
212 gpg_error_t scd_cardlist (strlist_t *result);
213 gpg_error_t scd_change_pin (int chvno);
214 gpg_error_t scd_checkpin (const char *serialno);
215
216 unsigned long agent_get_s2k_count (void);
217
218
219
220 #endif /*GNUPG_CARD_TOOL_H*/