HAL_Crypt_Linux.c 3.3 KB

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