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

1.1.1.2   root        1: // serpent.cpp - written and placed in the public domain by Wei Dai
1.1       root        2: 
1.1.1.2   root        3: /* Adapted for TrueCrypt by the TrueCrypt Foundation */
1.1       root        4: 
1.1.1.5 ! root        5: #ifdef TC_WINDOWS_BOOT
        !             6: #pragma optimize ("t", on)
        !             7: #endif
        !             8: 
1.1.1.2   root        9: #include "Serpent.h"
1.1.1.3   root       10: #include "Common/Endian.h"
1.1       root       11: 
1.1.1.2   root       12: #include <memory.h>
1.1       root       13: 
1.1.1.2   root       14: #if defined(_WIN32) && !defined(_DEBUG)
                     15: #include <stdlib.h>
                     16: #define rotlFixed _rotl
                     17: #define rotrFixed _rotr
1.1       root       18: #else
1.1.1.2   root       19: #define rotlFixed(x,n)   (((x) << (n)) | ((x) >> (32 - (n))))
                     20: #define rotrFixed(x,n)   (((x) >> (n)) | ((x) << (32 - (n))))
1.1       root       21: #endif
                     22: 
1.1.1.2   root       23: // linear transformation
                     24: #define LT(i,a,b,c,d,e)        {\
                     25:        a = rotlFixed(a, 13);   \
                     26:        c = rotlFixed(c, 3);    \
                     27:        d = rotlFixed(d ^ c ^ (a << 3), 7);     \
                     28:        b = rotlFixed(b ^ a ^ c, 1);    \
                     29:        a = rotlFixed(a ^ b ^ d, 5);            \
                     30:        c = rotlFixed(c ^ d ^ (b << 7), 22);}
                     31: 
                     32: // inverse linear transformation
                     33: #define ILT(i,a,b,c,d,e)       {\
                     34:        c = rotrFixed(c, 22);   \
                     35:        a = rotrFixed(a, 5);    \
                     36:        c ^= d ^ (b << 7);      \
                     37:        a ^= b ^ d;             \
                     38:        b = rotrFixed(b, 1);    \
                     39:        d = rotrFixed(d, 7) ^ c ^ (a << 3);     \
                     40:        b ^= a ^ c;             \
                     41:        c = rotrFixed(c, 3);    \
                     42:        a = rotrFixed(a, 13);}
                     43: 
                     44: // order of output from S-box functions
                     45: #define beforeS0(f) f(0,a,b,c,d,e)
                     46: #define afterS0(f) f(1,b,e,c,a,d)
                     47: #define afterS1(f) f(2,c,b,a,e,d)
                     48: #define afterS2(f) f(3,a,e,b,d,c)
                     49: #define afterS3(f) f(4,e,b,d,c,a)
                     50: #define afterS4(f) f(5,b,a,e,c,d)
                     51: #define afterS5(f) f(6,a,c,b,e,d)
                     52: #define afterS6(f) f(7,a,c,d,b,e)
                     53: #define afterS7(f) f(8,d,e,b,a,c)
                     54: 
                     55: // order of output from inverse S-box functions
                     56: #define beforeI7(f) f(8,a,b,c,d,e)
                     57: #define afterI7(f) f(7,d,a,b,e,c)
                     58: #define afterI6(f) f(6,a,b,c,e,d)
                     59: #define afterI5(f) f(5,b,d,e,c,a)
                     60: #define afterI4(f) f(4,b,c,e,a,d)
                     61: #define afterI3(f) f(3,a,b,e,c,d)
                     62: #define afterI2(f) f(2,b,d,e,c,a)
                     63: #define afterI1(f) f(1,a,b,c,e,d)
                     64: #define afterI0(f) f(0,a,d,b,e,c)
                     65: 
                     66: // The instruction sequences for the S-box functions 
                     67: // come from Dag Arne Osvik's paper "Speeding up Serpent".
                     68: 
                     69: #define S0(i, r0, r1, r2, r3, r4) \
                     70:        {           \
                     71:     r3 ^= r0;   \
                     72:     r4 = r1;   \
                     73:     r1 &= r3;   \
                     74:     r4 ^= r2;   \
                     75:     r1 ^= r0;   \
                     76:     r0 |= r3;   \
                     77:     r0 ^= r4;   \
                     78:     r4 ^= r3;   \
                     79:     r3 ^= r2;   \
                     80:     r2 |= r1;   \
                     81:     r2 ^= r4;   \
                     82:     r4 = ~r4;      \
                     83:     r4 |= r1;   \
                     84:     r1 ^= r3;   \
                     85:     r1 ^= r4;   \
                     86:     r3 |= r0;   \
                     87:     r1 ^= r3;   \
                     88:     r4 ^= r3;   \
                     89:             }
                     90: 
                     91: #define I0(i, r0, r1, r2, r3, r4) \
                     92:        {           \
                     93:     r2 = ~r2;      \
                     94:     r4 = r1;   \
                     95:     r1 |= r0;   \
                     96:     r4 = ~r4;      \
                     97:     r1 ^= r2;   \
                     98:     r2 |= r4;   \
                     99:     r1 ^= r3;   \
                    100:     r0 ^= r4;   \
                    101:     r2 ^= r0;   \
                    102:     r0 &= r3;   \
                    103:     r4 ^= r0;   \
                    104:     r0 |= r1;   \
                    105:     r0 ^= r2;   \
                    106:     r3 ^= r4;   \
                    107:     r2 ^= r1;   \
                    108:     r3 ^= r0;   \
                    109:     r3 ^= r1;   \
                    110:     r2 &= r3;   \
                    111:     r4 ^= r2;   \
                    112:             }
                    113: 
                    114: #define S1(i, r0, r1, r2, r3, r4) \
                    115:        {           \
                    116:     r0 = ~r0;      \
                    117:     r2 = ~r2;      \
                    118:     r4 = r0;   \
                    119:     r0 &= r1;   \
                    120:     r2 ^= r0;   \
                    121:     r0 |= r3;   \
                    122:     r3 ^= r2;   \
                    123:     r1 ^= r0;   \
                    124:     r0 ^= r4;   \
                    125:     r4 |= r1;   \
                    126:     r1 ^= r3;   \
                    127:     r2 |= r0;   \
                    128:     r2 &= r4;   \
                    129:     r0 ^= r1;   \
                    130:     r1 &= r2;   \
                    131:     r1 ^= r0;   \
                    132:     r0 &= r2;   \
                    133:     r0 ^= r4;   \
                    134:             }
                    135: 
                    136: #define I1(i, r0, r1, r2, r3, r4) \
                    137:        {           \
                    138:     r4 = r1;   \
                    139:     r1 ^= r3;   \
                    140:     r3 &= r1;   \
                    141:     r4 ^= r2;   \
                    142:     r3 ^= r0;   \
                    143:     r0 |= r1;   \
                    144:     r2 ^= r3;   \
                    145:     r0 ^= r4;   \
                    146:     r0 |= r2;   \
                    147:     r1 ^= r3;   \
                    148:     r0 ^= r1;   \
                    149:     r1 |= r3;   \
                    150:     r1 ^= r0;   \
                    151:     r4 = ~r4;      \
                    152:     r4 ^= r1;   \
                    153:     r1 |= r0;   \
                    154:     r1 ^= r0;   \
                    155:     r1 |= r4;   \
                    156:     r3 ^= r1;   \
                    157:             }
                    158: 
                    159: #define S2(i, r0, r1, r2, r3, r4) \
                    160:        {           \
                    161:     r4 = r0;   \
                    162:     r0 &= r2;   \
                    163:     r0 ^= r3;   \
                    164:     r2 ^= r1;   \
                    165:     r2 ^= r0;   \
                    166:     r3 |= r4;   \
                    167:     r3 ^= r1;   \
                    168:     r4 ^= r2;   \
                    169:     r1 = r3;   \
                    170:     r3 |= r4;   \
                    171:     r3 ^= r0;   \
                    172:     r0 &= r1;   \
                    173:     r4 ^= r0;   \
                    174:     r1 ^= r3;   \
                    175:     r1 ^= r4;   \
                    176:     r4 = ~r4;      \
                    177:             }
                    178: 
                    179: #define I2(i, r0, r1, r2, r3, r4) \
                    180:        {           \
                    181:     r2 ^= r3;   \
                    182:     r3 ^= r0;   \
                    183:     r4 = r3;   \
                    184:     r3 &= r2;   \
                    185:     r3 ^= r1;   \
                    186:     r1 |= r2;   \
                    187:     r1 ^= r4;   \
                    188:     r4 &= r3;   \
                    189:     r2 ^= r3;   \
                    190:     r4 &= r0;   \
                    191:     r4 ^= r2;   \
                    192:     r2 &= r1;   \
                    193:     r2 |= r0;   \
                    194:     r3 = ~r3;      \
                    195:     r2 ^= r3;   \
                    196:     r0 ^= r3;   \
                    197:     r0 &= r1;   \
                    198:     r3 ^= r4;   \
                    199:     r3 ^= r0;   \
                    200:             }
                    201: 
                    202: #define S3(i, r0, r1, r2, r3, r4) \
                    203:        {           \
                    204:     r4 = r0;   \
                    205:     r0 |= r3;   \
                    206:     r3 ^= r1;   \
                    207:     r1 &= r4;   \
                    208:     r4 ^= r2;   \
                    209:     r2 ^= r3;   \
                    210:     r3 &= r0;   \
                    211:     r4 |= r1;   \
                    212:     r3 ^= r4;   \
                    213:     r0 ^= r1;   \
                    214:     r4 &= r0;   \
                    215:     r1 ^= r3;   \
                    216:     r4 ^= r2;   \
                    217:     r1 |= r0;   \
                    218:     r1 ^= r2;   \
                    219:     r0 ^= r3;   \
                    220:     r2 = r1;   \
                    221:     r1 |= r3;   \
                    222:     r1 ^= r0;   \
                    223:             }
                    224: 
                    225: #define I3(i, r0, r1, r2, r3, r4) \
                    226:        {           \
                    227:     r4 = r2;   \
                    228:     r2 ^= r1;   \
                    229:     r1 &= r2;   \
                    230:     r1 ^= r0;   \
                    231:     r0 &= r4;   \
                    232:     r4 ^= r3;   \
                    233:     r3 |= r1;   \
                    234:     r3 ^= r2;   \
                    235:     r0 ^= r4;   \
                    236:     r2 ^= r0;   \
                    237:     r0 |= r3;   \
                    238:     r0 ^= r1;   \
                    239:     r4 ^= r2;   \
                    240:     r2 &= r3;   \
                    241:     r1 |= r3;   \
                    242:     r1 ^= r2;   \
                    243:     r4 ^= r0;   \
                    244:     r2 ^= r4;   \
                    245:             }
                    246: 
                    247: #define S4(i, r0, r1, r2, r3, r4) \
                    248:        {           \
                    249:     r1 ^= r3;   \
                    250:     r3 = ~r3;      \
                    251:     r2 ^= r3;   \
                    252:     r3 ^= r0;   \
                    253:     r4 = r1;   \
                    254:     r1 &= r3;   \
                    255:     r1 ^= r2;   \
                    256:     r4 ^= r3;   \
                    257:     r0 ^= r4;   \
                    258:     r2 &= r4;   \
                    259:     r2 ^= r0;   \
                    260:     r0 &= r1;   \
                    261:     r3 ^= r0;   \
                    262:     r4 |= r1;   \
                    263:     r4 ^= r0;   \
                    264:     r0 |= r3;   \
                    265:     r0 ^= r2;   \
                    266:     r2 &= r3;   \
                    267:     r0 = ~r0;      \
                    268:     r4 ^= r2;   \
                    269:             }
                    270: 
                    271: #define I4(i, r0, r1, r2, r3, r4) \
                    272:        {           \
                    273:     r4 = r2;   \
                    274:     r2 &= r3;   \
                    275:     r2 ^= r1;   \
                    276:     r1 |= r3;   \
                    277:     r1 &= r0;   \
                    278:     r4 ^= r2;   \
                    279:     r4 ^= r1;   \
                    280:     r1 &= r2;   \
                    281:     r0 = ~r0;      \
                    282:     r3 ^= r4;   \
                    283:     r1 ^= r3;   \
                    284:     r3 &= r0;   \
                    285:     r3 ^= r2;   \
                    286:     r0 ^= r1;   \
                    287:     r2 &= r0;   \
                    288:     r3 ^= r0;   \
                    289:     r2 ^= r4;   \
                    290:     r2 |= r3;   \
                    291:     r3 ^= r0;   \
                    292:     r2 ^= r1;   \
                    293:             }
                    294: 
                    295: #define S5(i, r0, r1, r2, r3, r4) \
                    296:        {           \
                    297:     r0 ^= r1;   \
                    298:     r1 ^= r3;   \
                    299:     r3 = ~r3;      \
                    300:     r4 = r1;   \
                    301:     r1 &= r0;   \
                    302:     r2 ^= r3;   \
                    303:     r1 ^= r2;   \
                    304:     r2 |= r4;   \
                    305:     r4 ^= r3;   \
                    306:     r3 &= r1;   \
                    307:     r3 ^= r0;   \
                    308:     r4 ^= r1;   \
                    309:     r4 ^= r2;   \
                    310:     r2 ^= r0;   \
                    311:     r0 &= r3;   \
                    312:     r2 = ~r2;      \
                    313:     r0 ^= r4;   \
                    314:     r4 |= r3;   \
                    315:     r2 ^= r4;   \
                    316:             }
                    317: 
                    318: #define I5(i, r0, r1, r2, r3, r4) \
                    319:        {           \
                    320:     r1 = ~r1;      \
                    321:     r4 = r3;   \
                    322:     r2 ^= r1;   \
                    323:     r3 |= r0;   \
                    324:     r3 ^= r2;   \
                    325:     r2 |= r1;   \
                    326:     r2 &= r0;   \
                    327:     r4 ^= r3;   \
                    328:     r2 ^= r4;   \
                    329:     r4 |= r0;   \
                    330:     r4 ^= r1;   \
                    331:     r1 &= r2;   \
                    332:     r1 ^= r3;   \
                    333:     r4 ^= r2;   \
                    334:     r3 &= r4;   \
                    335:     r4 ^= r1;   \
                    336:     r3 ^= r0;   \
                    337:     r3 ^= r4;   \
                    338:     r4 = ~r4;      \
                    339:             }
                    340: 
                    341: #define S6(i, r0, r1, r2, r3, r4) \
                    342:        {           \
                    343:     r2 = ~r2;      \
                    344:     r4 = r3;   \
                    345:     r3 &= r0;   \
                    346:     r0 ^= r4;   \
                    347:     r3 ^= r2;   \
                    348:     r2 |= r4;   \
                    349:     r1 ^= r3;   \
                    350:     r2 ^= r0;   \
                    351:     r0 |= r1;   \
                    352:     r2 ^= r1;   \
                    353:     r4 ^= r0;   \
                    354:     r0 |= r3;   \
                    355:     r0 ^= r2;   \
                    356:     r4 ^= r3;   \
                    357:     r4 ^= r0;   \
                    358:     r3 = ~r3;      \
                    359:     r2 &= r4;   \
                    360:     r2 ^= r3;   \
                    361:             }
                    362: 
                    363: #define I6(i, r0, r1, r2, r3, r4) \
                    364:        {           \
                    365:     r0 ^= r2;   \
                    366:     r4 = r2;   \
                    367:     r2 &= r0;   \
                    368:     r4 ^= r3;   \
                    369:     r2 = ~r2;      \
                    370:     r3 ^= r1;   \
                    371:     r2 ^= r3;   \
                    372:     r4 |= r0;   \
                    373:     r0 ^= r2;   \
                    374:     r3 ^= r4;   \
                    375:     r4 ^= r1;   \
                    376:     r1 &= r3;   \
                    377:     r1 ^= r0;   \
                    378:     r0 ^= r3;   \
                    379:     r0 |= r2;   \
                    380:     r3 ^= r1;   \
                    381:     r4 ^= r0;   \
                    382:             }
                    383: 
                    384: #define S7(i, r0, r1, r2, r3, r4) \
                    385:        {           \
                    386:     r4 = r2;   \
                    387:     r2 &= r1;   \
                    388:     r2 ^= r3;   \
                    389:     r3 &= r1;   \
                    390:     r4 ^= r2;   \
                    391:     r2 ^= r1;   \
                    392:     r1 ^= r0;   \
                    393:     r0 |= r4;   \
                    394:     r0 ^= r2;   \
                    395:     r3 ^= r1;   \
                    396:     r2 ^= r3;   \
                    397:     r3 &= r0;   \
                    398:     r3 ^= r4;   \
                    399:     r4 ^= r2;   \
                    400:     r2 &= r0;   \
                    401:     r4 = ~r4;      \
                    402:     r2 ^= r4;   \
                    403:     r4 &= r0;   \
                    404:     r1 ^= r3;   \
                    405:     r4 ^= r1;   \
                    406:             }
                    407: 
                    408: #define I7(i, r0, r1, r2, r3, r4) \
                    409:        {           \
                    410:     r4 = r2;   \
                    411:     r2 ^= r0;   \
                    412:     r0 &= r3;   \
                    413:     r2 = ~r2;      \
                    414:     r4 |= r3;   \
                    415:     r3 ^= r1;   \
                    416:     r1 |= r0;   \
                    417:     r0 ^= r2;   \
                    418:     r2 &= r4;   \
                    419:     r1 ^= r2;   \
                    420:     r2 ^= r0;   \
                    421:     r0 |= r2;   \
                    422:     r3 &= r4;   \
                    423:     r0 ^= r3;   \
                    424:     r4 ^= r1;   \
                    425:     r3 ^= r4;   \
                    426:     r4 |= r0;   \
                    427:     r3 ^= r2;   \
                    428:     r4 ^= r2;   \
                    429:             }
                    430: 
                    431: // key xor
                    432: #define KX(r, a, b, c, d, e)   {\
                    433:        a ^= k[4 * r + 0]; \
                    434:        b ^= k[4 * r + 1]; \
                    435:        c ^= k[4 * r + 2]; \
                    436:        d ^= k[4 * r + 3];}
