bcc257ce211088d98bbcc55e8d9832b2a50a2fc6
[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 *apptypestr;  /* Malloced application type string.  */
108   app_type_t apptype;/* Translated from APPTYPESTR.  */
109   char *serialno;    /* malloced hex string. */
110   char *dispserialno;/* malloced string. */
111   char *disp_name;   /* malloced. */
112   char *disp_lang;   /* malloced. */
113   int  disp_sex;     /* 0 = unspecified, 1 = male, 2 = female */
114   char *pubkey_url;  /* malloced. */
115   char *login_data;  /* malloced. */
116   char *private_do[4]; /* malloced. */
117   char cafpr1len;     /* Length of the CA-fingerprint or 0 if invalid.  */
118   char cafpr2len;
119   char cafpr3len;
120   char cafpr1[20];
121   char cafpr2[20];
122   char cafpr3[20];
123   key_info_t kinfo;  /* Linked list with all keypair related data.  */
124   unsigned long sig_counter;
125   int chv1_cached;   /* For openpgp this is true if a PIN is not
126                         required for each signing.  Note that the
127                         gpg-agent might cache it anyway. */
128   int is_v2;         /* True if this is a v2 openpgp card.  */
129   int chvmaxlen[3];  /* Maximum allowed length of a CHV. */
130   int chvinfo[3];    /* Allowed retries for the CHV; 0 = blocked. */
131   struct key_attr key_attr[3]; /* OpenPGP card key attributes.  */
132   struct {
133     unsigned int ki:1;     /* Key import available.  */
134     unsigned int aac:1;    /* Algorithm attributes are changeable.  */
135     unsigned int kdf:1;    /* KDF object to support PIN hashing available.  */
136     unsigned int bt:1;     /* Button for confirmation available.  */
137   } extcap;
138   unsigned int status_indicator;
139   int kdf_do_enabled;      /* True if card has a KDF object.  */
140   int uif[3];              /* True if User Interaction Flag is on.  */
141 };
142 typedef struct card_info_s *card_info_t;
143
144
145 /*-- card-tool-misc.c --*/
146 key_info_t find_kinfo (card_info_t info, const char *keyref);
147
148
149 /*-- card-call-scd.c --*/
150 void release_card_info (card_info_t info);
151 const char *app_type_string (app_type_t app_type);
152
153 gpg_error_t scd_apdu (const char *hexapdu, unsigned int *r_sw);
154 gpg_error_t scd_learn (card_info_t info);
155 gpg_error_t scd_getattr (const char *name, struct card_info_s *info);
156 gpg_error_t scd_setattr (const char *name,
157                          const unsigned char *value, size_t valuelen);
158 gpg_error_t scd_writecert (const char *certidstr,
159                            const unsigned char *certdata, size_t certdatalen);
160 gpg_error_t scd_writekey (int keyno,
161                           const unsigned char *keydata, size_t keydatalen);
162 gpg_error_t scd_genkey (int keyno, int force, u32 *createtime);
163 gpg_error_t scd_serialno (char **r_serialno, const char *demand);
164 gpg_error_t scd_readcert (const char *certidstr,
165                           void **r_buf, size_t *r_buflen);
166 gpg_error_t scd_cardlist (strlist_t *result);
167 gpg_error_t scd_change_pin (int chvno);
168 gpg_error_t scd_checkpin (const char *serialno);
169
170 unsigned long agent_get_s2k_count (void);
171
172
173
174 #endif /*GNUPG_CARD_TOOL_H*/