SM4_POLLING 使用示例

例程路径: ls_sdk/examples/peripheral/sm4/sm4_polling

一、程序基本配置及说明:

/*sm4模块初始化*/
HAL_SM4_Init();

二、操作步骤及结果:

2.1 密钥扩展

const uint8_t key[16] = {
    0x01, 0x23, 0x45, 0x67,
    0x89, 0xab, 0xcd, 0xef,
    0xfe, 0xdc, 0xba, 0x98,
    0x76, 0x54, 0x32, 0x10};
HAL_SM4_KeyExpansion(key);

在加密和解密之前需要先进行密钥扩展,扩展完成后返回。

2.2 加密测试

uint32_t length = 16;
uint8_t cipherbuffer[64];
const uint8_t plaintext[64] = {
    0x01, 0x23, 0x45, 0x67,0x89, 0xab, 0xcd, 0xef,0xfe, 0xdc, 0xba, 0x98,0x76, 0x54, 0x32, 0x10,
    0x01, 0x23, 0x45, 0x67,0x89, 0xab, 0xcd, 0xef,0xfe, 0xdc, 0xba, 0x98,0x76, 0x54, 0x32, 0x10,
    0x01, 0x23, 0x45, 0x67,0x89, 0xab, 0xcd, 0xef,0xfe, 0xdc, 0xba, 0x98,0x76, 0x54, 0x32, 0x10,
    0x01, 0x23, 0x45, 0x67,0x89, 0xab, 0xcd, 0xef,0xfe, 0xdc, 0xba, 0x98,0x76, 0x54, 0x32, 0x10};
HAL_SM4_Encrypt(plaintext, cipherbuffer, length);
  • plaintext是待加密的明文地址

  • cipherbuffer是加密后的密文输出地址

  • length是加密的长度,以Byte为单位,例程中进行了长度分别为16、32、64的加密运算

示例加密完成后返回,根据cipherbuffer与plaintext进行比较,log如下:

  • CRYPT_SM4_ENCRYPT_16_TEST_SUCCESS!

  • CRYPT_SM4_ENCRYPT_32_TEST_SUCCESS!

  • CRYPT_SM4_ENCRYPT_64_TEST_SUCCESS!

2.3 解密测试

uint8_t cipherbuffer[64];
const uint8_t ciphertext[64] = {
    0x01, 0x23, 0x45, 0x67,0x89, 0xab, 0xcd, 0xef,0xfe, 0xdc, 0xba, 0x98,0x76, 0x54, 0x32, 0x10,
    0x01, 0x23, 0x45, 0x67,0x89, 0xab, 0xcd, 0xef,0xfe, 0xdc, 0xba, 0x98,0x76, 0x54, 0x32, 0x10,
    0x01, 0x23, 0x45, 0x67,0x89, 0xab, 0xcd, 0xef,0xfe, 0xdc, 0xba, 0x98,0x76, 0x54, 0x32, 0x10,
    0x01, 0x23, 0x45, 0x67,0x89, 0xab, 0xcd, 0xef,0xfe, 0xdc, 0xba, 0x98,0x76, 0x54, 0x32, 0x10};
HAL_SM4_Decrypt(ciphertext, plainbuffer, length);
  • ciphertext是待解密的密文地址

  • plainbuffer是解密后明文输出地址

  • length是待解密的密文文长度,以Byte为单位,例程中进行了长度分别为16、32、64的解密运算

示例加密完成后返回,根据plainbuffer与plaintext进行比较,log如下:

  • CRYPT_SM4_DECRYPT_16_TEST_SUCCESS!

  • CRYPT_SM4_DECRYPT_32_TEST_SUCCESS!

  • CRYPT_SM4_DECRYPT_64_TEST_SUCCESS!