1.1       root      437: 
                    438: 
1.1.1.5 ! root      439: #ifdef TC_MINIMIZE_CODE_SIZE
        !           440: 
        !           441: static void S0f (unsigned __int32 *r0, unsigned __int32 *r1, unsigned __int32 *r2, unsigned __int32 *r3, unsigned __int32 *r4)
        !           442: {
        !           443:        *r3 ^= *r0;
        !           444:        *r4 = *r1;
        !           445:        *r1 &= *r3;
        !           446:        *r4 ^= *r2;
        !           447:        *r1 ^= *r0;
        !           448:        *r0 |= *r3;
        !           449:        *r0 ^= *r4;
        !           450:        *r4 ^= *r3;
        !           451:        *r3 ^= *r2;
        !           452:        *r2 |= *r1;
        !           453:        *r2 ^= *r4;
        !           454:        *r4 = ~*r4;
        !           455:        *r4 |= *r1;
        !           456:        *r1 ^= *r3;
        !           457:        *r1 ^= *r4;
        !           458:        *r3 |= *r0;
        !           459:        *r1 ^= *r3;
        !           460:        *r4 ^= *r3;
        !           461: }
        !           462: 
        !           463: static void S1f (unsigned __int32 *r0, unsigned __int32 *r1, unsigned __int32 *r2, unsigned __int32 *r3, unsigned __int32 *r4)
        !           464: {        
        !           465:     *r0 = ~*r0;   
        !           466:     *r2 = ~*r2;   
        !           467:     *r4 = *r0;
        !           468:     *r0 &= *r1;
        !           469:     *r2 ^= *r0;
        !           470:     *r0 |= *r3;
        !           471:     *r3 ^= *r2;
        !           472:     *r1 ^= *r0;
        !           473:     *r0 ^= *r4;
        !           474:     *r4 |= *r1;
        !           475:     *r1 ^= *r3;
        !           476:     *r2 |= *r0;
        !           477:     *r2 &= *r4;
        !           478:     *r0 ^= *r1;
        !           479:     *r1 &= *r2;
        !           480:     *r1 ^= *r0;
        !           481:     *r0 &= *r2;
        !           482:     *r0 ^= *r4;
        !           483: }
        !           484: 
        !           485: static void S2f (unsigned __int32 *r0, unsigned __int32 *r1, unsigned __int32 *r2, unsigned __int32 *r3, unsigned __int32 *r4)
        !           486: {        
        !           487:        *r4 = *r0;
        !           488:        *r0 &= *r2;
        !           489:        *r0 ^= *r3;
        !           490:        *r2 ^= *r1;
        !           491:        *r2 ^= *r0;
        !           492:        *r3 |= *r4;
        !           493:        *r3 ^= *r1;
        !           494:        *r4 ^= *r2;
        !           495:        *r1 = *r3;
        !           496:        *r3 |= *r4;
        !           497:        *r3 ^= *r0;
        !           498:        *r0 &= *r1;
        !           499:        *r4 ^= *r0;
        !           500:        *r1 ^= *r3;
        !           501:        *r1 ^= *r4;
        !           502:        *r4 = ~*r4;   
        !           503: }
        !           504: 
        !           505: static void S3f (unsigned __int32 *r0, unsigned __int32 *r1, unsigned __int32 *r2, unsigned __int32 *r3, unsigned __int32 *r4)
        !           506: {        
        !           507:        *r4 = *r0;
        !           508:        *r0 |= *r3;
        !           509:        *r3 ^= *r1;
        !           510:        *r1 &= *r4;
        !           511:        *r4 ^= *r2;
        !           512:        *r2 ^= *r3;
        !           513:        *r3 &= *r0;
        !           514:        *r4 |= *r1;
        !           515:        *r3 ^= *r4;
        !           516:        *r0 ^= *r1;
        !           517:        *r4 &= *r0;
        !           518:        *r1 ^= *r3;
        !           519:        *r4 ^= *r2;
        !           520:        *r1 |= *r0;
        !           521:        *r1 ^= *r2;
        !           522:        *r0 ^= *r3;
        !           523:        *r2 = *r1;
        !           524:        *r1 |= *r3;
        !           525:        *r1 ^= *r0;
        !           526: }
        !           527: 
        !           528: static void S4f (unsigned __int32 *r0, unsigned __int32 *r1, unsigned __int32 *r2, unsigned __int32 *r3, unsigned __int32 *r4)
        !           529: {        
        !           530:        *r1 ^= *r3;
        !           531:        *r3 = ~*r3;   
        !           532:        *r2 ^= *r3;
        !           533:        *r3 ^= *r0;
        !           534:        *r4 = *r1;
        !           535:        *r1 &= *r3;
        !           536:        *r1 ^= *r2;
        !           537:        *r4 ^= *r3;
        !           538:        *r0 ^= *r4;
        !           539:        *r2 &= *r4;
        !           540:        *r2 ^= *r0;
        !           541:        *r0 &= *r1;
        !           542:        *r3 ^= *r0;
        !           543:        *r4 |= *r1;
        !           544:        *r4 ^= *r0;
        !           545:        *r0 |= *r3;
        !           546:        *r0 ^= *r2;
        !           547:        *r2 &= *r3;
        !           548:        *r0 = ~*r0;   
        !           549:        *r4 ^= *r2;
        !           550: }
        !           551: 
        !           552: static void S5f (unsigned __int32 *r0, unsigned __int32 *r1, unsigned __int32 *r2, unsigned __int32 *r3, unsigned __int32 *r4)
        !           553: {        
        !           554:        *r0 ^= *r1;
        !           555:        *r1 ^= *r3;
        !           556:        *r3 = ~*r3;   
        !           557:        *r4 = *r1;
        !           558:        *r1 &= *r0;
        !           559:        *r2 ^= *r3;
        !           560:        *r1 ^= *r2;
        !           561:        *r2 |= *r4;
        !           562:        *r4 ^= *r3;
        !           563:        *r3 &= *r1;
        !           564:        *r3 ^= *r0;
        !           565:        *r4 ^= *r1;
        !           566:        *r4 ^= *r2;
        !           567:        *r2 ^= *r0;
        !           568:        *r0 &= *r3;
        !           569:        *r2 = ~*r2;   
        !           570:        *r0 ^= *r4;
        !           571:        *r4 |= *r3;
        !           572:        *r2 ^= *r4;
        !           573: }
        !           574: 
        !           575: static void S6f (unsigned __int32 *r0, unsigned __int32 *r1, unsigned __int32 *r2, unsigned __int32 *r3, unsigned __int32 *r4)
        !           576: {        
        !           577:        *r2 = ~*r2;   
        !           578:        *r4 = *r3;
        !           579:        *r3 &= *r0;
        !           580:        *r0 ^= *r4;
        !           581:        *r3 ^= *r2;
        !           582:        *r2 |= *r4;
        !           583:        *r1 ^= *r3;
        !           584:        *r2 ^= *r0;
        !           585:        *r0 |= *r1;
        !           586:        *r2 ^= *r1;
        !           587:        *r4 ^= *r0;
        !           588:        *r0 |= *r3;
        !           589:        *r0 ^= *r2;
        !           590:        *r4 ^= *r3;
        !           591:        *r4 ^= *r0;
        !           592:        *r3 = ~*r3;   
        !           593:        *r2 &= *r4;
        !           594:        *r2 ^= *r3;
        !           595: }
        !           596: 
        !           597: static void S7f (unsigned __int32 *r0, unsigned __int32 *r1, unsigned __int32 *r2, unsigned __int32 *r3, unsigned __int32 *r4)
        !           598: {        
        !           599:        *r4 = *r2;
        !           600:        *r2 &= *r1;
        !           601:        *r2 ^= *r3;
        !           602:        *r3 &= *r1;
        !           603:        *r4 ^= *r2;
        !           604:        *r2 ^= *r1;
        !           605:        *r1 ^= *r0;
        !           606:        *r0 |= *r4;
        !           607:        *r0 ^= *r2;
        !           608:        *r3 ^= *r1;
        !           609:        *r2 ^= *r3;
        !           610:        *r3 &= *r0;
        !           611:        *r3 ^= *r4;
        !           612:        *r4 ^= *r2;
        !           613:        *r2 &= *r0;
        !           614:        *r4 = ~*r4;   
        !           615:        *r2 ^= *r4;
        !           616:        *r4 &= *r0;
        !           617:        *r1 ^= *r3;
        !           618:        *r4 ^= *r1;
        !           619: }
        !           620: 
        !           621: static void KXf (const unsigned __int32 *k, unsigned int r, unsigned __int32 *a, unsigned __int32 *b, unsigned __int32 *c, unsigned __int32 *d)
        !           622: {
        !           623:        *a ^= k[r];
        !           624:        *b ^= k[r + 1];
        !           625:        *c ^= k[r + 2];
        !           626:        *d ^= k[r + 3];
        !           627: }
        !           628: 
        !           629: #endif // TC_MINIMIZE_CODE_SIZE
        !           630: 
        !           631: #ifndef TC_MINIMIZE_CODE_SIZE
        !           632: 
