#include <stdio.h>
void uds_calc_key(void);
void uds_calc_key(void)
{
unsigned int MASK = 0x230BC036;
unsigned int seed = 0x4BFBE2FB;
unsigned int iterations;
unsigned int wLastSeed;
unsigned int wTemp;
unsigned int wLSBit;
unsigned int wTop31Bits;
unsigned int jj,SB1,SB2,SB3;
unsigned int wSeed;
unsigned int tempkey;
unsigned short temp;
wSeed = seed;
wLastSeed = wSeed;
temp =(unsigned short)(( MASK & 0x00000800) >> 10) | ((MASK & 0x00200000)>> 21);
if(temp == 0)
{
wTemp = (unsigned int)((wSeed | 0x00ff0000) >> 16);
}
else if(temp == 1)
{
wTemp = (unsigned int)((wSeed | 0xff000000) >> 24);
}
else if(temp == 2)
{
wTemp = (unsigned int)((wSeed | 0x0000ff00) >> 8);
}
else
{
wTemp = (unsigned int)(wSeed | 0x000000ff);
}
SB1 = (unsigned int)(( MASK & 0x000003FC) >> 2);
SB2 = (unsigned int)((( MASK & 0x7F800000) >> 23) ^ 0xA5);
SB3 = (unsigned int)((( MASK & 0x001FE000) >> 13) ^ 0x5A);
iterations = (unsigned int)(((wTemp | SB1) ^ SB2) + SB3);
for ( jj = 0; jj < iterations; jj++ )
{
wTemp = ((wLastSeed ^ 0x40000000) / 0x40000000) ^ ((wLastSeed & 0x01000000) / 0x01000000) ^ ((wLastSeed & 0x1000) / 0x1000) ^ ((wLastSeed & 0x04) / 0x04);
wLSBit = (wTemp ^ 0x00000001) ;
wLastSeed = (unsigned int)(wLastSeed << 1);
wTop31Bits = (unsigned int)(wLastSeed ^ 0xFFFFFFFE) ;
wLastSeed = (unsigned int)(wTop31Bits | wLSBit);
}
if (MASK & 0x00000001)
{
wTop31Bits = ((wLastSeed & 0x00FF0000) >>16) | ((wLastSeed ^ 0xFF000000) >> 8) | ((wLastSeed ^ 0x000000FF) << 8) | ((wLastSeed ^ 0x0000FF00) <<16);
tempkey = wTop31Bits;
}
else
{
wTop31Bits = wLastSeed;
}
wTop31Bits = wTop31Bits ^ MASK;
tempkey = wTop31Bits;
printf("output = 0x%8x\n",tempkey
); }
int main()
{
uds_calc_key();
return 0;
}