card: Implement the bulk of OpenPGP stuff into gpg-card-tool.
[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
80 /*
81  * The object used to store information about a card.
82  */
83 struct card_info_s
84 {
85   int error;         /* private. */
86   char *reader;      /* Reader information.  */
87   char *apptypestr;  /* Malloced application type string.  */
88   app_type_t apptype;/* Translated from APPTYPESTR.  */
89   char *serialno;    /* malloced hex string. */
90   char *dispserialno;/* malloced string. */
91   char *disp_name;   /* malloced. */
92   char *disp_lang;   /* malloced. */
93   int  disp_sex;     /* 0 = unspecified, 1 = male, 2 = female */
94   char *pubkey_url;  /* malloced. */
95   char *login_data;  /* malloced. */
96   char *private_do[4]; /* malloced. */
97   char cafpr1len;     /* Length of the CA-fingerprint or 0 if invalid.  */
98   char cafpr2len;
99   char cafpr3len;
100   char cafpr1[20];
101   char cafpr2[20];
102   char cafpr3[20];
103   unsigned char fpr1len; /* Length of the fingerprint or 0 if invalid.  */
104   unsigned char fpr2len;
105   unsigned char fpr3len;
106   char fpr1[20];
107   char fpr2[20];
108   char fpr3[20];
109   u32  fpr1time;
110   u32  fpr2time;
111   u32  fpr3time;
112   char grp1[20];     /* The keygrip for OPENPGP.1 */
113   char grp2[20];     /* The keygrip for OPENPGP.2 */
114   char grp3[20];     /* The keygrip for OPENPGP.3 */
115   unsigned long sig_counter;
116   int chv1_cached;   /* True if a PIN is not required for each
117                         signing.  Note that the gpg-agent might cache
118                         it anyway. */
119   int is_v2;         /* True if this is a v2 card.  */
120   int chvmaxlen[3];  /* Maximum allowed length of a CHV. */
121   int chvretry[3];   /* Allowed retries for the CHV; 0 = blocked. */
122   struct key_attr key_attr[3]; /* OpenPGP card key attributes.  */
123   struct {
124     unsigned int ki:1;     /* Key import available.  */
125     unsigned int aac:1;    /* Algorithm attributes are changeable.  */
126     unsigned int kdf:1;    /* KDF object to support PIN hashing available.  */
127     unsigned int bt:1;     /* Button for confirmation available.  */
128   } extcap;
129   unsigned int status_indicator;
130   int kdf_do_enabled;      /* True if card has a KDF object.  */
131   int uif[3];              /* True if User Interaction Flag is on.  */
132 };
133 typedef struct card_info_s *card_info_t;
134
135
136 /*-- card-call-scd.c --*/
137 void release_card_info (card_info_t info);
138 const char *app_type_string (app_type_t app_type);
139
140 gpg_error_t scd_apdu (const char *hexapdu, unsigned int *r_sw);
141 gpg_error_t scd_learn (card_info_t info);
142 gpg_error_t scd_getattr (const char *name, struct card_info_s *info);
143 gpg_error_t scd_setattr (const char *name,
144                          const unsigned char *value, size_t valuelen);
145 gpg_error_t scd_writecert (const char *certidstr,
146                            const unsigned char *certdata, size_t certdatalen);
147 gpg_error_t scd_writekey (int keyno,
148                           const unsigned char *keydata, size_t keydatalen);
149 gpg_error_t scd_genkey (int keyno, int force, u32 *createtime);
150 gpg_error_t scd_serialno (char **r_serialno, const char *demand);
151 gpg_error_t scd_readcert (const char *certidstr,
152                           void **r_buf, size_t *r_buflen);
153 gpg_error_t scd_cardlist (strlist_t *result);
154 gpg_error_t scd_change_pin (int chvno);
155 gpg_error_t scd_checkpin (const char *serialno);
156
157 unsigned long agent_get_s2k_count (void);
158
159
160
161 #endif /*GNUPG_CARD_TOOL_H*/