|
|
1.1 ! root 1: // Except as noted below copyright in this code is held by Dr B.R. Gladman ! 2: // but free direct or derivative use is permitted subject to acknowledgement ! 3: // of its origin and subject to any constraints placed on the use of the ! 4: // algorithm by its designers (if such constraints may exist, this will be ! 5: // indicated below). ! 6: // ! 7: // Dr. B. R. Gladman ( ). 25th January 2000. ! 8: // ! 9: // This is an implementation of Serpent, an encryption algorithm designed ! 10: // by Anderson, Biham and Knudsen and submitted as a candidate for the ! 11: // Advanced Encryption Standard programme of the US National Institute of ! 12: // Standards and Technology. ! 13: // ! 14: // The designers of Serpent have not placed any constraints on the use of ! 15: // this algorithm. ! 16: // ! 17: // The S box expressions used below are Copyright (C) 2000 Dag Arne Osvik. ! 18: ! 19: /* Support for multithreaded operation added by TrueCrypt Foundation */ ! 20: ! 21: #include "serpent.h" ! 22: ! 23: //static u4byte serpent_l_key[140]; ! 24: ! 25: #define sb0(r0,r1,r2,r3,r4) \ ! 26: __asm { \ ! 27: __asm xor r3,r0 \ ! 28: __asm mov r4,r1 \ ! 29: __asm and r1,r3 \ ! 30: __asm xor r4,r2 \ ! 31: __asm xor r1,r0 \ ! 32: __asm or r0,r3 \ ! 33: __asm xor r0,r4 \ ! 34: __asm xor r4,r3 \ ! 35: __asm xor r3,r2 \ ! 36: __asm or r2,r1 \ ! 37: __asm xor r2,r4 \ ! 38: __asm not r4 \ ! 39: __asm or r4,r1 \ ! 40: __asm xor r1,r3 \ ! 41: __asm xor r1,r4 \ ! 42: __asm or r3,r0 \ ! 43: __asm xor r1,r3 \ ! 44: __asm xor r4,r3 \ ! 45: } ! 46: ! 47: #define ib0(r0,r1,r2,r3,r4) \ ! 48: __asm { \ ! 49: __asm not r2 \ ! 50: __asm mov r4,r1 \ ! 51: __asm or r1,r0 \ ! 52: __asm not r4 \ ! 53: __asm xor r1,r2 \ ! 54: __asm or r2,r4 \ ! 55: __asm xor r1,r3 \ ! 56: __asm xor r0,r4 \ ! 57: __asm xor r2,r0 \ ! 58: __asm and r0,r3 \ ! 59: __asm xor r4,r0 \ ! 60: __asm or r0,r1 \ ! 61: __asm xor r0,r2 \ ! 62: __asm xor r3,r4 \ ! 63: __asm xor r2,r1 \ ! 64: __asm xor r3,r0 \ ! 65: __asm xor r3,r1 \ ! 66: __asm and r2,r3 \ ! 67: __asm xor r4,r2 \ ! 68: } ! 69: ! 70: #define sb1(r0,r1,r2,r3,r4) \ ! 71: __asm { \ ! 72: __asm not r0 \ ! 73: __asm not r2 \ ! 74: __asm mov r4,r0 \ ! 75: __asm and r0,r1 \ ! 76: __asm xor r2,r0 \ ! 77: __asm or r0,r3 \ ! 78: __asm xor r3,r2 \ ! 79: __asm xor r1,r0 \ ! 80: __asm xor r0,r4 \ ! 81: __asm or r4,r1 \ ! 82: __asm xor r1,r3 \ ! 83: __asm or r2,r0 \ ! 84: __asm and r2,r4 \ ! 85: __asm xor r0,r1 \ ! 86: __asm and r1,r2 \ ! 87: __asm xor r1,r0 \ ! 88: __asm and r0,r2 \ ! 89: __asm xor r0,r4 \ ! 90: } ! 91: ! 92: #define ib1(r0,r1,r2,r3,r4) \ ! 93: __asm { \ ! 94: __asm mov r4,r1 \ ! 95: __asm xor r1,r3 \ ! 96: __asm and r3,r1 \ ! 97: __asm xor r4,r2 \ ! 98: __asm xor r3,r0 \ ! 99: __asm or r0,r1 \ ! 100: __asm xor r2,r3 \ ! 101: __asm xor r0,r4 \ ! 102: __asm or r0,r2 \ ! 103: __asm xor r1,r3 \ ! 104: __asm xor r0,r1 \ ! 105: __asm or r1,r3 \ ! 106: __asm xor r1,r0 \ ! 107: __asm not r4 \ ! 108: __asm xor r4,r1 \ ! 109: __asm or r1,r0 \ ! 110: __asm xor r1,r0 \ ! 111: __asm or r1,r4 \ ! 112: __asm xor r3,r1 \ ! 113: } ! 114: ! 115: #define sb2(r0,r1,r2,r3,r4) \ ! 116: __asm { \ ! 117: __asm mov r4,r0 \ ! 118: __asm and r0,r2 \ ! 119: __asm xor r0,r3 \ ! 120: __asm xor r2,r1 \ ! 121: __asm xor r2,r0 \ ! 122: __asm or r3,r4 \ ! 123: __asm xor r3,r1 \ ! 124: __asm xor r4,r2 \ ! 125: __asm mov r1,r3 \ ! 126: __asm or r3,r4 \ ! 127: __asm xor r3,r0 \ ! 128: __asm and r0,r1 \ ! 129: __asm xor r4,r0 \ ! 130: __asm xor r1,r3 \ ! 131: __asm xor r1,r4 \ ! 132: __asm not r4 \ ! 133: } ! 134: ! 135: #define ib2(r0,r1,r2,r3,r4) \ ! 136: __asm { \ ! 137: __asm xor r2,r3 \ ! 138: __asm xor r3,r0 \ ! 139: __asm mov r4,r3 \ ! 140: __asm and r3,r2 \ ! 141: __asm xor r3,r1 \ ! 142: __asm or r1,r2 \ ! 143: __asm xor r1,r4 \ ! 144: __asm and r4,r3 \ ! 145: __asm xor r2,r3 \ ! 146: __asm and r4,r0 \ ! 147: __asm xor r4,r2 \ ! 148: __asm and r2,r1 \ ! 149: __asm or r2,r0 \ ! 150: __asm not r3 \ ! 151: __asm xor r2,r3 \ ! 152: __asm xor r0,r3 \ ! 153: __asm and r0,r1 \ ! 154: __asm xor r3,r4 \ ! 155: __asm xor r3,r0 \ ! 156: } ! 157: ! 158: #define sb3(r0,r1,r2,r3,r4) \ ! 159: __asm { \ ! 160: __asm mov r4,r0 \ ! 161: __asm or r0,r3 \ ! 162: __asm xor r3,r1 \ ! 163: __asm and r1,r4 \ ! 164: __asm xor r4,r2 \ ! 165: __asm xor r2,r3 \ ! 166: __asm and r3,r0 \ ! 167: __asm or r4,r1 \ ! 168: __asm xor r3,r4 \ ! 169: __asm xor r0,r1 \ ! 170: __asm and r4,r0 \ ! 171: __asm xor r1,r3 \ ! 172: __asm xor r4,r2 \ ! 173: __asm or r1,r0 \ ! 174: __asm xor r1,r2 \ ! 175: __asm xor r0,r3 \ ! 176: __asm mov r2,r1 \ ! 177: __asm or r1,r3 \ ! 178: __asm xor r1,r0 \ ! 179: } ! 180: ! 181: #define ib3(r0,r1,r2,r3,r4) \ ! 182: __asm { \ ! 183: __asm mov r4,r2 \ ! 184: __asm xor r2,r1 \ ! 185: __asm and r1,r2 \ ! 186: __asm xor r1,r0 \ ! 187: __asm and r0,r4 \ ! 188: __asm xor r4,r3 \ ! 189: __asm or r3,r1 \ ! 190: __asm xor r3,r2 \ ! 191: __asm xor r0,r4 \ ! 192: __asm xor r2,r0 \ ! 193: __asm or r0,r3 \ ! 194: __asm xor r0,r1 \ ! 195: __asm xor r4,r2 \ ! 196: __asm and r2,r3 \ ! 197: __asm or r1,r3 \ ! 198: __asm xor r1,r2 \ ! 199: __asm xor r4,r0 \ ! 200: __asm xor r2,r4 \ ! 201: } ! 202: ! 203: #define sb4(r0,r1,r2,r3,r4) \ ! 204: __asm { \ ! 205: __asm xor r1,r3 \ ! 206: __asm not r3 \ ! 207: __asm xor r2,r3 \ ! 208: __asm xor r3,r0 \ ! 209: __asm mov r4,r1 \ ! 210: __asm and r1,r3 \ ! 211: __asm xor r1,r2 \ ! 212: __asm xor r4,r3 \ ! 213: __asm xor r0,r4 \ ! 214: __asm and r2,r4 \ ! 215: __asm xor r2,r0 \ ! 216: __asm and r0,r1 \ ! 217: __asm xor r3,r0 \ ! 218: __asm or r4,r1 \ ! 219: __asm xor r4,r0 \ ! 220: __asm or r0,r3 \ ! 221: __asm xor r0,r2 \ ! 222: __asm and r2,r3 \ ! 223: __asm not r0 \ ! 224: __asm xor r4,r2 \ ! 225: } ! 226: ! 227: #define ib4(r0,r1,r2,r3,r4) \ ! 228: __asm { \ ! 229: __asm mov r4,r2 \ ! 230: __asm and r2,r3 \ ! 231: __asm xor r2,r1 \ ! 232: __asm or r1,r3 \ ! 233: __asm and r1,r0 \ ! 234: __asm xor r4,r2 \ ! 235: __asm xor r4,r1 \ ! 236: __asm and r1,r2 \ ! 237: __asm not r0 \ ! 238: __asm xor r3,r4 \ ! 239: __asm xor r1,r3 \ ! 240: __asm and r3,r0 \ ! 241: __asm xor r3,r2 \ ! 242: __asm xor r0,r1 \ ! 243: __asm and r2,r0 \ ! 244: __asm xor r3,r0 \ ! 245: __asm xor r2,r4 \ ! 246: __asm or r2,r3 \ ! 247: __asm xor r3,r0 \ ! 248: __asm xor r2,r1 \ ! 249: } ! 250: ! 251: #define sb5(r0,r1,r2,r3,r4) \ ! 252: __asm { \ ! 253: __asm xor r0,r1 \ ! 254: __asm xor r1,r3 \ ! 255: __asm not r3 \ ! 256: __asm mov r4,r1 \ ! 257: __asm and r1,r0 \ ! 258: __asm xor r2,r3 \ ! 259: __asm xor r1,r2 \ ! 260: __asm or r2,r4 \ ! 261: __asm xor r4,r3 \ ! 262: __asm and r3,r1 \ ! 263: __asm xor r3,r0 \ ! 264: __asm xor r4,r1 \ ! 265: __asm xor r4,r2 \ ! 266: __asm xor r2,r0 \ ! 267: __asm and r0,r3 \ ! 268: __asm not r2 \ ! 269: __asm xor r0,r4 \ ! 270: __asm or r4,r3 \ ! 271: __asm xor r2,r4 \ ! 272: } ! 273: ! 274: #define ib5(r0,r1,r2,r3,r4) \ ! 275: __asm { \ ! 276: __asm not r1 \ ! 277: __asm mov r4,r3 \ ! 278: __asm xor r2,r1 \ ! 279: __asm or r3,r0 \ ! 280: __asm xor r3,r2 \ ! 281: __asm or r2,r1 \ ! 282: __asm and r2,r0 \ ! 283: __asm xor r4,r3 \ ! 284: __asm xor r2,r4 \ ! 285: __asm or r4,r0 \ ! 286: __asm xor r4,r1 \ ! 287: __asm and r1,r2 \ ! 288: __asm xor r1,r3 \ ! 289: __asm xor r4,r2 \ ! 290: __asm and r3,r4 \ ! 291: __asm xor r4,r1 \ ! 292: __asm xor r3,r0 \ ! 293: __asm xor r3,r4 \ ! 294: __asm not r4 \ ! 295: } ! 296: ! 297: #define sb6(r0,r1,r2,r3,r4) \ ! 298: __asm { \ ! 299: __asm not r2 \ ! 300: __asm mov r4,r3 \ ! 301: __asm and r3,r0 \ ! 302: __asm xor r0,r4 \ ! 303: __asm xor r3,r2 \ ! 304: __asm or r2,r4 \ ! 305: __asm xor r1,r3 \ ! 306: __asm xor r2,r0 \ ! 307: __asm or r0,r1 \ ! 308: __asm xor r2,r1 \ ! 309: __asm xor r4,r0 \ ! 310: __asm or r0,r3 \ ! 311: __asm xor r0,r2 \ ! 312: __asm xor r4,r3 \ ! 313: __asm xor r4,r0 \ ! 314: __asm not r3 \ ! 315: __asm and r2,r4 \ ! 316: __asm xor r2,r3 \ ! 317: } ! 318: ! 319: #define ib6(r0,r1,r2,r3,r4) \ ! 320: __asm { \ ! 321: __asm xor r0,r2 \ ! 322: __asm mov r4,r2 \ ! 323: __asm and r2,r0 \ ! 324: __asm xor r4,r3 \ ! 325: __asm not r2 \ ! 326: __asm xor r3,r1 \ ! 327: __asm xor r2,r3 \ ! 328: __asm or r4,r0 \ ! 329: __asm xor r0,r2 \ ! 330: __asm xor r3,r4 \ ! 331: __asm xor r4,r1 \ ! 332: __asm and r1,r3 \ ! 333: __asm xor r1,r0 \ ! 334: __asm xor r0,r3 \ ! 335: __asm or r0,r2 \ ! 336: __asm xor r3,r1 \ ! 337: __asm xor r4,r0 \ ! 338: } ! 339: ! 340: #define sb7(r0,r1,r2,r3,r4) \ ! 341: __asm { \ ! 342: __asm mov r4,r2 \ ! 343: __asm and r2,r1 \ ! 344: __asm xor r2,r3 \ ! 345: __asm and r3,r1 \ ! 346: __asm xor r4,r2 \ ! 347: __asm xor r2,r1 \ ! 348: __asm xor r1,r0 \ ! 349: __asm or r0,r4 \ ! 350: __asm xor r0,r2 \ ! 351: __asm xor r3,r1 \ ! 352: __asm xor r2,r3 \ ! 353: __asm and r3,r0 \ ! 354: __asm xor r3,r4 \ ! 355: __asm xor r4,r2 \ ! 356: __asm and r2,r0 \ ! 357: __asm not r4 \ ! 358: __asm xor r2,r4 \ ! 359: __asm and r4,r0 \ ! 360: __asm xor r1,r3 \ ! 361: __asm xor r4,r1 \ ! 362: } ! 363: ! 364: #define ib7(r0,r1,r2,r3,r4) \ ! 365: __asm { \ ! 366: __asm mov r4,r2 \ ! 367: __asm xor r2,r0 \ ! 368: __asm and r0,r3 \ ! 369: __asm not r2 \ ! 370: __asm or r4,r3 \ ! 371: __asm xor r3,r1 \ ! 372: __asm or r1,r0 \ ! 373: __asm xor r0,r2 \ ! 374: __asm and r2,r4 \ ! 375: __asm xor r1,r2 \ ! 376: __asm xor r2,r0 \ ! 377: __asm or r0,r2 \ ! 378: __asm and r3,r4 \ ! 379: __asm xor r0,r3 \ ! 380: __asm xor r4,r1 \ ! 381: __asm xor r3,r4 \ ! 382: __asm or r4,r0 \ ! 383: __asm xor r3,r2 \ ! 384: __asm xor r4,r2 \ ! 385: } ! 386: ! 387: #define f_key(r0,r1,r2,r3) \ ! 388: __asm { \ ! 389: __asm mov r0,[esi] \ ! 390: __asm mov r1,[esi+4] \ ! 391: __asm mov r2,[esi+8] \ ! 392: __asm mov r3,[esi+12] \ ! 393: } ! 394: ! 395: #define t_key(r0,r1,r2,r3) \ ! 396: __asm { \ ! 397: __asm mov [esi ],r0 \ ! 398: __asm mov [esi+4],r1 \ ! 399: __asm mov [esi+8],r2 \ ! 400: __asm mov [esi+12],r3 \ ! 401: __asm add esi,16 \ ! 402: } ! 403: ! 404: #define f_xor(r0,r1,r2,r3) \ ! 405: __asm { \ ! 406: __asm xor r0,[esi] \ ! 407: __asm xor r1,[esi+4] \ ! 408: __asm xor r2,[esi+8] \ ! 409: __asm xor r3,[esi+12] \ ! 410: __asm add esi,16 \ ! 411: } ! 412: ! 413: #define i_xor(r0,r1,r2,r3) \ ! 414: __asm { \ ! 415: __asm sub esi,16 \ ! 416: __asm xor r0,[esi] \ ! 417: __asm xor r1,[esi+4] \ ! 418: __asm xor r2,[esi+8] \ ! 419: __asm xor r3,[esi+12] \ ! 420: } ! 421: ! 422: // the linear transformation and its inverse ! 423: ! 424: #define rot(r0,r1,r2,r3,r4) \ ! 425: __asm { \ ! 426: __asm rol r0,13 \ ! 427: __asm rol r2,3 \ ! 428: __asm mov r4,r0 \ ! 429: __asm sal r4,3 \ ! 430: __asm xor r3,r2 \ ! 431: __asm xor r3,r4 \ ! 432: __asm xor r1,r0 \ ! 433: __asm xor r1,r2 \ ! 434: __asm rol r1,1 \ ! 435: __asm rol r3,7 \ ! 436: __asm mov r4,r1 \ ! 437: __asm xor r0,r1 \ ! 438: __asm xor r0,r3 \ ! 439: __asm sal r4,7 \ ! 440: __asm xor r2,r3 \ ! 441: __asm xor r2,r4 \ ! 442: __asm rol r0,5 \ ! 443: __asm rol r2,22 \ ! 444: } ! 445: ! 446: #define irot(r0,r1,r2,r3,r4) \ ! 447: __asm { \ ! 448: __asm ror r2,22 \ ! 449: __asm ror r0,5 \ ! 450: __asm mov r4,r1 \ ! 451: __asm sal r4,7 \ ! 452: __asm xor r2,r3 \ ! 453: __asm xor r2,r4 \ ! 454: __asm xor r0,r1 \ ! 455: __asm xor r0,r3 \ ! 456: __asm ror r3,7 \ ! 457: __asm mov r4,r0 \ ! 458: __asm ror r1,1 \ ! 459: __asm sal r4,3 \ ! 460: __asm xor r3,r2 \ ! 461: __asm xor r3,r4 \ ! 462: __asm xor r1,r0 \ ! 463: __asm xor r1,r2 \ ! 464: __asm ror r2,3 \ ! 465: __asm ror r0,13 \ ! 466: } ! 467: ! 468: char* serpent_name(void) ! 469: { ! 470: return "serpent"; ! 471: } ! 472: ! 473: // initialise the key schedule from the user supplied key ! 474: ! 475: #define k_loop \ ! 476: f_key(eax,ebx,ecx,edx); sb3(eax,ebx,ecx,edx,edi); t_key(ebx,ecx,edx,edi); \ ! 477: f_key(eax,ebx,ecx,edx); sb2(eax,ebx,ecx,edx,edi); t_key(ecx,edx,ebx,edi); \ ! 478: f_key(eax,ebx,ecx,edx); sb1(eax,ebx,ecx,edx,edi); t_key(ecx,eax,edx,ebx); \ ! 479: f_key(eax,ebx,ecx,edx); sb0(eax,ebx,ecx,edx,edi); t_key(ebx,edi,ecx,eax); \ ! 480: f_key(eax,ebx,ecx,edx); sb7(eax,ebx,ecx,edx,edi); t_key(ecx,edi,edx,eax); \ ! 481: f_key(eax,ebx,ecx,edx); sb6(eax,ebx,ecx,edx,edi); t_key(eax,ebx,edi,ecx); \ ! 482: f_key(eax,ebx,ecx,edx); sb5(eax,ebx,ecx,edx,edi); t_key(ebx,edx,eax,ecx); \ ! 483: f_key(eax,ebx,ecx,edx); sb4(eax,ebx,ecx,edx,edi); t_key(ebx,edi,eax,edx); ! 484: ! 485: void serpent_set_key(const u1byte in_key[], const u4byte key_len, u1byte *serpent_l_key) ! 486: { ! 487: __asm mov edx,key_len ! 488: __asm cmp edx,256 ! 489: __asm ja short l3 ! 490: ! 491: #ifdef __cplusplus ! 492: __asm mov ebx,this ! 493: __asm lea ebx,[ebx].l_key ! 494: #else ! 495: __asm mov ebx,serpent_l_key ! 496: #endif ! 497: __asm mov esi,in_key ! 498: __asm mov ecx,edx ! 499: __asm add ecx,31 ! 500: __asm sar ecx,5 ! 501: __asm je short l0 ! 502: __asm mov edi,ebx ! 503: __asm mov eax,ecx ! 504: __asm rep movsd ! 505: l0: __asm cmp edx,256 ! 506: __asm je short l1 ! 507: __asm mov ecx,8 ! 508: __asm sub ecx,eax ! 509: __asm xor eax,eax ! 510: __asm rep stosd ! 511: __asm mov ecx,edx ! 512: __asm mov edx,1 ! 513: __asm sal edx,cl ! 514: __asm sar ecx,5 ! 515: __asm mov eax,edx ! 516: __asm dec eax ! 517: __asm and eax,[ebx+4*ecx] ! 518: __asm or eax,edx ! 519: __asm mov [ebx+4*ecx],eax ! 520: l1: __asm mov esi,ebx ! 521: __asm mov eax,0x9e3779b9 ! 522: __asm mov ebx,eax ! 523: __asm xor eax,[esi+ 8] ! 524: __asm xor ebx,[esi+12] ! 525: __asm xor eax,[esi+16] ! 526: __asm xor ebx,[esi+20] ! 527: __asm xor eax,[esi+24] ! 528: __asm xor ebx,[esi+28] ! 529: __asm mov ecx,0 ! 530: __asm push esi ! 531: l2: __asm mov edx,[esi] ! 532: __asm xor edx,ecx ! 533: __asm xor edx,ebx ! 534: __asm ror edx,21 ! 535: __asm mov [esi+32],edx ! 536: __asm xor eax,[esi+8] ! 537: __asm xor eax,edx ! 538: __asm add esi,4 ! 539: __asm inc ecx ! 540: __asm mov edx,[esi] ! 541: __asm xor edx,ecx ! 542: __asm xor edx,eax ! 543: __asm ror edx,21 ! 544: __asm mov [esi+32],edx ! 545: __asm xor ebx,[esi+8] ! 546: __asm xor ebx,edx ! 547: __asm add esi,4 ! 548: __asm inc ecx ! 549: __asm cmp ecx,132 ! 550: __asm jne l2 ! 551: __asm pop esi ! 552: __asm add esi,4*8 ! 553: ! 554: k_loop; ! 555: k_loop; ! 556: k_loop; ! 557: k_loop; ! 558: f_key(eax,ebx,ecx,edx); ! 559: sb3(eax,ebx,ecx,edx,edi); ! 560: t_key(ebx,ecx,edx,edi); ! 561: ! 562: l3: return; ! 563: } ! 564: ! 565: // encrypt a block of text ! 566: ! 567: #define f_loop(a,b,c,d,t) \ ! 568: f_xor(a,b,c,d); sb0(a,b,c,d,t); rot(b,t,c,a,d); \ ! 569: f_xor(b,t,c,a); sb1(b,t,c,a,d); rot(c,b,a,t,d); \ ! 570: f_xor(c,b,a,t); sb2(c,b,a,t,d); rot(a,t,b,d,c); \ ! 571: f_xor(a,t,b,d); sb3(a,t,b,d,c); rot(t,b,d,c,a); \ ! 572: f_xor(t,b,d,c); sb4(t,b,d,c,a); rot(b,a,t,c,d); \ ! 573: f_xor(b,a,t,c); sb5(b,a,t,c,d); rot(a,c,b,t,d); \ ! 574: f_xor(a,c,b,t); sb6(a,c,b,t,d); rot(a,c,d,b,t); \ ! 575: f_xor(a,c,d,b); sb7(a,c,d,b,t); ! 576: ! 577: void serpent_encrypt(const u1byte in_blk[16], u1byte out_blk[16], u1byte *serpent_l_key) ! 578: { ! 579: __asm mov esi,in_blk ! 580: __asm mov eax,[esi] ! 581: __asm mov ebx,[esi+4] ! 582: __asm mov ecx,[esi+8] ! 583: __asm mov edx,[esi+12] ! 584: ! 585: #ifdef __cplusplus ! 586: __asm mov esi,this ! 587: __asm lea esi,[esi].l_key + 4*8 ! 588: #else ! 589: __asm mov esi,serpent_l_key ! 590: __asm add esi,4*8 ! 591: #endif ! 592: ! 593: f_loop(eax,ebx,ecx,edx,edi); rot(edx,edi,ebx,eax,ecx); ! 594: f_loop(edx,edi,ebx,eax,ecx); rot(eax,ecx,edi,edx,ebx); ! 595: f_loop(eax,ecx,edi,edx,ebx); rot(edx,ebx,ecx,eax,edi); ! 596: f_loop(edx,ebx,ecx,eax,edi); f_xor(eax,edi,ebx,edx); ! 597: ! 598: __asm mov esi,out_blk ! 599: __asm mov [esi],eax ! 600: __asm mov [esi+4],edi ! 601: __asm mov [esi+8],ebx ! 602: __asm mov [esi+12],edx ! 603: } ! 604: ! 605: // decrypt a block of text ! 606: ! 607: #define i_loop(a,b,c,d,t) \ ! 608: ib7(a,b,c,d,t); i_xor(d,a,b,t); \ ! 609: irot(d,a,b,t,c); ib6(d,a,b,t,c); i_xor(a,b,c,t); \ ! 610: irot(a,b,c,t,d); ib5(a,b,c,t,d); i_xor(b,d,t,c); \ ! 611: irot(b,d,t,c,a); ib4(b,d,t,c,a); i_xor(b,c,t,a); \ ! 612: irot(b,c,t,a,d); ib3(b,c,t,a,d); i_xor(a,b,t,c); \ ! 613: irot(a,b,t,c,d); ib2(a,b,t,c,d); i_xor(b,d,t,c); \ ! 614: irot(b,d,t,c,a); ib1(b,d,t,c,a); i_xor(a,b,c,t); \ ! 615: irot(a,b,c,t,d); ib0(a,b,c,t,d); i_xor(a,d,b,t); ! 616: ! 617: void serpent_decrypt(const u1byte in_blk[16], u1byte out_blk[16], u1byte *serpent_l_key) ! 618: { ! 619: __asm mov esi,in_blk ! 620: __asm mov eax,[esi] ! 621: __asm mov ebx,[esi+4] ! 622: __asm mov ecx,[esi+8] ! 623: __asm mov edx,[esi+12] ! 624: ! 625: #ifdef __cplusplus ! 626: __asm mov esi,this ! 627: __asm lea esi,[esi].l_key + 4*140 ! 628: #else ! 629: __asm mov esi,serpent_l_key ! 630: __asm add esi,4*140 ! 631: #endif ! 632: ! 633: i_xor(eax,ebx,ecx,edx); i_loop(eax,ebx,ecx,edx,edi); ! 634: irot(eax,edx,ebx,edi,ecx); i_loop(eax,edx,ebx,edi,ecx); ! 635: irot(eax,edi,edx,ecx,ebx); i_loop(eax,edi,edx,ecx,ebx); ! 636: irot(eax,ecx,edi,ebx,edx); i_loop(eax,ecx,edi,ebx,edx); ! 637: ! 638: __asm mov esi,out_blk ! 639: __asm mov [esi],eax ! 640: __asm mov [esi+4],ebx ! 641: __asm mov [esi+8],ecx ! 642: __asm mov [esi+12],edx ! 643: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.