Header And Logo

PostgreSQL
| The world's most advanced open source database.

Data Structures | Defines | Functions | Variables

internal.c File Reference

#include "postgres.h"
#include <time.h>
#include "px.h"
#include "md5.h"
#include "sha1.h"
#include "blf.h"
#include "rijndael.h"
#include "fortuna.h"
Include dependency graph for internal.c:

Go to the source code of this file.

Data Structures

struct  int_digest
struct  int_ctx
struct  int_cipher

Defines

#define SYSTEM_RESEED_MIN   (20*60)
#define SYSTEM_RESEED_CHECK_TIME   (10*60)
#define SYSTEM_RESEED_CHANCE   (4)
#define SYSTEM_RESEED_MAX   (12*60*60)
#define MD5_DIGEST_LENGTH   16
#define SHA1_DIGEST_LENGTH   SHA1_RESULTLEN
#define SHA1_BLOCK_SIZE   64
#define MD5_BLOCK_SIZE   64
#define INT_MAX_KEY   (512/8)
#define INT_MAX_IV   (128/8)
#define MODE_ECB   0
#define MODE_CBC   1

Functions

static void init_md5 (PX_MD *h)
static void init_sha1 (PX_MD *h)
void init_sha224 (PX_MD *h)
void init_sha256 (PX_MD *h)
void init_sha384 (PX_MD *h)
void init_sha512 (PX_MD *h)
static unsigned int_md5_len (PX_MD *h)
static unsigned int_md5_block_len (PX_MD *h)
static void int_md5_update (PX_MD *h, const uint8 *data, unsigned dlen)
static void int_md5_reset (PX_MD *h)
static void int_md5_finish (PX_MD *h, uint8 *dst)
static void int_md5_free (PX_MD *h)
static unsigned int_sha1_len (PX_MD *h)
static unsigned int_sha1_block_len (PX_MD *h)
static void int_sha1_update (PX_MD *h, const uint8 *data, unsigned dlen)
static void int_sha1_reset (PX_MD *h)
static void int_sha1_finish (PX_MD *h, uint8 *dst)
static void int_sha1_free (PX_MD *h)
static void intctx_free (PX_Cipher *c)
static unsigned rj_block_size (PX_Cipher *c)
static unsigned rj_key_size (PX_Cipher *c)
static unsigned rj_iv_size (PX_Cipher *c)
static int rj_init (PX_Cipher *c, const uint8 *key, unsigned klen, const uint8 *iv)
static int rj_real_init (struct int_ctx *cx, int dir)
static int rj_encrypt (PX_Cipher *c, const uint8 *data, unsigned dlen, uint8 *res)
static int rj_decrypt (PX_Cipher *c, const uint8 *data, unsigned dlen, uint8 *res)
static PX_Cipherrj_load (int mode)
static unsigned bf_block_size (PX_Cipher *c)
static unsigned bf_key_size (PX_Cipher *c)
static unsigned bf_iv_size (PX_Cipher *c)
static int bf_init (PX_Cipher *c, const uint8 *key, unsigned klen, const uint8 *iv)
static int bf_encrypt (PX_Cipher *c, const uint8 *data, unsigned dlen, uint8 *res)
static int bf_decrypt (PX_Cipher *c, const uint8 *data, unsigned dlen, uint8 *res)
static PX_Cipherbf_load (int mode)
static PX_Cipherrj_128_ecb (void)
static PX_Cipherrj_128_cbc (void)
static PX_Cipherbf_ecb_load (void)
static PX_Cipherbf_cbc_load (void)
int px_find_digest (const char *name, PX_MD **res)
int px_find_cipher (const char *name, PX_Cipher **res)
int px_get_pseudo_random_bytes (uint8 *dst, unsigned count)
static void system_reseed (void)
int px_get_random_bytes (uint8 *dst, unsigned count)
int px_add_entropy (const uint8 *data, unsigned count)

Variables

static struct int_digest int_digest_list []
static struct int_cipher int_ciphers []
static const PX_Alias int_aliases []
static time_t seed_time = 0
static time_t check_time = 0

