Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
28
Добавлен:
16.04.2013
Размер:
19.82 Кб
Скачать
/*----------------------------------------------------
  xcryptor.c -- иЁда®ў ­ЁҐ д ©«®ў Ї® ѓЋ‘’ 28147-89 Ё
		¬®¤ЁдЁЄ жЁп¬ Ї®¤ DOS/Win32.
  ђ §а Ў®в « Ђ­¤аҐ© ћа쥢Ёз ‚Ё­®Єга®ў, Ј.Њ®бЄў 
  (c) 1994-1998 FreeWare
  ‘ў®Ў®¤­®Ґ ЁбЇ®«м§®ў ­ЁҐ Ё Є®ЇЁа®ў ­ЁҐ.
  ----------------------------------------------------
  Ќ з в® 1.00     ®в 25.06.94,
  ‚ҐабЁп 2.00     ®в 05.02.95.
  ‚ҐабЁп 3.00     ®в 08.03.98.
  ‚ҐабЁп 3.00     ®в 16.04.98.
  ‚ҐабЁп 3.01     ®в 07.07.98.

  Њ®¤ЁдЁЄ жЁп     Ѓ §®ў п ¬®¤ЁдЁЄ жЁп ¤«п i8088-80286
  Њ®¤ЁдЁЄ жЁп-386 Њ®¤ЁдЁЄ жЁп ¤«п i386  Ї®¤ „Ћ‘/Win16
  Њ®¤ЁдЁЄ жЁп-W32 Њ®¤ЁдЁЄ жЁп ¤«п i386  Ї®¤ Win32
  ----------------------------------------------------
  ‚­Ё¬ ­ЁҐ :
  ‚ўЁ¤г ­ «ЁзЁп ®иЁЎ®Є ў ўҐабЁЁ 1.00,  ®ЇгЎ«ЁЄ®ў ­­®©
  ў "Њ®­Ёв®аҐ" N 1/95 Ё в Є¦Ґ а бЇа®бв࠭塞®© б "Њ®-
  ­Ёв®а-¤ЁбЄ®¬", ¤ ­­ п Їа®Ја ¬¬   ­Ґ ў® ўбҐе ०Ё¬ е
  б®ў¬ҐбвЁ¬  б гЄ § ­­®© ўҐабЁҐ©  Ї® १г«мв в ¬ иЁд-
  а®ў ­Ёп.
  ----------------------------------------------------
  „®Ў ў«Ґ­Ёп ў ўҐабЁЁ 2.0   (ўҐабЁп 1.0  ®ЇгЎ«ЁЄ®ў ­ 
  ў ¬®­Ёв®аҐ N1/95)
  -- inline help;
  -- ў®§¬®¦­®бвм § иЁда®ўлў вм д ©«л ¤«Ё­®©,Єа в­®© 8
     б Ї®¬®ймо  «Ј®аЁв¬  Їа®бв®© § ¬Ґ­л; ќв® Ї®ў«ҐЄ«®
     § ¬Ґ­г дг­ЄжЁЁ а биЁаҐ­Ёп Є«оз  ­  ExpKey33;
  -- а § а Ў®в ­ ў аЁ ­в ¤«п 32-ЎЁв®ўле Їа®жҐбб®а®ў
     ᥬҐ©бвў  Intel 80x86;
  -- Ёб祧«  ў®§¬®¦­®бвм  § Јаг¦ вм а биЁаҐ­­л©  Є«оз
     ¤«Ё­®© 128 Ў ©в;  ¤«Ё­   § Јаг¦ Ґ¬®Ј® Є«оз  - 32
     Ў ©в ;
  -- ЎгдҐа  ¤«п з⥭Ёп д ©«  ўл¤Ґ«пҐвбп ¤Ё­ ¬ЁзҐбЄЁ Ё
     ҐЈ® а §¬Ґа®¬  ¬®¦­® гЇа ў«пвм;
  -- ¤®Ў ўЁ« бм Ў®«ҐҐ  ®ЎиЁа­ п ¤Ё Ј­®бвЁЄ  ®иЁЎ®Є ў®
     ўе®¤­ле ¤ ­­ле;
  ----------------------------------------------------
  „®Ў ў«Ґ­Ёп ў ўҐабЁЁ 3.00
  -- Їа®Ё§ў®«м­л© а §¬Ґа  Є«оз ,  ®¤­ Є® ў® Ё§ЎҐ¦ ­ЁҐ
     иЁда®ў ­Ёп б ®зҐ­м  ¤«Ё­­л¬ Є«о箬 зЁб«® а г­¤®ў
     ®Ја ­ЁзҐ­® Є®­бв ­в®© MaxKeyItems,   Ё§­ з «м­ п
     ҐҐ гбв ­®ўЄ  - 128, ў бв ­¤ а⥠- 32;
  -- Їа®Ё§ў®«м­ п б奬  ЁбЇ®«м§®ў ­Ёп н«Ґ¬Ґ­в®ў Є«оз ,
     § ¤ Ґвбп ў Є«озҐ Є®¬ ­¤­®© бва®ЄЁ /m{0|1}...,
     нв® Ї®ў«ҐЄ«® §  б®Ў®© ЁбЇ®«м§®ў ­ЁҐ  ў Їа®Ја ¬¬Ґ
     г­ЁўҐаб «м­®© дг­ЄжЁЁ а биЁаҐ­Ёп Є«оз  ExpKey;
  -- бЁ­еа®Ї®бл«Є  ¬®¦Ґв Ўлвм Їа®Ё§ў®«м­®©,  ў ўҐабЁЁ
     2.0 ҐҐ бв аи п Ї®«®ўЁ­  ўбҐЈ¤  Ўа « бм а ў­®© 0;
  -- ЁбЇ®«м§гҐвбп ¤агЈ®© бЇ®б®Ў § ¤ ­Ёп ¬Ґв®¤  иЁда®-
     ў ­Ёп - ў ўҐабЁЁ 2.0 ®­ § ¤ ў «бп ®в¤Ґ«м­л¬ Є«о-
     箬 ў Є®¬ ­¤­®© бва®ЄҐ,    ⥯Ґам  бЁ¬ў®« ¬Ґв®¤ 
     б«Ґ¤гҐв §  бЁ¬ў®«®¬ ®ЇҐа жЁЁ - в Є Їа®йҐ;
  ----------------------------------------------------
  €§¬Ґ­Ґ­Ёп ў ўҐабЁЁ 3.01
  -- ЁбЇа ў«Ґ­   ®иЁЎЄ ,  ЇаЁў®¤Ёўи п Є ­ҐўҐа­®¬г ўл-
     зЁб«Ґ­Ёо Ё¬Ёв®ўбв ўЄЁ;
  -- Ґб«Ё а §¬Ґа ®Ў¬Ґ­­®Ј® ЎгдҐа  § ¤ ­ ­г«Ґўл¬ (/Z0)
     ®­ гбв ­ ў«Ёў Ґвбп а ў­л¬ ¬ ЄбЁ¬ «м­® ¤®ЇгбвЁ¬®-
     ¬г а §¬Ґаг;
  -- § ¤ ў п  а §¬Ґа ЎгдҐа   ў Є«озҐ /Z, ¬®¦­® гЄ §л-
     ў вм а §¬Ґа­®бвм K (ЄЁ«®Ў ©вл) Ё«Ё M (¬ҐЈ Ў ©вл
     - в®«мЄ® ¤«п Win32) - ­ ЇаЁ¬Ґа, /Z12K Ё«Ё /Z1M;
  -- Ї®Їа ў«Ґ­ ⥪бв®ўл© ўлў®¤ ў ­ҐЄ®в®але ¬Ґбв е;
  ----------------------------------------------------
  ‚ аЁ ­вл Є®¤Ёа®ў ­Ёп:
  ‘Ё¬ў®« VarKey:
  -- Ґб«Ё § ¤ ­,  ў Їа®Ја ¬¬Ґ ॠ«Ё§говбп ў®§¬®¦­®бвЁ
     ЁбЇ®«м§®ў ­Ёп Є«оз  ЇҐаҐ¬Ґ­­®Ј® а §¬Ґа  Ё Їа®Ё§-
     ў®«м­®©  ¬ бЄЁ  ­ Їа ў«Ґ­Ё©  Їа®б¬®ва  н«Ґ¬Ґ­в®ў
     Є«оз ;
  -- Ґб«Ё ­Ґ § ¤ ­, Їа®Ја ¬¬  иЁдагҐв бва®Ј® Ї® ѓЋ‘’г
     ЎҐ§ ў®§¬®¦­®бвЁ ЁбЇ®«м§®ў вм ҐЈ® ¬®¤ЁдЁЄ жЁЁ;
  ----------------------------------------------------
*/

