linux/arch/s390/crypto/aes_s390.c
<<
>>
Prefs
   1/*
   2 * Cryptographic API.
   3 *
   4 * s390 implementation of the AES Cipher Algorithm.
   5 *
   6 * s390 Version:
   7 *   Copyright IBM Corp. 2005,2007
   8 *   Author(s): Jan Glauber (jang@de.ibm.com)
   9 *              Sebastian Siewior (sebastian@breakpoint.cc> SW-Fallback
  10 *
  11 * Derived from "crypto/aes_generic.c"
  12 *
  13 * This program is free software; you can redistribute it and/or modify it
  14 * under the terms of the GNU General Public License as published by the Free
  15 * Software Foundation; either version 2 of the License, or (at your option)
  16 * any later version.
  17 *
  18 */
  19
  20#define KMSG_COMPONENT "aes_s390"
  21#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
  22
  23#include <crypto/aes.h>
  24#include <crypto/algapi.h>
  25#include <linux/err.h>
  26#include <linux/module.h>
  27#include <linux/init.h>
  28#include "crypt_s390.h"
  29
  30#define AES_KEYLEN_128          1
  31#define AES_KEYLEN_192          2
  32#define AES_KEYLEN_256          4
  33
  34static u8 *ctrblk;
  35static char keylen_flag;
  36
  37struct s390_aes_ctx {
  38        u8 iv[AES_BLOCK_SIZE];
  39        u8 key[AES_MAX_KEY_SIZE];
  40        long enc;
  41        long dec;
  42        int key_len;
  43        union {
  44                struct crypto_blkcipher *blk;
  45                struct crypto_cipher *cip;
  46        } fallback;
  47};
  48
  49struct pcc_param {
  50        u8 key[32];
  51        u8 tweak[16];
  52        u8 block[16];
  53        u8 bit[16];
  54        u8 xts[16];
  55};
  56
  57struct s390_xts_ctx {
  58        u8 key[32];
  59        u8 xts_param[16];
  60        struct pcc_param pcc;
  61        long enc;
  62        long dec;
  63        int key_len;
  64        struct crypto_blkcipher *fallback;
  65};
  66
  67/*
  68 * Check if the key_len is supported by the HW.
  69 * Returns 0 if it is, a positive number if it is not and software fallback is
  70 * required or a negative number in case the key size is not valid
  71 */
  72static int need_fallback(unsigned int key_len)
  73{
  74        switch (key_len) {
  75        case 16:
  76                if (!(keylen_flag & AES_KEYLEN_128))
  77                        return 1;
  78                break;
  79        case 24:
  80                if (!(keylen_flag & AES_KEYLEN_192))
  81                        return 1;
  82                break;
  83        case 32:
  84                if (!(keylen_flag & AES_KEYLEN_256))
  85                        return 1;
  86                break;
  87        default:
  88                return -1;
  89                break;
  90        }
  91        return 0;
  92}
  93
  94static int setkey_fallback_cip(struct crypto_tfm *tfm, const u8 *in_key,
  95                unsigned int key_len)
  96{
  97        struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm);
  98        int ret;
  99
 100        sctx->fallback.cip->base.crt_flags &= ~CRYPTO_TFM_REQ_MASK;
 101        sctx->fallback.cip->base.crt_flags |= (tfm->crt_flags &
 102                        CRYPTO_TFM_REQ_MASK);
 103
 104        ret = crypto_cipher_setkey(sctx->fallback.cip, in_key, key_len);
 105        if (ret) {
 106                tfm->crt_flags &= ~CRYPTO_TFM_RES_MASK;
 107                tfm->crt_flags |= (sctx->fallback.cip->base.crt_flags &
 108                                CRYPTO_TFM_RES_MASK);
 109        }
 110        return ret;
 111}
 112
 113static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key,
 114                       unsigned int key_len)
 115{
 116        struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm);
 117        u32 *flags = &tfm->crt_flags;
 118        int ret;
 119
 120        ret = need_fallback(key_len);
 121        if (ret < 0) {
 122                *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
 123                return -EINVAL;
 124        }
 125
 126        sctx->key_len = key_len;
 127        if (!ret) {
 128                memcpy(sctx->key, in_key, key_len);
 129                return 0;
 130        }
 131
 132        return setkey_fallback_cip(tfm, in_key, key_len);
 133}
 134
 135static void aes_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
 136{
 137        const struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm);
 138
 139        if (unlikely(need_fallback(sctx->key_len))) {
 140                crypto_cipher_encrypt_one(sctx->fallback.cip, out, in);
 141                return;
 142        }
 143
 144        switch (sctx->key_len) {
 145        case 16:
 146                crypt_s390_km(KM_AES_128_ENCRYPT, &sctx->key, out, in,
 147                              AES_BLOCK_SIZE);
 148                break;
 149        case 24:
 150                crypt_s390_km(KM_AES_192_ENCRYPT, &sctx->key, out, in,
 151                              AES_BLOCK_SIZE);
 152                break;
 153        case 32:
 154                crypt_s390_km(KM_AES_256_ENCRYPT, &sctx->key, out, in,
 155                              AES_BLOCK_SIZE);
 156                break;
 157        }
 158}
 159
 160static void aes_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
 161{
 162        const struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm);
 163
 164        if (unlikely(need_fallback(sctx->key_len))) {
 165                crypto_cipher_decrypt_one(sctx->fallback.cip, out, in);
 166                return;
 167        }
 168
 169        switch (sctx->key_len) {
 170        case 16:
 171                crypt_s390_km(KM_AES_128_DECRYPT, &sctx->key, out, in,
 172                              AES_BLOCK_SIZE);
 173                break;
 174        case 24:
 175                crypt_s390_km(KM_AES_192_DECRYPT, &sctx->key, out, in,
 176                              AES_BLOCK_SIZE);
 177                break;
 178        case 32:
 179                crypt_s390_km(KM_AES_256_DECRYPT, &sctx->key, out, in,
 180                              AES_BLOCK_SIZE);
 181                break;
 182        }
 183}
 184
 185static int fallback_init_cip(struct crypto_tfm *tfm)
 186{
 187        const char *name = tfm->__crt_alg->cra_name;
 188        struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm);
 189
 190        sctx->fallback.cip = crypto_alloc_cipher(name, 0,
 191                        CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK);
 192
 193        if (IS_ERR(sctx->fallback.cip)) {
 194                pr_err("Allocating AES fallback algorithm %s failed\n",
 195                       name);
 196                return PTR_ERR(sctx->fallback.cip);
 197        }
 198
 199        return 0;
 200}
 201
 202static void fallback_exit_cip(struct crypto_tfm *tfm)
 203{
 204        struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm);
 205
 206        crypto_free_cipher(sctx->fallback.cip);
 207        sctx->fallback.cip = NULL;
 208}
 209
 210static struct crypto_alg aes_alg = {
 211        .cra_name               =       "aes",
 212        .cra_driver_name        =       "aes-s390",
 213        .cra_priority           =       CRYPT_S390_PRIORITY,
 214        .cra_flags              =       CRYPTO_ALG_TYPE_CIPHER |
 215                                        CRYPTO_ALG_NEED_FALLBACK,
 216        .cra_blocksize          =       AES_BLOCK_SIZE,
 217        .cra_ctxsize            =       sizeof(struct s390_aes_ctx),
 218        .cra_module             =       THIS_MODULE,
 219        .cra_list               =       LIST_HEAD_INIT(aes_alg.cra_list),
 220        .cra_init               =       fallback_init_cip,
 221        .cra_exit               =       fallback_exit_cip,
 222        .cra_u                  =       {
 223                .cipher = {
 224                        .cia_min_keysize        =       AES_MIN_KEY_SIZE,
 225                        .cia_max_keysize        =       AES_MAX_KEY_SIZE,
 226                        .cia_setkey             =       aes_set_key,
 227                        .cia_encrypt            =       aes_encrypt,
 228                        .cia_decrypt            =       aes_decrypt,
 229                }
 230        }
 231};
 232
 233static int setkey_fallback_blk(struct crypto_tfm *tfm, const u8 *key,
 234                unsigned int len)
 235{
 236        struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm);
 237        unsigned int ret;
 238
 239        sctx->fallback.blk->base.crt_flags &= ~CRYPTO_TFM_REQ_MASK;
 240        sctx->fallback.blk->base.crt_flags |= (tfm->crt_flags &
 241                        CRYPTO_TFM_REQ_MASK);
 242
 243        ret = crypto_blkcipher_setkey(sctx->fallback.blk, key, len);
 244        if (ret) {
 245                tfm->crt_flags &= ~CRYPTO_TFM_RES_MASK;
 246                tfm->crt_flags |= (sctx->fallback.blk->base.crt_flags &
 247                                CRYPTO_TFM_RES_MASK);
 248        }
 249        return ret;
 250}
 251
 252static int fallback_blk_dec(struct blkcipher_desc *desc,
 253                struct scatterlist *dst, struct scatterlist *src,
 254                unsigned int nbytes)
 255{
 256        unsigned int ret;
 257        struct crypto_blkcipher *tfm;
 258        struct s390_aes_ctx *sctx = crypto_blkcipher_ctx(desc->tfm);
 259
 260        tfm = desc->tfm;
 261        desc->tfm = sctx->fallback.blk;
 262
 263        ret = crypto_blkcipher_decrypt_iv(desc, dst, src, nbytes);
 264
 265        desc->tfm = tfm;
 266        return ret;
 267}
 268
 269static int fallback_blk_enc(struct blkcipher_desc *desc,
 270                struct scatterlist *dst, struct scatterlist *src,
 271                unsigned int nbytes)
 272{
 273        unsigned int ret;
 274        struct crypto_blkcipher *tfm;
 275        struct s390_aes_ctx *sctx = crypto_blkcipher_ctx(desc->tfm);
 276
 277        tfm = desc->tfm;
 278        desc->tfm = sctx->fallback.blk;
 279
 280        ret = crypto_blkcipher_encrypt_iv(desc, dst, src, nbytes);
 281
 282        desc->tfm = tfm;
 283        return ret;
 284}
 285
 286static int ecb_aes_set_key(struct crypto_tfm *tfm, const u8 *in_key,
 287                           unsigned int key_len)
 288{
 289        struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm);
 290        int ret;
 291
 292        ret = need_fallback(key_len);
 293        if (ret > 0) {
 294                sctx->key_len = key_len;
 295                return setkey_fallback_blk(tfm, in_key, key_len);
 296        }
 297
 298        switch (key_len) {
 299        case 16:
 300                sctx->enc = KM_AES_128_ENCRYPT;
 301                sctx->dec = KM_AES_128_DECRYPT;
 302                break;
 303        case 24:
 304                sctx->enc = KM_AES_192_ENCRYPT;
 305                sctx->dec = KM_AES_192_DECRYPT;
 306                break;
 307        case 32:
 308                sctx->enc = KM_AES_256_ENCRYPT;
 309                sctx->dec = KM_AES_256_DECRYPT;
 310                break;
 311        }
 312
 313        return aes_set_key(tfm, in_key, key_len);
 314}
 315
 316static int ecb_aes_crypt(struct blkcipher_desc *desc, long func, void *param,
 317                         struct blkcipher_walk *walk)
 318{
 319        int ret = blkcipher_walk_virt(desc, walk);
 320        unsigned int nbytes;
 321
 322        while ((nbytes = walk->nbytes)) {
 323                /* only use complete blocks */
 324                unsigned int n = nbytes & ~(AES_BLOCK_SIZE - 1);
 325                u8 *out = walk->dst.virt.addr;
 326                u8 *in = walk->src.virt.addr;
 327
 328                ret = crypt_s390_km(func, param, out, in, n);
 329                BUG_ON((ret < 0) || (ret != n));
 330
 331                nbytes &= AES_BLOCK_SIZE - 1;
 332                ret = blkcipher_walk_done(desc, walk, nbytes);
 333        }
 334
 335        return ret;
 336}
 337
 338static int ecb_aes_encrypt(struct blkcipher_desc *desc,
 339                           struct scatterlist *dst, struct scatterlist *src,
 340                           unsigned int nbytes)
 341{
 342        struct s390_aes_ctx *sctx = crypto_blkcipher_ctx(desc->tfm);
 343        struct blkcipher_walk walk;
 344
 345        if (unlikely(need_fallback(sctx->key_len)))
 346                return fallback_blk_enc(desc, dst, src, nbytes);
 347
 348        blkcipher_walk_init(&walk, dst, src, nbytes);
 349        return ecb_aes_crypt(desc, sctx->enc, sctx->key, &walk);
 350}
 351
 352static int ecb_aes_decrypt(struct blkcipher_desc *desc,
 353                           struct scatterlist *dst, struct scatterlist *src,
 354                           unsigned int nbytes)
 355{
 356        struct s390_aes_ctx *sctx = crypto_blkcipher_ctx(desc->tfm);
 357        struct blkcipher_walk walk;
 358
 359        if (unlikely(need_fallback(sctx->key_len)))
 360                return fallback_blk_dec(desc, dst, src, nbytes);
 361
 362        blkcipher_walk_init(&walk, dst, src, nbytes);
 363        return ecb_aes_crypt(desc, sctx->dec, sctx->key, &walk);
 364}
 365
 366static int fallback_init_blk(struct crypto_tfm *tfm)
 367{
 368        const char *name = tfm->__crt_alg->cra_name;
 369        struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm);
 370
 371        sctx->fallback.blk = crypto_alloc_blkcipher(name, 0,
 372                        CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK);
 373
 374        if (IS_ERR(sctx->fallback.blk)) {
 375                pr_err("Allocating AES fallback algorithm %s failed\n",
 376                       name);
 377                return PTR_ERR(sctx->fallback.blk);
 378        }
 379
 380        return 0;
 381}
 382
 383static void fallback_exit_blk(struct crypto_tfm *tfm)
 384{
 385        struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm);
 386
 387        crypto_free_blkcipher(sctx->fallback.blk);
 388        sctx->fallback.blk = NULL;
 389}
 390
 391static struct crypto_alg ecb_aes_alg = {
 392        .cra_name               =       "ecb(aes)",
 393        .cra_driver_name        =       "ecb-aes-s390",
 394        .cra_priority           =       CRYPT_S390_COMPOSITE_PRIORITY,
 395        .cra_flags              =       CRYPTO_ALG_TYPE_BLKCIPHER |
 396                                        CRYPTO_ALG_NEED_FALLBACK,
 397        .cra_blocksize          =       AES_BLOCK_SIZE,
 398        .cra_ctxsize            =       sizeof(struct s390_aes_ctx),
 399        .cra_type               =       &crypto_blkcipher_type,
 400        .cra_module             =       THIS_MODULE,
 401        .cra_list               =       LIST_HEAD_INIT(ecb_aes_alg.cra_list),
 402        .cra_init               =       fallback_init_blk,
 403        .cra_exit               =       fallback_exit_blk,
 404        .cra_u                  =       {
 405                .blkcipher = {
 406                        .min_keysize            =       AES_MIN_KEY_SIZE,
 407                        .max_keysize            =       AES_MAX_KEY_SIZE,
 408                        .setkey                 =       ecb_aes_set_key,
 409                        .encrypt                =       ecb_aes_encrypt,
 410                        .decrypt                =       ecb_aes_decrypt,
 411                }
 412        }
 413};
 414
 415static int cbc_aes_set_key(struct crypto_tfm *tfm, const u8 *in_key,
 416                           unsigned int key_len)
 417{
 418        struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm);
 419        int ret;
 420
 421        ret = need_fallback(key_len);
 422        if (ret > 0) {
 423                sctx->key_len = key_len;
 424                return setkey_fallback_blk(tfm, in_key, key_len);
 425        }
 426
 427        switch (key_len) {
 428        case 16:
 429                sctx->enc = KMC_AES_128_ENCRYPT;
 430                sctx->dec = KMC_AES_128_DECRYPT;
 431                break;
 432        case 24:
 433                sctx->enc = KMC_AES_192_ENCRYPT;
 434                sctx->dec = KMC_AES_192_DECRYPT;
 435                break;
 436        case 32:
 437                sctx->enc = KMC_AES_256_ENCRYPT;
 438                sctx->dec = KMC_AES_256_DECRYPT;
 439                break;
 440        }
 441
 442        return aes_set_key(tfm, in_key, key_len);
 443}
 444
 445static int cbc_aes_crypt(struct blkcipher_desc *desc, long func, void *param,
 446                         struct blkcipher_walk *walk)
 447{
 448        int ret = blkcipher_walk_virt(desc, walk);
 449        unsigned int nbytes = walk->nbytes;
 450
 451        if (!nbytes)
 452                goto out;
 453
 454        memcpy(param, walk->iv, AES_BLOCK_SIZE);
 455        do {
 456                /* only use complete blocks */
 457                unsigned int n = nbytes & ~(AES_BLOCK_SIZE - 1);
 458                u8 *out = walk->dst.virt.addr;
 459                u8 *in = walk->src.virt.addr;
 460
 461                ret = crypt_s390_kmc(func, param, out, in, n);
 462                BUG_ON((ret < 0) || (ret != n));
 463
 464                nbytes &= AES_BLOCK_SIZE - 1;
 465                ret = blkcipher_walk_done(desc, walk, nbytes);
 466        } while ((nbytes = walk->nbytes));
 467        memcpy(walk->iv, param, AES_BLOCK_SIZE);
 468
 469out:
 470        return ret;
 471}
 472
 473static int cbc_aes_encrypt(struct blkcipher_desc *desc,
 474                           struct scatterlist *dst, struct scatterlist *src,
 475                           unsigned int nbytes)
 476{
 477        struct s390_aes_ctx *sctx = crypto_blkcipher_ctx(desc->tfm);
 478        struct blkcipher_walk walk;
 479
 480        if (unlikely(need_fallback(sctx->key_len)))
 481                return fallback_blk_enc(desc, dst, src, nbytes);
 482
 483        blkcipher_walk_init(&walk, dst, src, nbytes);
 484        return cbc_aes_crypt(desc, sctx->enc, sctx->iv, &walk);
 485}
 486
 487static int cbc_aes_decrypt(struct blkcipher_desc *desc,
 488                           struct scatterlist *dst, struct scatterlist *src,
 489                           unsigned int nbytes)
 490{
 491        struct s390_aes_ctx *sctx = crypto_blkcipher_ctx(desc->tfm);
 492        struct blkcipher_walk walk;
 493
 494        if (unlikely(need_fallback(sctx->key_len)))
 495                return fallback_blk_dec(desc, dst, src, nbytes);
 496
 497        blkcipher_walk_init(&walk, dst, src, nbytes);
 498        return cbc_aes_crypt(desc, sctx->dec, sctx->iv, &walk);
 499}
 500
 501static struct crypto_alg cbc_aes_alg = {
 502        .cra_name               =       "cbc(aes)",
 503        .cra_driver_name        =       "cbc-aes-s390",
 504        .cra_priority           =       CRYPT_S390_COMPOSITE_PRIORITY,
 505        .cra_flags              =       CRYPTO_ALG_TYPE_BLKCIPHER |
 506                                        CRYPTO_ALG_NEED_FALLBACK,
 507        .cra_blocksize          =       AES_BLOCK_SIZE,
 508        .cra_ctxsize            =       sizeof(struct s390_aes_ctx),
 509        .cra_type               =       &crypto_blkcipher_type,
 510        .cra_module             =       THIS_MODULE,
 511        .cra_list               =       LIST_HEAD_INIT(cbc_aes_alg.cra_list),
 512        .cra_init               =       fallback_init_blk,
 513        .cra_exit               =       fallback_exit_blk,
 514        .cra_u                  =       {
 515                .blkcipher = {
 516                        .min_keysize            =       AES_MIN_KEY_SIZE,
 517                        .max_keysize            =       AES_MAX_KEY_SIZE,
 518                        .ivsize                 =       AES_BLOCK_SIZE,
 519                        .setkey                 =       cbc_aes_set_key,
 520                        .encrypt                =       cbc_aes_encrypt,
 521                        .decrypt                =       cbc_aes_decrypt,
 522                }
 523        }
 524};
 525
 526static int xts_fallback_setkey(struct crypto_tfm *tfm, const u8 *key,
 527                                   unsigned int len)
 528{
 529        struct s390_xts_ctx *xts_ctx = crypto_tfm_ctx(tfm);
 530        unsigned int ret;
 531
 532        xts_ctx->fallback->base.crt_flags &= ~CRYPTO_TFM_REQ_MASK;
 533        xts_ctx->fallback->base.crt_flags |= (tfm->crt_flags &
 534                        CRYPTO_TFM_REQ_MASK);
 535
 536        ret = crypto_blkcipher_setkey(xts_ctx->fallback, key, len);
 537        if (ret) {
 538                tfm->crt_flags &= ~CRYPTO_TFM_RES_MASK;
 539                tfm->crt_flags |= (xts_ctx->fallback->base.crt_flags &
 540                                CRYPTO_TFM_RES_MASK);
 541        }
 542        return ret;
 543}
 544
 545static int xts_fallback_decrypt(struct blkcipher_desc *desc,
 546                struct scatterlist *dst, struct scatterlist *src,
 547                unsigned int nbytes)
 548{
 549        struct s390_xts_ctx *xts_ctx = crypto_blkcipher_ctx(desc->tfm);
 550        struct crypto_blkcipher *tfm;
 551        unsigned int ret;
 552
 553        tfm = desc->tfm;
 554        desc->tfm = xts_ctx->fallback;
 555
 556        ret = crypto_blkcipher_decrypt_iv(desc, dst, src, nbytes);
 557
 558        desc->tfm = tfm;
 559        return ret;
 560}
 561
 562static int xts_fallback_encrypt(struct blkcipher_desc *desc,
 563                struct scatterlist *dst, struct scatterlist *src,
 564                unsigned int nbytes)
 565{
 566        struct s390_xts_ctx *xts_ctx = crypto_blkcipher_ctx(desc->tfm);
 567        struct crypto_blkcipher *tfm;
 568        unsigned int ret;
 569
 570        tfm = desc->tfm;
 571        desc->tfm = xts_ctx->fallback;
 572
 573        ret = crypto_blkcipher_encrypt_iv(desc, dst, src, nbytes);
 574
 575        desc->tfm = tfm;
 576        return ret;
 577}
 578
 579static int xts_aes_set_key(struct crypto_tfm *tfm, const u8 *in_key,
 580                           unsigned int key_len)
 581{
 582        struct s390_xts_ctx *xts_ctx = crypto_tfm_ctx(tfm);
 583        u32 *flags = &tfm->crt_flags;
 584
 585        switch (key_len) {
 586        case 32:
 587                xts_ctx->enc = KM_XTS_128_ENCRYPT;
 588                xts_ctx->dec = KM_XTS_128_DECRYPT;
 589                memcpy(xts_ctx->key + 16, in_key, 16);
 590                memcpy(xts_ctx->pcc.key + 16, in_key + 16, 16);
 591                break;
 592        case 48:
 593                xts_ctx->enc = 0;
 594                xts_ctx->dec = 0;
 595                xts_fallback_setkey(tfm, in_key, key_len);
 596                break;
 597        case 64:
 598                xts_ctx->enc = KM_XTS_256_ENCRYPT;
 599                xts_ctx->dec = KM_XTS_256_DECRYPT;
 600                memcpy(xts_ctx->key, in_key, 32);
 601                memcpy(xts_ctx->pcc.key, in_key + 32, 32);
 602                break;
 603        default:
 604                *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
 605                return -EINVAL;
 606        }
 607        xts_ctx->key_len = key_len;
 608        return 0;
 609}
 610
 611static int xts_aes_crypt(struct blkcipher_desc *desc, long func,
 612                         struct s390_xts_ctx *xts_ctx,
 613                         struct blkcipher_walk *walk)
 614{
 615        unsigned int offset = (xts_ctx->key_len >> 1) & 0x10;
 616        int ret = blkcipher_walk_virt(desc, walk);
 617        unsigned int nbytes = walk->nbytes;
 618        unsigned int n;
 619        u8 *in, *out;
 620        void *param;
 621
 622        if (!nbytes)
 623                goto out;
 624
 625        memset(xts_ctx->pcc.block, 0, sizeof(xts_ctx->pcc.block));
 626        memset(xts_ctx->pcc.bit, 0, sizeof(xts_ctx->pcc.bit));
 627        memset(xts_ctx->pcc.xts, 0, sizeof(xts_ctx->pcc.xts));
 628        memcpy(xts_ctx->pcc.tweak, walk->iv, sizeof(xts_ctx->pcc.tweak));
 629        param = xts_ctx->pcc.key + offset;
 630        ret = crypt_s390_pcc(func, param);
 631        BUG_ON(ret < 0);
 632
 633        memcpy(xts_ctx->xts_param, xts_ctx->pcc.xts, 16);
 634        param = xts_ctx->key + offset;
 635        do {
 636                /* only use complete blocks */
 637                n = nbytes & ~(AES_BLOCK_SIZE - 1);
 638                out = walk->dst.virt.addr;
 639                in = walk->src.virt.addr;
 640
 641                ret = crypt_s390_km(func, param, out, in, n);
 642                BUG_ON(ret < 0 || ret != n);
 643
 644                nbytes &= AES_BLOCK_SIZE - 1;
 645                ret = blkcipher_walk_done(desc, walk, nbytes);
 646        } while ((nbytes = walk->nbytes));
 647out:
 648        return ret;
 649}
 650
 651static int xts_aes_encrypt(struct blkcipher_desc *desc,
 652                           struct scatterlist *dst, struct scatterlist *src,
 653                           unsigned int nbytes)
 654{
 655        struct s390_xts_ctx *xts_ctx = crypto_blkcipher_ctx(desc->tfm);
 656        struct blkcipher_walk walk;
 657
 658        if (unlikely(xts_ctx->key_len == 48))
 659                return xts_fallback_encrypt(desc, dst, src, nbytes);
 660
 661        blkcipher_walk_init(&walk, dst, src, nbytes);
 662        return xts_aes_crypt(desc, xts_ctx->enc, xts_ctx, &walk);
 663}
 664
 665static int xts_aes_decrypt(struct blkcipher_desc *desc,
 666                           struct scatterlist *dst, struct scatterlist *src,
 667                           unsigned int nbytes)
 668{
 669        struct s390_xts_ctx *xts_ctx = crypto_blkcipher_ctx(desc->tfm);
 670        struct blkcipher_walk walk;
 671
 672        if (unlikely(xts_ctx->key_len == 48))
 673                return xts_fallback_decrypt(desc, dst, src, nbytes);
 674
 675        blkcipher_walk_init(&walk, dst, src, nbytes);
 676        return xts_aes_crypt(desc, xts_ctx->dec, xts_ctx, &walk);
 677}
 678
 679static int xts_fallback_init(struct crypto_tfm *tfm)
 680{
 681        const char *name = tfm->__crt_alg->cra_name;
 682        struct s390_xts_ctx *xts_ctx = crypto_tfm_ctx(tfm);
 683
 684        xts_ctx->fallback = crypto_alloc_blkcipher(name, 0,
 685                        CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK);
 686
 687        if (IS_ERR(xts_ctx->fallback)) {
 688                pr_err("Allocating XTS fallback algorithm %s failed\n",
 689                       name);
 690                return PTR_ERR(xts_ctx->fallback);
 691        }
 692        return 0;
 693}
 694
 695static void xts_fallback_exit(struct crypto_tfm *tfm)
 696{
 697        struct s390_xts_ctx *xts_ctx = crypto_tfm_ctx(tfm);
 698
 699        crypto_free_blkcipher(xts_ctx->fallback);
 700        xts_ctx->fallback = NULL;
 701}
 702
 703static struct crypto_alg xts_aes_alg = {
 704        .cra_name               =       "xts(aes)",
 705        .cra_driver_name        =       "xts-aes-s390",
 706        .cra_priority           =       CRYPT_S390_COMPOSITE_PRIORITY,
 707        .cra_flags              =       CRYPTO_ALG_TYPE_BLKCIPHER |
 708                                        CRYPTO_ALG_NEED_FALLBACK,
 709        .cra_blocksize          =       AES_BLOCK_SIZE,
 710        .cra_ctxsize            =       sizeof(struct s390_xts_ctx),
 711        .cra_type               =       &crypto_blkcipher_type,
 712        .cra_module             =       THIS_MODULE,
 713        .cra_list               =       LIST_HEAD_INIT(xts_aes_alg.cra_list),
 714        .cra_init               =       xts_fallback_init,
 715        .cra_exit               =       xts_fallback_exit,
 716        .cra_u                  =       {
 717                .blkcipher = {
 718                        .min_keysize            =       2 * AES_MIN_KEY_SIZE,
 719                        .max_keysize            =       2 * AES_MAX_KEY_SIZE,
 720                        .ivsize                 =       AES_BLOCK_SIZE,
 721                        .setkey                 =       xts_aes_set_key,
 722                        .encrypt                =       xts_aes_encrypt,
 723                        .decrypt                =       xts_aes_decrypt,
 724                }
 725        }
 726};
 727
 728static int ctr_aes_set_key(struct crypto_tfm *tfm, const u8 *in_key,
 729                           unsigned int key_len)
 730{
 731        struct s390_aes_ctx *sctx = crypto_tfm_ctx(tfm);
 732
 733        switch (key_len) {
 734        case 16:
 735                sctx->enc = KMCTR_AES_128_ENCRYPT;
 736                sctx->dec = KMCTR_AES_128_DECRYPT;
 737                break;
 738        case 24:
 739                sctx->enc = KMCTR_AES_192_ENCRYPT;
 740                sctx->dec = KMCTR_AES_192_DECRYPT;
 741                break;
 742        case 32:
 743                sctx->enc = KMCTR_AES_256_ENCRYPT;
 744                sctx->dec = KMCTR_AES_256_DECRYPT;
 745                break;
 746        }
 747
 748        return aes_set_key(tfm, in_key, key_len);
 749}
 750
 751static int ctr_aes_crypt(struct blkcipher_desc *desc, long func,
 752                         struct s390_aes_ctx *sctx, struct blkcipher_walk *walk)
 753{
 754        int ret = blkcipher_walk_virt_block(desc, walk, AES_BLOCK_SIZE);
 755        unsigned int i, n, nbytes;
 756        u8 buf[AES_BLOCK_SIZE];
 757        u8 *out, *in;
 758
 759        if (!walk->nbytes)
 760                return ret;
 761
 762        memcpy(ctrblk, walk->iv, AES_BLOCK_SIZE);
 763        while ((nbytes = walk->nbytes) >= AES_BLOCK_SIZE) {
 764                out = walk->dst.virt.addr;
 765                in = walk->src.virt.addr;
 766                while (nbytes >= AES_BLOCK_SIZE) {
 767                        /* only use complete blocks, max. PAGE_SIZE */
 768                        n = (nbytes > PAGE_SIZE) ? PAGE_SIZE :
 769                                                 nbytes & ~(AES_BLOCK_SIZE - 1);
 770                        for (i = AES_BLOCK_SIZE; i < n; i += AES_BLOCK_SIZE) {
 771                                memcpy(ctrblk + i, ctrblk + i - AES_BLOCK_SIZE,
 772                                       AES_BLOCK_SIZE);
 773                                crypto_inc(ctrblk + i, AES_BLOCK_SIZE);
 774                        }
 775                        ret = crypt_s390_kmctr(func, sctx->key, out, in, n, ctrblk);
 776                        BUG_ON(ret < 0 || ret != n);
 777                        if (n > AES_BLOCK_SIZE)
 778                                memcpy(ctrblk, ctrblk + n - AES_BLOCK_SIZE,
 779                                       AES_BLOCK_SIZE);
 780                        crypto_inc(ctrblk, AES_BLOCK_SIZE);
 781                        out += n;
 782                        in += n;
 783                        nbytes -= n;
 784                }
 785                ret = blkcipher_walk_done(desc, walk, nbytes);
 786        }
 787        /*
 788         * final block may be < AES_BLOCK_SIZE, copy only nbytes
 789         */
 790        if (nbytes) {
 791                out = walk->dst.virt.addr;
 792                in = walk->src.virt.addr;
 793                ret = crypt_s390_kmctr(func, sctx->key, buf, in,
 794                                       AES_BLOCK_SIZE, ctrblk);
 795                BUG_ON(ret < 0 || ret != AES_BLOCK_SIZE);
 796                memcpy(out, buf, nbytes);
 797                crypto_inc(ctrblk, AES_BLOCK_SIZE);
 798                ret = blkcipher_walk_done(desc, walk, 0);
 799        }
 800        memcpy(walk->iv, ctrblk, AES_BLOCK_SIZE);
 801        return ret;
 802}
 803
 804static int ctr_aes_encrypt(struct blkcipher_desc *desc,
 805                           struct scatterlist *dst, struct scatterlist *src,
 806                           unsigned int nbytes)
 807{
 808        struct s390_aes_ctx *sctx = crypto_blkcipher_ctx(desc->tfm);
 809        struct blkcipher_walk walk;
 810
 811        blkcipher_walk_init(&walk, dst, src, nbytes);
 812        return ctr_aes_crypt(desc, sctx->enc, sctx, &walk);
 813}
 814
 815static int ctr_aes_decrypt(struct blkcipher_desc *desc,
 816                           struct scatterlist *dst, struct scatterlist *src,
 817                           unsigned int nbytes)
 818{
 819        struct s390_aes_ctx *sctx = crypto_blkcipher_ctx(desc->tfm);
 820        struct blkcipher_walk walk;
 821
 822        blkcipher_walk_init(&walk, dst, src, nbytes);
 823        return ctr_aes_crypt(desc, sctx->dec, sctx, &walk);
 824}
 825
 826static struct crypto_alg ctr_aes_alg = {
 827        .cra_name               =       "ctr(aes)",
 828        .cra_driver_name        =       "ctr-aes-s390",
 829        .cra_priority           =       CRYPT_S390_COMPOSITE_PRIORITY,
 830        .cra_flags              =       CRYPTO_ALG_TYPE_BLKCIPHER,
 831        .cra_blocksize          =       1,
 832        .cra_ctxsize            =       sizeof(struct s390_aes_ctx),
 833        .cra_type               =       &crypto_blkcipher_type,
 834        .cra_module             =       THIS_MODULE,
 835        .cra_list               =       LIST_HEAD_INIT(ctr_aes_alg.cra_list),
 836        .cra_u                  =       {
 837                .blkcipher = {
 838                        .min_keysize            =       AES_MIN_KEY_SIZE,
 839                        .max_keysize            =       AES_MAX_KEY_SIZE,
 840                        .ivsize                 =       AES_BLOCK_SIZE,
 841                        .setkey                 =       ctr_aes_set_key,
 842                        .encrypt                =       ctr_aes_encrypt,
 843                        .decrypt                =       ctr_aes_decrypt,
 844                }
 845        }
 846};
 847
 848static int __init aes_s390_init(void)
 849{
 850        int ret;
 851
 852        if (crypt_s390_func_available(KM_AES_128_ENCRYPT, CRYPT_S390_MSA))
 853                keylen_flag |= AES_KEYLEN_128;
 854        if (crypt_s390_func_available(KM_AES_192_ENCRYPT, CRYPT_S390_MSA))
 855                keylen_flag |= AES_KEYLEN_192;
 856        if (crypt_s390_func_available(KM_AES_256_ENCRYPT, CRYPT_S390_MSA))
 857                keylen_flag |= AES_KEYLEN_256;
 858
 859        if (!keylen_flag)
 860                return -EOPNOTSUPP;
 861
 862        /* z9 109 and z9 BC/EC only support 128 bit key length */
 863        if (keylen_flag == AES_KEYLEN_128)
 864                pr_info("AES hardware acceleration is only available for"
 865                        " 128-bit keys\n");
 866
 867        ret = crypto_register_alg(&aes_alg);
 868        if (ret)
 869                goto aes_err;
 870
 871        ret = crypto_register_alg(&ecb_aes_alg);
 872        if (ret)
 873                goto ecb_aes_err;
 874
 875        ret = crypto_register_alg(&cbc_aes_alg);
 876        if (ret)
 877                goto cbc_aes_err;
 878
 879        if (crypt_s390_func_available(KM_XTS_128_ENCRYPT,
 880                        CRYPT_S390_MSA | CRYPT_S390_MSA4) &&
 881            crypt_s390_func_available(KM_XTS_256_ENCRYPT,
 882                        CRYPT_S390_MSA | CRYPT_S390_MSA4)) {
 883                ret = crypto_register_alg(&xts_aes_alg);
 884                if (ret)
 885                        goto xts_aes_err;
 886        }
 887
 888        if (crypt_s390_func_available(KMCTR_AES_128_ENCRYPT,
 889                                CRYPT_S390_MSA | CRYPT_S390_MSA4) &&
 890            crypt_s390_func_available(KMCTR_AES_192_ENCRYPT,
 891                                CRYPT_S390_MSA | CRYPT_S390_MSA4) &&
 892            crypt_s390_func_available(KMCTR_AES_256_ENCRYPT,
 893                                CRYPT_S390_MSA | CRYPT_S390_MSA4)) {
 894                ctrblk = (u8 *) __get_free_page(GFP_KERNEL);
 895                if (!ctrblk) {
 896                        ret = -ENOMEM;
 897                        goto ctr_aes_err;
 898                }
 899                ret = crypto_register_alg(&ctr_aes_alg);
 900                if (ret) {
 901                        free_page((unsigned long) ctrblk);
 902                        goto ctr_aes_err;
 903                }
 904        }
 905
 906out:
 907        return ret;
 908
 909ctr_aes_err:
 910        crypto_unregister_alg(&xts_aes_alg);
 911xts_aes_err:
 912        crypto_unregister_alg(&cbc_aes_alg);
 913cbc_aes_err:
 914        crypto_unregister_alg(&ecb_aes_alg);
 915ecb_aes_err:
 916        crypto_unregister_alg(&aes_alg);
 917aes_err:
 918        goto out;
 919}
 920
 921static void __exit aes_s390_fini(void)
 922{
 923        crypto_unregister_alg(&ctr_aes_alg);
 924        free_page((unsigned long) ctrblk);
 925        crypto_unregister_alg(&xts_aes_alg);
 926        crypto_unregister_alg(&cbc_aes_alg);
 927        crypto_unregister_alg(&ecb_aes_alg);
 928        crypto_unregister_alg(&aes_alg);
 929}
 930
 931module_init(aes_s390_init);
 932module_exit(aes_s390_fini);
 933
 934MODULE_ALIAS("aes-all");
 935
 936MODULE_DESCRIPTION("Rijndael (AES) Cipher Algorithm");
 937MODULE_LICENSE("GPL");
 938
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.