1.1.1.2   root      633: void serpent_set_key(const unsigned __int8 userKey[], int keylen, unsigned __int8 *ks)
1.1       root      634: {
1.1.1.2   root      635:        unsigned __int32 a,b,c,d,e;
                    636:        unsigned __int32 *k = (unsigned __int32 *)ks;
                    637:        unsigned __int32 t;
                    638:        int i;
                    639: 
                    640:        for (i = 0; i < keylen / (int)sizeof(__int32); i++)
                    641:                k[i] = LE32(((unsigned __int32*)userKey)[i]);
                    642: 
                    643:        if (keylen < 32)
                    644:                k[keylen/4] |= (unsigned __int32)1 << ((keylen%4)*8);
                    645: 
                    646:        k += 8;
                    647:        t = k[-1];
                    648:        for (i = 0; i < 132; ++i)
                    649:                k[i] = t = rotlFixed(k[i-8] ^ k[i-5] ^ k[i-3] ^ t ^ 0x9e3779b9 ^ i, 11);
                    650:        k -= 20;
                    651: 
                    652: #define LK(r, a, b, c, d, e)   {\
                    653:        a = k[(8-r)*4 + 0];             \
                    654:        b = k[(8-r)*4 + 1];             \
                    655:        c = k[(8-r)*4 + 2];             \
                    656:        d = k[(8-r)*4 + 3];}
                    657: 
                    658: #define SK(r, a, b, c, d, e)   {\
                    659:        k[(8-r)*4 + 4] = a;             \
                    660:        k[(8-r)*4 + 5] = b;             \
                    661:        k[(8-r)*4 + 6] = c;             \
                    662:        k[(8-r)*4 + 7] = d;}    \
                    663: 
                    664:        for (i=0; i<4; i++)
                    665:        {
                    666:                afterS2(LK); afterS2(S3); afterS3(SK);
                    667:                afterS1(LK); afterS1(S2); afterS2(SK);
                    668:                afterS0(LK); afterS0(S1); afterS1(SK);
                    669:                beforeS0(LK); beforeS0(S0); afterS0(SK);
                    670:                k += 8*4;
                    671:                afterS6(LK); afterS6(S7); afterS7(SK);
                    672:                afterS5(LK); afterS5(S6); afterS6(SK);
                    673:                afterS4(LK); afterS4(S5); afterS5(SK);
                    674:                afterS3(LK); afterS3(S4); afterS4(SK);
                    675:        }
                    676:        afterS2(LK); afterS2(S3); afterS3(SK);
