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