~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/crypto/algif_rng.c

Version: ~ [ linux-6.11-rc3 ] ~ [ linux-6.10.4 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.45 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.104 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.164 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.223 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.281 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.319 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /crypto/algif_rng.c (Architecture i386) and /crypto/algif_rng.c (Architecture sparc)


  1 /*                                                  1 /*
  2  * algif_rng: User-space interface for random       2  * algif_rng: User-space interface for random number generators
  3  *                                                  3  *
  4  * This file provides the user-space API for r      4  * This file provides the user-space API for random number generators.
  5  *                                                  5  *
  6  * Copyright (C) 2014, Stephan Mueller <smuell      6  * Copyright (C) 2014, Stephan Mueller <smueller@chronox.de>
  7  *                                                  7  *
  8  * Redistribution and use in source and binary      8  * Redistribution and use in source and binary forms, with or without
  9  * modification, are permitted provided that t      9  * modification, are permitted provided that the following conditions
 10  * are met:                                        10  * are met:
 11  * 1. Redistributions of source code must reta     11  * 1. Redistributions of source code must retain the above copyright
 12  *    notice, and the entire permission notice     12  *    notice, and the entire permission notice in its entirety,
 13  *    including the disclaimer of warranties.      13  *    including the disclaimer of warranties.
 14  * 2. Redistributions in binary form must repr     14  * 2. Redistributions in binary form must reproduce the above copyright
 15  *    notice, this list of conditions and the      15  *    notice, this list of conditions and the following disclaimer in the
 16  *    documentation and/or other materials pro     16  *    documentation and/or other materials provided with the distribution.
 17  * 3. The name of the author may not be used t     17  * 3. The name of the author may not be used to endorse or promote
 18  *    products derived from this software with     18  *    products derived from this software without specific prior
 19  *    written permission.                          19  *    written permission.
 20  *                                                 20  *
 21  * ALTERNATIVELY, this product may be distribu     21  * ALTERNATIVELY, this product may be distributed under the terms of
 22  * the GNU General Public License, in which ca     22  * the GNU General Public License, in which case the provisions of the GPL2
 23  * are required INSTEAD OF the above restricti     23  * are required INSTEAD OF the above restrictions.  (This clause is
 24  * necessary due to a potential bad interactio     24  * necessary due to a potential bad interaction between the GPL and
 25  * the restrictions contained in a BSD-style c     25  * the restrictions contained in a BSD-style copyright.)
 26  *                                                 26  *
 27  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY     27  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
 28  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO,      28  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 29  * OF MERCHANTABILITY AND FITNESS FOR A PARTIC     29  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
 30  * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT S     30  * WHICH ARE HEREBY DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE
 31  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL     31  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 32  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT L     32  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
 33  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF US     33  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
 34  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND O     34  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 35  * LIABILITY, WHETHER IN CONTRACT, STRICT LIAB     35  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 36  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING     36  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
 37  * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED O     37  * USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
 38  * DAMAGE.                                         38  * DAMAGE.
 39  */                                                39  */
 40                                                    40 
 41 #include <linux/capability.h>                      41 #include <linux/capability.h>
 42 #include <linux/module.h>                          42 #include <linux/module.h>
 43 #include <crypto/rng.h>                            43 #include <crypto/rng.h>
 44 #include <linux/random.h>                          44 #include <linux/random.h>
 45 #include <crypto/if_alg.h>                         45 #include <crypto/if_alg.h>
 46 #include <linux/net.h>                             46 #include <linux/net.h>
 47 #include <net/sock.h>                              47 #include <net/sock.h>
 48                                                    48 
 49 MODULE_LICENSE("GPL");                             49 MODULE_LICENSE("GPL");
 50 MODULE_AUTHOR("Stephan Mueller <smueller@chron     50 MODULE_AUTHOR("Stephan Mueller <smueller@chronox.de>");
 51 MODULE_DESCRIPTION("User-space interface for r     51 MODULE_DESCRIPTION("User-space interface for random number generators");
 52                                                    52 
 53 struct rng_ctx {                                   53 struct rng_ctx {
 54 #define MAXSIZE 128                                54 #define MAXSIZE 128
 55         unsigned int len;                          55         unsigned int len;
 56         struct crypto_rng *drng;                   56         struct crypto_rng *drng;
 57         u8 *addtl;                                 57         u8 *addtl;
 58         size_t addtl_len;                          58         size_t addtl_len;
 59 };                                                 59 };
 60                                                    60 
 61 struct rng_parent_ctx {                            61 struct rng_parent_ctx {
 62         struct crypto_rng *drng;                   62         struct crypto_rng *drng;
 63         u8 *entropy;                               63         u8 *entropy;
 64 };                                                 64 };
 65                                                    65 
 66 static void rng_reset_addtl(struct rng_ctx *ct     66 static void rng_reset_addtl(struct rng_ctx *ctx)
 67 {                                                  67 {
 68         kfree_sensitive(ctx->addtl);               68         kfree_sensitive(ctx->addtl);
 69         ctx->addtl = NULL;                         69         ctx->addtl = NULL;
 70         ctx->addtl_len = 0;                        70         ctx->addtl_len = 0;
 71 }                                                  71 }
 72                                                    72 
 73 static int _rng_recvmsg(struct crypto_rng *drn     73 static int _rng_recvmsg(struct crypto_rng *drng, struct msghdr *msg, size_t len,
 74                         u8 *addtl, size_t addt     74                         u8 *addtl, size_t addtl_len)
 75 {                                                  75 {
 76         int err = 0;                               76         int err = 0;
 77         int genlen = 0;                            77         int genlen = 0;
 78         u8 result[MAXSIZE];                        78         u8 result[MAXSIZE];
 79                                                    79 
 80         if (len == 0)                              80         if (len == 0)
 81                 return 0;                          81                 return 0;
 82         if (len > MAXSIZE)                         82         if (len > MAXSIZE)
 83                 len = MAXSIZE;                     83                 len = MAXSIZE;
 84                                                    84 
 85         /*                                         85         /*
 86          * although not strictly needed, this      86          * although not strictly needed, this is a precaution against coding
 87          * errors                                  87          * errors
 88          */                                        88          */
 89         memset(result, 0, len);                    89         memset(result, 0, len);
 90                                                    90 
 91         /*                                         91         /*
 92          * The enforcement of a proper seeding     92          * The enforcement of a proper seeding of an RNG is done within an
 93          * RNG implementation. Some RNGs (DRBG     93          * RNG implementation. Some RNGs (DRBG, krng) do not need specific
 94          * seeding as they automatically seed.     94          * seeding as they automatically seed. The X9.31 DRNG will return
 95          * an error if it was not seeded prope     95          * an error if it was not seeded properly.
 96          */                                        96          */
 97         genlen = crypto_rng_generate(drng, add     97         genlen = crypto_rng_generate(drng, addtl, addtl_len, result, len);
 98         if (genlen < 0)                            98         if (genlen < 0)
 99                 return genlen;                     99                 return genlen;
100                                                   100 
101         err = memcpy_to_msg(msg, result, len);    101         err = memcpy_to_msg(msg, result, len);
102         memzero_explicit(result, len);            102         memzero_explicit(result, len);
103                                                   103 
104         return err ? err : len;                   104         return err ? err : len;
105 }                                                 105 }
106                                                   106 
107 static int rng_recvmsg(struct socket *sock, st    107 static int rng_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
108                        int flags)                 108                        int flags)
109 {                                                 109 {
110         struct sock *sk = sock->sk;               110         struct sock *sk = sock->sk;
111         struct alg_sock *ask = alg_sk(sk);        111         struct alg_sock *ask = alg_sk(sk);
112         struct rng_ctx *ctx = ask->private;       112         struct rng_ctx *ctx = ask->private;
113                                                   113 
114         return _rng_recvmsg(ctx->drng, msg, le    114         return _rng_recvmsg(ctx->drng, msg, len, NULL, 0);
115 }                                                 115 }
116                                                   116 
117 static int rng_test_recvmsg(struct socket *soc    117 static int rng_test_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
118                             int flags)            118                             int flags)
119 {                                                 119 {
120         struct sock *sk = sock->sk;               120         struct sock *sk = sock->sk;
121         struct alg_sock *ask = alg_sk(sk);        121         struct alg_sock *ask = alg_sk(sk);
122         struct rng_ctx *ctx = ask->private;       122         struct rng_ctx *ctx = ask->private;
123         int ret;                                  123         int ret;
124                                                   124 
125         lock_sock(sock->sk);                      125         lock_sock(sock->sk);
126         ret = _rng_recvmsg(ctx->drng, msg, len    126         ret = _rng_recvmsg(ctx->drng, msg, len, ctx->addtl, ctx->addtl_len);
127         rng_reset_addtl(ctx);                     127         rng_reset_addtl(ctx);
128         release_sock(sock->sk);                   128         release_sock(sock->sk);
129                                                   129 
130         return ret;                               130         return ret;
131 }                                                 131 }
132                                                   132 
133 static int rng_test_sendmsg(struct socket *soc    133 static int rng_test_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
134 {                                                 134 {
135         int err;                                  135         int err;
136         struct alg_sock *ask = alg_sk(sock->sk    136         struct alg_sock *ask = alg_sk(sock->sk);
137         struct rng_ctx *ctx = ask->private;       137         struct rng_ctx *ctx = ask->private;
138                                                   138 
139         lock_sock(sock->sk);                      139         lock_sock(sock->sk);
140         if (len > MAXSIZE) {                      140         if (len > MAXSIZE) {
141                 err = -EMSGSIZE;                  141                 err = -EMSGSIZE;
142                 goto unlock;                      142                 goto unlock;
143         }                                         143         }
144                                                   144 
145         rng_reset_addtl(ctx);                     145         rng_reset_addtl(ctx);
146         ctx->addtl = kmalloc(len, GFP_KERNEL);    146         ctx->addtl = kmalloc(len, GFP_KERNEL);
147         if (!ctx->addtl) {                        147         if (!ctx->addtl) {
148                 err = -ENOMEM;                    148                 err = -ENOMEM;
149                 goto unlock;                      149                 goto unlock;
150         }                                         150         }
151                                                   151 
152         err = memcpy_from_msg(ctx->addtl, msg,    152         err = memcpy_from_msg(ctx->addtl, msg, len);
153         if (err) {                                153         if (err) {
154                 rng_reset_addtl(ctx);             154                 rng_reset_addtl(ctx);
155                 goto unlock;                      155                 goto unlock;
156         }                                         156         }
157         ctx->addtl_len = len;                     157         ctx->addtl_len = len;
158                                                   158 
159 unlock:                                           159 unlock:
160         release_sock(sock->sk);                   160         release_sock(sock->sk);
161         return err ? err : len;                   161         return err ? err : len;
162 }                                                 162 }
163                                                   163 
164 static struct proto_ops algif_rng_ops = {         164 static struct proto_ops algif_rng_ops = {
165         .family         =       PF_ALG,           165         .family         =       PF_ALG,
166                                                   166 
167         .connect        =       sock_no_connec    167         .connect        =       sock_no_connect,
168         .socketpair     =       sock_no_socket    168         .socketpair     =       sock_no_socketpair,
169         .getname        =       sock_no_getnam    169         .getname        =       sock_no_getname,
170         .ioctl          =       sock_no_ioctl,    170         .ioctl          =       sock_no_ioctl,
171         .listen         =       sock_no_listen    171         .listen         =       sock_no_listen,
172         .shutdown       =       sock_no_shutdo    172         .shutdown       =       sock_no_shutdown,
173         .mmap           =       sock_no_mmap,     173         .mmap           =       sock_no_mmap,
174         .bind           =       sock_no_bind,     174         .bind           =       sock_no_bind,
175         .accept         =       sock_no_accept    175         .accept         =       sock_no_accept,
176         .sendmsg        =       sock_no_sendms    176         .sendmsg        =       sock_no_sendmsg,
177                                                   177 
178         .release        =       af_alg_release    178         .release        =       af_alg_release,
179         .recvmsg        =       rng_recvmsg,      179         .recvmsg        =       rng_recvmsg,
180 };                                                180 };
181                                                   181 
182 static struct proto_ops __maybe_unused algif_r    182 static struct proto_ops __maybe_unused algif_rng_test_ops = {
183         .family         =       PF_ALG,           183         .family         =       PF_ALG,
184                                                   184 
185         .connect        =       sock_no_connec    185         .connect        =       sock_no_connect,
186         .socketpair     =       sock_no_socket    186         .socketpair     =       sock_no_socketpair,
187         .getname        =       sock_no_getnam    187         .getname        =       sock_no_getname,
188         .ioctl          =       sock_no_ioctl,    188         .ioctl          =       sock_no_ioctl,
189         .listen         =       sock_no_listen    189         .listen         =       sock_no_listen,
190         .shutdown       =       sock_no_shutdo    190         .shutdown       =       sock_no_shutdown,
191         .mmap           =       sock_no_mmap,     191         .mmap           =       sock_no_mmap,
192         .bind           =       sock_no_bind,     192         .bind           =       sock_no_bind,
193         .accept         =       sock_no_accept    193         .accept         =       sock_no_accept,
194                                                   194 
195         .release        =       af_alg_release    195         .release        =       af_alg_release,
196         .recvmsg        =       rng_test_recvm    196         .recvmsg        =       rng_test_recvmsg,
197         .sendmsg        =       rng_test_sendm    197         .sendmsg        =       rng_test_sendmsg,
198 };                                                198 };
199                                                   199 
200 static void *rng_bind(const char *name, u32 ty    200 static void *rng_bind(const char *name, u32 type, u32 mask)
201 {                                                 201 {
202         struct rng_parent_ctx *pctx;              202         struct rng_parent_ctx *pctx;
203         struct crypto_rng *rng;                   203         struct crypto_rng *rng;
204                                                   204 
205         pctx = kzalloc(sizeof(*pctx), GFP_KERN    205         pctx = kzalloc(sizeof(*pctx), GFP_KERNEL);
206         if (!pctx)                                206         if (!pctx)
207                 return ERR_PTR(-ENOMEM);          207                 return ERR_PTR(-ENOMEM);
208                                                   208 
209         rng = crypto_alloc_rng(name, type, mas    209         rng = crypto_alloc_rng(name, type, mask);
210         if (IS_ERR(rng)) {                        210         if (IS_ERR(rng)) {
211                 kfree(pctx);                      211                 kfree(pctx);
212                 return ERR_CAST(rng);             212                 return ERR_CAST(rng);
213         }                                         213         }
214                                                   214 
215         pctx->drng = rng;                         215         pctx->drng = rng;
216         return pctx;                              216         return pctx;
217 }                                                 217 }
218                                                   218 
219 static void rng_release(void *private)            219 static void rng_release(void *private)
220 {                                                 220 {
221         struct rng_parent_ctx *pctx = private;    221         struct rng_parent_ctx *pctx = private;
222                                                   222 
223         if (unlikely(!pctx))                      223         if (unlikely(!pctx))
224                 return;                           224                 return;
225         crypto_free_rng(pctx->drng);              225         crypto_free_rng(pctx->drng);
226         kfree_sensitive(pctx->entropy);           226         kfree_sensitive(pctx->entropy);
227         kfree_sensitive(pctx);                    227         kfree_sensitive(pctx);
228 }                                                 228 }
229                                                   229 
230 static void rng_sock_destruct(struct sock *sk)    230 static void rng_sock_destruct(struct sock *sk)
231 {                                                 231 {
232         struct alg_sock *ask = alg_sk(sk);        232         struct alg_sock *ask = alg_sk(sk);
233         struct rng_ctx *ctx = ask->private;       233         struct rng_ctx *ctx = ask->private;
234                                                   234 
235         rng_reset_addtl(ctx);                     235         rng_reset_addtl(ctx);
236         sock_kfree_s(sk, ctx, ctx->len);          236         sock_kfree_s(sk, ctx, ctx->len);
237         af_alg_release_parent(sk);                237         af_alg_release_parent(sk);
238 }                                                 238 }
239                                                   239 
240 static int rng_accept_parent(void *private, st    240 static int rng_accept_parent(void *private, struct sock *sk)
241 {                                                 241 {
242         struct rng_ctx *ctx;                      242         struct rng_ctx *ctx;
243         struct rng_parent_ctx *pctx = private;    243         struct rng_parent_ctx *pctx = private;
244         struct alg_sock *ask = alg_sk(sk);        244         struct alg_sock *ask = alg_sk(sk);
245         unsigned int len = sizeof(*ctx);          245         unsigned int len = sizeof(*ctx);
246                                                   246 
247         ctx = sock_kmalloc(sk, len, GFP_KERNEL    247         ctx = sock_kmalloc(sk, len, GFP_KERNEL);
248         if (!ctx)                                 248         if (!ctx)
249                 return -ENOMEM;                   249                 return -ENOMEM;
250                                                   250 
251         ctx->len = len;                           251         ctx->len = len;
252         ctx->addtl = NULL;                        252         ctx->addtl = NULL;
253         ctx->addtl_len = 0;                       253         ctx->addtl_len = 0;
254                                                   254 
255         /*                                        255         /*
256          * No seeding done at that point -- if    256          * No seeding done at that point -- if multiple accepts are
257          * done on one RNG instance, each resu    257          * done on one RNG instance, each resulting FD points to the same
258          * state of the RNG.                      258          * state of the RNG.
259          */                                       259          */
260                                                   260 
261         ctx->drng = pctx->drng;                   261         ctx->drng = pctx->drng;
262         ask->private = ctx;                       262         ask->private = ctx;
263         sk->sk_destruct = rng_sock_destruct;      263         sk->sk_destruct = rng_sock_destruct;
264                                                   264 
265         /*                                        265         /*
266          * Non NULL pctx->entropy means that C    266          * Non NULL pctx->entropy means that CAVP test has been initiated on
267          * this socket, replace proto_ops algi    267          * this socket, replace proto_ops algif_rng_ops with algif_rng_test_ops.
268          */                                       268          */
269         if (IS_ENABLED(CONFIG_CRYPTO_USER_API_    269         if (IS_ENABLED(CONFIG_CRYPTO_USER_API_RNG_CAVP) && pctx->entropy)
270                 sk->sk_socket->ops = &algif_rn    270                 sk->sk_socket->ops = &algif_rng_test_ops;
271                                                   271 
272         return 0;                                 272         return 0;
273 }                                                 273 }
274                                                   274 
275 static int rng_setkey(void *private, const u8     275 static int rng_setkey(void *private, const u8 *seed, unsigned int seedlen)
276 {                                                 276 {
277         struct rng_parent_ctx *pctx = private;    277         struct rng_parent_ctx *pctx = private;
278         /*                                        278         /*
279          * Check whether seedlen is of suffici    279          * Check whether seedlen is of sufficient size is done in RNG
280          * implementations.                       280          * implementations.
281          */                                       281          */
282         return crypto_rng_reset(pctx->drng, se    282         return crypto_rng_reset(pctx->drng, seed, seedlen);
283 }                                                 283 }
284                                                   284 
285 static int __maybe_unused rng_setentropy(void     285 static int __maybe_unused rng_setentropy(void *private, sockptr_t entropy,
286                                          unsig    286                                          unsigned int len)
287 {                                                 287 {
288         struct rng_parent_ctx *pctx = private;    288         struct rng_parent_ctx *pctx = private;
289         u8 *kentropy = NULL;                      289         u8 *kentropy = NULL;
290                                                   290 
291         if (!capable(CAP_SYS_ADMIN))              291         if (!capable(CAP_SYS_ADMIN))
292                 return -EACCES;                   292                 return -EACCES;
293                                                   293 
294         if (pctx->entropy)                        294         if (pctx->entropy)
295                 return -EINVAL;                   295                 return -EINVAL;
296                                                   296 
297         if (len > MAXSIZE)                        297         if (len > MAXSIZE)
298                 return -EMSGSIZE;                 298                 return -EMSGSIZE;
299                                                   299 
300         if (len) {                                300         if (len) {
301                 kentropy = memdup_sockptr(entr    301                 kentropy = memdup_sockptr(entropy, len);
302                 if (IS_ERR(kentropy))             302                 if (IS_ERR(kentropy))
303                         return PTR_ERR(kentrop    303                         return PTR_ERR(kentropy);
304         }                                         304         }
305                                                   305 
306         crypto_rng_alg(pctx->drng)->set_ent(pc    306         crypto_rng_alg(pctx->drng)->set_ent(pctx->drng, kentropy, len);
307         /*                                        307         /*
308          * Since rng doesn't perform any memor    308          * Since rng doesn't perform any memory management for the entropy
309          * buffer, save kentropy pointer to pc    309          * buffer, save kentropy pointer to pctx now to free it after use.
310          */                                       310          */
311         pctx->entropy = kentropy;                 311         pctx->entropy = kentropy;
312         return 0;                                 312         return 0;
313 }                                                 313 }
314                                                   314 
315 static const struct af_alg_type algif_type_rng    315 static const struct af_alg_type algif_type_rng = {
316         .bind           =       rng_bind,         316         .bind           =       rng_bind,
317         .release        =       rng_release,      317         .release        =       rng_release,
318         .accept         =       rng_accept_par    318         .accept         =       rng_accept_parent,
319         .setkey         =       rng_setkey,       319         .setkey         =       rng_setkey,
320 #ifdef CONFIG_CRYPTO_USER_API_RNG_CAVP            320 #ifdef CONFIG_CRYPTO_USER_API_RNG_CAVP
321         .setentropy     =       rng_setentropy    321         .setentropy     =       rng_setentropy,
322 #endif                                            322 #endif
323         .ops            =       &algif_rng_ops    323         .ops            =       &algif_rng_ops,
324         .name           =       "rng",            324         .name           =       "rng",
325         .owner          =       THIS_MODULE       325         .owner          =       THIS_MODULE
326 };                                                326 };
327                                                   327 
328 static int __init rng_init(void)                  328 static int __init rng_init(void)
329 {                                                 329 {
330         return af_alg_register_type(&algif_typ    330         return af_alg_register_type(&algif_type_rng);
331 }                                                 331 }
332                                                   332 
333 static void __exit rng_exit(void)                 333 static void __exit rng_exit(void)
334 {                                                 334 {
335         int err = af_alg_unregister_type(&algi    335         int err = af_alg_unregister_type(&algif_type_rng);
336         BUG_ON(err);                              336         BUG_ON(err);
337 }                                                 337 }
338                                                   338 
339 module_init(rng_init);                            339 module_init(rng_init);
340 module_exit(rng_exit);                            340 module_exit(rng_exit);
341                                                   341 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php