08a7f2acfcad169aeffd4a3939c08d7df1e28d18
[gnuk/gnuk.git] / src / gnuk.h
1 extern Thread *stdout_thread;
2 #define EV_TX_READY ((eventmask_t)1)
3
4 extern void put_byte (uint8_t b);
5 extern void put_byte_with_no_nl (uint8_t b);
6 extern void put_short (uint16_t x);
7 extern void put_word (uint32_t x);
8 extern void put_int (uint32_t x);
9 extern void put_string (const char *s);
10 extern void put_binary (const char *s, int len);
11
12 extern void _write (const char *, int);
13
14 /*
15  * We declare some of libc functions here, because we will
16  * remove dependency on libc in future.
17  */
18 extern size_t strlen (const char *s);
19 extern int strncmp(const char *s1, const char *s2, size_t n);
20 extern void *memcpy (void *dest, const void *src, size_t n);
21 extern void *memset (void *s, int c, size_t n);
22 extern int memcmp (const void *s1, const void *s2, size_t n);
23
24 #define EV_EXEC_FINISHED ((eventmask_t)2)        /* GPG Execution finished */
25
26 /* maximum cmd apdu data is key import 22+4+128+128 (proc_key_import) */
27 #define MAX_CMD_APDU_SIZE (7+282) /* header + data */
28 /* maximum res apdu data is public key 5+9+256+2 (gpg_do_public_key) */
29 #define MAX_RES_APDU_SIZE ((5+9+256)+2) /* Data + status */
30
31 #define ICC_MSG_HEADER_SIZE     10
32
33 #define cmd_APDU (&icc_buffer[ICC_MSG_HEADER_SIZE])
34 #define res_APDU (&icc_buffer[ICC_MSG_HEADER_SIZE])
35 extern int icc_data_size;
36 #define cmd_APDU_size icc_data_size
37 extern int res_APDU_size;
38
39 /* USB buffer size of LL (Low-level): size of single Bulk transaction */
40 #define USB_LL_BUF_SIZE 64
41
42 /*
43  * USB buffer size of USB-ICC driver
44  * (Changing this, dwMaxCCIDMessageLength too !!)
45  */
46 #define USB_BUF_SIZE ((10 + 10 + MAX_CMD_APDU_SIZE + USB_LL_BUF_SIZE - 1) \
47                         / USB_LL_BUF_SIZE * USB_LL_BUF_SIZE)
48 extern uint8_t icc_buffer[USB_BUF_SIZE];
49
50 enum icc_state
51 {
52   ICC_STATE_START,              /* Initial */
53   ICC_STATE_WAIT,               /* Waiting APDU */
54                                 /* Busy1, Busy2, Busy3, Busy5 */
55   ICC_STATE_EXECUTE,            /* Busy4 */
56   ICC_STATE_RECEIVE,            /* APDU Received Partially */
57   /* Not used */
58   ICC_STATE_SEND,               /* APDU Sent Partially */
59 };
60
61 extern volatile enum icc_state icc_state;
62
63 extern volatile uint8_t auth_status;
64 #define AC_NONE_AUTHORIZED      0x00
65 #define AC_PSO_CDS_AUTHORIZED   0x01  /* PW1 with 0x81 verified */
66 #define AC_OTHER_AUTHORIZED     0x02  /* PW1 with 0x82 verified */
67 #define AC_ADMIN_AUTHORIZED     0x04  /* PW3 verified */
68 #define AC_NEVER                0x80
69 #define AC_ALWAYS               0xFF
70
71 #define PW_ERR_PW1 0
72 #define PW_ERR_RC  1
73 #define PW_ERR_PW3 2
74 extern int gpg_passwd_locked (uint8_t which);
75 extern void gpg_reset_pw_err_counter (uint8_t which);
76 extern void gpg_increment_pw_err_counter (uint8_t which);
77
78 extern int ac_check_status (uint8_t ac_flag);
79 extern int verify_pso_cds (const uint8_t *pw, int pw_len);
80 extern int verify_other (const uint8_t *pw, int pw_len);
81 extern int verify_admin (const uint8_t *pw, int pw_len);
82 extern int verify_admin_0 (const uint8_t *pw, int buf_len, int pw_len_known);
83
84 extern void ac_reset_pso_cds (void);
85 extern void ac_reset_other (void);
86 extern void ac_reset_admin (void);
87 extern void ac_fini (void);
88
89
90 extern void write_res_apdu (const uint8_t *p, int len,
91                             uint8_t sw1, uint8_t sw2);
92 uint16_t data_objects_number_of_bytes;
93
94 extern void gpg_data_scan (const uint8_t *p);
95 extern void gpg_data_copy (const uint8_t *p);
96 extern void gpg_do_get_data (uint16_t tag);
97 extern void gpg_do_put_data (uint16_t tag, const uint8_t *data, int len);
98 extern void gpg_do_public_key (uint8_t kk_byte);
99
100
101
102 enum kind_of_key {
103   GPG_KEY_FOR_SIGNING = 0,
104   GPG_KEY_FOR_DECRYPTION,
105   GPG_KEY_FOR_AUTHENTICATION,
106 };
107
108 extern const uint8_t *flash_init (void);
109 extern void flash_do_release (const uint8_t *);
110 extern const uint8_t *flash_do_write (uint8_t nr, const uint8_t *data, int len);
111 extern uint8_t *flash_key_alloc (void);
112 extern void flash_keystore_release (void);
113 extern void flash_set_data_pool_last (const uint8_t *p);
114 extern void flash_clear_halfword (uint32_t addr);
115 extern void flash_increment_counter (uint8_t counter_tag_nr);
116 extern void flash_reset_counter (uint8_t counter_tag_nr);
117
118 #define KEY_MAGIC_LEN 8
119 #define KEY_CONTENT_LEN 256     /* p and q */
120 #define GNUK_MAGIC "Gnuk KEY"
121
122 /* encrypted data content */
123 struct key_data {
124   uint8_t data[KEY_CONTENT_LEN]; /* p and q */
125   uint32_t check;
126   uint32_t random;
127   char magic[KEY_MAGIC_LEN];
128 };
129
130 #define ADDITIONAL_DATA_SIZE 16
131 #define DATA_ENCRYPTION_KEY_SIZE 16
132 struct prvkey_data {
133   const uint8_t *key_addr;
134   /*
135    * CRM: [C]heck, [R]andom, and [M]agic in struct key_data
136    *
137    */
138   uint8_t crm_encrypted[ADDITIONAL_DATA_SIZE];
139   /*
140    * DEK: Data Encryption Key
141    */
142   uint8_t dek_encrypted_1[DATA_ENCRYPTION_KEY_SIZE]; /* For user */
143   uint8_t dek_encrypted_2[DATA_ENCRYPTION_KEY_SIZE]; /* For resetcode */
144   uint8_t dek_encrypted_3[DATA_ENCRYPTION_KEY_SIZE]; /* For admin */
145 };
146
147 #define BY_USER         1
148 #define BY_RESETCODE    2
149 #define BY_ADMIN        3
150
151 extern int flash_key_write (uint8_t *key_addr, const uint8_t *key_data, const uint8_t *modulus);
152
153 #define KEYSTRING_PASSLEN_SIZE  1
154 #define KEYSTRING_SALT_SIZE     8 /* optional */
155 #define KEYSTRING_ITER_SIZE     1 /* optional */
156 #define KEYSTRING_MD_SIZE       20
157 #define KEYSTRING_SIZE_PW1 (KEYSTRING_PASSLEN_SIZE+KEYSTRING_MD_SIZE)
158 #define KEYSTRING_SIZE_RC  (KEYSTRING_PASSLEN_SIZE+KEYSTRING_MD_SIZE)
159 #define KEYSTRING_SIZE_PW3 (KEYSTRING_PASSLEN_SIZE+KEYSTRING_SALT_SIZE \
160                                 +KEYSTRING_ITER_SIZE+KEYSTRING_MD_SIZE)
161
162 extern void gpg_do_clear_prvkey (enum kind_of_key kk);
163 extern int gpg_do_load_prvkey (enum kind_of_key kk, int who, const uint8_t *keystring);
164 extern int gpg_do_chks_prvkey (enum kind_of_key kk,
165                                int who_old, const uint8_t *old_ks,
166                                int who_new, const uint8_t *new_ks);
167
168 extern int gpg_change_keystring (int who_old, const uint8_t *old_ks,
169                                  int who_new, const uint8_t *new_ks);
170
171 extern struct key_data kd[3];
172
173 #ifdef DEBUG
174 #define DEBUG_INFO(msg)     put_string (msg)
175 #define DEBUG_WORD(w)       put_word (w)
176 #define DEBUG_SHORT(h)      put_short (h)
177 #define DEBUG_BYTE(b)       put_byte (b)
178 #define DEBUG_BINARY(s,len) put_binary ((const char *)s,len)
179 #else
180 #define DEBUG_INFO(msg)
181 #define DEBUG_WORD(w)
182 #define DEBUG_SHORT(h)
183 #define DEBUG_BYTE(b)
184 #define DEBUG_BINARY(s,len)
185 #endif
186
187 extern int rsa_sign (const uint8_t *, uint8_t *, int, struct key_data *);
188 extern const uint8_t *modulus_calc (const uint8_t *, int);
189 extern void modulus_free (const uint8_t *);
190 extern int rsa_decrypt (const uint8_t *, uint8_t *, int, struct key_data *);
191
192 extern const uint8_t *gpg_do_read_simple (uint8_t);
193 extern void gpg_do_write_simple (uint8_t, const uint8_t *, int);
194 extern void gpg_increment_digital_signature_counter (void);
195
196
197 extern void gpg_set_pw3 (const uint8_t *newpw, int newpw_len);
198 extern void fatal (uint8_t code) __attribute__ ((noreturn));
199 #define FATAL_FLASH  1
200 #define FATAL_RANDOM 2
201
202 extern uint8_t keystring_md_pw3[KEYSTRING_MD_SIZE];
203
204 /*** Flash memory tag values ***/
205 #define NR_NONE                 0x00
206 /* Data objects */
207 /*
208  * Representation of data object:
209  *
210  *   <-1 halfword-> <--len/2 halfwords->
211  *   <-tag-><-len-> <---data content--->
212  */
213 #define NR_DO__FIRST__          0x01
214 #define NR_DO_SEX               0x01
215 #define NR_DO_FP_SIG            0x02
216 #define NR_DO_FP_DEC            0x03
217 #define NR_DO_FP_AUT            0x04
218 #define NR_DO_CAFP_1            0x05
219 #define NR_DO_CAFP_2            0x06
220 #define NR_DO_CAFP_3            0x07
221 #define NR_DO_KGTIME_SIG        0x08
222 #define NR_DO_KGTIME_DEC        0x09
223 #define NR_DO_KGTIME_AUT        0x0a
224 #define NR_DO_LOGIN_DATA        0x0b
225 #define NR_DO_URL               0x0c
226 #define NR_DO_NAME              0x0d
227 #define NR_DO_LANGUAGE          0x0e
228 #define NR_DO_PRVKEY_SIG        0x0f
229 #define NR_DO_PRVKEY_DEC        0x10
230 #define NR_DO_PRVKEY_AUT        0x11
231 #define NR_DO_KEYSTRING_PW1     0x12
232 #define NR_DO_KEYSTRING_RC      0x13
233 #define NR_DO_KEYSTRING_PW3     0x14
234 #define NR_DO__LAST__           21   /* == 0x15 */
235 /* 14-bit counter for DS: Recorded in flash memory by 1-halfword (2-byte).  */
236 /*
237  * Representation of 14-bit counter:
238  *      0: 0x8000
239  *      1: 0x8001
240  *     ...
241  *  16383: 0xbfff
242  */
243 #define NR_COUNTER_DS           0x80 /* ..0xbf */
244 /* 10-bit counter for DS: Recorded in flash memory by 1-halfword (2-byte).  */
245 /*
246  * Representation of 10-bit counter:
247  *      0: 0xc000
248  *      1: 0xc001
249  *     ...
250  *   1023: 0xc3ff
251  */
252 #define NR_COUNTER_DS_LSB       0xc0 /* ..0xc3 */
253 /* 8-bit int or Boolean objects: Recorded in flash memory by 1-halfword (2-byte) */
254 /*
255  * Representation of Boolean object:
256  *   0: No record in flash memory
257  *   1: 0xc?00
258  */
259 #define NR_BOOL_PW1_LIFETIME    0xf0
260 /*
261  * NR_BOOL_SOMETHING, NR_UINT_SOMETHING could be here...  Use 0xf?
262  */
263 /* 123-counters: Recorded in flash memory by 2-halfword (4-byte).  */
264 /*
265  * Representation of 123-counters:
266  *   0: No record in flash memory 
267  *   1: 0xfe?? 0xffff
268  *   2: 0xfe?? 0xc3c3
269  *   3: 0xfe?? 0x0000
270  *                    where <counter_id> is placed at second byte <??>
271  */
272 #define NR_COUNTER_123          0xfe
273 #define NR_EMPTY                0xff
274
275 #define SIZE_PW_STATUS_BYTES 7
276
277 /* 32-byte random bytes */
278 extern uint32_t get_random (void);
279 extern const uint8_t *random_bytes_get (void);
280 extern void random_bytes_free (const uint8_t *);
281
282 extern uint32_t hardclock (void);
283
284 extern void set_led (int);
285
286 #define NUM_ALL_PRV_KEYS 3      /* SIG, DEC and AUT */
287
288 extern uint8_t pw1_keystring[KEYSTRING_SIZE_PW1];
289
290 #if !defined(OPENPGP_CARD_INITIAL_PW1)
291 #define OPENPGP_CARD_INITIAL_PW1 "123456"
292 #endif
293
294 #if !defined(OPENPGP_CARD_INITIAL_PW3)
295 #define OPENPGP_CARD_INITIAL_PW3 "12345678"
296 #endif
297
298 extern const uint8_t openpgpcard_aid[17] __attribute__ ((aligned (1)));
299
300 extern int gpg_get_pw1_lifetime (void);
301
302 extern void flash_bool_clear (const uint8_t **addr_p);
303 extern const uint8_t *flash_bool_write (uint8_t nr);
304 extern int flash_cnt123_get_value (const uint8_t *p);
305 extern void flash_cnt123_increment (uint8_t which, const uint8_t **addr_p);
306 extern void flash_cnt123_clear (const uint8_t **addr_p);
307 extern void flash_put_data (uint16_t hw);
308 extern void flash_warning (const char *msg);
309
310 extern void flash_put_data_internal (const uint8_t *p, uint16_t hw);
311 extern void flash_bool_write_internal (const uint8_t *p, int nr);
312 extern void flash_cnt123_write_internal (const uint8_t *p, int which, int v);
313 extern void flash_do_write_internal (const uint8_t *p, int nr, const uint8_t *data, int len);