#include <io.h> 	// open, filelength
#include <fcntl.h>	// O_xxxxx
#include <memory.h>     // memset,memcpy
#include <stdlib.h>	// strtoul,ultoa,toupper,
			// malloc,free
#include <ctype.h>      // toupper (BorlandC)
#include <stdio.h>      // printf
#include <string.h>     // strlen
#include <sys\stat.h>   // S_IREAD,S_IWRITE

#ifdef __BORLANDC__
#  include <alloc.h>      // farmalloc
#endif

#ifndef _WIN32
#  include <dos.h>      // farmalloc
#endif

#include "gost.h"       // „ ­­лҐ Ё Їа®в®вЁЇл ѓЋ‘’ 

#define DefaultBufferSize 512
#ifdef _WIN32
#  define far
#  define huge
#  define MaxBufferSize 1048576
#  define __memset memset
#  define __memcpy memcpy
#  define __malloc malloc
#  define __read(a,b,c)  _read(a,b,c)
#  define __write(a,b,c) _write(a,b,c)
#else
#  define MaxBufferSize 65528
#  define __memset _fmemset
#  define __memcpy _fmemcpy
#  define __malloc farmalloc
#  define __read(a,b,c)  (_dos_read(a,b,c,&bytesread),bytesread)
#  define __write(a,b,c) (_dos_write(a,b,c,&bytesread),bytesread)
#endif
enum { MaxKeyItems = 128 };

