Branch: Tag:

2004-02-13

2004-02-13 23:27:29 by Martin Nilsson <mani@lysator.liu.se>

Allow crypt_md5 to run in a thread. Added flags.

Rev: src/post_modules/Nettle/nettle.cmod:1.32

1:   /* nettle.cmod -*- c -*- */      #include "global.h" - RCSID("$Id: nettle.cmod,v 1.31 2004/02/04 21:36:29 nilsson Exp $"); + RCSID("$Id: nettle.cmod,v 1.32 2004/02/13 23:27:29 nilsson Exp $");   #include "interpret.h"   #include "svalue.h"   /* For this_object() */   #include "object.h"   #include "operators.h"   #include "module_support.h" -  + #include "threads.h"      #include "nettle_config.h"   
51:    *! @seealso    *! @[update]    */ -  PIKEFUN void create(void|int arg) { +  PIKEFUN void create(void|int arg) +  {    INT32 num = 0;       if(arg) {
83:    *! @[min_seed_size], @[get_seed], @[is_seeded]    */    PIKEFUN object seed(string data) +  optflags OPT_SIDE_EFFECT;    {    if(data->len < YARROW256_SEED_FILE_SIZE)    Pike_error( "Seed must be at least 32 characters.\n" );
99:    *! @[seed]    */    PIKEFUN int(0..) min_seed_size() +  optflags OPT_TRY_OPTIMIZE;    {    RETURN YARROW256_SEED_FILE_SIZE;    }
110:    *! @[seed]    */    PIKEFUN string get_seed() +  optflags OPT_EXTERNAL_DEPEND;    {    if( !yarrow256_is_seeded(&THIS->ctx) )    Pike_error("Random generator not seeded.\n"); -  RETURN make_shared_binary_string(THIS->ctx.seed_file, YARROW256_SEED_FILE_SIZE); +  RETURN make_shared_binary_string(THIS->ctx.seed_file, +  YARROW256_SEED_FILE_SIZE);    }       /*! @decl int(0..1) is_seeded()
123:    *! @[seed]    */    PIKEFUN int(0..1) is_seeded() +  optflags OPT_EXTERNAL_DEPEND;    {    RETURN yarrow256_is_seeded(&THIS->ctx);    }
133:    *! this.    */    PIKEFUN void force_reseed() +  optflags OPT_SIDE_EFFECT;    {    yarrow256_force_reseed(&THIS->ctx);    }
144:    *! @[create]    */    PIKEFUN int(0..1) update(string data, int source, int entropy) +  optflags OPT_SIDE_EFFECT;    {    /* FIXME: Wide strings could actually be supported here */    NO_WIDE_STRING(data);
163:    *! slow reseed will happen.    */    PIKEFUN int(0..) needed_sources() +  optflags OPT_EXTERNAL_DEPEND;    {    RETURN yarrow256_needed_sources(&THIS->ctx);    }
171:    *! Returns a pseudo-random string of the requested @[length].    */    PIKEFUN string random_string(int length) +  optflags OPT_EXTERNAL_DEPEND|OPT_SIDE_EFFECT; +  /* We could however set this to not have side effect to allow +  unused values from not getting generated. */    {    struct pike_string *rnd;    if(length < 0)
204:    *! It is assumed that @[salt] does not contain "$".    */   PIKEFUN string crypt_md5(string pw, string salt) +  optflags OPT_TRY_OPTIMIZE;   {    NO_WIDE_STRING(pw);    NO_WIDE_STRING(salt); -  RETURN make_shared_string(crypt_md5(pw->len, pw->str, -  salt->len, salt->str)); +  THREADS_ALLOW(); +  push_text(crypt_md5(pw->len, pw->str,salt->len, salt->str)); +  THREADS_DISALLOW();   }      
369:    *! an @[LFUN::`()], that LFUN will be called. If it is a function,    *! that function will be called with @[args] as arguments.    */ -  PIKEFUN void create(program|object|function cipher, mixed ... more) { +  PIKEFUN void create(program|object|function cipher, mixed ... more) +  flags ID_STATIC; +  {    int old_block_size = THIS->block_size;    THIS->object = make_cipher_object(args);   
398:    *! Returns the string @expr{"CBC(x)"@} where x is the    *! encapsulated algorithm.    */ -  PIKEFUN string name() { +  PIKEFUN string name() +  optflags OPT_TRY_OPTIMIZE; +  {    push_constant_text("CBC(");    safe_apply(THIS->object, "name", 0);    push_constant_text(")");
408:    /*! @decl int block_size()    *! Reurns the block size of the encapsulated cipher.    */ -  PIKEFUN int block_size() { +  PIKEFUN int block_size() +  optflags OPT_TRY_OPTIMIZE; +  {    RETURN THIS->block_size;    }       /*! @decl int key_size()    *! Returns the key size of the encapsulated cipher.    */ -  PIKEFUN int key_size() { +  PIKEFUN int key_size() +  optflags OPT_EXTERNAL_DEPEND; +  {    safe_apply(THIS->object, "key_size", args);    }   
423:    *! Prepare the cipher and the wrapper for encrypting    *! with the given @[key].    */ -  PIKEFUN object set_encrypt_key(string key) { +  PIKEFUN object set_encrypt_key(string key) +  optflags OPT_SIDE_EFFECT; +  {    assert(THIS->block_size);    THIS->mode = 0;    safe_apply(THIS->object, "set_encrypt_key", args);
435:    *! Prepare the cipher and the wrapper for decrypting    *! with the given @[key].    */ -  PIKEFUN object set_decrypt_key(string key) { +  PIKEFUN object set_decrypt_key(string key) +  optflags OPT_SIDE_EFFECT; +  {    assert(THIS->block_size);    THIS->mode = 1;    safe_apply(THIS->object, "set_decrypt_key", args);
446:    /*! @decl this_program set_iv(string iv)    *! Set the initialization vector to @[iv].    */ -  PIKEFUN object set_iv(string iv) { +  PIKEFUN object set_iv(string iv) +  optflags OPT_SIDE_EFFECT; +  {    assert(THIS->iv);    NO_WIDE_STRING(iv);    if(iv->len != THIS->block_size)
527:    *! an @[LFUN::`()], that LFUN will be called. If it is a function,    *! that function will be called with @[args] as arguments.    */ -  PIKEFUN void create(program|object|function cipher, mixed ... more) { +  PIKEFUN void create(program|object|function cipher, mixed ... more) +  flags ID_STATIC; +  {    THIS->object = make_cipher_object(args);       safe_apply(THIS->object, "block_size", 0);
550:    *! Returns the string @expr{"CBC(x)"@} where x is the    *! encapsulated algorithm.    */ -  PIKEFUN string name() { +  PIKEFUN string name() +  optflags OPT_TRY_OPTIMIZE; +  {    push_constant_text("Proxy(");    safe_apply(THIS->object, "name", 0);    push_constant_text(")");
561:    *!    *! Get the block size of the contained block crypto.    */ -  PIKEFUN int block_size() { +  PIKEFUN int block_size() +  optflags OPT_TRY_OPTIMIZE; +  {    RETURN THIS->block_size;    }   
569:    *!    *! Get the key size of the contained block crypto.    */ -  PIKEFUN int key_size() { +  PIKEFUN int key_size() +  optflags OPT_EXTERNAL_DEPEND; +  {    safe_apply(THIS->object, "key_size", args);    }   
580:    *! @note    *! As a side-effect any buffered data will be cleared.    */ -  PIKEFUN object set_encrypt_key(string key) { +  PIKEFUN object set_encrypt_key(string key) +  optflags OPT_SIDE_EFFECT; +  {    MEMSET(THIS->backlog, 0, THIS->block_size);    THIS->backlog_len = 0;    safe_apply(THIS->object, "set_encrypt_key", args);
595:    *! @note    *! As a side-effect any buffered data will be cleared.    */ -  PIKEFUN object set_decrypt_key(string key) { +  PIKEFUN object set_decrypt_key(string key) +  optflags OPT_SIDE_EFFECT; +  {    MEMSET(THIS->backlog, 0, THIS->block_size);    THIS->backlog_len = 0;    safe_apply(THIS->object, "set_decrypt_key", args);