#include <stdio.h>
#include "CrC_User.h"

/*▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄DEFINES*/
/*▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀R34_11_1994_init*/
int CrypC_R34_11_1994_init(struct R34_11_1994 *Context, struct COM_State *PE, struct RND_State *State, void *Sync)
/*────────────────────────────────────────────────────────────────────────────*/
/*                        Инициализация контекста                             */
/*                         выработки хэш-вектора                              */
/* Входные параметры:                                                         */
/* - Указатель на буфер контекста: *Context (структура).                      */
/* - Указатель на буфер начального значения хэш-вектора *Sync (NQ*2 байта).   */
/*             Если указатель равен 0, то принимается нулевое заполнение.     */
/* Выход:                                                                     */
/* - Контекст, готовый к выработке хэш-вектора.                               */
/* Коды возврата:                                                             */
/* - RET_OK                                                                   */
/* - RET_INCORRECTCONTEXT  - передан инициализированный контекст др. режима.  */
/* - RET_CONTEXTNOTCLEAR                                                      */
/* - RET_INVALIDPARAMETER  - нулевой указатель на обязательный параметр.      */
/*────────────────────────────────────────────────────────────────────────────*/
{
	 int  i, Ret;

/* Вызов процедуры формирования  модифицированного массива перестановок       */
/* для криптосхемы ГОСТ 28147-89:                                             */
CrypC__InitGost( (BYTE *)PE->Perms, PE->K_ );

if(!Context || !State)
  Ret = RET_INVALIDPARAMETER;
else
if((Context->Mark     & GOST_XXXXX_Marker_Mask ==
    R34_11_1994_Marker & GOST_XXXXX_Marker_Mask   ) &&
   (Context->Mark                                  !=
    R34_11_1994_Marker                            )   )
  Ret = RET_INCORRECTCONTEXT;
else if(Context->IsReady)
  Ret = RET_CONTEXTNOTCLEAR;
else
  {
  if(Context->Mark != R34_11_1994_Marker)
    CrypC_R34_11_1994_clear(Context);

  Context->RS = State;                   /* Указатель на контекст ГСЧ.        */
  Context->PE = PE;                      /* Указатель на контекст подстановок.*/

  if(Sync)
    memcpy        (Context->Digest,Sync,LNQ*4);/* Начальное сост. хэш-вектора.*/
  else
    memset        (Context->Digest,   0,LNQ*4);/* Синхропосылка по умолчанию. */
  CrypC_NetToHost (Context->Digest     ,    8);/* Net to Host Byteorder.      */
  memset          (Context->SumVec,   0,LNQ*4);/* Начальное сост. Sum-вектора.*/
    
  Context->MsgLength = 0;                   /* Счетчик суммарной длины.       */
  Context->BlockOffs = 0;                   /* Поз-я. в буфере накоп-я блока. */

  Context->IsReady = 1;
  Ret = RET_OK;
  }
return(Ret);
}
/*▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄R34_11_1994_init*/
/*▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀EOF*/
