xref: /openbmc/linux/arch/s390/crypto/des_s390.c (revision 6c2bb98b)
1c1e26e1eSJan Glauber /*
2c1e26e1eSJan Glauber  * Cryptographic API.
3c1e26e1eSJan Glauber  *
4c1e26e1eSJan Glauber  * s390 implementation of the DES Cipher Algorithm.
5c1e26e1eSJan Glauber  *
6c1e26e1eSJan Glauber  * Copyright (c) 2003 IBM Deutschland Entwicklung GmbH, IBM Corporation
7c1e26e1eSJan Glauber  * Author(s): Thomas Spatzier (tspat@de.ibm.com)
8c1e26e1eSJan Glauber  *
9c1e26e1eSJan Glauber  *
10c1e26e1eSJan Glauber  * This program is free software; you can redistribute it and/or modify
11c1e26e1eSJan Glauber  * it under the terms of the GNU General Public License as published by
12c1e26e1eSJan Glauber  * the Free Software Foundation; either version 2 of the License, or
13c1e26e1eSJan Glauber  * (at your option) any later version.
14c1e26e1eSJan Glauber  *
15c1e26e1eSJan Glauber  */
16c1e26e1eSJan Glauber #include <linux/init.h>
17c1e26e1eSJan Glauber #include <linux/module.h>
18c1e26e1eSJan Glauber #include <linux/crypto.h>
19c1357833SJan Glauber 
20c1e26e1eSJan Glauber #include "crypt_s390.h"
21c1e26e1eSJan Glauber #include "crypto_des.h"
22c1e26e1eSJan Glauber 
23c1e26e1eSJan Glauber #define DES_BLOCK_SIZE 8
24c1e26e1eSJan Glauber #define DES_KEY_SIZE 8
25c1e26e1eSJan Glauber 
26c1e26e1eSJan Glauber #define DES3_128_KEY_SIZE	(2 * DES_KEY_SIZE)
27c1e26e1eSJan Glauber #define DES3_128_BLOCK_SIZE	DES_BLOCK_SIZE
28c1e26e1eSJan Glauber 
29c1e26e1eSJan Glauber #define DES3_192_KEY_SIZE	(3 * DES_KEY_SIZE)
30c1e26e1eSJan Glauber #define DES3_192_BLOCK_SIZE	DES_BLOCK_SIZE
31c1e26e1eSJan Glauber 
32c1e26e1eSJan Glauber struct crypt_s390_des_ctx {
33c1e26e1eSJan Glauber 	u8 iv[DES_BLOCK_SIZE];
34c1e26e1eSJan Glauber 	u8 key[DES_KEY_SIZE];
35c1e26e1eSJan Glauber };
36c1e26e1eSJan Glauber 
37c1e26e1eSJan Glauber struct crypt_s390_des3_128_ctx {
38c1e26e1eSJan Glauber 	u8 iv[DES_BLOCK_SIZE];
39c1e26e1eSJan Glauber 	u8 key[DES3_128_KEY_SIZE];
40c1e26e1eSJan Glauber };
41c1e26e1eSJan Glauber 
42c1e26e1eSJan Glauber struct crypt_s390_des3_192_ctx {
43c1e26e1eSJan Glauber 	u8 iv[DES_BLOCK_SIZE];
44c1e26e1eSJan Glauber 	u8 key[DES3_192_KEY_SIZE];
45c1e26e1eSJan Glauber };
46c1e26e1eSJan Glauber 
476c2bb98bSHerbert Xu static int des_setkey(struct crypto_tfm *tfm, const u8 *key,
486c2bb98bSHerbert Xu 		      unsigned int keylen, u32 *flags)
49c1e26e1eSJan Glauber {
506c2bb98bSHerbert Xu 	struct crypt_s390_des_ctx *dctx = crypto_tfm_ctx(tfm);
51c1e26e1eSJan Glauber 	int ret;
52c1e26e1eSJan Glauber 
53c1357833SJan Glauber 	/* test if key is valid (not a weak key) */
54c1e26e1eSJan Glauber 	ret = crypto_des_check_key(key, keylen, flags);
55c1357833SJan Glauber 	if (ret == 0)
56c1e26e1eSJan Glauber 		memcpy(dctx->key, key, keylen);
57c1e26e1eSJan Glauber 	return ret;
58c1e26e1eSJan Glauber }
59c1e26e1eSJan Glauber 
606c2bb98bSHerbert Xu static void des_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
61c1e26e1eSJan Glauber {
626c2bb98bSHerbert Xu 	struct crypt_s390_des_ctx *dctx = crypto_tfm_ctx(tfm);
63c1e26e1eSJan Glauber 
64b8dc6038SJan Glauber 	crypt_s390_km(KM_DEA_ENCRYPT, dctx->key, out, in, DES_BLOCK_SIZE);
65c1e26e1eSJan Glauber }
66c1e26e1eSJan Glauber 
676c2bb98bSHerbert Xu static void des_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
68c1e26e1eSJan Glauber {
696c2bb98bSHerbert Xu 	struct crypt_s390_des_ctx *dctx = crypto_tfm_ctx(tfm);
70c1e26e1eSJan Glauber 
71b8dc6038SJan Glauber 	crypt_s390_km(KM_DEA_DECRYPT, dctx->key, out, in, DES_BLOCK_SIZE);
72b8dc6038SJan Glauber }
73b8dc6038SJan Glauber 
74b8dc6038SJan Glauber static unsigned int des_encrypt_ecb(const struct cipher_desc *desc, u8 *out,
75b8dc6038SJan Glauber 				    const u8 *in, unsigned int nbytes)
76b8dc6038SJan Glauber {
77b8dc6038SJan Glauber 	struct crypt_s390_des_ctx *sctx = crypto_tfm_ctx(desc->tfm);
78b8dc6038SJan Glauber 	int ret;
79b8dc6038SJan Glauber 
80b8dc6038SJan Glauber 	/* only use complete blocks */
81b8dc6038SJan Glauber 	nbytes &= ~(DES_BLOCK_SIZE - 1);
82b8dc6038SJan Glauber 	ret = crypt_s390_km(KM_DEA_ENCRYPT, sctx->key, out, in, nbytes);
83b8dc6038SJan Glauber 	BUG_ON((ret < 0) || (ret != nbytes));
84b8dc6038SJan Glauber 
85b8dc6038SJan Glauber 	return nbytes;
86b8dc6038SJan Glauber }
87b8dc6038SJan Glauber 
88b8dc6038SJan Glauber static unsigned int des_decrypt_ecb(const struct cipher_desc *desc, u8 *out,
89b8dc6038SJan Glauber 				    const u8 *in, unsigned int nbytes)
90b8dc6038SJan Glauber {
91b8dc6038SJan Glauber 	struct crypt_s390_des_ctx *sctx = crypto_tfm_ctx(desc->tfm);
92b8dc6038SJan Glauber 	int ret;
93b8dc6038SJan Glauber 
94b8dc6038SJan Glauber 	/* only use complete blocks */
95b8dc6038SJan Glauber 	nbytes &= ~(DES_BLOCK_SIZE - 1);
96b8dc6038SJan Glauber 	ret = crypt_s390_km(KM_DEA_DECRYPT, sctx->key, out, in, nbytes);
97b8dc6038SJan Glauber 	BUG_ON((ret < 0) || (ret != nbytes));
98b8dc6038SJan Glauber 
99b8dc6038SJan Glauber 	return nbytes;
100b8dc6038SJan Glauber }
101b8dc6038SJan Glauber 
102b8dc6038SJan Glauber static unsigned int des_encrypt_cbc(const struct cipher_desc *desc, u8 *out,
103b8dc6038SJan Glauber 				    const u8 *in, unsigned int nbytes)
104b8dc6038SJan Glauber {
105b8dc6038SJan Glauber 	struct crypt_s390_des_ctx *sctx = crypto_tfm_ctx(desc->tfm);
106b8dc6038SJan Glauber 	int ret;
107b8dc6038SJan Glauber 
108b8dc6038SJan Glauber 	/* only use complete blocks */
109b8dc6038SJan Glauber 	nbytes &= ~(DES_BLOCK_SIZE - 1);
110b8dc6038SJan Glauber 
111b8dc6038SJan Glauber 	memcpy(sctx->iv, desc->info, DES_BLOCK_SIZE);
112b8dc6038SJan Glauber 	ret = crypt_s390_kmc(KMC_DEA_ENCRYPT, &sctx->iv, out, in, nbytes);
113b8dc6038SJan Glauber 	BUG_ON((ret < 0) || (ret != nbytes));
114b8dc6038SJan Glauber 
115b8dc6038SJan Glauber 	memcpy(desc->info, sctx->iv, DES_BLOCK_SIZE);
116b8dc6038SJan Glauber 	return nbytes;
117b8dc6038SJan Glauber }
118b8dc6038SJan Glauber 
119b8dc6038SJan Glauber static unsigned int des_decrypt_cbc(const struct cipher_desc *desc, u8 *out,
120b8dc6038SJan Glauber 				    const u8 *in, unsigned int nbytes)
121b8dc6038SJan Glauber {
122b8dc6038SJan Glauber 	struct crypt_s390_des_ctx *sctx = crypto_tfm_ctx(desc->tfm);
123b8dc6038SJan Glauber 	int ret;
124b8dc6038SJan Glauber 
125b8dc6038SJan Glauber 	/* only use complete blocks */
126b8dc6038SJan Glauber 	nbytes &= ~(DES_BLOCK_SIZE - 1);
127b8dc6038SJan Glauber 
128b8dc6038SJan Glauber 	memcpy(&sctx->iv, desc->info, DES_BLOCK_SIZE);
129b8dc6038SJan Glauber 	ret = crypt_s390_kmc(KMC_DEA_DECRYPT, &sctx->iv, out, in, nbytes);
130b8dc6038SJan Glauber 	BUG_ON((ret < 0) || (ret != nbytes));
131b8dc6038SJan Glauber 
132b8dc6038SJan Glauber 	return nbytes;
133c1e26e1eSJan Glauber }
134c1e26e1eSJan Glauber 
135c1e26e1eSJan Glauber static struct crypto_alg des_alg = {
136c1e26e1eSJan Glauber 	.cra_name		=	"des",
137c1e26e1eSJan Glauber 	.cra_flags		=	CRYPTO_ALG_TYPE_CIPHER,
138c1e26e1eSJan Glauber 	.cra_blocksize		=	DES_BLOCK_SIZE,
139c1e26e1eSJan Glauber 	.cra_ctxsize		=	sizeof(struct crypt_s390_des_ctx),
140c1e26e1eSJan Glauber 	.cra_module		=	THIS_MODULE,
141c1e26e1eSJan Glauber 	.cra_list		=	LIST_HEAD_INIT(des_alg.cra_list),
142c1357833SJan Glauber 	.cra_u			=	{
143c1357833SJan Glauber 		.cipher = {
144c1e26e1eSJan Glauber 			.cia_min_keysize	=	DES_KEY_SIZE,
145c1e26e1eSJan Glauber 			.cia_max_keysize	=	DES_KEY_SIZE,
146c1e26e1eSJan Glauber 			.cia_setkey		=	des_setkey,
147c1e26e1eSJan Glauber 			.cia_encrypt		=	des_encrypt,
148b8dc6038SJan Glauber 			.cia_decrypt		=	des_decrypt,
149b8dc6038SJan Glauber 			.cia_encrypt_ecb	=	des_encrypt_ecb,
150b8dc6038SJan Glauber 			.cia_decrypt_ecb	=	des_decrypt_ecb,
151b8dc6038SJan Glauber 			.cia_encrypt_cbc	=	des_encrypt_cbc,
152b8dc6038SJan Glauber 			.cia_decrypt_cbc	=	des_decrypt_cbc,
153c1357833SJan Glauber 		}
154c1357833SJan Glauber 	}
155c1e26e1eSJan Glauber };
156c1e26e1eSJan Glauber 
157c1e26e1eSJan Glauber /*
158c1e26e1eSJan Glauber  * RFC2451:
159c1e26e1eSJan Glauber  *
160c1e26e1eSJan Glauber  *   For DES-EDE3, there is no known need to reject weak or
161c1e26e1eSJan Glauber  *   complementation keys.  Any weakness is obviated by the use of
162c1e26e1eSJan Glauber  *   multiple keys.
163c1e26e1eSJan Glauber  *
164c1e26e1eSJan Glauber  *   However, if the two  independent 64-bit keys are equal,
165c1e26e1eSJan Glauber  *   then the DES3 operation is simply the same as DES.
166c1e26e1eSJan Glauber  *   Implementers MUST reject keys that exhibit this property.
167c1e26e1eSJan Glauber  *
168c1e26e1eSJan Glauber  */
1696c2bb98bSHerbert Xu static int des3_128_setkey(struct crypto_tfm *tfm, const u8 *key,
1706c2bb98bSHerbert Xu 			   unsigned int keylen, u32 *flags)
171c1e26e1eSJan Glauber {
172c1e26e1eSJan Glauber 	int i, ret;
1736c2bb98bSHerbert Xu 	struct crypt_s390_des3_128_ctx *dctx = crypto_tfm_ctx(tfm);
174c1e26e1eSJan Glauber 	const u8* temp_key = key;
175c1e26e1eSJan Glauber 
176c1e26e1eSJan Glauber 	if (!(memcmp(key, &key[DES_KEY_SIZE], DES_KEY_SIZE))) {
177c1e26e1eSJan Glauber 		*flags |= CRYPTO_TFM_RES_BAD_KEY_SCHED;
178c1e26e1eSJan Glauber 		return -EINVAL;
179c1e26e1eSJan Glauber 	}
180c1e26e1eSJan Glauber 	for (i = 0; i < 2; i++, temp_key += DES_KEY_SIZE) {
181c1e26e1eSJan Glauber 		ret = crypto_des_check_key(temp_key, DES_KEY_SIZE, flags);
182c1e26e1eSJan Glauber 		if (ret < 0)
183c1e26e1eSJan Glauber 			return ret;
184c1e26e1eSJan Glauber 	}
185c1e26e1eSJan Glauber 	memcpy(dctx->key, key, keylen);
186c1e26e1eSJan Glauber 	return 0;
187c1e26e1eSJan Glauber }
188c1e26e1eSJan Glauber 
1896c2bb98bSHerbert Xu static void des3_128_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
190c1e26e1eSJan Glauber {
1916c2bb98bSHerbert Xu 	struct crypt_s390_des3_128_ctx *dctx = crypto_tfm_ctx(tfm);
192c1e26e1eSJan Glauber 
193c1e26e1eSJan Glauber 	crypt_s390_km(KM_TDEA_128_ENCRYPT, dctx->key, dst, (void*)src,
194c1e26e1eSJan Glauber 		      DES3_128_BLOCK_SIZE);
195c1e26e1eSJan Glauber }
196c1e26e1eSJan Glauber 
1976c2bb98bSHerbert Xu static void des3_128_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
198c1e26e1eSJan Glauber {
1996c2bb98bSHerbert Xu 	struct crypt_s390_des3_128_ctx *dctx = crypto_tfm_ctx(tfm);
200c1e26e1eSJan Glauber 
201c1e26e1eSJan Glauber 	crypt_s390_km(KM_TDEA_128_DECRYPT, dctx->key, dst, (void*)src,
202c1e26e1eSJan Glauber 		      DES3_128_BLOCK_SIZE);
203c1e26e1eSJan Glauber }
204c1e26e1eSJan Glauber 
205b8dc6038SJan Glauber static unsigned int des3_128_encrypt_ecb(const struct cipher_desc *desc,
206b8dc6038SJan Glauber 					 u8 *out, const u8 *in,
207b8dc6038SJan Glauber 					 unsigned int nbytes)
208b8dc6038SJan Glauber {
209b8dc6038SJan Glauber 	struct crypt_s390_des3_128_ctx *sctx = crypto_tfm_ctx(desc->tfm);
210b8dc6038SJan Glauber 	int ret;
211b8dc6038SJan Glauber 
212b8dc6038SJan Glauber 	/* only use complete blocks */
213b8dc6038SJan Glauber 	nbytes &= ~(DES3_128_BLOCK_SIZE - 1);
214b8dc6038SJan Glauber 	ret = crypt_s390_km(KM_TDEA_128_ENCRYPT, sctx->key, out, in, nbytes);
215b8dc6038SJan Glauber 	BUG_ON((ret < 0) || (ret != nbytes));
216b8dc6038SJan Glauber 
217b8dc6038SJan Glauber 	return nbytes;
218b8dc6038SJan Glauber }
219b8dc6038SJan Glauber 
220b8dc6038SJan Glauber static unsigned int des3_128_decrypt_ecb(const struct cipher_desc *desc,
221b8dc6038SJan Glauber 					 u8 *out, const u8 *in,
222b8dc6038SJan Glauber 					 unsigned int nbytes)
223b8dc6038SJan Glauber {
224b8dc6038SJan Glauber 	struct crypt_s390_des3_128_ctx *sctx = crypto_tfm_ctx(desc->tfm);
225b8dc6038SJan Glauber 	int ret;
226b8dc6038SJan Glauber 
227b8dc6038SJan Glauber 	/* only use complete blocks */
228b8dc6038SJan Glauber 	nbytes &= ~(DES3_128_BLOCK_SIZE - 1);
229b8dc6038SJan Glauber 	ret = crypt_s390_km(KM_TDEA_128_DECRYPT, sctx->key, out, in, nbytes);
230b8dc6038SJan Glauber 	BUG_ON((ret < 0) || (ret != nbytes));
231b8dc6038SJan Glauber 
232b8dc6038SJan Glauber 	return nbytes;
233b8dc6038SJan Glauber }
234b8dc6038SJan Glauber 
235b8dc6038SJan Glauber static unsigned int des3_128_encrypt_cbc(const struct cipher_desc *desc,
236b8dc6038SJan Glauber 					 u8 *out, const u8 *in,
237b8dc6038SJan Glauber 					 unsigned int nbytes)
238b8dc6038SJan Glauber {
239b8dc6038SJan Glauber 	struct crypt_s390_des3_128_ctx *sctx = crypto_tfm_ctx(desc->tfm);
240b8dc6038SJan Glauber 	int ret;
241b8dc6038SJan Glauber 
242b8dc6038SJan Glauber 	/* only use complete blocks */
243b8dc6038SJan Glauber 	nbytes &= ~(DES3_128_BLOCK_SIZE - 1);
244b8dc6038SJan Glauber 
245b8dc6038SJan Glauber 	memcpy(sctx->iv, desc->info, DES3_128_BLOCK_SIZE);
246b8dc6038SJan Glauber 	ret = crypt_s390_kmc(KMC_TDEA_128_ENCRYPT, &sctx->iv, out, in, nbytes);
247b8dc6038SJan Glauber 	BUG_ON((ret < 0) || (ret != nbytes));
248b8dc6038SJan Glauber 
249b8dc6038SJan Glauber 	memcpy(desc->info, sctx->iv, DES3_128_BLOCK_SIZE);
250b8dc6038SJan Glauber 	return nbytes;
251b8dc6038SJan Glauber }
252b8dc6038SJan Glauber 
253b8dc6038SJan Glauber static unsigned int des3_128_decrypt_cbc(const struct cipher_desc *desc,
254b8dc6038SJan Glauber 					 u8 *out, const u8 *in,
255b8dc6038SJan Glauber 					 unsigned int nbytes)
256b8dc6038SJan Glauber {
257b8dc6038SJan Glauber 	struct crypt_s390_des3_128_ctx *sctx = crypto_tfm_ctx(desc->tfm);
258b8dc6038SJan Glauber 	int ret;
259b8dc6038SJan Glauber 
260b8dc6038SJan Glauber 	/* only use complete blocks */
261b8dc6038SJan Glauber 	nbytes &= ~(DES3_128_BLOCK_SIZE - 1);
262b8dc6038SJan Glauber 
263b8dc6038SJan Glauber 	memcpy(&sctx->iv, desc->info, DES3_128_BLOCK_SIZE);
264b8dc6038SJan Glauber 	ret = crypt_s390_kmc(KMC_TDEA_128_DECRYPT, &sctx->iv, out, in, nbytes);
265b8dc6038SJan Glauber 	BUG_ON((ret < 0) || (ret != nbytes));
266b8dc6038SJan Glauber 
267b8dc6038SJan Glauber 	return nbytes;
268b8dc6038SJan Glauber }
269b8dc6038SJan Glauber 
270c1e26e1eSJan Glauber static struct crypto_alg des3_128_alg = {
271c1e26e1eSJan Glauber 	.cra_name		=	"des3_ede128",
272c1e26e1eSJan Glauber 	.cra_flags		=	CRYPTO_ALG_TYPE_CIPHER,
273c1e26e1eSJan Glauber 	.cra_blocksize		=	DES3_128_BLOCK_SIZE,
274c1e26e1eSJan Glauber 	.cra_ctxsize		=	sizeof(struct crypt_s390_des3_128_ctx),
275c1e26e1eSJan Glauber 	.cra_module		=	THIS_MODULE,
276c1e26e1eSJan Glauber 	.cra_list		=	LIST_HEAD_INIT(des3_128_alg.cra_list),
277c1357833SJan Glauber 	.cra_u			=	{
278c1357833SJan Glauber 		.cipher = {
279c1e26e1eSJan Glauber 			.cia_min_keysize	=	DES3_128_KEY_SIZE,
280c1e26e1eSJan Glauber 			.cia_max_keysize	=	DES3_128_KEY_SIZE,
281c1e26e1eSJan Glauber 			.cia_setkey		=	des3_128_setkey,
282c1e26e1eSJan Glauber 			.cia_encrypt		=	des3_128_encrypt,
283b8dc6038SJan Glauber 			.cia_decrypt		=	des3_128_decrypt,
284b8dc6038SJan Glauber 			.cia_encrypt_ecb	=	des3_128_encrypt_ecb,
285b8dc6038SJan Glauber 			.cia_decrypt_ecb	=	des3_128_decrypt_ecb,
286b8dc6038SJan Glauber 			.cia_encrypt_cbc	=	des3_128_encrypt_cbc,
287b8dc6038SJan Glauber 			.cia_decrypt_cbc	=	des3_128_decrypt_cbc,
288c1357833SJan Glauber 		}
289c1357833SJan Glauber 	}
290c1e26e1eSJan Glauber };
291c1e26e1eSJan Glauber 
292c1e26e1eSJan Glauber /*
293c1e26e1eSJan Glauber  * RFC2451:
294c1e26e1eSJan Glauber  *
295c1e26e1eSJan Glauber  *   For DES-EDE3, there is no known need to reject weak or
296c1e26e1eSJan Glauber  *   complementation keys.  Any weakness is obviated by the use of
297c1e26e1eSJan Glauber  *   multiple keys.
298c1e26e1eSJan Glauber  *
299c1e26e1eSJan Glauber  *   However, if the first two or last two independent 64-bit keys are
300c1e26e1eSJan Glauber  *   equal (k1 == k2 or k2 == k3), then the DES3 operation is simply the
301c1e26e1eSJan Glauber  *   same as DES.  Implementers MUST reject keys that exhibit this
302c1e26e1eSJan Glauber  *   property.
303c1e26e1eSJan Glauber  *
304c1e26e1eSJan Glauber  */
3056c2bb98bSHerbert Xu static int des3_192_setkey(struct crypto_tfm *tfm, const u8 *key,
3066c2bb98bSHerbert Xu 			   unsigned int keylen, u32 *flags)
307c1e26e1eSJan Glauber {
308c1e26e1eSJan Glauber 	int i, ret;
3096c2bb98bSHerbert Xu 	struct crypt_s390_des3_192_ctx *dctx = crypto_tfm_ctx(tfm);
310c1357833SJan Glauber 	const u8* temp_key = key;
311c1e26e1eSJan Glauber 
312c1e26e1eSJan Glauber 	if (!(memcmp(key, &key[DES_KEY_SIZE], DES_KEY_SIZE) &&
313c1e26e1eSJan Glauber 	    memcmp(&key[DES_KEY_SIZE], &key[DES_KEY_SIZE * 2],
314c1e26e1eSJan Glauber 		   DES_KEY_SIZE))) {
315c1e26e1eSJan Glauber 
316c1e26e1eSJan Glauber 		*flags |= CRYPTO_TFM_RES_BAD_KEY_SCHED;
317c1e26e1eSJan Glauber 		return -EINVAL;
318c1e26e1eSJan Glauber 	}
319c1e26e1eSJan Glauber 	for (i = 0; i < 3; i++, temp_key += DES_KEY_SIZE) {
320c1e26e1eSJan Glauber 		ret = crypto_des_check_key(temp_key, DES_KEY_SIZE, flags);
321c1357833SJan Glauber 		if (ret < 0)
322c1e26e1eSJan Glauber 			return ret;
323c1e26e1eSJan Glauber 	}
324c1e26e1eSJan Glauber 	memcpy(dctx->key, key, keylen);
325c1e26e1eSJan Glauber 	return 0;
326c1e26e1eSJan Glauber }
327c1e26e1eSJan Glauber 
3286c2bb98bSHerbert Xu static void des3_192_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
329c1e26e1eSJan Glauber {
3306c2bb98bSHerbert Xu 	struct crypt_s390_des3_192_ctx *dctx = crypto_tfm_ctx(tfm);
331c1e26e1eSJan Glauber 
332c1e26e1eSJan Glauber 	crypt_s390_km(KM_TDEA_192_ENCRYPT, dctx->key, dst, (void*)src,
333c1e26e1eSJan Glauber 		      DES3_192_BLOCK_SIZE);
334c1e26e1eSJan Glauber }
335c1e26e1eSJan Glauber 
3366c2bb98bSHerbert Xu static void des3_192_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
337c1e26e1eSJan Glauber {
3386c2bb98bSHerbert Xu 	struct crypt_s390_des3_192_ctx *dctx = crypto_tfm_ctx(tfm);
339c1e26e1eSJan Glauber 
340c1e26e1eSJan Glauber 	crypt_s390_km(KM_TDEA_192_DECRYPT, dctx->key, dst, (void*)src,
341c1e26e1eSJan Glauber 		      DES3_192_BLOCK_SIZE);
342c1e26e1eSJan Glauber }
343c1e26e1eSJan Glauber 
344b8dc6038SJan Glauber static unsigned int des3_192_encrypt_ecb(const struct cipher_desc *desc,
345b8dc6038SJan Glauber 					 u8 *out, const u8 *in,
346b8dc6038SJan Glauber 					 unsigned int nbytes)
347b8dc6038SJan Glauber {
348b8dc6038SJan Glauber 	struct crypt_s390_des3_192_ctx *sctx = crypto_tfm_ctx(desc->tfm);
349b8dc6038SJan Glauber 	int ret;
350b8dc6038SJan Glauber 
351b8dc6038SJan Glauber 	/* only use complete blocks */
352b8dc6038SJan Glauber 	nbytes &= ~(DES3_192_BLOCK_SIZE - 1);
353b8dc6038SJan Glauber 	ret = crypt_s390_km(KM_TDEA_192_ENCRYPT, sctx->key, out, in, nbytes);
354b8dc6038SJan Glauber 	BUG_ON((ret < 0) || (ret != nbytes));
355b8dc6038SJan Glauber 
356b8dc6038SJan Glauber 	return nbytes;
357b8dc6038SJan Glauber }
358b8dc6038SJan Glauber 
359b8dc6038SJan Glauber static unsigned int des3_192_decrypt_ecb(const struct cipher_desc *desc,
360b8dc6038SJan Glauber 					 u8 *out, const u8 *in,
361b8dc6038SJan Glauber 					 unsigned int nbytes)
362b8dc6038SJan Glauber {
363b8dc6038SJan Glauber 	struct crypt_s390_des3_192_ctx *sctx = crypto_tfm_ctx(desc->tfm);
364b8dc6038SJan Glauber 	int ret;
365b8dc6038SJan Glauber 
366b8dc6038SJan Glauber 	/* only use complete blocks */
367b8dc6038SJan Glauber 	nbytes &= ~(DES3_192_BLOCK_SIZE - 1);
368b8dc6038SJan Glauber 	ret = crypt_s390_km(KM_TDEA_192_DECRYPT, sctx->key, out, in, nbytes);
369b8dc6038SJan Glauber 	BUG_ON((ret < 0) || (ret != nbytes));
370b8dc6038SJan Glauber 
371b8dc6038SJan Glauber 	return nbytes;
372b8dc6038SJan Glauber }
373b8dc6038SJan Glauber 
374b8dc6038SJan Glauber static unsigned int des3_192_encrypt_cbc(const struct cipher_desc *desc,
375b8dc6038SJan Glauber 					 u8 *out, const u8 *in,
376b8dc6038SJan Glauber 					 unsigned int nbytes)
377b8dc6038SJan Glauber {
378b8dc6038SJan Glauber 	struct crypt_s390_des3_192_ctx *sctx = crypto_tfm_ctx(desc->tfm);
379b8dc6038SJan Glauber 	int ret;
380b8dc6038SJan Glauber 
381b8dc6038SJan Glauber 	/* only use complete blocks */
382b8dc6038SJan Glauber 	nbytes &= ~(DES3_192_BLOCK_SIZE - 1);
383b8dc6038SJan Glauber 
384b8dc6038SJan Glauber 	memcpy(sctx->iv, desc->info, DES3_192_BLOCK_SIZE);
385b8dc6038SJan Glauber 	ret = crypt_s390_kmc(KMC_TDEA_192_ENCRYPT, &sctx->iv, out, in, nbytes);
386b8dc6038SJan Glauber 	BUG_ON((ret < 0) || (ret != nbytes));
387b8dc6038SJan Glauber 
388b8dc6038SJan Glauber 	memcpy(desc->info, sctx->iv, DES3_192_BLOCK_SIZE);
389b8dc6038SJan Glauber 	return nbytes;
390b8dc6038SJan Glauber }
391b8dc6038SJan Glauber 
392b8dc6038SJan Glauber static unsigned int des3_192_decrypt_cbc(const struct cipher_desc *desc,
393b8dc6038SJan Glauber 					 u8 *out, const u8 *in,
394b8dc6038SJan Glauber 					 unsigned int nbytes)
395b8dc6038SJan Glauber {
396b8dc6038SJan Glauber 	struct crypt_s390_des3_192_ctx *sctx = crypto_tfm_ctx(desc->tfm);
397b8dc6038SJan Glauber 	int ret;
398b8dc6038SJan Glauber 
399b8dc6038SJan Glauber 	/* only use complete blocks */
400b8dc6038SJan Glauber 	nbytes &= ~(DES3_192_BLOCK_SIZE - 1);
401b8dc6038SJan Glauber 
402b8dc6038SJan Glauber 	memcpy(&sctx->iv, desc->info, DES3_192_BLOCK_SIZE);
403b8dc6038SJan Glauber 	ret = crypt_s390_kmc(KMC_TDEA_192_DECRYPT, &sctx->iv, out, in, nbytes);
404b8dc6038SJan Glauber 	BUG_ON((ret < 0) || (ret != nbytes));
405b8dc6038SJan Glauber 
406b8dc6038SJan Glauber 	return nbytes;
407b8dc6038SJan Glauber }
408b8dc6038SJan Glauber 
409c1e26e1eSJan Glauber static struct crypto_alg des3_192_alg = {
410c1e26e1eSJan Glauber 	.cra_name		=	"des3_ede",
411c1e26e1eSJan Glauber 	.cra_flags		=	CRYPTO_ALG_TYPE_CIPHER,
412c1e26e1eSJan Glauber 	.cra_blocksize		=	DES3_192_BLOCK_SIZE,
413c1e26e1eSJan Glauber 	.cra_ctxsize		=	sizeof(struct crypt_s390_des3_192_ctx),
414c1e26e1eSJan Glauber 	.cra_module		=	THIS_MODULE,
415c1e26e1eSJan Glauber 	.cra_list		=	LIST_HEAD_INIT(des3_192_alg.cra_list),
416c1357833SJan Glauber 	.cra_u			=	{
417c1357833SJan Glauber 		.cipher = {
418c1e26e1eSJan Glauber 			.cia_min_keysize	=	DES3_192_KEY_SIZE,
419c1e26e1eSJan Glauber 			.cia_max_keysize	=	DES3_192_KEY_SIZE,
420c1e26e1eSJan Glauber 			.cia_setkey		=	des3_192_setkey,
421c1e26e1eSJan Glauber 			.cia_encrypt		=	des3_192_encrypt,
422b8dc6038SJan Glauber 			.cia_decrypt		=	des3_192_decrypt,
423b8dc6038SJan Glauber 			.cia_encrypt_ecb	=	des3_192_encrypt_ecb,
424b8dc6038SJan Glauber 			.cia_decrypt_ecb	=	des3_192_decrypt_ecb,
425b8dc6038SJan Glauber 			.cia_encrypt_cbc	=	des3_192_encrypt_cbc,
426b8dc6038SJan Glauber 			.cia_decrypt_cbc	=	des3_192_decrypt_cbc,
427c1357833SJan Glauber 		}
428c1357833SJan Glauber 	}
429c1e26e1eSJan Glauber };
430c1e26e1eSJan Glauber 
431c1357833SJan Glauber static int init(void)
432c1e26e1eSJan Glauber {
433c1357833SJan Glauber 	int ret = 0;
434c1e26e1eSJan Glauber 
435c1e26e1eSJan Glauber 	if (!crypt_s390_func_available(KM_DEA_ENCRYPT) ||
436c1e26e1eSJan Glauber 	    !crypt_s390_func_available(KM_TDEA_128_ENCRYPT) ||
437c1357833SJan Glauber 	    !crypt_s390_func_available(KM_TDEA_192_ENCRYPT))
438c1e26e1eSJan Glauber 		return -ENOSYS;
439c1e26e1eSJan Glauber 
440c1e26e1eSJan Glauber 	ret |= (crypto_register_alg(&des_alg) == 0) ? 0:1;
441c1e26e1eSJan Glauber 	ret |= (crypto_register_alg(&des3_128_alg) == 0) ? 0:2;
442c1e26e1eSJan Glauber 	ret |= (crypto_register_alg(&des3_192_alg) == 0) ? 0:4;
443c1e26e1eSJan Glauber 	if (ret) {
444c1e26e1eSJan Glauber 		crypto_unregister_alg(&des3_192_alg);
445c1e26e1eSJan Glauber 		crypto_unregister_alg(&des3_128_alg);
446c1e26e1eSJan Glauber 		crypto_unregister_alg(&des_alg);
447c1e26e1eSJan Glauber 		return -EEXIST;
448c1e26e1eSJan Glauber 	}
449c1e26e1eSJan Glauber 	return 0;
450c1e26e1eSJan Glauber }
451c1e26e1eSJan Glauber 
452c1357833SJan Glauber static void __exit fini(void)
453c1e26e1eSJan Glauber {
454c1e26e1eSJan Glauber 	crypto_unregister_alg(&des3_192_alg);
455c1e26e1eSJan Glauber 	crypto_unregister_alg(&des3_128_alg);
456c1e26e1eSJan Glauber 	crypto_unregister_alg(&des_alg);
457c1e26e1eSJan Glauber }
458c1e26e1eSJan Glauber 
459c1e26e1eSJan Glauber module_init(init);
460c1e26e1eSJan Glauber module_exit(fini);
461c1e26e1eSJan Glauber 
462c1e26e1eSJan Glauber MODULE_ALIAS("des");
463c1e26e1eSJan Glauber MODULE_ALIAS("des3_ede");
464c1e26e1eSJan Glauber 
465c1e26e1eSJan Glauber MODULE_LICENSE("GPL");
466c1e26e1eSJan Glauber MODULE_DESCRIPTION("DES & Triple DES EDE Cipher Algorithms");
467