]> git.cryptolib.org Git - arm-crypto-lib.git/blob - noekeon_prng.c
a264707a3235bd72bc14b61514c9226292b46380
[arm-crypto-lib.git] / noekeon_prng.c
1 /* noekeon_prng.c */
2 /*
3  *   This file is part of the ARM-Crypto-Lib.
4  *   Copyright (C) 2006-2010  Daniel Otte (daniel.otte@rub.de)
5  *
6  *   This program is free software: you can redistribute it and/or modify
7  *   it under the terms of the GNU General Public License as published by
8  *   the Free Software Foundation, either version 3 of the License, or
9  *   (at your option) any later version.
10  *
11  *   This program is distributed in the hope that it will be useful,
12  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *   GNU General Public License for more details.
15  *
16  *   You should have received a copy of the GNU General Public License
17  *   along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19 /**
20  * \author      Daniel Otte
21  * \date        2008-08-24
22  * \license GPLv3 or later
23  * \brief   random number generator based on noekeon running in CFB-mode
24  * 
25  */
26
27 #include "noekeon.h"
28 #include "memxor.h"
29 #include <stdint.h>
30 #include <string.h>
31
32 static uint8_t random_state[16];
33 static uint8_t random_key[16];
34 static uint8_t i=0;
35
36 uint8_t random8(void){
37         static uint8_t sr[16];
38         
39         if(i==0){
40                 noekeon_enc(random_state, random_key);
41                 memcpy(sr, random_state, 16);
42                 i=15;
43                 return sr[15];
44         }
45         --i;
46         return sr[i];
47 }
48
49 void random_block(void* dest){
50         i=0;
51         noekeon_enc(random_state, random_key);
52         memcpy(dest, random_state, 16);
53 }
54
55 void srandom32(uint32_t seed){
56         memcpy(random_key, &seed, 4);
57 }
58
59 void random_seed(const void* buffer){
60         memcpy(random_key, buffer, 16);
61 }
62
63 void random_add(const void* buffer){
64         memxor(random_key, buffer, 16);
65 }
66
67