4 * s390 implementation of the DES Cipher Algorithm.
6 * Copyright IBM Corp. 2003,2011
7 * Author(s): Thomas Spatzier
8 * Jan Glauber (jan.glauber@de.ibm.com)
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
17 #include <linux/init.h>
18 #include <linux/module.h>
19 #include <linux/crypto.h>
20 #include <crypto/algapi.h>
21 #include <crypto/des.h>
23 #include "crypt_s390.h"
25 #define DES3_KEY_SIZE (3 * DES_KEY_SIZE)
28 static DEFINE_SPINLOCK(ctrblk_lock);
31 u8 iv[DES_BLOCK_SIZE];
32 u8 key[DES3_KEY_SIZE];
35 static int des_setkey(struct crypto_tfm *tfm, const u8 *key,
38 struct s390_des_ctx *ctx = crypto_tfm_ctx(tfm);
39 u32 *flags = &tfm->crt_flags;
40 u32 tmp[DES_EXPKEY_WORDS];
42 /* check for weak keys */
43 if (!des_ekey(tmp, key) && (*flags & CRYPTO_TFM_REQ_WEAK_KEY)) {
44 *flags |= CRYPTO_TFM_RES_WEAK_KEY;
48 memcpy(ctx->key, key, key_len);
52 static void des_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
54 struct s390_des_ctx *ctx = crypto_tfm_ctx(tfm);
56 crypt_s390_km(KM_DEA_ENCRYPT, ctx->key, out, in, DES_BLOCK_SIZE);
59 static void des_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
61 struct s390_des_ctx *ctx = crypto_tfm_ctx(tfm);
63 crypt_s390_km(KM_DEA_DECRYPT, ctx->key, out, in, DES_BLOCK_SIZE);
66 static struct crypto_alg des_alg = {
68 .cra_driver_name = "des-s390",
69 .cra_priority = CRYPT_S390_PRIORITY,
70 .cra_flags = CRYPTO_ALG_TYPE_CIPHER,
71 .cra_blocksize = DES_BLOCK_SIZE,
72 .cra_ctxsize = sizeof(struct s390_des_ctx),
73 .cra_module = THIS_MODULE,
74 .cra_list = LIST_HEAD_INIT(des_alg.cra_list),
77 .cia_min_keysize = DES_KEY_SIZE,
78 .cia_max_keysize = DES_KEY_SIZE,
79 .cia_setkey = des_setkey,
80 .cia_encrypt = des_encrypt,
81 .cia_decrypt = des_decrypt,
86 static int ecb_desall_crypt(struct blkcipher_desc *desc, long func,
87 u8 *key, struct blkcipher_walk *walk)
89 int ret = blkcipher_walk_virt(desc, walk);
92 while ((nbytes = walk->nbytes)) {
93 /* only use complete blocks */
94 unsigned int n = nbytes & ~(DES_BLOCK_SIZE - 1);
95 u8 *out = walk->dst.virt.addr;
96 u8 *in = walk->src.virt.addr;
98 ret = crypt_s390_km(func, key, out, in, n);
99 if (ret < 0 || ret != n)
102 nbytes &= DES_BLOCK_SIZE - 1;
103 ret = blkcipher_walk_done(desc, walk, nbytes);
109 static int cbc_desall_crypt(struct blkcipher_desc *desc, long func,
110 struct blkcipher_walk *walk)
112 struct s390_des_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
113 int ret = blkcipher_walk_virt(desc, walk);
114 unsigned int nbytes = walk->nbytes;
116 u8 iv[DES_BLOCK_SIZE];
117 u8 key[DES3_KEY_SIZE];
123 memcpy(param.iv, walk->iv, DES_BLOCK_SIZE);
124 memcpy(param.key, ctx->key, DES3_KEY_SIZE);
126 /* only use complete blocks */
127 unsigned int n = nbytes & ~(DES_BLOCK_SIZE - 1);
128 u8 *out = walk->dst.virt.addr;
129 u8 *in = walk->src.virt.addr;
131 ret = crypt_s390_kmc(func, ¶m, out, in, n);
132 if (ret < 0 || ret != n)
135 nbytes &= DES_BLOCK_SIZE - 1;
136 ret = blkcipher_walk_done(desc, walk, nbytes);
137 } while ((nbytes = walk->nbytes));
138 memcpy(walk->iv, param.iv, DES_BLOCK_SIZE);
144 static int ecb_des_encrypt(struct blkcipher_desc *desc,
145 struct scatterlist *dst, struct scatterlist *src,
148 struct s390_des_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
149 struct blkcipher_walk walk;
151 blkcipher_walk_init(&walk, dst, src, nbytes);
152 return ecb_desall_crypt(desc, KM_DEA_ENCRYPT, ctx->key, &walk);
155 static int ecb_des_decrypt(struct blkcipher_desc *desc,
156 struct scatterlist *dst, struct scatterlist *src,
159 struct s390_des_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
160 struct blkcipher_walk walk;
162 blkcipher_walk_init(&walk, dst, src, nbytes);
163 return ecb_desall_crypt(desc, KM_DEA_DECRYPT, ctx->key, &walk);
166 static struct crypto_alg ecb_des_alg = {
167 .cra_name = "ecb(des)",
168 .cra_driver_name = "ecb-des-s390",
169 .cra_priority = CRYPT_S390_COMPOSITE_PRIORITY,
170 .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER,
171 .cra_blocksize = DES_BLOCK_SIZE,
172 .cra_ctxsize = sizeof(struct s390_des_ctx),
173 .cra_type = &crypto_blkcipher_type,
174 .cra_module = THIS_MODULE,
175 .cra_list = LIST_HEAD_INIT(ecb_des_alg.cra_list),
178 .min_keysize = DES_KEY_SIZE,
179 .max_keysize = DES_KEY_SIZE,
180 .setkey = des_setkey,
181 .encrypt = ecb_des_encrypt,
182 .decrypt = ecb_des_decrypt,
187 static int cbc_des_encrypt(struct blkcipher_desc *desc,
188 struct scatterlist *dst, struct scatterlist *src,
191 struct blkcipher_walk walk;
193 blkcipher_walk_init(&walk, dst, src, nbytes);
194 return cbc_desall_crypt(desc, KMC_DEA_ENCRYPT, &walk);
197 static int cbc_des_decrypt(struct blkcipher_desc *desc,
198 struct scatterlist *dst, struct scatterlist *src,
201 struct blkcipher_walk walk;
203 blkcipher_walk_init(&walk, dst, src, nbytes);
204 return cbc_desall_crypt(desc, KMC_DEA_DECRYPT, &walk);
207 static struct crypto_alg cbc_des_alg = {
208 .cra_name = "cbc(des)",
209 .cra_driver_name = "cbc-des-s390",
210 .cra_priority = CRYPT_S390_COMPOSITE_PRIORITY,
211 .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER,
212 .cra_blocksize = DES_BLOCK_SIZE,
213 .cra_ctxsize = sizeof(struct s390_des_ctx),
214 .cra_type = &crypto_blkcipher_type,
215 .cra_module = THIS_MODULE,
216 .cra_list = LIST_HEAD_INIT(cbc_des_alg.cra_list),
219 .min_keysize = DES_KEY_SIZE,
220 .max_keysize = DES_KEY_SIZE,
221 .ivsize = DES_BLOCK_SIZE,
222 .setkey = des_setkey,
223 .encrypt = cbc_des_encrypt,
224 .decrypt = cbc_des_decrypt,
232 * For DES-EDE3, there is no known need to reject weak or
233 * complementation keys. Any weakness is obviated by the use of
236 * However, if the first two or last two independent 64-bit keys are
237 * equal (k1 == k2 or k2 == k3), then the DES3 operation is simply the
238 * same as DES. Implementers MUST reject keys that exhibit this
242 static int des3_setkey(struct crypto_tfm *tfm, const u8 *key,
243 unsigned int key_len)
245 struct s390_des_ctx *ctx = crypto_tfm_ctx(tfm);
246 u32 *flags = &tfm->crt_flags;
248 if (!(memcmp(key, &key[DES_KEY_SIZE], DES_KEY_SIZE) &&
249 memcmp(&key[DES_KEY_SIZE], &key[DES_KEY_SIZE * 2],
251 (*flags & CRYPTO_TFM_REQ_WEAK_KEY)) {
252 *flags |= CRYPTO_TFM_RES_WEAK_KEY;
255 memcpy(ctx->key, key, key_len);
259 static void des3_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
261 struct s390_des_ctx *ctx = crypto_tfm_ctx(tfm);
263 crypt_s390_km(KM_TDEA_192_ENCRYPT, ctx->key, dst, src, DES_BLOCK_SIZE);
266 static void des3_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
268 struct s390_des_ctx *ctx = crypto_tfm_ctx(tfm);
270 crypt_s390_km(KM_TDEA_192_DECRYPT, ctx->key, dst, src, DES_BLOCK_SIZE);
273 static struct crypto_alg des3_alg = {
274 .cra_name = "des3_ede",
275 .cra_driver_name = "des3_ede-s390",
276 .cra_priority = CRYPT_S390_PRIORITY,
277 .cra_flags = CRYPTO_ALG_TYPE_CIPHER,
278 .cra_blocksize = DES_BLOCK_SIZE,
279 .cra_ctxsize = sizeof(struct s390_des_ctx),
280 .cra_module = THIS_MODULE,
281 .cra_list = LIST_HEAD_INIT(des3_alg.cra_list),
284 .cia_min_keysize = DES3_KEY_SIZE,
285 .cia_max_keysize = DES3_KEY_SIZE,
286 .cia_setkey = des3_setkey,
287 .cia_encrypt = des3_encrypt,
288 .cia_decrypt = des3_decrypt,
293 static int ecb_des3_encrypt(struct blkcipher_desc *desc,
294 struct scatterlist *dst, struct scatterlist *src,
297 struct s390_des_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
298 struct blkcipher_walk walk;
300 blkcipher_walk_init(&walk, dst, src, nbytes);
301 return ecb_desall_crypt(desc, KM_TDEA_192_ENCRYPT, ctx->key, &walk);
304 static int ecb_des3_decrypt(struct blkcipher_desc *desc,
305 struct scatterlist *dst, struct scatterlist *src,
308 struct s390_des_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
309 struct blkcipher_walk walk;
311 blkcipher_walk_init(&walk, dst, src, nbytes);
312 return ecb_desall_crypt(desc, KM_TDEA_192_DECRYPT, ctx->key, &walk);
315 static struct crypto_alg ecb_des3_alg = {
316 .cra_name = "ecb(des3_ede)",
317 .cra_driver_name = "ecb-des3_ede-s390",
318 .cra_priority = CRYPT_S390_COMPOSITE_PRIORITY,
319 .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER,
320 .cra_blocksize = DES_BLOCK_SIZE,
321 .cra_ctxsize = sizeof(struct s390_des_ctx),
322 .cra_type = &crypto_blkcipher_type,
323 .cra_module = THIS_MODULE,
324 .cra_list = LIST_HEAD_INIT(
325 ecb_des3_alg.cra_list),
328 .min_keysize = DES3_KEY_SIZE,
329 .max_keysize = DES3_KEY_SIZE,
330 .setkey = des3_setkey,
331 .encrypt = ecb_des3_encrypt,
332 .decrypt = ecb_des3_decrypt,
337 static int cbc_des3_encrypt(struct blkcipher_desc *desc,
338 struct scatterlist *dst, struct scatterlist *src,
341 struct blkcipher_walk walk;
343 blkcipher_walk_init(&walk, dst, src, nbytes);
344 return cbc_desall_crypt(desc, KMC_TDEA_192_ENCRYPT, &walk);
347 static int cbc_des3_decrypt(struct blkcipher_desc *desc,
348 struct scatterlist *dst, struct scatterlist *src,
351 struct blkcipher_walk walk;
353 blkcipher_walk_init(&walk, dst, src, nbytes);
354 return cbc_desall_crypt(desc, KMC_TDEA_192_DECRYPT, &walk);
357 static struct crypto_alg cbc_des3_alg = {
358 .cra_name = "cbc(des3_ede)",
359 .cra_driver_name = "cbc-des3_ede-s390",
360 .cra_priority = CRYPT_S390_COMPOSITE_PRIORITY,
361 .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER,
362 .cra_blocksize = DES_BLOCK_SIZE,
363 .cra_ctxsize = sizeof(struct s390_des_ctx),
364 .cra_type = &crypto_blkcipher_type,
365 .cra_module = THIS_MODULE,
366 .cra_list = LIST_HEAD_INIT(
367 cbc_des3_alg.cra_list),
370 .min_keysize = DES3_KEY_SIZE,
371 .max_keysize = DES3_KEY_SIZE,
372 .ivsize = DES_BLOCK_SIZE,
373 .setkey = des3_setkey,
374 .encrypt = cbc_des3_encrypt,
375 .decrypt = cbc_des3_decrypt,
380 static unsigned int __ctrblk_init(u8 *ctrptr, unsigned int nbytes)
384 /* align to block size, max. PAGE_SIZE */
385 n = (nbytes > PAGE_SIZE) ? PAGE_SIZE : nbytes & ~(DES_BLOCK_SIZE - 1);
386 for (i = DES_BLOCK_SIZE; i < n; i += DES_BLOCK_SIZE) {
387 memcpy(ctrptr + i, ctrptr + i - DES_BLOCK_SIZE, DES_BLOCK_SIZE);
388 crypto_inc(ctrptr + i, DES_BLOCK_SIZE);
393 static int ctr_desall_crypt(struct blkcipher_desc *desc, long func,
394 struct s390_des_ctx *ctx,
395 struct blkcipher_walk *walk)
397 int ret = blkcipher_walk_virt_block(desc, walk, DES_BLOCK_SIZE);
398 unsigned int n, nbytes;
399 u8 buf[DES_BLOCK_SIZE], ctrbuf[DES_BLOCK_SIZE];
400 u8 *out, *in, *ctrptr = ctrbuf;
405 if (spin_trylock(&ctrblk_lock))
408 memcpy(ctrptr, walk->iv, DES_BLOCK_SIZE);
409 while ((nbytes = walk->nbytes) >= DES_BLOCK_SIZE) {
410 out = walk->dst.virt.addr;
411 in = walk->src.virt.addr;
412 while (nbytes >= DES_BLOCK_SIZE) {
413 if (ctrptr == ctrblk)
414 n = __ctrblk_init(ctrptr, nbytes);
417 ret = crypt_s390_kmctr(func, ctx->key, out, in,
419 if (ret < 0 || ret != n) {
420 if (ctrptr == ctrblk)
421 spin_unlock(&ctrblk_lock);
424 if (n > DES_BLOCK_SIZE)
425 memcpy(ctrptr, ctrptr + n - DES_BLOCK_SIZE,
427 crypto_inc(ctrptr, DES_BLOCK_SIZE);
432 ret = blkcipher_walk_done(desc, walk, nbytes);
434 if (ctrptr == ctrblk) {
436 memcpy(ctrbuf, ctrptr, DES_BLOCK_SIZE);
438 memcpy(walk->iv, ctrptr, DES_BLOCK_SIZE);
439 spin_unlock(&ctrblk_lock);
441 /* final block may be < DES_BLOCK_SIZE, copy only nbytes */
443 out = walk->dst.virt.addr;
444 in = walk->src.virt.addr;
445 ret = crypt_s390_kmctr(func, ctx->key, buf, in,
446 DES_BLOCK_SIZE, ctrbuf);
447 if (ret < 0 || ret != DES_BLOCK_SIZE)
449 memcpy(out, buf, nbytes);
450 crypto_inc(ctrbuf, DES_BLOCK_SIZE);
451 ret = blkcipher_walk_done(desc, walk, 0);
452 memcpy(walk->iv, ctrbuf, DES_BLOCK_SIZE);
457 static int ctr_des_encrypt(struct blkcipher_desc *desc,
458 struct scatterlist *dst, struct scatterlist *src,
461 struct s390_des_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
462 struct blkcipher_walk walk;
464 blkcipher_walk_init(&walk, dst, src, nbytes);
465 return ctr_desall_crypt(desc, KMCTR_DEA_ENCRYPT, ctx, &walk);
468 static int ctr_des_decrypt(struct blkcipher_desc *desc,
469 struct scatterlist *dst, struct scatterlist *src,
472 struct s390_des_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
473 struct blkcipher_walk walk;
475 blkcipher_walk_init(&walk, dst, src, nbytes);
476 return ctr_desall_crypt(desc, KMCTR_DEA_DECRYPT, ctx, &walk);
479 static struct crypto_alg ctr_des_alg = {
480 .cra_name = "ctr(des)",
481 .cra_driver_name = "ctr-des-s390",
482 .cra_priority = CRYPT_S390_COMPOSITE_PRIORITY,
483 .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER,
485 .cra_ctxsize = sizeof(struct s390_des_ctx),
486 .cra_type = &crypto_blkcipher_type,
487 .cra_module = THIS_MODULE,
488 .cra_list = LIST_HEAD_INIT(ctr_des_alg.cra_list),
491 .min_keysize = DES_KEY_SIZE,
492 .max_keysize = DES_KEY_SIZE,
493 .ivsize = DES_BLOCK_SIZE,
494 .setkey = des_setkey,
495 .encrypt = ctr_des_encrypt,
496 .decrypt = ctr_des_decrypt,
501 static int ctr_des3_encrypt(struct blkcipher_desc *desc,
502 struct scatterlist *dst, struct scatterlist *src,
505 struct s390_des_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
506 struct blkcipher_walk walk;
508 blkcipher_walk_init(&walk, dst, src, nbytes);
509 return ctr_desall_crypt(desc, KMCTR_TDEA_192_ENCRYPT, ctx, &walk);
512 static int ctr_des3_decrypt(struct blkcipher_desc *desc,
513 struct scatterlist *dst, struct scatterlist *src,
516 struct s390_des_ctx *ctx = crypto_blkcipher_ctx(desc->tfm);
517 struct blkcipher_walk walk;
519 blkcipher_walk_init(&walk, dst, src, nbytes);
520 return ctr_desall_crypt(desc, KMCTR_TDEA_192_DECRYPT, ctx, &walk);
523 static struct crypto_alg ctr_des3_alg = {
524 .cra_name = "ctr(des3_ede)",
525 .cra_driver_name = "ctr-des3_ede-s390",
526 .cra_priority = CRYPT_S390_COMPOSITE_PRIORITY,
527 .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER,
529 .cra_ctxsize = sizeof(struct s390_des_ctx),
530 .cra_type = &crypto_blkcipher_type,
531 .cra_module = THIS_MODULE,
532 .cra_list = LIST_HEAD_INIT(ctr_des3_alg.cra_list),
535 .min_keysize = DES3_KEY_SIZE,
536 .max_keysize = DES3_KEY_SIZE,
537 .ivsize = DES_BLOCK_SIZE,
538 .setkey = des3_setkey,
539 .encrypt = ctr_des3_encrypt,
540 .decrypt = ctr_des3_decrypt,
545 static int __init des_s390_init(void)
549 if (!crypt_s390_func_available(KM_DEA_ENCRYPT, CRYPT_S390_MSA) ||
550 !crypt_s390_func_available(KM_TDEA_192_ENCRYPT, CRYPT_S390_MSA))
553 ret = crypto_register_alg(&des_alg);
556 ret = crypto_register_alg(&ecb_des_alg);
559 ret = crypto_register_alg(&cbc_des_alg);
562 ret = crypto_register_alg(&des3_alg);
565 ret = crypto_register_alg(&ecb_des3_alg);
568 ret = crypto_register_alg(&cbc_des3_alg);
572 if (crypt_s390_func_available(KMCTR_DEA_ENCRYPT,
573 CRYPT_S390_MSA | CRYPT_S390_MSA4) &&
574 crypt_s390_func_available(KMCTR_TDEA_192_ENCRYPT,
575 CRYPT_S390_MSA | CRYPT_S390_MSA4)) {
576 ret = crypto_register_alg(&ctr_des_alg);
579 ret = crypto_register_alg(&ctr_des3_alg);
582 ctrblk = (u8 *) __get_free_page(GFP_KERNEL);
592 crypto_unregister_alg(&ctr_des3_alg);
594 crypto_unregister_alg(&ctr_des_alg);
596 crypto_unregister_alg(&cbc_des3_alg);
598 crypto_unregister_alg(&ecb_des3_alg);
600 crypto_unregister_alg(&des3_alg);
602 crypto_unregister_alg(&cbc_des_alg);
604 crypto_unregister_alg(&ecb_des_alg);
606 crypto_unregister_alg(&des_alg);
611 static void __exit des_s390_exit(void)
614 crypto_unregister_alg(&ctr_des_alg);
615 crypto_unregister_alg(&ctr_des3_alg);
616 free_page((unsigned long) ctrblk);
618 crypto_unregister_alg(&cbc_des3_alg);
619 crypto_unregister_alg(&ecb_des3_alg);
620 crypto_unregister_alg(&des3_alg);
621 crypto_unregister_alg(&cbc_des_alg);
622 crypto_unregister_alg(&ecb_des_alg);
623 crypto_unregister_alg(&des_alg);
626 module_init(des_s390_init);
627 module_exit(des_s390_exit);
630 MODULE_ALIAS("des3_ede");
632 MODULE_LICENSE("GPL");
633 MODULE_DESCRIPTION("DES & Triple DES EDE Cipher Algorithms");