aead.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /*
  2. * Copyright 2014-2023 The GmSSL Project. All Rights Reserved.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the License); you may
  5. * not use this file except in compliance with the License.
  6. *
  7. * http://www.apache.org/licenses/LICENSE-2.0
  8. */
  9. #ifndef GMSSL_AEAD_H
  10. #define GMSSL_AEAD_H
  11. #include <string.h>
  12. #include <stdint.h>
  13. #include <gmssl/sm3.h>
  14. #include <gmssl/sm4.h>
  15. #include <gmssl/gcm.h>
  16. #include <gmssl/api.h>
  17. #ifdef __cplusplus
  18. extern "C" {
  19. #endif
  20. typedef struct {
  21. SM4_CBC_CTX enc_ctx;
  22. SM3_HMAC_CTX mac_ctx;
  23. uint8_t mac[SM3_HMAC_SIZE];
  24. size_t maclen;
  25. } SM4_CBC_SM3_HMAC_CTX;
  26. #define SM4_CBC_SM3_HMAC_KEY_SIZE 48
  27. #define SM4_CBC_SM3_HMAC_IV_SIZE 16
  28. _gmssl_export int sm4_cbc_sm3_hmac_encrypt_init(SM4_CBC_SM3_HMAC_CTX *ctx,
  29. const uint8_t *key, size_t keylen, const uint8_t *iv, size_t ivlen,
  30. const uint8_t *aad, size_t aadlen);
  31. _gmssl_export int sm4_cbc_sm3_hmac_encrypt_update(SM4_CBC_SM3_HMAC_CTX *ctx,
  32. const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen);
  33. _gmssl_export int sm4_cbc_sm3_hmac_encrypt_finish(SM4_CBC_SM3_HMAC_CTX *ctx,
  34. uint8_t *out, size_t *outlen);
  35. _gmssl_export int sm4_cbc_sm3_hmac_decrypt_init(SM4_CBC_SM3_HMAC_CTX *ctx,
  36. const uint8_t *key, size_t keylen, const uint8_t *iv, size_t ivlen,
  37. const uint8_t *aad, size_t aadlen);
  38. _gmssl_export int sm4_cbc_sm3_hmac_decrypt_update(SM4_CBC_SM3_HMAC_CTX *ctx,
  39. const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen);
  40. _gmssl_export int sm4_cbc_sm3_hmac_decrypt_finish(SM4_CBC_SM3_HMAC_CTX *ctx,
  41. uint8_t *out, size_t *outlen);
  42. typedef struct {
  43. SM4_CTR_CTX enc_ctx;
  44. SM3_HMAC_CTX mac_ctx;
  45. uint8_t mac[SM3_HMAC_SIZE];
  46. size_t maclen;
  47. } SM4_CTR_SM3_HMAC_CTX;
  48. #define SM4_CTR_SM3_HMAC_KEY_SIZE 48
  49. #define SM4_CTR_SM3_HMAC_IV_SIZE 16
  50. _gmssl_export int sm4_ctr_sm3_hmac_encrypt_init(SM4_CTR_SM3_HMAC_CTX *ctx,
  51. const uint8_t *key, size_t keylen, const uint8_t *iv, size_t ivlen,
  52. const uint8_t *aad, size_t aadlen);
  53. _gmssl_export int sm4_ctr_sm3_hmac_encrypt_update(SM4_CTR_SM3_HMAC_CTX *ctx,
  54. const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen);
  55. _gmssl_export int sm4_ctr_sm3_hmac_encrypt_finish(SM4_CTR_SM3_HMAC_CTX *ctx,
  56. uint8_t *out, size_t *outlen);
  57. _gmssl_export int sm4_ctr_sm3_hmac_decrypt_init(SM4_CTR_SM3_HMAC_CTX *ctx,
  58. const uint8_t *key, size_t keylen, const uint8_t *iv, size_t ivlen,
  59. const uint8_t *aad, size_t aadlen);
  60. _gmssl_export int sm4_ctr_sm3_hmac_decrypt_update(SM4_CTR_SM3_HMAC_CTX *ctx,
  61. const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen);
  62. _gmssl_export int sm4_ctr_sm3_hmac_decrypt_finish(SM4_CTR_SM3_HMAC_CTX *ctx,
  63. uint8_t *out, size_t *outlen);
  64. typedef struct {
  65. SM4_CTR_CTX enc_ctx;
  66. GHASH_CTX mac_ctx;
  67. uint8_t Y[16]; // E(K, Y_0)
  68. size_t taglen;
  69. uint8_t mac[16];
  70. size_t maclen;
  71. } SM4_GCM_CTX;
  72. #define SM4_GCM_KEY_SIZE 16
  73. #define SM4_GCM_MIN_IV_SIZE 1
  74. #define SM4_GCM_DEFAULT_IV_SIZE 12
  75. #define SM4_GCM_MAX_IV_SIZE 64
  76. #define SM4_GCM_DEFAULT_TAG_SIZE 16
  77. _gmssl_export int sm4_gcm_encrypt_init(SM4_GCM_CTX *ctx,
  78. const uint8_t *key, size_t keylen, const uint8_t *iv, size_t ivlen,
  79. const uint8_t *aad, size_t aadlen, size_t taglen);
  80. _gmssl_export int sm4_gcm_encrypt_update(SM4_GCM_CTX *ctx,
  81. const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen);
  82. _gmssl_export int sm4_gcm_encrypt_finish(SM4_GCM_CTX *ctx,
  83. uint8_t *out, size_t *outlen);
  84. _gmssl_export int sm4_gcm_decrypt_init(SM4_GCM_CTX *ctx,
  85. const uint8_t *key, size_t keylen, const uint8_t *iv, size_t ivlen,
  86. const uint8_t *aad, size_t aadlen, size_t taglen);
  87. _gmssl_export int sm4_gcm_decrypt_update(SM4_GCM_CTX *ctx,
  88. const uint8_t *in, size_t inlen, uint8_t *out, size_t *outlen);
  89. _gmssl_export int sm4_gcm_decrypt_finish(SM4_GCM_CTX *ctx,
  90. uint8_t *out, size_t *outlen);
  91. #ifdef __cplusplus
  92. }
  93. #endif
  94. #endif