Define Documentation

#define INT_MAX_IV   (128/8)

Definition at line 245 of file internal.c.

#define INT_MAX_KEY   (512/8)

Definition at line 244 of file internal.c.

#define MD5_BLOCK_SIZE   64

Definition at line 75 of file internal.c.

#define MD5_DIGEST_LENGTH   16

Definition at line 63 of file internal.c.

#define MODE_CBC   1

Definition at line 279 of file internal.c.

Referenced by bf_cbc_load(), bf_decrypt(), bf_encrypt(), rj_128_cbc(), rj_decrypt(), and rj_encrypt().

#define MODE_ECB   0

Definition at line 278 of file internal.c.

Referenced by bf_decrypt(), bf_ecb_load(), bf_encrypt(), and rj_128_ecb().

#define SHA1_BLOCK_SIZE   64

Definition at line 74 of file internal.c.

#define SHA1_DIGEST_LENGTH   SHA1_RESULTLEN

Definition at line 68 of file internal.c.

#define SYSTEM_RESEED_CHANCE   (4)

Definition at line 54 of file internal.c.

#define SYSTEM_RESEED_CHECK_TIME   (10*60)

Definition at line 50 of file internal.c.

Referenced by system_reseed().

#define SYSTEM_RESEED_MAX   (12*60*60)

Definition at line 59 of file internal.c.

Referenced by system_reseed().

#define SYSTEM_RESEED_MIN   (20*60)

Definition at line 46 of file internal.c.

Referenced by system_reseed().


Function Documentation

static unsigned bf_block_size ( PX_Cipher c  )  [static]

Definition at line 420 of file internal.c.

{
    return 8;
}

static PX_Cipher* bf_cbc_load ( void   )  [static]

Definition at line 544 of file internal.c.

References bf_load(), and MODE_CBC.

{
    return bf_load(MODE_CBC);
}

static int bf_decrypt ( PX_Cipher c,
const uint8 data,
unsigned  dlen,
uint8 res 
) [static]

Definition at line 475 of file internal.c.

References int_ctx::bf, blowfish_decrypt_cbc(), blowfish_decrypt_ecb(), int_ctx::ctx, cx(), int_ctx::mode, MODE_CBC, MODE_ECB, and px_cipher::ptr.

{
    struct int_ctx *cx = (struct int_ctx *) c->ptr;
    BlowfishContext *bfctx = &cx->ctx.bf;

    if (dlen == 0)
        return 0;

    if (dlen & 7)
        return PXE_NOTBLOCKSIZE;

    memcpy(res, data, dlen);
    switch (cx->mode)
    {
        case MODE_ECB:
            blowfish_decrypt_ecb(res, dlen, bfctx);
            break;
        case MODE_CBC:
            blowfish_decrypt_cbc(res, dlen, bfctx);
            break;
    }
    return 0;
}

static PX_Cipher* bf_ecb_load ( void   )  [static]

Definition at line 538 of file internal.c.

References bf_load(), and MODE_ECB.

{
    return bf_load(MODE_ECB);
}

static int bf_encrypt ( PX_Cipher c,
const uint8 data,
unsigned  dlen,
uint8 res 
) [static]

Definition at line 450 of file internal.c.

References int_ctx::bf, blowfish_encrypt_cbc(), blowfish_encrypt_ecb(), int_ctx::ctx, cx(), int_ctx::mode, MODE_CBC, MODE_ECB, and px_cipher::ptr.

{
    struct int_ctx *cx = (struct int_ctx *) c->ptr;
    BlowfishContext *bfctx = &cx->ctx.bf;

    if (dlen == 0)
        return 0;

    if (dlen & 7)
        return PXE_NOTBLOCKSIZE;

    memcpy(res, data, dlen);
    switch (cx->mode)
    {
        case MODE_ECB:
            blowfish_encrypt_ecb(res, dlen, bfctx);
            break;
        case MODE_CBC:
            blowfish_encrypt_cbc(res, dlen, bfctx);
            break;
    }
    return 0;
}

