linux/drivers/crypto/ixp4xx_crypto.c
<<
>>
Prefs
   1/*
   2 * Intel IXP4xx NPE-C crypto driver
   3 *
   4 * Copyright (C) 2008 Christian Hohnstaedt <chohnstaedt@innominate.com>
   5 *
   6 * This program is free software; you can redistribute it and/or modify it
   7 * under the terms of version 2 of the GNU General Public License
   8 * as published by the Free Software Foundation.
   9 *
  10 */
  11
  12#include <linux/platform_device.h>
  13#include <linux/dma-mapping.h>
  14#include <linux/dmapool.h>
  15#include <linux/crypto.h>
  16#include <linux/kernel.h>
  17#include <linux/rtnetlink.h>
  18#include <linux/interrupt.h>
  19#include <linux/spinlock.h>
  20#include <linux/gfp.h>
  21
  22#include <crypto/ctr.h>
  23#include <crypto/des.h>
  24#include <crypto/aes.h>
  25#include <crypto/sha.h>
  26#include <crypto/algapi.h>
  27#include <crypto/aead.h>
  28#include <crypto/authenc.h>
  29#include <crypto/scatterwalk.h>
  30
  31#include <mach/npe.h>
  32#include <mach/qmgr.h>
  33
  34#define MAX_KEYLEN 32
  35
  36/* hash: cfgword + 2 * digestlen; crypt: keylen + cfgword */
  37#define NPE_CTX_LEN 80
  38#define AES_BLOCK128 16
  39
  40#define NPE_OP_HASH_VERIFY   0x01
  41#define NPE_OP_CCM_ENABLE    0x04
  42#define NPE_OP_CRYPT_ENABLE  0x08
  43#define NPE_OP_HASH_ENABLE   0x10
  44#define NPE_OP_NOT_IN_PLACE  0x20
  45#define NPE_OP_HMAC_DISABLE  0x40
  46#define NPE_OP_CRYPT_ENCRYPT 0x80
  47
  48#define NPE_OP_CCM_GEN_MIC   0xcc
  49#define NPE_OP_HASH_GEN_ICV  0x50
  50#define NPE_OP_ENC_GEN_KEY   0xc9
  51
  52#define MOD_ECB     0x0000
  53#define MOD_CTR     0x1000
  54#define MOD_CBC_ENC 0x2000
  55#define MOD_CBC_DEC 0x3000
  56#define MOD_CCM_ENC 0x4000
  57#define MOD_CCM_DEC 0x5000
  58
  59#define KEYLEN_128  4
  60#define KEYLEN_192  6
  61#define KEYLEN_256  8
  62
  63#define CIPH_DECR   0x0000
  64#define CIPH_ENCR   0x0400
  65
  66#define MOD_DES     0x0000
  67#define MOD_TDEA2   0x0100
  68#define MOD_3DES   0x0200
  69#define MOD_AES     0x0800
  70#define MOD_AES128  (0x0800 | KEYLEN_128)
  71#define MOD_AES192  (0x0900 | KEYLEN_192)
  72#define MOD_AES256  (0x0a00 | KEYLEN_256)
  73
  74#define MAX_IVLEN   16
  75#define NPE_ID      2  /* NPE C */
  76#define NPE_QLEN    16
  77/* Space for registering when the first
  78 * NPE_QLEN crypt_ctl are busy */
  79#define NPE_QLEN_TOTAL 64
  80
  81#define SEND_QID    29
  82#define RECV_QID    30
  83
  84#define CTL_FLAG_UNUSED         0x0000
  85#define CTL_FLAG_USED           0x1000
  86#define CTL_FLAG_PERFORM_ABLK   0x0001
  87#define CTL_FLAG_GEN_ICV        0x0002
  88#define CTL_FLAG_GEN_REVAES     0x0004
  89#define CTL_FLAG_PERFORM_AEAD   0x0008
  90#define CTL_FLAG_MASK           0x000f
  91
  92#define HMAC_IPAD_VALUE   0x36
  93#define HMAC_OPAD_VALUE   0x5C
  94#define HMAC_PAD_BLOCKLEN SHA1_BLOCK_SIZE
  95
  96#define MD5_DIGEST_SIZE   16
  97
  98struct buffer_desc {
  99        u32 phys_next;
 100#ifdef __ARMEB__
 101        u16 buf_len;
 102        u16 pkt_len;
 103#else
 104        u16 pkt_len;
 105        u16 buf_len;
 106#endif
 107        u32 phys_addr;
 108        u32 __reserved[4];
 109        struct buffer_desc *next;
 110        enum dma_data_direction dir;
 111};
 112
 113struct crypt_ctl {
 114#ifdef __ARMEB__
 115        u8 mode;                /* NPE_OP_*  operation mode */
 116        u8 init_len;
 117        u16 reserved;
 118#else
 119        u16 reserved;
 120        u8 init_len;
 121        u8 mode;                /* NPE_OP_*  operation mode */
 122#endif
 123        u8 iv[MAX_IVLEN];       /* IV for CBC mode or CTR IV for CTR mode */
 124        u32 icv_rev_aes;        /* icv or rev aes */
 125        u32 src_buf;
 126        u32 dst_buf;
 127#ifdef __ARMEB__
 128        u16 auth_offs;          /* Authentication start offset */
 129        u16 auth_len;           /* Authentication data length */
 130        u16 crypt_offs;         /* Cryption start offset */
 131        u16 crypt_len;          /* Cryption data length */
 132#else
 133        u16 auth_len;           /* Authentication data length */
 134        u16 auth_offs;          /* Authentication start offset */
 135        u16 crypt_len;          /* Cryption data length */
 136        u16 crypt_offs;         /* Cryption start offset */
 137#endif
 138        u32 aadAddr;            /* Additional Auth Data Addr for CCM mode */
 139        u32 crypto_ctx;         /* NPE Crypto Param structure address */
 140
 141        /* Used by Host: 4*4 bytes*/
 142        unsigned ctl_flags;
 143        union {
 144                struct ablkcipher_request *ablk_req;
 145                struct aead_request *aead_req;
 146                struct crypto_tfm *tfm;
 147        } data;
 148        struct buffer_desc *regist_buf;
 149        u8 *regist_ptr;
 150};
 151
 152struct ablk_ctx {
 153        struct buffer_desc *src;
 154        struct buffer_desc *dst;
 155};
 156
 157struct aead_ctx {
 158        struct buffer_desc *buffer;
 159        struct scatterlist ivlist;
 160        /* used when the hmac is not on one sg entry */
 161        u8 *hmac_virt;
 162        int encrypt;
 163};
 164
 165struct ix_hash_algo {
 166        u32 cfgword;
 167        unsigned char *icv;
 168};
 169
 170struct ix_sa_dir {
 171        unsigned char *npe_ctx;
 172        dma_addr_t npe_ctx_phys;
 173        int npe_ctx_idx;
 174        u8 npe_mode;
 175};
 176
 177struct ixp_ctx {
 178        struct ix_sa_dir encrypt;
 179        struct ix_sa_dir decrypt;
 180        int authkey_len;
 181        u8 authkey[MAX_KEYLEN];
 182        int enckey_len;
 183        u8 enckey[MAX_KEYLEN];
 184        u8 salt[MAX_IVLEN];
 185        u8 nonce[CTR_RFC3686_NONCE_SIZE];
 186        unsigned salted;
 187        atomic_t configuring;
 188        struct completion completion;
 189};
 190
 191struct ixp_alg {
 192        struct crypto_alg crypto;
 193        const struct ix_hash_algo *hash;
 194        u32 cfg_enc;
 195        u32 cfg_dec;
 196
 197        int registered;
 198};
 199
 200static const struct ix_hash_algo hash_alg_md5 = {
 201        .cfgword        = 0xAA010004,
 202        .icv            = "\x01\x23\x45\x67\x89\xAB\xCD\xEF"
 203                          "\xFE\xDC\xBA\x98\x76\x54\x32\x10",
 204};
 205static const struct ix_hash_algo hash_alg_sha1 = {
 206        .cfgword        = 0x00000005,
 207        .icv            = "\x67\x45\x23\x01\xEF\xCD\xAB\x89\x98\xBA"
 208                          "\xDC\xFE\x10\x32\x54\x76\xC3\xD2\xE1\xF0",
 209};
 210
 211static struct npe *npe_c;
 212static struct dma_pool *buffer_pool = NULL;
 213static struct dma_pool *ctx_pool = NULL;
 214
 215static struct crypt_ctl *crypt_virt = NULL;
 216static dma_addr_t crypt_phys;
 217
 218static int support_aes = 1;
 219
 220static void dev_release(struct device *dev)
 221{
 222        return;
 223}
 224
 225#define DRIVER_NAME "ixp4xx_crypto"
 226static struct platform_device pseudo_dev = {
 227        .name = DRIVER_NAME,
 228        .id   = 0,
 229        .num_resources = 0,
 230        .dev  = {
 231                .coherent_dma_mask = DMA_BIT_MASK(32),
 232                .release = dev_release,
 233        }
 234};
 235
 236static struct device *dev = &pseudo_dev.dev;
 237
 238static inline dma_addr_t crypt_virt2phys(struct crypt_ctl *virt)
 239{
 240        return crypt_phys + (virt - crypt_virt) * sizeof(struct crypt_ctl);
 241}
 242
 243static inline struct crypt_ctl *crypt_phys2virt(dma_addr_t phys)
 244{
 245        return crypt_virt + (phys - crypt_phys) / sizeof(struct crypt_ctl);
 246}
 247
 248static inline u32 cipher_cfg_enc(struct crypto_tfm *tfm)
 249{
 250        return container_of(tfm->__crt_alg, struct ixp_alg,crypto)->cfg_enc;
 251}
 252
 253static inline u32 cipher_cfg_dec(struct crypto_tfm *tfm)
 254{
 255        return container_of(tfm->__crt_alg, struct ixp_alg,crypto)->cfg_dec;
 256}
 257
 258static inline const struct ix_hash_algo *ix_hash(struct crypto_tfm *tfm)
 259{
 260        return container_of(tfm->__crt_alg, struct ixp_alg, crypto)->hash;
 261}
 262
 263static int setup_crypt_desc(void)
 264{
 265        BUILD_BUG_ON(sizeof(struct crypt_ctl) != 64);
 266        crypt_virt = dma_alloc_coherent(dev,
 267                        NPE_QLEN * sizeof(struct crypt_ctl),
 268                        &crypt_phys, GFP_KERNEL);
 269        if (!crypt_virt)
 270                return -ENOMEM;
 271        memset(crypt_virt, 0, NPE_QLEN * sizeof(struct crypt_ctl));
 272        return 0;
 273}
 274
 275static spinlock_t desc_lock;
 276static struct crypt_ctl *get_crypt_desc(void)
 277{
 278        int i;
 279        static int idx = 0;
 280        unsigned long flags;
 281
 282        spin_lock_irqsave(&desc_lock, flags);
 283
 284        if (unlikely(!crypt_virt))
 285                setup_crypt_desc();
 286        if (unlikely(!crypt_virt)) {
 287                spin_unlock_irqrestore(&desc_lock, flags);
 288                return NULL;
 289        }
 290        i = idx;
 291        if (crypt_virt[i].ctl_flags == CTL_FLAG_UNUSED) {
 292                if (++idx >= NPE_QLEN)
 293                        idx = 0;
 294                crypt_virt[i].ctl_flags = CTL_FLAG_USED;
 295                spin_unlock_irqrestore(&desc_lock, flags);
 296                return crypt_virt +i;
 297        } else {
 298                spin_unlock_irqrestore(&desc_lock, flags);
 299                return NULL;
 300        }
 301}
 302
 303static spinlock_t emerg_lock;
 304static struct crypt_ctl *get_crypt_desc_emerg(void)
 305{
 306        int i;
 307        static int idx = NPE_QLEN;
 308        struct crypt_ctl *desc;
 309        unsigned long flags;
 310
 311        desc = get_crypt_desc();
 312        if (desc)
 313                return desc;
 314        if (unlikely(!crypt_virt))
 315                return NULL;
 316
 317        spin_lock_irqsave(&emerg_lock, flags);
 318        i = idx;
 319        if (crypt_virt[i].ctl_flags == CTL_FLAG_UNUSED) {
 320                if (++idx >= NPE_QLEN_TOTAL)
 321                        idx = NPE_QLEN;
 322                crypt_virt[i].ctl_flags = CTL_FLAG_USED;
 323                spin_unlock_irqrestore(&emerg_lock, flags);
 324                return crypt_virt +i;
 325        } else {
 326                spin_unlock_irqrestore(&emerg_lock, flags);
 327                return NULL;
 328        }
 329}
 330
 331static void free_buf_chain(struct device *dev, struct buffer_desc *buf,u32 phys)
 332{
 333        while (buf) {
 334                struct buffer_desc *buf1;
 335                u32 phys1;
 336
 337                buf1 = buf->next;
 338                phys1 = buf->phys_next;
 339                dma_unmap_single(dev, buf->phys_next, buf->buf_len, buf->dir);
 340                dma_pool_free(buffer_pool, buf, phys);
 341                buf = buf1;
 342                phys = phys1;
 343        }
 344}
 345
 346static struct tasklet_struct crypto_done_tasklet;
 347
 348static void finish_scattered_hmac(struct crypt_ctl *crypt)
 349{
 350        struct aead_request *req = crypt->data.aead_req;
 351        struct aead_ctx *req_ctx = aead_request_ctx(req);
 352        struct crypto_aead *tfm = crypto_aead_reqtfm(req);
 353        int authsize = crypto_aead_authsize(tfm);
 354        int decryptlen = req->cryptlen - authsize;
 355
 356        if (req_ctx->encrypt) {
 357                scatterwalk_map_and_copy(req_ctx->hmac_virt,
 358                        req->src, decryptlen, authsize, 1);
 359        }
 360        dma_pool_free(buffer_pool, req_ctx->hmac_virt, crypt->icv_rev_aes);
 361}
 362
 363static void one_packet(dma_addr_t phys)
 364{
 365        struct crypt_ctl *crypt;
 366        struct ixp_ctx *ctx;
 367        int failed;
 368
 369        failed = phys & 0x1 ? -EBADMSG : 0;
 370        phys &= ~0x3;
 371        crypt = crypt_phys2virt(phys);
 372
 373        switch (crypt->ctl_flags & CTL_FLAG_MASK) {
 374        case CTL_FLAG_PERFORM_AEAD: {
 375                struct aead_request *req = crypt->data.aead_req;
 376                struct aead_ctx *req_ctx = aead_request_ctx(req);
 377
 378                free_buf_chain(dev, req_ctx->buffer, crypt->src_buf);
 379                if (req_ctx->hmac_virt) {
 380                        finish_scattered_hmac(crypt);
 381                }
 382                req->base.complete(&req->base, failed);
 383                break;
 384        }
 385        case CTL_FLAG_PERFORM_ABLK: {
 386                struct ablkcipher_request *req = crypt->data.ablk_req;
 387                struct ablk_ctx *req_ctx = ablkcipher_request_ctx(req);
 388
 389                if (req_ctx->dst) {
 390                        free_buf_chain(dev, req_ctx->dst, crypt->dst_buf);
 391                }
 392                free_buf_chain(dev, req_ctx->src, crypt->src_buf);
 393                req->base.complete(&req->base, failed);
 394                break;
 395        }
 396        case CTL_FLAG_GEN_ICV:
 397                ctx = crypto_tfm_ctx(crypt->data.tfm);
 398                dma_pool_free(ctx_pool, crypt->regist_ptr,
 399                                crypt->regist_buf->phys_addr);
 400                dma_pool_free(buffer_pool, crypt->regist_buf, crypt->src_buf);
 401                if (atomic_dec_and_test(&ctx->configuring))
 402                        complete(&ctx->completion);
 403                break;
 404        case CTL_FLAG_GEN_REVAES:
 405                ctx = crypto_tfm_ctx(crypt->data.tfm);
 406                *(u32*)ctx->decrypt.npe_ctx &= cpu_to_be32(~CIPH_ENCR);
 407                if (atomic_dec_and_test(&ctx->configuring))
 408                        complete(&ctx->completion);
 409                break;
 410        default:
 411                BUG();
 412        }
 413        crypt->ctl_flags = CTL_FLAG_UNUSED;
 414}
 415
 416static void irqhandler(void *_unused)
 417{
 418        tasklet_schedule(&crypto_done_tasklet);
 419}
 420
 421static void crypto_done_action(unsigned long arg)
 422{
 423        int i;
 424
 425        for(i=0; i<4; i++) {
 426                dma_addr_t phys = qmgr_get_entry(RECV_QID);
 427                if (!phys)
 428                        return;
 429                one_packet(phys);
 430        }
 431        tasklet_schedule(&crypto_done_tasklet);
 432}
 433
 434static int init_ixp_crypto(void)
 435{
 436        int ret = -ENODEV;
 437        u32 msg[2] = { 0, 0 };
 438
 439        if (! ( ~(*IXP4XX_EXP_CFG2) & (IXP4XX_FEATURE_HASH |
 440                                IXP4XX_FEATURE_AES | IXP4XX_FEATURE_DES))) {
 441                printk(KERN_ERR "ixp_crypto: No HW crypto available\n");
 442                return ret;
 443        }
 444        npe_c = npe_request(NPE_ID);
 445        if (!npe_c)
 446                return ret;
 447
 448        if (!npe_running(npe_c)) {
 449                ret = npe_load_firmware(npe_c, npe_name(npe_c), dev);
 450                if (ret) {
 451                        return ret;
 452                }
 453                if (npe_recv_message(npe_c, msg, "STATUS_MSG"))
 454                        goto npe_error;
 455        } else {
 456                if (npe_send_message(npe_c, msg, "STATUS_MSG"))
 457                        goto npe_error;
 458
 459                if (npe_recv_message(npe_c, msg, "STATUS_MSG"))
 460                        goto npe_error;
 461        }
 462
 463        switch ((msg[1]>>16) & 0xff) {
 464        case 3:
 465                printk(KERN_WARNING "Firmware of %s lacks AES support\n",
 466                                npe_name(npe_c));
 467                support_aes = 0;
 468                break;
 469        case 4:
 470        case 5:
 471                support_aes = 1;
 472                break;
 473        default:
 474                printk(KERN_ERR "Firmware of %s lacks crypto support\n",
 475                        npe_name(npe_c));
 476                return -ENODEV;
 477        }
 478        /* buffer_pool will also be used to sometimes store the hmac,
 479         * so assure it is large enough
 480         */
 481        BUILD_BUG_ON(SHA1_DIGEST_SIZE > sizeof(struct buffer_desc));
 482        buffer_pool = dma_pool_create("buffer", dev,
 483                        sizeof(struct buffer_desc), 32, 0);
 484        ret = -ENOMEM;
 485        if (!buffer_pool) {
 486                goto err;
 487        }
 488        ctx_pool = dma_pool_create("context", dev,
 489                        NPE_CTX_LEN, 16, 0);
 490        if (!ctx_pool) {
 491                goto err;
 492        }
 493        ret = qmgr_request_queue(SEND_QID, NPE_QLEN_TOTAL, 0, 0,
 494                                 "ixp_crypto:out", NULL);
 495        if (ret)
 496                goto err;
 497        ret = qmgr_request_queue(RECV_QID, NPE_QLEN, 0, 0,
 498                                 "ixp_crypto:in", NULL);
 499        if (ret) {
 500                qmgr_release_queue(SEND_QID);
 501                goto err;
 502        }
 503        qmgr_set_irq(RECV_QID, QUEUE_IRQ_SRC_NOT_EMPTY, irqhandler, NULL);
 504        tasklet_init(&crypto_done_tasklet, crypto_done_action, 0);
 505
 506        qmgr_enable_irq(RECV_QID);
 507        return 0;
 508
 509npe_error:
 510        printk(KERN_ERR "%s not responding\n", npe_name(npe_c));
 511        ret = -EIO;
 512err:
 513        if (ctx_pool)
 514                dma_pool_destroy(ctx_pool);
 515        if (buffer_pool)
 516                dma_pool_destroy(buffer_pool);
 517        npe_release(npe_c);
 518        return ret;
 519}
 520
 521static void release_ixp_crypto(void)
 522{
 523        qmgr_disable_irq(RECV_QID);
 524        tasklet_kill(&crypto_done_tasklet);
 525
 526        qmgr_release_queue(SEND_QID);
 527        qmgr_release_queue(RECV_QID);
 528
 529        dma_pool_destroy(ctx_pool);
 530        dma_pool_destroy(buffer_pool);
 531
 532        npe_release(npe_c);
 533
 534        if (crypt_virt) {
 535                dma_free_coherent(dev,
 536                        NPE_QLEN_TOTAL * sizeof( struct crypt_ctl),
 537                        crypt_virt, crypt_phys);
 538        }
 539        return;
 540}
 541
 542static void reset_sa_dir(struct ix_sa_dir *dir)
 543{
 544        memset(dir->npe_ctx, 0, NPE_CTX_LEN);
 545        dir->npe_ctx_idx = 0;
 546        dir->npe_mode = 0;
 547}
 548
 549static int init_sa_dir(struct ix_sa_dir *dir)
 550{
 551        dir->npe_ctx = dma_pool_alloc(ctx_pool, GFP_KERNEL, &dir->npe_ctx_phys);
 552        if (!dir->npe_ctx) {
 553                return -ENOMEM;
 554        }
 555        reset_sa_dir(dir);
 556        return 0;
 557}
 558
 559static void free_sa_dir(struct ix_sa_dir *dir)
 560{
 561        memset(dir->npe_ctx, 0, NPE_CTX_LEN);
 562        dma_pool_free(ctx_pool, dir->npe_ctx, dir->npe_ctx_phys);
 563}
 564
 565static int init_tfm(struct crypto_tfm *tfm)
 566{
 567        struct ixp_ctx *ctx = crypto_tfm_ctx(tfm);
 568        int ret;
 569
 570        atomic_set(&ctx->configuring, 0);
 571        ret = init_sa_dir(&ctx->encrypt);
 572        if (ret)
 573                return ret;
 574        ret = init_sa_dir(&ctx->decrypt);
 575        if (ret) {
 576                free_sa_dir(&ctx->encrypt);
 577        }
 578        return ret;
 579}
 580
 581static int init_tfm_ablk(struct crypto_tfm *tfm)
 582{
 583        tfm->crt_ablkcipher.reqsize = sizeof(struct ablk_ctx);
 584        return init_tfm(tfm);
 585}
 586
 587static int init_tfm_aead(struct crypto_tfm *tfm)
 588{
 589        tfm->crt_aead.reqsize = sizeof(struct aead_ctx);
 590        return init_tfm(tfm);
 591}
 592
 593static void exit_tfm(struct crypto_tfm *tfm)
 594{
 595        struct ixp_ctx *ctx = crypto_tfm_ctx(tfm);
 596        free_sa_dir(&ctx->encrypt);
 597        free_sa_dir(&ctx->decrypt);
 598}
 599
 600static int register_chain_var(struct crypto_tfm *tfm, u8 xpad, u32 target,
 601                int init_len, u32 ctx_addr, const u8 *key, int key_len)
 602{
 603        struct ixp_ctx *ctx = crypto_tfm_ctx(tfm);
 604        struct crypt_ctl *crypt;
 605        struct buffer_desc *buf;
 606        int i;
 607        u8 *pad;
 608        u32 pad_phys, buf_phys;
 609
 610        BUILD_BUG_ON(NPE_CTX_LEN < HMAC_PAD_BLOCKLEN);
 611        pad = dma_pool_alloc(ctx_pool, GFP_KERNEL, &pad_phys);
 612        if (!pad)
 613                return -ENOMEM;
 614        buf = dma_pool_alloc(buffer_pool, GFP_KERNEL, &buf_phys);
 615        if (!buf) {
 616                dma_pool_free(ctx_pool, pad, pad_phys);
 617                return -ENOMEM;
 618        }
 619        crypt = get_crypt_desc_emerg();
 620        if (!crypt) {
 621                dma_pool_free(ctx_pool, pad, pad_phys);
 622                dma_pool_free(buffer_pool, buf, buf_phys);
 623                return -EAGAIN;
 624        }
 625
 626        memcpy(pad, key, key_len);
 627        memset(pad + key_len, 0, HMAC_PAD_BLOCKLEN - key_len);
 628        for (i = 0; i < HMAC_PAD_BLOCKLEN; i++) {
 629                pad[i] ^= xpad;
 630        }
 631
 632        crypt->data.tfm = tfm;
 633        crypt->regist_ptr = pad;
 634        crypt->regist_buf = buf;
 635
 636        crypt->auth_offs = 0;
 637        crypt->auth_len = HMAC_PAD_BLOCKLEN;
 638        crypt->crypto_ctx = ctx_addr;
 639        crypt->src_buf = buf_phys;
 640        crypt->icv_rev_aes = target;
 641        crypt->mode = NPE_OP_HASH_GEN_ICV;
 642        crypt->init_len = init_len;
 643        crypt->ctl_flags |= CTL_FLAG_GEN_ICV;
 644
 645        buf->next = 0;
 646        buf->buf_len = HMAC_PAD_BLOCKLEN;
 647        buf->pkt_len = 0;
 648        buf->phys_addr = pad_phys;
 649
 650        atomic_inc(&ctx->configuring);
 651        qmgr_put_entry(SEND_QID, crypt_virt2phys(crypt));
 652        BUG_ON(qmgr_stat_overflow(SEND_QID));
 653        return 0;
 654}
 655
 656static int setup_auth(struct crypto_tfm *tfm, int encrypt, unsigned authsize,
 657                const u8 *key, int key_len, unsigned digest_len)
 658{
 659        u32 itarget, otarget, npe_ctx_addr;
 660        unsigned char *cinfo;
 661        int init_len, ret = 0;
 662        u32 cfgword;
 663        struct ix_sa_dir *dir;
 664        struct ixp_ctx *ctx = crypto_tfm_ctx(tfm);
 665        const struct ix_hash_algo *algo;
 666
 667        dir = encrypt ? &ctx->encrypt : &ctx->decrypt;
 668        cinfo = dir->npe_ctx + dir->npe_ctx_idx;
 669        algo = ix_hash(tfm);
 670
 671        /* write cfg word to cryptinfo */
 672        cfgword = algo->cfgword | ( authsize << 6); /* (authsize/4) << 8 */
 673#ifndef __ARMEB__
 674        cfgword ^= 0xAA000000; /* change the "byte swap" flags */
 675#endif
 676        *(u32*)cinfo = cpu_to_be32(cfgword);
 677        cinfo += sizeof(cfgword);
 678
 679        /* write ICV to cryptinfo */
 680        memcpy(cinfo, algo->icv, digest_len);
 681        cinfo += digest_len;
 682
 683        itarget = dir->npe_ctx_phys + dir->npe_ctx_idx
 684                                + sizeof(algo->cfgword);
 685        otarget = itarget + digest_len;
 686        init_len = cinfo - (dir->npe_ctx + dir->npe_ctx_idx);
 687        npe_ctx_addr = dir->npe_ctx_phys + dir->npe_ctx_idx;
 688
 689        dir->npe_ctx_idx += init_len;
 690        dir->npe_mode |= NPE_OP_HASH_ENABLE;
 691
 692        if (!encrypt)
 693                dir->npe_mode |= NPE_OP_HASH_VERIFY;
 694
 695        ret = register_chain_var(tfm, HMAC_OPAD_VALUE, otarget,
 696                        init_len, npe_ctx_addr, key, key_len);
 697        if (ret)
 698                return ret;
 699        return register_chain_var(tfm, HMAC_IPAD_VALUE, itarget,
 700                        init_len, npe_ctx_addr, key, key_len);
 701}
 702
 703static int gen_rev_aes_key(struct crypto_tfm *tfm)
 704{
 705        struct crypt_ctl *crypt;
 706        struct ixp_ctx *ctx = crypto_tfm_ctx(tfm);
 707        struct ix_sa_dir *dir = &ctx->decrypt;
 708
 709        crypt = get_crypt_desc_emerg();
 710        if (!crypt) {
 711                return -EAGAIN;
 712        }
 713        *(u32*)dir->npe_ctx |= cpu_to_be32(CIPH_ENCR);
 714
 715        crypt->data.tfm = tfm;
 716        crypt->crypt_offs = 0;
 717        crypt->crypt_len = AES_BLOCK128;
 718        crypt->src_buf = 0;
 719        crypt->crypto_ctx = dir->npe_ctx_phys;
 720        crypt->icv_rev_aes = dir->npe_ctx_phys + sizeof(u32);
 721        crypt->mode = NPE_OP_ENC_GEN_KEY;
 722        crypt->init_len = dir->npe_ctx_idx;
 723        crypt->ctl_flags |= CTL_FLAG_GEN_REVAES;
 724
 725        atomic_inc(&ctx->configuring);
 726        qmgr_put_entry(SEND_QID, crypt_virt2phys(crypt));
 727        BUG_ON(qmgr_stat_overflow(SEND_QID));
 728        return 0;
 729}
 730
 731static int setup_cipher(struct crypto_tfm *tfm, int encrypt,
 732                const u8 *key, int key_len)
 733{
 734        u8 *cinfo;
 735        u32 cipher_cfg;
 736        u32 keylen_cfg = 0;
 737        struct ix_sa_dir *dir;
 738        struct ixp_ctx *ctx = crypto_tfm_ctx(tfm);
 739        u32 *flags = &tfm->crt_flags;
 740
 741        dir = encrypt ? &ctx->encrypt : &ctx->decrypt;
 742        cinfo = dir->npe_ctx;
 743
 744        if (encrypt) {
 745                cipher_cfg = cipher_cfg_enc(tfm);
 746                dir->npe_mode |= NPE_OP_CRYPT_ENCRYPT;
 747        } else {
 748                cipher_cfg = cipher_cfg_dec(tfm);
 749        }
 750        if (cipher_cfg & MOD_AES) {
 751                switch (key_len) {
 752                        case 16: keylen_cfg = MOD_AES128 | KEYLEN_128; break;
 753                        case 24: keylen_cfg = MOD_AES192 | KEYLEN_192; break;
 754                        case 32: keylen_cfg = MOD_AES256 | KEYLEN_256; break;
 755                        default:
 756                                *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
 757                                return -EINVAL;
 758                }
 759                cipher_cfg |= keylen_cfg;
 760        } else if (cipher_cfg & MOD_3DES) {
 761                const u32 *K = (const u32 *)key;
 762                if (unlikely(!((K[0] ^ K[2]) | (K[1] ^ K[3])) ||
 763                             !((K[2] ^ K[4]) | (K[3] ^ K[5]))))
 764                {
 765                        *flags |= CRYPTO_TFM_RES_BAD_KEY_SCHED;
 766                        return -EINVAL;
 767                }
 768        } else {
 769                u32 tmp[DES_EXPKEY_WORDS];
 770                if (des_ekey(tmp, key) == 0) {
 771                        *flags |= CRYPTO_TFM_RES_WEAK_KEY;
 772                }
 773        }
 774        /* write cfg word to cryptinfo */
 775        *(u32*)cinfo = cpu_to_be32(cipher_cfg);
 776        cinfo += sizeof(cipher_cfg);
 777
 778        /* write cipher key to cryptinfo */
 779        memcpy(cinfo, key, key_len);
 780        /* NPE wants keylen set to DES3_EDE_KEY_SIZE even for single DES */
 781        if (key_len < DES3_EDE_KEY_SIZE && !(cipher_cfg & MOD_AES)) {
 782                memset(cinfo + key_len, 0, DES3_EDE_KEY_SIZE -key_len);
 783                key_len = DES3_EDE_KEY_SIZE;
 784        }
 785        dir->npe_ctx_idx = sizeof(cipher_cfg) + key_len;
 786        dir->npe_mode |= NPE_OP_CRYPT_ENABLE;
 787        if ((cipher_cfg & MOD_AES) && !encrypt) {
 788                return gen_rev_aes_key(tfm);
 789        }
 790        return 0;
 791}
 792
 793static struct buffer_desc *chainup_buffers(struct device *dev,
 794                struct scatterlist *sg, unsigned nbytes,
 795                struct buffer_desc *buf, gfp_t flags,
 796                enum dma_data_direction dir)
 797{
 798        for (;nbytes > 0; sg = scatterwalk_sg_next(sg)) {
 799                unsigned len = min(nbytes, sg->length);
 800                struct buffer_desc *next_buf;
 801                u32 next_buf_phys;
 802                void *ptr;
 803
 804                nbytes -= len;
 805                ptr = page_address(sg_page(sg)) + sg->offset;
 806                next_buf = dma_pool_alloc(buffer_pool, flags, &next_buf_phys);
 807                if (!next_buf) {
 808                        buf = NULL;
 809                        break;
 810                }
 811                sg_dma_address(sg) = dma_map_single(dev, ptr, len, dir);
 812                buf->next = next_buf;
 813                buf->phys_next = next_buf_phys;
 814                buf = next_buf;
 815
 816                buf->phys_addr = sg_dma_address(sg);
 817                buf->buf_len = len;
 818                buf->dir = dir;
 819        }
 820        buf->next = NULL;
 821        buf->phys_next = 0;
 822        return buf;
 823}
 824
 825static int ablk_setkey(struct crypto_ablkcipher *tfm, const u8 *key,
 826                        unsigned int key_len)
 827{
 828        struct ixp_ctx *ctx = crypto_ablkcipher_ctx(tfm);
 829        u32 *flags = &tfm->base.crt_flags;
 830        int ret;
 831
 832        init_completion(&ctx->completion);
 833        atomic_inc(&ctx->configuring);
 834
 835        reset_sa_dir(&ctx->encrypt);
 836        reset_sa_dir(&ctx->decrypt);
 837
 838        ctx->encrypt.npe_mode = NPE_OP_HMAC_DISABLE;
 839        ctx->decrypt.npe_mode = NPE_OP_HMAC_DISABLE;
 840
 841        ret = setup_cipher(&tfm->base, 0, key, key_len);
 842        if (ret)
 843                goto out;
 844        ret = setup_cipher(&tfm->base, 1, key, key_len);
 845        if (ret)
 846                goto out;
 847
 848        if (*flags & CRYPTO_TFM_RES_WEAK_KEY) {
 849                if (*flags & CRYPTO_TFM_REQ_WEAK_KEY) {
 850                        ret = -EINVAL;
 851                } else {
 852                        *flags &= ~CRYPTO_TFM_RES_WEAK_KEY;
 853                }
 854        }
 855out:
 856        if (!atomic_dec_and_test(&ctx->configuring))
 857                wait_for_completion(&ctx->completion);
 858        return ret;
 859}
 860
 861static int ablk_rfc3686_setkey(struct crypto_ablkcipher *tfm, const u8 *key,
 862                unsigned int key_len)
 863{
 864        struct ixp_ctx *ctx = crypto_ablkcipher_ctx(tfm);
 865
 866        /* the nonce is stored in bytes at end of key */
 867        if (key_len < CTR_RFC3686_NONCE_SIZE)
 868                return -EINVAL;
 869
 870        memcpy(ctx->nonce, key + (key_len - CTR_RFC3686_NONCE_SIZE),
 871                        CTR_RFC3686_NONCE_SIZE);
 872
 873        key_len -= CTR_RFC3686_NONCE_SIZE;
 874        return ablk_setkey(tfm, key, key_len);
 875}
 876
 877static int ablk_perform(struct ablkcipher_request *req, int encrypt)
 878{
 879        struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req);
 880        struct ixp_ctx *ctx = crypto_ablkcipher_ctx(tfm);
 881        unsigned ivsize = crypto_ablkcipher_ivsize(tfm);
 882        struct ix_sa_dir *dir;
 883        struct crypt_ctl *crypt;
 884        unsigned int nbytes = req->nbytes;
 885        enum dma_data_direction src_direction = DMA_BIDIRECTIONAL;
 886        struct ablk_ctx *req_ctx = ablkcipher_request_ctx(req);
 887        struct buffer_desc src_hook;
 888        gfp_t flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP ?
 889                                GFP_KERNEL : GFP_ATOMIC;
 890
 891        if (qmgr_stat_full(SEND_QID))
 892                return -EAGAIN;
 893        if (atomic_read(&ctx->configuring))
 894                return -EAGAIN;
 895
 896        dir = encrypt ? &ctx->encrypt : &ctx->decrypt;
 897
 898        crypt = get_crypt_desc();
 899        if (!crypt)
 900                return -ENOMEM;
 901
 902        crypt->data.ablk_req = req;
 903        crypt->crypto_ctx = dir->npe_ctx_phys;
 904        crypt->mode = dir->npe_mode;
 905        crypt->init_len = dir->npe_ctx_idx;
 906
 907        crypt->crypt_offs = 0;
 908        crypt->crypt_len = nbytes;
 909
 910        BUG_ON(ivsize && !req->info);
 911        memcpy(crypt->iv, req->info, ivsize);
 912        if (req->src != req->dst) {
 913                struct buffer_desc dst_hook;
 914                crypt->mode |= NPE_OP_NOT_IN_PLACE;
 915                /* This was never tested by Intel
 916                 * for more than one dst buffer, I think. */
 917                BUG_ON(req->dst->length < nbytes);
 918                req_ctx->dst = NULL;
 919                if (!chainup_buffers(dev, req->dst, nbytes, &dst_hook,
 920                                        flags, DMA_FROM_DEVICE))
 921                        goto free_buf_dest;
 922                src_direction = DMA_TO_DEVICE;
 923                req_ctx->dst = dst_hook.next;
 924                crypt->dst_buf = dst_hook.phys_next;
 925        } else {
 926                req_ctx->dst = NULL;
 927        }
 928        req_ctx->src = NULL;
 929        if (!chainup_buffers(dev, req->src, nbytes, &src_hook,
 930                                flags, src_direction))
 931                goto free_buf_src;
 932
 933        req_ctx->src = src_hook.next;
 934        crypt->src_buf = src_hook.phys_next;
 935        crypt->ctl_flags |= CTL_FLAG_PERFORM_ABLK;
 936        qmgr_put_entry(SEND_QID, crypt_virt2phys(crypt));
 937        BUG_ON(qmgr_stat_overflow(SEND_QID));
 938        return -EINPROGRESS;
 939
 940free_buf_src:
 941        free_buf_chain(dev, req_ctx->src, crypt->src_buf);
 942free_buf_dest:
 943        if (req->src != req->dst) {
 944                free_buf_chain(dev, req_ctx->dst, crypt->dst_buf);
 945        }
 946        crypt->ctl_flags = CTL_FLAG_UNUSED;
 947        return -ENOMEM;
 948}
 949
 950static int ablk_encrypt(struct ablkcipher_request *req)
 951{
 952        return ablk_perform(req, 1);
 953}
 954
 955static int ablk_decrypt(struct ablkcipher_request *req)
 956{
 957        return ablk_perform(req, 0);
 958}
 959
 960static int ablk_rfc3686_crypt(struct ablkcipher_request *req)
 961{
 962        struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req);
 963        struct ixp_ctx *ctx = crypto_ablkcipher_ctx(tfm);
 964        u8 iv[CTR_RFC3686_BLOCK_SIZE];
 965        u8 *info = req->info;
 966        int ret;
 967
 968        /* set up counter block */
 969        memcpy(iv, ctx->nonce, CTR_RFC3686_NONCE_SIZE);
 970        memcpy(iv + CTR_RFC3686_NONCE_SIZE, info, CTR_RFC3686_IV_SIZE);
 971
 972        /* initialize counter portion of counter block */
 973        *(__be32 *)(iv + CTR_RFC3686_NONCE_SIZE + CTR_RFC3686_IV_SIZE) =
 974                cpu_to_be32(1);
 975
 976        req->info = iv;
 977        ret = ablk_perform(req, 1);
 978        req->info = info;
 979        return ret;
 980}
 981
 982static int hmac_inconsistent(struct scatterlist *sg, unsigned start,
 983                unsigned int nbytes)
 984{
 985        int offset = 0;
 986
 987        if (!nbytes)
 988                return 0;
 989
 990        for (;;) {
 991                if (start < offset + sg->length)
 992                        break;
 993
 994                offset += sg->length;
 995                sg = scatterwalk_sg_next(sg);
 996        }
 997        return (start + nbytes > offset + sg->length);
 998}
 999
