linux/arch/s390/crypto/sha256_s390.c
<<
>>
Prefs
   1/*
   2 * Cryptographic API.
   3 *
   4 * s390 implementation of the SHA256 and SHA224 Secure Hash Algorithm.
   5 *
   6 * s390 Version:
   7 *   Copyright IBM Corp. 2005, 2011
   8 *   Author(s): Jan Glauber (jang@de.ibm.com)
   9 *
  10 * This program is free software; you can redistribute it and/or modify it
  11 * under the terms of the GNU General Public License as published by the Free
  12 * Software Foundation; either version 2 of the License, or (at your option)
  13 * any later version.
  14 *
  15 */
  16#include <crypto/internal/hash.h>
  17#include <linux/init.h>
  18#include <linux/module.h>
  19#include <crypto/sha.h>
  20#include <asm/cpacf.h>
  21
  22#include "sha.h"
  23
  24static int sha256_init(struct shash_desc *desc)
  25{
  26        struct s390_sha_ctx *sctx = shash_desc_ctx(desc);
  27
  28        sctx->state[0] = SHA256_H0;
  29        sctx->state[1] = SHA256_H1;
  30        sctx->state[2] = SHA256_H2;
  31        sctx->state[3] = SHA256_H3;
  32        sctx->state[4] = SHA256_H4;
  33        sctx->state[5] = SHA256_H5;
  34        sctx->state[6] = SHA256_H6;
  35        sctx->state[7] = SHA256_H7;
  36        sctx->count = 0;
  37        sctx->func = CPACF_KIMD_SHA_256;
  38
  39        return 0;
  40}
  41
  42static int sha256_export(struct shash_desc *desc, void *out)
  43{
  44        struct s390_sha_ctx *sctx = shash_desc_ctx(desc);
  45        struct sha256_state *octx = out;
  46
  47        octx->count = sctx->count;
  48        memcpy(octx->state, sctx->state, sizeof(octx->state));
  49        memcpy(octx->buf, sctx->buf, sizeof(octx->buf));
  50        return 0;
  51}
  52
  53static int sha256_import(struct shash_desc *desc, const void *in)
  54{
  55        struct s390_sha_ctx *sctx = shash_desc_ctx(desc);
  56        const struct sha256_state *ictx = in;
  57
  58        sctx->count = ictx->count;
  59        memcpy(sctx->state, ictx->state, sizeof(ictx->state));
  60        memcpy(sctx->buf, ictx->buf, sizeof(ictx->buf));
  61        sctx->func = CPACF_KIMD_SHA_256;
  62        return 0;
  63}
  64
  65static struct shash_alg sha256_alg = {
  66        .digestsize     =       SHA256_DIGEST_SIZE,
  67        .init           =       sha256_init,
  68        .update         =       s390_sha_update,
  69        .final          =       s390_sha_final,
  70        .export         =       sha256_export,
  71        .import         =       sha256_import,
  72        .descsize       =       sizeof(struct s390_sha_ctx),
  73        .statesize      =       sizeof(struct sha256_state),
  74        .base           =       {
  75                .cra_name       =       "sha256",
  76                .cra_driver_name=       "sha256-s390",
  77                .cra_priority   =       300,
  78                .cra_flags      =       CRYPTO_ALG_TYPE_SHASH,
  79                .cra_blocksize  =       SHA256_BLOCK_SIZE,
  80                .cra_module     =       THIS_MODULE,
  81        }
  82};
  83
  84static int sha224_init(struct shash_desc *desc)
  85{
  86        struct s390_sha_ctx *sctx = shash_desc_ctx(desc);
  87
  88        sctx->state[0] = SHA224_H0;
  89        sctx->state[1] = SHA224_H1;
  90        sctx->state[2] = SHA224_H2;
  91        sctx->state[3] = SHA224_H3;
  92        sctx->state[4] = SHA224_H4;
  93        sctx->state[5] = SHA224_H5;
  94        sctx->state[6] = SHA224_H6;
  95        sctx->state[7] = SHA224_H7;
  96        sctx->count = 0;
  97        sctx->func = CPACF_KIMD_SHA_256;
  98
  99        return 0;
 100}
 101
 102static struct shash_alg sha224_alg = {
 103        .digestsize     =       SHA224_DIGEST_SIZE,
 104        .init           =       sha224_init,
 105        .update         =       s390_sha_update,
 106        .final          =       s390_sha_final,
 107        .export         =       sha256_export,
 108        .import         =       sha256_import,
 109        .descsize       =       sizeof(struct s390_sha_ctx),
 110        .statesize      =       sizeof(struct sha256_state),
 111        .base           =       {
 112                .cra_name       =       "sha224",
 113                .cra_driver_name=       "sha224-s390",
 114                .cra_priority   =       300,
 115                .cra_flags      =       CRYPTO_ALG_TYPE_SHASH,
 116                .cra_blocksize  =       SHA224_BLOCK_SIZE,
 117                .cra_module     =       THIS_MODULE,
 118        }
 119};
 120
 121static int __init sha256_s390_init(void)
 122{
 123        int ret;
 124
 125        if (!cpacf_query_func(CPACF_KIMD, CPACF_KIMD_SHA_256))
 126                return -EOPNOTSUPP;
 127        ret = crypto_register_shash(&sha256_alg);
 128        if (ret < 0)
 129                goto out;
 130        ret = crypto_register_shash(&sha224_alg);
 131        if (ret < 0)
 132                crypto_unregister_shash(&sha256_alg);
 133out:
 134        return ret;
 135}
 136
 137static void __exit sha256_s390_fini(void)
 138{
 139        crypto_unregister_shash(&sha224_alg);
 140        crypto_unregister_shash(&sha256_alg);
 141}
 142
 143module_init(sha256_s390_init);
 144module_exit(sha256_s390_fini);
 145
 146MODULE_ALIAS_CRYPTO("sha256");
 147MODULE_ALIAS_CRYPTO("sha224");
 148MODULE_LICENSE("GPL");
 149MODULE_DESCRIPTION("SHA256 and SHA224 Secure Hash Algorithm");
 150