static int bf_init ( PX_Cipher c,
const uint8 key,
unsigned  klen,
const uint8 iv 
) [static]

Definition at line 438 of file internal.c.

References int_ctx::bf, blowfish_setiv(), blowfish_setkey(), int_ctx::ctx, cx(), and px_cipher::ptr.

{
    struct int_ctx *cx = (struct int_ctx *) c->ptr;

    blowfish_setkey(&cx->ctx.bf, key, klen);
    if (iv)
        blowfish_setiv(&cx->ctx.bf, iv);

    return 0;
}

static unsigned bf_iv_size ( PX_Cipher c  )  [static]

Definition at line 432 of file internal.c.

{
    return 8;
}

static unsigned bf_key_size ( PX_Cipher c  )  [static]

Definition at line 426 of file internal.c.

{
    return 448 / 8;
}

static PX_Cipher* bf_load ( int  mode  )  [static]

Definition at line 500 of file internal.c.

References px_cipher::block_size, px_cipher::decrypt, px_cipher::encrypt, px_cipher::free, px_cipher::init, px_cipher::iv_size, px_cipher::key_size, int_ctx::mode, px_cipher::ptr, and px_alloc.

Referenced by bf_cbc_load(), and bf_ecb_load().

{
    PX_Cipher  *c;
    struct int_ctx *cx;

    c = px_alloc(sizeof *c);
    memset(c, 0, sizeof *c);

    c->block_size = bf_block_size;
    c->key_size = bf_key_size;
    c->iv_size = bf_iv_size;
    c->init = bf_init;
    c->encrypt = bf_encrypt;
    c->decrypt = bf_decrypt;
    c->free = intctx_free;

    cx = px_alloc(sizeof *cx);
    memset(cx, 0, sizeof *cx);
    cx->mode = mode;
    c->ptr = cx;
    return c;
}

static void init_md5 ( PX_MD h  )  [static]

Definition at line 201 of file internal.c.

References px_digest::block_size, px_digest::finish, px_digest::free, MD5_CTX, px_digest::p, px_digest::ptr, px_alloc, px_digest::reset, px_digest::result_size, and px_digest::update.

{
    MD5_CTX    *ctx;

    ctx = px_alloc(sizeof(*ctx));
    memset(ctx, 0, sizeof(*ctx));

    md->p.ptr = ctx;

    md->result_size = int_md5_len;
    md->block_size = int_md5_block_len;
    md->reset = int_md5_reset;
    md->update = int_md5_update;
    md->finish = int_md5_finish;
    md->free = int_md5_free;

    md->reset(md);
}

static void init_sha1 ( PX_MD h  )  [static]

Definition at line 221 of file internal.c.

References px_digest::block_size, px_digest::finish, px_digest::free, px_digest::p, px_digest::ptr, px_alloc, px_digest::reset, px_digest::result_size, and px_digest::update.

{
    SHA1_CTX   *ctx;

    ctx = px_alloc(sizeof(*ctx));
    memset(ctx, 0, sizeof(*ctx));

    md->p.ptr = ctx;

    md->result_size = int_sha1_len;
    md->block_size = int_sha1_block_len;
    md->reset = int_sha1_reset;
    md->update = int_sha1_update;
    md->finish = int_sha1_finish;
    md->free = int_sha1_free;

    md->reset(md);
}

void init_sha224 ( PX_MD h  ) 

Definition at line 239 of file internal-sha2.c.

References px_digest::block_size, px_digest::finish, px_digest::free, px_digest::p, px_digest::ptr, px_alloc, px_digest::reset, px_digest::result_size, and px_digest::update.

{
    SHA224_CTX *ctx;

    ctx = px_alloc(sizeof(*ctx));
    memset(ctx, 0, sizeof(*ctx));

    md->p.ptr = ctx;

    md->result_size = int_sha224_len;
    md->block_size = int_sha224_block_len;
    md->reset = int_sha224_reset;
    md->update = int_sha224_update;
    md->finish = int_sha224_finish;
    md->free = int_sha224_free;

    md->reset(md);
}

