modify random

This commit is contained in:
NIIBE Yutaka
2011-05-12 09:26:40 +09:00
parent 571e7af387
commit c196992c76
3 changed files with 30 additions and 11 deletions

View File

@@ -1,5 +1,8 @@
2011-05-12 NIIBE Yutaka <gniibe@fsij.org> 2011-05-12 NIIBE Yutaka <gniibe@fsij.org>
* src/random.c (get_salt): Rename from get_random.
(random_bytes_get, random_bytes_free): It's 16-byte.
* src/ac.c (verify_admin_0): Use PW_ERR_PW1 counter when * src/ac.c (verify_admin_0): Use PW_ERR_PW1 counter when
authenticated by PW1. authenticated by PW1.

View File

@@ -290,10 +290,11 @@ extern uint8_t admin_authorized;
#define SIZE_PW_STATUS_BYTES 7 #define SIZE_PW_STATUS_BYTES 7
/* 32-byte random bytes */ /* 16-byte random bytes */
extern uint32_t get_random (void);
extern const uint8_t *random_bytes_get (void); extern const uint8_t *random_bytes_get (void);
extern void random_bytes_free (const uint8_t *); extern void random_bytes_free (const uint8_t *);
/* 4-byte salt */
extern uint32_t get_salt (void);
extern uint32_t hardclock (void); extern uint32_t hardclock (void);

View File

@@ -1,7 +1,7 @@
/* /*
* random.c -- get random bytes * random.c -- get random bytes
* *
* Copyright (C) 2010 Free Software Initiative of Japan * Copyright (C) 2010, 2011 Free Software Initiative of Japan
* Author: NIIBE Yutaka <gniibe@fsij.org> * Author: NIIBE Yutaka <gniibe@fsij.org>
* *
* This file is a part of Gnuk, a GnuPG USB Token implementation. * This file is a part of Gnuk, a GnuPG USB Token implementation.
@@ -25,20 +25,23 @@
#include "ch.h" #include "ch.h"
#include "gnuk.h" #include "gnuk.h"
/*
* Return pointer to random 16-byte
*/
const uint8_t * const uint8_t *
random_bytes_get (void) random_bytes_get (void)
{ {
uint32_t addr, addr0; uint32_t addr, addr0;
addr = (uint32_t)&random_bits_start + ((hardclock () << 5) & 0x3e0); addr = (uint32_t)&random_bits_start + ((hardclock () << 4) & 0x3f0);
addr0 = addr; addr0 = addr;
while (1) while (1)
{ {
if (*(uint32_t *)addr != 0 && *(uint32_t *)addr != 0xffffffff) if (*(uint32_t *)addr != 0 && *(uint32_t *)addr != 0xffffffff)
break; break;
addr += 32; addr += 16;
if (addr >= ((uint32_t)&random_bits_start) + 1024) if (addr >= ((uint32_t)&random_bits_start) + 1024)
addr = ((uint32_t)&random_bits_start); addr = ((uint32_t)&random_bits_start);
@@ -49,22 +52,34 @@ random_bytes_get (void)
return (const uint8_t *)addr; return (const uint8_t *)addr;
} }
/*
* Free pointer to random 16-byte
*/
void void
random_bytes_free (const uint8_t *p) random_bytes_free (const uint8_t *p)
{ {
int i; int i;
uint32_t addr = (uint32_t)p; uint32_t addr = (uint32_t)p;
for (i = 0; i < 16; i++) for (i = 0; i < 8; i++)
flash_clear_halfword (addr+i*2); flash_clear_halfword (addr+i*2);
} }
/*
* Return 4-byte salt
*/
uint32_t uint32_t
get_random (void) get_salt (void)
{ {
const uint32_t *p = (const uint32_t *)random_bytes_get (); const uint8_t *u = unique_device_id (); /* 12-byte unique id */
uint32_t r = *p; uint32_t r = 0;
int i;
for (i = 0; i < 4; i++)
{
r <<= 8;
r |= u[hardclock () % 12];
}
random_bytes_free ((const uint8_t *)p);
return r; return r;
} }