typedef enum
{
  O_K_=0,	    // ўбҐ O.K.
  errDoNotMatch,    // ­Ґб®ўЇ ¤Ґ­ЁҐ Ё¬Ёв®ўбв ўЄЁ
  errNoParam,       // § ЇгбЄ ЎҐ§ Ї а ¬Ґва®ў
  errInvalidFlag,   // ­ҐўҐа­л© д« Ј ўл§®ў  Їа®Ја ¬¬л
  errBadMemorySize, // ­ҐўҐа­® § ¤ ­ а §¬Ґа ЎгдҐа 
  errMissingSynchro,// ў Є«озҐ /s ­Ґв бЁ­еа®Ї®бл«ЄЁ
  errBadSynchro,    // ­ҐўҐа­® § ¤ ­  бЁ­еа®Ї®бл«Є 
  errBadImito,      // ­ҐўҐа­® § ¤ ­  Ё¬Ёв®ўбв ўЄ 
  errTooFiewParm,   // ¬ «® Ї а ¬Ґва®ў ўл§®ў 
  errTooManyParm,   // ¬­®Ј® Ї а ¬Ґва®ў ўл§®ў 
  errMissingKey,    // ў Є«озҐ /k ­Ґ § ¤ ­® Ё¬п д ©« 
  errBadKey,	    // Ї«®е®© д ©« Є«оз 
  errMissingXCHT,   // ў Є«озҐ /б ­Ґ § ¤ ­® Ё¬п д ©« 
  errBadXCHT,	    // Ї«®е®© д ©« б в Ў«ЁжҐ© § ¬Ґ­
  errInvalidOper,   // ­ҐўҐа­ п ®ЇҐа жЁп
  errSourceFailure, // ®иЁЎЄ  ­  д ©«Ґ-Ёбв®з­ЁЄҐ
  errNotDividedBy8, // ¤«Ё­  д ©«  ­Ґ Єа в­  8
  errTargetFailure, // ®иЁЎЄ  ­  д ©«Ґ-ЇаЁҐ¬­ЁЄҐ
  errRenameFailure, // ®иЁЎЄ  ЇаЁ ЇҐаҐЁ¬Ґ­®ў ­ЁЁ
  errDeleteFailure, // ®иЁЎЄ  ЇаЁ г¤ «Ґ­ЁЁ Ёбе. д ©« 
#ifdef VarKey
  errMissingScheme, // ў Є«озҐ /m ­Ґв б奬л
  errBadScheme,     // ў Є«озҐ /m § ¤ ­  ­ҐўҐа­ п б奬 
  errKeyTooLong,    // ‘«ЁиЄ®¬ ¤«Ё­­л© Є«оз иЁда®ў ­Ёп
#endif
  errInsufMemory,   // ЌҐ еў в Ґв ¤Ё­ ¬ЁзҐбЄ®© Ї ¬пвЁ
  dummy		    // дЁЄвЁў­®Ґ §­ зҐ­ЁҐ
} errList;

unsigned char chtab[1024];
void far* buffer=NULL;
unsigned long Memory=DefaultBufferSize;

Item	far *Key,       //  ¤аҐб Є«оз  иЁда®ў ­Ёп
	far *KeyImito;	//  ¤аҐб Є«оз  ўла Ў®вЄЁ
			//   Ё¬Ёв®ўбв ўЄЁ
Item    Synchro[2]=	// бЁ­еа®Ї®бл«Є 
{
  0UL,0UL
};

Item	Imito[2]=
{
  0UL,0UL
};

Item    _Imito;

errList code=O_K_;	// Є®¤ ўл室 

int	BackLink=  0;	// иЁда®ў вм б Ћ‘
int     ShowImito= 0;	// Ї®Є § вм Ё¬Ёв®ЇаЁбв ўЄг
int     CheckImito=0;	// Їа®ўҐаЁвм Ё¬Ёв®ЇаЁбв ўЄг
int     Operation= 0;	// § иЁда®ў ­ЁҐ
int	ParmCount= 0;   // бзҐвзЁЄ Ї а ¬Ґва®ў
int     Deletion=  0;	// г¤ «Ґ­ЁҐ Ёб室­ЁЄ 
int     SimpleChange=0; // Џа®бв п § ¬Ґ­ 
int     KeyRepeat= 4;   // —Ёб«® Ї®ўв®аҐ­Ё© Є«оз 
int     KeyMask=   8;   // ‘в ­¤ ав­ п ¬ бЄ  0001
int     KeySize=   32;  // —Ёб«® а г­¤®ў иЁда®ў ­Ёп
int     iKeySize=  16;  // —Ёб«® а г­¤®ў Ё¬Ёв®ўбв ўЄЁ