void init_sha256 ( PX_MD h  ) 

Definition at line 259 of file internal-sha2.c.

References px_digest::block_size, px_digest::finish, px_digest::free, px_digest::p, px_digest::ptr, px_alloc, px_digest::reset, px_digest::result_size, and px_digest::update.

{
    SHA256_CTX *ctx;

    ctx = px_alloc(sizeof(*ctx));
    memset(ctx, 0, sizeof(*ctx));

    md->p.ptr = ctx;

    md->result_size = int_sha256_len;
    md->block_size = int_sha256_block_len;
    md->reset = int_sha256_reset;
    md->update = int_sha256_update;
    md->finish = int_sha256_finish;
    md->free = int_sha256_free;

    md->reset(md);
}

void init_sha384 ( PX_MD h  ) 

Definition at line 279 of file internal-sha2.c.

References px_digest::block_size, px_digest::finish, px_digest::free, px_digest::p, px_digest::ptr, px_alloc, px_digest::reset, px_digest::result_size, and px_digest::update.

{
    SHA384_CTX *ctx;

    ctx = px_alloc(sizeof(*ctx));
    memset(ctx, 0, sizeof(*ctx));

    md->p.ptr = ctx;

    md->result_size = int_sha384_len;
    md->block_size = int_sha384_block_len;
    md->reset = int_sha384_reset;
    md->update = int_sha384_update;
    md->finish = int_sha384_finish;
    md->free = int_sha384_free;

    md->reset(md);
}

void init_sha512 ( PX_MD h  ) 

Definition at line 299 of file internal-sha2.c.

References px_digest::block_size, px_digest::finish, px_digest::free, px_digest::p, px_digest::ptr, px_alloc, px_digest::reset, px_digest::result_size, and px_digest::update.

{
    SHA512_CTX *ctx;

    ctx = px_alloc(sizeof(*ctx));
    memset(ctx, 0, sizeof(*ctx));

    md->p.ptr = ctx;

    md->result_size = int_sha512_len;
    md->block_size = int_sha512_block_len;
    md->reset = int_sha512_reset;
    md->update = int_sha512_update;
    md->finish = int_sha512_finish;
    md->free = int_sha512_free;

    md->reset(md);
}

static unsigned int_md5_block_len ( PX_MD h  )  [static]

Definition at line 111 of file internal.c.

{
    return MD5_BLOCK_SIZE;
}

static void int_md5_finish ( PX_MD h,
uint8 dst 
) [static]

Definition at line 133 of file internal.c.

References MD5_CTX, MD5Final, px_digest::p, and px_digest::ptr.

{
    MD5_CTX    *ctx = (MD5_CTX *) h->p.ptr;

    MD5Final(dst, ctx);
}

static void int_md5_free ( PX_MD h  )  [static]

Definition at line 141 of file internal.c.

References MD5_CTX, px_digest::p, px_digest::ptr, and px_free.

{
    MD5_CTX    *ctx = (MD5_CTX *) h->p.ptr;

    memset(ctx, 0, sizeof(*ctx));
    px_free(ctx);
    px_free(h);
}

static unsigned int_md5_len ( PX_MD h  )  [static]

Definition at line 105 of file internal.c.

{
    return MD5_DIGEST_LENGTH;
}

static void int_md5_reset ( PX_MD h  )  [static]

Definition at line 125 of file internal.c.

References MD5_CTX, MD5Init, px_digest::p, and px_digest::ptr.

{
    MD5_CTX    *ctx = (MD5_CTX *) h->p.ptr;

    MD5Init(ctx);
}

static void int_md5_update ( PX_MD h,
const uint8 data,
unsigned  dlen 
) [static]

Definition at line 117 of file internal.c.

References MD5_CTX, MD5Update, px_digest::p, and px_digest::ptr.

{
    MD5_CTX    *ctx = (MD5_CTX *) h->p.ptr;

    MD5Update(ctx, data, dlen);
}

