File: gost.c

package info (click to toggle)
arj 3.10.22-13
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 3,352 kB
  • ctags: 4,701
  • sloc: ansic: 32,990; makefile: 2,034; sh: 1,547; asm: 436
file content (49 lines) | stat: -rw-r--r-- 1,178 bytes parent folder | download | duplicates (12)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/*
 * $Id: gost.c,v 1.2 2003/04/27 20:54:42 andrew_belov Exp $
 * ---------------------------------------------------------------------------
 * This file  contains basic  GOST encryption-related initialization  data and
 * code.
 *
 */

#include "arj.h"

DEBUGHDR(__FILE__)                      /* Debug information block */

/* Makes a 1024-byte pattern for encryption */

void calc_gost_pattern()
{
 int i;

 for(i=0; i<256; i++)
 {
  pattern[0][i]=(seed[0][i>>4]<<4)|(seed[1][i&0x0F]);
  pattern[1][i]=(seed[2][i>>4]<<4)|(seed[3][i&0x0F]);
  pattern[2][i]=(seed[4][i>>4]<<4)|(seed[5][i&0x0F]);
  pattern[3][i]=(seed[6][i>>4]<<4)|(seed[7][i&0x0F]);
 }
}

/* Basic step of GOST encoding */

#ifdef WORDS_BIGENDIAN
#define _dptr(i) (dptr[3-(i)])
#else
#define _dptr(i) (dptr[  (i)])
#endif

unsigned long gost_term(unsigned long data)
{
 unsigned char *dptr;
 unsigned short p1, p2;
 unsigned short hi, lo;

 dptr=(unsigned char *)&data;
 p1=(pattern[0][_dptr(3)]<<8)+pattern[1][_dptr(2)];
 p2=(pattern[2][_dptr(1)]<<8)+pattern[3][_dptr(0)];
 hi=(p1<<GSH_BITS)|(p2>>(16-GSH_BITS));
 lo=(p2<<GSH_BITS)|(p1>>(16-GSH_BITS));
 return(((unsigned long)hi<<16)+(unsigned long)lo);
}