Contributors: 6
	  
        
          | Author | 
          Tokens | 
          Token Proportion | 
          Commits | 
          Commit Proportion | 
        
	  
	  
        
        
          | Ard Biesheuvel | 
          128 | 
          47.76% | 
          1 | 
          14.29% | 
        
        
          | Herbert Xu | 
          57 | 
          21.27% | 
          2 | 
          28.57% | 
        
        
          | Iuliana Prodan | 
          42 | 
          15.67% | 
          1 | 
          14.29% | 
        
        
          | Corentin Labbe | 
          20 | 
          7.46% | 
          1 | 
          14.29% | 
        
        
          | Mikko Herranen | 
          11 | 
          4.10% | 
          1 | 
          14.29% | 
        
        
          | Huang Ying | 
          10 | 
          3.73% | 
          1 | 
          14.29% | 
        
	  
	  
        
          | Total | 
          268 | 
           | 
          7 | 
           | 
	    
	  
    
 
#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