| #ifndef _CRYPTO_GCM_H |
| #define _CRYPTO_GCM_H |
| |
| #include <linux/errno.h> |
| |
| #include <crypto/aes.h> |
| #include <crypto/gf128mul.h> |
| |
| #define GCM_AES_IV_SIZE 12 |
| #define GCM_RFC4106_IV_SIZE 8 |
| #define GCM_RFC4543_IV_SIZE 8 |
| |
| /* |
| * validate authentication tag for GCM |
| */ |
| static inline int crypto_gcm_check_authsize(unsigned int authsize) |
| { |
| switch (authsize) { |
| case 4: |
| case 8: |
| case 12: |
| case 13: |
| case 14: |
| case 15: |
| case 16: |
| break; |
| default: |
| return -EINVAL; |
| } |
| |
| return 0; |
| } |
| |
| /* |
| * validate authentication tag for RFC4106 |
| */ |
| static inline int crypto_rfc4106_check_authsize(unsigned int authsize) |
| { |
| switch (authsize) { |
| case 8: |
| case 12: |
| case 16: |
| break; |
| default: |
| return -EINVAL; |
| } |
| |
| return 0; |
| } |
| |
| /* |
| * validate assoclen for RFC4106/RFC4543 |
| */ |
| static inline int crypto_ipsec_check_assoclen(unsigned int assoclen) |
| { |
| switch (assoclen) { |
| case 16: |
| case 20: |
| break; |
| default: |
| return -EINVAL; |
| } |
| |
| return 0; |
| } |
| |
| struct aesgcm_ctx { |
| be128 ghash_key; |
| struct crypto_aes_ctx aes_ctx; |
| unsigned int authsize; |
| }; |
| |
| int aesgcm_expandkey(struct aesgcm_ctx *ctx, const u8 *key, |
| unsigned int keysize, unsigned int authsize); |
| |
| void aesgcm_encrypt(const struct aesgcm_ctx *ctx, u8 *dst, const u8 *src, |
| int crypt_len, const u8 *assoc, int assoc_len, |
| const u8 iv[GCM_AES_IV_SIZE], u8 *authtag); |
| |
| bool __must_check aesgcm_decrypt(const struct aesgcm_ctx *ctx, u8 *dst, |
| const u8 *src, int crypt_len, const u8 *assoc, |
| int assoc_len, const u8 iv[GCM_AES_IV_SIZE], |
| const u8 *authtag); |
| |
| #endif |