int wc_Stm32_Aes_Init(Aes* aes, CRYP_InitTypeDef* cryptInit, CRYP_KeyInitTypeDef* keyInit) { int ret; word32 keySize; word32* aes_key; ret = wc_AesGetKeySize(aes, &keySize); if (ret != 0) return ret; aes_key = aes->key; /* crypto structure initialization */ CRYP_KeyStructInit(keyInit); CRYP_StructInit(cryptInit); /* load key into correct registers */ switch (keySize) { case 16: /* 128-bit key */ cryptInit->CRYP_KeySize = CRYP_KeySize_128b; keyInit->CRYP_Key2Left = aes_key[0]; keyInit->CRYP_Key2Right = aes_key[1]; keyInit->CRYP_Key3Left = aes_key[2]; keyInit->CRYP_Key3Right = aes_key[3]; break; case 24: /* 192-bit key */ cryptInit->CRYP_KeySize = CRYP_KeySize_192b; keyInit->CRYP_Key1Left = aes_key[0]; keyInit->CRYP_Key1Right = aes_key[1]; keyInit->CRYP_Key2Left = aes_key[2]; keyInit->CRYP_Key2Right = aes_key[3]; keyInit->CRYP_Key3Left = aes_key[4]; keyInit->CRYP_Key3Right = aes_key[5]; break; case 32: /* 256-bit key */ cryptInit->CRYP_KeySize = CRYP_KeySize_256b; keyInit->CRYP_Key0Left = aes_key[0]; keyInit->CRYP_Key0Right = aes_key[1]; keyInit->CRYP_Key1Left = aes_key[2]; keyInit->CRYP_Key1Right = aes_key[3]; keyInit->CRYP_Key2Left = aes_key[4]; keyInit->CRYP_Key2Right = aes_key[5]; keyInit->CRYP_Key3Left = aes_key[6]; keyInit->CRYP_Key3Right = aes_key[7]; break; default: break; } cryptInit->CRYP_DataType = CRYP_DataType_8b; return 0; }
void DesCrypt(Des* des, byte* out, const byte* in, word32 sz, int dir, int mode) { word32 *dkey, *iv; CRYP_InitTypeDef DES_CRYP_InitStructure; CRYP_KeyInitTypeDef DES_CRYP_KeyInitStructure; CRYP_IVInitTypeDef DES_CRYP_IVInitStructure; dkey = des->key; iv = des->reg; /* crypto structure initialization */ CRYP_KeyStructInit(&DES_CRYP_KeyInitStructure); CRYP_StructInit(&DES_CRYP_InitStructure); CRYP_IVStructInit(&DES_CRYP_IVInitStructure); /* reset registers to their default values */ CRYP_DeInit(); /* set direction, mode, and datatype */ if (dir == DES_ENCRYPTION) { DES_CRYP_InitStructure.CRYP_AlgoDir = CRYP_AlgoDir_Encrypt; } else { /* DES_DECRYPTION */ DES_CRYP_InitStructure.CRYP_AlgoDir = CRYP_AlgoDir_Decrypt; } if (mode == DES_CBC) { DES_CRYP_InitStructure.CRYP_AlgoMode = CRYP_AlgoMode_DES_CBC; } else { /* DES_ECB */ DES_CRYP_InitStructure.CRYP_AlgoMode = CRYP_AlgoMode_DES_ECB; } DES_CRYP_InitStructure.CRYP_DataType = CRYP_DataType_8b; CRYP_Init(&DES_CRYP_InitStructure); /* load key into correct registers */ DES_CRYP_KeyInitStructure.CRYP_Key1Left = dkey[0]; DES_CRYP_KeyInitStructure.CRYP_Key1Right = dkey[1]; CRYP_KeyInit(&DES_CRYP_KeyInitStructure); /* set iv */ ByteReverseWords(iv, iv, DES_BLOCK_SIZE); DES_CRYP_IVInitStructure.CRYP_IV0Left = iv[0]; DES_CRYP_IVInitStructure.CRYP_IV0Right = iv[1]; CRYP_IVInit(&DES_CRYP_IVInitStructure); /* enable crypto processor */ CRYP_Cmd(ENABLE); while (sz > 0) { /* flush IN/OUT FIFOs */ CRYP_FIFOFlush(); /* if input and output same will overwrite input iv */ XMEMCPY(des->tmp, in + sz - DES_BLOCK_SIZE, DES_BLOCK_SIZE); CRYP_DataIn(*(uint32_t*)&in[0]); CRYP_DataIn(*(uint32_t*)&in[4]); /* wait until the complete message has been processed */ while(CRYP_GetFlagStatus(CRYP_FLAG_BUSY) != RESET) {} *(uint32_t*)&out[0] = CRYP_DataOut(); *(uint32_t*)&out[4] = CRYP_DataOut(); /* store iv for next call */ XMEMCPY(des->reg, des->tmp, DES_BLOCK_SIZE); sz -= DES_BLOCK_SIZE; in += DES_BLOCK_SIZE; out += DES_BLOCK_SIZE; } /* disable crypto processor */ CRYP_Cmd(DISABLE); }