linux/crypto/ablkcipher.c
<<
>>
Prefs
   1/*
   2 * Asynchronous block chaining cipher operations.
   3 *
   4 * This is the asynchronous version of blkcipher.c indicating completion
   5 * via a callback.
   6 *
   7 * Copyright (c) 2006 Herbert Xu <herbert@gondor.apana.org.au>
   8 *
   9 * This program is free software; you can redistribute it and/or modify it
  10 * under the terms of the GNU General Public License as published by the Free
  11 * Software Foundation; either version 2 of the License, or (at your option)
  12 * any later version.
  13 *
  14 */
  15
  16#include <crypto/internal/skcipher.h>
  17#include <linux/cpumask.h>
  18#include <linux/err.h>
  19#include <linux/init.h>
  20#include <linux/kernel.h>
  21#include <linux/module.h>
  22#include <linux/rtnetlink.h>
  23#include <linux/sched.h>
  24#include <linux/slab.h>
  25#include <linux/seq_file.h>
  26
  27#include <crypto/scatterwalk.h>
  28
  29#include "internal.h"
  30
  31static const char *skcipher_default_geniv __read_mostly;
  32
  33struct ablkcipher_buffer {
  34        struct list_head        entry;
  35        struct scatter_walk     dst;
  36        unsigned int            len;
  37        void                    *data;
  38};
  39
  40enum {
  41        ABLKCIPHER_WALK_SLOW = 1 << 0,
  42};
  43
  44static inline void ablkcipher_buffer_write(struct ablkcipher_buffer *p)
  45{
  46        scatterwalk_copychunks(p->data, &p->dst, p->len, 1);
  47}
  48
  49void __ablkcipher_walk_complete(struct ablkcipher_walk *walk)
  50{
  51        struct ablkcipher_buffer *p, *tmp;
  52
  53        list_for_each_entry_safe(p, tmp, &walk->buffers, entry) {
  54                ablkcipher_buffer_write(p);
  55                list_del(&p->entry);
  56                kfree(p);
  57        }
  58}
  59EXPORT_SYMBOL_GPL(__ablkcipher_walk_complete);
  60
  61static inline void ablkcipher_queue_write(struct ablkcipher_walk *walk,
  62                                          struct ablkcipher_buffer *p)
  63{
  64        p->dst = walk->out;
  65        list_add_tail(&p->entry, &walk->buffers);
  66}
  67
  68/* Get a spot of the specified length that does not straddle a page.
  69 * The caller needs to ensure that there is enough space for this operation.
  70 */
  71static inline u8 *ablkcipher_get_spot(u8 *start, unsigned int len)
  72{
  73        u8 *end_page = (u8 *)(((unsigned long)(start + len - 1)) & PAGE_MASK);
  74        return max(start, end_page);
  75}
  76
  77static inline unsigned int ablkcipher_done_slow(struct ablkcipher_walk *walk,
  78                                                unsigned int bsize)
  79{
  80        unsigned int n = bsize;
  81
  82        for (;;) {
  83                unsigned int len_this_page = scatterwalk_pagelen(&walk->out);
  84
  85                if (len_this_page > n)
  86                        len_this_page = n;
  87                scatterwalk_advance(&walk->out, n);
  88                if (n == len_this_page)
  89                        break;
  90                n -= len_this_page;
  91                scatterwalk_start(&walk->out, scatterwalk_sg_next(walk->out.sg));
  92        }
  93
  94        return bsize;
  95}
  96
  97static inline unsigned int ablkcipher_done_fast(struct ablkcipher_walk *walk,
  98                                                unsigned int n)
  99{
 100        scatterwalk_advance(&walk->in, n);
 101        scatterwalk_advance(&walk->out, n);
 102
 103        return n;
 104}
 105
 106static int ablkcipher_walk_next(struct ablkcipher_request *req,
 107                                struct ablkcipher_walk *walk);
 108
 109int ablkcipher_walk_done(struct ablkcipher_request *req,
 110                         struct ablkcipher_walk *walk, int err)
 111{
 112        struct crypto_tfm *tfm = req->base.tfm;
 113        unsigned int nbytes = 0;
 114
 115        if (likely(err >= 0)) {
 116                unsigned int n = walk->nbytes - err;
 117
 118                if (likely(!(walk->flags & ABLKCIPHER_WALK_SLOW)))
 119                        n = ablkcipher_done_fast(walk, n);
 120                else if (WARN_ON(err)) {
 121                        err = -EINVAL;
 122                        goto err;
 123                } else
 124                        n = ablkcipher_done_slow(walk, n);
 125
 126                nbytes = walk->total - n;
 127                err = 0;
 128        }
 129
 130        scatterwalk_done(&walk->in, 0, nbytes);
 131        scatterwalk_done(&walk->out, 1, nbytes);
 132
 133err:
 134        walk->total = nbytes;
 135        walk->nbytes = nbytes;
 136
 137        if (nbytes) {
 138                crypto_yield(req->base.flags);
 139                return ablkcipher_walk_next(req, walk);
 140        }
 141
 142        if (walk->iv != req->info)
 143                memcpy(req->info, walk->iv, tfm->crt_ablkcipher.ivsize);
 144        kfree(walk->iv_buffer);
 145
 146        return err;
 147}
 148EXPORT_SYMBOL_GPL(ablkcipher_walk_done);
 149
 150static inline int ablkcipher_next_slow(struct ablkcipher_request *req,
 151                                       struct ablkcipher_walk *walk,
 152                                       unsigned int bsize,
 153                                       unsigned int alignmask,
 154                                       void **src_p, void **dst_p)
 155{
 156        unsigned aligned_bsize = ALIGN(bsize, alignmask + 1);
 157        struct ablkcipher_buffer *p;
 158        void *src, *dst, *base;
 159        unsigned int n;
 160
 161        n = ALIGN(sizeof(struct ablkcipher_buffer), alignmask + 1);
 162        n += (aligned_bsize * 3 - (alignmask + 1) +
 163              (alignmask & ~(crypto_tfm_ctx_alignment() - 1)));
 164
 165        p = kmalloc(n, GFP_ATOMIC);
 166        if (!p)
 167                return ablkcipher_walk_done(req, walk, -ENOMEM);
 168
 169        base = p + 1;
 170
 171        dst = (u8 *)ALIGN((unsigned long)base, alignmask + 1);
 172        src = dst = ablkcipher_get_spot(dst, bsize);
 173
 174        p->len = bsize;
 175        p->data = dst;
 176
 177        scatterwalk_copychunks(src, &walk->in, bsize, 0);
 178
 179        ablkcipher_queue_write(walk, p);
 180
 181        walk->nbytes = bsize;
 182        walk->flags |= ABLKCIPHER_WALK_SLOW;
 183
 184        *src_p = src;
 185        *dst_p = dst;
 186
 187        return 0;
 188}
 189
 190static inline int ablkcipher_copy_iv(struct ablkcipher_walk *walk,
 191                                     struct crypto_tfm *tfm,
 192                                     unsigned int alignmask)
 193{
 194        unsigned bs = walk->blocksize;
 195        unsigned int ivsize = tfm->crt_ablkcipher.ivsize;
 196        unsigned aligned_bs = ALIGN(bs, alignmask + 1);
 197        unsigned int size = aligned_bs * 2 + ivsize + max(aligned_bs, ivsize) -
 198                            (alignmask + 1);
 199        u8 *iv;
 200
 201        size += alignmask & ~(crypto_tfm_ctx_alignment() - 1);
 202        walk->iv_buffer = kmalloc(size, GFP_ATOMIC);
 203        if (!walk->iv_buffer)
 204                return -ENOMEM;
 205
 206        iv = (u8 *)ALIGN((unsigned long)walk->iv_buffer, alignmask + 1);
 207        iv = ablkcipher_get_spot(iv, bs) + aligned_bs;
 208        iv = ablkcipher_get_spot(iv, bs) + aligned_bs;
 209        iv = ablkcipher_get_spot(iv, ivsize);
 210
 211        walk->iv = memcpy(iv, walk->iv, ivsize);
 212        return 0;
 213}
 214
 215static inline int ablkcipher_next_fast(struct ablkcipher_request *req,
 216                                       struct ablkcipher_walk *walk)
 217{
 218        walk->src.page = scatterwalk_page(&walk->in);
 219        walk->src.offset = offset_in_page(walk->in.offset);
 220        walk->dst.page = scatterwalk_page(&walk->out);
 221        walk->dst.offset = offset_in_page(walk->out.offset);
 222
 223        return 0;
 224}
 225
 226static int ablkcipher_walk_next(struct ablkcipher_request *req,
 227                                struct ablkcipher_walk *walk)
 228{
 229        struct crypto_tfm *tfm = req->base.tfm;
 230        unsigned int alignmask, bsize, n;
 231        void *src, *dst;
 232        int err;
 233
 234        alignmask = crypto_tfm_alg_alignmask(tfm);
 235        n = walk->total;
 236        if (unlikely(n < crypto_tfm_alg_blocksize(tfm))) {
 237                req->base.flags |= CRYPTO_TFM_RES_BAD_BLOCK_LEN;
 238                return ablkcipher_walk_done(req, walk, -EINVAL);
 239        }
 240
 241        walk->flags &= ~ABLKCIPHER_WALK_SLOW;
 242        src = dst = NULL;
 243
 244        bsize = min(walk->blocksize, n);
 245        n = scatterwalk_clamp(&walk->in, n);
 246        n = scatterwalk_clamp(&walk->out, n);
 247
 248        if (n < bsize ||
 249            !scatterwalk_aligned(&walk->in, alignmask) ||
 250            !scatterwalk_aligned(&walk->out, alignmask)) {
 251                err = ablkcipher_next_slow(req, walk, bsize, alignmask,
 252                                           &src, &dst);
 253                goto set_phys_lowmem;
 254        }
 255
 256        walk->nbytes = n;
 257
 258        return ablkcipher_next_fast(req, walk);
 259
 260set_phys_lowmem:
 261        if (err >= 0) {
 262                walk->src.page = virt_to_page(src);
 263                walk->dst.page = virt_to_page(dst);
 264                walk->src.offset = ((unsigned long)src & (PAGE_SIZE - 1));
 265                walk->dst.offset = ((unsigned long)dst & (PAGE_SIZE - 1));
 266        }
 267
 268        return err;
 269}
 270
 271static int ablkcipher_walk_first(struct ablkcipher_request *req,
 272                                 struct ablkcipher_walk *walk)
 273{
 274        struct crypto_tfm *tfm = req->base.tfm;
 275        unsigned int alignmask;
 276
 277        alignmask = crypto_tfm_alg_alignmask(tfm);
 278        if (WARN_ON_ONCE(in_irq()))
 279                return -EDEADLK;
 280
 281        walk->nbytes = walk->total;
 282        if (unlikely(!walk->total))
 283                return 0;
 284
 285        walk->iv_buffer = NULL;
 286        walk->iv = req->info;
 287        if (unlikely(((unsigned long)walk->iv & alignmask))) {
 288                int err = ablkcipher_copy_iv(walk, tfm, alignmask);
 289                if (err)
 290                        return err;
 291        }
 292
 293        scatterwalk_start(&walk->in, walk->in.sg);
 294        scatterwalk_start(&walk->out, walk->out.sg);
 295
 296        return ablkcipher_walk_next(req, walk);
 297}
 298
 299int ablkcipher_walk_phys(struct ablkcipher_request *req,
 300                         struct ablkcipher_walk *walk)
 301{
 302        walk->blocksize = crypto_tfm_alg_blocksize(req->base.tfm);
 303        return ablkcipher_walk_first(req, walk);
 304}
 305EXPORT_SYMBOL_GPL(ablkcipher_walk_phys);
 306
 307static int setkey_unaligned(struct crypto_ablkcipher *tfm, const u8 *key,
 308                            unsigned int keylen)
 309{
 310        struct ablkcipher_alg *cipher = crypto_ablkcipher_alg(tfm);
 311        unsigned long alignmask = crypto_ablkcipher_alignmask(tfm);
 312        int ret;
 313        u8 *buffer, *alignbuffer;
 314        unsigned long absize;
 315
 316        absize = keylen + alignmask;
 317        buffer = kmalloc(absize, GFP_ATOMIC);
 318        if (!buffer)
 319                return -ENOMEM;
 320
 321        alignbuffer = (u8 *)ALIGN((unsigned long)buffer, alignmask + 1);
 322        memcpy(alignbuffer, key, keylen);
 323        ret = cipher->setkey(tfm, alignbuffer, keylen);
 324        memset(alignbuffer, 0, keylen);
 325        kfree(buffer);
 326        return ret;
 327}
 328
 329static int setkey(struct crypto_ablkcipher *tfm, const u8 *key,
 330                  unsigned int keylen)
 331{
 332        struct ablkcipher_alg *cipher = crypto_ablkcipher_alg(tfm);
 333        unsigned long alignmask = crypto_ablkcipher_alignmask(tfm);
 334
 335        if (keylen < cipher->min_keysize || keylen > cipher->max_keysize) {
 336                crypto_ablkcipher_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN);
 337                return -EINVAL;
 338        }
 339
 340        if ((unsigned long)key & alignmask)
 341                return setkey_unaligned(tfm, key, keylen);
 342
 343        return cipher->setkey(tfm, key, keylen);
 344}
 345
 346static unsigned int crypto_ablkcipher_ctxsize(struct crypto_alg *alg, u32 type,
 347                                              u32 mask)
 348{
 349        return alg->cra_ctxsize;
 350}
 351
 352int skcipher_null_givencrypt(struct skcipher_givcrypt_request *req)
 353{
 354        return crypto_ablkcipher_encrypt(&req->creq);
 355}
 356
 357int skcipher_null_givdecrypt(struct skcipher_givcrypt_request *req)
 358{
 359        return crypto_ablkcipher_decrypt(&req->creq);
 360}
 361
 362static int crypto_init_ablkcipher_ops(struct crypto_tfm *tfm, u32 type,
 363                                      u32 mask)
 364{
 365        struct ablkcipher_alg *alg = &tfm->__crt_alg->cra_ablkcipher;
 366        struct ablkcipher_tfm *crt = &tfm->crt_ablkcipher;
 367
 368        if (alg->ivsize > PAGE_SIZE / 8)
 369                return -EINVAL;
 370
 371        crt->setkey = setkey;
 372        crt->encrypt = alg->encrypt;
 373        crt->decrypt = alg->decrypt;
 374        if (!alg->ivsize) {
 375                crt->givencrypt = skcipher_null_givencrypt;
 376                crt->givdecrypt = skcipher_null_givdecrypt;
 377        }
 378        crt->base = __crypto_ablkcipher_cast(tfm);
 379        crt->ivsize = alg->ivsize;
 380
 381        return 0;
 382}
 383
 384static void crypto_ablkcipher_show(struct seq_file *m, struct crypto_alg *alg)
 385        __attribute__ ((unused));
 386static void crypto_ablkcipher_show(struct seq_file *m, struct crypto_alg *alg)
 387{
 388        struct ablkcipher_alg *ablkcipher = &alg->cra_ablkcipher;
 389
 390        seq_printf(m, "type         : ablkcipher\n");
 391        seq_printf(m, "async        : %s\n", alg->cra_flags & CRYPTO_ALG_ASYNC ?
 392                                             "yes" : "no");
 393        seq_printf(m, "blocksize    : %u\n", alg->cra_blocksize);
 394        seq_printf(m, "min keysize  : %u\n", ablkcipher->min_keysize);
 395        seq_printf(m, "max keysize  : %u\n", ablkcipher->max_keysize);
 396        seq_printf(m, "ivsize       : %u\n", ablkcipher->ivsize);
 397        seq_printf(m, "geniv        : %s\n", ablkcipher->geniv ?: "<default>");
 398}
 399
 400const struct crypto_type crypto_ablkcipher_type = {
 401        .ctxsize = crypto_ablkcipher_ctxsize,
 402        .init = crypto_init_ablkcipher_ops,
 403#ifdef CONFIG_PROC_FS
 404        .show = crypto_ablkcipher_show,
 405#endif
 406};
 407EXPORT_SYMBOL_GPL(crypto_ablkcipher_type);
 408
 409static int no_givdecrypt(struct skcipher_givcrypt_request *req)
 410{
 411        return -ENOSYS;
 412}
 413
 414static int crypto_init_givcipher_ops(struct crypto_tfm *tfm, u32 type,
 415                                      u32 mask)
 416{
 417        struct ablkcipher_alg *alg = &tfm->__crt_alg->cra_ablkcipher;
 418        struct ablkcipher_tfm *crt = &tfm->crt_ablkcipher;
 419
 420        if (alg->ivsize > PAGE_SIZE / 8)
 421                return -EINVAL;
 422
 423        crt->setkey = tfm->__crt_alg->cra_flags & CRYPTO_ALG_GENIV ?
 424                      alg->setkey : setkey;
 425        crt->encrypt = alg->encrypt;
 426        crt->decrypt = alg->decrypt;
 427        crt->givencrypt = alg->givencrypt;
 428        crt->givdecrypt = alg->givdecrypt ?: no_givdecrypt;
 429        crt->base = __crypto_ablkcipher_cast(tfm);
 430        crt->ivsize = alg->ivsize;
 431
 432        return 0;
 433}
 434
 435static void crypto_givcipher_show(struct seq_file *m, struct crypto_alg *alg)
 436        __attribute__ ((unused));
 437static void crypto_givcipher_show(struct seq_file *m, struct crypto_alg *alg)
 438{
 439        struct ablkcipher_alg *ablkcipher = &alg->cra_ablkcipher;
 440
 441        seq_printf(m, "type         : givcipher\n");
 442        seq_printf(m, "async        : %s\n", alg->cra_flags & CRYPTO_ALG_ASYNC ?
 443                                             "yes" : "no");
 444        seq_printf(m, "blocksize    : %u\n", alg->cra_blocksize);
 445        seq_printf(m, "min keysize  : %u\n", ablkcipher->min_keysize);
 446        seq_printf(m, "max keysize  : %u\n", ablkcipher->max_keysize);
 447        seq_printf(m, "ivsize       : %u\n", ablkcipher->ivsize);
 448        seq_printf(m, "geniv        : %s\n", ablkcipher->geniv ?: "<built-in>");
 449}
 450
 451const struct crypto_type crypto_givcipher_type = {
 452        .ctxsize = crypto_ablkcipher_ctxsize,
 453        .init = crypto_init_givcipher_ops,
 454#ifdef CONFIG_PROC_FS
 455        .show = crypto_givcipher_show,
 456#endif
 457};
 458EXPORT_SYMBOL_GPL(crypto_givcipher_type);
 459
 460const char *crypto_default_geniv(const struct crypto_alg *alg)
 461{
 462        if (((alg->cra_flags & CRYPTO_ALG_TYPE_MASK) ==
 463             CRYPTO_ALG_TYPE_BLKCIPHER ? alg->cra_blkcipher.ivsize :
 464                                         alg->cra_ablkcipher.ivsize) !=
 465            alg->cra_blocksize)
 466                return "chainiv";
 467
 468        return alg->cra_flags & CRYPTO_ALG_ASYNC ?
 469               "eseqiv" : skcipher_default_geniv;
 470}
 471
 472static int crypto_givcipher_default(struct crypto_alg *alg, u32 type, u32 mask)
 473{
 474        struct rtattr *tb[3];
 475        struct {
 476                struct rtattr attr;
 477                struct crypto_attr_type data;
 478        } ptype;
 479        struct {
 480                struct rtattr attr;
 481                struct crypto_attr_alg data;
 482        } palg;
 483        struct crypto_template *tmpl;
 484        struct crypto_instance *inst;
 485        struct crypto_alg *larval;
 486        const char *geniv;
 487        int err;
 488
 489        larval = crypto_larval_lookup(alg->cra_driver_name,
 490                                      (type & ~CRYPTO_ALG_TYPE_MASK) |
 491                                      CRYPTO_ALG_TYPE_GIVCIPHER,
 492                                      mask | CRYPTO_ALG_TYPE_MASK);
 493        err = PTR_ERR(larval);
 494        if (IS_ERR(larval))
 495                goto out;
 496
 497        err = -EAGAIN;
 498        if (!crypto_is_larval(larval))
 499                goto drop_larval;
 500
 501        ptype.attr.rta_len = sizeof(ptype);
 502        ptype.attr.rta_type = CRYPTOA_TYPE;
 503        ptype.data.type = type | CRYPTO_ALG_GENIV;
 504        /* GENIV tells the template that we're making a default geniv. */
 505        ptype.data.mask = mask | CRYPTO_ALG_GENIV;
 506        tb[0] = &ptype.attr;
 507
 508        palg.attr.rta_len = sizeof(palg);
 509        palg.attr.rta_type = CRYPTOA_ALG;
 510        /* Must use the exact name to locate ourselves. */
 511        memcpy(palg.data.name, alg->cra_driver_name, CRYPTO_MAX_ALG_NAME);
 512        tb[1] = &palg.attr;
 513
 514        tb[2] = NULL;
 515
 516        if ((alg->cra_flags & CRYPTO_ALG_TYPE_MASK) ==
 517            CRYPTO_ALG_TYPE_BLKCIPHER)
 518                geniv = alg->cra_blkcipher.geniv;
 519        else
 520                geniv = alg->cra_ablkcipher.geniv;
 521
 522        if (!geniv)
 523                geniv = crypto_default_geniv(alg);
 524
 525        tmpl = crypto_lookup_template(geniv);
 526        err = -ENOENT;
 527        if (!tmpl)
 528                goto kill_larval;
 529
 530        inst = tmpl->alloc(tb);
 531        err = PTR_ERR(inst);
 532        if (IS_ERR(inst))
 533                goto put_tmpl;
 534
 535        if ((err = crypto_register_instance(tmpl, inst))) {
 536                tmpl->free(inst);
 537                goto put_tmpl;
 538        }
 539
 540        /* Redo the lookup to use the instance we just registered. */
 541        err = -EAGAIN;
 542
 543put_tmpl:
 544        crypto_tmpl_put(tmpl);
 545kill_larval:
 546        crypto_larval_kill(larval);
 547drop_larval:
 548        crypto_mod_put(larval);
 549out:
 550        crypto_mod_put(alg);
 551        return err;
 552}
 553
 554static struct crypto_alg *crypto_lookup_skcipher(const char *name, u32 type,
 555                                                 u32 mask)
 556{
 557        struct crypto_alg *alg;
 558
 559        alg = crypto_alg_mod_lookup(name, type, mask);
 560        if (IS_ERR(alg))
 561                return alg;
 562
 563        if ((alg->cra_flags & CRYPTO_ALG_TYPE_MASK) ==
 564            CRYPTO_ALG_TYPE_GIVCIPHER)
 565                return alg;
 566
 567        if (!((alg->cra_flags & CRYPTO_ALG_TYPE_MASK) ==
 568              CRYPTO_ALG_TYPE_BLKCIPHER ? alg->cra_blkcipher.ivsize :
 569                                          alg->cra_ablkcipher.ivsize))
 570                return alg;
 571
 572        crypto_mod_put(alg);
 573        alg = crypto_alg_mod_lookup(name, type | CRYPTO_ALG_TESTED,
 574                                    mask & ~CRYPTO_ALG_TESTED);
 575        if (IS_ERR(alg))
 576                return alg;
 577
 578        if ((alg->cra_flags & CRYPTO_ALG_TYPE_MASK) ==
 579            CRYPTO_ALG_TYPE_GIVCIPHER) {
 580                if ((alg->cra_flags ^ type ^ ~mask) & CRYPTO_ALG_TESTED) {
 581                        crypto_mod_put(alg);
 582                        alg = ERR_PTR(-ENOENT);
 583                }
 584                return alg;
 585        }
 586
 587        BUG_ON(!((alg->cra_flags & CRYPTO_ALG_TYPE_MASK) ==
 588                 CRYPTO_ALG_TYPE_BLKCIPHER ? alg->cra_blkcipher.ivsize :
 589                                             alg->cra_ablkcipher.ivsize));
 590
 591        return ERR_PTR(crypto_givcipher_default(alg, type, mask));
 592}
 593
 594int crypto_grab_skcipher(struct crypto_skcipher_spawn *spawn, const char *name,
 595                         u32 type, u32 mask)
 596{
 597        struct crypto_alg *alg;
 598        int err;
 599
 600        type = crypto_skcipher_type(type);
 601        mask = crypto_skcipher_mask(mask);
 602
 603        alg = crypto_lookup_skcipher(name, type, mask);
 604        if (IS_ERR(alg))
 605                return PTR_ERR(alg);
 606
 607        err = crypto_init_spawn(&spawn->base, alg, spawn->base.inst, mask);
 608        crypto_mod_put(alg);
 609        return err;
 610}
 611EXPORT_SYMBOL_GPL(crypto_grab_skcipher);
 612
 613struct crypto_ablkcipher *crypto_alloc_ablkcipher(const char *alg_name,
 614                                                  u32 type, u32 mask)
 615{
 616        struct crypto_tfm *tfm;
 617        int err;
 618
 619        type = crypto_skcipher_type(type);
 620        mask = crypto_skcipher_mask(mask);
 621
 622        for (;;) {
 623                struct crypto_alg *alg;
 624
 625                alg = crypto_lookup_skcipher(alg_name, type, mask);
 626                if (IS_ERR(alg)) {
 627                        err = PTR_ERR(alg);
 628                        goto err;
 629                }
 630
 631                tfm = __crypto_alloc_tfm(alg, type, mask);
 632                if (!IS_ERR(tfm))
 633                        return __crypto_ablkcipher_cast(tfm);
 634
 635                crypto_mod_put(alg);
 636                err = PTR_ERR(tfm);
 637
 638err:
 639                if (err != -EAGAIN)
 640                        break;
 641                if (signal_pending(current)) {
 642                        err = -EINTR;
 643                        break;
 644                }
 645        }
 646
 647        return ERR_PTR(err);
 648}
 649EXPORT_SYMBOL_GPL(crypto_alloc_ablkcipher);
 650
 651static int __init skcipher_module_init(void)
 652{
 653        skcipher_default_geniv = num_possible_cpus() > 1 ?
 654                                 "eseqiv" : "chainiv";
 655        return 0;
 656}
 657
 658static void skcipher_module_exit(void)
 659{
 660}
 661
 662module_init(skcipher_module_init);
 663module_exit(skcipher_module_exit);
 664
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.