HAL_Crypt_rtthread.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. /*
  2. * Copyright (C) 2015-2018 Alibaba Group Holding Limited
  3. *
  4. * Again edit by rt-thread group
  5. * Change Logs:
  6. * Date Author Notes
  7. * 2019-07-21 MurphyZhao first edit
  8. */
  9. #include "infra_config.h"
  10. #if defined(HAL_CRYPTO)
  11. #include <string.h>
  12. #include <stdlib.h>
  13. #include "infra_compat.h"
  14. #include "mbedtls/aes.h"
  15. #define AES_BLOCK_SIZE 16
  16. typedef struct {
  17. mbedtls_aes_context ctx;
  18. uint8_t iv[16];
  19. uint8_t key[16];
  20. } platform_aes_t;
  21. p_HAL_Aes128_t HAL_Aes128_Init(
  22. const uint8_t *key,
  23. const uint8_t *iv,
  24. AES_DIR_t dir)
  25. {
  26. int ret = 0;
  27. platform_aes_t *p_aes128 = NULL;
  28. if (!key || !iv) return p_aes128;
  29. p_aes128 = (platform_aes_t *)calloc(1, sizeof(platform_aes_t));
  30. if (!p_aes128) return p_aes128;
  31. mbedtls_aes_init(&p_aes128->ctx);
  32. if (dir == HAL_AES_ENCRYPTION) {
  33. ret = mbedtls_aes_setkey_enc(&p_aes128->ctx, key, 128);
  34. } else {
  35. ret = mbedtls_aes_setkey_dec(&p_aes128->ctx, key, 128);
  36. }
  37. if (ret == 0) {
  38. memcpy(p_aes128->iv, iv, 16);
  39. memcpy(p_aes128->key, key, 16);
  40. } else {
  41. free(p_aes128);
  42. p_aes128 = NULL;
  43. }
  44. return (p_HAL_Aes128_t *)p_aes128;
  45. }
  46. int HAL_Aes128_Destroy(p_HAL_Aes128_t aes)
  47. {
  48. if (!aes) return -1;
  49. mbedtls_aes_free(&((platform_aes_t *)aes)->ctx);
  50. free(aes);
  51. return 0;
  52. }
  53. int HAL_Aes128_Cbc_Encrypt(
  54. p_HAL_Aes128_t aes,
  55. const void *src,
  56. size_t blockNum,
  57. void *dst)
  58. {
  59. int i = 0;
  60. int ret = ret;
  61. platform_aes_t *p_aes128 = (platform_aes_t *)aes;
  62. unsigned char *src_ptr = (unsigned char *)src;
  63. unsigned char *dst_ptr = (unsigned char *)dst;
  64. if (!aes || !src || !dst) return -1;
  65. for (i = 0; i < blockNum; ++i) {
  66. ret = mbedtls_aes_crypt_cbc(&p_aes128->ctx, MBEDTLS_AES_ENCRYPT, AES_BLOCK_SIZE,
  67. p_aes128->iv, src_ptr, dst_ptr);
  68. src_ptr += 16;
  69. dst_ptr += 16;
  70. }
  71. return ret;
  72. }
  73. int HAL_Aes128_Cbc_Decrypt(
  74. p_HAL_Aes128_t aes,
  75. const void *src,
  76. size_t blockNum,
  77. void *dst)
  78. {
  79. int i = 0;
  80. int ret = -1;
  81. platform_aes_t *p_aes128 = (platform_aes_t *)aes;
  82. unsigned char *src_ptr = (unsigned char *)src;
  83. unsigned char *dst_ptr = (unsigned char *)dst;
  84. if (!aes || !src || !dst) return ret;
  85. for (i = 0; i < blockNum; ++i) {
  86. ret = mbedtls_aes_crypt_cbc(&p_aes128->ctx, MBEDTLS_AES_DECRYPT, AES_BLOCK_SIZE,
  87. p_aes128->iv, src_ptr, dst_ptr);
  88. src_ptr += 16;
  89. dst_ptr += 16;
  90. }
  91. return ret;
  92. }
  93. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  94. int HAL_Aes128_Cfb_Encrypt(
  95. p_HAL_Aes128_t aes,
  96. const void *src,
  97. size_t length,
  98. void *dst)
  99. {
  100. size_t offset = 0;
  101. int ret = -1;
  102. platform_aes_t *p_aes128 = (platform_aes_t *)aes;
  103. if (!aes || !src || !dst) return ret;
  104. ret = mbedtls_aes_crypt_cfb128(&p_aes128->ctx, MBEDTLS_AES_ENCRYPT, length,
  105. &offset, p_aes128->iv, src, dst);
  106. return ret;
  107. }
  108. #endif
  109. #if defined(MBEDTLS_CIPHER_MODE_CFB)
  110. int HAL_Aes128_Cfb_Decrypt(
  111. p_HAL_Aes128_t aes,
  112. const void *src,
  113. size_t length,
  114. void *dst)
  115. {
  116. size_t offset = 0;
  117. int ret = -1;
  118. platform_aes_t *p_aes128 = (platform_aes_t *)aes;
  119. if (!aes || !src || !dst) return ret;
  120. ret = mbedtls_aes_setkey_enc(&p_aes128->ctx, p_aes128->key, 128);
  121. ret = mbedtls_aes_crypt_cfb128(&p_aes128->ctx, MBEDTLS_AES_DECRYPT, length,
  122. &offset, p_aes128->iv, src, dst);
  123. return ret;
  124. }
  125. #endif
  126. #endif /* #if defined(HAL_CRYPTO) */