1 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2 /*
3  * Crypto user configuration API.
4  *
5  * Copyright (C) 2011 secunet Security Networks AG
6  * Copyright (C) 2011 Steffen Klassert <steffen.klassert@secunet.com>
7  *
8  * This program is free software; you can redistribute it and/or modify it
9  * under the terms and conditions of the GNU General Public License,
10  * version 2, as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope it will be useful, but WITHOUT
13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
15  * more details.
16  *
17  * You should have received a copy of the GNU General Public License along with
18  * this program; if not, write to the Free Software Foundation, Inc.,
19  * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
20  */
21 
22 #include <linux/types.h>
23 
24 /* Netlink configuration messages.  */
25 enum {
26 	CRYPTO_MSG_BASE = 0x10,
27 	CRYPTO_MSG_NEWALG = 0x10,
28 	CRYPTO_MSG_DELALG,
29 	CRYPTO_MSG_UPDATEALG,
30 	CRYPTO_MSG_GETALG,
31 	CRYPTO_MSG_DELRNG,
32 	CRYPTO_MSG_GETSTAT,
33 	__CRYPTO_MSG_MAX
34 };
35 #define CRYPTO_MSG_MAX (__CRYPTO_MSG_MAX - 1)
36 #define CRYPTO_NR_MSGTYPES (CRYPTO_MSG_MAX + 1 - CRYPTO_MSG_BASE)
37 
38 #define CRYPTO_MAX_NAME 64
39 
40 /* Netlink message attributes.  */
41 enum crypto_attr_type_t {
42 	CRYPTOCFGA_UNSPEC,
43 	CRYPTOCFGA_PRIORITY_VAL,	/* __u32 */
44 	CRYPTOCFGA_REPORT_LARVAL,	/* struct crypto_report_larval */
45 	CRYPTOCFGA_REPORT_HASH,		/* struct crypto_report_hash */
46 	CRYPTOCFGA_REPORT_BLKCIPHER,	/* struct crypto_report_blkcipher */
47 	CRYPTOCFGA_REPORT_AEAD,		/* struct crypto_report_aead */
48 	CRYPTOCFGA_REPORT_COMPRESS,	/* struct crypto_report_comp */
49 	CRYPTOCFGA_REPORT_RNG,		/* struct crypto_report_rng */
50 	CRYPTOCFGA_REPORT_CIPHER,	/* struct crypto_report_cipher */
51 	CRYPTOCFGA_REPORT_AKCIPHER,	/* struct crypto_report_akcipher */
52 	CRYPTOCFGA_REPORT_KPP,		/* struct crypto_report_kpp */
53 	CRYPTOCFGA_REPORT_ACOMP,	/* struct crypto_report_acomp */
54 	CRYPTOCFGA_STAT_LARVAL,		/* struct crypto_stat */
55 	CRYPTOCFGA_STAT_HASH,		/* struct crypto_stat */
56 	CRYPTOCFGA_STAT_BLKCIPHER,	/* struct crypto_stat */
57 	CRYPTOCFGA_STAT_AEAD,		/* struct crypto_stat */
58 	CRYPTOCFGA_STAT_COMPRESS,	/* struct crypto_stat */
59 	CRYPTOCFGA_STAT_RNG,		/* struct crypto_stat */
60 	CRYPTOCFGA_STAT_CIPHER,		/* struct crypto_stat */
61 	CRYPTOCFGA_STAT_AKCIPHER,	/* struct crypto_stat */
62 	CRYPTOCFGA_STAT_KPP,		/* struct crypto_stat */
63 	CRYPTOCFGA_STAT_ACOMP,		/* struct crypto_stat */
64 	__CRYPTOCFGA_MAX
65 
66 #define CRYPTOCFGA_MAX (__CRYPTOCFGA_MAX - 1)
67 };
68 
69 struct crypto_user_alg {
70 	char cru_name[CRYPTO_MAX_NAME];
71 	char cru_driver_name[CRYPTO_MAX_NAME];
72 	char cru_module_name[CRYPTO_MAX_NAME];
73 	__u32 cru_type;
74 	__u32 cru_mask;
75 	__u32 cru_refcnt;
76 	__u32 cru_flags;
77 };
78 
79 struct crypto_stat_aead {
80 	char type[CRYPTO_MAX_NAME];
81 	__u64 stat_encrypt_cnt;
82 	__u64 stat_encrypt_tlen;
83 	__u64 stat_decrypt_cnt;
84 	__u64 stat_decrypt_tlen;
85 	__u64 stat_err_cnt;
86 };
87 
88 struct crypto_stat_akcipher {
89 	char type[CRYPTO_MAX_NAME];
90 	__u64 stat_encrypt_cnt;
91 	__u64 stat_encrypt_tlen;
92 	__u64 stat_decrypt_cnt;
93 	__u64 stat_decrypt_tlen;
94 	__u64 stat_verify_cnt;
95 	__u64 stat_sign_cnt;
96 	__u64 stat_err_cnt;
97 };
98 
99 struct crypto_stat_cipher {
100 	char type[CRYPTO_MAX_NAME];
101 	__u64 stat_encrypt_cnt;
102 	__u64 stat_encrypt_tlen;
103 	__u64 stat_decrypt_cnt;
104 	__u64 stat_decrypt_tlen;
105 	__u64 stat_err_cnt;
106 };
107 
108 struct crypto_stat_compress {
109 	char type[CRYPTO_MAX_NAME];
110 	__u64 stat_compress_cnt;
111 	__u64 stat_compress_tlen;
112 	__u64 stat_decompress_cnt;
113 	__u64 stat_decompress_tlen;
114 	__u64 stat_err_cnt;
115 };
116 
117 struct crypto_stat_hash {
118 	char type[CRYPTO_MAX_NAME];
119 	__u64 stat_hash_cnt;
120 	__u64 stat_hash_tlen;
121 	__u64 stat_err_cnt;
122 };
123 
124 struct crypto_stat_kpp {
125 	char type[CRYPTO_MAX_NAME];
126 	__u64 stat_setsecret_cnt;
127 	__u64 stat_generate_public_key_cnt;
128 	__u64 stat_compute_shared_secret_cnt;
129 	__u64 stat_err_cnt;
130 };
131 
132 struct crypto_stat_rng {
133 	char type[CRYPTO_MAX_NAME];
134 	__u64 stat_generate_cnt;
135 	__u64 stat_generate_tlen;
136 	__u64 stat_seed_cnt;
137 	__u64 stat_err_cnt;
138 };
139 
140 struct crypto_stat_larval {
141 	char type[CRYPTO_MAX_NAME];
142 };
143 
144 struct crypto_report_larval {
145 	char type[CRYPTO_MAX_NAME];
146 };
147 
148 struct crypto_report_hash {
149 	char type[CRYPTO_MAX_NAME];
150 	unsigned int blocksize;
151 	unsigned int digestsize;
152 };
153 
154 struct crypto_report_cipher {
155 	char type[CRYPTO_MAX_NAME];
156 	unsigned int blocksize;
157 	unsigned int min_keysize;
158 	unsigned int max_keysize;
159 };
160 
161 struct crypto_report_blkcipher {
162 	char type[CRYPTO_MAX_NAME];
163 	char geniv[CRYPTO_MAX_NAME];
164 	unsigned int blocksize;
165 	unsigned int min_keysize;
166 	unsigned int max_keysize;
167 	unsigned int ivsize;
168 };
169 
170 struct crypto_report_aead {
171 	char type[CRYPTO_MAX_NAME];
172 	char geniv[CRYPTO_MAX_NAME];
173 	unsigned int blocksize;
174 	unsigned int maxauthsize;
175 	unsigned int ivsize;
176 };
177 
178 struct crypto_report_comp {
179 	char type[CRYPTO_MAX_NAME];
180 };
181 
182 struct crypto_report_rng {
183 	char type[CRYPTO_MAX_NAME];
184 	unsigned int seedsize;
185 };
186 
187 struct crypto_report_akcipher {
188 	char type[CRYPTO_MAX_NAME];
189 };
190 
191 struct crypto_report_kpp {
192 	char type[CRYPTO_MAX_NAME];
193 };
194 
195 struct crypto_report_acomp {
196 	char type[CRYPTO_MAX_NAME];
197 };
198 
199 #define CRYPTO_REPORT_MAXSIZE (sizeof(struct crypto_user_alg) + \
200 			       sizeof(struct crypto_report_blkcipher))
201