1.1       root      677: }
                    678: 
1.1.1.5 ! root      679: #else // TC_MINIMIZE_CODE_SIZE
        !           680: 
        !           681: static void LKf (unsigned __int32 *k, unsigned int r, unsigned __int32 *a, unsigned __int32 *b, unsigned __int32 *c, unsigned __int32 *d)
        !           682: {
        !           683:        *a = k[r];
        !           684:        *b = k[r + 1];
        !           685:        *c = k[r + 2];
        !           686:        *d = k[r + 3];
        !           687: }
        !           688: 
        !           689: static void SKf (unsigned __int32 *k, unsigned int r, unsigned __int32 *a, unsigned __int32 *b, unsigned __int32 *c, unsigned __int32 *d)
        !           690: {
        !           691:        k[r + 4] = *a;
        !           692:        k[r + 5] = *b;
        !           693:        k[r + 6] = *c;
        !           694:        k[r + 7] = *d;
        !           695: }
        !           696: 
        !           697: void serpent_set_key(const unsigned __int8 userKey[], int keylen, unsigned __int8 *ks)
        !           698: {
        !           699:        unsigned __int32 a,b,c,d,e;
        !           700:        unsigned __int32 *k = (unsigned __int32 *)ks;
        !           701:        unsigned __int32 t;
        !           702:        int i;
        !           703: 
        !           704:        for (i = 0; i < keylen / (int)sizeof(__int32); i++)
        !           705:                k[i] = LE32(((unsigned __int32*)userKey)[i]);
        !           706: 
        !           707:        if (keylen < 32)
        !           708:                k[keylen/4] |= (unsigned __int32)1 << ((keylen%4)*8);
        !           709: 
        !           710:        k += 8;
        !           711:        t = k[-1];
        !           712:        for (i = 0; i < 132; ++i)
        !           713:                k[i] = t = rotlFixed(k[i-8] ^ k[i-5] ^ k[i-3] ^ t ^ 0x9e3779b9 ^ i, 11);
        !           714:        k -= 20;
        !           715: 
        !           716:        for (i=0; i<4; i++)
        !           717:        {
        !           718:                LKf (k, 20, &a, &e, &b, &d); S3f (&a, &e, &b, &d, &c); SKf (k, 16, &e, &b, &d, &c);
        !           719:                LKf (k, 24, &c, &b, &a, &e); S2f (&c, &b, &a, &e, &d); SKf (k, 20, &a, &e, &b, &d);
        !           720:                LKf (k, 28, &b, &e, &c, &a); S1f (&b, &e, &c, &a, &d); SKf (k, 24, &c, &b, &a, &e);
        !           721:                LKf (k, 32, &a, &b, &c, &d); S0f (&a, &b, &c, &d, &e); SKf (k, 28, &b, &e, &c, &a);
        !           722:                k += 8*4;
        !           723:                LKf (k,  4, &a, &c, &d, &b); S7f (&a, &c, &d, &b, &e); SKf (k,  0, &d, &e, &b, &a);
        !           724:                LKf (k,  8, &a, &c, &b, &e); S6f (&a, &c, &b, &e, &d); SKf (k,  4, &a, &c, &d, &b);
        !           725:                LKf (k, 12, &b, &a, &e, &c); S5f (&b, &a, &e, &c, &d); SKf (k,  8, &a, &c, &b, &e);
        !           726:                LKf (k, 16, &e, &b, &d, &c); S4f (&e, &b, &d, &c, &a); SKf (k, 12, &b, &a, &e, &c);
        !           727:        }
        !           728:        LKf (k, 20, &a, &e, &b, &d); S3f (&a, &e, &b, &d, &c); SKf (k, 16, &e, &b, &d, &c);
        !           729: }
        !           730: 
        !           731: #endif // TC_MINIMIZE_CODE_SIZE
        !           732: 
        !           733: 
