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

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

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

~ [ 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