/** * @brief Main program * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup files (startup_stm32f40_41xxx.s/startup_stm32f427_437xx.s/startup_stm32f429_439xx.s) before to branch to application main. */ /* USARTx configured as follow: - BaudRate = 115200 baud - Word Length = 8 Bits - One Stop Bit - No parity - Hardware flow control disabled (RTS and CTS signals) - Receive and transmit enabled */ USART_Config(); /* Enable CRYP clock */ RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_CRYP, ENABLE); while(1) { /* Display Plain Data*/ Display_PlainData(AES_TEXT_SIZE); /******************************************************************************/ /* AES mode ECB */ /******************************************************************************/ /*===================================================== Encryption ECB mode ======================================================*/ PressToContinue(); /****************************************/ /* AES 128 **/ /****************************************/ /* Encrypt the plaintext message*/ if(CRYP_AES_ECB(MODE_ENCRYPT, AES128key, 128, Plaintext, AES_TEXT_SIZE, Encryptedtext) == SUCCESS) { /* Display encrypted Data*/ Display_EncryptedData(ECB,128,AES_TEXT_SIZE); } /****************************************/ /* AES 192 **/ /****************************************/ /* Encrypt the plaintext message*/ if(CRYP_AES_ECB(MODE_ENCRYPT,AES192key,192,Plaintext,AES_TEXT_SIZE,Encryptedtext) == SUCCESS) { /* Display encrypted Data*/ Display_EncryptedData(ECB,192,AES_TEXT_SIZE); } /****************************************/ /* AES 256 **/ /****************************************/ /* Encrypt the plaintext message*/ if(CRYP_AES_ECB(MODE_ENCRYPT,AES256key,256,Plaintext,AES_TEXT_SIZE,Encryptedtext) == SUCCESS) { /* Display encrypted Data*/ Display_EncryptedData(ECB, 256,AES_TEXT_SIZE); } /*===================================================== Decryption in ECB mode ======================================================*/ PressToContinue(); /****************************************/ /* AES 128 **/ /****************************************/ /* Decrypt the plaintext message */ if(CRYP_AES_ECB(MODE_DECRYPT,AES128key,128,Ciphertext,AES_TEXT_SIZE,Decryptedtext) == SUCCESS) { /* Display decrypted data*/ Display_DecryptedData(ECB,128,AES_TEXT_SIZE); } /****************************************/ /* AES 192 **/ /****************************************/ /* Decrypt the plaintext message */ if(CRYP_AES_ECB(MODE_DECRYPT,AES192key, 192,Ciphertext, AES_TEXT_SIZE,Decryptedtext) == SUCCESS) { /* Display decrypted data*/ Display_DecryptedData(ECB, 192,AES_TEXT_SIZE); } /****************************************/ /* AES 256 **/ /****************************************/ /* Decrypt the plaintext message */ if(CRYP_AES_ECB(MODE_DECRYPT,AES256key, 256,Ciphertext, AES_TEXT_SIZE,Decryptedtext) == SUCCESS) { /* Display decrypted data*/ Display_DecryptedData(ECB,256,AES_TEXT_SIZE); } /******************************************************************************/ /* AES mode CBC */ /******************************************************************************/ PressToContinue(); /*===================================================== Encryption CBC mode ======================================================*/ /****************************************/ /* AES 128 **/ /****************************************/ /* Encrypt the plaintext message*/ if(CRYP_AES_CBC(MODE_ENCRYPT,IV_1,AES128key,128,Plaintext,AES_TEXT_SIZE,Encryptedtext) == SUCCESS) { /* Display encrypted Data*/ Display_EncryptedData(CBC,128,AES_TEXT_SIZE); } /****************************************/ /* AES 192 **/ /****************************************/ /* Encrypt the plaintext message*/ if(CRYP_AES_CBC(MODE_ENCRYPT,IV_1,AES192key,192,Plaintext,AES_TEXT_SIZE,Encryptedtext) == SUCCESS) { /* Display encrypted Data*/ Display_EncryptedData(CBC,192,AES_TEXT_SIZE); } /****************************************/ /* AES 256 **/ /****************************************/ /* Encrypt the plaintext message*/ if(CRYP_AES_CBC(MODE_ENCRYPT,IV_1,AES256key,256,Plaintext,AES_TEXT_SIZE,Encryptedtext) == SUCCESS) { /* Display encrypted Data*/ Display_EncryptedData(CBC, 256,AES_TEXT_SIZE); } /*===================================================== Decryption in CBC mode ======================================================*/ PressToContinue(); /* Deinitializes the CRYP peripheral */ CRYP_DeInit(); /****************************************/ /* AES 128 **/ /****************************************/ /* Decrypt the plaintext message */ if(CRYP_AES_CBC(MODE_DECRYPT,IV_1,AES128key,128,Ciphertext,AES_TEXT_SIZE,Decryptedtext) == SUCCESS) { /* Display decrypted data*/ Display_DecryptedData(CBC,128,AES_TEXT_SIZE); } /****************************************/ /* AES 192 **/ /****************************************/ /* Deinitializes the CRYP peripheral */ CRYP_DeInit(); /* Decrypt the plaintext message */ if(CRYP_AES_CBC(MODE_DECRYPT,IV_1,AES192key, 192,Ciphertext, AES_TEXT_SIZE,Decryptedtext) == SUCCESS) { /* Display decrypted data*/ Display_DecryptedData(CBC, 192,AES_TEXT_SIZE); } /****************************************/ /* AES 256 **/ /****************************************/ /* Deinitializes the CRYP peripheral */ CRYP_DeInit(); /* Decrypt the plaintext message */ if(CRYP_AES_CBC(MODE_DECRYPT,IV_1,AES256key, 256,Ciphertext, AES_TEXT_SIZE,Decryptedtext) == SUCCESS) { /* Display decrypted data*/ Display_DecryptedData(CBC,256,AES_TEXT_SIZE); } /******************************************************************************/ /* AES mode CTR */ /******************************************************************************/ /*===================================================== Encryption CTR mode ======================================================*/ PressToContinue(); /****************************************/ /* AES 128 **/ /****************************************/ /* Encrypt the plaintext message*/ if(CRYP_AES_CTR(MODE_ENCRYPT,IV_1,AES128key,128,Plaintext,AES_TEXT_SIZE,Encryptedtext) == SUCCESS) { /* Display encrypted Data*/ Display_EncryptedData(CTR,128, AES_TEXT_SIZE); } /****************************************/ /* AES 192 **/ /****************************************/ /* Encrypt the plaintext message*/ if(CRYP_AES_CTR(MODE_ENCRYPT,IV_1,AES192key,192,Plaintext,AES_TEXT_SIZE,Encryptedtext) == SUCCESS) { /* Display encrypted Data*/ Display_EncryptedData(CTR,192, AES_TEXT_SIZE); } /****************************************/ /* AES 256 **/ /****************************************/ /* Encrypt the plaintext message*/ if(CRYP_AES_CTR(MODE_ENCRYPT,IV_1,AES256key,256,Plaintext,AES_TEXT_SIZE,Encryptedtext) == SUCCESS) { /* Display encrypted Data*/ Display_EncryptedData(CTR, 256, AES_TEXT_SIZE); } /*===================================================== Decryption in CTR mode ======================================================*/ PressToContinue(); /****************************************/ /* AES 128 **/ /****************************************/ /* Decrypt the plaintext message */ if(CRYP_AES_CTR(MODE_DECRYPT,IV_1,AES128key,128,Ciphertext,AES_TEXT_SIZE,Decryptedtext) == SUCCESS) { /* Display decrypted data*/ Display_DecryptedData(CTR, 128, AES_TEXT_SIZE); } /****************************************/ /* AES 192 **/ /****************************************/ /* Decrypt the plaintext message */ if(CRYP_AES_CTR(MODE_DECRYPT,IV_1,AES192key,192,Ciphertext,AES_TEXT_SIZE,Decryptedtext) == SUCCESS) { /* Display decrypted data*/ Display_DecryptedData(CTR, 192, AES_TEXT_SIZE); } /****************************************/ /* AES 256 **/ /****************************************/ /* Decrypt the plaintext message */ if(CRYP_AES_CTR(MODE_DECRYPT,IV_1,AES256key, 256,Ciphertext, AES_TEXT_SIZE,Decryptedtext) == SUCCESS) { /* Display decrypted data*/ Display_DecryptedData(CTR, 256, AES_TEXT_SIZE); } /******************************************************************************/ PressToContinue(); printf("\n\r Example restarted...\n "); } }
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); }