fis-gtm/sr_port/la_encrypt.c

83 lines
2.4 KiB
C

/****************************************************************
* *
* Copyright 2001, 2007 Fidelity Information Services, Inc *
* *
* This source code contains the intellectual property *
* of its copyright holder(s), and is made available *
* under a license. If you do not know the terms of *
* the license, please stop and do not read further. *
* *
****************************************************************/
/* la_encrypt.c : for given encryption function number, and an input sequence of bytes,
the program computes the checksum of the sequence.
used in : la_create.c,lp_licensed.c,lm_verify
*/
#include "mdef.h"
#include "la_encrypt.h"
static void la_encrypt_table (uint4 poly, uint4 tbl[]);
static uint4 la_encrypt_value (
uint4 tbl[], /* polynomial coefficients */
uint4 cs, /* checksum initial value */
unsigned char *c, /* string to compute the check sum for */
int len); /* string length */
bool la_encrypt (
short n , /* encryption function number */
char *q , /* input sequence */
int len, /* sequence length */
uint4 bcs[]) /* result, binary form */
{
static uint4 poly0[10] = {0xEDB88320, 0xA001A001, 0x00008408, 0x00000000, 0xA001A001, 1, 1, 1, 1, 1};
static uint4 init0[10] = {0xFFFFFFFF, 0x00000000, 0x0000FFFF, 0xFFFFFFFF, 0x00000000, 0, 0, 0, 0, 0};
static uint4 poly1[10] = {0xA001A001, 0x00008408, 0xEDB88320, 0xEDB88320, 0x0000A001, 1, 1, 1, 1, 1};
static uint4 init1[10] = {0x00000000, 0x0000FFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0, 0, 0, 0, 0};
uint4 crctbl[16];
if (n<5)
{
la_encrypt_table(poly0[n],crctbl) ;
bcs[0] = la_encrypt_value(crctbl,init0[n],(uchar_ptr_t)q,len) ;
la_encrypt_table(poly1[n],crctbl) ;
bcs[1] = la_encrypt_value(crctbl,init1[n],(uchar_ptr_t)q,len) ;
}
return n<5 ;
}
static void la_encrypt_table (uint4 poly, uint4 tbl[])
{
uint4 k, t, x;
int i;
for ( k= 0 ; k!=16 ; k++ )
{
t= k ;
for ( i= 0 ; i!=4 ; i++ )
{
x= t & 1 ;
t= t>>1 ;
if (x==1) t ^= poly ;
}
tbl[k]= t ;
}
}
static uint4 la_encrypt_value (
uint4 tbl[], /* polynomial coefficients */
uint4 cs, /* checksum initial value */
unsigned char *c, /* string to compute the check sum for */
int len) /* string length */
{
while ( len!=0 )
{
cs ^= (int4)*c ; /* least signif. byte of cs differred with *c */
cs = ( cs >> 4 ) ^ tbl[cs & 0xF] ;
cs = ( cs >> 4 ) ^ tbl[cs & 0xF] ;
c++ ; len-- ;
}
return cs ;
}