⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aes.cpp

📁 mysql-5.0.33源码包
💻 CPP
📖 第 1 页 / 共 5 页
字号:
            Te0[GETBYTE(t3, 3)] ^            Te1[GETBYTE(t0, 2)] ^            Te2[GETBYTE(t1, 1)] ^            Te3[GETBYTE(t2, 0)] ^            rk[3];    }    /*     * apply last round and     * map cipher state to byte array block:     */    s0 =        (Te4[GETBYTE(t0, 3)] & 0xff000000) ^        (Te4[GETBYTE(t1, 2)] & 0x00ff0000) ^        (Te4[GETBYTE(t2, 1)] & 0x0000ff00) ^        (Te4[GETBYTE(t3, 0)] & 0x000000ff) ^        rk[0];    s1 =        (Te4[GETBYTE(t1, 3)] & 0xff000000) ^        (Te4[GETBYTE(t2, 2)] & 0x00ff0000) ^        (Te4[GETBYTE(t3, 1)] & 0x0000ff00) ^        (Te4[GETBYTE(t0, 0)] & 0x000000ff) ^        rk[1];    s2 =        (Te4[GETBYTE(t2, 3)] & 0xff000000) ^        (Te4[GETBYTE(t3, 2)] & 0x00ff0000) ^        (Te4[GETBYTE(t0, 1)] & 0x0000ff00) ^        (Te4[GETBYTE(t1, 0)] & 0x000000ff) ^        rk[2];    s3 =        (Te4[GETBYTE(t3, 3)] & 0xff000000) ^        (Te4[GETBYTE(t0, 2)] & 0x00ff0000) ^        (Te4[GETBYTE(t1, 1)] & 0x0000ff00) ^        (Te4[GETBYTE(t2, 0)] & 0x000000ff) ^        rk[3];    gpBlock::Put(xorBlock, outBlock)(s0)(s1)(s2)(s3);}void AES::decrypt(const byte* inBlock, const byte* xorBlock,                  byte* outBlock) const{    word32 s0, s1, s2, s3;    word32 t0, t1, t2, t3;    const word32* rk = key_;    /*     * map byte array block to cipher state     * and add initial round key:     */    gpBlock::Get(inBlock)(s0)(s1)(s2)(s3);    s0 ^= rk[0];    s1 ^= rk[1];    s2 ^= rk[2];    s3 ^= rk[3];    /*     * Nr - 1 full rounds:     */    unsigned int r = rounds_ >> 1;    for (;;) {        t0 =            Td0[GETBYTE(s0, 3)] ^            Td1[GETBYTE(s3, 2)] ^            Td2[GETBYTE(s2, 1)] ^            Td3[GETBYTE(s1, 0)] ^            rk[4];        t1 =            Td0[GETBYTE(s1, 3)] ^            Td1[GETBYTE(s0, 2)] ^            Td2[GETBYTE(s3, 1)] ^            Td3[GETBYTE(s2, 0)] ^            rk[5];        t2 =            Td0[GETBYTE(s2, 3)] ^            Td1[GETBYTE(s1, 2)] ^            Td2[GETBYTE(s0, 1)] ^            Td3[GETBYTE(s3, 0)] ^            rk[6];        t3 =            Td0[GETBYTE(s3, 3)] ^            Td1[GETBYTE(s2, 2)] ^            Td2[GETBYTE(s1, 1)] ^            Td3[GETBYTE(s0, 0)] ^            rk[7];        rk += 8;        if (--r == 0) {            break;        }        s0 =            Td0[GETBYTE(t0, 3)] ^            Td1[GETBYTE(t3, 2)] ^            Td2[GETBYTE(t2, 1)] ^            Td3[GETBYTE(t1, 0)] ^            rk[0];        s1 =            Td0[GETBYTE(t1, 3)] ^            Td1[GETBYTE(t0, 2)] ^            Td2[GETBYTE(t3, 1)] ^            Td3[GETBYTE(t2, 0)] ^            rk[1];        s2 =            Td0[GETBYTE(t2, 3)] ^            Td1[GETBYTE(t1, 2)] ^            Td2[GETBYTE(t0, 1)] ^            Td3[GETBYTE(t3, 0)] ^            rk[2];        s3 =            Td0[GETBYTE(t3, 3)] ^            Td1[GETBYTE(t2, 2)] ^            Td2[GETBYTE(t1, 1)] ^            Td3[GETBYTE(t0, 0)] ^            rk[3];    }    /*     * apply last round and     * map cipher state to byte array block:     */    s0 =        (Td4[GETBYTE(t0, 3)] & 0xff000000) ^        (Td4[GETBYTE(t3, 2)] & 0x00ff0000) ^        (Td4[GETBYTE(t2, 1)] & 0x0000ff00) ^        (Td4[GETBYTE(t1, 0)] & 0x000000ff) ^    rk[0];    s1 =        (Td4[GETBYTE(t1, 3)] & 0xff000000) ^        (Td4[GETBYTE(t0, 2)] & 0x00ff0000) ^        (Td4[GETBYTE(t3, 1)] & 0x0000ff00) ^        (Td4[GETBYTE(t2, 0)] & 0x000000ff) ^        rk[1];    s2 =        (Td4[GETBYTE(t2, 3)] & 0xff000000) ^        (Td4[GETBYTE(t1, 2)] & 0x00ff0000) ^        (Td4[GETBYTE(t0, 1)] & 0x0000ff00) ^        (Td4[GETBYTE(t3, 0)] & 0x000000ff) ^        rk[2];    s3 =        (Td4[GETBYTE(t3, 3)] & 0xff000000) ^        (Td4[GETBYTE(t2, 2)] & 0x00ff0000) ^        (Td4[GETBYTE(t1, 1)] & 0x0000ff00) ^        (Td4[GETBYTE(t0, 0)] & 0x000000ff) ^        rk[3];    gpBlock::Put(xorBlock, outBlock)(s0)(s1)(s2)(s3);}#if defined(DO_AES_ASM)    #ifdef __GNUC__        #define AS1(x)    asm(#x);        #define AS2(x, y) asm(#x ", " #y);        #define PROLOG()  \            asm(".intel_syntax noprefix"); \            AS2(    movd  mm3, edi                      )   \            AS2(    movd  mm4, ebx                      )   \            AS2(    sub   esp, 4                        )   \            AS2(    movd  mm7, ebp                      )   \            AS2(    mov   [ebp - 4], esi                )   \            AS2(    mov   ecx, DWORD PTR [ebp +  8]     )   \            AS2(    mov   esi, DWORD PTR [ebp + 12]     )   \            AS2(    mov   ebp, DWORD PTR [ebp + 20]     )        #define EPILOG()  \            AS2(    mov  esi, [ebp - 4]             )   \            AS2(    mov  esp, ebp                   )   \            AS2(    movd ebx, mm4                   )   \            AS2(    movd edi, mm3                   )   \            AS1(    emms                            )   \            asm(".att_syntax");    #else        #define AS1(x)    __asm x        #define AS2(x, y) __asm x, y        #define PROLOG() \            AS1(    push  ebp                           )   \            AS2(    mov   ebp, esp                      )   \            AS2(    movd  mm3, edi                      )   \            AS2(    movd  mm4, ebx                      )   \            AS2(    sub   esp, 4                        )   \            AS2(    movd  mm7, ebp                      )   \            AS2(    mov   [ebp - 4], esi                )   \            AS2(    mov   esi, DWORD PTR [ebp +  8]     )   \            AS2(    mov   ebp, DWORD PTR [ebp + 16]     )        // ebp is restored at end        #define EPILOG()  \            AS2(    mov   esi, [ebp - 4]                )   \            AS2(    movd  ebx, mm4                      )   \            AS2(    movd  edi, mm3                      )   \            AS2(    mov   esp, ebp                      )   \            AS1(    pop   ebp                           )   \            AS1(    emms                                )   \            AS1(    ret   12                            )                            #endif#ifdef _MSC_VER    __declspec(naked) #endifvoid AES::AsmEncrypt(const byte* inBlock, byte* outBlock, void* boxes) const{    PROLOG()    #ifdef OLD_GCC_OFFSET        AS2(    mov   edx, DWORD PTR [ecx + 60]     )   // rounds        AS2(    lea   edi, [ecx + 64]               )   // rk    #else        AS2(    mov   edx, DWORD PTR [ecx + 56]     )   // rounds        AS2(    lea   edi, [ecx + 60]               )   // rk    #endif    AS1(    dec   edx                           )    AS2(    movd  mm6, edi                      )   // save rk    AS2(    movd  mm5, edx                      )   // save rounds      AS2(    mov   eax, DWORD PTR [esi]                                  )    AS2(    mov   ebx, DWORD PTR [esi + 4]                              )    AS2(    mov   ecx, DWORD PTR [esi + 8]                              )    AS2(    mov   edx, DWORD PTR [esi + 12]                             )    AS1(    bswap eax                                                   )    AS1(    bswap ebx                                                   )    AS1(    bswap ecx                                                   )    AS1(    bswap edx                                                   )    AS2(    xor   eax, DWORD PTR [edi]               )   // s0    AS2(    xor   ebx, DWORD PTR [edi +  4]          )   // s1    AS2(    xor   ecx, DWORD PTR [edi +  8]          )   // s2    AS2(    xor   edx, DWORD PTR [edi + 12]          )   // s3    AS1(loop1:                                                          )            /* Put0 (mm0) =                  Te0[get0,rs 24] ^                Te1[get1,rs 16] ^                Te2[get2,rs  8] ^                Te3[get3,rs  0]            */           AS2(    mov   esi, eax                                              )    AS2(    shr   esi, 24                                               )    AS2(    mov   esi, DWORD PTR [ebp + esi*4]                          )                                                        AS2(    mov   edi, ebx                                              )    AS2(    shr   edi, 16                                               )    AS2(    and   edi, 255                                              )    AS2(    xor   esi, DWORD PTR [ebp + 1024 + edi*4]                   )    AS2(    movzx edi, ch                                               )    AS2(    xor   esi, DWORD PTR [ebp + 2048 + edi*4]                   )    AS2(    movzx edi, dl                                               )    AS2(    xor   esi, DWORD PTR [ebp + 3072 + edi*4]                   )    AS2(    movd  mm0, esi                                              )             /* Put1 (mm1) =                  Te0[get1,rs 24] ^                Te1[get2,rs 16] ^                Te2[get3,rs  8] ^                Te3[get0,rs  0]            */    AS2(    mov   esi, ebx                                              )    AS2(    shr   esi, 24                                               )    AS2(    mov   esi, DWORD PTR [ebp + esi*4]                          )    AS2(    mov   edi, ecx                                              )    AS2(    shr   edi, 16                                               )    AS2(    and   edi, 255                                              )    AS2(    xor   esi, DWORD PTR [ebp + 1024 + edi*4]                   )    AS2(    movzx edi, dh                                               )    AS2(    xor   esi, DWORD PTR [ebp + 2048 + edi*4]                   )    AS2(    movzx edi, al                                               )    AS2(    xor   esi, DWORD PTR [ebp + 3072 + edi*4]                   )    AS2(    movd  mm1, esi                                              )             /* Put2 (mm2) =                  Te0[get2,rs 24] ^                Te1[get3,rs 16] ^                Te2[get0,rs  8] ^                Te3[get1,rs  0]             */    AS2(    mov   esi, ecx                                              )    AS2(    shr   esi, 24                                               )    AS2(    mov   esi, DWORD PTR [ebp + esi*4]                          )

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -