| 
									
										
										
										
											2004-05-12 20:42:16 +00:00
										 |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | unsigned E[16] =  { 1, 0xb, 9, 0xc, 0xd, 6, 0xf, 3, 0xe, 8, 7, 4, 0xa, 2, 5, 0 }; | 
					
						
							|  |  |  | unsigned Ei[16]; | 
					
						
							|  |  |  | unsigned R[16] =  { 7, 0xc, 0xb, 0xd, 0xe, 4, 9, 0xf, 6, 3, 8, 0xa, 2, 5, 1, 0 }; | 
					
						
							|  |  |  | unsigned cir[8][8] = {  | 
					
						
							|  |  |  |  {1, 1, 4, 1, 8, 5, 2, 9 }, | 
					
						
							|  |  |  | };  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | unsigned gf_mul(unsigned a, unsigned b) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |    unsigned r; | 
					
						
							|  |  |  |     | 
					
						
							|  |  |  |    r = 0; | 
					
						
							|  |  |  |    while (a) { | 
					
						
							|  |  |  |       if (a & 1) r ^= b; | 
					
						
							|  |  |  |       a >>= 1; | 
					
						
							|  |  |  |       b = (b << 1) ^ (b & 0x80 ? 0x11d : 0x00); | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  |    return r; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | unsigned sbox(unsigned x) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |    unsigned a, b, w; | 
					
						
							|  |  |  |     | 
					
						
							|  |  |  |    a = x >> 4; | 
					
						
							|  |  |  |    b = x & 15; | 
					
						
							|  |  |  |     | 
					
						
							|  |  |  |    a = E[a]; b = Ei[b]; | 
					
						
							|  |  |  |    w = a ^ b; w = R[w]; | 
					
						
							|  |  |  |    a = E[a ^ w]; b = Ei[b ^ w]; | 
					
						
							|  |  |  |     | 
					
						
							|  |  |  |     | 
					
						
							|  |  |  |    return (a << 4) | b; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int main(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |    unsigned x, y; | 
					
						
							|  |  |  |     | 
					
						
							|  |  |  |    for (x = 0; x < 16; x++) Ei[E[x]] = x; | 
					
						
							|  |  |  |     | 
					
						
							|  |  |  | //   for (x = 0; x < 16; x++) printf("%2x ", sbox(x));
 | 
					
						
							|  |  |  |    for (y = 1; y < 8; y++) { | 
					
						
							|  |  |  |       for (x = 0; x < 8; x++) { | 
					
						
							|  |  |  |           cir[y][x] = cir[y-1][(x-1)&7]; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*   
 | 
					
						
							|  |  |  |    printf("\n"); | 
					
						
							|  |  |  |    for (y = 0; y < 8; y++) { | 
					
						
							|  |  |  |        for (x = 0; x < 8; x++) printf("%2d ", cir[y][x]); | 
					
						
							|  |  |  |        printf("\n"); | 
					
						
							|  |  |  |    } | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    for (y = 0; y < 8; y++) { | 
					
						
							|  |  |  |        printf("static const ulong64 sbox%d[] = {\n", y); | 
					
						
							|  |  |  |        for (x = 0; x < 256; ) { | 
					
						
							|  |  |  |            printf("CONST64(0x%02x%02x%02x%02x%02x%02x%02x%02x)", | 
					
						
							|  |  |  |               gf_mul(sbox(x), cir[y][0]), | 
					
						
							|  |  |  |               gf_mul(sbox(x), cir[y][1]), | 
					
						
							|  |  |  |               gf_mul(sbox(x), cir[y][2]), | 
					
						
							|  |  |  |               gf_mul(sbox(x), cir[y][3]), | 
					
						
							|  |  |  |               gf_mul(sbox(x), cir[y][4]), | 
					
						
							|  |  |  |               gf_mul(sbox(x), cir[y][5]), | 
					
						
							|  |  |  |               gf_mul(sbox(x), cir[y][6]), | 
					
						
							|  |  |  |               gf_mul(sbox(x), cir[y][7])); | 
					
						
							|  |  |  |            if (x < 255) printf(", "); | 
					
						
							|  |  |  |            if (!(++x & 3)) printf("\n"); | 
					
						
							|  |  |  |        } | 
					
						
							|  |  |  |        printf("};\n\n"); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   printf("static const ulong64 cont[] = {\n"); | 
					
						
							|  |  |  |   for (y = 0; y <= 10; y++) { | 
					
						
							|  |  |  |       printf("CONST64(0x"); | 
					
						
							|  |  |  |       for (x = 0; x < 8; x++) { | 
					
						
							|  |  |  |          printf("%02x", sbox((8*y + x)&255)); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       printf("),\n"); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   printf("};\n\n"); | 
					
						
							|  |  |  |   return 0; | 
					
						
							|  |  |  |     | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-06-09 00:08:13 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* $Source$ */ | 
					
						
							|  |  |  | /* $Revision$ */ | 
					
						
							|  |  |  | /* $Date$ */ |