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>
* 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
authenticated by PW1.

View File

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

View File

@@ -1,7 +1,7 @@
/*
* 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>
*
* This file is a part of Gnuk, a GnuPG USB Token implementation.
@@ -25,12 +25,15 @@
#include "ch.h"
#include "gnuk.h"
/*
* Return pointer to random 16-byte
*/
const uint8_t *
random_bytes_get (void)
{
uint32_t addr, addr0;
addr = (uint32_t)&random_bits_start + ((hardclock () << 5) & 0x3e0);
addr = (uint32_t)&random_bits_start + ((hardclock () << 4) & 0x3f0);
addr0 = addr;
while (1)
@@ -38,7 +41,7 @@ random_bytes_get (void)
if (*(uint32_t *)addr != 0 && *(uint32_t *)addr != 0xffffffff)
break;
addr += 32;
addr += 16;
if (addr >= ((uint32_t)&random_bits_start) + 1024)
addr = ((uint32_t)&random_bits_start);
@@ -49,22 +52,34 @@ random_bytes_get (void)
return (const uint8_t *)addr;
}
/*
* Free pointer to random 16-byte
*/
void
random_bytes_free (const uint8_t *p)
{
int i;
uint32_t addr = (uint32_t)p;
for (i = 0; i < 16; i++)
for (i = 0; i < 8; i++)
flash_clear_halfword (addr+i*2);
}
/*
* Return 4-byte salt
*/
uint32_t
get_random (void)
get_salt (void)
{
const uint32_t *p = (const uint32_t *)random_bytes_get ();
uint32_t r = *p;
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];
}
random_bytes_free ((const uint8_t *)p);
return r;
}