FreeCalypso > hg > tcs211-pirelli
comparison g23m/condat/com/src/comlib/cl_des.c @ 0:509db1a7b7b8
initial import: leo2moko-r1
| author | Space Falcon <falcon@ivan.Harhan.ORG> |
|---|---|
| date | Mon, 01 Jun 2015 03:24:05 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:509db1a7b7b8 |
|---|---|
| 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 */ |
