Blame view

crypto/akcipher.c 3.89 KB
3c339ab83   Tadeusz Struk   crypto: akcipher ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  /*
   * Public Key Encryption
   *
   * Copyright (c) 2015, Intel Corporation
   * Authors: Tadeusz Struk <tadeusz.struk@intel.com>
   *
   * This program is free software; you can redistribute it and/or modify it
   * under the terms of the GNU General Public License as published by the Free
   * Software Foundation; either version 2 of the License, or (at your option)
   * any later version.
   *
   */
  #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>
  #include <crypto/algapi.h>
  #include <linux/cryptouser.h>
  #include <net/netlink.h>
  #include <crypto/akcipher.h>
28a4618ad   Andrzej Zaborowski   crypto: akcipher ...
24
  #include <crypto/internal/akcipher.h>
3c339ab83   Tadeusz Struk   crypto: akcipher ...
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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
71
72
73
74
75
76
77
78
  #include "internal.h"
  
  #ifdef CONFIG_NET
  static int crypto_akcipher_report(struct sk_buff *skb, struct crypto_alg *alg)
  {
  	struct crypto_report_akcipher rakcipher;
  
  	strncpy(rakcipher.type, "akcipher", sizeof(rakcipher.type));
  
  	if (nla_put(skb, CRYPTOCFGA_REPORT_AKCIPHER,
  		    sizeof(struct crypto_report_akcipher), &rakcipher))
  		goto nla_put_failure;
  	return 0;
  
  nla_put_failure:
  	return -EMSGSIZE;
  }
  #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)
  	__attribute__ ((unused));
  
  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 ...
79
80
81
82
83
84
  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 ...
85
86
87
  static const struct crypto_type crypto_akcipher_type = {
  	.extsize = crypto_alg_extsize,
  	.init_tfm = crypto_akcipher_init_tfm,
28a4618ad   Andrzej Zaborowski   crypto: akcipher ...
88
  	.free = crypto_akcipher_free_instance,
3c339ab83   Tadeusz Struk   crypto: akcipher ...
89
90
91
92
93
94
95
96
97
  #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),
  };
28a4618ad   Andrzej Zaborowski   crypto: akcipher ...
98
99
100
101
102
103
104
  int crypto_grab_akcipher(struct crypto_akcipher_spawn *spawn, const char *name,
  			 u32 type, u32 mask)
  {
  	spawn->base.frontend = &crypto_akcipher_type;
  	return crypto_grab_spawn(&spawn->base, name, type, mask);
  }
  EXPORT_SYMBOL_GPL(crypto_grab_akcipher);
3c339ab83   Tadeusz Struk   crypto: akcipher ...
105
106
107
108
109
110
  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 ...
111
  static void akcipher_prepare_alg(struct akcipher_alg *alg)
3c339ab83   Tadeusz Struk   crypto: akcipher ...
112
113
114
115
116
117
  {
  	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 ...
118
119
120
121
122
123
124
  }
  
  int crypto_register_akcipher(struct akcipher_alg *alg)
  {
  	struct crypto_alg *base = &alg->base;
  
  	akcipher_prepare_alg(alg);
3c339ab83   Tadeusz Struk   crypto: akcipher ...
125
126
127
128
129
130
131
132
133
  	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 ...
134
135
136
137
138
139
140
  int akcipher_register_instance(struct crypto_template *tmpl,
  			       struct akcipher_instance *inst)
  {
  	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 ...
141
  MODULE_LICENSE("GPL");
338a9de03   Tadeusz Struk   crypto: akcipher ...
142
  MODULE_DESCRIPTION("Generic public key cipher type");