stm32的加密库如何使用
本帖最后由 shileiprince 于 2015-10-26 11:20 编辑最近有个项目数据通信需要加密数据,stm官网给的AES128_CTR加密我模拟运行了一下结果和预期的不一样。例子没有修改过。那位用过能指点一下那里出错了。
/**
******************************************************************************
* @file AES128_CTR/main.c
* @authorMCD Application Team
* @version V2.0.6
* @date 25-June-2013
* @brief Main program body
******************************************************************************
* @attention
*
* <h2><center>© COPYRIGHT 2013 STMicroelectronics</center></h2>
*
* Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.st.com/software_license_agreement_liberty_v2
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include <stdio.h>
#include "crypto.h"
/** @addtogroup STM32_Crypto_Examples
* @{
*/
/* Private typedef -----------------------------------------------------------*/
typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;
/* Private define ------------------------------------------------------------*/
#define PLAINTEXT_LENGTH 64
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
const uint8_t Plaintext =
{
0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51,
0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef,
0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10
};
/* Key to be used for AES encryption/decryption */
uint8_t Key =
{
0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c
};
/* Initialization Vector, used only in non-ECB modes */
uint8_t IV =
{
0xf0 , 0xf1 , 0xf2 , 0xf3 , 0xf4 , 0xf5 , 0xf6 , 0xf7,
0xf8 , 0xf9 , 0xfa , 0xfb , 0xfc , 0xfd , 0xfe , 0xff
};
/* Buffer to store the output data */
uint8_t OutputMessage;
/* Size of the output data */
uint32_t OutputMessageLength = 0;
const uint8_t Expected_Ciphertext =
{
0x87, 0x4d, 0x61, 0x91, 0xb6, 0x20, 0xe3, 0x26,
0x1b, 0xef, 0x68, 0x64, 0x99, 0x0d, 0xb6, 0xce,
0x98, 0x06, 0xf6, 0x6b, 0x79, 0x70, 0xfd, 0xff,
0x86, 0x17, 0x18, 0x7b, 0xb9, 0xff, 0xfd, 0xff,
0x5a, 0xe4, 0xdf, 0x3e, 0xdb, 0xd5, 0xd3, 0x5e,
0x5b, 0x4f, 0x09, 0x02, 0x0d, 0xb0, 0x3e, 0xab,
0x1e, 0x03, 0x1d, 0xda, 0x2f, 0xbe, 0x03, 0xd1,
0x79, 0x21, 0x70, 0xa0, 0xf3, 0x00, 0x9c, 0xee
};
/* Private function prototypes -----------------------------------------------*/
int32_t STM32_AES_CTR_Encrypt(uint8_t*InputMessage,
uint32_tInputMessageLength,
uint8_t*AES128_Key,
uint8_t*InitializationVector,
uint32_tIvLength,
uint8_t*OutputMessage,
uint32_t *OutputMessageLength);
int32_t STM32_AES_CTR_Decrypt(uint8_t*InputMessage,
uint32_tInputMessageLength,
uint8_t*AES128_Key,
uint8_t*InitializationVector,
uint32_tIvLength,
uint8_t*OutputMessage,
uint32_t *OutputMessageLength);
TestStatus Buffercmp(const uint8_t* pBuffer,
uint8_t* pBuffer1,
uint16_t BufferLength);
/* Private functions ---------------------------------------------------------*/
/**
* @briefMain program.
* @paramNone
* @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
file before to branch to application main.
To reconfigure the default setting of SystemInit() function, refer to
system_stm32f10x.c, system_stm32l1xx.c, system_stm32f0xx.c,
system_stm32f2xx.c, system_stm32f30x.c, system_stm32f37x.c, or
system_stm32f4xx.c file depending on device.
*/
int32_t status = AES_SUCCESS;
/* DeInitialize STM32 Cryptographic Library */
Crypto_DeInit();
/* Encrypt DATA with AES in CTR mode */
status = STM32_AES_CTR_Encrypt( (uint8_t *) Plaintext, PLAINTEXT_LENGTH, Key, IV, sizeof(IV), OutputMessage,
&OutputMessageLength);
if (status == AES_SUCCESS)
{
if (Buffercmp(Expected_Ciphertext, OutputMessage, PLAINTEXT_LENGTH) == PASSED)
{
/* add application traintment in case of AES CTR encrption is passed */
}
else
{
/* add application traintment in case of AES CTR encrption is failed */
}
}
else
{
/* Add application traintment in case of encryption/decryption not success possible values
*of status:
* AES_ERR_BAD_CONTEXT, AES_ERR_BAD_PARAMETER, AES_ERR_BAD_OPERATION
*/
}
status = STM32_AES_CTR_Decrypt( (uint8_t *) Expected_Ciphertext, PLAINTEXT_LENGTH, Key, IV, sizeof(IV), OutputMessage,
&OutputMessageLength);
if (status == AES_SUCCESS)
{
if (Buffercmp(Plaintext, OutputMessage, PLAINTEXT_LENGTH) == PASSED)
{
/* add application traintment in case of AES CTR encrption is passed */
}
else
{
/* add application traintment in case of AES CTR encrption is failed */
}
}
else
{
/* Add application traintment in case of encryption/decryption not success possible values
*of status:
* AES_ERR_BAD_CONTEXT, AES_ERR_BAD_PARAMETER, AES_ERR_BAD_OPERATION
*/
}
/* Infinite loop */
while (1)
{}
}
/**
* @briefAES CTR Encryption example.
* @paramInputMessage: pointer to input message to be encrypted.
* @paramInputMessageLength: input data message length in byte.
* @paramAES128_Key: pointer to the AES key to be used in the operation
* @paramInitializationVector: pointer to the Initialization Vector (IV)
* @paramIvLength: IV length in bytes.
* @paramOutputMessage: pointer to output parameter that will handle the encrypted message
* @paramOutputMessageLength: pointer to encrypted message length.
* @retval error status: can be AES_SUCCESS if success or one of
* AES_ERR_BAD_CONTEXT, AES_ERR_BAD_PARAMETER, AES_ERR_BAD_OPERATION
* if error occured.
*/
int32_t STM32_AES_CTR_Encrypt(uint8_t* InputMessage,
uint32_t InputMessageLength,
uint8_t*AES128_Key,
uint8_t*InitializationVector,
uint32_tIvLength,
uint8_t*OutputMessage,
uint32_t *OutputMessageLength)
{
AESCTRctx_stt AESctx;
uint32_t error_status = AES_SUCCESS;
int32_t outputLength = 0;
/* Set flag field to default value */
AESctx.mFlags = E_SK_DEFAULT;
/* Set key size to 16 (corresponding to AES-128) */
AESctx.mKeySize = 16;
/* Set iv size field to IvLength*/
AESctx.mIvSize = IvLength;
/* Initialize the operation, by passing the key.
* Third parameter is NULL because CTR doesn't use any IV */
error_status = AES_CTR_Encrypt_Init(&AESctx, AES128_Key, InitializationVector );
/* check for initialization errors */
if (error_status == AES_SUCCESS)
{
/* Encrypt Data */
error_status = AES_CTR_Encrypt_Append(&AESctx,
InputMessage,
InputMessageLength,
OutputMessage,
&outputLength);
if (error_status == AES_SUCCESS)
{
/* Write the number of data written*/
*OutputMessageLength = outputLength;
/* Do the Finalization */
error_status = AES_CTR_Encrypt_Finish(&AESctx, OutputMessage + *OutputMessageLength, &outputLength);
/* Add data written to the information to be returned */
*OutputMessageLength += outputLength;
}
}
return error_status;
}
/**
* @briefAES CTR Decryption example.
* @paramInputMessage: pointer to input message to be decrypted.
* @paramInputMessageLength: input data message length in byte.
* @paramAES128_Key: pointer to the AES key to be used in the operation
* @paramInitializationVector: pointer to the Initialization Vector (IV)
* @paramIvLength: IV length in bytes.
* @paramOutputMessage: pointer to output parameter that will handle the decrypted message
* @paramOutputMessageLength: pointer to decrypted message length.
* @retval error status: can be AES_SUCCESS if success or one of
* AES_ERR_BAD_CONTEXT, AES_ERR_BAD_PARAMETER, AES_ERR_BAD_OPERATION
* if error occured.
*/
int32_t STM32_AES_CTR_Decrypt(uint8_t* InputMessage,
uint32_t InputMessageLength,
uint8_t*AES128_Key,
uint8_t*InitializationVector,
uint32_tIvLength,
uint8_t*OutputMessage,
uint32_t *OutputMessageLength)
{
AESCTRctx_stt AESctx;
uint32_t error_status = AES_SUCCESS;
int32_t outputLength = 0;
/* Set flag field to default value */
AESctx.mFlags = E_SK_DEFAULT;
/* Set key size to 16 (corresponding to AES-128) */
AESctx.mKeySize = 16;
/* Set iv size field to IvLength*/
AESctx.mIvSize = IvLength;
/* Initialize the operation, by passing the key.
* Third parameter is NULL because CTR doesn't use any IV */
error_status = AES_CTR_Decrypt_Init(&AESctx, AES128_Key, InitializationVector );
/* check for initialization errors */
if (error_status == AES_SUCCESS)
{
/* Decrypt Data */
error_status = AES_CTR_Decrypt_Append(&AESctx,
InputMessage,
InputMessageLength,
OutputMessage,
&outputLength);
if (error_status == AES_SUCCESS)
{
/* Write the number of data written*/
*OutputMessageLength = outputLength;
/* Do the Finalization */
error_status = AES_CTR_Decrypt_Finish(&AESctx, OutputMessage + *OutputMessageLength, &outputLength);
/* Add data written to the information to be returned */
*OutputMessageLength += outputLength;
}
}
return error_status;
}
/**
* @briefCompares two buffers.
* @parampBuffer, pBuffer1: buffers to be compared.
* @paramBufferLength: buffer's length
* @retval PASSED: pBuffer identical to pBuffer1
* FAILED: pBuffer differs from pBuffer1
*/
TestStatus Buffercmp(const uint8_t* pBuffer, uint8_t* pBuffer1, uint16_t BufferLength)
{
while (BufferLength--)
{
if (*pBuffer != *pBuffer1)
{
return FAILED;
}
pBuffer++;
pBuffer1++;
}
return PASSED;
}
#ifdefUSE_FULL_ASSERT
/**
* @briefReports the name of the source file and the source line number
* where the assert_param error has occurred.
* @paramfile: pointer to the source file name
* @paramline: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t* file, uint32_t line)
{
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* Infinite loop */
while (1)
{}
}
#endif
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
:):):):):) 帮顶:):):):) 帮顶:):):):):):) 没用过,帮顶一下 帮顶 就是设置一下就行了,直接编译的 7楼帮帮的,有学到了:lol ding a:):):) 没跑过……
页:
[1]
2