]> matita.cs.unibo.it Git - pkg-cerco/frama-c-cost-plugin.git/blob - plugin/tests/success/3-way.c
Imported Upstream version 0.1
[pkg-cerco/frama-c-cost-plugin.git] / plugin / tests / success / 3-way.c
1 /********************************************************************\\r
2 *                                                                    *\r
3 * C specification of the threeway block cipher                       *\r
4 *                                                                    *\r
5 \********************************************************************/\r
6 /*file i/o main function by Pate Williams 1996*/\r
7 \r
8 #include <ctype.h>\r
9 #include <stdio.h>\r
10 #include <string.h>\r
11 #include <time.h>\r
12 \r
13 #define   STRT_E   0x0b0b /* round constant of first encryption round */\r
14 #define   STRT_D   0xb1b1 /* round constant of first decryption round */\r
15 #define     NMBR       11 /* number of rounds is 11                   */\r
16 \r
17 #define   BLK_SIZE     12 /*number of bytes per block*/\r
18 \r
19 typedef   unsigned long int  word32 ;\r
20                  /* the program only works correctly if long = 32bits */\r
21 \r
22 void mu(word32 *a)       /* inverts the order of the bits of a */\r
23 {\r
24 int i ;\r
25 word32 b[3] ;\r
26 \r
27 b[0] = b[1] = b[2] = 0 ;\r
28 for( i=0 ; i<32 ; i++ )\r
29    {\r
30    b[0] <<= 1 ; b[1] <<= 1 ; b[2] <<= 1 ;\r
31    if(a[0]&1) b[2] |= 1 ;\r
32    if(a[1]&1) b[1] |= 1 ;\r
33    if(a[2]&1) b[0] |= 1 ;\r
34    a[0] >>= 1 ; a[1] >>= 1 ; a[2] >>= 1 ;\r
35    }\r
36 \r
37 a[0] = b[0] ;      a[1] = b[1] ;      a[2] = b[2] ;\r
38 }\r
39 \r
40 void gamma(word32 *a)   /* the nonlinear step */\r
41 {\r
42 word32 b[3] ;\r
43 \r
44 b[0] = a[0] ^ (a[1]|(~a[2])) ;\r
45 b[1] = a[1] ^ (a[2]|(~a[0])) ;\r
46 b[2] = a[2] ^ (a[0]|(~a[1])) ;\r
47 \r
48 a[0] = b[0] ;      a[1] = b[1] ;      a[2] = b[2] ;\r
49 }\r
50 \r
51 void theta(word32 *a)    /* the linear step */\r
52 {\r
53 word32 b[3];\r
54 \r
55 b[0] = a[0] ^  (a[0]>>16) ^ (a[1]<<16) ^     (a[1]>>16) ^ (a[2]<<16) ^\r
56                (a[1]>>24) ^ (a[2]<<8)  ^     (a[2]>>8)  ^ (a[0]<<24) ^\r
57                (a[2]>>16) ^ (a[0]<<16) ^     (a[2]>>24) ^ (a[0]<<8)  ;\r
58 b[1] = a[1] ^  (a[1]>>16) ^ (a[2]<<16) ^     (a[2]>>16) ^ (a[0]<<16) ^\r
59                (a[2]>>24) ^ (a[0]<<8)  ^     (a[0]>>8)  ^ (a[1]<<24) ^\r
60                (a[0]>>16) ^ (a[1]<<16) ^     (a[0]>>24) ^ (a[1]<<8)  ;\r
61 b[2] = a[2] ^  (a[2]>>16) ^ (a[0]<<16) ^     (a[0]>>16) ^ (a[1]<<16) ^\r
62                (a[0]>>24) ^ (a[1]<<8)  ^     (a[1]>>8)  ^ (a[2]<<24) ^\r
63                (a[1]>>16) ^ (a[2]<<16) ^     (a[1]>>24) ^ (a[2]<<8)  ;\r
64 \r
65 a[0] = b[0] ;      a[1] = b[1] ;      a[2] = b[2] ;\r
66 }\r
67 \r
68 void pi_1(word32 *a)\r
69 {\r
70 a[0] = (a[0]>>10) ^ (a[0]<<22);\r
71 a[2] = (a[2]<<1)  ^ (a[2]>>31);\r
72 }\r
73 \r
74 void pi_2(word32 *a)\r
75 {\r
76 a[0] = (a[0]<<1)  ^ (a[0]>>31);\r
77 a[2] = (a[2]>>10) ^ (a[2]<<22);\r
78 }\r
79 \r
80 void rho(word32 *a)    /* the round function       */\r
81 {\r
82 theta(a) ;\r
83 pi_1(a) ;\r
84 gamma(a) ;\r
85 pi_2(a) ;\r
86 }\r
87 \r
88 void rndcon_gen(word32 strt,word32 *rtab)\r
89 {                           /* generates the round constants */\r
90 int i ;\r
91 \r
92 for(i=0 ; i<=NMBR ; i++ )\r
93    {\r
94    rtab[i] = strt ;\r
95    strt <<= 1 ;\r
96    if( strt&0x10000 ) strt ^= 0x11011 ;\r
97    }\r
98 }\r
99 \r
100 void encrypt(word32 *a, word32 *k)\r
101 {\r
102 char i ;\r
103 word32 rcon[NMBR+1] ;\r
104 \r
105 rndcon_gen(STRT_E,rcon) ;\r
106 for( i=0 ; i<NMBR ; i++ )\r
107    {\r
108    a[0] ^= k[0] ^ (rcon[i]<<16) ;\r
109    a[1] ^= k[1] ;\r
110    a[2] ^= k[2] ^ rcon[i] ;\r
111    rho(a) ;\r
112    }\r
113 a[0] ^= k[0] ^ (rcon[NMBR]<<16) ;\r
114 a[1] ^= k[1] ;\r
115 a[2] ^= k[2] ^ rcon[NMBR] ;\r
116 theta(a) ;\r
117 }\r
118 \r
119 void decrypt(word32 *a, word32 *k)\r
120 {\r
121 char i ;\r
122 word32 ki[3] ;          /* the `inverse' key             */\r
123 word32 rcon[NMBR+1] ;   /* the `inverse' round constants */\r
124 \r
125 ki[0] = k[0] ; ki[1] = k[1] ; ki[2] = k[2] ;\r
126 theta(ki) ;\r
127 mu(ki) ;\r
128 \r
129 rndcon_gen(STRT_D,rcon) ;\r
130 \r
131 mu(a) ;\r
132 for( i=0 ; i<NMBR ; i++ )\r
133    {\r
134    a[0] ^= ki[0] ^ (rcon[i]<<16) ;\r
135    a[1] ^= ki[1] ;\r
136    a[2] ^= ki[2] ^ rcon[i] ;\r
137    rho(a) ;\r
138    }\r
139 a[0] ^= ki[0] ^ (rcon[NMBR]<<16) ;\r
140 a[1] ^= ki[1] ;\r
141 a[2] ^= ki[2] ^ rcon[NMBR] ;\r
142 theta(a) ;\r
143 mu(a) ;\r
144 }\r