Blame view

crypto/akcipher.c 4.04 KB
2874c5fd2   Thomas Gleixner   treewide: Replace...
1
  // SPDX-License-Identifier: GPL-2.0-or-later
3c339ab83   Tadeusz Struk   crypto: akcipher ...
2
3
4
5
6
  /*
   * Public Key Encryption
   *
   * Copyright (c) 2015, Intel Corporation
   * Authors: Tadeusz Struk <tadeusz.struk@intel.com>
3c339ab83   Tadeusz Struk   crypto: akcipher ...
7
8
9
10
11
12
13
14
   */
  #include <linux/errno.h>
  #include <linux/kernel.h>
  #include <linux/module.h>
  #include <linux/seq_file.h>
  #include <linux/slab.h>
  #include <linux/string.h>
  #include <linux/crypto.h>
d8c34b949   Gideon Israel Dsouza   crypto: Replaced ...
15
  #include <linux/compiler.h>
3c339ab83   Tadeusz Struk   crypto: akcipher ...
16
17
18
19
  #include <crypto/algapi.h>
  #include <linux/cryptouser.h>
  #include <net/netlink.h>
  #include <crypto/akcipher.h>
28a4618ad   Andrzej Zaborowski   crypto: akcipher ...
20
  #include <crypto/internal/akcipher.h>
3c339ab83   Tadeusz Struk   crypto: akcipher ...
21
22
23
24
25
26
  #include "internal.h"
  
  #ifdef CONFIG_NET
  static int crypto_akcipher_report(struct sk_buff *skb, struct crypto_alg *alg)
  {
  	struct crypto_report_akcipher rakcipher;
37db69e0b   Eric Biggers   crypto: user - cl...
27
  	memset(&rakcipher, 0, sizeof(rakcipher));
3c339ab83   Tadeusz Struk   crypto: akcipher ...
28

37db69e0b   Eric Biggers   crypto: user - cl...
29
  	strscpy(rakcipher.type, "akcipher", sizeof(rakcipher.type));
3c339ab83   Tadeusz Struk   crypto: akcipher ...
30

37db69e0b   Eric Biggers   crypto: user - cl...
31
32
  	return nla_put(skb, CRYPTOCFGA_REPORT_AKCIPHER,
  		       sizeof(rakcipher), &rakcipher);
3c339ab83   Tadeusz Struk   crypto: akcipher ...
33
34
35
36
37
38
39
40
41
  }
  #else
  static int crypto_akcipher_report(struct sk_buff *skb, struct crypto_alg *alg)
  {
  	return -ENOSYS;
  }
  #endif
  
  static void crypto_akcipher_show(struct seq_file *m, struct crypto_alg *alg)
d8c34b949   Gideon Israel Dsouza   crypto: Replaced ...
42
  	__maybe_unused;
