Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/include/crypto/gcm.h
26295 views
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
*/
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
}
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
85
#endif
86
87