1 #ifndef _CRYPTO_GCM_H 1 #ifndef _CRYPTO_GCM_H 2 #define _CRYPTO_GCM_H 2 #define _CRYPTO_GCM_H 3 3 4 #include <linux/errno.h> 4 #include <linux/errno.h> 5 5 6 #include <crypto/aes.h> 6 #include <crypto/aes.h> 7 #include <crypto/gf128mul.h> 7 #include <crypto/gf128mul.h> 8 8 9 #define GCM_AES_IV_SIZE 12 9 #define GCM_AES_IV_SIZE 12 10 #define GCM_RFC4106_IV_SIZE 8 10 #define GCM_RFC4106_IV_SIZE 8 11 #define GCM_RFC4543_IV_SIZE 8 11 #define GCM_RFC4543_IV_SIZE 8 12 12 13 /* 13 /* 14 * validate authentication tag for GCM 14 * validate authentication tag for GCM 15 */ 15 */ 16 static inline int crypto_gcm_check_authsize(un 16 static inline int crypto_gcm_check_authsize(unsigned int authsize) 17 { 17 { 18 switch (authsize) { 18 switch (authsize) { 19 case 4: 19 case 4: 20 case 8: 20 case 8: 21 case 12: 21 case 12: 22 case 13: 22 case 13: 23 case 14: 23 case 14: 24 case 15: 24 case 15: 25 case 16: 25 case 16: 26 break; 26 break; 27 default: 27 default: 28 return -EINVAL; 28 return -EINVAL; 29 } 29 } 30 30 31 return 0; 31 return 0; 32 } 32 } 33 33 34 /* 34 /* 35 * validate authentication tag for RFC4106 35 * validate authentication tag for RFC4106 36 */ 36 */ 37 static inline int crypto_rfc4106_check_authsiz 37 static inline int crypto_rfc4106_check_authsize(unsigned int authsize) 38 { 38 { 39 switch (authsize) { 39 switch (authsize) { 40 case 8: 40 case 8: 41 case 12: 41 case 12: 42 case 16: 42 case 16: 43 break; 43 break; 44 default: 44 default: 45 return -EINVAL; 45 return -EINVAL; 46 } 46 } 47 47 48 return 0; 48 return 0; 49 } 49 } 50 50 51 /* 51 /* 52 * validate assoclen for RFC4106/RFC4543 52 * validate assoclen for RFC4106/RFC4543 53 */ 53 */ 54 static inline int crypto_ipsec_check_assoclen( 54 static inline int crypto_ipsec_check_assoclen(unsigned int assoclen) 55 { 55 { 56 switch (assoclen) { 56 switch (assoclen) { 57 case 16: 57 case 16: 58 case 20: 58 case 20: 59 break; 59 break; 60 default: 60 default: 61 return -EINVAL; 61 return -EINVAL; 62 } 62 } 63 63 64 return 0; 64 return 0; 65 } 65 } 66 66 67 struct aesgcm_ctx { 67 struct aesgcm_ctx { 68 be128 ghash_key; 68 be128 ghash_key; 69 struct crypto_aes_ctx aes_ctx; 69 struct crypto_aes_ctx aes_ctx; 70 unsigned int authsize; 70 unsigned int authsize; 71 }; 71 }; 72 72 73 int aesgcm_expandkey(struct aesgcm_ctx *ctx, c 73 int aesgcm_expandkey(struct aesgcm_ctx *ctx, const u8 *key, 74 unsigned int keysize, uns 74 unsigned int keysize, unsigned int authsize); 75 75 76 void aesgcm_encrypt(const struct aesgcm_ctx *c 76 void aesgcm_encrypt(const struct aesgcm_ctx *ctx, u8 *dst, const u8 *src, 77 int crypt_len, const u8 *a 77 int crypt_len, const u8 *assoc, int assoc_len, 78 const u8 iv[GCM_AES_IV_SIZ 78 const u8 iv[GCM_AES_IV_SIZE], u8 *authtag); 79 79 80 bool __must_check aesgcm_decrypt(const struct 80 bool __must_check aesgcm_decrypt(const struct aesgcm_ctx *ctx, u8 *dst, 81 const u8 *src 81 const u8 *src, int crypt_len, const u8 *assoc, 82 int assoc_len 82 int assoc_len, const u8 iv[GCM_AES_IV_SIZE], 83 const u8 *aut 83 const u8 *authtag); 84 84 85 #endif 85 #endif 86 86
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.