Annotation of truecrypt/crypto/serpent.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.