char	*KeyFile=  NULL;// д ©« Є«оз 
char	*ChtFile=  NULL;// д ©« в Ў«Ёжл § ¬Ґ­
char	*InFile=   NULL;// Ёб室­л© д ©«
char	*OutFile=  NULL;// д ©« १г«мв в 

#ifndef _WIN32
unsigned bytesread;     // ‚бЇ®¬®Ј в. ЇҐаҐ¬Ґ­­ п
#endif

// Џа®в®вЁЇл дг­ЄжЁ©

errList setParam        (int argc, char **argv);
errList	SignalError     (errList errType,
			 char *errPlace);
errList loadCht		(void);
errList loadKey		(void);
errList	execute         (void);

// ѓ« ў­ п Їа®Ја ¬¬  ¬®¤г«п

errList	main(int argc, char *argv[])
{
  unsigned short i;

#if defined(CPU386) && !defined(_WIN32)
  void ge386CPU(void);
  ge386CPU();
#endif

  printf(
#ifdef VarKey
	 "Џа®Ја ¬¬  иЁда®ў ­Ёп ¤ ­­ле Ї® ¬®¤ЁдЁжЁа"
	 "®ў ­­л¬ ў аЁ ­в ¬ ѓЋ‘’  28147-89\n"
#else
	 "Џа®Ја ¬¬  иЁда®ў ­Ёп ¤ ­­ле Ї® ѓЋ‘’ 2814"
	 "7-89\n"
#endif
         "‚ҐабЁп 3.01"
#ifdef _WIN32
                    "-W32"
#else
#  ifdef CPU386
		    "-386"
#  endif
#endif
                        ",а §а Ў®в « Ђ.‚Ё­®Єга®ў, "
	 "бў®Ў®¤­®Ґ ЁбЇ®«м§®ў ­ЁҐ Ё Є®ЇЁа®ў ­ЁҐ.\n"
);

// ќв®в жЁЄ« бва®Ёв ваЁўЁ «м­го в Ў«Ёжг § ¬Ґ­
// “¤ «ЁвҐ ҐЈ®, Ґб«Ё Ўг¤ҐвҐ Ё­ЁжЁ «Ё§Ёа®ў вм  chtab
  for (i=0; i<1024; i++) chtab[i]=(unsigned char)i;

  return
    argc<=1 ? SignalError(errNoParam,NULL) :
      (code=setParam(argc,argv))!=O_K_ ? code :
	!InFile ? SignalError(errTooFiewParm,NULL) :
	  (ChtFile && loadCht() != O_K_) ?
		      SignalError(errBadXCHT,ChtFile) :
	    loadKey() != O_K_ ?
		      SignalError(errBadKey,KeyFile) :
	      execute();
}

// гбв ­®ўЄ  ०Ё¬®ў б®Ј« б­® д« Ј ¬ ўл§®ў 