3c339ab83   Tadeusz Struk   crypto: akcipher ...
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
  
  static void crypto_akcipher_show(struct seq_file *m, struct crypto_alg *alg)
  {
  	seq_puts(m, "type         : akcipher
  ");
  }
  
  static void crypto_akcipher_exit_tfm(struct crypto_tfm *tfm)
  {
  	struct crypto_akcipher *akcipher = __crypto_akcipher_tfm(tfm);
  	struct akcipher_alg *alg = crypto_akcipher_alg(akcipher);
  
  	alg->exit(akcipher);
  }
  
  static int crypto_akcipher_init_tfm(struct crypto_tfm *tfm)
  {
  	struct crypto_akcipher *akcipher = __crypto_akcipher_tfm(tfm);
  	struct akcipher_alg *alg = crypto_akcipher_alg(akcipher);
  
  	if (alg->exit)
  		akcipher->base.exit = crypto_akcipher_exit_tfm;
  
  	if (alg->init)
  		return alg->init(akcipher);
  
  	return 0;
  }
28a4618ad   Andrzej Zaborowski   crypto: akcipher ...
71
72
73
74
75
76
  static void crypto_akcipher_free_instance(struct crypto_instance *inst)
  {
  	struct akcipher_instance *akcipher = akcipher_instance(inst);
  
  	akcipher->free(akcipher);
  }
3c339ab83   Tadeusz Struk   crypto: akcipher ...
77
78
79
  static const struct crypto_type crypto_akcipher_type = {
  	.extsize = crypto_alg_extsize,
  	.init_tfm = crypto_akcipher_init_tfm,
28a4618ad   Andrzej Zaborowski   crypto: akcipher ...
80
  	.free = crypto_akcipher_free_instance,
3c339ab83   Tadeusz Struk   crypto: akcipher ...
81
82
83
84
85
86
87
88
89
  #ifdef CONFIG_PROC_FS
  	.show = crypto_akcipher_show,
  #endif
  	.report = crypto_akcipher_report,
  	.maskclear = ~CRYPTO_ALG_TYPE_MASK,
  	.maskset = CRYPTO_ALG_TYPE_MASK,
  	.type = CRYPTO_ALG_TYPE_AKCIPHER,
  	.tfmsize = offsetof(struct crypto_akcipher, base),
  };
73bed26f7   Eric Biggers   crypto: akcipher ...
90
91
92
  int crypto_grab_akcipher(struct crypto_akcipher_spawn *spawn,
  			 struct crypto_instance *inst,
  			 const char *name, u32 type, u32 mask)
28a4618ad   Andrzej Zaborowski   crypto: akcipher ...
93
94
  {
  	spawn->base.frontend = &crypto_akcipher_type;
de95c9574   Eric Biggers   crypto: algapi - ...
95
  	return crypto_grab_spawn(&spawn->base, inst, name, type, mask);
28a4618ad   Andrzej Zaborowski   crypto: akcipher ...
96
97
  }
  EXPORT_SYMBOL_GPL(crypto_grab_akcipher);
3c339ab83   Tadeusz Struk   crypto: akcipher ...
98
99
100
101
102
103
  struct crypto_akcipher *crypto_alloc_akcipher(const char *alg_name, u32 type,
  					      u32 mask)
  {
  	return crypto_alloc_tfm(alg_name, &crypto_akcipher_type, type, mask);
  }
  EXPORT_SYMBOL_GPL(crypto_alloc_akcipher);
28a4618ad   Andrzej Zaborowski   crypto: akcipher ...
104
  static void akcipher_prepare_alg(struct akcipher_alg *alg)
3c339ab83   Tadeusz Struk   crypto: akcipher ...
105
106
107
108
109
110
  {
  	struct crypto_alg *base = &alg->base;
  
  	base->cra_type = &crypto_akcipher_type;
  	base->cra_flags &= ~CRYPTO_ALG_TYPE_MASK;
  	base->cra_flags |= CRYPTO_ALG_TYPE_AKCIPHER;
28a4618ad   Andrzej Zaborowski   crypto: akcipher ...
111
  }
78a0324f4   Vitaly Chikunov   crypto: akcipher ...
112
113
114
115
  static int akcipher_default_op(struct akcipher_request *req)
  {
  	return -ENOSYS;
  }
28a4618ad   Andrzej Zaborowski   crypto: akcipher ...
116
117
118
  int crypto_register_akcipher(struct akcipher_alg *alg)
  {
  	struct crypto_alg *base = &alg->base;
78a0324f4   Vitaly Chikunov   crypto: akcipher ...
119
120
121
122
123
124
125
126
  	if (!alg->sign)
  		alg->sign = akcipher_default_op;
  	if (!alg->verify)
  		alg->verify = akcipher_default_op;
  	if (!alg->encrypt)
  		alg->encrypt = akcipher_default_op;
  	if (!alg->decrypt)
  		alg->decrypt = akcipher_default_op;
28a4618ad   Andrzej Zaborowski   crypto: akcipher ...
127
  	akcipher_prepare_alg(alg);
3c339ab83   Tadeusz Struk   crypto: akcipher ...
128
129
130
131
132
133
134
135
136
  	return crypto_register_alg(base);
  }
  EXPORT_SYMBOL_GPL(crypto_register_akcipher);
  
  void crypto_unregister_akcipher(struct akcipher_alg *alg)
  {
  	crypto_unregister_alg(&alg->base);
  }
  EXPORT_SYMBOL_GPL(crypto_unregister_akcipher);
28a4618ad   Andrzej Zaborowski   crypto: akcipher ...
137
138
139
  int akcipher_register_instance(struct crypto_template *tmpl,
  			       struct akcipher_instance *inst)
  {
d4fdc2dfa   Eric Biggers   crypto: algapi - ...
140
141
  	if (WARN_ON(!inst->free))
  		return -EINVAL;
28a4618ad   Andrzej Zaborowski   crypto: akcipher ...
142
143
144
145
  	akcipher_prepare_alg(&inst->alg);
  	return crypto_register_instance(tmpl, akcipher_crypto_instance(inst));
  }
  EXPORT_SYMBOL_GPL(akcipher_register_instance);
3c339ab83   Tadeusz Struk   crypto: akcipher ...
146
  MODULE_LICENSE("GPL");
338a9de03   Tadeusz Struk   crypto: akcipher ...
147
  MODULE_DESCRIPTION("Generic public key cipher type");