1 // SPDX-License-Identifier: GPL-2.0+
5 * s390 generic implementation of the SHA Secure Hash Algorithms.
7 * Copyright IBM Corp. 2007
8 * Author(s): Jan Glauber (jang@de.ibm.com)
11 #include <crypto/internal/hash.h>
12 #include <linux/module.h>
13 #include <asm/cpacf.h>
16 int s390_sha_update(struct shash_desc
*desc
, const u8
*data
, unsigned int len
)
18 struct s390_sha_ctx
*ctx
= shash_desc_ctx(desc
);
19 unsigned int bsize
= crypto_shash_blocksize(desc
->tfm
);
20 unsigned int index
, n
;
22 /* how much is already in the buffer? */
23 index
= ctx
->count
% bsize
;
26 if ((index
+ len
) < bsize
)
29 /* process one stored block */
31 memcpy(ctx
->buf
+ index
, data
, bsize
- index
);
32 cpacf_kimd(ctx
->func
, ctx
->state
, ctx
->buf
, bsize
);
33 data
+= bsize
- index
;
38 /* process as many blocks as possible */
40 n
= (len
/ bsize
) * bsize
;
41 cpacf_kimd(ctx
->func
, ctx
->state
, data
, n
);
47 memcpy(ctx
->buf
+ index
, data
, len
);
51 EXPORT_SYMBOL_GPL(s390_sha_update
);
53 static int s390_crypto_shash_parmsize(int func
)
56 case CPACF_KLMD_SHA_1
:
58 case CPACF_KLMD_SHA_256
:
60 case CPACF_KLMD_SHA_512
:
62 case CPACF_KLMD_SHA3_224
:
63 case CPACF_KLMD_SHA3_256
:
64 case CPACF_KLMD_SHA3_384
:
65 case CPACF_KLMD_SHA3_512
:
72 int s390_sha_final(struct shash_desc
*desc
, u8
*out
)
74 struct s390_sha_ctx
*ctx
= shash_desc_ctx(desc
);
75 unsigned int bsize
= crypto_shash_blocksize(desc
->tfm
);
80 n
= ctx
->count
% bsize
;
81 bits
= ctx
->count
* 8;
82 mbl_offset
= s390_crypto_shash_parmsize(ctx
->func
);
86 mbl_offset
= mbl_offset
/ sizeof(u32
);
88 /* set total msg bit length (mbl) in CPACF parmblock */
90 case CPACF_KLMD_SHA_1
:
91 case CPACF_KLMD_SHA_256
:
92 memcpy(ctx
->state
+ mbl_offset
, &bits
, sizeof(bits
));
94 case CPACF_KLMD_SHA_512
:
96 * the SHA512 parmblock has a 128-bit mbl field, clear
97 * high-order u64 field, copy bits to low-order u64 field
99 memset(ctx
->state
+ mbl_offset
, 0x00, sizeof(bits
));
100 mbl_offset
+= sizeof(u64
) / sizeof(u32
);
101 memcpy(ctx
->state
+ mbl_offset
, &bits
, sizeof(bits
));
103 case CPACF_KLMD_SHA3_224
:
104 case CPACF_KLMD_SHA3_256
:
105 case CPACF_KLMD_SHA3_384
:
106 case CPACF_KLMD_SHA3_512
:
112 cpacf_klmd(ctx
->func
, ctx
->state
, ctx
->buf
, n
);
114 /* copy digest to out */
115 memcpy(out
, ctx
->state
, crypto_shash_digestsize(desc
->tfm
));
117 memset(ctx
, 0, sizeof *ctx
);
121 EXPORT_SYMBOL_GPL(s390_sha_final
);
123 MODULE_LICENSE("GPL");
124 MODULE_DESCRIPTION("s390 SHA cipher common functions");