static unsigned int_sha1_block_len ( PX_MD h  )  [static]

Definition at line 159 of file internal.c.

{
    return SHA1_BLOCK_SIZE;
}

static void int_sha1_finish ( PX_MD h,
uint8 dst 
) [static]

Definition at line 181 of file internal.c.

References px_digest::p, px_digest::ptr, and SHA1Final.

{
    SHA1_CTX   *ctx = (SHA1_CTX *) h->p.ptr;

    SHA1Final(dst, ctx);
}

static void int_sha1_free ( PX_MD h  )  [static]

Definition at line 189 of file internal.c.

References px_digest::p, px_digest::ptr, and px_free.

{
    SHA1_CTX   *ctx = (SHA1_CTX *) h->p.ptr;

    memset(ctx, 0, sizeof(*ctx));
    px_free(ctx);
    px_free(h);
}

static unsigned int_sha1_len ( PX_MD h  )  [static]

Definition at line 153 of file internal.c.

{
    return SHA1_DIGEST_LENGTH;
}

static void int_sha1_reset ( PX_MD h  )  [static]

Definition at line 173 of file internal.c.

References px_digest::p, px_digest::ptr, and SHA1Init.

{
    SHA1_CTX   *ctx = (SHA1_CTX *) h->p.ptr;

    SHA1Init(ctx);
}

static void int_sha1_update ( PX_MD h,
const uint8 data,
unsigned  dlen 
) [static]

Definition at line 165 of file internal.c.

References px_digest::p, px_digest::ptr, and SHA1Update.

{
    SHA1_CTX   *ctx = (SHA1_CTX *) h->p.ptr;

    SHA1Update(ctx, data, dlen);
}

static void intctx_free ( PX_Cipher c  )  [static]

Definition at line 262 of file internal.c.

References cx(), px_cipher::ptr, and px_free.

{
    struct int_ctx *cx = (struct int_ctx *) c->ptr;

    if (cx)
    {
        memset(cx, 0, sizeof *cx);
        px_free(cx);
    }
    px_free(c);
}

int px_add_entropy ( const uint8 data,
unsigned  count 
)

Definition at line 683 of file internal.c.

Referenced by add_block_entropy().

{
    system_reseed();
    fortuna_add_entropy(data, count);
    return 0;
}

int px_find_cipher ( const char *  name,
PX_Cipher **  res 
)

Definition at line 598 of file internal.c.

Referenced by pgp_load_cipher(), and px_find_combo().

{
    int         i;
    PX_Cipher  *c = NULL;

    name = px_resolve_alias(int_aliases, name);

    for (i = 0; int_ciphers[i].name; i++)
        if (strcmp(int_ciphers[i].name, name) == 0)
        {
            c = int_ciphers[i].load();
            break;
        }

    if (c == NULL)
        return PXE_NO_CIPHER;

    *res = c;
    return 0;
}

int px_find_digest ( const char *  name,
PX_MD **  res 
)

Definition at line 579 of file internal.c.

Referenced by add_entropy(), pg_digest(), pgp_load_digest(), px_crypt_md5(), px_find_hmac(), and try_unix_std().

{
    const struct int_digest *p;
    PX_MD      *h;

    for (p = int_digest_list; p->name; p++)
        if (pg_strcasecmp(p->name, name) == 0)
        {
            h = px_alloc(sizeof(*h));
            p->init(h);

            *res = h;

            return 0;
        }
    return PXE_NO_HASH;
}

int px_get_pseudo_random_bytes ( uint8 dst,
unsigned  count 
)

Definition at line 627 of file internal.c.

Referenced by pgp_s2k_fill(), and px_gen_salt().

{
    return px_get_random_bytes(dst, count);
}

int px_get_random_bytes ( uint8 dst,
unsigned  count 
)
static PX_Cipher* rj_128_cbc ( void   )  [static]

Definition at line 532 of file internal.c.

References MODE_CBC, and rj_load().

{
    return rj_load(MODE_CBC);
}

