Цитата(SasaVitebsk @ Oct 4 2007, 14:21)

2700 пока - я в растройстве.

Сергей а Вы делали с 256 битным ключём?
Да. Проц - мега8. ключ 256 бит. компилятор - 4.10B. Объем кода - 1974, но есть куда ужимать. Та же мега8, WinAVR, 1888, но другой протокол команды входа в программирование и сильное ужимание. Даю наводку ( не на водку, а наводку

):
1) Большинство параметров передавать не нужно - они константны. Поэтому
Код
aes.c:
void aesInit()
{
CalcPowLog();
CalcSBox();
KeyExpansion( expandedKey );
CalcSBoxInv( sBoxInv );
}
aes.h:
inline static void aesDecrypt( uint8_t * buffer )
{
uint8_t Tmp[BLOCKSIZE];
CopyBytes( Tmp, buffer, BLOCKSIZE );
InvCipher( buffer, expandedKey );
XORBytes( buffer, ChainCipherBlock, BLOCKSIZE );
CopyBytes( ChainCipherBlock, Tmp, BLOCKSIZE );
}
2) Функции, которые не вызываются из aesDecrypt() и которые вызываются всего из одной точки можно делать static inline.
Далее, конструкцию
Код
column[0] = (column[0] << 1) ^ (column[0] & 0x80 ? BPOLY : 0);
column[1] = (column[1] << 1) ^ (column[1] & 0x80 ? BPOLY : 0);
column[2] = (column[2] << 1) ^ (column[2] & 0x80 ? BPOLY : 0);
column[3] = (column[3] << 1) ^ (column[3] & 0x80 ? BPOLY : 0);
можно вынести в отдельную функцию
uint8_t GF_something(uint8_t data)
{
return (data << 1) ^ (data & 0x80 ? BPOLY : 0);
}
Это дало существенный выигрыш в WinAVR, в IAR не пробовал.
3) ChainCipherBlock вынести в глобальные и сразу инициализировать, выкинув initialVector и CopyInitialVector - это сделает cstartup не затратив ни одного лишнего байта.