Ignore:
Timestamp:
Feb 26, 2010, 1:27:59 AM (12 years ago)
Author:
Sven Rech
Message:

more speed for bruteforcing by using unsafe code in AES and DES (just temporary)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NativeCryptography/aes_core.c

    r1190 r1193  
    880880        PUTU32(out + 12, s3);
    881881}
     882
     883/*
     884 * Encrypt a single block
     885 * in and out can overlap
     886 */
     887void AES_encrypt(const unsigned char *in, unsigned char *out,
     888                 const AES_KEY *key) {
     889
     890        const u32 *rk;
     891        u32 s0, s1, s2, s3, t0, t1, t2, t3;
     892#ifndef FULL_UNROLL
     893        int r;
     894#endif /* ?FULL_UNROLL */
     895
     896        assert(in && out && key);
     897        rk = key->rd_key;
     898
     899        /*
     900         * map byte array block to cipher state
     901         * and add initial round key:
     902         */
     903        s0 = GETU32(in     ) ^ rk[0];
     904        s1 = GETU32(in +  4) ^ rk[1];
     905        s2 = GETU32(in +  8) ^ rk[2];
     906        s3 = GETU32(in + 12) ^ rk[3];
     907#ifdef FULL_UNROLL
     908        /* round 1: */
     909        t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[ 4];
     910        t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[ 5];
     911        t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[ 6];
     912        t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[ 7];
     913        /* round 2: */
     914        s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[ 8];
     915        s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[ 9];
     916        s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[10];
     917        s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[11];
     918        /* round 3: */
     919        t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[12];
     920        t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[13];
     921        t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[14];
     922        t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[15];
     923        /* round 4: */
     924        s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[16];
     925        s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[17];
     926        s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[18];
     927        s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[19];
     928        /* round 5: */
     929        t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[20];
     930        t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[21];
     931        t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[22];
     932        t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[23];
     933        /* round 6: */
     934        s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[24];
     935        s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[25];
     936        s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[26];
     937        s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[27];
     938        /* round 7: */
     939        t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[28];
     940        t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[29];
     941        t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[30];
     942        t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[31];
     943        /* round 8: */
     944        s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[32];
     945        s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[33];
     946        s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[34];
     947        s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[35];
     948        /* round 9: */
     949        t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[36];
     950        t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[37];
     951        t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[38];
     952        t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[39];
     953    if (key->rounds > 10) {
     954        /* round 10: */
     955        s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[40];
     956        s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[41];
     957        s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[42];
     958        s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[43];
     959        /* round 11: */
     960        t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[44];
     961        t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[45];
     962        t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[46];
     963        t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[47];
     964        if (key->rounds > 12) {
     965            /* round 12: */
     966            s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >>  8) & 0xff] ^ Te3[t3 & 0xff] ^ rk[48];
     967            s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >>  8) & 0xff] ^ Te3[t0 & 0xff] ^ rk[49];
     968            s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >>  8) & 0xff] ^ Te3[t1 & 0xff] ^ rk[50];
     969            s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >>  8) & 0xff] ^ Te3[t2 & 0xff] ^ rk[51];
     970            /* round 13: */
     971            t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >>  8) & 0xff] ^ Te3[s3 & 0xff] ^ rk[52];
     972            t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >>  8) & 0xff] ^ Te3[s0 & 0xff] ^ rk[53];
     973            t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >>  8) & 0xff] ^ Te3[s1 & 0xff] ^ rk[54];
     974            t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >>  8) & 0xff] ^ Te3[s2 & 0xff] ^ rk[55];
     975        }
     976    }
     977    rk += key->rounds << 2;
     978#else  /* !FULL_UNROLL */
     979    /*
     980     * Nr - 1 full rounds:
     981     */
     982    r = key->rounds >> 1;
     983    for (;;) {
     984        t0 =
     985            Te0[(s0 >> 24)       ] ^
     986            Te1[(s1 >> 16) & 0xff] ^
     987            Te2[(s2 >>  8) & 0xff] ^
     988            Te3[(s3      ) & 0xff] ^
     989            rk[4];
     990        t1 =
     991            Te0[(s1 >> 24)       ] ^
     992            Te1[(s2 >> 16) & 0xff] ^
     993            Te2[(s3 >>  8) & 0xff] ^
     994            Te3[(s0      ) & 0xff] ^
     995            rk[5];
     996        t2 =
     997            Te0[(s2 >> 24)       ] ^
     998            Te1[(s3 >> 16) & 0xff] ^
     999            Te2[(s0 >>  8) & 0xff] ^
     1000            Te3[(s1      ) & 0xff] ^
     1001            rk[6];
     1002        t3 =
     1003            Te0[(s3 >> 24)       ] ^
     1004            Te1[(s0 >> 16) & 0xff] ^
     1005            Te2[(s1 >>  8) & 0xff] ^
     1006            Te3[(s2      ) & 0xff] ^
     1007            rk[7];
     1008
     1009        rk += 8;
     1010        if (--r == 0) {
     1011            break;
     1012        }
     1013
     1014        s0 =
     1015            Te0[(t0 >> 24)       ] ^
     1016            Te1[(t1 >> 16) & 0xff] ^
     1017            Te2[(t2 >>  8) & 0xff] ^
     1018            Te3[(t3      ) & 0xff] ^
     1019            rk[0];
     1020        s1 =
     1021            Te0[(t1 >> 24)       ] ^
     1022            Te1[(t2 >> 16) & 0xff] ^
     1023            Te2[(t3 >>  8) & 0xff] ^
     1024            Te3[(t0      ) & 0xff] ^
     1025            rk[1];
     1026        s2 =
     1027            Te0[(t2 >> 24)       ] ^
     1028            Te1[(t3 >> 16) & 0xff] ^
     1029            Te2[(t0 >>  8) & 0xff] ^
     1030            Te3[(t1      ) & 0xff] ^
     1031            rk[2];
     1032        s3 =
     1033            Te0[(t3 >> 24)       ] ^
     1034            Te1[(t0 >> 16) & 0xff] ^
     1035            Te2[(t1 >>  8) & 0xff] ^
     1036            Te3[(t2      ) & 0xff] ^
     1037            rk[3];
     1038    }
     1039#endif /* ?FULL_UNROLL */
     1040    /*
     1041         * apply last round and
     1042         * map cipher state to byte array block:
     1043         */
     1044        s0 =
     1045                (Te2[(t0 >> 24)       ] & 0xff000000) ^
     1046                (Te3[(t1 >> 16) & 0xff] & 0x00ff0000) ^
     1047                (Te0[(t2 >>  8) & 0xff] & 0x0000ff00) ^
     1048                (Te1[(t3      ) & 0xff] & 0x000000ff) ^
     1049                rk[0];
     1050        PUTU32(out     , s0);
     1051        s1 =
     1052                (Te2[(t1 >> 24)       ] & 0xff000000) ^
     1053                (Te3[(t2 >> 16) & 0xff] & 0x00ff0000) ^
     1054                (Te0[(t3 >>  8) & 0xff] & 0x0000ff00) ^
     1055                (Te1[(t0      ) & 0xff] & 0x000000ff) ^
     1056                rk[1];
     1057        PUTU32(out +  4, s1);
     1058        s2 =
     1059                (Te2[(t2 >> 24)       ] & 0xff000000) ^
     1060                (Te3[(t3 >> 16) & 0xff] & 0x00ff0000) ^
     1061                (Te0[(t0 >>  8) & 0xff] & 0x0000ff00) ^
     1062                (Te1[(t1      ) & 0xff] & 0x000000ff) ^
     1063                rk[2];
     1064        PUTU32(out +  8, s2);
     1065        s3 =
     1066                (Te2[(t3 >> 24)       ] & 0xff000000) ^
     1067                (Te3[(t0 >> 16) & 0xff] & 0x00ff0000) ^
     1068                (Te0[(t1 >>  8) & 0xff] & 0x0000ff00) ^
     1069                (Te1[(t2      ) & 0xff] & 0x000000ff) ^
     1070                rk[3];
     1071        PUTU32(out + 12, s3);
     1072}
Note: See TracChangeset for help on using the changeset viewer.