Пример #1
0
/**
@details GOST_Crypt_G_Data
Шифрование\Расшифрования блока данных в режиме гаммирования.
@param *Data - Указатель на данные для шифрования\расшифрования, также сюда заносится результат работы.
@param Size - Размер данных
@param *Synchro - Указатель на синхопросылку, также сюда заносится текущее значение синхропосылки.
@param *GOST_Table - Указатель на таблицу замены ГОСТ(ДК) в 128 байтном формате(вместо старшого полубайта 0).
@param *GOST_Key - Указатель на 256 битный массив ключа(СК).
@attention Синхропосылка Synchro для первого вызова должна быть подготовлена функцией/макросом GOST_Crypt_G_PS.
*/
void GOST_Crypt_G_Data(uint8_t *Data, uint32_t Size, uint8_t *Synchro, uint8_t *GOST_Table, uint8_t *GOST_Key )
{

    GOST_Data_Part *S=(GOST_Data_Part *)Synchro;
    GOST_Data_Part Tmp;
    uint8_t i;
    while(Size!=0)
    {
        (*S).half[_GOST_Data_Part_N1_Half]+=_GOST_C0;
        _GOST_ADC32((*S).half[_GOST_Data_Part_N2_Half],_GOST_C1,(*S).half[_GOST_Data_Part_N2_Half]);//_GOST_Data_Part_HiHalf

        Tmp=*S;
        GOST_Crypt_32_E_Cicle(&Tmp,GOST_Table,(uint32_t *)GOST_Key);
#if _GOST_ROT==1
        Tmp.half[_GOST_Data_Part_N2_Half]=_SWAPW32(Tmp.half[_GOST_Data_Part_N2_Half]);
        Tmp.half[_GOST_Data_Part_N1_Half]=_SWAPW32(Tmp.half[_GOST_Data_Part_N1_Half]);
#endif
        for (i=0;i<_Min(_GOST_Part_Size,Size);i++)
        {
            *Data^=Tmp.parts[i];
            Data++;
        }
        Size-=i;
    }
}
void GOST_ENCRYPTED_GAMMA(BYTE *Data, DWORD Size, BYTE *SyncPack, BYTE *GOST_Table, DWORD *GOST_Key){
	GOST_PART_DATA *SYNCP = (GOST_PART_DATA *)SyncPack;															//Приведем к 64битному формату синхропосылку
	GOST_PART_DATA tmp;																							//Временная переменная для синхропосылки
	BYTE i;																									//Переменная цикла
	while (Size != 0){																							//Цикл по данным
		(*SYNCP).half[_GOST_PART_DATA_N1_HALF] += _GOST_C0;														//Прибавление константы С0
		_GOST_ADC32((*SYNCP).half[_GOST_PART_DATA_N2_HALF], _GOST_C1, (*SYNCP).half[_GOST_PART_DATA_N2_HALF]);	//Суммирование 
		tmp = *SYNCP;																							//
		GOST_ENCRYPTED_32_CICLE(&tmp, GOST_Table, (DWORD*)GOST_Key);											//Гаммирование.
#if _GOST_COMPATIBILITY_STANDART == 1
		tmp.half[_GOST_PART_DATA_N2_HALF] = _SWAPW32(tmp.half[_GOST_PART_DATA_N2_HALF]);
		tmp.half[_GOST_PART_DATA_N1_HALF] = _SWAPW32(tmp.half[_GOST_PART_DATA_N1_HALF]);
#endif	
		for (i = 0; i < _MINIMUM(_GOST_PART_SIZE, Size); i++){													//Цикл прохода по данным
			*Data ^= tmp.parts[i];																				//Побитовый XOR с частями в 8ми битном представлении
			Data++;																								//Уведичиваем данные
		}																										//Конец FOR
		Size -= i;																								//Уменьшаем размер на порцию
	}																											//Конец While
}