1.1.1.4   root      734: #ifndef TC_MINIMIZE_CODE_SIZE
1.1       root      735: 
1.1.1.2   root      736: void serpent_encrypt(const unsigned __int8 *inBlock, unsigned __int8 *outBlock, unsigned __int8 *ks)
1.1       root      737: {
1.1.1.2   root      738:        unsigned __int32 a, b, c, d, e;
                    739:        unsigned int i=1;
                    740:        const unsigned __int32 *k = (unsigned __int32 *)ks + 8;
                    741:        unsigned __int32 *in = (unsigned __int32 *) inBlock;
                    742:        unsigned __int32 *out = (unsigned __int32 *) outBlock;
                    743: 
                    744:     a = LE32(in[0]);
                    745:        b = LE32(in[1]);
                    746:        c = LE32(in[2]);
                    747:        d = LE32(in[3]);
                    748: 
                    749:        do
                    750:        {
                    751:                beforeS0(KX); beforeS0(S0); afterS0(LT);
                    752:                afterS0(KX); afterS0(S1); afterS1(LT);
                    753:                afterS1(KX); afterS1(S2); afterS2(LT);
                    754:                afterS2(KX); afterS2(S3); afterS3(LT);
                    755:                afterS3(KX); afterS3(S4); afterS4(LT);
                    756:                afterS4(KX); afterS4(S5); afterS5(LT);
                    757:                afterS5(KX); afterS5(S6); afterS6(LT);
                    758:                afterS6(KX); afterS6(S7);
                    759: 
                    760:                if (i == 4)
                    761:                        break;
                    762: 
                    763:                ++i;
                    764:                c = b;
                    765:                b = e;
                    766:                e = d;
                    767:                d = a;
                    768:                a = e;
                    769:                k += 32;
                    770:                beforeS0(LT);
                    771:        }
                    772:        while (1);
                    773: 
                    774:        afterS7(KX);
                    775:        
                    776:     out[0] = LE32(d);
                    777:        out[1] = LE32(e);
                    778:        out[2] = LE32(b);
                    779:        out[3] = LE32(a);
                    780: }
1.1       root      781: 
1.1.1.4   root      782: #else // TC_MINIMIZE_CODE_SIZE
                    783: 
                    784: typedef unsigned __int32 uint32;
                    785: 
1.1.1.5 ! root      786: static void LTf (uint32 *a, uint32 *b, uint32 *c, uint32 *d)
1.1.1.4   root      787: {
                    788:        *a = rotlFixed(*a, 13);
                    789:        *c = rotlFixed(*c, 3);
                    790:        *d = rotlFixed(*d ^ *c ^ (*a << 3), 7);
                    791:        *b = rotlFixed(*b ^ *a ^ *c, 1);
                    792:        *a = rotlFixed(*a ^ *b ^ *d, 5);
                    793:        *c = rotlFixed(*c ^ *d ^ (*b << 7), 22);
                    794: }
                    795: 
                    796: void serpent_encrypt(const unsigned __int8 *inBlock, unsigned __int8 *outBlock, unsigned __int8 *ks)
                    797: {
                    798:        unsigned __int32 a, b, c, d, e;
                    799:        unsigned int i=1;
                    800:        const unsigned __int32 *k = (unsigned __int32 *)ks + 8;
                    801:        unsigned __int32 *in = (unsigned __int32 *) inBlock;
                    802:        unsigned __int32 *out = (unsigned __int32 *) outBlock;
                    803: 
                    804:     a = LE32(in[0]);
                    805:        b = LE32(in[1]);
                    806:        c = LE32(in[2]);
                    807:        d = LE32(in[3]);
                    808: 
                    809:        do
                    810:        {
1.1.1.5 ! root      811:                KXf (k,  0, &a, &b, &c, &d); S0f (&a, &b, &c, &d, &e); LTf (&b, &e, &c, &a);
        !           812:                KXf (k,  4, &b, &e, &c, &a); S1f (&b, &e, &c, &a, &d); LTf (&c, &b, &a, &e);
        !           813:                KXf (k,  8, &c, &b, &a, &e); S2f (&c, &b, &a, &e, &d); LTf (&a, &e, &b, &d);
        !           814:                KXf (k, 12, &a, &e, &b, &d); S3f (&a, &e, &b, &d, &c); LTf (&e, &b, &d, &c);
        !           815:                KXf (k, 16, &e, &b, &d, &c); S4f (&e, &b, &d, &c, &a); LTf (&b, &a, &e, &c);
        !           816:                KXf (k, 20, &b, &a, &e, &c); S5f (&b, &a, &e, &c, &d); LTf (&a, &c, &b, &e);
        !           817:                KXf (k, 24, &a, &c, &b, &e); S6f (&a, &c, &b, &e, &d); LTf (&a, &c, &d, &b);
        !           818:                KXf (k, 28, &a, &c, &d, &b); S7f (&a, &c, &d, &b, &e);
1.1.1.4   root      819: 
                    820:                if (i == 4)
                    821:                        break;
                    822: 
                    823:                ++i;
                    824:                c = b;
                    825:                b = e;
                    826:                e = d;
                    827:                d = a;
                    828:                a = e;
                    829:                k += 32;
1.1.1.5 ! root      830:                LTf (&a,&b,&c,&d);
1.1.1.4   root      831:        }
                    832:        while (1);
                    833: 
1.1.1.5 ! root      834:        KXf (k, 32, &d, &e, &b, &a);
1.1.1.4   root      835:        
                    836:     out[0] = LE32(d);
                    837:        out[1] = LE32(e);
                    838:        out[2] = LE32(b);
                    839:        out[3] = LE32(a);
                    840: }
                    841: 
                    842: #endif // TC_MINIMIZE_CODE_SIZE
                    843: 