errList	setParam(int argc, char **argv)
{
  for ( ; ++argv,--argc; )	// Їа®б¬®ва  аЈг¬Ґ­в®ў
  {
    char *c,d;
    int length;

#ifdef VarKey
    int weight;
#endif


    if (**argv=='/')	// Є«оз Є®¬ ­¤­®© бва®ЄЁ
      switch (toupper(*(*argv+1)))  // ўлЎ®а Ї® ЎгЄўҐ
      {
      case 'D': Deletion=1;			break;

      case 'K':
	if (!*(KeyFile=*argv+2))
	  return SignalError(errMissingKey,*argv);
	break;

      case 'C':
	if (!*(ChtFile=*argv+2))
	  return SignalError(errMissingKey,*argv);
	break;

      case 'Z':
	if (!*(*argv+2))
	  Memory=MaxBufferSize;
	else 
	{
	  Memory=strtoul(*argv+2,&c,10);
	  switch(*c)
	  {
            case 'K': case 'k': Memory *= 1024;    c++; break;
#ifdef _WIN32
            case 'M': case 'm': Memory *= 1048576; c++; break;
#endif
	  }
	}
	if (*c) return SignalError(errBadMemorySize,*argv+2);
	if (!Memory) Memory = MaxBufferSize;
	break;

      case 'S':
	if (!*(*argv+2))
	  return SignalError(errMissingSynchro,*argv+2);
	length=strlen(*argv);
	if (length<=10)
	  if (Synchro[0]=strtoul(*argv+2,&c,16),*c)
	    return SignalError(errBadSynchro,*argv+2);
	else
	{
	  if (Synchro[0]=strtoul(*argv+length-8,&c,16),*c)
	    return SignalError(errBadSynchro,*argv+2);
	  d=*(*argv+length-8);
	  *(*argv+length-8)=0;
	  if (Synchro[1]=strtoul(*argv+2,&c,16),*c)
	    return  *(*argv+length-8)=d,
		    SignalError(errBadSynchro,*argv+2);
	}
	break;

#ifdef VarKey
      case 'M':
	for (KeyRepeat=KeyMask=0, weight=1;
	     *(*argv+2+KeyRepeat);
	     KeyRepeat++,weight<<=1)
	{
	  switch(*(*argv+2+KeyRepeat))
	  {
	    default:
	      return SignalError(errBadScheme,*argv+2);
	    case '1':
	      KeyMask |= weight;
	    case '0':  ;
	  }
	}
	if (!KeyRepeat)
	  return SignalError(errMissingScheme,*argv+2);
	break;
#endif

      case 'I':
	if (*(*argv+2))
	  if (_Imito=strtoul(*argv+2,&c,16),*c)
	    return SignalError(errBadImito,*argv+2);
	  else CheckImito=ShowImito=1;
	else  ShowImito=1;
	break;
      default:
	return  SignalError(errInvalidFlag,*argv);
      }

    else switch(ParmCount++)    // ¤агЈ®©  аЈг¬Ґ­в
    {
      default:
	return  SignalError(errTooManyParm,*argv);
      case 0:			// ¤ҐЄ®¤Ёа㥬 дг­ЄжЁо
	if (*(*argv+1) && *(*argv+2)) // > 2 ЎгЄў
	  return SignalError(errInvalidOper,*argv);
	switch(toupper(**argv)) // бЁ¬ў®« ®ЇҐа жЁЁ ?
	{
	  default:              // ®иЁЎЄ 
	    return SignalError(errInvalidOper,*argv);
	  case 'D': Operation=1;// а биЁда®ў ­ЁҐ
	  case 'E':;            // § иЁда®ў ­ЁҐ
	}
	switch(toupper(*(*argv+1))) // бЁ¬ў®« ¬Ґв®¤  ?
	{
	  default:              // ®иЁЎЄ 
	    return SignalError(errInvalidOper,*argv);
	  case 'B':
	    SimpleChange=0; BackLink=1; break;
	  case 'G': case '\0':
	    SimpleChange=0; BackLink=0;	break;
	  case 'S':
	    SimpleChange=1; 		break;
	}
	break;
      case 1:			// ®ЇаҐ¤Ґ«пҐ¬ Ёбв®з­ЁЄ
	InFile=*argv;	break;
      case 2:			// ®ЇаҐ¤Ґ«пҐ¬ ЇаЁҐ¬­ЁЄ
	OutFile=*argv;
    }
  }
  return O_K_;
}

// ‡ Јаг§Є  в Ў«Ёжл § ¬Ґ­

errList loadCht(void)
{
  int	handle,FileSize;
  unsigned char  buffer[128];

  if ((handle=open(ChtFile,O_RDONLY|O_BINARY))==-1 ||
       ((FileSize=filelength(handle)) != 128 &&
			      FileSize != 1024) ||
    read(handle,
      FileSize==128 ? buffer : chtab,FileSize)==-1)
    return errBadKey;

  if (FileSize == 128)
    ExpCht((Item *)buffer,(Item *) chtab);
  close(handle);
  return O_K_;
}

// €­ўҐавЁа®ў ­ЁҐ ¬ бЄЁ Є«оз 

  unsigned int inverse(unsigned int arg,
		       unsigned int size)
{
  unsigned int result = 0;
  for ( arg=~arg; size; size--)
  {
    result=(result<<1) + (arg & 1);
    arg >>= 1;
  }
  return result;
}

// ‡ Јаг§Є  Є«оз 

errList loadKey(void)
{
  int		handle;
  unsigned long	FileSize;
  unsigned int  inverse(unsigned int arg, unsigned int size);

  if (KeyFile)
  {
    if ((handle=open(KeyFile,O_RDONLY|O_BINARY))==-1 ||
	((FileSize=filelength(handle))
#ifdef VarKey
	 % sizeof (Item)) || FileSize == 0)
#else
	 ) != 32)
#endif
      return errBadKey;
  }
  else
    FileSize = 32;

#ifdef VarKey
  if (FileSize / sizeof (Item) * KeyRepeat > MaxKeyItems)
    return errKeyTooLong;
  KeySize = FileSize / sizeof (Item) * KeyRepeat;
  iKeySize = 1 + (ShowImito && KeyRepeat > 2);
#else
  KeySize = 32;
  iKeySize = 1 + ShowImito;
