Пример #1
0
/*******************************************************************************
* Function Name  : AES_keyschedule_enc
* Description    : According to key, computes the expanded key (expkey) for AES128 
*                  encryption.
* Input          : key: user key
* Output         : expkey: expanded key
* Return         : None
*******************************************************************************/
void AES_keyschedule_enc(u32* key, u32* expkey)	
{
  register u32* local_pointer = expkey;
  register int i = 0;
  register u32 copy0;
  register u32 copy1;
  register u32 copy2;
  register u32 copy3;
  
  copy0 = key[0]; 
  copy1 = key[1];
  copy2 = key[2];
  copy3 = key[3];
  
  local_pointer[0] = copy0;
  local_pointer[1] = copy1;
  local_pointer[2] = copy2;
  local_pointer[3] = copy3;
  
  for (;i < 10;)
  {
    copy0 ^= WORD8_TO_WORD32( Sbox[byte1(copy3)],
                             Sbox[byte2(copy3)],
                             Sbox[byte3(copy3)],
                             Sbox[byte0(copy3)]) ^ rcon[i++];
    copy1 ^= copy0;
    copy2 ^= copy1;
    copy3 ^= copy2;
    local_pointer += 4;
    local_pointer[0] = copy0;
    local_pointer[1] = copy1;
    local_pointer[2] = copy2;
    local_pointer[3] = copy3;
  }
}
Пример #2
0
/*******************************************************************************  
* Function Name  : AES_expand_enckey  
* Description    : According to key computes the expanded key exp for AES128   
*                  encryption.  
* Input          : key: user key (128 bits / 16 bytes)
* Output         : expkey: expanded key (352 bits / 44 bytes)
* Return         : None  
*******************************************************************************/   
void AES_expand_enckey(ot_u32* key, ot_u32* expkey) {
#if (AES_USEHW)
    platform_expand_enckey(key, expkey);

#elif  ((AES_USEFAST == ENABLED) || (AES_USELITE == ENABLED))
    register ot_u32* local_pointer = expkey;   
    register int i = 0;   
    register ot_u32 copy0;   
    register ot_u32 copy1;   
    register ot_u32 copy2;   
    register ot_u32 copy3;   
       
    copy0 = key[0];    
    copy1 = key[1];   
    copy2 = key[2];   
    copy3 = key[3];   
    local_pointer[0] = copy0;   
    local_pointer[1] = copy1;   
    local_pointer[2] = copy2;   
    local_pointer[3] = copy3;
    
    for (;i <10;) {   
        copy0 ^= WORD8_TO_WORD32( Sbox[byte1(copy3)],   
                                  Sbox[byte2(copy3)],   
                                  Sbox[byte3(copy3)],   
                                  Sbox[byte0(copy3)]) ^ rcon[i++];   
        copy1 ^= copy0;   
        copy2 ^= copy1;   
        copy3 ^= copy2;   
        local_pointer += 4;   
        local_pointer[0] = copy0;   
        local_pointer[1] = copy1;   
        local_pointer[2] = copy2;   
        local_pointer[3] = copy3;   
    }
#endif
}      
Пример #3
0
/*******************************************************************************
* Function Name  : AES_decrypt
* Description    : Decrypts one block of 16 bytes
* Input          : - input_pointer: input block address
*                  - expkey: decryption key 
* Output         : output_pointer: output block address
* Return         : None
*******************************************************************************/
void AES_decrypt(u8* input_pointer, u32* output_pointer, u32* expkey)
{
  register u32 s0;
  register u32 s1;
  register u32 s2;
  register u32 s3;
  register u32 t0;
  register u32 t1;
  register u32 t2;
  register u32 t3;
  register int r = 10 >> 1;
  register u32* local_pointer = expkey + (40);
  
    //added ***
  register u32 copy0;
  register u32 copy1;
  register u32 copy2;
  register u32 copy3;
  
  copy0 = *input_pointer;
  copy0 =copy0<<8;
  copy0 |= *(input_pointer+1);
  copy0 =copy0<<8;
  copy0 |= *(input_pointer+2);
  copy0 =copy0<<8;
  copy0 |= *(input_pointer+3);
  
  copy1 = *(input_pointer+4);
  copy1 =copy1<<8;
  copy1 |= *(input_pointer+5);
  copy1 =copy1<<8;
  copy1 |= *(input_pointer+6);
  copy1 =copy1<<8;
  copy1 |= *(input_pointer+7);
  
  copy2 = *(input_pointer+8);
  copy2 =copy2<<8;
  copy2 |= *(input_pointer+9);
  copy2 =copy2<<8;
  copy2 |= *(input_pointer+10);
  copy2 =copy2<<8;
  copy2 |= *(input_pointer+11);
  
  copy3 = *(input_pointer+12);
  copy3 =copy3<<8;
  copy3 |= *(input_pointer+13);
  copy3 =copy3<<8;
  copy3 |= *(input_pointer+14);
  copy3 =copy3<<8;
  copy3 |= *(input_pointer+15);
  
  s0 = copy0^ local_pointer[0];
  s1 = copy1 ^ local_pointer[1];
  s2 = copy2 ^ local_pointer[2];
  s3 = copy3 ^ local_pointer[3];
  
  for (;;) 
  {
    local_pointer -= 8;
    
    t0 =      dec_table[byte0(s0)]  ^
      rot1(dec_table[byte1(s3)]) ^
        rot2(dec_table[byte2(s2)]) ^
          rot3(dec_table[byte3(s1)]) ^
            local_pointer[4];
    t1 =      dec_table[byte0(s1)]  ^
      rot1(dec_table[byte1(s0)]) ^
        rot2(dec_table[byte2(s3)]) ^
          rot3(dec_table[byte3(s2)]) ^
            local_pointer[5];
    t2 =      dec_table[byte0(s2)]  ^
      rot1(dec_table[byte1(s1)]) ^
        rot2(dec_table[byte2(s0)]) ^
          rot3(dec_table[byte3(s3)]) ^
            local_pointer[6];
    t3 =      dec_table[byte0(s3)]  ^
      rot1(dec_table[byte1(s2)]) ^
        rot2(dec_table[byte2(s1)]) ^
          rot3(dec_table[byte3(s0)]) ^
            local_pointer[7];
    
    if (--r == 0) 
    {
      break;
    }
    
    s0 =      dec_table[byte0(t0)]  ^
      rot1(dec_table[byte1(t3)]) ^
        rot2(dec_table[byte2(t2)]) ^
          rot3(dec_table[byte3(t1)]) ^
            local_pointer[0];
    s1 =      dec_table[byte0(t1)]  ^
      rot1(dec_table[byte1(t0)]) ^
        rot2(dec_table[byte2(t3)]) ^
          rot3(dec_table[byte3(t2)]) ^
            local_pointer[1];
    s2 =      dec_table[byte0(t2)]  ^
      rot1(dec_table[byte1(t1)]) ^
        rot2(dec_table[byte2(t0)]) ^
          rot3(dec_table[byte3(t3)]) ^
            local_pointer[2];
    s3 =      dec_table[byte0(t3)]  ^
      rot1(dec_table[byte1(t2)]) ^
        rot2(dec_table[byte2(t1)]) ^
          rot3(dec_table[byte3(t0)]) ^
            local_pointer[3];	   
  }
  
  output_pointer[0] = WORD8_TO_WORD32( InvSbox[byte0(t0)],
                                      InvSbox[byte1(t3)],
                                      InvSbox[byte2(t2)],
                                      InvSbox[byte3(t1)]) ^ local_pointer[0];
  output_pointer[1] = WORD8_TO_WORD32( InvSbox[byte0(t1)],
                                      InvSbox[byte1(t0)],
                                      InvSbox[byte2(t3)],
                                      InvSbox[byte3(t2)]) ^ local_pointer[1];
  output_pointer[2] = WORD8_TO_WORD32( InvSbox[byte0(t2)],
                                      InvSbox[byte1(t1)],
                                      InvSbox[byte2(t0)],
                                      InvSbox[byte3(t3)]) ^ local_pointer[2];
  output_pointer[3] = WORD8_TO_WORD32( InvSbox[byte0(t3)],
                                      InvSbox[byte1(t2)],
                                      InvSbox[byte2(t1)],
                                      InvSbox[byte3(t0)]) ^ local_pointer[3];
}
Пример #4
0
/*******************************************************************************
* Function Name  : AES_keyschedule_enc
* Description    : According to key computes the expanded key exp for AES128 
*                  encryption.
* Input          : key: user key
* Output         : expkey: expanded key
* Return         : None
*******************************************************************************/
void AES_keyschedule_enc(u8* key, u32* expkey)
{
  register u32* local_pointer = expkey;
  register int i = 0;
  register u32 copy0;
  register u32 copy1;
  register u32 copy2;
  register u32 copy3;
  
  
  copy0 = *key;
  copy0 =copy0<<8;
  copy0 |= *(key+1);
  copy0 =copy0<<8;
  copy0 |= *(key+2);
  copy0 =copy0<<8;
  copy0 |= *(key+3);
  
  copy1 = *(key+4);
  copy1 =copy1<<8;
  copy1 |= *(key+5);
  copy1 =copy1<<8;
  copy1 |= *(key+6);
  copy1 =copy1<<8;
  copy1 |= *(key+7);
  
  copy2 = *(key+8);
  copy2 =copy2<<8;
  copy2 |= *(key+9);
  copy2 =copy2<<8;
  copy2 |= *(key+10);
  copy2 =copy2<<8;
  copy2 |= *(key+11);
  
  copy3 = *(key+12);
  copy3 =copy3<<8;
  copy3 |= *(key+13);
  copy3 =copy3<<8;
  copy3 |= *(key+14);
  copy3 =copy3<<8;
  copy3 |= *(key+15);
  
  
  //  copy0 = key[0]; 
  //  copy1 = key[1];
  //  copy2 = key[2];
  //  copy3 = key[3];
  local_pointer[0] = copy0;
  local_pointer[1] = copy1;
  local_pointer[2] = copy2;
  local_pointer[3] = copy3;
  for (;i < 10;)
  {
    copy0 ^= WORD8_TO_WORD32( Sbox[byte1(copy3)],
                             Sbox[byte2(copy3)],
                             Sbox[byte3(copy3)],
                             Sbox[byte0(copy3)]) ^ rcon[i++];
    copy1 ^= copy0;
    copy2 ^= copy1;
    copy3 ^= copy2;
    local_pointer += 4;
    local_pointer[0] = copy0;
    local_pointer[1] = copy1;
    local_pointer[2] = copy2;
    local_pointer[3] = copy3;
  }
}	
Пример #5
0
/*******************************************************************************
* Function Name  : AES_encrypt
* Description    : Encrypts one block of 16 bytes
* Input          : - input_pointer: input block address
*                  - expkey: encryption key
* Output         : output_pointer
* Return         : None
*******************************************************************************/
void AES_encrypt(u32* input_pointer, u32* output_pointer, u32* expkey)
{
  register u32 t0;
  register u32 t1;
  register u32 t2;
  register u32 t3;  
  register u32 s0;
  register u32 s1;
  register u32 s2;
  register u32 s3;
  register int r = 10;/*Round counter */
  register u32* local_pointer = expkey;
  
  s0 = input_pointer[0] ^ local_pointer[0];
  s1 = input_pointer[1] ^ local_pointer[1];
  s2 = input_pointer[2] ^ local_pointer[2];
  s3 = input_pointer[3] ^ local_pointer[3];
  local_pointer += 4;
  /* ADD KEY before start round*/
  for (;;) 
  {
    t0 = WORD8_TO_WORD32( Sbox[byte0(s0)],
                         Sbox[byte1(s1)],
                         Sbox[byte2(s2)],
                         Sbox[byte3(s3)]);
    t1 = WORD8_TO_WORD32( Sbox[byte0(s1)],
                         Sbox[byte1(s2)],
                         Sbox[byte2(s3)],
                         Sbox[byte3(s0)]);
    t2 = WORD8_TO_WORD32( Sbox[byte0(s2)],
                         Sbox[byte1(s3)],
                         Sbox[byte2(s0)],
                         Sbox[byte3(s1)]);
    t3 = WORD8_TO_WORD32( Sbox[byte0(s3)],
                         Sbox[byte1(s0)],
                         Sbox[byte2(s1)],
                         Sbox[byte3(s2)]);
    /*End of SBOX + Shift ROW*/
    s0 = fwd_mcol(t0)^local_pointer[0];
    s1 = fwd_mcol(t1)^local_pointer[1];
    s2 = fwd_mcol(t2)^local_pointer[2];
    s3 = fwd_mcol(t3)^local_pointer[3];
    /*End of mix colomn*/
    
    local_pointer += 4; 
    if ( --r == 1)
    {
      break;
    }
    
  }/*End for(;;)*/
  
  /*Start Last round*/
  t0 = WORD8_TO_WORD32( Sbox[byte0(s0)],
                       Sbox[byte1(s1)],
                       Sbox[byte2(s2)],
                       Sbox[byte3(s3)]);
  t1 = WORD8_TO_WORD32( Sbox[byte0(s1)],
                       Sbox[byte1(s2)],
                       Sbox[byte2(s3)],
                       Sbox[byte3(s0)]);
  t2 = WORD8_TO_WORD32( Sbox[byte0(s2)],
                       Sbox[byte1(s3)],
                       Sbox[byte2(s0)],
                       Sbox[byte3(s1)]);
  t3 = WORD8_TO_WORD32( Sbox[byte0(s3)],
                       Sbox[byte1(s0)],
                       Sbox[byte2(s1)],
                       Sbox[byte3(s2)]);
  
  t0 ^= local_pointer[0];
  t1 ^= local_pointer[1];
  t2 ^= local_pointer[2];
  t3 ^= local_pointer[3];
  
  /*Store of the result of encryption*/
  output_pointer[0] = t0;
  output_pointer[1] = t1;
  output_pointer[2] = t2;
  output_pointer[3] = t3;
}
Пример #6
0
/*******************************************************************************
* Function Name  : AES_decrypt
* Description    : Decrypts one block of 16 bytes
* Input          : - input_pointer: input block address
*                  - expkey: decryption key 
* Output         : output_pointer: output block address
* Return         : None
*******************************************************************************/
void AES_decrypt(u32* input_pointer, u32* output_pointer, u32* expkey)
{  
  /* Register: ask to the compiler to maintain this variable in the 
  processor's registers and don't store it in RAM */
  register u32 t0; 
  register u32 t1;
  register u32 t2;
  register u32 t3;  
  register u32 s0;
  register u32 s1;
  register u32 s2;
  register u32 s3;
  register int r =  10; /* Count the round */ 
  register u32* local_pointer = expkey;
  u32 f2,f4,f8;
  
  s0 = input_pointer[0] ^ local_pointer[0];
  s1 = input_pointer[1] ^ local_pointer[1];
  s2 = input_pointer[2] ^ local_pointer[2];
  s3 = input_pointer[3] ^ local_pointer[3];
  
  /* First add key: before start the rounds */
  local_pointer += 4;
  
  for (;;) /* Start round */ 
  {
    t0 = WORD8_TO_WORD32( InvSbox[byte0(s0)],
                         InvSbox[byte1(s3)],
                         InvSbox[byte2(s2)],
                         InvSbox[byte3(s1)]) ^ local_pointer[4];
    t1 = WORD8_TO_WORD32( InvSbox[byte0(s1)],
                         InvSbox[byte1(s0)],
                         InvSbox[byte2(s3)],
                         InvSbox[byte3(s2)]) ^ local_pointer[5];
    t2 = WORD8_TO_WORD32( InvSbox[byte0(s2)],
                         InvSbox[byte1(s1)],
                         InvSbox[byte2(s0)],
                         InvSbox[byte3(s3)]) ^ local_pointer[6];
    t3 = WORD8_TO_WORD32( InvSbox[byte0(s3)],
                         InvSbox[byte1(s2)],
                         InvSbox[byte2(s1)],
                         InvSbox[byte3(s0)]) ^ local_pointer[7];
    /*End of InvSbox,  INVshiftRow,  add key*/
    s0=inv_mcol(t0);
    s1=inv_mcol(t1);
    s2=inv_mcol(t2);
    s3=inv_mcol(t3);
    /*End of INVMix column */		
    local_pointer += 4; /*Follow the key sheduler to choose the right round key*/
    
    if (--r == 1) 
    {
      break;
    }
    
  }/*End of round*/
  
  /*Start last round :is the only one different from the other*/
  t0 = WORD8_TO_WORD32( InvSbox[byte0(s0)],
                       InvSbox[byte1(s3)],
                       InvSbox[byte2(s2)],
                       InvSbox[byte3(s1)]) ^ local_pointer[4];
  t1 = WORD8_TO_WORD32( InvSbox[byte0(s1)],
                       InvSbox[byte1(s0)],
                       InvSbox[byte2(s3)],
                       InvSbox[byte3(s2)]) ^ local_pointer[5];
  t2 = WORD8_TO_WORD32( InvSbox[byte0(s2)],
                       InvSbox[byte1(s1)],
                       InvSbox[byte2(s0)],
                       InvSbox[byte3(s3)]) ^ local_pointer[6];
  t3 = WORD8_TO_WORD32( InvSbox[byte0(s3)],
                       InvSbox[byte1(s2)],
                       InvSbox[byte2(s1)],
                       InvSbox[byte3(s0)]) ^ local_pointer[7];
  output_pointer[0] = t0;
  output_pointer[1] = t1;
  output_pointer[2] = t2;
  output_pointer[3] = t3;	
}
Пример #7
0
/*******************************************************************************  
* Function Name  : AES_decrypt  
* Description    : Decrypts one block of 16 bytes  
* Input          : - input_pointer: input block address  
*                  - expkey: decryption key   
* Output         : output_pointer: output block address  
* Return         : None  
*******************************************************************************/   
void AES_decrypt(ot_u32* input_pointer, ot_u32* output_pointer, ot_u32* expkey) {
#if (AES_USEHW == ENABLED)

#elif (AES_USEFAST == ENABLED)   
  register ot_u32 s0;   
  register ot_u32 s1;   
  register ot_u32 s2;   
  register ot_u32 s3;   
  register ot_u32 t0;   
  register ot_u32 t1;   
  register ot_u32 t2;   
  register ot_u32 t3;   
  register int r = 10 >> 1;   
  register ot_u32* local_pointer = expkey + (40);   
   
  s0 = input_pointer[0] ^ local_pointer[0];   
  s1 = input_pointer[1] ^ local_pointer[1];   
  s2 = input_pointer[2] ^ local_pointer[2];   
  s3 = input_pointer[3] ^ local_pointer[3];   
   
  for (;;)    
  {   
    local_pointer -= 8;   
       
    t0 =      dec_table[byte0(s0)]  ^   
         rot1(dec_table[byte1(s3)]) ^   
         rot2(dec_table[byte2(s2)]) ^   
         rot3(dec_table[byte3(s1)]) ^   
         local_pointer[4];   
    t1 =      dec_table[byte0(s1)]  ^   
         rot1(dec_table[byte1(s0)]) ^   
         rot2(dec_table[byte2(s3)]) ^   
         rot3(dec_table[byte3(s2)]) ^   
         local_pointer[5];   
    t2 =      dec_table[byte0(s2)]  ^   
         rot1(dec_table[byte1(s1)]) ^   
         rot2(dec_table[byte2(s0)]) ^   
         rot3(dec_table[byte3(s3)]) ^   
         local_pointer[6];   
    t3 =      dec_table[byte0(s3)]  ^   
         rot1(dec_table[byte1(s2)]) ^   
         rot2(dec_table[byte2(s1)]) ^   
         rot3(dec_table[byte3(s0)]) ^   
         local_pointer[7];   
       
    if (--r == 0)    
    {   
      break;   
    }   
       
    s0 =      dec_table[byte0(t0)]  ^   
         rot1(dec_table[byte1(t3)]) ^   
         rot2(dec_table[byte2(t2)]) ^   
         rot3(dec_table[byte3(t1)]) ^   
         local_pointer[0];   
    s1 =      dec_table[byte0(t1)]  ^   
         rot1(dec_table[byte1(t0)]) ^   
         rot2(dec_table[byte2(t3)]) ^   
         rot3(dec_table[byte3(t2)]) ^   
         local_pointer[1];   
    s2 =      dec_table[byte0(t2)]  ^   
         rot1(dec_table[byte1(t1)]) ^   
         rot2(dec_table[byte2(t0)]) ^   
         rot3(dec_table[byte3(t3)]) ^   
         local_pointer[2];   
    s3 =      dec_table[byte0(t3)]  ^   
         rot1(dec_table[byte1(t2)]) ^   
         rot2(dec_table[byte2(t1)]) ^   
         rot3(dec_table[byte3(t0)]) ^   
         local_pointer[3];        
  }   
     
  output_pointer[0] = WORD8_TO_WORD32( InvSbox[byte0(t0)],   
                                       InvSbox[byte1(t3)],   
                                       InvSbox[byte2(t2)],   
                                       InvSbox[byte3(t1)]) ^ local_pointer[0];   
  output_pointer[1] = WORD8_TO_WORD32( InvSbox[byte0(t1)],   
                                       InvSbox[byte1(t0)],   
                                       InvSbox[byte2(t3)],   
                                       InvSbox[byte3(t2)]) ^ local_pointer[1];   
  output_pointer[2] = WORD8_TO_WORD32( InvSbox[byte0(t2)],   
                                       InvSbox[byte1(t1)],   
                                       InvSbox[byte2(t0)],   
                                       InvSbox[byte3(t3)]) ^ local_pointer[2];   
  output_pointer[3] = WORD8_TO_WORD32( InvSbox[byte0(t3)],   
                                       InvSbox[byte1(t2)],   
                                       InvSbox[byte2(t1)],   
                                       InvSbox[byte3(t0)]) ^ local_pointer[3];

#elif (AES_USELITE == ENABLED)
      /* Register: ask to the compiler to maintain this variable in the   
   processor's registers and don't store it in RAM */   
  register ot_u32 t0;    
  register ot_u32 t1;   
  register ot_u32 t2;   
  register ot_u32 t3;     
  register ot_u32 s0;   
  register ot_u32 s1;   
  register ot_u32 s2;   
  register ot_u32 s3;   
  register int r =  10; /* Count the round */    
  register ot_u32* local_pointer = expkey + 40;   
  ot_u32 f2,f4,f8;   
       
  s0 = input_pointer[0] ^ local_pointer[0];   
  s1 = input_pointer[1] ^ local_pointer[1];   
  s2 = input_pointer[2] ^ local_pointer[2];   
  s3 = input_pointer[3] ^ local_pointer[3];   
       
  /* First add key: before start the rounds */   
  local_pointer -= 8;   
       
  for (;;) /* Start round */    
  {   
    t0 = WORD8_TO_WORD32( InvSbox[byte0(s0)],   
                          InvSbox[byte1(s3)],   
                          InvSbox[byte2(s2)],   
                          InvSbox[byte3(s1)]) ^ local_pointer[4];   
    t1 = WORD8_TO_WORD32( InvSbox[byte0(s1)],   
                          InvSbox[byte1(s0)],   
                          InvSbox[byte2(s3)],   
                          InvSbox[byte3(s2)]) ^ local_pointer[5];   
    t2 = WORD8_TO_WORD32( InvSbox[byte0(s2)],   
                          InvSbox[byte1(s1)],   
                          InvSbox[byte2(s0)],   
                          InvSbox[byte3(s3)]) ^ local_pointer[6];   
    t3 = WORD8_TO_WORD32( InvSbox[byte0(s3)],   
                          InvSbox[byte1(s2)],   
                          InvSbox[byte2(s1)],   
                          InvSbox[byte3(s0)]) ^ local_pointer[7];   
    /*End of InvSbox,  INVshiftRow,  add key*/   
    s0=inv_mcol(t0);   
    s1=inv_mcol(t1);   
    s2=inv_mcol(t2);   
    s3=inv_mcol(t3);   
    /*End of INVMix column */          
    local_pointer -= 4; /*Follow the key sheduler to choose the right round key*/   
         
    if (--r == 1)    
    {   
      break;   
    }   
     
  }/*End of round*/   
     
  /*Start last round :is the only one different from the other*/   
  t0 = WORD8_TO_WORD32( InvSbox[byte0(s0)],   
                        InvSbox[byte1(s3)],   
                        InvSbox[byte2(s2)],   
                        InvSbox[byte3(s1)]) ^ local_pointer[4];   
  t1 = WORD8_TO_WORD32( InvSbox[byte0(s1)],   
                        InvSbox[byte1(s0)],   
                        InvSbox[byte2(s3)],   
                        InvSbox[byte3(s2)]) ^ local_pointer[5];   
  t2 = WORD8_TO_WORD32( InvSbox[byte0(s2)],   
                        InvSbox[byte1(s1)],   
                        InvSbox[byte2(s0)],   
                        InvSbox[byte3(s3)]) ^ local_pointer[6];   
  t3 = WORD8_TO_WORD32( InvSbox[byte0(s3)],   
                        InvSbox[byte1(s2)],   
                        InvSbox[byte2(s1)],   
                        InvSbox[byte3(s0)]) ^ local_pointer[7];   
  output_pointer[0] = t0;   
  output_pointer[1] = t1;   
  output_pointer[2] = t2;   
  output_pointer[3] = t3;
#endif
}   
Пример #8
0
/*******************************************************************************  
* Function Name  : AES_encrypt  
* Description    : Encrypts one block of 16 bytes  
* Input          : - input_pointer: input block address  
*                  - expkey: encryption key  
* Output         : output_pointer  
* Return         : None  
*******************************************************************************/   
void AES_encrypt(ot_u32* input_pointer, ot_u32* output_pointer, ot_u32* expkey) {
#if (AES_USEHW == ENABLED)

#elif (AES_USEFAST == ENABLED)
  register ot_u32 s0;   
  register ot_u32 s1;   
  register ot_u32 s2;   
  register ot_u32 s3;   
  register ot_u32 t0;   
  register ot_u32 t1;   
  register ot_u32 t2;   
  register ot_u32 t3;   
  register int r = 10 >> 1;   
  register ot_u32* local_pointer = expkey;   
     
  s0 = input_pointer[0] ^ local_pointer[0];   
  s1 = input_pointer[1] ^ local_pointer[1];   
  s2 = input_pointer[2] ^ local_pointer[2];   
  s3 = input_pointer[3] ^ local_pointer[3];   
     
  for (;;) {   
    t0 =      enc_table[byte0(s0)]  ^   
         rot1(enc_table[byte1(s1)]) ^   
         rot2(enc_table[byte2(s2)]) ^   
         rot3(enc_table[byte3(s3)]) ^   
         local_pointer[4];                                 
    t1 =      enc_table[byte0(s1)]  ^   
         rot1(enc_table[byte1(s2)]) ^   
         rot2(enc_table[byte2(s3)]) ^   
         rot3(enc_table[byte3(s0)]) ^   
         local_pointer[5];   
    t2 =      enc_table[byte0(s2)]  ^   
         rot1(enc_table[byte1(s3)]) ^   
         rot2(enc_table[byte2(s0)]) ^   
         rot3(enc_table[byte3(s1)]) ^   
         local_pointer[6];   
    t3 =      enc_table[byte0(s3)]  ^   
         rot1(enc_table[byte1(s0)]) ^   
         rot2(enc_table[byte2(s1)]) ^   
         rot3(enc_table[byte3(s2)]) ^   
         local_pointer[7];   
       
    local_pointer += 8;       
    if (--r == 0) {   
      break;   
    }   
       
    s0 =      enc_table[byte0(t0)]  ^   
         rot1(enc_table[byte1(t1)]) ^   
         rot2(enc_table[byte2(t2)]) ^   
         rot3(enc_table[byte3(t3)]) ^   
         local_pointer[0];   
    s1 =      enc_table[byte0(t1)]  ^   
         rot1(enc_table[byte1(t2)]) ^   
         rot2(enc_table[byte2(t3)]) ^   
         rot3(enc_table[byte3(t0)]) ^   
         local_pointer[1];   
    s2 =      enc_table[byte0(t2)]  ^   
         rot1(enc_table[byte1(t3)]) ^   
         rot2(enc_table[byte2(t0)]) ^   
         rot3(enc_table[byte3(t1)]) ^   
         local_pointer[2];   
    s3 =      enc_table[byte0(t3)]  ^   
         rot1(enc_table[byte1(t0)]) ^   
         rot2(enc_table[byte2(t1)]) ^   
         rot3(enc_table[byte3(t2)]) ^   
         local_pointer[3];   
  }   
     
  output_pointer[0] = WORD8_TO_WORD32( Sbox[byte0(t0)],   
                                       Sbox[byte1(t1)],   
                                       Sbox[byte2(t2)],   
                                       Sbox[byte3(t3)]) ^ local_pointer[0];   
  output_pointer[1] = WORD8_TO_WORD32( Sbox[byte0(t1)],   
                                       Sbox[byte1(t2)],   
                                       Sbox[byte2(t3)],   
                                       Sbox[byte3(t0)]) ^ local_pointer[1];   
  output_pointer[2] = WORD8_TO_WORD32( Sbox[byte0(t2)],   
                                       Sbox[byte1(t3)],   
                                       Sbox[byte2(t0)],   
                                       Sbox[byte3(t1)]) ^ local_pointer[2];   
  output_pointer[3] = WORD8_TO_WORD32( Sbox[byte0(t3)],   
                                       Sbox[byte1(t0)],   
                                       Sbox[byte2(t1)],   
                                       Sbox[byte3(t2)]) ^ local_pointer[3];

#elif (AES_USELITE == ENABLED)
    register ot_u32 t0;   
    register ot_u32 t1;   
    register ot_u32 t2;   
    register ot_u32 t3;     
    register ot_u32 s0;   
    register ot_u32 s1;   
    register ot_u32 s2;   
    register ot_u32 s3;   
    register int r = 10;    // Round counter
    register ot_u32* local_pointer = expkey;   
   
    s0 = input_pointer[0] ^ local_pointer[0];   
    s1 = input_pointer[1] ^ local_pointer[1];   
    s2 = input_pointer[2] ^ local_pointer[2];   
    s3 = input_pointer[3] ^ local_pointer[3];   
    local_pointer += 4;  
   
  // ADD KEY before start round
  for (;;)    
  {   
    t0 = WORD8_TO_WORD32( Sbox[byte0(s0)],   
                          Sbox[byte1(s1)],   
                          Sbox[byte2(s2)],   
                          Sbox[byte3(s3)]);   
    t1 = WORD8_TO_WORD32( Sbox[byte0(s1)],   
                          Sbox[byte1(s2)],   
                          Sbox[byte2(s3)],   
                          Sbox[byte3(s0)]);   
    t2 = WORD8_TO_WORD32( Sbox[byte0(s2)],   
                          Sbox[byte1(s3)],   
                          Sbox[byte2(s0)],   
                          Sbox[byte3(s1)]);   
    t3 = WORD8_TO_WORD32( Sbox[byte0(s3)],   
                          Sbox[byte1(s0)],   
                          Sbox[byte2(s1)],   
                          Sbox[byte3(s2)]);   
    /*End of SBOX + Shift ROW*/   
    s0 = fwd_mcol(t0)^local_pointer[0];   
    s1 = fwd_mcol(t1)^local_pointer[1];   
    s2 = fwd_mcol(t2)^local_pointer[2];   
    s3 = fwd_mcol(t3)^local_pointer[3];   
    /*End of mix colomn*/   
           
    local_pointer += 4;    
    if ( --r == 1)   
    {   
      break;   
    }   
     
  }/*End for(;;)*/   
       
  /*Start Last round*/   
  t0 = WORD8_TO_WORD32( Sbox[byte0(s0)],   
                        Sbox[byte1(s1)],   
                        Sbox[byte2(s2)],   
                        Sbox[byte3(s3)]);   
  t1 = WORD8_TO_WORD32( Sbox[byte0(s1)],   
                        Sbox[byte1(s2)],   
                        Sbox[byte2(s3)],   
                        Sbox[byte3(s0)]);   
  t2 = WORD8_TO_WORD32( Sbox[byte0(s2)],   
                        Sbox[byte1(s3)],   
                        Sbox[byte2(s0)],   
                        Sbox[byte3(s1)]);   
  t3 = WORD8_TO_WORD32( Sbox[byte0(s3)],   
                        Sbox[byte1(s0)],   
                        Sbox[byte2(s1)],   
                        Sbox[byte3(s2)]);   
               
  t0 ^= local_pointer[0];   
  t1 ^= local_pointer[1];   
  t2 ^= local_pointer[2];   
  t3 ^= local_pointer[3];   
       
  /*Store of the result of encryption*/   
  output_pointer[0] = t0;   
  output_pointer[1] = t1;   
  output_pointer[2] = t2;   
  output_pointer[3] = t3;
#endif
}