card: Support factory reset for Yubikey PIV application.
[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
54 /* Enumeration of the known card application types. */
55 typedef enum
56   {
57    APP_TYPE_NONE,        /* Not yet known or for direct APDU sending.  */
58    APP_TYPE_OPENPGP,
59    APP_TYPE_NKS,
60    APP_TYPE_DINSIG,
61    APP_TYPE_P15,
62    APP_TYPE_GELDKARTE,
63    APP_TYPE_SC_HSM,
64    APP_TYPE_PIV,
65    APP_TYPE_UNKNOWN      /* Unknown by this tool.  */
66   } app_type_t;
67
68
69 /* OpenPGP card key attributes.  */
70 struct key_attr
71 {
72   int algo;              /* Algorithm identifier.  */
73   union {
74     unsigned int nbits;  /* Supported keysize.  */
75     const char *curve;   /* Name of curve.  */
76   };
77 };
78
79 /* An object to store information pertaining to a key pair.  This is
80  * commonly used as a linked list with all keys known for the current
81  * card.  */
82 struct key_info_s
83 {
84   struct key_info_s *next;
85
86   unsigned char grip[20];/* The keygrip.  */
87
88   unsigned char xflag;   /* Temporary flag to help processing a list. */
89
90   /* The three next items are mostly useful for OpenPGP cards.  */
91   unsigned char fprlen;  /* Use length of the next item.  */
92   unsigned char fpr[32]; /* The binary fingerprint of length FPRLEN.  */
93   u32 created;           /* The time the key was created.  */
94
95   char keyref[1];        /* String with the keyref (e.g. OPENPGP.1).  */
96 };
97 typedef struct key_info_s *key_info_t;
98
99
100 /*
101  * The object used to store information about a card.
102  */
103 struct card_info_s
104 {
105   int error;         /* private. */
106   char *reader;      /* Reader information.  */
107   char *cardtype;    /* NULL or type of the card.  */
108   char *apptypestr;  /* Malloced application type string.  */
109   app_type_t apptype;/* Translated from APPTYPESTR.  */
110   char *serialno;    /* malloced hex string. */
111   char *dispserialno;/* malloced string. */
112   char *disp_name;   /* malloced. */
113   char *disp_lang;   /* malloced. */
114   int  disp_sex;     /* 0 = unspecified, 1 = male, 2 = female */
115   char *pubkey_url;  /* malloced. */
116   char *login_data;  /* malloced. */
117   char *private_do[4]; /* malloced. */
118   char cafpr1len;     /* Length of the CA-fingerprint or 0 if invalid.  */
119   char cafpr2len;
120   char cafpr3len;
121   char cafpr1[20];
122   char cafpr2[20];
123   char cafpr3[20];
124   key_info_t kinfo;  /* Linked list with all keypair related data.  */
125   unsigned long sig_counter;
126   int chv1_cached;   /* For openpgp this is true if a PIN is not
127                         required for each signing.  Note that the
128                         gpg-agent might cache it anyway. */
129   int is_v2;         /* True if this is a v2 openpgp card.  */
130   int chvmaxlen[3];  /* Maximum allowed length of a CHV. */
131   int chvinfo[3];    /* Allowed retries for the CHV; 0 = blocked. */
132   unsigned char chvusage[2]; /* Data object 5F2F */
133   struct key_attr key_attr[3]; /* OpenPGP card key attributes.  */
134   struct {
135     unsigned int ki:1;     /* Key import available.  */
136     unsigned int aac:1;    /* Algorithm attributes are changeable.  */
137     unsigned int kdf:1;    /* KDF object to support PIN hashing available.  */
138     unsigned int bt:1;     /* Button for confirmation available.  */
139   } extcap;
140   unsigned int status_indicator;
141   int kdf_do_enabled;      /* True if card has a KDF object.  */
142   int uif[3];              /* True if User Interaction Flag is on.  */
143 };
144 typedef struct card_info_s *card_info_t;
145
146
147 /*-- card-tool-misc.c --*/
148 key_info_t find_kinfo (card_info_t info, const char *keyref);
149
150
151 /*-- card-call-scd.c --*/
152 void release_card_info (card_info_t info);
153 const char *app_type_string (app_type_t app_type);
154
155 gpg_error_t scd_apdu (const char *hexapdu, unsigned int *r_sw);
156 gpg_error_t scd_learn (card_info_t info);
157 gpg_error_t scd_getattr (const char *name, struct card_info_s *info);
158 gpg_error_t scd_setattr (const char *name,
159                          const unsigned char *value, size_t valuelen);
160 gpg_error_t scd_writecert (const char *certidstr,
161                            const unsigned char *certdata, size_t certdatalen);
162 gpg_error_t scd_writekey (int keyno,
163                           const unsigned char *keydata, size_t keydatalen);
164 gpg_error_t scd_genkey (int keyno, int force, u32 *createtime);
165 gpg_error_t scd_serialno (char **r_serialno, const char *demand);
166 gpg_error_t scd_readcert (const char *certidstr,
167                           void **r_buf, size_t *r_buflen);
168 gpg_error_t scd_cardlist (strlist_t *result);
169 gpg_error_t scd_change_pin (int chvno);
170 gpg_error_t scd_checkpin (const char *serialno);
171
172 unsigned long agent_get_s2k_count (void);
173
174
175
176 #endif /*GNUPG_CARD_TOOL_H*/