1.1.1.5 ! root      844: #if !defined (TC_MINIMIZE_CODE_SIZE) || defined (TC_WINDOWS_BOOT_SERPENT)
1.1.1.2   root      845: 
                    846: void serpent_decrypt(const unsigned __int8 *inBlock, unsigned __int8 *outBlock, unsigned __int8 *ks)
                    847: {
                    848:        unsigned __int32 a, b, c, d, e;
                    849:        const unsigned __int32 *k = (unsigned __int32 *)ks + 104;
                    850:        unsigned int i=4;
                    851:        unsigned __int32 *in = (unsigned __int32 *) inBlock;
                    852:        unsigned __int32 *out = (unsigned __int32 *) outBlock;
                    853: 
                    854:     a = LE32(in[0]);
                    855:        b = LE32(in[1]);
                    856:        c = LE32(in[2]);
                    857:        d = LE32(in[3]);
                    858: 
                    859:        beforeI7(KX);
                    860:        goto start;
                    861: 
                    862:        do
                    863:        {
                    864:                c = b;
                    865:                b = d;
                    866:                d = e;
                    867:                k -= 32;
                    868:                beforeI7(ILT);
                    869: start:
                    870:                beforeI7(I7); afterI7(KX); 
                    871:                afterI7(ILT); afterI7(I6); afterI6(KX); 
                    872:                afterI6(ILT); afterI6(I5); afterI5(KX); 
                    873:                afterI5(ILT); afterI5(I4); afterI4(KX); 
                    874:                afterI4(ILT); afterI4(I3); afterI3(KX); 
                    875:                afterI3(ILT); afterI3(I2); afterI2(KX); 
                    876:                afterI2(ILT); afterI2(I1); afterI1(KX); 
                    877:                afterI1(ILT); afterI1(I0); afterI0(KX);
                    878:        }
                    879:        while (--i != 0);
                    880:        
                    881:     out[0] = LE32(a);
                    882:        out[1] = LE32(d);
                    883:        out[2] = LE32(b);
                    884:        out[3] = LE32(e);
1.1       root      885: }
1.1.1.4   root      886: 
1.1.1.5 ! root      887: #else // TC_MINIMIZE_CODE_SIZE && !TC_WINDOWS_BOOT_SERPENT
1.1.1.4   root      888: 
1.1.1.5 ! root      889: static void ILTf (uint32 *a, uint32 *b, uint32 *c, uint32 *d)
1.1.1.4   root      890: { 
                    891:        *c = rotrFixed(*c, 22);
                    892:        *a = rotrFixed(*a, 5);
                    893:        *c ^= *d ^ (*b << 7);
                    894:        *a ^= *b ^ *d;
                    895:        *b = rotrFixed(*b, 1);
                    896:        *d = rotrFixed(*d, 7) ^ *c ^ (*a << 3);
                    897:        *b ^= *a ^ *c;
                    898:        *c = rotrFixed(*c, 3);
                    899:        *a = rotrFixed(*a, 13);
                    900: }
                    901: 
                    902: void serpent_decrypt(const unsigned __int8 *inBlock, unsigned __int8 *outBlock, unsigned __int8 *ks)
                    903: {
                    904:        unsigned __int32 a, b, c, d, e;
                    905:        const unsigned __int32 *k = (unsigned __int32 *)ks + 104;
                    906:        unsigned int i=4;
                    907:        unsigned __int32 *in = (unsigned __int32 *) inBlock;
                    908:        unsigned __int32 *out = (unsigned __int32 *) outBlock;
                    909: 
                    910:     a = LE32(in[0]);
                    911:        b = LE32(in[1]);
                    912:        c = LE32(in[2]);
                    913:        d = LE32(in[3]);
                    914: 
1.1.1.5 ! root      915:        KXf (k, 32, &a, &b, &c, &d);
1.1.1.4   root      916:        goto start;
                    917: 
                    918:        do
                    919:        {
                    920:                c = b;
                    921:                b = d;
                    922:                d = e;
                    923:                k -= 32;
                    924:                beforeI7(ILT);
                    925: start:
1.1.1.5 ! root      926:                beforeI7(I7); KXf (k, 28, &d, &a, &b, &e);
        !           927:                ILTf (&d, &a, &b, &e); afterI7(I6); KXf (k, 24, &a, &b, &c, &e); 
        !           928:                ILTf (&a, &b, &c, &e); afterI6(I5); KXf (k, 20, &b, &d, &e, &c); 
        !           929:                ILTf (&b, &d, &e, &c); afterI5(I4); KXf (k, 16, &b, &c, &e, &a); 
        !           930:                ILTf (&b, &c, &e, &a); afterI4(I3); KXf (k, 12, &a, &b, &e, &c);
        !           931:                ILTf (&a, &b, &e, &c); afterI3(I2); KXf (k, 8,  &b, &d, &e, &c);
        !           932:                ILTf (&b, &d, &e, &c); afterI2(I1); KXf (k, 4,  &a, &b, &c, &e);
        !           933:                ILTf (&a, &b, &c, &e); afterI1(I0); KXf (k, 0,  &a, &d, &b, &e);
1.1.1.4   root      934:        }
                    935:        while (--i != 0);
                    936:        
                    937:     out[0] = LE32(a);
                    938:        out[1] = LE32(d);
                    939:        out[2] = LE32(b);
                    940:        out[3] = LE32(e);
                    941: }
                    942: 
1.1.1.5 ! root      943: #endif // TC_MINIMIZE_CODE_SIZE && !TC_WINDOWS_BOOT_SERPENT

unix.superglobalmegacorp.com

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