keygen is configure option
[gnuk/gnuk.git] / src / random.c
1 /*
2  * random.c -- get random bytes
3  *
4  * Copyright (C) 2010, 2011 Free Software Initiative of Japan
5  * Author: NIIBE Yutaka <gniibe@fsij.org>
6  *
7  * This file is a part of Gnuk, a GnuPG USB Token implementation.
8  *
9  * Gnuk is free software: you can redistribute it and/or modify it
10  * under the terms of the GNU General Public License as published by
11  * the Free Software Foundation, either version 3 of the License, or
12  * (at your option) any later version.
13  *
14  * Gnuk is distributed in the hope that it will be useful, but WITHOUT
15  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
17  * License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
21  *
22  */
23
24 #include "config.h"
25 #include "ch.h"
26 #include "gnuk.h"
27 #include "neug.h"
28
29 #define RANDOM_BYTES_LENGTH 16
30 static uint32_t random_word[RANDOM_BYTES_LENGTH/sizeof (uint32_t)];
31
32 void
33 random_init (void)
34 {
35   int i;
36
37   neug_init (random_word, RANDOM_BYTES_LENGTH/sizeof (uint32_t));
38
39   for (i = 0; i < NEUG_PRE_LOOP; i++)
40     (void)neug_get (NEUG_KICK_FILLING);
41
42   neug_prng_reseed ();
43 }
44
45 /*
46  * Return pointer to random 16-byte
47  */
48 const uint8_t *
49 random_bytes_get (void)
50 {
51   neug_wait_full ();
52   return (const uint8_t *)random_word;
53 }
54
55 /*
56  * Free pointer to random 16-byte
57  */
58 void
59 random_bytes_free (const uint8_t *p)
60 {
61   (void)p;
62   neug_flush ();
63 }
64
65 /*
66  * Return 4-byte salt
67  */
68 uint32_t
69 get_salt (void)
70 {
71   return neug_get (NEUG_KICK_FILLING);
72 }
73
74
75 #ifdef KEYGEN_SUPPORT
76 /*
77  * Random byte iterator
78  */
79 uint8_t
80 random_byte (void *arg)
81 {
82   uint8_t *index_p = (uint8_t *)arg;
83   uint8_t index = *index_p;
84   uint8_t *p = ((uint8_t *)random_word) + index;
85   uint8_t v;
86
87   neug_wait_full ();
88
89   v = *p;
90
91   if (++index >= RANDOM_BYTES_LENGTH)
92     {
93       index = 0;
94       neug_flush ();
95     }
96
97   *index_p = index;
98
99   return v;
100 }
101 #endif