modify random
authorNIIBE Yutaka <gniibe@fsij.org>
Thu, 12 May 2011 00:26:40 +0000 (09:26 +0900)
committerNIIBE Yutaka <gniibe@fsij.org>
Thu, 12 May 2011 00:27:26 +0000 (09:27 +0900)
ChangeLog
src/gnuk.h
src/random.c

index 3c5e73b..9c50ef6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
 
index b6b9f78..c851bf4 100644 (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);
 
index 569d30e..3eebd84 100644 (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.
 #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);
-  addr0 = addr; 
+  addr = (uint32_t)&random_bits_start + ((hardclock () << 4) & 0x3f0);
+  addr0 = addr;
 
   while (1)
     {
       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;
 }