mirror of
https://salsa.debian.org/gnuk-team/gnuk/gnuk.git
synced 2024-09-21 03:10:08 +00:00
60 lines
912 B
C
60 lines
912 B
C
|
#include "config.h"
|
||
|
#include "ch.h"
|
||
|
#include "gnuk.h"
|
||
|
|
||
|
/*
|
||
|
* XXX: I have tried havege_rand, but it requires too much memory...
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* Multiply-with-carry method by George Marsaglia
|
||
|
*/
|
||
|
static uint32_t m_w;
|
||
|
static uint32_t m_z;
|
||
|
|
||
|
uint32_t
|
||
|
get_random (void)
|
||
|
{
|
||
|
m_z = 36969 * (m_z & 65535) + (m_z >> 16);
|
||
|
m_w = 18000 * (m_w & 65535) + (m_w >> 16);
|
||
|
|
||
|
return (m_z << 16) + m_w;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
random_init (void)
|
||
|
{
|
||
|
static uint8_t s = 0;
|
||
|
|
||
|
again:
|
||
|
if ((s & 1))
|
||
|
m_w = (m_w << 8) ^ hardclock ();
|
||
|
else
|
||
|
m_z = (m_z << 8) ^ hardclock ();
|
||
|
|
||
|
s++;
|
||
|
if (m_w == 0 || m_z == 0)
|
||
|
goto again;
|
||
|
}
|
||
|
|
||
|
uint8_t dek[16];
|
||
|
uint8_t *get_data_encryption_key (void)
|
||
|
{
|
||
|
uint32_t r;
|
||
|
r = get_random ();
|
||
|
memcpy (dek, &r, 4);
|
||
|
r = get_random ();
|
||
|
memcpy (dek+4, &r, 4);
|
||
|
r = get_random ();
|
||
|
memcpy (dek+8, &r, 4);
|
||
|
r = get_random ();
|
||
|
memcpy (dek+12, &r, 4);
|
||
|
return dek;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
dek_free (uint8_t *dek)
|
||
|
{
|
||
|
(void)dek;
|
||
|
}
|