Blame view

crypto/crypto_user_stat.c 9.75 KB
cac5818c2   Corentin Labbe   crypto: user - Im...
1
2
3
4
5
6
7
8
9
10
11
12
  // SPDX-License-Identifier: GPL-2.0
  /*
   * Crypto user configuration API.
   *
   * Copyright (C) 2017-2018 Corentin Labbe <clabbe@baylibre.com>
   *
   */
  
  #include <linux/crypto.h>
  #include <linux/cryptouser.h>
  #include <linux/sched.h>
  #include <net/netlink.h>
91b05a7e7   Ondrej Mosnacek   crypto: user - ma...
13
  #include <net/sock.h>
cac5818c2   Corentin Labbe   crypto: user - Im...
14
15
16
17
18
19
20
21
22
  #include <crypto/internal/skcipher.h>
  #include <crypto/internal/rng.h>
  #include <crypto/akcipher.h>
  #include <crypto/kpp.h>
  #include <crypto/internal/cryptouser.h>
  
  #include "internal.h"
  
  #define null_terminated(x)	(strnlen(x, sizeof(x)) < sizeof(x))
cac5818c2   Corentin Labbe   crypto: user - Im...
23
24
25
26
27
28
29
30
31
  struct crypto_dump_info {
  	struct sk_buff *in_skb;
  	struct sk_buff *out_skb;
  	u32 nlmsg_seq;
  	u16 nlmsg_flags;
  };
  
  static int crypto_report_aead(struct sk_buff *skb, struct crypto_alg *alg)
  {
7f0a9d5c9   Corentin Labbe   crypto: user - sp...
32
  	struct crypto_stat_aead raead;
cac5818c2   Corentin Labbe   crypto: user - Im...
33

9f4debe38   Corentin Labbe   crypto: user - Ze...
34
  	memset(&raead, 0, sizeof(raead));
37db69e0b   Eric Biggers   crypto: user - cl...
35
  	strscpy(raead.type, "aead", sizeof(raead.type));
cac5818c2   Corentin Labbe   crypto: user - Im...
36

17c18f9e3   Corentin Labbe   crypto: user - Sp...
37
38
39
40
  	raead.stat_encrypt_cnt = atomic64_read(&alg->stats.aead.encrypt_cnt);
  	raead.stat_encrypt_tlen = atomic64_read(&alg->stats.aead.encrypt_tlen);
  	raead.stat_decrypt_cnt = atomic64_read(&alg->stats.aead.decrypt_cnt);
  	raead.stat_decrypt_tlen = atomic64_read(&alg->stats.aead.decrypt_tlen);
44f13133c   Corentin Labbe   crypto: user - re...
41
  	raead.stat_err_cnt = atomic64_read(&alg->stats.aead.err_cnt);
cac5818c2   Corentin Labbe   crypto: user - Im...
42

37db69e0b   Eric Biggers   crypto: user - cl...
43
  	return nla_put(skb, CRYPTOCFGA_STAT_AEAD, sizeof(raead), &raead);
cac5818c2   Corentin Labbe   crypto: user - Im...
44
45
46
47
  }
  
  static int crypto_report_cipher(struct sk_buff *skb, struct crypto_alg *alg)
  {
7f0a9d5c9   Corentin Labbe   crypto: user - sp...
48
  	struct crypto_stat_cipher rcipher;
cac5818c2   Corentin Labbe   crypto: user - Im...
49

9f4debe38   Corentin Labbe   crypto: user - Ze...
50
  	memset(&rcipher, 0, sizeof(rcipher));
37db69e0b   Eric Biggers   crypto: user - cl...
51
  	strscpy(rcipher.type, "cipher", sizeof(rcipher.type));
cac5818c2   Corentin Labbe   crypto: user - Im...
52

17c18f9e3   Corentin Labbe   crypto: user - Sp...
53
54
55
56
  	rcipher.stat_encrypt_cnt = atomic64_read(&alg->stats.cipher.encrypt_cnt);
  	rcipher.stat_encrypt_tlen = atomic64_read(&alg->stats.cipher.encrypt_tlen);
  	rcipher.stat_decrypt_cnt =  atomic64_read(&alg->stats.cipher.decrypt_cnt);
  	rcipher.stat_decrypt_tlen = atomic64_read(&alg->stats.cipher.decrypt_tlen);
44f13133c   Corentin Labbe   crypto: user - re...
57
  	rcipher.stat_err_cnt =  atomic64_read(&alg->stats.cipher.err_cnt);
cac5818c2   Corentin Labbe   crypto: user - Im...
58

37db69e0b   Eric Biggers   crypto: user - cl...
59
  	return nla_put(skb, CRYPTOCFGA_STAT_CIPHER, sizeof(rcipher), &rcipher);
cac5818c2   Corentin Labbe   crypto: user - Im...
60
61
62
63
  }
  
  static int crypto_report_comp(struct sk_buff *skb, struct crypto_alg *alg)
  {
7f0a9d5c9   Corentin Labbe   crypto: user - sp...
64
  	struct crypto_stat_compress rcomp;
cac5818c2   Corentin Labbe   crypto: user - Im...
65

9f4debe38   Corentin Labbe   crypto: user - Ze...
66
  	memset(&rcomp, 0, sizeof(rcomp));
37db69e0b   Eric Biggers   crypto: user - cl...
67
  	strscpy(rcomp.type, "compression", sizeof(rcomp.type));
17c18f9e3   Corentin Labbe   crypto: user - Sp...
68
69
70
71
  	rcomp.stat_compress_cnt = atomic64_read(&alg->stats.compress.compress_cnt);
  	rcomp.stat_compress_tlen = atomic64_read(&alg->stats.compress.compress_tlen);
  	rcomp.stat_decompress_cnt = atomic64_read(&alg->stats.compress.decompress_cnt);
  	rcomp.stat_decompress_tlen = atomic64_read(&alg->stats.compress.decompress_tlen);
44f13133c   Corentin Labbe   crypto: user - re...
72
  	rcomp.stat_err_cnt = atomic64_read(&alg->stats.compress.err_cnt);
cac5818c2   Corentin Labbe   crypto: user - Im...
73

37db69e0b   Eric Biggers   crypto: user - cl...
74
  	return nla_put(skb, CRYPTOCFGA_STAT_COMPRESS, sizeof(rcomp), &rcomp);
cac5818c2   Corentin Labbe   crypto: user - Im...
75
76
77
78
  }
  
  static int crypto_report_acomp(struct sk_buff *skb, struct crypto_alg *alg)
  {
7f0a9d5c9   Corentin Labbe   crypto: user - sp...
79
  	struct crypto_stat_compress racomp;
cac5818c2   Corentin Labbe   crypto: user - Im...
80

9f4debe38   Corentin Labbe   crypto: user - Ze...
81
  	memset(&racomp, 0, sizeof(racomp));
37db69e0b   Eric Biggers   crypto: user - cl...
82
  	strscpy(racomp.type, "acomp", sizeof(racomp.type));
17c18f9e3   Corentin Labbe   crypto: user - Sp...
83
84
85
86
  	racomp.stat_compress_cnt = atomic64_read(&alg->stats.compress.compress_cnt);
  	racomp.stat_compress_tlen = atomic64_read(&alg->stats.compress.compress_tlen);
  	racomp.stat_decompress_cnt =  atomic64_read(&alg->stats.compress.decompress_cnt);
  	racomp.stat_decompress_tlen = atomic64_read(&alg->stats.compress.decompress_tlen);
44f13133c   Corentin Labbe   crypto: user - re...
87
  	racomp.stat_err_cnt = atomic64_read(&alg->stats.compress.err_cnt);
cac5818c2   Corentin Labbe   crypto: user - Im...
88

37db69e0b   Eric Biggers   crypto: user - cl...
89
  	return nla_put(skb, CRYPTOCFGA_STAT_ACOMP, sizeof(racomp), &racomp);
cac5818c2   Corentin Labbe   crypto: user - Im...
90
91
92
93
  }
  
  static int crypto_report_akcipher(struct sk_buff *skb, struct crypto_alg *alg)
  {
7f0a9d5c9   Corentin Labbe   crypto: user - sp...
94
  	struct crypto_stat_akcipher rakcipher;
cac5818c2   Corentin Labbe   crypto: user - Im...
95

9f4debe38   Corentin Labbe   crypto: user - Ze...
96
  	memset(&rakcipher, 0, sizeof(rakcipher));
37db69e0b   Eric Biggers   crypto: user - cl...
97
  	strscpy(rakcipher.type, "akcipher", sizeof(rakcipher.type));
17c18f9e3   Corentin Labbe   crypto: user - Sp...
98
99
100
101
102
103
  	rakcipher.stat_encrypt_cnt = atomic64_read(&alg->stats.akcipher.encrypt_cnt);
  	rakcipher.stat_encrypt_tlen = atomic64_read(&alg->stats.akcipher.encrypt_tlen);
  	rakcipher.stat_decrypt_cnt = atomic64_read(&alg->stats.akcipher.decrypt_cnt);
  	rakcipher.stat_decrypt_tlen = atomic64_read(&alg->stats.akcipher.decrypt_tlen);
  	rakcipher.stat_sign_cnt = atomic64_read(&alg->stats.akcipher.sign_cnt);
  	rakcipher.stat_verify_cnt = atomic64_read(&alg->stats.akcipher.verify_cnt);
44f13133c   Corentin Labbe   crypto: user - re...
104
  	rakcipher.stat_err_cnt = atomic64_read(&alg->stats.akcipher.err_cnt);
cac5818c2   Corentin Labbe   crypto: user - Im...
105

37db69e0b   Eric Biggers   crypto: user - cl...
106
107
  	return nla_put(skb, CRYPTOCFGA_STAT_AKCIPHER,
  		       sizeof(rakcipher), &rakcipher);
cac5818c2   Corentin Labbe   crypto: user - Im...
108
109
110
111
  }
  
  static int crypto_report_kpp(struct sk_buff *skb, struct crypto_alg *alg)
  {
7f0a9d5c9   Corentin Labbe   crypto: user - sp...
112
  	struct crypto_stat_kpp rkpp;
cac5818c2   Corentin Labbe   crypto: user - Im...
113

9f4debe38   Corentin Labbe   crypto: user - Ze...
114
  	memset(&rkpp, 0, sizeof(rkpp));
37db69e0b   Eric Biggers   crypto: user - cl...
115
  	strscpy(rkpp.type, "kpp", sizeof(rkpp.type));
cac5818c2   Corentin Labbe   crypto: user - Im...
116

17c18f9e3   Corentin Labbe   crypto: user - Sp...
117
118
119
  	rkpp.stat_setsecret_cnt = atomic64_read(&alg->stats.kpp.setsecret_cnt);
  	rkpp.stat_generate_public_key_cnt = atomic64_read(&alg->stats.kpp.generate_public_key_cnt);
  	rkpp.stat_compute_shared_secret_cnt = atomic64_read(&alg->stats.kpp.compute_shared_secret_cnt);
44f13133c   Corentin Labbe   crypto: user - re...
120
  	rkpp.stat_err_cnt = atomic64_read(&alg->stats.kpp.err_cnt);
cac5818c2   Corentin Labbe   crypto: user - Im...
121

37db69e0b   Eric Biggers   crypto: user - cl...
122
  	return nla_put(skb, CRYPTOCFGA_STAT_KPP, sizeof(rkpp), &rkpp);
cac5818c2   Corentin Labbe   crypto: user - Im...
123
124
125
126
  }
  
  static int crypto_report_ahash(struct sk_buff *skb, struct crypto_alg *alg)
  {
7f0a9d5c9   Corentin Labbe   crypto: user - sp...
127
  	struct crypto_stat_hash rhash;
cac5818c2   Corentin Labbe   crypto: user - Im...
128

9f4debe38   Corentin Labbe   crypto: user - Ze...
129
  	memset(&rhash, 0, sizeof(rhash));
37db69e0b   Eric Biggers   crypto: user - cl...
130
  	strscpy(rhash.type, "ahash", sizeof(rhash.type));
cac5818c2   Corentin Labbe   crypto: user - Im...
131

17c18f9e3   Corentin Labbe   crypto: user - Sp...
132
133
  	rhash.stat_hash_cnt = atomic64_read(&alg->stats.hash.hash_cnt);
  	rhash.stat_hash_tlen = atomic64_read(&alg->stats.hash.hash_tlen);
44f13133c   Corentin Labbe   crypto: user - re...
134
  	rhash.stat_err_cnt = atomic64_read(&alg->stats.hash.err_cnt);
cac5818c2   Corentin Labbe   crypto: user - Im...
135

37db69e0b   Eric Biggers   crypto: user - cl...
136
  	return nla_put(skb, CRYPTOCFGA_STAT_HASH, sizeof(rhash), &rhash);
cac5818c2   Corentin Labbe   crypto: user - Im...
137
138
139
140
  }
  
  static int crypto_report_shash(struct sk_buff *skb, struct crypto_alg *alg)
  {
7f0a9d5c9   Corentin Labbe   crypto: user - sp...
141
  	struct crypto_stat_hash rhash;
cac5818c2   Corentin Labbe   crypto: user - Im...
142

9f4debe38   Corentin Labbe   crypto: user - Ze...
143
  	memset(&rhash, 0, sizeof(rhash));
37db69e0b   Eric Biggers   crypto: user - cl...
144
  	strscpy(rhash.type, "shash", sizeof(rhash.type));
cac5818c2   Corentin Labbe   crypto: user - Im...
145

17c18f9e3   Corentin Labbe   crypto: user - Sp...
146
147
  	rhash.stat_hash_cnt =  atomic64_read(&alg->stats.hash.hash_cnt);
  	rhash.stat_hash_tlen = atomic64_read(&alg->stats.hash.hash_tlen);
44f13133c   Corentin Labbe   crypto: user - re...
148
  	rhash.stat_err_cnt = atomic64_read(&alg->stats.hash.err_cnt);
cac5818c2   Corentin Labbe   crypto: user - Im...
149

37db69e0b   Eric Biggers   crypto: user - cl...
150
  	return nla_put(skb, CRYPTOCFGA_STAT_HASH, sizeof(rhash), &rhash);
cac5818c2   Corentin Labbe   crypto: user - Im...
151
152
153
154
  }
  
  static int crypto_report_rng(struct sk_buff *skb, struct crypto_alg *alg)
  {
7f0a9d5c9   Corentin Labbe   crypto: user - sp...
155
  	struct crypto_stat_rng rrng;
cac5818c2   Corentin Labbe   crypto: user - Im...
156

9f4debe38   Corentin Labbe   crypto: user - Ze...
157
  	memset(&rrng, 0, sizeof(rrng));
37db69e0b   Eric Biggers   crypto: user - cl...
158
  	strscpy(rrng.type, "rng", sizeof(rrng.type));
cac5818c2   Corentin Labbe   crypto: user - Im...
159

17c18f9e3   Corentin Labbe   crypto: user - Sp...
160
161
162
  	rrng.stat_generate_cnt = atomic64_read(&alg->stats.rng.generate_cnt);
  	rrng.stat_generate_tlen = atomic64_read(&alg->stats.rng.generate_tlen);
  	rrng.stat_seed_cnt = atomic64_read(&alg->stats.rng.seed_cnt);
44f13133c   Corentin Labbe   crypto: user - re...
163
  	rrng.stat_err_cnt = atomic64_read(&alg->stats.rng.err_cnt);
cac5818c2   Corentin Labbe   crypto: user - Im...
164

37db69e0b   Eric Biggers   crypto: user - cl...
165
  	return nla_put(skb, CRYPTOCFGA_STAT_RNG, sizeof(rrng), &rrng);
cac5818c2   Corentin Labbe   crypto: user - Im...
166
167
168
169
170
171
  }
  
  static int crypto_reportstat_one(struct crypto_alg *alg,
  				 struct crypto_user_alg *ualg,
  				 struct sk_buff *skb)
  {
9f4debe38   Corentin Labbe   crypto: user - Ze...
172
  	memset(ualg, 0, sizeof(*ualg));
37db69e0b   Eric Biggers   crypto: user - cl...
173
174
  	strscpy(ualg->cru_name, alg->cra_name, sizeof(ualg->cru_name));
  	strscpy(ualg->cru_driver_name, alg->cra_driver_name,
cac5818c2   Corentin Labbe   crypto: user - Im...
175
  		sizeof(ualg->cru_driver_name));
37db69e0b   Eric Biggers   crypto: user - cl...
176
  	strscpy(ualg->cru_module_name, module_name(alg->cra_module),
cac5818c2   Corentin Labbe   crypto: user - Im...
177
178
179
180
181
182
183
184
185
186
  		sizeof(ualg->cru_module_name));
  
  	ualg->cru_type = 0;
  	ualg->cru_mask = 0;
  	ualg->cru_flags = alg->cra_flags;
  	ualg->cru_refcnt = refcount_read(&alg->cra_refcnt);
  
  	if (nla_put_u32(skb, CRYPTOCFGA_PRIORITY_VAL, alg->cra_priority))
  		goto nla_put_failure;
  	if (alg->cra_flags & CRYPTO_ALG_LARVAL) {
7f0a9d5c9   Corentin Labbe   crypto: user - sp...
187
  		struct crypto_stat_larval rl;
cac5818c2   Corentin Labbe   crypto: user - Im...
188

9f4debe38   Corentin Labbe   crypto: user - Ze...
189
  		memset(&rl, 0, sizeof(rl));
37db69e0b   Eric Biggers   crypto: user - cl...
190
191
  		strscpy(rl.type, "larval", sizeof(rl.type));
  		if (nla_put(skb, CRYPTOCFGA_STAT_LARVAL, sizeof(rl), &rl))
cac5818c2   Corentin Labbe   crypto: user - Im...
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
  			goto nla_put_failure;
  		goto out;
  	}
  
  	switch (alg->cra_flags & (CRYPTO_ALG_TYPE_MASK | CRYPTO_ALG_LARVAL)) {
  	case CRYPTO_ALG_TYPE_AEAD:
  		if (crypto_report_aead(skb, alg))
  			goto nla_put_failure;
  		break;
  	case CRYPTO_ALG_TYPE_SKCIPHER:
  		if (crypto_report_cipher(skb, alg))
  			goto nla_put_failure;
  		break;
  	case CRYPTO_ALG_TYPE_BLKCIPHER:
  		if (crypto_report_cipher(skb, alg))
  			goto nla_put_failure;
  		break;
  	case CRYPTO_ALG_TYPE_CIPHER:
  		if (crypto_report_cipher(skb, alg))
  			goto nla_put_failure;
  		break;
  	case CRYPTO_ALG_TYPE_COMPRESS:
  		if (crypto_report_comp(skb, alg))
  			goto nla_put_failure;
  		break;
  	case CRYPTO_ALG_TYPE_ACOMPRESS:
  		if (crypto_report_acomp(skb, alg))
  			goto nla_put_failure;
  		break;
  	case CRYPTO_ALG_TYPE_SCOMPRESS:
  		if (crypto_report_acomp(skb, alg))
  			goto nla_put_failure;
  		break;
  	case CRYPTO_ALG_TYPE_AKCIPHER:
  		if (crypto_report_akcipher(skb, alg))
  			goto nla_put_failure;
  		break;
  	case CRYPTO_ALG_TYPE_KPP:
  		if (crypto_report_kpp(skb, alg))
  			goto nla_put_failure;
  		break;
  	case CRYPTO_ALG_TYPE_AHASH:
  		if (crypto_report_ahash(skb, alg))
  			goto nla_put_failure;
  		break;
  	case CRYPTO_ALG_TYPE_HASH:
  		if (crypto_report_shash(skb, alg))
  			goto nla_put_failure;
  		break;
  	case CRYPTO_ALG_TYPE_RNG:
  		if (crypto_report_rng(skb, alg))
  			goto nla_put_failure;
  		break;
  	default:
  		pr_err("ERROR: Unhandled alg %d in %s
  ",
  		       alg->cra_flags & (CRYPTO_ALG_TYPE_MASK | CRYPTO_ALG_LARVAL),
  		       __func__);
  	}
  
  out:
  	return 0;
  
  nla_put_failure:
  	return -EMSGSIZE;
  }
  
  static int crypto_reportstat_alg(struct crypto_alg *alg,
  				 struct crypto_dump_info *info)
  {
  	struct sk_buff *in_skb = info->in_skb;
  	struct sk_buff *skb = info->out_skb;
  	struct nlmsghdr *nlh;
  	struct crypto_user_alg *ualg;
  	int err = 0;
  
  	nlh = nlmsg_put(skb, NETLINK_CB(in_skb).portid, info->nlmsg_seq,
  			CRYPTO_MSG_GETSTAT, sizeof(*ualg), info->nlmsg_flags);
  	if (!nlh) {
  		err = -EMSGSIZE;
  		goto out;
  	}
  
  	ualg = nlmsg_data(nlh);
  
  	err = crypto_reportstat_one(alg, ualg, skb);
  	if (err) {
  		nlmsg_cancel(skb, nlh);
  		goto out;
  	}
  
  	nlmsg_end(skb, nlh);
  
  out:
  	return err;
  }
  
  int crypto_reportstat(struct sk_buff *in_skb, struct nlmsghdr *in_nlh,
  		      struct nlattr **attrs)
  {
91b05a7e7   Ondrej Mosnacek   crypto: user - ma...
292
  	struct net *net = sock_net(in_skb->sk);
cac5818c2   Corentin Labbe   crypto: user - Im...
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
  	struct crypto_user_alg *p = nlmsg_data(in_nlh);
  	struct crypto_alg *alg;
  	struct sk_buff *skb;
  	struct crypto_dump_info info;
  	int err;
  
  	if (!null_terminated(p->cru_name) || !null_terminated(p->cru_driver_name))
  		return -EINVAL;
  
  	alg = crypto_alg_match(p, 0);
  	if (!alg)
  		return -ENOENT;
  
  	err = -ENOMEM;
  	skb = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
  	if (!skb)
  		goto drop_alg;
  
  	info.in_skb = in_skb;
  	info.out_skb = skb;
  	info.nlmsg_seq = in_nlh->nlmsg_seq;
  	info.nlmsg_flags = 0;
  
  	err = crypto_reportstat_alg(alg, &info);
  
  drop_alg:
  	crypto_mod_put(alg);
d8d63ea23   Navid Emamdoost   crypto: user - fi...
320
321
  	if (err) {
  		kfree_skb(skb);
cac5818c2   Corentin Labbe   crypto: user - Im...
322
  		return err;
d8d63ea23   Navid Emamdoost   crypto: user - fi...
323
  	}
cac5818c2   Corentin Labbe   crypto: user - Im...
324

91b05a7e7   Ondrej Mosnacek   crypto: user - ma...
325
  	return nlmsg_unicast(net->crypto_nlsk, skb, NETLINK_CB(in_skb).portid);
cac5818c2   Corentin Labbe   crypto: user - Im...
326
  }
cac5818c2   Corentin Labbe   crypto: user - Im...
327
  MODULE_LICENSE("GPL");