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