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

TOMOYO Linux Cross Reference
Linux/arch/s390/crypto/sha_common.c

Version: ~ [ linux-4.17-rc6 ] ~ [ linux-4.16.10 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.42 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.101 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.132 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.51 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.109 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.56 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-3.9.11 ] ~ [ linux-3.8.13 ] ~ [ linux-3.7.10 ] ~ [ linux-3.6.11 ] ~ [ linux-3.5.7 ] ~ [ linux-3.4.113 ] ~ [ linux-3.3.8 ] ~ [ linux-3.2.101 ] ~ [ linux-3.1.10 ] ~ [ linux-3.0.101 ] ~ [ linux-2.6.39.4 ] ~ [ linux-2.6.38.8 ] ~ [ linux-2.6.37.6 ] ~ [ linux-2.6.36.4 ] ~ [ linux-2.6.35.14 ] ~ [ linux-2.6.34.15 ] ~ [ linux-2.6.33.20 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.27.62 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: GPL-2.0+
  2 /*
  3  * Cryptographic API.
  4  *
  5  * s390 generic implementation of the SHA Secure Hash Algorithms.
  6  *
  7  * Copyright IBM Corp. 2007
  8  * Author(s): Jan Glauber (jang@de.ibm.com)
  9  */
 10 
 11 #include <crypto/internal/hash.h>
 12 #include <linux/module.h>
 13 #include <asm/cpacf.h>
 14 #include "sha.h"
 15 
 16 int s390_sha_update(struct shash_desc *desc, const u8 *data, unsigned int len)
 17 {
 18         struct s390_sha_ctx *ctx = shash_desc_ctx(desc);
 19         unsigned int bsize = crypto_shash_blocksize(desc->tfm);
 20         unsigned int index, n;
 21 
 22         /* how much is already in the buffer? */
 23         index = ctx->count & (bsize - 1);
 24         ctx->count += len;
 25 
 26         if ((index + len) < bsize)
 27                 goto store;
 28 
 29         /* process one stored block */
 30         if (index) {
 31                 memcpy(ctx->buf + index, data, bsize - index);
 32                 cpacf_kimd(ctx->func, ctx->state, ctx->buf, bsize);
 33                 data += bsize - index;
 34                 len -= bsize - index;
 35                 index = 0;
 36         }
 37 
 38         /* process as many blocks as possible */
 39         if (len >= bsize) {
 40                 n = len & ~(bsize - 1);
 41                 cpacf_kimd(ctx->func, ctx->state, data, n);
 42                 data += n;
 43                 len -= n;
 44         }
 45 store:
 46         if (len)
 47                 memcpy(ctx->buf + index , data, len);
 48 
 49         return 0;
 50 }
 51 EXPORT_SYMBOL_GPL(s390_sha_update);
 52 
 53 int s390_sha_final(struct shash_desc *desc, u8 *out)
 54 {
 55         struct s390_sha_ctx *ctx = shash_desc_ctx(desc);
 56         unsigned int bsize = crypto_shash_blocksize(desc->tfm);
 57         u64 bits;
 58         unsigned int index, end, plen;
 59 
 60         /* SHA-512 uses 128 bit padding length */
 61         plen = (bsize > SHA256_BLOCK_SIZE) ? 16 : 8;
 62 
 63         /* must perform manual padding */
 64         index = ctx->count & (bsize - 1);
 65         end = (index < bsize - plen) ? bsize : (2 * bsize);
 66 
 67         /* start pad with 1 */
 68         ctx->buf[index] = 0x80;
 69         index++;
 70 
 71         /* pad with zeros */
 72         memset(ctx->buf + index, 0x00, end - index - 8);
 73 
 74         /*
 75          * Append message length. Well, SHA-512 wants a 128 bit length value,
 76          * nevertheless we use u64, should be enough for now...
 77          */
 78         bits = ctx->count * 8;
 79         memcpy(ctx->buf + end - 8, &bits, sizeof(bits));
 80         cpacf_kimd(ctx->func, ctx->state, ctx->buf, end);
 81 
 82         /* copy digest to out */
 83         memcpy(out, ctx->state, crypto_shash_digestsize(desc->tfm));
 84         /* wipe context */
 85         memset(ctx, 0, sizeof *ctx);
 86 
 87         return 0;
 88 }
 89 EXPORT_SYMBOL_GPL(s390_sha_final);
 90 
 91 MODULE_LICENSE("GPL");
 92 MODULE_DESCRIPTION("s390 SHA cipher common functions");
 93 

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

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

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

osdn.jp