#endif

  if (!(Key = __malloc((iKeySize+KeyRepeat)*FileSize)))
    return errInsufMemory;

  KeyImito = (Item far *)
    ((char huge *) Key + FileSize * KeyRepeat);

  if (KeyFile)
  {
    if (__read(handle, KeyImito, FileSize) <
		       (signed long) FileSize)
      return errBadKey;
  }
  else
    __memset(KeyImito, 0, FileSize);

  if (iKeySize == 2)
    __memcpy((char far *) KeyImito+FileSize,
			  KeyImito,FileSize);
  iKeySize*=FileSize/sizeof (Item);
  ExpandKey (KeyImito, Key, FileSize/sizeof (Item),
	     KeyRepeat,
	     SimpleChange && Operation ?
	       inverse(KeyMask,KeyRepeat) : KeyMask);
  close(handle);
  return O_K_;
}

//  ЋбгйҐбвў«Ґ­ЁҐ иЁда®ў ­Ёп

errList execute(void)
{
  int  inHandle,outHandle,same,lastloop;
  long FileSize;
  char number[11];
  unsigned long quant,blocks;

// Ї®¤Ј®в®ўЄ  д ©«®ў
  if (!BackLink && !SimpleChange)
    simple(Key,Synchro,chtab,1
#ifdef VarKey
    ,KeySize
#endif
    );
  if ((same=!OutFile)!=0)
    OutFile="$$$$$$$$.$$$";

  if((inHandle=open(InFile,O_RDONLY|O_BINARY))==-1 ||
     (FileSize=filelength(inHandle))== -1 ||
      FileSize == 0)
    return SignalError(errSourceFailure,InFile);
  if(SimpleChange && filelength(inHandle)%8)
    return SignalError(errNotDividedBy8,
      ultoa(filelength(inHandle),number,10));
  if((outHandle=open(OutFile,
		 O_WRONLY|O_CREAT|O_BINARY|O_TRUNC,
		 S_IREAD|S_IWRITE))==-1)
    return SignalError(errTargetFailure,OutFile);

// ўл¤Ґ«Ґ­ЁҐ Ї ¬пвЁ
  if (Memory>(unsigned long)FileSize) Memory=FileSize;
  Memory=(Memory+7UL) & 0xFFFFFFF8UL;
  if (Memory>MaxBufferSize) Memory=MaxBufferSize;
  if(!(buffer=__malloc(Memory)))
    return SignalError(errInsufMemory,NULL);
    

// Notification
  printf("ђ §¬Ґа ®Ў¬Ґ­­®Ј® ЎгдҐа  - %lu Ў ©в®ў\n",Memory);
  printf("%sиЁда®ў ­ЁҐ д ©«  %s"
#ifdef VarKey
         ", %sбв ­¤ ав­л© ०Ё¬"
#endif
  "\n",
  Operation ? "ђ б" : "‡ ", InFile
#ifdef VarKey
  ,KeyMask==8 && KeyRepeat==4 && KeySize==32 ? "" : "­Ґ"
#endif
  );

// жЁЄ« иЁда®ў ­Ёп
  for ( lastloop=0, blocks=(quant=Memory)/sizeof(CrBlock) ;
	    FileSize>0 ;
		FileSize-=Memory)
  {
    if ((unsigned long) FileSize < Memory)
	{
      quant = (unsigned long) FileSize;
      blocks= (quant+sizeof(CrBlock)-1)/sizeof(CrBlock);
	  lastloop = 1;
    }

    if ((unsigned long)__read(inHandle,buffer,quant) < quant)
      return SignalError(errSourceFailure,InFile);
    if (!Operation && ShowImito)
    {
      if (lastloop && FileSize % 8)
	__memset((char far *)buffer+FileSize, 0, 8-FileSize%8);
      imito (KeyImito,Imito,chtab,buffer,blocks
#ifdef VarKey
				       ,iKeySize
#endif
      );
    }
    if(SimpleChange)
      simple(Key,buffer,chtab,blocks
#ifdef VarKey
				    ,KeySize
#endif
      );
    else
      (BackLink ? Operation ? gammaLD : gammaLE : gamma)
	 (Key,Synchro,chtab,buffer,blocks
#ifdef VarKey
					 ,KeySize
#endif
	 );
    if (Operation && ShowImito)
    {
      if (lastloop && FileSize % 8)
	__memset((char far *)buffer+FileSize, 0, 8-FileSize%8);
      imito (KeyImito,Imito,chtab,buffer,blocks
#ifdef VarKey
					    ,iKeySize
#endif
	    );
    }
    if ((unsigned long)__write(outHandle,buffer,quant) < quant)
      return SignalError(errTargetFailure,OutFile);
  }

// § ўҐаи ойЁҐ ¤Ґ©бвўЁп
  close(inHandle);
  close(outHandle);
  if(ShowImito)
  {
    printf("€¬Ёв®ўбв ўЄ ");
    if(CheckImito)
      printf(" %s б®ўЇ ¤ Ґв !\n",
	 Imito[1]==_Imito ? "" : " Ќ… ");
    else
      printf("=%lx\n",Imito[1]);
  }
  if (Deletion || same)
  {
    if (unlink(InFile)==-1)
      return SignalError(errDeleteFailure,InFile);
    if (same && rename(OutFile,InFile)==-1)
      return SignalError(errRenameFailure,InFile);
  }
  return O_K_;
}

