1 /* 2 * Cryptographic API. 3 * 4 * s390 implementation of the DES Cipher Algorithm. 5 * 6 * Copyright IBM Corp. 2003, 2011 7 * Author(s): Thomas Spatzier 8 * Jan Glauber (jan.glauber@de.ibm.com) 9 * 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. 14 * 15 */ 16 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> 22 23 #include "crypt_s390.h" 24 25 #define DES3_KEY_SIZE (3 * DES_KEY_SIZE) 26 27 static u8 *ctrblk; 28 29 struct s390_des_ctx { 30 u8 iv[DES_BLOCK_SIZE]; 31 u8 key[DES3_KEY_SIZE]; 32 }; 33 34 static int des_setkey(struct crypto_tfm *tfm, const u8 *key, 35 unsigned int key_len) 36 { 37 struct s390_des_ctx *ctx = crypto_tfm_ctx(tfm); 38 u32 *flags = &tfm->crt_flags; 39 u32 tmp[DES_EXPKEY_WORDS]; 40 41 /* check for weak keys */ 42 if (!des_ekey(tmp, key) && (*flags & CRYPTO_TFM_REQ_WEAK_KEY)) { 43 *flags |= CRYPTO_TFM_RES_WEAK_KEY; 44 return -EINVAL; 45 } 46 47 memcpy(ctx->key, key, key_len); 48 return 0; 49 } 50 51 static void des_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) 52 { 53 struct s390_des_ctx *ctx = crypto_tfm_ctx(tfm); 54 55 crypt_s390_km(KM_DEA_ENCRYPT, ctx->key, out, in, DES_BLOCK_SIZE); 56 } 57 58 static void des_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in) 59 { 60 struct s390_des_ctx *ctx = crypto_tfm_ctx(tfm); 61 62 crypt_s390_km(KM_DEA_DECRYPT, ctx->key, out, in, DES_BLOCK_SIZE); 63 } 64 65 static struct crypto_alg des_alg = { 66 .cra_name = "des", 67 .cra_driver_name = "des-s390", 68 .cra_priority = CRYPT_S390_PRIORITY, 69 .cra_flags = CRYPTO_ALG_TYPE_CIPHER, 70 .cra_blocksize = DES_BLOCK_SIZE, 71 .cra_ctxsize = sizeof(struct s390_des_ctx), 72 .cra_module = THIS_MODULE, 73 .cra_u = { 74 .cipher = { 75 .cia_min_keysize = DES_KEY_SIZE, 76 .cia_max_keysize = DES_KEY_SIZE, 77 .cia_setkey = des_setkey, 78 .cia_encrypt = des_encrypt, 79 .cia_decrypt = des_decrypt, 80 } 81 } 82 }; 83 84 static int ecb_desall_crypt(struct blkcipher_desc *desc, long func, 85 u8 *key, struct blkcipher_walk *walk) 86 { 87 int ret = blkcipher_walk_virt(desc, walk); 88 unsigned int nbytes; 89 90 while ((nbytes = walk->nbytes)) { 91 /* only use complete blocks */ 92 unsigned int n = nbytes & ~(DES_BLOCK_SIZE - 1); 93 u8 *out = walk->dst.virt.addr; 94 u8 *in = walk->src.virt.addr; 95 96 ret = crypt_s390_km(func, key, out, in, n); 97 if (ret < 0 || ret != n) 98 return -EIO; 99 100 nbytes &= DES_BLOCK_SIZE - 1; 101 ret = blkcipher_walk_done(desc, walk, nbytes); 102 } 103 104 return ret; 105 } 106 107 static int cbc_desall_crypt(struct blkcipher_desc *desc, long func, 108 u8 *iv, struct blkcipher_walk *walk) 109 { 110 int ret = blkcipher_walk_virt(desc, walk); 111 unsigned int nbytes = walk->nbytes; 112 113 if (!nbytes) 114 goto out; 115 116 memcpy(iv, walk->iv, DES_BLOCK_SIZE); 117 do { 118 /* only use complete blocks */ 119 unsigned int n = nbytes & ~(DES_BLOCK_SIZE - 1); 120 u8 *out = walk->dst.virt.addr; 121 u8 *in = walk->src.virt.addr; 122 123 ret = crypt_s390_kmc(func, iv, out, in, n); 124 if (ret < 0 || ret != n) 125 return -EIO; 126 127 nbytes &= DES_BLOCK_SIZE - 1; 128 ret = blkcipher_walk_done(desc, walk, nbytes); 129 } while ((nbytes = walk->nbytes)); 130 memcpy(walk->iv, iv, DES_BLOCK_SIZE); 131 132 out: 133 return ret; 134 } 135 136 static int ecb_des_encrypt(struct blkcipher_desc *desc, 137 struct scatterlist *dst, struct scatterlist *src, 138 unsigned int nbytes) 139 { 140 struct s390_des_ctx *ctx = crypto_blkcipher_ctx(desc->tfm); 141 struct blkcipher_walk walk; 142 143 blkcipher_walk_init(&walk, dst, src, nbytes); 144 return ecb_desall_crypt(desc, KM_DEA_ENCRYPT, ctx->key, &walk); 145 } 146 147 static int ecb_des_decrypt(struct blkcipher_desc *desc, 148 struct scatterlist *dst, struct scatterlist *src, 149 unsigned int nbytes) 150 { 151 struct s390_des_ctx *ctx = crypto_blkcipher_ctx(desc->tfm); 152 struct blkcipher_walk walk; 153 154 blkcipher_walk_init(&walk, dst, src, nbytes); 155 return ecb_desall_crypt(desc, KM_DEA_DECRYPT, ctx->key, &walk); 156 } 157 158 static struct crypto_alg ecb_des_alg = { 159 .cra_name = "ecb(des)", 160 .cra_driver_name = "ecb-des-s390", 161 .cra_priority = CRYPT_S390_COMPOSITE_PRIORITY, 162 .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER, 163 .cra_blocksize = DES_BLOCK_SIZE, 164 .cra_ctxsize = sizeof(struct s390_des_ctx), 165 .cra_type = &crypto_blkcipher_type, 166 .cra_module = THIS_MODULE, 167 .cra_u = { 168 .blkcipher = { 169 .min_keysize = DES_KEY_SIZE, 170 .max_keysize = DES_KEY_SIZE, 171 .setkey = des_setkey, 172 .encrypt = ecb_des_encrypt, 173 .decrypt = ecb_des_decrypt, 174 } 175 } 176 }; 177 178 static int cbc_des_encrypt(struct blkcipher_desc *desc, 179 struct scatterlist *dst, struct scatterlist *src, 180 unsigned int nbytes) 181 { 182 struct s390_des_ctx *ctx = crypto_blkcipher_ctx(desc->tfm); 183 struct blkcipher_walk walk; 184 185 blkcipher_walk_init(&walk, dst, src, nbytes); 186 return cbc_desall_crypt(desc, KMC_DEA_ENCRYPT, ctx->iv, &walk); 187 } 188 189 static int cbc_des_decrypt(struct blkcipher_desc *desc, 190 struct scatterlist *dst, struct scatterlist *src, 191 unsigned int nbytes) 192 { 193 struct s390_des_ctx *ctx = crypto_blkcipher_ctx(desc->tfm); 194 struct blkcipher_walk walk; 195 196 blkcipher_walk_init(&walk, dst, src, nbytes); 197 return cbc_desall_crypt(desc, KMC_DEA_DECRYPT, ctx->iv, &walk); 198 } 199 200 static struct crypto_alg cbc_des_alg = { 201 .cra_name = "cbc(des)", 202 .cra_driver_name = "cbc-des-s390", 203 .cra_priority = CRYPT_S390_COMPOSITE_PRIORITY, 204 .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER, 205 .cra_blocksize = DES_BLOCK_SIZE, 206 .cra_ctxsize = sizeof(struct s390_des_ctx), 207 .cra_type = &crypto_blkcipher_type, 208 .cra_module = THIS_MODULE, 209 .cra_u = { 210 .blkcipher = { 211 .min_keysize = DES_KEY_SIZE, 212 .max_keysize = DES_KEY_SIZE, 213 .ivsize = DES_BLOCK_SIZE, 214 .setkey = des_setkey, 215 .encrypt = cbc_des_encrypt, 216 .decrypt = cbc_des_decrypt, 217 } 218 } 219 }; 220 221 /* 222 * RFC2451: 223 * 224 * For DES-EDE3, there is no known need to reject weak or 225 * complementation keys. Any weakness is obviated by the use of 226 * multiple keys. 227 * 228 * However, if the first two or last two independent 64-bit keys are 229 * equal (k1 == k2 or k2 == k3), then the DES3 operation is simply the 230 * same as DES. Implementers MUST reject keys that exhibit this 231 * property. 232 * 233 */ 234 static int des3_setkey(struct crypto_tfm *tfm, const u8 *key, 235 unsigned int key_len) 236 { 237 struct s390_des_ctx *ctx = crypto_tfm_ctx(tfm); 238 u32 *flags = &tfm->crt_flags; 239 240 if (!(crypto_memneq(key, &key[DES_KEY_SIZE], DES_KEY_SIZE) && 241 crypto_memneq(&key[DES_KEY_SIZE], &key[DES_KEY_SIZE * 2], 242 DES_KEY_SIZE)) && 243 (*flags & CRYPTO_TFM_REQ_WEAK_KEY)) { 244 *flags |= CRYPTO_TFM_RES_WEAK_KEY; 245 return -EINVAL; 246 } 247 memcpy(ctx->key, key, key_len); 248 return 0; 249 } 250 251 static void des3_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) 252 { 253 struct s390_des_ctx *ctx = crypto_tfm_ctx(tfm); 254 255 crypt_s390_km(KM_TDEA_192_ENCRYPT, ctx->key, dst, src, DES_BLOCK_SIZE); 256 } 257 258 static void des3_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src) 259 { 260 struct s390_des_ctx *ctx = crypto_tfm_ctx(tfm); 261 262 crypt_s390_km(KM_TDEA_192_DECRYPT, ctx->key, dst, src, DES_BLOCK_SIZE); 263 } 264 265 static struct crypto_alg des3_alg = { 266 .cra_name = "des3_ede", 267 .cra_driver_name = "des3_ede-s390", 268 .cra_priority = CRYPT_S390_PRIORITY, 269 .cra_flags = CRYPTO_ALG_TYPE_CIPHER, 270 .cra_blocksize = DES_BLOCK_SIZE, 271 .cra_ctxsize = sizeof(struct s390_des_ctx), 272 .cra_module = THIS_MODULE, 273 .cra_u = { 274 .cipher = { 275 .cia_min_keysize = DES3_KEY_SIZE, 276 .cia_max_keysize = DES3_KEY_SIZE, 277 .cia_setkey = des3_setkey, 278 .cia_encrypt = des3_encrypt, 279 .cia_decrypt = des3_decrypt, 280 } 281 } 282 }; 283 284 static int ecb_des3_encrypt(struct blkcipher_desc *desc, 285 struct scatterlist *dst, struct scatterlist *src, 286 unsigned int nbytes) 287 { 288 struct s390_des_ctx *ctx = crypto_blkcipher_ctx(desc->tfm); 289 struct blkcipher_walk walk; 290 291 blkcipher_walk_init(&walk, dst, src, nbytes); 292 return ecb_desall_crypt(desc, KM_TDEA_192_ENCRYPT, ctx->key, &walk); 293 } 294 295 static int ecb_des3_decrypt(struct blkcipher_desc *desc, 296 struct scatterlist *dst, struct scatterlist *src, 297 unsigned int nbytes) 298 { 299 struct s390_des_ctx *ctx = crypto_blkcipher_ctx(desc->tfm); 300 struct blkcipher_walk walk; 301 302 blkcipher_walk_init(&walk, dst, src, nbytes); 303 return ecb_desall_crypt(desc, KM_TDEA_192_DECRYPT, ctx->key, &walk); 304 } 305 306 static struct crypto_alg ecb_des3_alg = { 307 .cra_name = "ecb(des3_ede)", 308 .cra_driver_name = "ecb-des3_ede-s390", 309 .cra_priority = CRYPT_S390_COMPOSITE_PRIORITY, 310 .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER, 311 .cra_blocksize = DES_BLOCK_SIZE, 312 .cra_ctxsize = sizeof(struct s390_des_ctx), 313 .cra_type = &crypto_blkcipher_type, 314 .cra_module = THIS_MODULE, 315 .cra_u = { 316 .blkcipher = { 317 .min_keysize = DES3_KEY_SIZE, 318 .max_keysize = DES3_KEY_SIZE, 319 .setkey = des3_setkey, 320 .encrypt = ecb_des3_encrypt, 321 .decrypt = ecb_des3_decrypt, 322 } 323 } 324 }; 325 326 static int cbc_des3_encrypt(struct blkcipher_desc *desc, 327 struct scatterlist *dst, struct scatterlist *src, 328 unsigned int nbytes) 329 { 330 struct s390_des_ctx *ctx = crypto_blkcipher_ctx(desc->tfm); 331 struct blkcipher_walk walk; 332 333 blkcipher_walk_init(&walk, dst, src, nbytes); 334 return cbc_desall_crypt(desc, KMC_TDEA_192_ENCRYPT, ctx->iv, &walk); 335 } 336 337 static int cbc_des3_decrypt(struct blkcipher_desc *desc, 338 struct scatterlist *dst, struct scatterlist *src, 339 unsigned int nbytes) 340 { 341 struct s390_des_ctx *ctx = crypto_blkcipher_ctx(desc->tfm); 342 struct blkcipher_walk walk; 343 344 blkcipher_walk_init(&walk, dst, src, nbytes); 345 return cbc_desall_crypt(desc, KMC_TDEA_192_DECRYPT, ctx->iv, &walk); 346 } 347 348 static struct crypto_alg cbc_des3_alg = { 349 .cra_name = "cbc(des3_ede)", 350 .cra_driver_name = "cbc-des3_ede-s390", 351 .cra_priority = CRYPT_S390_COMPOSITE_PRIORITY, 352 .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER, 353 .cra_blocksize = DES_BLOCK_SIZE, 354 .cra_ctxsize = sizeof(struct s390_des_ctx), 355 .cra_type = &crypto_blkcipher_type, 356 .cra_module = THIS_MODULE, 357 .cra_u = { 358 .blkcipher = { 359 .min_keysize = DES3_KEY_SIZE, 360 .max_keysize = DES3_KEY_SIZE, 361 .ivsize = DES_BLOCK_SIZE, 362 .setkey = des3_setkey, 363 .encrypt = cbc_des3_encrypt, 364 .decrypt = cbc_des3_decrypt, 365 } 366 } 367 }; 368 369 static int ctr_desall_crypt(struct blkcipher_desc *desc, long func, 370 struct s390_des_ctx *ctx, struct blkcipher_walk *walk) 371 { 372 int ret = blkcipher_walk_virt_block(desc, walk, DES_BLOCK_SIZE); 373 unsigned int i, n, nbytes; 374 u8 buf[DES_BLOCK_SIZE]; 375 u8 *out, *in; 376 377 memcpy(ctrblk, walk->iv, DES_BLOCK_SIZE); 378 while ((nbytes = walk->nbytes) >= DES_BLOCK_SIZE) { 379 out = walk->dst.virt.addr; 380 in = walk->src.virt.addr; 381 while (nbytes >= DES_BLOCK_SIZE) { 382 /* align to block size, max. PAGE_SIZE */ 383 n = (nbytes > PAGE_SIZE) ? PAGE_SIZE : 384 nbytes & ~(DES_BLOCK_SIZE - 1); 385 for (i = DES_BLOCK_SIZE; i < n; i += DES_BLOCK_SIZE) { 386 memcpy(ctrblk + i, ctrblk + i - DES_BLOCK_SIZE, 387 DES_BLOCK_SIZE); 388 crypto_inc(ctrblk + i, DES_BLOCK_SIZE); 389 } 390 ret = crypt_s390_kmctr(func, ctx->key, out, in, n, ctrblk); 391 if (ret < 0 || ret != n) 392 return -EIO; 393 if (n > DES_BLOCK_SIZE) 394 memcpy(ctrblk, ctrblk + n - DES_BLOCK_SIZE, 395 DES_BLOCK_SIZE); 396 crypto_inc(ctrblk, DES_BLOCK_SIZE); 397 out += n; 398 in += n; 399 nbytes -= n; 400 } 401 ret = blkcipher_walk_done(desc, walk, nbytes); 402 } 403 404 /* final block may be < DES_BLOCK_SIZE, copy only nbytes */ 405 if (nbytes) { 406 out = walk->dst.virt.addr; 407 in = walk->src.virt.addr; 408 ret = crypt_s390_kmctr(func, ctx->key, buf, in, 409 DES_BLOCK_SIZE, ctrblk); 410 if (ret < 0 || ret != DES_BLOCK_SIZE) 411 return -EIO; 412 memcpy(out, buf, nbytes); 413 crypto_inc(ctrblk, DES_BLOCK_SIZE); 414 ret = blkcipher_walk_done(desc, walk, 0); 415 } 416 memcpy(walk->iv, ctrblk, DES_BLOCK_SIZE); 417 return ret; 418 } 419 420 static int ctr_des_encrypt(struct blkcipher_desc *desc, 421 struct scatterlist *dst, struct scatterlist *src, 422 unsigned int nbytes) 423 { 424 struct s390_des_ctx *ctx = crypto_blkcipher_ctx(desc->tfm); 425 struct blkcipher_walk walk; 426 427 blkcipher_walk_init(&walk, dst, src, nbytes); 428 return ctr_desall_crypt(desc, KMCTR_DEA_ENCRYPT, ctx, &walk); 429 } 430 431 static int ctr_des_decrypt(struct blkcipher_desc *desc, 432 struct scatterlist *dst, struct scatterlist *src, 433 unsigned int nbytes) 434 { 435 struct s390_des_ctx *ctx = crypto_blkcipher_ctx(desc->tfm); 436 struct blkcipher_walk walk; 437 438 blkcipher_walk_init(&walk, dst, src, nbytes); 439 return ctr_desall_crypt(desc, KMCTR_DEA_DECRYPT, ctx, &walk); 440 } 441 442 static struct crypto_alg ctr_des_alg = { 443 .cra_name = "ctr(des)", 444 .cra_driver_name = "ctr-des-s390", 445 .cra_priority = CRYPT_S390_COMPOSITE_PRIORITY, 446 .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER, 447 .cra_blocksize = 1, 448 .cra_ctxsize = sizeof(struct s390_des_ctx), 449 .cra_type = &crypto_blkcipher_type, 450 .cra_module = THIS_MODULE, 451 .cra_u = { 452 .blkcipher = { 453 .min_keysize = DES_KEY_SIZE, 454 .max_keysize = DES_KEY_SIZE, 455 .ivsize = DES_BLOCK_SIZE, 456 .setkey = des_setkey, 457 .encrypt = ctr_des_encrypt, 458 .decrypt = ctr_des_decrypt, 459 } 460 } 461 }; 462 463 static int ctr_des3_encrypt(struct blkcipher_desc *desc, 464 struct scatterlist *dst, struct scatterlist *src, 465 unsigned int nbytes) 466 { 467 struct s390_des_ctx *ctx = crypto_blkcipher_ctx(desc->tfm); 468 struct blkcipher_walk walk; 469 470 blkcipher_walk_init(&walk, dst, src, nbytes); 471 return ctr_desall_crypt(desc, KMCTR_TDEA_192_ENCRYPT, ctx, &walk); 472 } 473 474 static int ctr_des3_decrypt(struct blkcipher_desc *desc, 475 struct scatterlist *dst, struct scatterlist *src, 476 unsigned int nbytes) 477 { 478 struct s390_des_ctx *ctx = crypto_blkcipher_ctx(desc->tfm); 479 struct blkcipher_walk walk; 480 481 blkcipher_walk_init(&walk, dst, src, nbytes); 482 return ctr_desall_crypt(desc, KMCTR_TDEA_192_DECRYPT, ctx, &walk); 483 } 484 485 static struct crypto_alg ctr_des3_alg = { 486 .cra_name = "ctr(des3_ede)", 487 .cra_driver_name = "ctr-des3_ede-s390", 488 .cra_priority = CRYPT_S390_COMPOSITE_PRIORITY, 489 .cra_flags = CRYPTO_ALG_TYPE_BLKCIPHER, 490 .cra_blocksize = 1, 491 .cra_ctxsize = sizeof(struct s390_des_ctx), 492 .cra_type = &crypto_blkcipher_type, 493 .cra_module = THIS_MODULE, 494 .cra_u = { 495 .blkcipher = { 496 .min_keysize = DES3_KEY_SIZE, 497 .max_keysize = DES3_KEY_SIZE, 498 .ivsize = DES_BLOCK_SIZE, 499 .setkey = des3_setkey, 500 .encrypt = ctr_des3_encrypt, 501 .decrypt = ctr_des3_decrypt, 502 } 503 } 504 }; 505 506 static int __init des_s390_init(void) 507 { 508 int ret; 509 510 if (!crypt_s390_func_available(KM_DEA_ENCRYPT, CRYPT_S390_MSA) || 511 !crypt_s390_func_available(KM_TDEA_192_ENCRYPT, CRYPT_S390_MSA)) 512 return -EOPNOTSUPP; 513 514 ret = crypto_register_alg(&des_alg); 515 if (ret) 516 goto des_err; 517 ret = crypto_register_alg(&ecb_des_alg); 518 if (ret) 519 goto ecb_des_err; 520 ret = crypto_register_alg(&cbc_des_alg); 521 if (ret) 522 goto cbc_des_err; 523 ret = crypto_register_alg(&des3_alg); 524 if (ret) 525 goto des3_err; 526 ret = crypto_register_alg(&ecb_des3_alg); 527 if (ret) 528 goto ecb_des3_err; 529 ret = crypto_register_alg(&cbc_des3_alg); 530 if (ret) 531 goto cbc_des3_err; 532 533 if (crypt_s390_func_available(KMCTR_DEA_ENCRYPT, 534 CRYPT_S390_MSA | CRYPT_S390_MSA4) && 535 crypt_s390_func_available(KMCTR_TDEA_192_ENCRYPT, 536 CRYPT_S390_MSA | CRYPT_S390_MSA4)) { 537 ret = crypto_register_alg(&ctr_des_alg); 538 if (ret) 539 goto ctr_des_err; 540 ret = crypto_register_alg(&ctr_des3_alg); 541 if (ret) 542 goto ctr_des3_err; 543 ctrblk = (u8 *) __get_free_page(GFP_KERNEL); 544 if (!ctrblk) { 545 ret = -ENOMEM; 546 goto ctr_mem_err; 547 } 548 } 549 out: 550 return ret; 551 552 ctr_mem_err: 553 crypto_unregister_alg(&ctr_des3_alg); 554 ctr_des3_err: 555 crypto_unregister_alg(&ctr_des_alg); 556 ctr_des_err: 557 crypto_unregister_alg(&cbc_des3_alg); 558 cbc_des3_err: 559 crypto_unregister_alg(&ecb_des3_alg); 560 ecb_des3_err: 561 crypto_unregister_alg(&des3_alg); 562 des3_err: 563 crypto_unregister_alg(&cbc_des_alg); 564 cbc_des_err: 565 crypto_unregister_alg(&ecb_des_alg); 566 ecb_des_err: 567 crypto_unregister_alg(&des_alg); 568 des_err: 569 goto out; 570 } 571 572 static void __exit des_s390_exit(void) 573 { 574 if (ctrblk) { 575 crypto_unregister_alg(&ctr_des_alg); 576 crypto_unregister_alg(&ctr_des3_alg); 577 free_page((unsigned long) ctrblk); 578 } 579 crypto_unregister_alg(&cbc_des3_alg); 580 crypto_unregister_alg(&ecb_des3_alg); 581 crypto_unregister_alg(&des3_alg); 582 crypto_unregister_alg(&cbc_des_alg); 583 crypto_unregister_alg(&ecb_des_alg); 584 crypto_unregister_alg(&des_alg); 585 } 586 587 module_init(des_s390_init); 588 module_exit(des_s390_exit); 589 590 MODULE_ALIAS("des"); 591 MODULE_ALIAS("des3_ede"); 592 593 MODULE_LICENSE("GPL"); 594 MODULE_DESCRIPTION("DES & Triple DES EDE Cipher Algorithms"); 595