83 lines
2.4 KiB
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 ;
|
||
|
}
|