2 * flash.c -- Data Objects (DO) and GPG Key handling on Flash ROM
4 * Copyright (C) 2010, 2011, 2012, 2013, 2014, 2015
5 * Free Software Initiative of Japan
6 * Author: NIIBE Yutaka <gniibe@fsij.org>
8 * This file is a part of Gnuk, a GnuPG USB Token implementation.
10 * Gnuk is free software: you can redistribute it and/or modify it
11 * under the terms of the GNU General Public License as published by
12 * the Free Software Foundation, either version 3 of the License, or
13 * (at your option) any later version.
15 * Gnuk is distributed in the hope that it will be useful, but WITHOUT
16 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
17 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
18 * License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program. If not, see <http://www.gnu.org/licenses/>.
26 * We assume single DO size is less than 256.
28 * NOTE: "Card holder certificate" (which size is larger than 256) is
29 * not put into data pool, but is implemented by its own flash
54 * ch_certificate_startp
59 * Three flash pages for keystore
60 * a page contains a key data of:
61 * For RSA-2048: 512-byte (p, q and N)
62 * For RSA-4096: 1024-byte (p, q and N)
63 * For ECDSA/ECDH and EdDSA, there are padding after public key
66 #define FLASH_DATA_POOL_HEADER_SIZE 2
67 #define FLASH_DATA_POOL_SIZE (flash_page_size*2)
69 static uint16_t flash_page_size;
71 static const uint8_t *data_pool;
72 extern uint8_t _keystore_pool;
74 static uint8_t *last_p;
76 /* The first halfword is generation for the data page (little endian) */
77 const uint8_t const flash_data[4] __attribute__ ((section (".gnuk_data"))) = {
78 0x01, 0x00, 0xff, 0xff
81 /* Linker set this symbol */
82 extern uint8_t _data_pool;
84 static int key_available_at (const uint8_t *k, int key_size)
88 for (i = 0; i < key_size; i++)
91 if (i == key_size) /* It's ZERO. Released key. */
94 for (i = 0; i < key_size; i++)
97 if (i == key_size) /* It's FULL. Unused key. */
104 #define CHIP_ID_REG ((uint32_t *)0xe0042000)
109 uint16_t *gen0_p = (uint16_t *)&_data_pool;
112 flash_page_size = 1024;
113 if (((*CHIP_ID_REG) & 0xfff) == 0x0414)
114 flash_page_size = 2048;
116 gen1_p = (uint16_t *)(&_data_pool + flash_page_size);
118 /* Check data pool generation and choose the page */
122 data_pool = &_data_pool + flash_page_size;
123 else if (gen1 == 0xffff)
124 data_pool = &_data_pool;
125 else if (gen1 > gen0)
126 data_pool = &_data_pool + flash_page_size;
128 data_pool = &_data_pool;
130 return data_pool + FLASH_DATA_POOL_HEADER_SIZE;
134 flash_init_keys (void)
139 /* For each key, find its address. */
141 for (i = 0; i < 3; i++)
144 int key_size = gpg_get_algo_attr_key_size (i, GPG_KEY_STORAGE);
147 for (k = p; k < p + flash_page_size; k += key_size)
148 if (key_available_at (k, key_size))
150 int prv_len = gpg_get_algo_attr_key_size (i, GPG_KEY_PRIVATE);
152 kd[i].pubkey = k + prv_len;
156 p += flash_page_size;
161 * Flash data pool managenent
163 * Flash data pool consists of two parts:
167 * Flash data pool objects:
168 * Data Object (DO) (of smart card)
176 * Format of a Data Object:
177 * NR: 8-bit tag_number
180 * PAD: optional byte for 16-bit alignment
184 flash_set_data_pool_last (const uint8_t *p)
186 last_p = (uint8_t *)p;
193 flash_copying_gc (void)
198 if (data_pool == &_data_pool)
201 dst = &_data_pool + flash_page_size;
205 src = &_data_pool + flash_page_size;
209 generation = *(uint16_t *)src;
211 gpg_data_copy (data_pool + FLASH_DATA_POOL_HEADER_SIZE);
212 flash_erase_page ((uint32_t)src);
213 flash_program_halfword ((uint32_t)dst, generation+1);
218 is_data_pool_full (size_t size)
220 return last_p + size > data_pool + flash_page_size;
224 flash_data_pool_allocate (size_t size)
228 size = (size + 1) & ~1; /* allocation unit is 1-halfword (2-byte) */
230 if (is_data_pool_full (size))
231 if (flash_copying_gc () < 0 || /*still*/ is_data_pool_full (size))
240 flash_do_write_internal (const uint8_t *p, int nr, const uint8_t *data, int len)
247 hw = nr | (len << 8);
248 if (flash_program_halfword (addr, hw) != 0)
249 flash_warning ("DO WRITE ERROR");
252 for (i = 0; i < len/2; i++)
254 hw = data[i*2] | (data[i*2+1]<<8);
255 if (flash_program_halfword (addr, hw) != 0)
256 flash_warning ("DO WRITE ERROR");
262 hw = data[i*2] | 0xff00;
263 if (flash_program_halfword (addr, hw) != 0)
264 flash_warning ("DO WRITE ERROR");
269 flash_do_write (uint8_t nr, const uint8_t *data, int len)
273 DEBUG_INFO ("flash DO\r\n");
275 p = flash_data_pool_allocate (2 + len);
278 DEBUG_INFO ("flash data pool allocation failure.\r\n");
282 flash_do_write_internal (p, nr, data, len);
283 DEBUG_INFO ("flash DO...done\r\n");
288 flash_warning (const char *msg)
291 DEBUG_INFO ("FLASH: ");
297 flash_do_release (const uint8_t *do_data)
299 uint32_t addr = (uint32_t)do_data - 1;
300 uint32_t addr_tag = addr;
302 int len = do_data[0];
304 /* Don't filling zero for data in code (such as ds_count_initial_value) */
305 if (do_data < &_data_pool || do_data > &_data_pool + FLASH_DATA_POOL_SIZE)
310 /* Fill zero for content and pad */
311 for (i = 0; i < len/2; i ++)
313 if (flash_program_halfword (addr, 0) != 0)
314 flash_warning ("fill-zero failure");
320 if (flash_program_halfword (addr, 0) != 0)
321 flash_warning ("fill-zero pad failure");
324 /* Fill 0x0000 for "tag_number and length" word */
325 if (flash_program_halfword (addr_tag, 0) != 0)
326 flash_warning ("fill-zero tag_nr failure");
331 flash_key_getpage (enum kind_of_key kk)
333 /* There is a page for each KK. */
334 return &_keystore_pool + (flash_page_size * kk);
338 flash_key_alloc (enum kind_of_key kk)
340 uint8_t *k, *k0 = flash_key_getpage (kk);
342 int key_size = gpg_get_algo_attr_key_size (kk, GPG_KEY_STORAGE);
344 /* Seek free space in the page. */
345 for (k = k0; k < k0 + flash_page_size; k += key_size)
347 const uint32_t *p = (const uint32_t *)k;
349 for (i = 0; i < key_size/4; i++)
350 if (p[i] != 0xffffffff)
353 if (i == key_size/4) /* Yes, it's empty. */
357 /* Should not happen as we have enough free space all time, but just
363 flash_key_write (uint8_t *key_addr,
364 const uint8_t *key_data, int key_data_len,
365 const uint8_t *pubkey, int pubkey_len)
371 addr = (uint32_t)key_addr;
372 for (i = 0; i < key_data_len/2; i ++)
374 hw = key_data[i*2] | (key_data[i*2+1]<<8);
375 if (flash_program_halfword (addr, hw) != 0)
380 for (i = 0; i < pubkey_len/2; i ++)
382 hw = pubkey[i*2] | (pubkey[i*2+1]<<8);
383 if (flash_program_halfword (addr, hw) != 0)
392 flash_check_all_other_keys_released (const uint8_t *key_addr, int key_size)
394 uint32_t start = (uint32_t)key_addr & ~(flash_page_size - 1);
395 const uint32_t *p = (const uint32_t *)start;
397 while (p < (const uint32_t *)(start + flash_page_size))
398 if (p == (const uint32_t *)key_addr)
410 flash_key_fill_zero_as_released (uint8_t *key_addr, int key_size)
413 uint32_t addr = (uint32_t)key_addr;
415 for (i = 0; i < key_size/2; i++)
416 flash_program_halfword (addr + i*2, 0);
420 flash_key_release (uint8_t *key_addr, int key_size)
422 if (flash_check_all_other_keys_released (key_addr, key_size))
423 flash_erase_page (((uint32_t)key_addr & ~(flash_page_size - 1)));
425 flash_key_fill_zero_as_released (key_addr, key_size);
429 flash_key_release_page (enum kind_of_key kk)
431 flash_erase_page ((uint32_t)flash_key_getpage (kk));
436 flash_clear_halfword (uint32_t addr)
438 flash_program_halfword (addr, 0);
443 flash_put_data_internal (const uint8_t *p, uint16_t hw)
445 flash_program_halfword ((uint32_t)p, hw);
449 flash_put_data (uint16_t hw)
453 p = flash_data_pool_allocate (2);
456 DEBUG_INFO ("data allocation failure.\r\n");
459 flash_program_halfword ((uint32_t)p, hw);
464 flash_bool_clear (const uint8_t **addr_p)
468 if ((p = *addr_p) == NULL)
471 flash_program_halfword ((uint32_t)p, 0);
476 flash_bool_write_internal (const uint8_t *p, int nr)
478 flash_program_halfword ((uint32_t)p, nr);
482 flash_bool_write (uint8_t nr)
487 p = flash_data_pool_allocate (2);
490 DEBUG_INFO ("bool allocation failure.\r\n");
494 flash_program_halfword ((uint32_t)p, hw);
500 flash_enum_clear (const uint8_t **addr_p)
502 flash_bool_clear (addr_p);
506 flash_enum_write_internal (const uint8_t *p, int nr, uint8_t v)
508 uint16_t hw = nr | (v << 8);
510 flash_program_halfword ((uint32_t)p, hw);
514 flash_enum_write (uint8_t nr, uint8_t v)
517 uint16_t hw = nr | (v << 8);
519 p = flash_data_pool_allocate (2);
522 DEBUG_INFO ("enum allocation failure.\r\n");
526 flash_program_halfword ((uint32_t)p, hw);
532 flash_cnt123_get_value (const uint8_t *p)
541 * After erase, a halfword in flash memory becomes 0xffff.
542 * The halfword can be programmed to any value.
543 * Then, the halfword can be programmed to zero.
545 * Thus, we can represent value 1, 2, and 3.
557 flash_cnt123_write_internal (const uint8_t *p, int which, int v)
561 hw = NR_COUNTER_123 | (which << 8);
562 flash_program_halfword ((uint32_t)p, hw);
567 flash_program_halfword ((uint32_t)p+2, 0xc3c3);
569 flash_program_halfword ((uint32_t)p+2, 0);
573 flash_cnt123_increment (uint8_t which, const uint8_t **addr_p)
578 if ((p = *addr_p) == NULL)
580 p = flash_data_pool_allocate (4);
583 DEBUG_INFO ("cnt123 allocation failure.\r\n");
586 hw = NR_COUNTER_123 | (which << 8);
587 flash_program_halfword ((uint32_t)p, hw);
602 flash_program_halfword ((uint32_t)p, hw);
607 flash_cnt123_clear (const uint8_t **addr_p)
611 if ((p = *addr_p) == NULL)
614 flash_program_halfword ((uint32_t)p, 0);
616 flash_program_halfword ((uint32_t)p, 0);
621 #if defined(CERTDO_SUPPORT)
623 flash_erase_binary (uint8_t file_id)
625 if (file_id == FILEID_CH_CERTIFICATE)
627 const uint8_t *p = &ch_certificate_start;
628 if (flash_check_blank (p, FLASH_CH_CERTIFICATE_SIZE) == 0)
630 flash_erase_page ((uint32_t)p);
631 if (FLASH_CH_CERTIFICATE_SIZE > flash_page_size)
632 flash_erase_page ((uint32_t)p + flash_page_size);
644 flash_write_binary (uint8_t file_id, const uint8_t *data,
645 uint16_t len, uint16_t offset)
650 if (file_id == FILEID_SERIAL_NO)
653 p = &openpgpcard_aid[8];
655 else if (file_id >= FILEID_UPDATE_KEY_0 && file_id <= FILEID_UPDATE_KEY_3)
657 maxsize = FIRMWARE_UPDATE_KEY_CONTENT_LEN;
658 p = gpg_get_firmware_update_key (file_id - FILEID_UPDATE_KEY_0);
659 if (len == 0 && offset == 0)
660 { /* This means removal of update key. */
661 if (flash_program_halfword ((uint32_t)p, 0) != 0)
662 flash_warning ("DO WRITE ERROR");
666 #if defined(CERTDO_SUPPORT)
667 else if (file_id == FILEID_CH_CERTIFICATE)
669 maxsize = FLASH_CH_CERTIFICATE_SIZE;
670 p = &ch_certificate_start;
676 if (offset + len > maxsize || (offset&1) || (len&1))
684 if (flash_check_blank (p + offset, len) == 0)
687 addr = (uint32_t)p + offset;
688 for (i = 0; i < len/2; i++)
690 hw = data[i*2] | (data[i*2+1]<<8);
691 if (flash_program_halfword (addr, hw) != 0)
692 flash_warning ("DO WRITE ERROR");