// ‚л¤ з  б®®ЎйҐ­Ёп ®Ў ®иЁЎЄҐ

errList	SignalError(errList errType, char *errPlace)
{
  char *errText[]=
  {
  "Љ®¬ ­¤  § ЇгбЄ  Їа®Ја ¬¬л : \"Ё¬п [/Є«оз]... дг­ЄжЁ"
		 "п Ёб室­ЁЄ [१г«мв в]\" , Ј¤Ґ\n"
    "/Є«оз - ®¤Ё­ Ё«Ё ­ҐбЄ®«мЄ® Є«о祩 Ё§ б«Ґ¤го饣® б"
		 "ЇЁбЄ :\n"
    "  /d       - г­Ёз⮦Ґ­ЁҐ Ёб室­®Ј® д ©«  Ї®б«Ґ гб"
		 "ЇҐи­®Ј® иЁда®ў ­Ёп;\n"
    "  /k<д ©«>,/c<д ©«> - § ¤ Ґв д ©« б Є«о箬 (k) Ё«"
		 "Ё в Ў«ЁжҐ©  § ¬Ґ­ (c).   ‡¤Ґбм\n"
    "             <д ©«> - «оЎ®Ґ ¤®ЇгбвЁ¬®Ґ ў MS-DOS Ё"
		 "¬п д ©« , и Ў«®­л ­Ґ¤®ЇгбвЁ¬л;\n"
    "             Џ® 㬮«з ­Ёо ЎҐаҐвбп  ­г«Ґў®© Є«оз  "
		 "Ё ⮦¤Ґб⢥­­ п в Ў«Ёж  § ¬Ґ­;\n"
    "  /s<§­ зҐ­ЁҐ> - § ¤ Ґв бЁ­еа®Ї®бл«Єг, <§­ зҐ­ЁҐ>"
		 " - ®в 1 ¤® 16 16-аЁз­ле жЁда;\n"
#ifdef VarKey
    "  /m<б奬 > - § ¤ Ґв б奬㠨ᯮ«м§®ў ­Ёп н«Ґ¬Ґ­в®"
		 "ў Є«оз ,  <б奬 > - Ї®б«Ґ¤®ў -\n"
    "             ⥫쭮бвм н«Ґ¬Ґ­в®ў 0 Ё 1, ®§­ з ойЁ"
		 "е Їаאַ© Ё ®Ўа в­л© Ї®а冷Є;\n"
#endif
    "  /i[<§­ зҐ­ЁҐ>] - § ¤ Ґв ०Ё¬ ўлзЁб«Ґ­Ёп Ё¬Ёв®ў"
		 "бв ўЄЁ; Ґб«Ё §­ зҐ­ЁҐ - ®в 1\n"
    "             ¤® 8 16-аЁз­ле жЁда - § ¤ ­®, ­  нЄа"
		 " ­ ўлў®¤Ёвбп १г«мв в ҐЈ®\n"
    "             ба ў­Ґ­Ёп б ўлзЁб«Ґ­­л¬, Ё­ зҐ ўлў®¤"
		 "Ёвбп ўлзЁб«Ґ­­®Ґ §­ зҐ­ЁҐ.\n"
#ifdef _WIN32
    "  /z[<а §¬Ґа>[K|M]] ®ЇаҐ¤Ґ«пҐв а §¬Ґа ЎгдҐа  ®Ў¬Ґ"
                 "­  ў [K|M]Ў ©в е,  Ґб«Ё а §¬Ґа\n"
#else
    "  /z[<а §¬Ґа>[K]]  ®ЇаҐ¤Ґ«пҐв а §¬Ґа  ЎгдҐа  ®Ў¬Ґ"
                 "­  ў  [K]Ў ©в е,  Ґб«Ё  а §¬Ґа\n"
#endif
    "             ­Ґ § ¤ ­ ў Є«озҐ, а ўҐ­ 0  Ё«Ё ЇаҐўл"
                 "и Ґв ¬ ЄбЁ¬ «м­®Ґ §­ зҐ­ЁҐ, в®\n"
    "             ЎҐаҐвбп ¬ ЄбЁ¬ «м­®Ґ §­ зҐ­ЁҐ, Ґб«Ё "
                 "­ҐЄа вҐ­ 8, ®ЄагЈ«пҐвбп ўўҐае.\n"
    "дг­ЄжЁп - {e|d}[g|b|s] -1-© бЁ¬ў®«: e-§ иЁда®ў ­Ё"
		 "Ґ, d-а биЁда®ў ­ЁҐ; 2-© бЁ¬ў®«\n"
    "-¬Ґв®¤ иЁда®ў ­Ёп: g-Ј ¬¬Ёа®ў ­ЁҐ (Ї® 㬮«з ­Ёо),"
		 "b-Ј ¬¬Ёа®ў ­ЁҐ б ®Ўа в­®© бўп-\n"
    "§мо, s-Їа®бв п § ¬Ґ­ . ‚ Ї®б«Ґ¤­Ґ¬ б«гз Ґ ¤«Ё­  и"
		 "Ёда㥬®Ј® д ©«  ¤/Ў Єа в­  8.\n"
    "Ёб室­ЁЄ,१г«мв в - Ё¬п иЁда㥬®Ј® д ©«  Ё д ©« "
		 " ¤«п § ЇЁбЁ १г«мв в .   …б«Ё\n"
    "д ©« १г«мв в  ­Ґ § ¤ ­, в® ®­ § ¬Ґй Ґв иЁда㥬л"
		 "© д ©«.\n",
  "ЌҐўҐа­л© д« Ј ўл§®ў  Їа®Ја ¬¬л - \"%s\". „«п Ї®«гзҐ"
		 "­Ёп Ё­д®а¬ жЁЁ ® Є®¬ ­¤­®©\n"
    "бва®ЄҐ Їа®Ја ¬¬л § ЇгбвЁвҐ ҐҐ ЎҐ§ Ї а ¬Ґва®ў\n",
  "ЌҐўҐа­® § ¤ ­ а §¬Ґа ЎгдҐа  - %s\n",
  "‘Ё­еа®Ї®бл«Є  ®вбгвбвўгҐв ў Є«озҐ /s\n",
  "ЌҐўҐа­® § ¤ ­  бЁ­еа®Ї®бл«Є  - %s\n",
  "ЌҐўҐа­® § ¤ ­  Ё¬Ёв®ЇаЁбв ўЄ  - %s\n",
  "ЌҐ®Ўе®¤Ё¬л Є®¤ дг­ЄжЁЁ Ё Ё¬п иЁда㥬®Ј® д ©« \n",
  "‹Ёи­Ё© Ї а ¬Ґва ўл§®ў  - %s\n",
  "€¬п д ©«  б Є«о箬 ®вбгвбвўгҐв ў Є«озҐ /k\n",
  "ЌҐўҐа­® § ¤ ­ д ©« б Є«о箬 - %s\n",
  "€¬п д ©«  б в Ў«ЁжҐ© § ¬Ґ­ ®вбгвбвўгҐв ў Є«озҐ /c\n",
  "ЌҐўҐа­® § ¤ ­ д ©« б в Ў«ЁжҐ© § ¬Ґ­ - %s\n",
  "ЌҐўҐа­® § ¤ ­  ўлЇ®«­пҐ¬ п ®ЇҐа жЁп - %s\n",
  "ЋиЁЎЄ  ­  Ёб室­®¬ д ©«Ґ - %s\n",
  "ЏаЁ Їа®бв®© § ¬Ґ­Ґ ¤«Ё­  д ©«  - %s - ­Ґ Єа в­  8\n",
  "ЋиЁЎЄ  ­  д ©«Ґ १г«мв в  - %s\n",
  "ЌҐў®§¬®¦­® ЇҐаҐЁ¬Ґ­®ў вм д ©« $$$$$$$$.$$$ ў %s\n",
  "ЌҐў®§¬®¦­® г¤ «Ёвм д ©« %s\n",
#ifdef VarKey
  "‚ Є«озҐ /m ­Ґв беҐ¬л ЁбЇ®«м§®ў ­Ёп Є«оз \n",
  "‚ Є«озҐ /m § ¤ ­  ­ҐўҐа­ п б奬  - %s\n",
  "‘«ЁиЄ®¬ ¤«Ё­­л© Є«оз иЁда®ў ­Ёп\n",
#endif
  "ЌҐ еў в Ґв ¤Ё­ ¬ЁзҐбЄ®© Ї ¬пвЁ\n"
  };
  printf(errText[errType-2],errPlace);
  return errType;
}
Соседние файлы в папке GOST_T32
  • #
    16.04.2013439 б27GOST32S_.MAK
  • #
    16.04.20131.18 Кб26GOST32_.MAK
  • #
    16.04.20134.34 Кб28INDEX.TXT
  • #
    16.04.2013670 б26README.1ST
  • #
    16.04.201310.35 Кб28README.TXT
  • #
    16.04.201319.82 Кб28XCRYPTOR.C
  • #
    16.04.20131.65 Кб26XGOST32.MAK
  • #
    16.04.2013746 б26XGOST32D.MAK
  • #
    16.04.2013747 б26XGOST32S.MAK
  • #
    16.04.20131.31 Кб26XGOST32_.MAK