Branch: Tag:

2013-10-05

2013-10-05 13:05:57 by Henrik Grubbström (Grubba) <grubba@grubba.org>

Nettle.Hash: Major refactoring of the hashes.

The hash state now uses parent pointers instead of mixins.

Renamed Nettle.<HASH>_Info to Nettle.<HASH> and
moved Nettle.<HASH>_State to Nettle.<HASH>.State.

Adjusted the corresponding code in Crypto, so that the APIs
there should be the same as before.

3:    * Cmod header-file acting as a template for the hash classes.    */    - DOCSTART() @class cmod_CONCAT_EVAL(PIKE_NAME, _Info) + DOCSTART() @class PIKE_NAME    *! -  *! Internal mixin class, intended to be multiply inherited -  *! together with HashInfo. +  *! Implementation of the PIKE_NAME hash algorithm. +  *!   DOCEND() - PIKECLASS cmod_CONCAT_EVAL(PIKE_NAME, _Info) + PIKECLASS PIKE_NAME   { -  +  DOCSTART() @decl inherit Hash +  DOCEND() +  INHERIT Hash; +     INIT    { -  struct HashInfo_struct *HashInfo -  = (struct HashInfo_struct *) get_storage(Pike_fp->current_object, -  HashInfo_program); +  /* FIXME: Ought to traverse the inherit graph for +  * the current program. +  */ +  struct Hash_struct *Hash +  = (struct Hash_struct *) get_storage(Pike_fp->current_object, +  Hash_program);    -  werror(cmod_STRFY_EVAL(PIKE_NAME) "_Info->INIT\n"); +  werror(cmod_STRFY_EVAL(PIKE_NAME) "->INIT\n");    -  if (HashInfo && !HashInfo->meta) -  HashInfo->meta = &cmod_CONCAT_EVAL(nettle_, NETTLE_NAME); +  if (Hash && !Hash->meta) +  Hash->meta = &cmod_CONCAT_EVAL(nettle_, NETTLE_NAME);    else {    /* Can't call Pike_error here.    * Pike_error("Can't initialize this object.\n"); */ -  werror(cmod_STRFY_EVAL(PIKE_NAME) "_Info->INIT failed\n"); +  werror(cmod_STRFY_EVAL(PIKE_NAME) "->INIT failed\n");    }    } - } +     - DOCSTART() @endclass cmod_CONCAT_EVAL(PIKE_NAME, _Info) - DOCEND() -  - DOCSTART() @class cmod_CONCAT_EVAL(PIKE_NAME, _State) +  DOCSTART() @class State    *!    *! State for PIKE_NAME hashing. -  +  *!    DOCEND() - PIKECLASS cmod_CONCAT_EVAL(PIKE_NAME, _State) +  PIKECLASS State +  program_flags PROGRAM_NEEDS_PARENT|PROGRAM_USES_PARENT;    { -  INHERIT cmod_CONCAT_EVAL(PIKE_NAME, _Info); -  INHERIT HashState; +  EXTRA +  { +  /* Perform an inherit of the HashState class that our parent +  * contains via its inherit of HashInfo. +  */ +  struct program *parent_prog = Pike_compiler->previous->new_program; +  struct object *parent_obj = Pike_compiler->previous->fake_object; +  int parent_State_fun_num = +  really_low_find_shared_string_identifier(MK_STRING("State"), +  parent_prog, +  SEE_PROTECTED|SEE_PRIVATE); +  if (parent_State_fun_num >= 0) { +  struct program *parent_State_prog = +  low_program_from_function(parent_obj, parent_State_fun_num); +  if (parent_State_prog) { +  DOCSTART() @decl inherit Hash::State +  *! +  *! Inherits @[Nettle.Hash.State] via +  *! the inherit of @[Nettle.Hash] in our +  *! parent (@[Hash]). +  DOCEND() +  low_inherit(parent_State_prog, 0, +  parent_State_fun_num + +  parent_prog->inherits[1].identifier_level, +  1 + 42, 0, NULL); +  } +  } +  } +     CVAR struct cmod_CONCAT_EVAL(NETTLE_NAME, _ctx) NETTLE_NAME;       INIT    { -  struct HashState_struct *instance -  = (struct HashState_struct *) get_storage(Pike_fp->current_object, -  HashState_program); -  werror(cmod_STRFY_EVAL(PIKE_NAME) "_State->INIT\n"); +  /* FIXME: Ought to traverse the inherit graph for +  * the current program. +  */ +  struct Hash_State_struct *instance +  = (struct Hash_State_struct *) +  get_storage(Pike_fp->current_object, Hash_State_program); +  werror(cmod_STRFY_EVAL(PIKE_NAME) ".State->INIT\n");       assert(instance);   
54:    instance->ctx = &THIS->NETTLE_NAME;    }   } - DOCSTART() @endclass cmod_CONCAT_EVAL(PIKE_NAME, _State) +  DOCSTART() @endclass State    DOCEND() -  +  + } + DOCSTART() @endclass PIKE_NAME + DOCEND() +