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