static PX_Cipher* rj_128_ecb ( void   )  [static]

Definition at line 526 of file internal.c.

References MODE_ECB, and rj_load().

{
    return rj_load(MODE_ECB);
}

static unsigned rj_block_size ( PX_Cipher c  )  [static]

Definition at line 282 of file internal.c.

{
    return 128 / 8;
}

static int rj_decrypt ( PX_Cipher c,
const uint8 data,
unsigned  dlen,
uint8 res 
) [static]

Definition at line 359 of file internal.c.

References aes_cbc_decrypt(), aes_ecb_decrypt(), int_ctx::ctx, cx(), int_ctx::is_init, int_ctx::iv, int_ctx::mode, MODE_CBC, px_cipher::ptr, PXE_CIPHER_INIT, int_ctx::rj, and rj_real_init().

{
    struct int_ctx *cx = (struct int_ctx *) c->ptr;

    if (!cx->is_init)
        if (rj_real_init(cx, 0))
            return PXE_CIPHER_INIT;

    if (dlen == 0)
        return 0;

    if (dlen & 15)
        return PXE_NOTBLOCKSIZE;

    memcpy(res, data, dlen);

    if (cx->mode == MODE_CBC)
    {
        aes_cbc_decrypt(&cx->ctx.rj, cx->iv, res, dlen);
        memcpy(cx->iv, data + dlen - 16, 16);
    }
    else
        aes_ecb_decrypt(&cx->ctx.rj, res, dlen);

    return 0;
}

static int rj_encrypt ( PX_Cipher c,
const uint8 data,
unsigned  dlen,
uint8 res 
) [static]

Definition at line 329 of file internal.c.

References aes_cbc_encrypt(), aes_ecb_encrypt(), int_ctx::ctx, cx(), int_ctx::is_init, int_ctx::iv, int_ctx::mode, MODE_CBC, px_cipher::ptr, PXE_CIPHER_INIT, int_ctx::rj, and rj_real_init().

{
    struct int_ctx *cx = (struct int_ctx *) c->ptr;

    if (!cx->is_init)
    {
        if (rj_real_init(cx, 1))
            return PXE_CIPHER_INIT;
    }

    if (dlen == 0)
        return 0;

    if (dlen & 15)
        return PXE_NOTBLOCKSIZE;

    memcpy(res, data, dlen);

    if (cx->mode == MODE_CBC)
    {
        aes_cbc_encrypt(&cx->ctx.rj, cx->iv, res, dlen);
        memcpy(cx->iv, res + dlen - 16, 16);
    }
    else
        aes_ecb_encrypt(&cx->ctx.rj, res, dlen);

    return 0;
}

static int rj_init ( PX_Cipher c,
const uint8 key,
unsigned  klen,
const uint8 iv 
) [static]

Definition at line 300 of file internal.c.

References cx(), int_ctx::iv, int_ctx::keybuf, int_ctx::keylen, and px_cipher::ptr.

{
    struct int_ctx *cx = (struct int_ctx *) c->ptr;

    if (klen <= 128 / 8)
        cx->keylen = 128 / 8;
    else if (klen <= 192 / 8)
        cx->keylen = 192 / 8;
    else if (klen <= 256 / 8)
        cx->keylen = 256 / 8;
    else
        return PXE_KEY_TOO_BIG;

    memcpy(&cx->keybuf, key, klen);

    if (iv)
        memcpy(cx->iv, iv, 128 / 8);

    return 0;
}

static unsigned rj_iv_size ( PX_Cipher c  )  [static]

Definition at line 294 of file internal.c.

{
    return 128 / 8;
}

static unsigned rj_key_size ( PX_Cipher c  )  [static]

Definition at line 288 of file internal.c.

{
    return 256 / 8;
}

static PX_Cipher* rj_load ( int  mode  )  [static]

Definition at line 391 of file internal.c.

References px_cipher::block_size, px_cipher::decrypt, px_cipher::encrypt, px_cipher::free, px_cipher::init, px_cipher::iv_size, px_cipher::key_size, int_ctx::mode, px_cipher::ptr, and px_alloc.

Referenced by rj_128_cbc(), and rj_128_ecb().

{
    PX_Cipher  *c;
    struct int_ctx *cx;

    c = px_alloc(sizeof *c);
    memset(c, 0, sizeof *c);

    c->block_size = rj_block_size;
    c->key_size = rj_key_size;
    c->iv_size = rj_iv_size;
    c->init = rj_init;
    c->encrypt = rj_encrypt;
    c->decrypt = rj_decrypt;
    c->free = intctx_free;

    cx = px_alloc(sizeof *cx);
    memset(cx, 0, sizeof *cx);
    cx->mode = mode;

    c->ptr = cx;
    return c;
}

static int rj_real_init ( struct int_ctx cx,
int  dir 
) [static]

Definition at line 322 of file internal.c.

References aes_set_key(), int_ctx::ctx, int_ctx::keybuf, int_ctx::keylen, and int_ctx::rj.

Referenced by rj_decrypt(), and rj_encrypt().

{
    aes_set_key(&cx->ctx.rj, cx->keybuf, cx->keylen * 8, dir);
    return 0;
}

static void system_reseed ( void   )  [static]

Definition at line 636 of file internal.c.

References buf, check_time, fortuna_add_entropy(), NULL, px_acquire_system_randomness(), px_get_random_bytes(), seed_time, skip(), SYSTEM_RESEED_CHECK_TIME, SYSTEM_RESEED_MAX, and SYSTEM_RESEED_MIN.

Referenced by px_add_entropy(), and px_get_random_bytes().

{
    uint8       buf[1024];
    int         n;
    time_t      t;
    int         skip = 1;

    t = time(NULL);

    if (seed_time == 0)
        skip = 0;
    else if ((t - seed_time) < SYSTEM_RESEED_MIN)
        skip = 1;
    else if ((t - seed_time) > SYSTEM_RESEED_MAX)
        skip = 0;
    else if (check_time == 0 ||
             (t - check_time) > SYSTEM_RESEED_CHECK_TIME)
    {
        check_time = t;

        /* roll dice */
        px_get_random_bytes(buf, 1);
        skip = buf[0] >= SYSTEM_RESEED_CHANCE;
    }
    /* clear 1 byte */
    memset(buf, 0, sizeof(buf));

    if (skip)
        return;

    n = px_acquire_system_randomness(buf);
    if (n > 0)
        fortuna_add_entropy(buf, n);

    seed_time = t;
    memset(buf, 0, sizeof(buf));
}


Variable Documentation

time_t check_time = 0 [static]

Definition at line 633 of file internal.c.

Referenced by system_reseed().

const PX_Alias int_aliases[] [static]
Initial value:
 {
    {"bf", "bf-cbc"},
    {"blowfish", "bf-cbc"},
    {"aes", "aes-128-cbc"},
    {"aes-ecb", "aes-128-ecb"},
    {"aes-cbc", "aes-128-cbc"},
    {"aes-128", "aes-128-cbc"},
    {"rijndael", "aes-128-cbc"},
    {"rijndael-128", "aes-128-cbc"},
    {NULL, NULL}
}

Definition at line 564 of file internal.c.

struct int_cipher int_ciphers[] [static]
Initial value:
 {
    {"bf-cbc", bf_cbc_load},
    {"bf-ecb", bf_ecb_load},
    {"aes-128-cbc", rj_128_cbc},
    {"aes-128-ecb", rj_128_ecb},
    {NULL, NULL}
}

Definition at line 556 of file internal.c.

struct int_digest int_digest_list[] [static]
Initial value:
 {
    {"md5", init_md5},
    {"sha1", init_sha1},
    {"sha224", init_sha224},
    {"sha256", init_sha256},
    {"sha384", init_sha384},
    {"sha512", init_sha512},
    {NULL, NULL}
}

Definition at line 92 of file internal.c.

time_t seed_time = 0 [static]

Definition at line 632 of file internal.c.

Referenced by system_reseed().