01e115 | 2003-03-12 | Niels Möller | | /* nettle.cmod -*- c -*- */
#include "global.h"
|
25f543 | 2003-08-06 | Martin Nilsson | | RCSID("$Id: nettle.cmod,v 1.10 2003/08/06 00:50:16 nilsson Exp $");
|
01e115 | 2003-03-12 | Niels Möller | | #include "interpret.h"
#include "svalue.h"
/* For this_object() */
#include "object.h"
#include "module_support.h"
|
4e1f62 | 2003-03-13 | Niels Möller | | #include "nettle_config.h"
|
770fee | 2003-03-12 | Henrik Grubbström (Grubba) | | #ifdef HAVE_LIBNETTLE
|
d74599 | 2003-08-05 | Martin Nilsson | | #include "nettle/yarrow.h"
|
01e115 | 2003-03-12 | Niels Möller | | #include "nettle.h"
#include <assert.h>
#include <stdio.h>
#include <stdarg.h>
DECLARATIONS
/*! @module Nettle
|
d74599 | 2003-08-05 | Martin Nilsson | | *! Low level crypto functions used by the @[Crypto] module. Unless
*! you are doing something very special, you would want to use the
*! Crypto module instead.
*/
/*! @class Yarrow
*!
*! Yarrow is a family of pseudo-randomness generators, designed for
*! cryptographic use, by John Kelsey, Bruce Schneier and Niels Ferguson.
*! Yarrow-160 is described in a paper at
*! @url{http://www.counterpane.com/yarrow.html@}, and it uses SHA1 and
*! triple-DES, and has a 160-bit internal state. Nettle implements
*! Yarrow-256, which is similar, but uses SHA256 and AES to get an
*! internal state of 256 bits.
*/
PIKECLASS Yarrow
{
|
25f543 | 2003-08-06 | Martin Nilsson | | CVAR struct yarrow256_ctx *ctx;
CVAR struct yarrow_source *sources;
PIKEFUN void create(void|int arg) {
INT32 num = 0;
THIS->sources = NULL;
if(arg) {
if (arg->type != PIKE_T_INT)
Pike_error("Bad argument type.\n");
num = arg->u.integer;
if(num < 0)
Pike_error("Invalid number of sources.\n");
THIS->sources = xalloc(sizeof(struct yarrow_source)*num);
}
yarrow256_init(THIS->ctx, num, THIS->sources);
|
d74599 | 2003-08-05 | Martin Nilsson | | }
/*! @decl Yarrow seed(string data)
*! The random generator needs to be seeded before
*! it can be used. The seed must be at least 32
*! characters long. The seed could be stored from
*! a previous run by inserting the value returned
*! from @[get_seed].
*! @returns
*! Returns the called object.
*/
PIKEFUN object seed(string data)
{
if(data->len < YARROW256_SEED_FILE_SIZE)
Pike_error( "Seed must be at least 32 characters.\n" );
NO_WIDE_STRING(data);
yarrow256_seed(THIS->ctx, data->len, data->str);
RETURN this_object();
}
/*! @decl string get_seed()
*! Returns part of the internal state so that it can
*! be saved for later seeding.
*/
PIKEFUN string get_seed()
{
RETURN make_shared_string(THIS->ctx->seed_file);
}
/*! @decl int(0..1) is_seeded()
*! Returns 1 if the random generator is seeded and ready
*! to generator output. 0 otherwise.
*/
PIKEFUN int(0..1) is_seeded()
{
RETURN yarrow256_is_seeded(THIS->ctx);
}
PIKEFUN void force_reseed()
{
yarrow256_force_reseed(THIS->ctx);
}
PIKEFUN int(0..) needed_sources()
{
RETURN yarrow256_needed_sources(THIS->ctx);
}
/*! @decl string random_string(int length)
*! Returns a pseudo-random string of the requested @[length].
*/
PIKEFUN string random_string(int length)
{
struct pike_string *rnd;
if(length < 0)
Pike_error("Invalid length, must be positive.\n");
if( !yarrow256_is_seeded(THIS->ctx) )
Pike_error("Random generator not seeded.\n");
rnd = begin_shared_string(length);
yarrow256_random(THIS->ctx, length, rnd->str);
RETURN end_shared_string(rnd);
}
INIT
{
THIS->ctx = xalloc(sizeof(struct yarrow256_ctx));
|
25f543 | 2003-08-06 | Martin Nilsson | | THIS->ctx->nsources = 0;
|
d74599 | 2003-08-05 | Martin Nilsson | | }
EXIT
{
|
25f543 | 2003-08-06 | Martin Nilsson | | if(THIS->ctx->nsources) free(THIS->sources);
|
d74599 | 2003-08-05 | Martin Nilsson | | free(THIS->ctx);
}
}
/*! @endclass
|
01e115 | 2003-03-12 | Niels Möller | | */
|
1ab4b1 | 2003-03-18 | Niels Möller | | /*! @endmodule
*/
|
770fee | 2003-03-12 | Henrik Grubbström (Grubba) | |
|
654f15 | 2003-03-14 | Marcus Comstedt | | #endif /* HAVE_LIBNETTLE */
|
4e1f62 | 2003-03-13 | Niels Möller | | PIKE_MODULE_INIT
{
INIT;
|
654f15 | 2003-03-14 | Marcus Comstedt | | #ifdef HAVE_LIBNETTLE
|
4e1f62 | 2003-03-13 | Niels Möller | | hash_init();
|
636c42 | 2003-03-18 | Niels Möller | | cipher_init();
|
654f15 | 2003-03-14 | Marcus Comstedt | | #endif /* HAVE_LIBNETTLE */
|
4e1f62 | 2003-03-13 | Niels Möller | | }
PIKE_MODULE_EXIT
{
|
654f15 | 2003-03-14 | Marcus Comstedt | | #ifdef HAVE_LIBNETTLE
|
636c42 | 2003-03-18 | Niels Möller | | cipher_exit();
|
4e1f62 | 2003-03-13 | Niels Möller | | hash_exit();
|
654f15 | 2003-03-14 | Marcus Comstedt | | #endif /* HAVE_LIBNETTLE */
|
4e1f62 | 2003-03-13 | Niels Möller | | EXIT;
}
|