diff --git a/ChangeLog b/ChangeLog index 962f4f9..ad749df 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,36 @@ +2011-10-06 NIIBE Yutaka + + * src/main.c (main): Call random_init. + + * src/gnuk.ld.in (__process_stack_size__): Fix. + (.gnuk_random): Removed. + + * src/flash.c (flash_erase_binary, flash_write_binary): Remove + support of random_byte in flash ROM. + + * src/neug.c (adccb): Use old API (was: chEvtSignalFlagsI). + (adccb_err): Remove. + (rng_gen, rng): Add the last argument adccb for adcStartConversion: + This is old API of ADC driver. + (adcgrpcfg): Remove callbacks, add CONT and SWSTART: This is old + API of ADC driver. + (adccb): Remove the first argument: This is old API of ADC driver. + (neug_wait_full): New. + + * ChibiOS_2.0.8/os/hal/platforms/STM32/adc_lld.h (ADC_SAMPLE_1P5): + Add (from new API). + + * src/random.c (random_init): New. + (random_bytes_get, random_bytes_free, get_salt): Use NeuG. + + * src/Makefile.in (CSRC): Add neug.c. + + * src/neug.c: New. Verbatim copy of NeuG/src/random.c. + + * boards/common/mcuconf-common.h (USE_STM32_ADC1): TRUE for NewG RNG. + * src/chconf.h (CH_USE_SEMAPHORES): TRUE as ADC driver requires it. + * src/halconf.h (CH_HAL_USE_ADC); TRUE for NewG RNG. + 2011-07-22 NIIBE Yutaka * boards/OLIMEX_STM32_H103/board.h (BOARD_NAME): Fixed. diff --git a/ChibiOS_2.0.8/os/hal/platforms/STM32/adc_lld.h b/ChibiOS_2.0.8/os/hal/platforms/STM32/adc_lld.h index 05be6be..d369b4a 100644 --- a/ChibiOS_2.0.8/os/hal/platforms/STM32/adc_lld.h +++ b/ChibiOS_2.0.8/os/hal/platforms/STM32/adc_lld.h @@ -62,6 +62,20 @@ #define ADC_CHANNEL_SENSOR 16 /**< @brief Internal temperature sensor.*/ #define ADC_CHANNEL_VREFINT 17 /**< @brief Internal reference. */ +/** + * @name Sampling rates + * @{ + */ +#define ADC_SAMPLE_1P5 0 /**< @brief 1.5 cycles sampling time. */ +#define ADC_SAMPLE_7P5 1 /**< @brief 7.5 cycles sampling time. */ +#define ADC_SAMPLE_13P5 2 /**< @brief 13.5 cycles sampling time. */ +#define ADC_SAMPLE_28P5 3 /**< @brief 28.5 cycles sampling time. */ +#define ADC_SAMPLE_41P5 4 /**< @brief 41.5 cycles sampling time. */ +#define ADC_SAMPLE_55P5 5 /**< @brief 55.5 cycles sampling time. */ +#define ADC_SAMPLE_71P5 6 /**< @brief 71.5 cycles sampling time. */ +#define ADC_SAMPLE_239P5 7 /**< @brief 239.5 cycles sampling time. */ +/** @} */ + /*===========================================================================*/ /* Driver pre-compile time settings. */ /*===========================================================================*/ diff --git a/src/Makefile.in b/src/Makefile.in index 134cf18..3111eb9 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -91,7 +91,7 @@ CSRC = $(PORTSRC) \ main.c usb_lld.c \ usb_desc.c usb_prop.c \ usb-icc.c openpgp.c ac.c openpgp-do.c flash.c hardclock.c \ - random.c + random.c neug.c ifneq ($(ENABLE_DEBUG),) CSRC += debug.c diff --git a/src/flash.c b/src/flash.c index f3561e1..2e1720a 100644 --- a/src/flash.c +++ b/src/flash.c @@ -147,8 +147,6 @@ flash_erase_page (uint32_t addr) * .bss * _end * - * random_bits_start - * * ch_certificate_startp * <2048 bytes> * _data_pool @@ -613,15 +611,6 @@ flash_erase_binary (uint8_t file_id) #endif } - return 0; - } - else if (file_id == FILEID_RANDOM) - { - p = &random_bits_start; - - if (flash_check_blank (p, FLASH_PAGE_SIZE) == 0) - flash_erase_page ((uint32_t)p); - return 0; } else @@ -641,11 +630,6 @@ flash_write_binary (uint8_t file_id, const uint8_t *data, maxsize = FLASH_CH_CERTIFICATE_SIZE; p = &ch_certificate_start; } - else if (file_id == FILEID_RANDOM) - { - maxsize = FLASH_PAGE_SIZE; - p = &random_bits_start; - } else if (file_id == FILEID_SERIAL_NO) { maxsize = 6; diff --git a/src/gnuk.h b/src/gnuk.h index b4bcea5..196e4ed 100644 --- a/src/gnuk.h +++ b/src/gnuk.h @@ -292,6 +292,7 @@ extern uint8_t admin_authorized; #define SIZE_PW_STATUS_BYTES 7 +extern void random_init (void); /* 16-byte random bytes */ extern const uint8_t *random_bytes_get (void); extern void random_bytes_free (const uint8_t *); diff --git a/src/gnuk.ld.in b/src/gnuk.ld.in index d74f0dc..cefb008 100644 --- a/src/gnuk.ld.in +++ b/src/gnuk.ld.in @@ -27,8 +27,9 @@ /* * ST32F103 memory setup. */ -__main_stack_size__ = 0x0400; -__stacks_total_size__ = __main_stack_size__; +__main_stack_size__ = 0x0200; +__process_stack_size__ = 0x0200; +__stacks_total_size__ = __main_stack_size__ + __process_stack_size__; MEMORY { @@ -114,14 +115,6 @@ SECTIONS PROVIDE(end = .); _end = .; - .gnuk_random : - { - . = ALIGN (@FLASH_PAGE_SIZE@); - random_bits_start = .; - LONG(0xffffffff); - . = ALIGN (@FLASH_PAGE_SIZE@); - } > flash =0xffffffff - .gnuk_ch_certificate : { . = ALIGN (@FLASH_PAGE_SIZE@); diff --git a/src/main.c b/src/main.c index ddc0e35..9344ee2 100644 --- a/src/main.c +++ b/src/main.c @@ -213,7 +213,8 @@ main (int argc, char **argv) flash_unlock (); device_initialize_once (); usb_lld_init (); - USB_Init(); + USB_Init (); + random_init (); #ifdef DEBUG stdout_init (); diff --git a/src/neug.c b/src/neug.c index 733b1e7..b3b1b99 100644 --- a/src/neug.c +++ b/src/neug.c @@ -41,8 +41,7 @@ static Thread *rng_thread; */ static adcsample_t samp[ADC_GRP1_NUM_CHANNELS * ADC_GRP1_BUF_DEPTH]; -static void adccb (ADCDriver *adcp, adcsample_t *buffer, size_t n); -static void adccb_err (ADCDriver *adcp, adcerror_t err); +static void adccb (adcsample_t *buffer, size_t n); /* * ADC conversion group. @@ -53,10 +52,8 @@ static void adccb_err (ADCDriver *adcp, adcerror_t err); static const ADCConversionGroup adcgrpcfg = { FALSE, ADC_GRP1_NUM_CHANNELS, - adccb, - adccb_err, 0, - ADC_CR2_TSVREFE, + ADC_CR2_EXTSEL_SWSTART | ADC_CR2_TSVREFE | ADC_CR2_CONT, ADC_SMPR1_SMP_SENSOR(ADC_SAMPLE_1P5) | ADC_SMPR1_SMP_VREF(ADC_SAMPLE_1P5), 0, ADC_SQR1_NUM_CH(ADC_GRP1_NUM_CHANNELS), @@ -67,21 +64,14 @@ static const ADCConversionGroup adcgrpcfg = { /* * ADC end conversion callback. */ -static void adccb (ADCDriver *adcp, adcsample_t *buffer, size_t n) +static void adccb (adcsample_t *buffer, size_t n) { + ADCDriver *adcp = &ADCD1; + (void) buffer; (void) n; - - chSysLockFromIsr(); - if (adcp->state == ADC_COMPLETE) - chEvtSignalFlagsI (rng_thread, ADC_DATA_AVAILABLE); - chSysUnlockFromIsr(); + if (adcp->ad_state == ADC_COMPLETE) + chEvtSignalI (rng_thread, ADC_DATA_AVAILABLE); } - -static void adccb_err (ADCDriver *adcp, adcerror_t err) -{ - (void)adcp; (void)err; -} - /* * TinyMT routines. @@ -319,7 +309,7 @@ static int rng_gen (struct rng_rb *rb) | ((samp[4] & 0x01) << 4) | ((samp[5] & 0x01) << 5) | ((samp[6] & 0x01) << 6) | ((samp[7] & 0x01) << 7)); - adcStartConversion (&ADCD1, &adcgrpcfg, samp, ADC_GRP1_BUF_DEPTH); + adcStartConversion (&ADCD1, &adcgrpcfg, samp, ADC_GRP1_BUF_DEPTH, adccb); /* * Put a random byte to entropy pool. @@ -356,7 +346,7 @@ static msg_t rng (void *arg) rng_thread = chThdSelf (); adcStart (&ADCD1, NULL); - adcStartConversion (&ADCD1, &adcgrpcfg, samp, ADC_GRP1_BUF_DEPTH); + adcStartConversion (&ADCD1, &adcgrpcfg, samp, ADC_GRP1_BUF_DEPTH, adccb); while (1) { @@ -372,7 +362,7 @@ static msg_t rng (void *arg) } static struct rng_rb the_ring_buffer; -static WORKING_AREA(wa_rng, 64); +static WORKING_AREA(wa_rng, 128); /** * @brief Initialize NeuG. @@ -450,3 +440,14 @@ neug_get (int kick) return v; } + +void +neug_wait_full (void) +{ + struct rng_rb *rb = &the_ring_buffer; + + chMtxLock (&rb->m); + while (!rb->full) + chCondWait (&rb->data_available); + chMtxUnlock (); +} diff --git a/src/random.c b/src/random.c index 3eebd84..a5eef70 100644 --- a/src/random.c +++ b/src/random.c @@ -24,6 +24,21 @@ #include "config.h" #include "ch.h" #include "gnuk.h" +#include "neug.h" + +#define RANDOM_BYTES_LENGTH 16 +static uint32_t random_word[RANDOM_BYTES_LENGTH/sizeof (uint32_t)]; + +void +random_init (void) +{ + int i; + + neug_init (random_word, RANDOM_BYTES_LENGTH/sizeof (uint32_t)); + + for (i = 0; i < NEUG_PRE_LOOP; i++) + (void)neug_get (NEUG_KICK_FILLING); +} /* * Return pointer to random 16-byte @@ -31,25 +46,8 @@ const uint8_t * random_bytes_get (void) { - uint32_t addr, addr0; - - addr = (uint32_t)&random_bits_start + ((hardclock () << 4) & 0x3f0); - addr0 = addr; - - while (1) - { - if (*(uint32_t *)addr != 0 && *(uint32_t *)addr != 0xffffffff) - break; - - addr += 16; - if (addr >= ((uint32_t)&random_bits_start) + 1024) - addr = ((uint32_t)&random_bits_start); - - if (addr == addr0) - fatal (FATAL_RANDOM); - } - - return (const uint8_t *)addr; + neug_wait_full (); + return (const uint8_t *)random_word; } /* @@ -58,11 +56,8 @@ random_bytes_get (void) void random_bytes_free (const uint8_t *p) { - int i; - uint32_t addr = (uint32_t)p; - - for (i = 0; i < 8; i++) - flash_clear_halfword (addr+i*2); + (void)p; + neug_flush (); } /* @@ -71,15 +66,5 @@ random_bytes_free (const uint8_t *p) uint32_t get_salt (void) { - const uint8_t *u = unique_device_id (); /* 12-byte unique id */ - uint32_t r = 0; - int i; - - for (i = 0; i < 4; i++) - { - r <<= 8; - r |= u[hardclock () % 12]; - } - - return r; + return neug_get (NEUG_KICK_FILLING); }