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

/*ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜDEFINES*/
/*ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßR34_10_2001_gen_public_key*/
int CrypC_LR34_10_2001_gen_public_key(struct LR34_10_2001 *Context)
/*ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ*/
/*                  ëçšá«¥­š¥ š ãáâ ­®¢ª  ®âªàëâ®£® ª«îç                     */
/*                  ¢ ª®­â¥ªáâ ®¡à ¡®âªš æšäà®¢®© ¯®€¯šáš                     */
/*                    á ãáâ ­®¢«¥­­ë¬ á¥ªà¥â­ë¬ ª«îç®¬                        */
/*                             3410-2001                                 */
/* å®€­ë¥ ¯ à ¬¥âàë:                                                         */
/* - ª § â¥«ì ­  ¡ãä¥à ª®­â¥ªáâ : *Context (áâàãªâãà ).                      */
/* ëå®€:                                                                     */
/* - ®­â¥ªáâ, £®â®¢ë© ª ¢ëçšá«¥­šî š ¯à®¢¥àª¥ æšäà®¢®© ¯®€¯šáš.              */
/* ®€ë ¢®§¢à â :                                                             */
/* - RET_OK                - ­®à¬ «ì­®¥ § ¢¥àè¥­š¥.                           */
/* - RET_INCORRECTCONTEXT  - ¯¥à¥€ ­ š­šæš «š§šà®¢ ­­ë© ª®­â¥ªáâ €à. à¥Šš¬ .  */
/* - RET_CONTEXTNOREADY    - ­¥ š­šæš «š§šà®¢ ­ë ¯ à ¬¥âàë ¯®€¯šáš.           */
/* - RET_KEYALREADYPRESENT - ãŠ¥ ãáâ ­®¢«¥­ ®âªàëâë© ª«îç.                    */
/* - RET_KEYNOTPRESENT     - ­¥ ãáâ ­®¢«¥­ á¥ªà¥â­ë© ª«îç.                    */
/* - RET_INVALIDPARAMETER  - ­ã«¥¢®© ãª § â¥«ì ­  ®¡ï§ â¥«ì­ë© ¯ à ¬¥âà.      */
/*ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ*/
#define P_      (Context->P_)
#define Q_      (Context->Q_)
#define QG_     (Context->QG_)
#define AP_     (Context->AP_)
#define SK_     (Context->SecretKey)
#define PK_     (Context->PublicKey)
#define P_Bytes (Context->P_Size)
#define P_Words (Context->P_Size/4)
#define Q_Bytes (Context->Q_Size)
#define Q_Words (Context->Q_Size/4)
{
         int  i,Ret;

     if(! Context)
  Ret = RET_INVALIDPARAMETER;
else
if((Context->Mark      & GOST_XXXXX_Marker_Mask ==
    R34_10_2001_Marker & GOST_XXXXX_Marker_Mask   ) &&
   (Context->Mark                                  !=
    R34_10_2001_Marker                            )   )
  Ret = RET_INCORRECTCONTEXT;
else if(!(Context->IsReady & R34_10_2001_CONTEXT))
  Ret = RET_CONTEXTNOTREADY;
else if( (Context->IsReady & R34_10_2001_PUBLICKEY))
  Ret = RET_KEYALREADYPRESENT;
else if(!(Context->IsReady & R34_10_2001_SECRETKEY))
  Ret = RET_KEYNOTPRESENT;
else  
  {
  /*  §¬ áªšà®¢ ­š¥ á¥ªà¥â­®£® ª«îç .*/
  for(i=0;i<Q_Words;i++)
     ((DWORD *)SK_)[i        ] +=
     ((DWORD *)SK_)[i+Q_Words]  ;

  /* ëçšá«¥­š¥ ®âªàëâ®£® ª«îç . */
  CrypC_LCuPower(&AP_, SK_, &PK_, Context);                      /* PK_ = (AP_)*SK_ */

  /*  áªšà®¢ ­š¥ ª«îç . */
  CrypC_Mask_SecretKey_(Context->RS, SK_);
    
  Context->IsReady |= R34_10_2001_PUBLICKEY;
  Ret = RET_OK;
  }
return(Ret);
}
/*ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜR34_10_2001_gen_public_key*/
/*ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßEOF*/
