comparison gsm-fw/comlib/cl_des.c @ 664:d36f647c2432

gsm-fw/comlib: initial import of TI's source cl_des.c and cl_imei.c are from the Leonardo semi-src; others are from LoCosto
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Sun, 28 Sep 2014 05:09:53 +0000
parents
children 39bacc7d5c49
comparison
equal deleted inserted replaced
663:643379e7e141 664:d36f647c2432
1 /*
2 +-----------------------------------------------------------------------------
3 | Project : COMLIB
4 | Modul : cl_des.c
5 +-----------------------------------------------------------------------------
6 | Copyright 2002 Texas Instruments Berlin, AG
7 | All rights reserved.
8 |
9 | This file is confidential and a trade secret of Texas
10 | Instruments Berlin, AG
11 | The receipt of or possession of this file does not convey
12 | any rights to reproduce or disclose its contents or to
13 | manufacture, use, or sell anything it may describe, in
14 | whole, or in part, without the specific written consent of
15 | Texas Instruments Berlin, AG.
16 +-----------------------------------------------------------------------------
17 | Purpose : Definitions of common library functions: Implementation of
18 DES algorithm
19 +-----------------------------------------------------------------------------
20 */
21 /*
22 * Version 1.0
23 */
24
25 /**********************************************************************************/
26
27 /*
28 NOTE:
29 */
30
31 /**********************************************************************************/
32
33 #ifndef CL_DES_C
34 #define CL_DES_C
35
36 /*
37 * DES routine is used only on Calypso platform
38 */
39 #if defined(CL_IMEI_CALYPSO_PLATFORM) && defined(FF_PROTECTED_IMEI)
40
41 #include <string.h>
42 #include "typedefs.h"
43 #include "cl_des.h"
44
45
46 /* 64+64+17*56+16*48+64+17*32+17*32 = 3000 bytes */
47 static UBYTE binmsg[64] , binkey[64], cd[17][56] , deskey[16][48] , ip[64];
48 static UBYTE l[17][32] , r[17][32];
49 /* 64+64+32+32+64+64+17*3+2 = 373 bytes */
50 static UBYTE rnew[64] , xorres[64] , scale[32] , perm[32] , rl[64] , encpt[64];
51
52 /* 64+16+48+64+48+32+64+8*66 = 864 bytes */
53 const UBYTE shtamt[16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
54 const UBYTE iporder[64] = {58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,62,54,
55 46,38,30,22,14,6,64,56,48,40,32,24,16,8,57,49,41,33,
56 25,17,9,1,59,51,43,35,27,19,11,3,61,53,45,37,29,21,
57 13,5,63,55,47,39,31,23,15,7};
58 const UBYTE pc1[64] = {57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,
59 35,27,19,11,3,60,52,44,36,63,55,47,39,31,23,15,7,62,54,
60 46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4};
61 const UBYTE pc2[48] = {14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,
62 16,7,27,20,13,2,41,52,31,37,47,55,30,40,51,45,33,
63 48,44,49,39,56,34,53,46,42,50,36,29,32};
64 const UBYTE e[48] = {32,1,2,3,4,5,4,5,6,7,8,9,8,9,10,11,12,13,12,13,14,15,
65 16,17,16,17,18,19,20,21,20,21,22,23,24,25,24,25,26,27,
66 28,29,28, 29,30,31,32,1};
67 const UBYTE sp[32] = {16,7,20,21,29,12,28,17,1,15,23,26,5,18,31,10,
68 2,8,24,14,32,27,3,9,19,13,30,6,22,11,4,25};
69 const UBYTE ipinv[64] = {40,8,48,16,56,24,64,32,39,7,47,15,55,23,63,31,38,6,46,
70 14,54,22,62,30,37,5,45,13,53,21,61,29,36,4,44,12,52,
71 20,60,28,35,3,43,11,51,19,59,27,34,2,42,10,50,18,58,
72 26,33,1,41,9,49,17,57,25};
73 const UBYTE s[8][66] = {{14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7,0,15,7,4,14,2,13,
74 1,10,6,12,11,9,5,3,8,4,1,14,8,13,6,2,11,15,12,9,7,3,10,
75 5,0,15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13},
76 {15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10,3,13,4,7,15,2,8,
77 14,12,0,1,10,6,9,11,5,0,14,7,11,10,4,13,1,5,8,12,6,9,3,
78 2,15,13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9},
79 {10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8,13,7,0,9,3,4,6,
80 10,2,8,5,14,12,11,15,1,13,6,4,9,8,15,3,0,11,1,2,12,5,
81 10,14,7,1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12 },
82 {7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15,13,8,11,5,6,15,
83 0,3,4,7,2,12,1,10,14,9,10,6,9,0,12,11,7,13,15,1,3,14,
84 5,2,8,4,3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14 },
85 {2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9,14,11,2,12,4,7,
86 13,1,5,0,15,10,3,9,8,6,4,2,1,11,10,13,7,8,15,9,12,5,6,
87 3,0,14,11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3 },
88 {12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11,10,15,4,2,7,12,
89 9,5,6,1,13,14,0,11,3,8,9,14,15,5,2,8,12,3,7,0,4,10,1,
90 13,11,6,4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13 },
91 {4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1,13,0,11,7,4,9,1,
92 10,14,3,5,12,2,15,8,6,1,4,11,13,12,3,7,14,10,15,6,8,0,
93 5,9,2,6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12 },
94 {13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7,1,15,13,8,10,3,7,
95 4,12,5,6,11,0,14,9,2,7,11,4,1,9,12,14,2,0,6,10,13,15,3,
96 5,8,2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11 }};
97
98
99 /*==== FUNCTIONS ==================================================*/
100
101 /*
102 +------------------------------------------------------------------------------
103 | Function : des_hex2bin4
104 +------------------------------------------------------------------------------
105 | Description : The function converts a 4 bit hex value to 4 binary values
106 |
107 | Parameters : hex : value in hex
108 | m : pointer to buffer of 4 elements to store binary values
109 +------------------------------------------------------------------------------
110 */
111 LOCAL void des_hex2bin4(UBYTE hex, UBYTE *m)
112 {
113 m[0] = (hex & 0x08) >> 3;
114 m[1] = (hex & 0x04) >> 2;
115 m[2] = (hex & 0x02) >> 1;
116 m[3] = hex & 0x01;
117 }
118
119 /*
120 +------------------------------------------------------------------------------
121 | Function : des_hex2bin8
122 +------------------------------------------------------------------------------
123 | Description : The function converts a 8 bit hex value to 8 binary values
124 |
125 | Parameters : hex : value in hex
126 | m : pointer to buffer of 8 elements to store binary values
127 +------------------------------------------------------------------------------
128 */
129 LOCAL void des_hex2bin8(UBYTE hex, UBYTE *m)
130 {
131 m[0] = (hex & 0x80) >> 7;
132 m[1] = (hex & 0x40) >> 6;
133 m[2] = (hex & 0x20) >> 5;
134 m[3] = (hex & 0x10) >> 4;
135 m[4] = (hex & 0x08) >> 3;
136 m[5] = (hex & 0x04) >> 2;
137 m[6] = (hex & 0x02) >> 1;
138 m[7] = hex & 0x01;
139 }
140
141 /*
142 +------------------------------------------------------------------------------
143 | Function : des_bin2hex
144 +------------------------------------------------------------------------------
145 | Description : The function converts 8 bin values to an 8 bit hex value
146 |
147 | Parameters : m[8] : input bin values
148 | Return : converted hex value
149 +------------------------------------------------------------------------------
150 */
151
152 LOCAL UBYTE des_bin2hex(UBYTE *m)
153 {
154 UBYTE hex;
155 return hex = (m[0]<<7) | (m[1]<<6) | (m[2]<<5) | (m[3]<<4) |
156 (m[4]<<3) | (m[5]<<2) | (m[6]<<1) | m[7];
157 }
158
159
160
161 /*
162 +------------------------------------------------------------------------------
163 | Function : des_shift
164 +------------------------------------------------------------------------------
165 | Description : The function performs shifting
166 |
167 | Parameters : dst : pointer to destination buffer
168 | src : pointer to source buffer
169 | sht : shift value
170 +------------------------------------------------------------------------------
171 */
172
173 LOCAL void des_shift(UBYTE *dst, UBYTE *src, UBYTE sht)
174 {
175 UBYTE c1 , c2 , d1 , d2;
176 int i;
177
178 c1 = src[0];
179 c2 = src[1];
180 d1 = src[28];
181 d2 = src[29];
182
183 for ( i = 0 ; i < 28 - sht ; i++) {
184 dst[i] = src[i + sht]; /* copying c[i] */
185 dst[28 + i] = src[28 + i + sht]; /* copying d[i] */
186 }
187
188 if (sht == 1){
189 dst[27] = c1;
190 dst[55] = d1;
191 } else {
192 dst[26] = c1;
193 dst[27] = c2;
194 dst[54] = d1;
195 dst[55] = d2;
196 }
197 }
198
199 /*
200 +------------------------------------------------------------------------------
201 | Function : des_indx
202 +------------------------------------------------------------------------------
203 | Description : The function generates index for S table
204 |
205 | Parameters : m[6] :
206 | Return : index value
207 +------------------------------------------------------------------------------
208 */
209 LOCAL UBYTE des_indx(UBYTE *m)
210 {
211 return( (((m[0]<<1) + m[5])<<4) + ((m[1]<<3) + (m[2]<<2) + (m[3]<<1) + m[4]));
212 }
213
214 /*
215 +------------------------------------------------------------------------------
216 | Function : cl_des
217 +------------------------------------------------------------------------------
218 | Description : The function performs DES encrypting or decrypting
219 |
220 | Parameters : inMsgPtr : pointer to input message M. The length of message
221 | has to be min. 8 bytes e.g. M = 0123456789abcdef
222 | desKeyPtr : pointer to DES key. Length has to be 8 bytes
223 | outMsgPtr : output encrypted/decrypted message. The length is 8 b.
224 | code : CL_DES_ENCRYPTION, CL_DES_DECRYPTION
225 +------------------------------------------------------------------------------
226 */
227 EXTERN void cl_des(UBYTE *inMsgPtr, UBYTE *desKeyPtr, UBYTE *outMsgPtr, UBYTE code)
228 {
229
230 int y , z , g;
231 UBYTE temp, more;
232
233 /*
234 * convert message from hex to bin format
235 */
236 for(y = 0; y < 8; y++){
237 des_hex2bin8(inMsgPtr[y], &binmsg[8 * y]);
238 }
239
240 /*
241 * Convert DES key value from hex to bin format
242 */
243 for( y = 0; y < 8; y++){
244 des_hex2bin8(desKeyPtr[y], &binkey[8 * y]);
245 }
246
247 /*
248 * Step 1: Create 16 subkeys, each of which is 48-bits long.
249 *
250 * The 64-bit key is permuted according to the table pc1,
251 * to get the 56 bit subkey K+. The subkey K+ consists of left
252 * and right halves C0 and D0, where each half has 28 bits.
253 */
254 for(y = 0 ; y < 56 ; y++)
255 cd[0][y] = binkey[pc1[y] - 1];
256 /*
257 * Create futher 15 subkeys C1-C16 and D1-D16 by left shifts of
258 * each previous key, i.e. C2 and D2 are obtained from C1 and D1 and so on.
259 */
260 for(y = 0 ; y < 16 ; y++)
261 des_shift(cd[y + 1] , cd[y] , shtamt[y]);
262
263 /*
264 * Form the keys K1-K16 by applying the pc2 permutation
265 * table to each of the concatenated pairs CnDn.
266 */
267 for(y = 0; y < 16; y++){
268 for(z = 0 ; z < 48 ; z++){
269 deskey[y][z] = cd[y + 1][pc2[z] - 1];
270 }
271 }
272
273 /*
274 * Step 2: Encode each 64-bit block of data
275 *
276 * Perform initial permutation IP of th e64 bits the message data M.
277 * This rearranges the bits according to the iporder table.
278 */
279 for(y = 0; y < 64; y++)
280 ip[y] = binmsg[iporder[y] - 1];
281
282 /*
283 * Divide the permuted block IP into left half L0
284 * and a right half R0 each of 32 bits.
285 */
286 for(y = 0; y < 32; y++){
287 l[0][y] = ip[y];
288 r[0][y] = ip[y + 32];
289 }
290
291 /*
292 * Proceed through 16 iterations, operation on two blocks:
293 * a data block of 32 bits and a key Kn of 48 bits to produce a block of 32
294 * bits. This results in a final block L16R16. In each iteration, we take
295 * the right 32 bits of the previous result and make them the left 32 bits
296 * of the current step. For the right 32 bits in the current step, we XOR
297 * the left 32 bits of the previous step.
298 */
299 for (y = 0; y < 16; y++){
300 if (code == CL_DES_ENCRYPTION)/* encryption */
301 g = y;
302 else /* decryption */
303 g = 15 - y;
304
305 /*
306 * Copie the right bits Rn of the current step
307 * to the left bits Ln+1 of the next step
308 */
309 for(z = 0; z < 32; z++)
310 l[y + 1][z] = r[y][z];
311
312 /*
313 * Expand the block Rn from 32 to 48 bits by using the selection table E.
314 * Then XOR the result with the key Kn+1.
315 */
316 for(z = 0; z < 48; z++){
317 rnew[z] = r[y][e[z] - 1];
318 xorres[z] = (rnew[z] ^ deskey[g][z]);
319 }
320
321 /*
322 * We now have 48 bits, or eight groups of six bits. We use them as
323 * addresses in tables calle "S boxes". Each group of six bits will
324 * give us an address in a different S box.
325 */
326 for(z = 0; z < 8; z++){
327 temp = s[z][des_indx(&xorres[z * 6])];
328 des_hex2bin4(temp, &scale[z * 4]);
329 }
330
331 /*
332 * Perform a permutation P of the S box output.
333 */
334 for(z = 0; z < 32; z++)
335 perm[z] = scale[sp[z] - 1];
336
337 /*
338 * XOR the result with the left half of current step
339 * and copie it to the right half of the next step
340 */
341 for(z = 0; z < 32; z++)
342 r[y+1][z] = (l[y][z] ^ perm[z]);
343 }
344
345 /*
346 * Reserve the order of the final block L16R16 to R16L16
347 */
348 for( z = 0; z < 32; z++){
349 rl[z] = r[16][z];
350 rl[z + 32] = l[16][z];
351 }
352
353 /*
354 * Apply the final inverse permutation IP
355 */
356 for( z = 0; z < 64; z++){
357 encpt[z] = rl[ipinv[z] - 1];
358 }
359
360 /*
361 * Convert from bin to hex format
362 */
363 for(z = 0; z < 8; z++){
364 outMsgPtr[z] = des_bin2hex(&encpt[8 * z]);
365 }
366 }
367 #endif /* CL_IMEI_CALYPSO_PLATFORM */
368 #endif /* CL_DES_C */