serpent_generic.c (8dd06ef34b6e2f41b29fbf5fc1663780f2524285) serpent_generic.c (784506a1df57737fc8460fd644b30ac8fecaedf0)
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Cryptographic API.
4 *
5 * Serpent Cipher Algorithm.
6 *
7 * Copyright (C) 2002 Dag Arne Osvik <osvik@ii.uib.no>
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Cryptographic API.
4 *
5 * Serpent Cipher Algorithm.
6 *
7 * Copyright (C) 2002 Dag Arne Osvik <osvik@ii.uib.no>
8 * 2003 Herbert Valerio Riedel <hvr@gnu.org>
9 *
10 * Added tnepres support:
11 * Ruben Jesus Garcia Hernandez <ruben@ugr.es>, 18.10.2004
12 * Based on code by hvr
13 */
14
15#include <linux/init.h>
16#include <linux/module.h>
17#include <linux/errno.h>
18#include <asm/byteorder.h>
19#include <linux/crypto.h>
20#include <linux/types.h>

--- 550 unchanged lines hidden (view full) ---

571
572static void serpent_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
573{
574 struct serpent_ctx *ctx = crypto_tfm_ctx(tfm);
575
576 __serpent_decrypt(ctx, dst, src);
577}
578
8 */
9
10#include <linux/init.h>
11#include <linux/module.h>
12#include <linux/errno.h>
13#include <asm/byteorder.h>
14#include <linux/crypto.h>
15#include <linux/types.h>

--- 550 unchanged lines hidden (view full) ---

566
567static void serpent_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
568{
569 struct serpent_ctx *ctx = crypto_tfm_ctx(tfm);
570
571 __serpent_decrypt(ctx, dst, src);
572}
573
579static int tnepres_setkey(struct crypto_tfm *tfm, const u8 *key,
580 unsigned int keylen)
581{
582 u8 rev_key[SERPENT_MAX_KEY_SIZE];
583 int i;
584
585 for (i = 0; i < keylen; ++i)
586 rev_key[keylen - i - 1] = key[i];
587
588 return serpent_setkey(tfm, rev_key, keylen);
589}
590
591static void tnepres_encrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
592{
593 const u32 * const s = (const u32 * const)src;
594 u32 * const d = (u32 * const)dst;
595
596 u32 rs[4], rd[4];
597
598 rs[0] = swab32(s[3]);
599 rs[1] = swab32(s[2]);
600 rs[2] = swab32(s[1]);
601 rs[3] = swab32(s[0]);
602
603 serpent_encrypt(tfm, (u8 *)rd, (u8 *)rs);
604
605 d[0] = swab32(rd[3]);
606 d[1] = swab32(rd[2]);
607 d[2] = swab32(rd[1]);
608 d[3] = swab32(rd[0]);
609}
610
611static void tnepres_decrypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
612{
613 const u32 * const s = (const u32 * const)src;
614 u32 * const d = (u32 * const)dst;
615
616 u32 rs[4], rd[4];
617
618 rs[0] = swab32(s[3]);
619 rs[1] = swab32(s[2]);
620 rs[2] = swab32(s[1]);
621 rs[3] = swab32(s[0]);
622
623 serpent_decrypt(tfm, (u8 *)rd, (u8 *)rs);
624
625 d[0] = swab32(rd[3]);
626 d[1] = swab32(rd[2]);
627 d[2] = swab32(rd[1]);
628 d[3] = swab32(rd[0]);
629}
630
631static struct crypto_alg srp_algs[2] = { {
574static struct crypto_alg srp_alg = {
632 .cra_name = "serpent",
633 .cra_driver_name = "serpent-generic",
634 .cra_priority = 100,
635 .cra_flags = CRYPTO_ALG_TYPE_CIPHER,
636 .cra_blocksize = SERPENT_BLOCK_SIZE,
637 .cra_ctxsize = sizeof(struct serpent_ctx),
638 .cra_alignmask = 3,
639 .cra_module = THIS_MODULE,
640 .cra_u = { .cipher = {
641 .cia_min_keysize = SERPENT_MIN_KEY_SIZE,
642 .cia_max_keysize = SERPENT_MAX_KEY_SIZE,
643 .cia_setkey = serpent_setkey,
644 .cia_encrypt = serpent_encrypt,
645 .cia_decrypt = serpent_decrypt } }
575 .cra_name = "serpent",
576 .cra_driver_name = "serpent-generic",
577 .cra_priority = 100,
578 .cra_flags = CRYPTO_ALG_TYPE_CIPHER,
579 .cra_blocksize = SERPENT_BLOCK_SIZE,
580 .cra_ctxsize = sizeof(struct serpent_ctx),
581 .cra_alignmask = 3,
582 .cra_module = THIS_MODULE,
583 .cra_u = { .cipher = {
584 .cia_min_keysize = SERPENT_MIN_KEY_SIZE,
585 .cia_max_keysize = SERPENT_MAX_KEY_SIZE,
586 .cia_setkey = serpent_setkey,
587 .cia_encrypt = serpent_encrypt,
588 .cia_decrypt = serpent_decrypt } }
646}, {
647 .cra_name = "tnepres",
648 .cra_driver_name = "tnepres-generic",
649 .cra_flags = CRYPTO_ALG_TYPE_CIPHER,
650 .cra_blocksize = SERPENT_BLOCK_SIZE,
651 .cra_ctxsize = sizeof(struct serpent_ctx),
652 .cra_alignmask = 3,
653 .cra_module = THIS_MODULE,
654 .cra_u = { .cipher = {
655 .cia_min_keysize = SERPENT_MIN_KEY_SIZE,
656 .cia_max_keysize = SERPENT_MAX_KEY_SIZE,
657 .cia_setkey = tnepres_setkey,
658 .cia_encrypt = tnepres_encrypt,
659 .cia_decrypt = tnepres_decrypt } }
660} };
589};
661
662static int __init serpent_mod_init(void)
663{
590
591static int __init serpent_mod_init(void)
592{
664 return crypto_register_algs(srp_algs, ARRAY_SIZE(srp_algs));
593 return crypto_register_alg(&srp_alg);
665}
666
667static void __exit serpent_mod_fini(void)
668{
594}
595
596static void __exit serpent_mod_fini(void)
597{
669 crypto_unregister_algs(srp_algs, ARRAY_SIZE(srp_algs));
598 crypto_unregister_alg(&srp_alg);
670}
671
672subsys_initcall(serpent_mod_init);
673module_exit(serpent_mod_fini);
674
675MODULE_LICENSE("GPL");
599}
600
601subsys_initcall(serpent_mod_init);
602module_exit(serpent_mod_fini);
603
604MODULE_LICENSE("GPL");
676MODULE_DESCRIPTION("Serpent and tnepres (kerneli compatible serpent reversed) Cipher Algorithm");
605MODULE_DESCRIPTION("Serpent Cipher Algorithm");
677MODULE_AUTHOR("Dag Arne Osvik <osvik@ii.uib.no>");
606MODULE_AUTHOR("Dag Arne Osvik <osvik@ii.uib.no>");
678MODULE_ALIAS_CRYPTO("tnepres");
679MODULE_ALIAS_CRYPTO("serpent");
680MODULE_ALIAS_CRYPTO("serpent-generic");
607MODULE_ALIAS_CRYPTO("serpent");
608MODULE_ALIAS_CRYPTO("serpent-generic");