Commit | Line | Data |
---|---|---|
ef780324 CL |
1 | #ifndef _CRYPTO_GCM_H |
2 | #define _CRYPTO_GCM_H | |
3 | ||
65526f63 IP |
4 | #include <linux/errno.h> |
5 | ||
520af5da AB |
6 | #include <crypto/aes.h> |
7 | #include <crypto/gf128mul.h> | |
8 | ||
ef780324 CL |
9 | #define GCM_AES_IV_SIZE 12 |
10 | #define GCM_RFC4106_IV_SIZE 8 | |
11 | #define GCM_RFC4543_IV_SIZE 8 | |
12 | ||
65526f63 IP |
13 | /* |
14 | * validate authentication tag for GCM | |
15 | */ | |
16 | static 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 | */ | |
37 | static 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 | */ | |
54 | static 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 | } | |
520af5da AB |
66 | |
67 | struct aesgcm_ctx { | |
68 | be128 ghash_key; | |
69 | struct crypto_aes_ctx aes_ctx; | |
70 | unsigned int authsize; | |
71 | }; | |
72 | ||
73 | int aesgcm_expandkey(struct aesgcm_ctx *ctx, const u8 *key, | |
74 | unsigned int keysize, unsigned int authsize); | |
75 | ||
76 | void 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 | ||
80 | bool __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 | ||
ef780324 | 85 | #endif |