1000static int aead_perform(struct aead_request *req, int encrypt,
1001                int cryptoffset, int eff_cryptlen, u8 *iv)
1002{
1003        struct crypto_aead *tfm = crypto_aead_reqtfm(req);
1004        struct ixp_ctx *ctx = crypto_aead_ctx(tfm);
1005        unsigned ivsize = crypto_aead_ivsize(tfm);
1006        unsigned authsize = crypto_aead_authsize(tfm);
1007        struct ix_sa_dir *dir;
1008        struct crypt_ctl *crypt;
1009        unsigned int cryptlen;
1010        struct buffer_desc *buf, src_hook;
1011        struct aead_ctx *req_ctx = aead_request_ctx(req);
1012        gfp_t flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP ?
1013                                GFP_KERNEL : GFP_ATOMIC;
1014
1015        if (qmgr_stat_full(SEND_QID))
1016                return -EAGAIN;
1017        if (atomic_read(&ctx->configuring))
1018                return -EAGAIN;
1019
1020        if (encrypt) {
1021                dir = &ctx->encrypt;
1022                cryptlen = req->cryptlen;
1023        } else {
1024                dir = &ctx->decrypt;
1025                /* req->cryptlen includes the authsize when decrypting */
1026                cryptlen = req->cryptlen -authsize;
1027                eff_cryptlen -= authsize;
1028        }
1029        crypt = get_crypt_desc();
1030        if (!crypt)
1031                return -ENOMEM;
1032
1033        crypt->data.aead_req = req;
1034        crypt->crypto_ctx = dir->npe_ctx_phys;
1035        crypt->mode = dir->npe_mode;
1036        crypt->init_len = dir->npe_ctx_idx;
1037
1038        crypt->crypt_offs = cryptoffset;
1039        crypt->crypt_len = eff_cryptlen;
1040
1041        crypt->auth_offs = 0;
1042        crypt->auth_len = req->assoclen + ivsize + cryptlen;
1043        BUG_ON(ivsize && !req->iv);
1044        memcpy(crypt->iv, req->iv, ivsize);
1045
1046        if (req->src != req->dst) {
1047                BUG(); /* -ENOTSUP because of my lazyness */
1048        }
1049
1050        /* ASSOC data */
1051        buf = chainup_buffers(dev, req->assoc, req->assoclen, &src_hook,
1052                flags, DMA_TO_DEVICE);
1053        req_ctx->buffer = src_hook.next;
1054        crypt->src_buf = src_hook.phys_next;
1055        if (!buf)
1056                goto out;
1057        /* IV */
1058        sg_init_table(&req_ctx->ivlist, 1);
1059        sg_set_buf(&req_ctx->ivlist, iv, ivsize);
1060        buf = chainup_buffers(dev, &req_ctx->ivlist, ivsize, buf, flags,
1061                        DMA_BIDIRECTIONAL);
1062        if (!buf)
1063                goto free_chain;
1064        if (unlikely(hmac_inconsistent(req->src, cryptlen, authsize))) {
1065                /* The 12 hmac bytes are scattered,
1066                 * we need to copy them into a safe buffer */
1067                req_ctx->hmac_virt = dma_pool_alloc(buffer_pool, flags,
1068                                &crypt->icv_rev_aes);
1069                if (unlikely(!req_ctx->hmac_virt))
1070                        goto free_chain;
1071                if (!encrypt) {
1072                        scatterwalk_map_and_copy(req_ctx->hmac_virt,
1073                                req->src, cryptlen, authsize, 0);
1074                }
1075                req_ctx->encrypt = encrypt;
1076        } else {
1077                req_ctx->hmac_virt = NULL;
1078        }
1079        /* Crypt */
1080        buf = chainup_buffers(dev, req->src, cryptlen + authsize, buf, flags,
1081                        DMA_BIDIRECTIONAL);
1082        if (!buf)
1083                goto free_hmac_virt;
1084        if (!req_ctx->hmac_virt) {
1085                crypt->icv_rev_aes = buf->phys_addr + buf->buf_len - authsize;
1086        }
1087
1088        crypt->ctl_flags |= CTL_FLAG_PERFORM_AEAD;
1089        qmgr_put_entry(SEND_QID, crypt_virt2phys(crypt));
1090        BUG_ON(qmgr_stat_overflow(SEND_QID));
1091        return -EINPROGRESS;
1092free_hmac_virt:
1093        if (req_ctx->hmac_virt) {
1094                dma_pool_free(buffer_pool, req_ctx->hmac_virt,
1095                                crypt->icv_rev_aes);
1096        }
1097free_chain:
1098        free_buf_chain(dev, req_ctx->buffer, crypt->src_buf);
1099out:
1100        crypt->ctl_flags = CTL_FLAG_UNUSED;
1101        return -ENOMEM;
1102}
1103
1104static int aead_setup(struct crypto_aead *tfm, unsigned int authsize)
1105{
1106        struct ixp_ctx *ctx = crypto_aead_ctx(tfm);
1107        u32 *flags = &tfm->base.crt_flags;
1108        unsigned digest_len = crypto_aead_alg(tfm)->maxauthsize;
1109        int ret;
1110
1111        if (!ctx->enckey_len && !ctx->authkey_len)
1112                return 0;
1113        init_completion(&ctx->completion);
1114        atomic_inc(&ctx->configuring);
1115
1116        reset_sa_dir(&ctx->encrypt);
1117        reset_sa_dir(&ctx->decrypt);
1118
1119        ret = setup_cipher(&tfm->base, 0, ctx->enckey, ctx->enckey_len);
1120        if (ret)
1121                goto out;
1122        ret = setup_cipher(&tfm->base, 1, ctx->enckey, ctx->enckey_len);
1123        if (ret)
1124                goto out;
1125        ret = setup_auth(&tfm->base, 0, authsize, ctx->authkey,
1126                        ctx->authkey_len, digest_len);
1127        if (ret)
1128                goto out;
1129        ret = setup_auth(&tfm->base, 1, authsize,  ctx->authkey,
1130                        ctx->authkey_len, digest_len);
1131        if (ret)
1132                goto out;
1133
1134        if (*flags & CRYPTO_TFM_RES_WEAK_KEY) {
1135                if (*flags & CRYPTO_TFM_REQ_WEAK_KEY) {
1136                        ret = -EINVAL;
1137                        goto out;
1138                } else {
1139                        *flags &= ~CRYPTO_TFM_RES_WEAK_KEY;
1140                }
1141        }
1142out:
1143        if (!atomic_dec_and_test(&ctx->configuring))
1144                wait_for_completion(&ctx->completion);
1145        return ret;
1146}
1147
1148static int aead_setauthsize(struct crypto_aead *tfm, unsigned int authsize)
1149{
1150        int max = crypto_aead_alg(tfm)->maxauthsize >> 2;
1151
1152        if ((authsize>>2) < 1 || (authsize>>2) > max || (authsize & 3))
1153                return -EINVAL;
1154        return aead_setup(tfm, authsize);
1155}
1156
1157static int aead_setkey(struct crypto_aead *tfm, const u8 *key,
1158                        unsigned int keylen)
1159{
1160        struct ixp_ctx *ctx = crypto_aead_ctx(tfm);
1161        struct rtattr *rta = (struct rtattr *)key;
1162        struct crypto_authenc_key_param *param;
1163
1164        if (!RTA_OK(rta, keylen))
1165                goto badkey;
1166        if (rta->rta_type != CRYPTO_AUTHENC_KEYA_PARAM)
1167                goto badkey;
1168        if (RTA_PAYLOAD(rta) < sizeof(*param))
1169                goto badkey;
1170
1171        param = RTA_DATA(rta);
1172        ctx->enckey_len = be32_to_cpu(param->enckeylen);
1173
1174        key += RTA_ALIGN(rta->rta_len);
1175        keylen -= RTA_ALIGN(rta->rta_len);
1176
1177        if (keylen < ctx->enckey_len)
1178                goto badkey;
1179
1180        ctx->authkey_len = keylen - ctx->enckey_len;
1181        memcpy(ctx->enckey, key + ctx->authkey_len, ctx->enckey_len);
1182        memcpy(ctx->authkey, key, ctx->authkey_len);
1183
1184        return aead_setup(tfm, crypto_aead_authsize(tfm));
1185badkey:
1186        ctx->enckey_len = 0;
1187        crypto_aead_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN);
1188        return -EINVAL;
1189}
1190
1191static int aead_encrypt(struct aead_request *req)
1192{
1193        unsigned ivsize = crypto_aead_ivsize(crypto_aead_reqtfm(req));
1194        return aead_perform(req, 1, req->assoclen + ivsize,
1195                        req->cryptlen, req->iv);
1196}
1197
1198static int aead_decrypt(struct aead_request *req)
1199{
1200        unsigned ivsize = crypto_aead_ivsize(crypto_aead_reqtfm(req));
1201        return aead_perform(req, 0, req->assoclen + ivsize,
1202                        req->cryptlen, req->iv);
1203}
1204
1205static int aead_givencrypt(struct aead_givcrypt_request *req)
1206{
1207        struct crypto_aead *tfm = aead_givcrypt_reqtfm(req);
1208        struct ixp_ctx *ctx = crypto_aead_ctx(tfm);
1209        unsigned len, ivsize = crypto_aead_ivsize(tfm);
1210        __be64 seq;
1211
1212        /* copied from eseqiv.c */
1213        if (!ctx->salted) {
1214                get_random_bytes(ctx->salt, ivsize);
1215                ctx->salted = 1;
1216        }
1217        memcpy(req->areq.iv, ctx->salt, ivsize);
1218        len = ivsize;
1219        if (ivsize > sizeof(u64)) {
1220                memset(req->giv, 0, ivsize - sizeof(u64));
1221                len = sizeof(u64);
1222        }
1223        seq = cpu_to_be64(req->seq);
1224        memcpy(req->giv + ivsize - len, &seq, len);
1225        return aead_perform(&req->areq, 1, req->areq.assoclen,
1226                        req->areq.cryptlen +ivsize, req->giv);
1227}
1228
1229static struct ixp_alg ixp4xx_algos[] = {
1230{
1231        .crypto = {
1232                .cra_name       = "cbc(des)",
1233                .cra_blocksize  = DES_BLOCK_SIZE,
1234                .cra_u          = { .ablkcipher = {
1235                        .min_keysize    = DES_KEY_SIZE,
1236                        .max_keysize    = DES_KEY_SIZE,
1237                        .ivsize         = DES_BLOCK_SIZE,
1238                        .geniv          = "eseqiv",
1239                        }
1240                }
1241        },
1242        .cfg_enc = CIPH_ENCR | MOD_DES | MOD_CBC_ENC | KEYLEN_192,
1243        .cfg_dec = CIPH_DECR | MOD_DES | MOD_CBC_DEC | KEYLEN_192,
1244
1245}, {
1246        .crypto = {
1247                .cra_name       = "ecb(des)",
1248                .cra_blocksize  = DES_BLOCK_SIZE,
1249                .cra_u          = { .ablkcipher = {
1250                        .min_keysize    = DES_KEY_SIZE,
1251                        .max_keysize    = DES_KEY_SIZE,
1252                        }
1253                }
1254        },
1255        .cfg_enc = CIPH_ENCR | MOD_DES | MOD_ECB | KEYLEN_192,
1256        .cfg_dec = CIPH_DECR | MOD_DES | MOD_ECB | KEYLEN_192,
1257}, {
1258        .crypto = {
1259                .cra_name       = "cbc(des3_ede)",
1260                .cra_blocksize  = DES3_EDE_BLOCK_SIZE,
1261                .cra_u          = { .ablkcipher = {
1262                        .min_keysize    = DES3_EDE_KEY_SIZE,
1263                        .max_keysize    = DES3_EDE_KEY_SIZE,
1264                        .ivsize         = DES3_EDE_BLOCK_SIZE,
1265                        .geniv          = "eseqiv",
1266                        }
1267                }
1268        },
1269        .cfg_enc = CIPH_ENCR | MOD_3DES | MOD_CBC_ENC | KEYLEN_192,
1270        .cfg_dec = CIPH_DECR | MOD_3DES | MOD_CBC_DEC | KEYLEN_192,
1271}, {
1272        .crypto = {
1273                .cra_name       = "ecb(des3_ede)",
1274                .cra_blocksize  = DES3_EDE_BLOCK_SIZE,
1275                .cra_u          = { .ablkcipher = {
1276                        .min_keysize    = DES3_EDE_KEY_SIZE,
1277                        .max_keysize    = DES3_EDE_KEY_SIZE,
1278                        }
1279                }
1280        },
1281        .cfg_enc = CIPH_ENCR | MOD_3DES | MOD_ECB | KEYLEN_192,
1282        .cfg_dec = CIPH_DECR | MOD_3DES | MOD_ECB | KEYLEN_192,
1283}, {
1284        .crypto = {
1285                .cra_name       = "cbc(aes)",
1286                .cra_blocksize  = AES_BLOCK_SIZE,
1287                .cra_u          = { .ablkcipher = {
1288                        .min_keysize    = AES_MIN_KEY_SIZE,
1289                        .max_keysize    = AES_MAX_KEY_SIZE,
1290                        .ivsize         = AES_BLOCK_SIZE,
1291                        .geniv          = "eseqiv",
1292                        }
1293                }
1294        },
1295        .cfg_enc = CIPH_ENCR | MOD_AES | MOD_CBC_ENC,
1296        .cfg_dec = CIPH_DECR | MOD_AES | MOD_CBC_DEC,
1297}, {
1298        .crypto = {
1299                .cra_name       = "ecb(aes)",
1300                .cra_blocksize  = AES_BLOCK_SIZE,
1301                .cra_u          = { .ablkcipher = {
1302                        .min_keysize    = AES_MIN_KEY_SIZE,
1303                        .max_keysize    = AES_MAX_KEY_SIZE,
1304                        }
1305                }
1306        },
1307        .cfg_enc = CIPH_ENCR | MOD_AES | MOD_ECB,
1308        .cfg_dec = CIPH_DECR | MOD_AES | MOD_ECB,
1309}, {
1310        .crypto = {
1311                .cra_name       = "ctr(aes)",
1312                .cra_blocksize  = AES_BLOCK_SIZE,
1313                .cra_u          = { .ablkcipher = {
1314                        .min_keysize    = AES_MIN_KEY_SIZE,
1315                        .max_keysize    = AES_MAX_KEY_SIZE,
1316                        .ivsize         = AES_BLOCK_SIZE,
1317                        .geniv          = "eseqiv",
1318                        }
1319                }
1320        },
1321        .cfg_enc = CIPH_ENCR | MOD_AES | MOD_CTR,
1322        .cfg_dec = CIPH_ENCR | MOD_AES | MOD_CTR,
1323}, {
1324        .crypto = {
1325                .cra_name       = "rfc3686(ctr(aes))",
1326                .cra_blocksize  = AES_BLOCK_SIZE,
1327                .cra_u          = { .ablkcipher = {
1328                        .min_keysize    = AES_MIN_KEY_SIZE,
1329                        .max_keysize    = AES_MAX_KEY_SIZE,
1330                        .ivsize         = AES_BLOCK_SIZE,
1331                        .geniv          = "eseqiv",
1332                        .setkey         = ablk_rfc3686_setkey,
1333                        .encrypt        = ablk_rfc3686_crypt,
1334                        .decrypt        = ablk_rfc3686_crypt }
1335                }
1336        },
1337        .cfg_enc = CIPH_ENCR | MOD_AES | MOD_CTR,
1338        .cfg_dec = CIPH_ENCR | MOD_AES | MOD_CTR,
1339}, {
1340        .crypto = {
1341                .cra_name       = "authenc(hmac(md5),cbc(des))",
1342                .cra_blocksize  = DES_BLOCK_SIZE,
1343                .cra_u          = { .aead = {
1344                        .ivsize         = DES_BLOCK_SIZE,
1345                        .maxauthsize    = MD5_DIGEST_SIZE,
1346                        }
1347                }
1348        },
1349        .hash = &hash_alg_md5,
1350        .cfg_enc = CIPH_ENCR | MOD_DES | MOD_CBC_ENC | KEYLEN_192,
1351        .cfg_dec = CIPH_DECR | MOD_DES | MOD_CBC_DEC | KEYLEN_192,
1352}, {
1353        .crypto = {
1354                .cra_name       = "authenc(hmac(md5),cbc(des3_ede))",
1355                .cra_blocksize  = DES3_EDE_BLOCK_SIZE,
1356                .cra_u          = { .aead = {
1357                        .ivsize         = DES3_EDE_BLOCK_SIZE,
1358                        .maxauthsize    = MD5_DIGEST_SIZE,
1359                        }
1360                }
1361        },
1362        .hash = &hash_alg_md5,
1363        .cfg_enc = CIPH_ENCR | MOD_3DES | MOD_CBC_ENC | KEYLEN_192,
1364        .cfg_dec = CIPH_DECR | MOD_3DES | MOD_CBC_DEC | KEYLEN_192,
1365}, {
1366        .crypto = {
1367                .cra_name       = "authenc(hmac(sha1),cbc(des))",
1368                .cra_blocksize  = DES_BLOCK_SIZE,
1369                .cra_u          = { .aead = {
1370                        .ivsize         = DES_BLOCK_SIZE,
1371                        .maxauthsize    = SHA1_DIGEST_SIZE,
1372                        }
1373                }
1374        },
1375        .hash = &hash_alg_sha1,
1376        .cfg_enc = CIPH_ENCR | MOD_DES | MOD_CBC_ENC | KEYLEN_192,
1377        .cfg_dec = CIPH_DECR | MOD_DES | MOD_CBC_DEC | KEYLEN_192,
1378}, {
1379        .crypto = {
1380                .cra_name       = "authenc(hmac(sha1),cbc(des3_ede))",
1381                .cra_blocksize  = DES3_EDE_BLOCK_SIZE,
1382                .cra_u          = { .aead = {
1383                        .ivsize         = DES3_EDE_BLOCK_SIZE,
1384                        .maxauthsize    = SHA1_DIGEST_SIZE,
1385                        }
1386                }
1387        },
1388        .hash = &hash_alg_sha1,
1389        .cfg_enc = CIPH_ENCR | MOD_3DES | MOD_CBC_ENC | KEYLEN_192,
1390        .cfg_dec = CIPH_DECR | MOD_3DES | MOD_CBC_DEC | KEYLEN_192,
1391}, {
1392        .crypto = {
1393                .cra_name       = "authenc(hmac(md5),cbc(aes))",
1394                .cra_blocksize  = AES_BLOCK_SIZE,
1395                .cra_u          = { .aead = {
1396                        .ivsize         = AES_BLOCK_SIZE,
1397                        .maxauthsize    = MD5_DIGEST_SIZE,
1398                        }
1399                }
1400        },
1401        .hash = &hash_alg_md5,
1402        .cfg_enc = CIPH_ENCR | MOD_AES | MOD_CBC_ENC,
1403        .cfg_dec = CIPH_DECR | MOD_AES | MOD_CBC_DEC,
1404}, {
1405        .crypto = {
1406                .cra_name       = "authenc(hmac(sha1),cbc(aes))",
1407                .cra_blocksize  = AES_BLOCK_SIZE,
1408                .cra_u          = { .aead = {
1409                        .ivsize         = AES_BLOCK_SIZE,
1410                        .maxauthsize    = SHA1_DIGEST_SIZE,
1411                        }
1412                }
1413        },
1414        .hash = &hash_alg_sha1,
1415        .cfg_enc = CIPH_ENCR | MOD_AES | MOD_CBC_ENC,
1416        .cfg_dec = CIPH_DECR | MOD_AES | MOD_CBC_DEC,
1417} };
1418
1419#define IXP_POSTFIX "-ixp4xx"
1420static int __init ixp_module_init(void)
1421{
1422        int num = ARRAY_SIZE(ixp4xx_algos);
1423        int i,err ;
1424
1425        if (platform_device_register(&pseudo_dev))
1426                return -ENODEV;
1427
1428        spin_lock_init(&desc_lock);
1429        spin_lock_init(&emerg_lock);
1430
1431        err = init_ixp_crypto();
1432        if (err) {
1433                platform_device_unregister(&pseudo_dev);
1434                return err;
1435        }
1436        for (i=0; i< num; i++) {
1437                struct crypto_alg *cra = &ixp4xx_algos[i].crypto;
1438
1439                if (snprintf(cra->cra_driver_name, CRYPTO_MAX_ALG_NAME,
1440                        "%s"IXP_POSTFIX, cra->cra_name) >=
1441                        CRYPTO_MAX_ALG_NAME)
1442                {
1443                        continue;
1444                }
1445                if (!support_aes && (ixp4xx_algos[i].cfg_enc & MOD_AES)) {
1446                        continue;
1447                }
1448                if (!ixp4xx_algos[i].hash) {
1449                        /* block ciphers */
1450                        cra->cra_type = &crypto_ablkcipher_type;
1451                        cra->cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER |
1452                                         CRYPTO_ALG_ASYNC;
1453                        if (!cra->cra_ablkcipher.setkey)
1454                                cra->cra_ablkcipher.setkey = ablk_setkey;
1455                        if (!cra->cra_ablkcipher.encrypt)
1456                                cra->cra_ablkcipher.encrypt = ablk_encrypt;
1457                        if (!cra->cra_ablkcipher.decrypt)
1458                                cra->cra_ablkcipher.decrypt = ablk_decrypt;
1459                        cra->cra_init = init_tfm_ablk;
1460                } else {
1461                        /* authenc */
1462                        cra->cra_type = &crypto_aead_type;
1463                        cra->cra_flags = CRYPTO_ALG_TYPE_AEAD |
1464                                         CRYPTO_ALG_ASYNC;
1465                        cra->cra_aead.setkey = aead_setkey;
1466                        cra->cra_aead.setauthsize = aead_setauthsize;
1467                        cra->cra_aead.encrypt = aead_encrypt;
1468                        cra->cra_aead.decrypt = aead_decrypt;
1469                        cra->cra_aead.givencrypt = aead_givencrypt;
1470                        cra->cra_init = init_tfm_aead;
1471                }
1472                cra->cra_ctxsize = sizeof(struct ixp_ctx);
1473                cra->cra_module = THIS_MODULE;
1474                cra->cra_alignmask = 3;
1475                cra->cra_priority = 300;
1476                cra->cra_exit = exit_tfm;
1477                if (crypto_register_alg(cra))
1478                        printk(KERN_ERR "Failed to register '%s'\n",
1479                                cra->cra_name);
1480                else
1481                        ixp4xx_algos[i].registered = 1;
1482        }
1483        return 0;
1484}
1485
1486static void __exit ixp_module_exit(void)
1487{
1488        int num = ARRAY_SIZE(ixp4xx_algos);
1489        int i;
1490
1491        for (i=0; i< num; i++) {
1492                if (ixp4xx_algos[i].registered)
1493                        crypto_unregister_alg(&ixp4xx_algos[i].crypto);
1494        }
1495        release_ixp_crypto();
1496        platform_device_unregister(&pseudo_dev);
1497}
1498
1499module_init(ixp_module_init);
1500module_exit(ixp_module_exit);
1501
1502MODULE_LICENSE("GPL");
1503MODULE_AUTHOR("Christian Hohnstaedt <chohnstaedt@innominate.com>");
1504MODULE_DESCRIPTION("IXP4xx hardware crypto");
1505
1506