summaryrefslogtreecommitdiff
path: root/linux/net/ipsec/alg
diff options
context:
space:
mode:
Diffstat (limited to 'linux/net/ipsec/alg')
-rw-r--r--linux/net/ipsec/alg/Config.alg_aes.in3
-rw-r--r--linux/net/ipsec/alg/Config.alg_blowfish.in3
-rw-r--r--linux/net/ipsec/alg/Config.alg_cryptoapi.in3
-rw-r--r--linux/net/ipsec/alg/Config.alg_serpent.in3
-rw-r--r--linux/net/ipsec/alg/Config.alg_sha2.in3
-rw-r--r--linux/net/ipsec/alg/Config.alg_twofish.in3
-rw-r--r--linux/net/ipsec/alg/Config.in7
-rw-r--r--linux/net/ipsec/alg/Makefile112
-rw-r--r--linux/net/ipsec/alg/Makefile.alg_aes23
-rw-r--r--linux/net/ipsec/alg/Makefile.alg_blowfish23
-rw-r--r--linux/net/ipsec/alg/Makefile.alg_cryptoapi14
-rw-r--r--linux/net/ipsec/alg/Makefile.alg_serpent21
-rw-r--r--linux/net/ipsec/alg/Makefile.alg_sha222
-rw-r--r--linux/net/ipsec/alg/Makefile.alg_twofish21
-rw-r--r--linux/net/ipsec/alg/ipsec_alg_aes.c253
-rw-r--r--linux/net/ipsec/alg/ipsec_alg_blowfish.c142
-rw-r--r--linux/net/ipsec/alg/ipsec_alg_cryptoapi.c421
-rw-r--r--linux/net/ipsec/alg/ipsec_alg_serpent.c139
-rw-r--r--linux/net/ipsec/alg/ipsec_alg_sha2.c185
-rw-r--r--linux/net/ipsec/alg/ipsec_alg_twofish.c138
-rw-r--r--linux/net/ipsec/alg/scripts/mk-static_init.c.sh18
21 files changed, 1557 insertions, 0 deletions
diff --git a/linux/net/ipsec/alg/Config.alg_aes.in b/linux/net/ipsec/alg/Config.alg_aes.in
new file mode 100644
index 000000000..4a2f81a0b
--- /dev/null
+++ b/linux/net/ipsec/alg/Config.alg_aes.in
@@ -0,0 +1,3 @@
+if [ "$CONFIG_IPSEC_ALG" = "y" ]; then
+ tristate ' AES encryption algorithm' CONFIG_IPSEC_ALG_AES
+fi
diff --git a/linux/net/ipsec/alg/Config.alg_blowfish.in b/linux/net/ipsec/alg/Config.alg_blowfish.in
new file mode 100644
index 000000000..a4e5709b0
--- /dev/null
+++ b/linux/net/ipsec/alg/Config.alg_blowfish.in
@@ -0,0 +1,3 @@
+if [ "$CONFIG_IPSEC_ALG" = "y" ]; then
+ tristate ' BLOWFISH encryption algorithm' CONFIG_IPSEC_ALG_BLOWFISH
+fi
diff --git a/linux/net/ipsec/alg/Config.alg_cryptoapi.in b/linux/net/ipsec/alg/Config.alg_cryptoapi.in
new file mode 100644
index 000000000..c2c66eed8
--- /dev/null
+++ b/linux/net/ipsec/alg/Config.alg_cryptoapi.in
@@ -0,0 +1,3 @@
+if [ "$CONFIG_IPSEC_ALG" = "y" ]; then
+ dep_tristate ' CRYPTOAPI ciphers support (needs cryptoapi patch)' CONFIG_IPSEC_ALG_CRYPTOAPI $CONFIG_CRYPTO
+fi
diff --git a/linux/net/ipsec/alg/Config.alg_serpent.in b/linux/net/ipsec/alg/Config.alg_serpent.in
new file mode 100644
index 000000000..fb1a88460
--- /dev/null
+++ b/linux/net/ipsec/alg/Config.alg_serpent.in
@@ -0,0 +1,3 @@
+if [ "$CONFIG_IPSEC_ALG" = "y" ]; then
+ tristate ' SERPENT encryption algorithm' CONFIG_IPSEC_ALG_SERPENT
+fi
diff --git a/linux/net/ipsec/alg/Config.alg_sha2.in b/linux/net/ipsec/alg/Config.alg_sha2.in
new file mode 100644
index 000000000..2d26c814b
--- /dev/null
+++ b/linux/net/ipsec/alg/Config.alg_sha2.in
@@ -0,0 +1,3 @@
+if [ "$CONFIG_IPSEC_ALG" = "y" ]; then
+ tristate ' HMAC_SHA2 auth algorithm' CONFIG_IPSEC_ALG_SHA2
+fi
diff --git a/linux/net/ipsec/alg/Config.alg_twofish.in b/linux/net/ipsec/alg/Config.alg_twofish.in
new file mode 100644
index 000000000..13655649d
--- /dev/null
+++ b/linux/net/ipsec/alg/Config.alg_twofish.in
@@ -0,0 +1,3 @@
+if [ "$CONFIG_IPSEC_ALG" = "y" ]; then
+ tristate ' TWOFISH encryption algorithm' CONFIG_IPSEC_ALG_TWOFISH
+fi
diff --git a/linux/net/ipsec/alg/Config.in b/linux/net/ipsec/alg/Config.in
new file mode 100644
index 000000000..be5990e3a
--- /dev/null
+++ b/linux/net/ipsec/alg/Config.in
@@ -0,0 +1,7 @@
+#Placeholder
+source net/ipsec/alg/Config.alg_aes.in
+source net/ipsec/alg/Config.alg_blowfish.in
+source net/ipsec/alg/Config.alg_twofish.in
+source net/ipsec/alg/Config.alg_serpent.in
+source net/ipsec/alg/Config.alg_cryptoapi.in
+source net/ipsec/alg/Config.alg_sha2.in
diff --git a/linux/net/ipsec/alg/Makefile b/linux/net/ipsec/alg/Makefile
new file mode 100644
index 000000000..2249668f5
--- /dev/null
+++ b/linux/net/ipsec/alg/Makefile
@@ -0,0 +1,112 @@
+# $Id: Makefile,v 1.2 2004/03/22 21:53:19 as Exp $
+ifeq ($(strip $(KLIPSMODULE)),)
+FREESWANSRCDIR=.
+else
+FREESWANSRCDIR=../../../..
+endif
+ifeq ($(strip $(KLIPS_TOP)),)
+KLIPS_TOP=../../..
+override EXTRA_CFLAGS += -I$(KLIPS_TOP)/include
+endif
+
+ifeq ($(CONFIG_IPSEC_DEBUG),y)
+override EXTRA_CFLAGS += -g
+endif
+
+# LIBCRYPTO normally comes as an argument from "parent" Makefile
+# (this applies both to FS' "make module" and eg. Linux' "make modules"
+# But make dep doest follow same evaluations, so we need this default:
+LIBCRYPTO=$(TOPDIR)/lib/libcrypto
+
+override EXTRA_CFLAGS += -I$(LIBCRYPTO)/include
+override EXTRA_CFLAGS += -Wall -Wpointer-arith -Wstrict-prototypes
+
+MOD_LIST_NAME := NET_MISC_MODULES
+
+#O_TARGET := static_init.o
+
+subdir- :=
+subdir-n :=
+subdir-y :=
+subdir-m :=
+
+obj-y := static_init.o
+
+ARCH_ASM-y :=
+ARCH_ASM-$(CONFIG_M586) := i586
+ARCH_ASM-$(CONFIG_M586TSC) := i586
+ARCH_ASM-$(CONFIG_M586MMX) := i586
+ARCH_ASM-$(CONFIG_MK6) := i586
+ARCH_ASM-$(CONFIG_M686) := i686
+ARCH_ASM-$(CONFIG_MPENTIUMIII) := i686
+ARCH_ASM-$(CONFIG_MPENTIUM4) := i686
+ARCH_ASM-$(CONFIG_MK7) := i686
+ARCH_ASM-$(CONFIG_MCRUSOE) := i586
+ARCH_ASM-$(CONFIG_MWINCHIPC6) := i586
+ARCH_ASM-$(CONFIG_MWINCHIP2) := i586
+ARCH_ASM-$(CONFIG_MWINCHIP3D) := i586
+ARCH_ASM-$(CONFIG_USERMODE) := i586
+
+ARCH_ASM :=$(ARCH_ASM-y)
+ifdef NO_ASM
+ARCH_ASM :=
+endif
+
+# The algorithm makefiles may put dependences, short-circuit them
+null:
+
+makefiles=$(filter-out %.preipsec, $(wildcard Makefile.alg_*))
+ifneq ($(makefiles),)
+#include Makefile.alg_aes
+#include Makefile.alg_aes-opt
+include $(makefiles)
+endif
+
+# These rules translate from new to old makefile rules
+# Translate to Rules.make lists.
+multi-used := $(filter $(list-multi), $(obj-y) $(obj-m))
+multi-objs := $(foreach m, $(multi-used), $($(basename $(m))-objs))
+active-objs := $(sort $(multi-objs) $(obj-y) $(obj-m))
+O_OBJS := $(obj-y)
+M_OBJS := $(obj-m)
+MIX_OBJS := $(filter $(export-objs), $(active-objs))
+#OX_OBJS := $(export-objs)
+SUB_DIRS := $(subdir-y)
+ALL_SUB_DIRS := $(subdir-y) $(subdir-m)
+MOD_SUB_DIRS := $(subdir-m)
+
+
+static_init_mod.o: $(obj-y)
+ rm -f $@
+ $(LD) $(LD_EXTRAFLAGS) $(obj-y) -r -o $@
+
+perlasm: $(LIBCRYPTO)/perlasm
+ ln -sf $? $@
+
+$(obj-y) $(obj-m): $(TOPDIR)/include/linux/config.h $(TOPDIR)/include/linux/autoconf.h $(KLIPS_TOP)/include/freeswan/ipsec_alg.h
+$(alg_obj-y) $(alg_obj-m): perlasm $(TOPDIR)/include/linux/config.h $(TOPDIR)/include/linux/autoconf.h $(KLIPS_TOP)/include/freeswan/ipsec_alg.h
+
+
+all_alg_modules: perlasm $(ALG_MODULES)
+ @echo "ALG_MODULES=$(ALG_MODULES)"
+
+
+#
+# Construct alg. init. function: call ipsec_ALGO_init() for every static algo
+# Needed when there are static algos (with static or modular ipsec.o)
+#
+static_init.c: $(TOPDIR)/include/linux/autoconf.h Makefile $(makefiles) scripts/mk-static_init.c.sh
+ @echo "Re-creating $@"
+ $(SHELL) scripts/mk-static_init.c.sh $(static_init-func-y) > $@
+
+clean:
+ @for i in $(ALG_SUBDIRS);do test -d $$i && make -C $$i clean;done;exit 0
+ @find . -type l -exec rm -f {} \;
+ -rm -f perlasm
+ -rm -rf $(ALG_SUBDIRS)
+ -rm -f *.o .*.o.flags static_init.c
+
+ifdef TOPDIR
+include $(TOPDIR)/Rules.make
+endif
+
diff --git a/linux/net/ipsec/alg/Makefile.alg_aes b/linux/net/ipsec/alg/Makefile.alg_aes
new file mode 100644
index 000000000..75284c47a
--- /dev/null
+++ b/linux/net/ipsec/alg/Makefile.alg_aes
@@ -0,0 +1,23 @@
+MOD_AES := ipsec_aes.o
+
+ALG_MODULES += $(MOD_AES)
+ALG_SUBDIRS += libaes
+
+obj-$(CONFIG_IPSEC_ALG_AES) += $(MOD_AES)
+static_init-func-$(CONFIG_IPSEC_ALG_AES)+= ipsec_aes_init
+alg_obj-$(CONFIG_IPSEC_ALG_AES) += ipsec_alg_aes.o
+
+AES_OBJS := ipsec_alg_aes.o libaes/libaes.a
+
+$(MOD_AES): libaes $(AES_OBJS)
+ $(LD) $(EXTRA_LDFLAGS) -r $(AES_OBJS) -o $@
+
+libaes: $(LIBCRYPTO)/libaes
+ test -d $@ || mkdir $@ ;exit 0
+ test -d $@/asm || mkdir $@/asm;exit 0
+ cd $@ && ln -sf $?/Makefile $?/*.[chS] .
+ cd $@/asm && ln -sf $?/asm/*.S .
+
+libaes/libaes.a: libaes
+ ( cd libaes && \
+ $(MAKE) CC='$(CC)' 'ARCH_ASM=$(ARCH_ASM)' CFLAGS='$(CFLAGS) $(EXTRA_CFLAGS)' libaes.a ;)
diff --git a/linux/net/ipsec/alg/Makefile.alg_blowfish b/linux/net/ipsec/alg/Makefile.alg_blowfish
new file mode 100644
index 000000000..9413a9f1c
--- /dev/null
+++ b/linux/net/ipsec/alg/Makefile.alg_blowfish
@@ -0,0 +1,23 @@
+MOD_BLOWFISH := ipsec_blowfish.o
+
+ALG_MODULES += $(MOD_BLOWFISH)
+ALG_SUBDIRS += libblowfish
+
+obj-$(CONFIG_IPSEC_ALG_BLOWFISH) += $(MOD_BLOWFISH)
+static_init-func-$(CONFIG_IPSEC_ALG_BLOWFISH)+= ipsec_blowfish_init
+alg_obj-$(CONFIG_IPSEC_ALG_BLOWFISH) += ipsec_alg_blowfish.o
+
+BLOWFISH_OBJS:= ipsec_alg_blowfish.o libblowfish/libblowfish.a
+
+$(MOD_BLOWFISH): libblowfish $(BLOWFISH_OBJS)
+ $(LD) -r $(BLOWFISH_OBJS) -o $@
+
+libblowfish : $(LIBCRYPTO)/libblowfish
+ test -d $@ || mkdir $@ ;exit 0
+ test -d $@/asm || mkdir $@/asm;exit 0
+ cd $@ && ln -sf $?/Makefile $?/*.[chS] .
+ cd $@/asm && ln -sf $?/asm/*.pl .
+
+libblowfish/libblowfish.a:
+ ( cd libblowfish && \
+ $(MAKE) CC='$(CC)' 'ARCH_ASM=$(ARCH_ASM)' CFLAGS='$(CFLAGS) $(EXTRA_CFLAGS)' EXTRA_CFLAGS='$(EXTRA_CFLAGS)' libblowfish.a ;)
diff --git a/linux/net/ipsec/alg/Makefile.alg_cryptoapi b/linux/net/ipsec/alg/Makefile.alg_cryptoapi
new file mode 100644
index 000000000..77ee6481f
--- /dev/null
+++ b/linux/net/ipsec/alg/Makefile.alg_cryptoapi
@@ -0,0 +1,14 @@
+MOD_CRYPTOAPI := ipsec_cryptoapi.o
+
+ifneq ($(wildcard $(TOPDIR)/include/linux/crypto.h),)
+ALG_MODULES += $(MOD_CRYPTOAPI)
+obj-$(CONFIG_IPSEC_ALG_CRYPTOAPI) += $(MOD_CRYPTOAPI)
+static_init-func-$(CONFIG_IPSEC_ALG_CRYPTOAPI)+= ipsec_cryptoapi_init
+alg_obj-$(CONFIG_IPSEC_ALG_CRYPTOAPI) += ipsec_alg_cryptoapi.o
+else
+$(warning "Linux CryptoAPI (2.4.22+ or 2.6.x) not found, not building ipsec_cryptoapi.o")
+endif
+
+CRYPTOAPI_OBJS := ipsec_alg_cryptoapi.o
+$(MOD_CRYPTOAPI): $(CRYPTOAPI_OBJS)
+ $(LD) -r $(CRYPTOAPI_OBJS) -o $@
diff --git a/linux/net/ipsec/alg/Makefile.alg_serpent b/linux/net/ipsec/alg/Makefile.alg_serpent
new file mode 100644
index 000000000..1a2383a6a
--- /dev/null
+++ b/linux/net/ipsec/alg/Makefile.alg_serpent
@@ -0,0 +1,21 @@
+MOD_SERPENT := ipsec_serpent.o
+
+ALG_MODULES += $(MOD_SERPENT)
+ALG_SUBDIRS += libserpent
+
+obj-$(CONFIG_IPSEC_ALG_SERPENT) += $(MOD_SERPENT)
+static_init-func-$(CONFIG_IPSEC_ALG_SERPENT)+= ipsec_serpent_init
+alg_obj-$(CONFIG_IPSEC_ALG_SERPENT) += ipsec_alg_serpent.o
+
+SERPENT_OBJS=ipsec_alg_serpent.o libserpent/libserpent.a
+$(MOD_SERPENT) : libserpent $(SERPENT_OBJS)
+ $(LD) -r $(SERPENT_OBJS) -o $@
+
+libserpent : $(LIBCRYPTO)/libserpent
+ test -d $@ || mkdir $@ ;exit 0
+ test -d $@/asm || mkdir $@/asm;exit 0
+ cd $@ && ln -sf $?/Makefile $?/*.[chS] .
+
+libserpent/libserpent.a:
+ ( cd libserpent && \
+ $(MAKE) CC='$(CC)' CFLAGS='$(CFLAGS) $(EXTRA_CFLAGS)' EXTRA_CFLAGS='$(EXTRA_CFLAGS)' libserpent.a ;)
diff --git a/linux/net/ipsec/alg/Makefile.alg_sha2 b/linux/net/ipsec/alg/Makefile.alg_sha2
new file mode 100644
index 000000000..956a0f1a3
--- /dev/null
+++ b/linux/net/ipsec/alg/Makefile.alg_sha2
@@ -0,0 +1,22 @@
+MOD_SHA2 := ipsec_sha2.o
+
+ALG_MODULES += $(MOD_SHA2)
+ALG_SUBDIRS += libsha2
+
+obj-$(CONFIG_IPSEC_ALG_SHA2) += $(MOD_SHA2)
+static_init-func-$(CONFIG_IPSEC_ALG_SHA2)+= ipsec_sha2_init
+alg_obj-$(CONFIG_IPSEC_ALG_SHA2) += ipsec_alg_sha2.o
+
+SHA2_OBJS := ipsec_alg_sha2.o libsha2/libsha2.a
+
+$(MOD_SHA2): libsha2 $(SHA2_OBJS)
+ $(LD) $(EXTRA_LDFLAGS) -r $(SHA2_OBJS) -o $@
+
+libsha2 : $(LIBCRYPTO)/libsha2
+ test -d $@ || mkdir $@ ;exit 0
+ test -d $@/asm || mkdir $@/asm;exit 0
+ cd $@ && ln -sf $?/Makefile $?/*.[chS] .
+
+libsha2/libsha2.a:
+ ( cd libsha2 && \
+ $(MAKE) CC='$(CC)' CFLAGS='$(CFLAGS) $(EXTRA_CFLAGS)' EXTRA_CFLAGS='$(EXTRA_CFLAGS)' libsha2.a ;)
diff --git a/linux/net/ipsec/alg/Makefile.alg_twofish b/linux/net/ipsec/alg/Makefile.alg_twofish
new file mode 100644
index 000000000..559285ddd
--- /dev/null
+++ b/linux/net/ipsec/alg/Makefile.alg_twofish
@@ -0,0 +1,21 @@
+MOD_TWOFISH := ipsec_twofish.o
+
+ALG_MODULES += $(MOD_TWOFISH)
+ALG_SUBDIRS += libtwofish
+
+obj-$(CONFIG_IPSEC_ALG_TWOFISH) += $(MOD_TWOFISH)
+static_init-func-$(CONFIG_IPSEC_ALG_TWOFISH)+= ipsec_twofish_init
+alg_obj-$(CONFIG_IPSEC_ALG_TWOFISH) += ipsec_alg_twofish.o
+
+TWOFISH_OBJS := ipsec_alg_twofish.o libtwofish/libtwofish.a
+$(MOD_TWOFISH): libtwofish $(TWOFISH_OBJS)
+ $(LD) -r $(TWOFISH_OBJS) -o $@
+
+libtwofish : $(LIBCRYPTO)/libtwofish
+ test -d $@ || mkdir $@ ;exit 0
+ test -d $@/asm || mkdir $@/asm;exit 0
+ cd $@ && ln -sf $?/Makefile $?/*.[chS] .
+
+libtwofish/libtwofish.a:
+ ( cd libtwofish && \
+ $(MAKE) CC='$(CC)' CFLAGS='$(CFLAGS) $(EXTRA_CFLAGS)' EXTRA_CFLAGS='$(EXTRA_CFLAGS)' libtwofish.a ;)
diff --git a/linux/net/ipsec/alg/ipsec_alg_aes.c b/linux/net/ipsec/alg/ipsec_alg_aes.c
new file mode 100644
index 000000000..c6b390281
--- /dev/null
+++ b/linux/net/ipsec/alg/ipsec_alg_aes.c
@@ -0,0 +1,253 @@
+/*
+ * ipsec_alg AES cipher stubs
+ *
+ * Author: JuanJo Ciarlante <jjo-ipsec@mendoza.gov.ar>
+ *
+ * $Id: ipsec_alg_aes.c,v 1.2 2004/03/22 21:53:19 as Exp $
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * Fixes by:
+ * PK: Pawel Krawczyk <kravietz@aba.krakow.pl>
+ * Fixes list:
+ * PK: make XCBC comply with latest draft (keylength)
+ *
+ */
+#include <linux/config.h>
+#include <linux/version.h>
+
+/*
+ * special case: ipsec core modular with this static algo inside:
+ * must avoid MODULE magic for this file
+ */
+#if CONFIG_IPSEC_MODULE && CONFIG_IPSEC_ALG_AES
+#undef MODULE
+#endif
+
+#include <linux/module.h>
+#include <linux/init.h>
+
+#include <linux/kernel.h> /* printk() */
+#include <linux/errno.h> /* error codes */
+#include <linux/types.h> /* size_t */
+#include <linux/string.h>
+
+/* Check if __exit is defined, if not null it */
+#ifndef __exit
+#define __exit
+#endif
+
+/* Low freeswan header coupling */
+#include "freeswan/ipsec_alg.h"
+#include "libaes/aes_cbc.h"
+
+#define CONFIG_IPSEC_ALG_AES_MAC 1
+
+#define AES_CONTEXT_T aes_context
+MODULE_AUTHOR("JuanJo Ciarlante <jjo-ipsec@mendoza.gov.ar>");
+static int debug=0;
+MODULE_PARM(debug, "i");
+static int test=0;
+MODULE_PARM(test, "i");
+static int excl=0;
+MODULE_PARM(excl, "i");
+static int keyminbits=0;
+MODULE_PARM(keyminbits, "i");
+static int keymaxbits=0;
+MODULE_PARM(keymaxbits, "i");
+
+#if CONFIG_IPSEC_ALG_AES_MAC
+#include "libaes/aes_xcbc_mac.h"
+
+/*
+ * Not IANA number yet (draft-ietf-ipsec-ciph-aes-xcbc-mac-00.txt).
+ * We use 9 for non-modular algorithm and none for modular, thus
+ * forcing user to specify one on module load. -kravietz
+ */
+#ifdef MODULE
+static int auth_id=0;
+#else
+static int auth_id=9;
+#endif
+MODULE_PARM(auth_id, "i");
+#endif
+
+#define ESP_AES 12 /* truely _constant_ :) */
+
+/* 128, 192 or 256 */
+#define ESP_AES_KEY_SZ_MIN 16 /* 128 bit secret key */
+#define ESP_AES_KEY_SZ_MAX 32 /* 256 bit secret key */
+#define ESP_AES_CBC_BLK_LEN 16 /* AES-CBC block size */
+
+/* Values according to draft-ietf-ipsec-ciph-aes-xcbc-mac-02.txt
+ * -kravietz
+ */
+#define ESP_AES_MAC_KEY_SZ 16 /* 128 bit MAC key */
+#define ESP_AES_MAC_BLK_LEN 16 /* 128 bit block */
+
+static int _aes_set_key(struct ipsec_alg_enc *alg, __u8 * key_e, const __u8 * key, size_t keysize) {
+ int ret;
+ AES_CONTEXT_T *ctx=(AES_CONTEXT_T*)key_e;
+ ret=AES_set_key(ctx, key, keysize)!=0? 0: -EINVAL;
+ if (debug > 0)
+ printk(KERN_DEBUG "klips_debug:_aes_set_key:"
+ "ret=%d key_e=%p key=%p keysize=%d\n",
+ ret, key_e, key, keysize);
+ return ret;
+}
+static int _aes_cbc_encrypt(struct ipsec_alg_enc *alg, __u8 * key_e, __u8 * in, int ilen, const __u8 * iv, int encrypt) {
+ AES_CONTEXT_T *ctx=(AES_CONTEXT_T*)key_e;
+ if (debug > 0)
+ printk(KERN_DEBUG "klips_debug:_aes_cbc_encrypt:"
+ "key_e=%p in=%p ilen=%d iv=%p encrypt=%d\n",
+ key_e, in, ilen, iv, encrypt);
+ return AES_cbc_encrypt(ctx, in, in, ilen, iv, encrypt);
+}
+#if CONFIG_IPSEC_ALG_AES_MAC
+static int _aes_mac_set_key(struct ipsec_alg_auth *alg, __u8 * key_a, const __u8 * key, int keylen) {
+ aes_context_mac *ctxm=(aes_context_mac *)key_a;
+ return AES_xcbc_mac_set_key(ctxm, key, keylen)? 0 : -EINVAL;
+}
+static int _aes_mac_hash(struct ipsec_alg_auth *alg, __u8 * key_a, const __u8 * dat, int len, __u8 * hash, int hashlen) {
+ int ret;
+ char hash_buf[16];
+ aes_context_mac *ctxm=(aes_context_mac *)key_a;
+ ret=AES_xcbc_mac_hash(ctxm, dat, len, hash_buf);
+ memcpy(hash, hash_buf, hashlen);
+ return ret;
+}
+static struct ipsec_alg_auth ipsec_alg_AES_MAC = {
+ ixt_version: IPSEC_ALG_VERSION,
+ ixt_module: THIS_MODULE,
+ ixt_refcnt: ATOMIC_INIT(0),
+ ixt_alg_type: IPSEC_ALG_TYPE_AUTH,
+ ixt_alg_id: 0,
+ ixt_name: "aes_mac",
+ ixt_blocksize: ESP_AES_MAC_BLK_LEN,
+ ixt_keyminbits: ESP_AES_MAC_KEY_SZ*8,
+ ixt_keymaxbits: ESP_AES_MAC_KEY_SZ*8,
+ ixt_a_keylen: ESP_AES_MAC_KEY_SZ,
+ ixt_a_ctx_size: sizeof(aes_context_mac),
+ ixt_a_hmac_set_key: _aes_mac_set_key,
+ ixt_a_hmac_hash:_aes_mac_hash,
+};
+#endif /* CONFIG_IPSEC_ALG_AES_MAC */
+static struct ipsec_alg_enc ipsec_alg_AES = {
+ ixt_version: IPSEC_ALG_VERSION,
+ ixt_module: THIS_MODULE,
+ ixt_refcnt: ATOMIC_INIT(0),
+ ixt_alg_type: IPSEC_ALG_TYPE_ENCRYPT,
+ ixt_alg_id: ESP_AES,
+ ixt_name: "aes",
+ ixt_blocksize: ESP_AES_CBC_BLK_LEN,
+ ixt_keyminbits: ESP_AES_KEY_SZ_MIN*8,
+ ixt_keymaxbits: ESP_AES_KEY_SZ_MAX*8,
+ ixt_e_keylen: ESP_AES_KEY_SZ_MAX,
+ ixt_e_ctx_size: sizeof(AES_CONTEXT_T),
+ ixt_e_set_key: _aes_set_key,
+ ixt_e_cbc_encrypt:_aes_cbc_encrypt,
+};
+
+IPSEC_ALG_MODULE_INIT( ipsec_aes_init )
+{
+ int ret, test_ret;
+ if (keyminbits)
+ ipsec_alg_AES.ixt_keyminbits=keyminbits;
+ if (keymaxbits) {
+ ipsec_alg_AES.ixt_keymaxbits=keymaxbits;
+ if (keymaxbits*8>ipsec_alg_AES.ixt_keymaxbits)
+ ipsec_alg_AES.ixt_e_keylen=keymaxbits*8;
+ }
+ if (excl) ipsec_alg_AES.ixt_state |= IPSEC_ALG_ST_EXCL;
+ ret=register_ipsec_alg_enc(&ipsec_alg_AES);
+ printk("ipsec_aes_init(alg_type=%d alg_id=%d name=%s): ret=%d\n",
+ ipsec_alg_AES.ixt_alg_type,
+ ipsec_alg_AES.ixt_alg_id,
+ ipsec_alg_AES.ixt_name,
+ ret);
+ if (ret==0 && test) {
+ test_ret=ipsec_alg_test(
+ ipsec_alg_AES.ixt_alg_type,
+ ipsec_alg_AES.ixt_alg_id,
+ test);
+ printk("ipsec_aes_init(alg_type=%d alg_id=%d): test_ret=%d\n",
+ ipsec_alg_AES.ixt_alg_type,
+ ipsec_alg_AES.ixt_alg_id,
+ test_ret);
+ }
+#if CONFIG_IPSEC_ALG_AES_MAC
+ if (auth_id!=0){
+ int ret;
+ ipsec_alg_AES_MAC.ixt_alg_id=auth_id;
+ ret=register_ipsec_alg_auth(&ipsec_alg_AES_MAC);
+ printk("ipsec_aes_init(alg_type=%d alg_id=%d name=%s): ret=%d\n",
+ ipsec_alg_AES_MAC.ixt_alg_type,
+ ipsec_alg_AES_MAC.ixt_alg_id,
+ ipsec_alg_AES_MAC.ixt_name,
+ ret);
+ if (ret==0 && test) {
+ test_ret=ipsec_alg_test(
+ ipsec_alg_AES_MAC.ixt_alg_type,
+ ipsec_alg_AES_MAC.ixt_alg_id,
+ test);
+ printk("ipsec_aes_init(alg_type=%d alg_id=%d): test_ret=%d\n",
+ ipsec_alg_AES_MAC.ixt_alg_type,
+ ipsec_alg_AES_MAC.ixt_alg_id,
+ test_ret);
+ }
+ } else {
+ printk(KERN_DEBUG "klips_debug: experimental ipsec_alg_AES_MAC not registered [Ok] (auth_id=%d)\n", auth_id);
+ }
+#endif /* CONFIG_IPSEC_ALG_AES_MAC */
+ return ret;
+}
+IPSEC_ALG_MODULE_EXIT( ipsec_aes_fini )
+{
+#if CONFIG_IPSEC_ALG_AES_MAC
+ if (auth_id) unregister_ipsec_alg_auth(&ipsec_alg_AES_MAC);
+#endif /* CONFIG_IPSEC_ALG_AES_MAC */
+ unregister_ipsec_alg_enc(&ipsec_alg_AES);
+ return;
+}
+#ifdef MODULE_LICENSE
+MODULE_LICENSE("GPL");
+#endif
+
+#if 0+NOT_YET
+#ifndef MODULE
+/*
+ * This is intended for static module setups, currently
+ * doesn't work for modular ipsec.o with static algos inside
+ */
+static int setup_keybits(const char *str)
+{
+ unsigned aux;
+ char *end;
+
+ aux = simple_strtoul(str,&end,0);
+ if (aux != 128 && aux != 192 && aux != 256)
+ return 0;
+ keyminbits = aux;
+
+ if (*end == 0 || *end != ',')
+ return 1;
+ str=end+1;
+ aux = simple_strtoul(str, NULL, 0);
+ if (aux != 128 && aux != 192 && aux != 256)
+ return 0;
+ if (aux >= keyminbits)
+ keymaxbits = aux;
+ return 1;
+}
+__setup("ipsec_aes_keybits=", setup_keybits);
+#endif
+#endif
+EXPORT_NO_SYMBOLS;
diff --git a/linux/net/ipsec/alg/ipsec_alg_blowfish.c b/linux/net/ipsec/alg/ipsec_alg_blowfish.c
new file mode 100644
index 000000000..6adc22b22
--- /dev/null
+++ b/linux/net/ipsec/alg/ipsec_alg_blowfish.c
@@ -0,0 +1,142 @@
+/* ipsec_alg BLOWFISH cipher stubs
+ *
+ * Author: JuanJo Ciarlante <jjo-ipsec@mendoza.gov.ar>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * RCS ID $Id: ipsec_alg_blowfish.c,v 1.3 2004/09/17 18:57:30 as Exp $
+ */
+
+#include <linux/config.h>
+#include <linux/version.h>
+
+/*
+ * special case: ipsec core modular with this static algo inside:
+ * must avoid MODULE magic for this file
+ */
+#if CONFIG_IPSEC_MODULE && CONFIG_IPSEC_ALG_BLOWFISH
+#undef MODULE
+#endif
+
+#include <linux/module.h>
+#include <linux/init.h>
+
+#include <linux/kernel.h> /* printk() */
+#include <linux/errno.h> /* error codes */
+#include <linux/types.h> /* size_t */
+#include <linux/string.h>
+
+/* Check if __exit is defined, if not null it */
+#ifndef __exit
+#define __exit
+#endif
+
+/* Low freeswan header coupling */
+#include "freeswan/ipsec_alg.h"
+#include "libblowfish/blowfish.h"
+#define blowfish_context BF_KEY
+
+#define ESP_BLOWFISH 7 /* truly _constant_ :) */
+
+#define ESP_BLOWFISH_KEY_SZ_MIN 16 /* 128 bit secret key min */
+#define ESP_BLOWFISH_KEY_SZ 16 /* 128 bit secret key */
+#define ESP_BLOWFISH_KEY_SZ_MAX 56 /* 448 bit secret key max */
+#define ESP_BLOWFISH_CBC_BLK_LEN 8 /* block size */
+
+MODULE_AUTHOR("JuanJo Ciarlante <jjo-ipsec@mendoza.gov.ar>");
+static int debug=0;
+MODULE_PARM(debug, "i");
+static int test=0;
+MODULE_PARM(test, "i");
+static int excl=0;
+MODULE_PARM(excl, "i");
+static int keyminbits=0;
+MODULE_PARM(keyminbits, "i");
+static int keymaxbits=0;
+MODULE_PARM(keymaxbits, "i");
+
+static int _blowfish_set_key(struct ipsec_alg_enc *alg, __u8 * key_e, const __u8 * key, size_t keysize) {
+ blowfish_context *ctx=(blowfish_context*)key_e;
+ if (debug > 0)
+ printk(KERN_DEBUG "klips_debug:_blowfish_set_key:"
+ "key_e=%p key=%p keysize=%d\n",
+ key_e, key, keysize);
+ BF_set_key(ctx, keysize, (unsigned char *)key);
+ return 0;
+}
+static int _blowfish_cbc_encrypt(struct ipsec_alg_enc *alg, __u8 * key_e, __u8 * in, int ilen, const __u8 *iv, int encrypt) {
+ /* blowfish toasts passed IV */
+ __u8 iv_buf[ESP_BLOWFISH_CBC_BLK_LEN];
+ blowfish_context *ctx=(blowfish_context*)key_e;
+ *((__u32*)&(iv_buf)) = ((__u32*)(iv))[0];
+ *((__u32*)&(iv_buf)+1) = ((__u32*)(iv))[1];
+ if (debug > 0)
+ printk(KERN_DEBUG "klips_debug:_blowfish_cbc_encrypt:"
+ "key_e=%p in=%p ilen=%d iv=%p encrypt=%d\n",
+ key_e, in, ilen, iv_buf, encrypt);
+ BF_cbc_encrypt(in, in, ilen, ctx, iv_buf, encrypt);
+ return ilen;
+}
+static struct ipsec_alg_enc ipsec_alg_BLOWFISH = {
+ ixt_version: IPSEC_ALG_VERSION,
+ ixt_module: THIS_MODULE,
+ ixt_refcnt: ATOMIC_INIT(0),
+ ixt_alg_type: IPSEC_ALG_TYPE_ENCRYPT,
+ ixt_alg_id: ESP_BLOWFISH,
+ ixt_name: "blowfish",
+ ixt_blocksize: ESP_BLOWFISH_CBC_BLK_LEN,
+ ixt_keyminbits: ESP_BLOWFISH_KEY_SZ_MIN*8,
+ ixt_keymaxbits: ESP_BLOWFISH_KEY_SZ_MAX*8,
+ ixt_e_keylen: ESP_BLOWFISH_KEY_SZ,
+ ixt_e_ctx_size: sizeof(blowfish_context),
+ ixt_e_set_key: _blowfish_set_key,
+ ixt_e_cbc_encrypt:_blowfish_cbc_encrypt,
+};
+
+IPSEC_ALG_MODULE_INIT(ipsec_blowfish_init)
+{
+ int ret, test_ret;
+ if (keyminbits)
+ ipsec_alg_BLOWFISH.ixt_keyminbits=keyminbits;
+ if (keymaxbits) {
+ ipsec_alg_BLOWFISH.ixt_keymaxbits=keymaxbits;
+ if (keymaxbits*8>ipsec_alg_BLOWFISH.ixt_keymaxbits)
+ ipsec_alg_BLOWFISH.ixt_e_keylen=keymaxbits*8;
+ }
+ if (excl) ipsec_alg_BLOWFISH.ixt_state |= IPSEC_ALG_ST_EXCL;
+ ret=register_ipsec_alg_enc(&ipsec_alg_BLOWFISH);
+ printk("ipsec_blowfish_init(alg_type=%d alg_id=%d name=%s): ret=%d\n",
+ ipsec_alg_BLOWFISH.ixt_alg_type,
+ ipsec_alg_BLOWFISH.ixt_alg_id,
+ ipsec_alg_BLOWFISH.ixt_name,
+ ret);
+ if (ret==0 && test) {
+ test_ret=ipsec_alg_test(
+ ipsec_alg_BLOWFISH.ixt_alg_type,
+ ipsec_alg_BLOWFISH.ixt_alg_id,
+ test);
+ printk("ipsec_blowfish_init(alg_type=%d alg_id=%d): test_ret=%d\n",
+ ipsec_alg_BLOWFISH.ixt_alg_type,
+ ipsec_alg_BLOWFISH.ixt_alg_id,
+ test_ret);
+ }
+ return ret;
+}
+IPSEC_ALG_MODULE_EXIT(ipsec_blowfish_fini)
+{
+ unregister_ipsec_alg_enc(&ipsec_alg_BLOWFISH);
+ return;
+}
+#ifdef MODULE_LICENSE
+MODULE_LICENSE("GPL");
+#endif
+
+EXPORT_NO_SYMBOLS;
diff --git a/linux/net/ipsec/alg/ipsec_alg_cryptoapi.c b/linux/net/ipsec/alg/ipsec_alg_cryptoapi.c
new file mode 100644
index 000000000..fc68094c2
--- /dev/null
+++ b/linux/net/ipsec/alg/ipsec_alg_cryptoapi.c
@@ -0,0 +1,421 @@
+/*
+ * ipsec_alg to linux cryptoapi GLUE
+ *
+ * Authors: CODE.ar TEAM
+ * Harpo MAxx <harpo@linuxmendoza.org.ar>
+ * JuanJo Ciarlante <jjo-ipsec@mendoza.gov.ar>
+ * Luciano Ruete <docemeses@softhome.net>
+ *
+ * $Id: ipsec_alg_cryptoapi.c,v 1.3 2004/09/17 18:57:30 as Exp $
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ * Example usage:
+ * modinfo -p ipsec_cryptoapi (quite useful info, including supported algos)
+ * modprobe ipsec_cryptoapi
+ * modprobe ipsec_cryptoapi test=1
+ * modprobe ipsec_cryptoapi excl=1 (exclusive cipher/algo)
+ * modprobe ipsec_cryptoapi noauto=1 aes=1 twofish=1 (only these ciphers)
+ * modprobe ipsec_cryptoapi aes=128,128 (force these keylens)
+ * modprobe ipsec_cryptoapi des_ede3=0 (everything but 3DES)
+ */
+#include <linux/config.h>
+#include <linux/version.h>
+
+/*
+ * special case: ipsec core modular with this static algo inside:
+ * must avoid MODULE magic for this file
+ */
+#if CONFIG_IPSEC_MODULE && CONFIG_IPSEC_ALG_CRYPTOAPI
+#undef MODULE
+#endif
+
+#include <linux/module.h>
+#include <linux/init.h>
+
+#include <linux/kernel.h> /* printk() */
+#include <linux/errno.h> /* error codes */
+#include <linux/types.h> /* size_t */
+#include <linux/string.h>
+
+/* Check if __exit is defined, if not null it */
+#ifndef __exit
+#define __exit
+#endif
+
+/* warn the innocent */
+#if !defined (CONFIG_CRYPTO) && !defined (CONFIG_CRYPTO_MODULE)
+#warning "No linux CryptoAPI found, install 2.4.22+ or 2.6.x"
+#define NO_CRYPTOAPI_SUPPORT
+#endif
+/* Low freeswan header coupling */
+#include "freeswan/ipsec_alg.h"
+
+#include <linux/crypto.h>
+#ifdef CRYPTO_API_VERSION_CODE
+#warning "Old CryptoAPI is not supported. Only linux-2.4.22+ or linux-2.6.x are supported"
+#define NO_CRYPTOAPI_SUPPORT
+#endif
+
+#ifdef NO_CRYPTOAPI_SUPPORT
+#warning "Building an unusable module :P"
+/* Catch old CryptoAPI by not allowing module to load */
+IPSEC_ALG_MODULE_INIT( ipsec_cryptoapi_init )
+{
+ printk(KERN_WARNING "ipsec_cryptoapi.o was not built on stock Linux CryptoAPI (2.4.22+ or 2.6.x), not loading.\n");
+ return -EINVAL;
+}
+#else
+#include <asm/scatterlist.h>
+#include <asm/pgtable.h>
+#include <linux/mm.h>
+
+#define CIPHERNAME_AES "aes"
+#define CIPHERNAME_3DES "des3_ede"
+#define CIPHERNAME_BLOWFISH "blowfish"
+#define CIPHERNAME_CAST "cast5"
+#define CIPHERNAME_SERPENT "serpent"
+#define CIPHERNAME_TWOFISH "twofish"
+
+#define ESP_3DES 3
+#define ESP_AES 12
+#define ESP_BLOWFISH 7 /* truly _constant_ :) */
+#define ESP_CAST 6 /* quite constant :) */
+#define ESP_SERPENT 252 /* from ipsec drafts */
+#define ESP_TWOFISH 253 /* from ipsec drafts */
+
+#define AH_MD5 2
+#define AH_SHA 3
+#define DIGESTNAME_MD5 "md5"
+#define DIGESTNAME_SHA1 "sha1"
+
+MODULE_AUTHOR("Juanjo Ciarlante, Harpo MAxx, Luciano Ruete");
+static int debug=0;
+MODULE_PARM(debug, "i");
+static int test=0;
+MODULE_PARM(test, "i");
+static int excl=0;
+MODULE_PARM(excl, "i");
+
+static int noauto = 0;
+MODULE_PARM(noauto,"i");
+MODULE_PARM_DESC(noauto, "Dont try all known algos, just setup enabled ones");
+
+static int des_ede3[] = {-1, -1};
+static int aes[] = {-1, -1};
+static int blowfish[] = {-1, -1};
+static int cast[] = {-1, -1};
+static int serpent[] = {-1, -1};
+static int twofish[] = {-1, -1};
+
+MODULE_PARM(des_ede3,"1-2i");
+MODULE_PARM(aes,"1-2i");
+MODULE_PARM(blowfish,"1-2i");
+MODULE_PARM(cast,"1-2i");
+MODULE_PARM(serpent,"1-2i");
+MODULE_PARM(twofish,"1-2i");
+MODULE_PARM_DESC(des_ede3, "0: disable | 1: force_enable | min,max: dontuse");
+MODULE_PARM_DESC(aes, "0: disable | 1: force_enable | min,max: keybitlens");
+MODULE_PARM_DESC(blowfish, "0: disable | 1: force_enable | min,max: keybitlens");
+MODULE_PARM_DESC(cast, "0: disable | 1: force_enable | min,max: keybitlens");
+MODULE_PARM_DESC(serpent, "0: disable | 1: force_enable | min,max: keybitlens");
+MODULE_PARM_DESC(twofish, "0: disable | 1: force_enable | min,max: keybitlens");
+
+struct ipsec_alg_capi_cipher {
+ const char *ciphername; /* cryptoapi's ciphername */
+ unsigned blocksize;
+ unsigned short minbits;
+ unsigned short maxbits;
+ int *parm; /* lkm param for this cipher */
+ struct ipsec_alg_enc alg; /* note it's not a pointer */
+};
+static struct ipsec_alg_capi_cipher alg_capi_carray[] = {
+ { CIPHERNAME_AES , 16, 128, 256, aes , { ixt_alg_id: ESP_AES, }},
+ { CIPHERNAME_TWOFISH , 16, 128, 256, twofish, { ixt_alg_id: ESP_TWOFISH, }},
+ { CIPHERNAME_SERPENT , 16, 128, 256, serpent, { ixt_alg_id: ESP_SERPENT, }},
+ { CIPHERNAME_CAST , 8, 128, 128, cast , { ixt_alg_id: ESP_CAST, }},
+ { CIPHERNAME_BLOWFISH , 8, 128, 448, blowfish,{ ixt_alg_id: ESP_BLOWFISH, }},
+ { CIPHERNAME_3DES , 8, 192, 192, des_ede3,{ ixt_alg_id: ESP_3DES, }},
+ { NULL, 0, 0, 0, NULL, {} }
+};
+#ifdef NOT_YET
+struct ipsec_alg_capi_digest {
+ const char *digestname; /* cryptoapi's digestname */
+ struct digest_implementation *di;
+ struct ipsec_alg_auth alg; /* note it's not a pointer */
+};
+static struct ipsec_alg_capi_cipher alg_capi_darray[] = {
+ { DIGESTNAME_MD5, NULL, { ixt_alg_id: AH_MD5, }},
+ { DIGESTNAME_SHA1, NULL, { ixt_alg_id: AH_SHA, }},
+ { NULL, NULL, {} }
+};
+#endif
+/*
+ * "generic" linux cryptoapi setup_cipher() function
+ */
+int setup_cipher(const char *ciphername)
+{
+ return crypto_alg_available(ciphername, 0);
+}
+
+/*
+ * setups ipsec_alg_capi_cipher "hyper" struct components, calling
+ * register_ipsec_alg for cointaned ipsec_alg object
+ */
+static void _capi_destroy_key (struct ipsec_alg_enc *alg, __u8 *key_e);
+static __u8 * _capi_new_key (struct ipsec_alg_enc *alg, const __u8 *key, size_t keylen);
+static int _capi_cbc_encrypt(struct ipsec_alg_enc *alg, __u8 * key_e, __u8 * in, int ilen, const __u8 * iv, int encrypt);
+
+static int
+setup_ipsec_alg_capi_cipher(struct ipsec_alg_capi_cipher *cptr)
+{
+ int ret;
+ cptr->alg.ixt_version = IPSEC_ALG_VERSION;
+ cptr->alg.ixt_module = THIS_MODULE;
+ atomic_set (& cptr->alg.ixt_refcnt, 0);
+ strncpy (cptr->alg.ixt_name , cptr->ciphername, sizeof (cptr->alg.ixt_name));
+
+ cptr->alg.ixt_blocksize=cptr->blocksize;
+ cptr->alg.ixt_keyminbits=cptr->minbits;
+ cptr->alg.ixt_keymaxbits=cptr->maxbits;
+ cptr->alg.ixt_state = 0;
+ if (excl) cptr->alg.ixt_state |= IPSEC_ALG_ST_EXCL;
+ cptr->alg.ixt_e_keylen=cptr->alg.ixt_keymaxbits/8;
+ cptr->alg.ixt_e_ctx_size = 0;
+ cptr->alg.ixt_alg_type = IPSEC_ALG_TYPE_ENCRYPT;
+ cptr->alg.ixt_e_new_key = _capi_new_key;
+ cptr->alg.ixt_e_destroy_key = _capi_destroy_key;
+ cptr->alg.ixt_e_cbc_encrypt = _capi_cbc_encrypt;
+ cptr->alg.ixt_data = cptr;
+
+ ret=register_ipsec_alg_enc(&cptr->alg);
+ printk("setup_ipsec_alg_capi_cipher(): "
+ "alg_type=%d alg_id=%d name=%s "
+ "keyminbits=%d keymaxbits=%d, ret=%d\n",
+ cptr->alg.ixt_alg_type,
+ cptr->alg.ixt_alg_id,
+ cptr->alg.ixt_name,
+ cptr->alg.ixt_keyminbits,
+ cptr->alg.ixt_keymaxbits,
+ ret);
+ return ret;
+}
+/*
+ * called in ipsec_sa_wipe() time, will destroy key contexts
+ * and do 1 unbind()
+ */
+static void
+_capi_destroy_key (struct ipsec_alg_enc *alg, __u8 *key_e)
+{
+ struct crypto_tfm *tfm=(struct crypto_tfm*)key_e;
+
+ if (debug > 0)
+ printk(KERN_DEBUG "klips_debug: _capi_destroy_key:"
+ "name=%s key_e=%p \n",
+ alg->ixt_name, key_e);
+ if (!key_e) {
+ printk(KERN_ERR "klips_debug: _capi_destroy_key:"
+ "name=%s NULL key_e!\n",
+ alg->ixt_name);
+ return;
+ }
+ crypto_free_tfm(tfm);
+}
+
+/*
+ * create new key context, need alg->ixt_data to know which
+ * (of many) cipher inside this module is the target
+ */
+static __u8 *
+_capi_new_key (struct ipsec_alg_enc *alg, const __u8 *key, size_t keylen)
+{
+ struct ipsec_alg_capi_cipher *cptr;
+ struct crypto_tfm *tfm=NULL;
+
+ cptr = alg->ixt_data;
+ if (!cptr) {
+ printk(KERN_ERR "_capi_new_key(): "
+ "NULL ixt_data (?!) for \"%s\" algo\n"
+ , alg->ixt_name);
+ goto err;
+ }
+ if (debug > 0)
+ printk(KERN_DEBUG "klips_debug:_capi_new_key:"
+ "name=%s cptr=%p key=%p keysize=%d\n",
+ alg->ixt_name, cptr, key, keylen);
+
+ /*
+ * alloc tfm
+ */
+ tfm = crypto_alloc_tfm(cptr->ciphername, CRYPTO_TFM_MODE_CBC);
+ if (!tfm) {
+ printk(KERN_ERR "_capi_new_key(): "
+ "NULL tfm for \"%s\" cryptoapi (\"%s\") algo\n"
+ , alg->ixt_name, cptr->ciphername);
+ goto err;
+ }
+ if (crypto_cipher_setkey(tfm, key, keylen) < 0) {
+ printk(KERN_ERR "_capi_new_key(): "
+ "failed new_key() for \"%s\" cryptoapi algo (keylen=%d)\n"
+ , alg->ixt_name, keylen);
+ crypto_free_tfm(tfm);
+ tfm=NULL;
+ }
+err:
+ if (debug > 0)
+ printk(KERN_DEBUG "klips_debug:_capi_new_key:"
+ "name=%s key=%p keylen=%d tfm=%p\n",
+ alg->ixt_name, key, keylen, tfm);
+ return (__u8 *) tfm;
+}
+/*
+ * core encryption function: will use cx->ci to call actual cipher's
+ * cbc function
+ */
+static int
+_capi_cbc_encrypt(struct ipsec_alg_enc *alg, __u8 * key_e, __u8 * in, int ilen, const __u8 * iv, int encrypt) {
+ int error =0;
+ struct crypto_tfm *tfm=(struct crypto_tfm *)key_e;
+ struct scatterlist sg = {
+ .page = virt_to_page(in),
+ .offset = (unsigned long)(in) % PAGE_SIZE,
+ .length=ilen,
+ };
+ if (debug > 1)
+ printk(KERN_DEBUG "klips_debug:_capi_cbc_encrypt:"
+ "key_e=%p "
+ "in=%p out=%p ilen=%d iv=%p encrypt=%d\n"
+ , key_e
+ , in, in, ilen, iv, encrypt);
+ crypto_cipher_set_iv(tfm, iv, crypto_tfm_alg_ivsize(tfm));
+ if (encrypt)
+ error = crypto_cipher_encrypt (tfm, &sg, &sg, ilen);
+ else
+ error = crypto_cipher_decrypt (tfm, &sg, &sg, ilen);
+ if (debug > 1)
+ printk(KERN_DEBUG "klips_debug:_capi_cbc_encrypt:"
+ "error=%d\n"
+ , error);
+ return (error<0)? error : ilen;
+}
+/*
+ * main initialization loop: for each cipher in list, do
+ * 1) setup cryptoapi cipher else continue
+ * 2) register ipsec_alg object
+ */
+static int
+setup_cipher_list (struct ipsec_alg_capi_cipher* clist)
+{
+ struct ipsec_alg_capi_cipher *cptr;
+ /* foreach cipher in list ... */
+ for (cptr=clist;cptr->ciphername;cptr++) {
+ /*
+ * see if cipher has been disabled (0) or
+ * if noauto set and not enabled (1)
+ */
+ if (cptr->parm[0] == 0 || (noauto && cptr->parm[0] < 0)) {
+ if (debug>0)
+ printk(KERN_INFO "setup_cipher_list(): "
+ "ciphername=%s skipped at user request: "
+ "noauto=%d parm[0]=%d parm[1]=%d\n"
+ , cptr->ciphername
+ , noauto
+ , cptr->parm[0]
+ , cptr->parm[1]);
+ continue;
+ }
+ /*
+ * use a local ci to avoid touching cptr->ci,
+ * if register ipsec_alg success then bind cipher
+ */
+ if( setup_cipher(cptr->ciphername) ) {
+ if (debug > 0)
+ printk(KERN_DEBUG "klips_debug:"
+ "setup_cipher_list():"
+ "ciphername=%s found\n"
+ , cptr->ciphername);
+ if (setup_ipsec_alg_capi_cipher(cptr) == 0) {
+
+
+ } else {
+ printk(KERN_ERR "klips_debug:"
+ "setup_cipher_list():"
+ "ciphername=%s failed ipsec_alg_register\n"
+ , cptr->ciphername);
+ }
+ } else {
+ if (debug>0)
+ printk(KERN_INFO "setup_cipher_list(): lookup for ciphername=%s: not found \n",
+ cptr->ciphername);
+ }
+ }
+ return 0;
+}
+/*
+ * deregister ipsec_alg objects and unbind ciphers
+ */
+static int
+unsetup_cipher_list (struct ipsec_alg_capi_cipher* clist)
+{
+ struct ipsec_alg_capi_cipher *cptr;
+ /* foreach cipher in list ... */
+ for (cptr=clist;cptr->ciphername;cptr++) {
+ if (cptr->alg.ixt_state & IPSEC_ALG_ST_REGISTERED) {
+ unregister_ipsec_alg_enc(&cptr->alg);
+ }
+ }
+ return 0;
+}
+/*
+ * test loop for registered algos
+ */
+static int
+test_cipher_list (struct ipsec_alg_capi_cipher* clist)
+{
+ int test_ret;
+ struct ipsec_alg_capi_cipher *cptr;
+ /* foreach cipher in list ... */
+ for (cptr=clist;cptr->ciphername;cptr++) {
+ if (cptr->alg.ixt_state & IPSEC_ALG_ST_REGISTERED) {
+ test_ret=ipsec_alg_test(
+ cptr->alg.ixt_alg_type,
+ cptr->alg.ixt_alg_id,
+ test);
+ printk("test_cipher_list(alg_type=%d alg_id=%d): test_ret=%d\n",
+ cptr->alg.ixt_alg_type,
+ cptr->alg.ixt_alg_id,
+ test_ret);
+ }
+ }
+ return 0;
+}
+
+IPSEC_ALG_MODULE_INIT( ipsec_cryptoapi_init )
+{
+ int ret, test_ret;
+ if ((ret=setup_cipher_list(alg_capi_carray)) < 0)
+ return -EPROTONOSUPPORT;
+ if (ret==0 && test) {
+ test_ret=test_cipher_list(alg_capi_carray);
+ }
+ return ret;
+}
+IPSEC_ALG_MODULE_EXIT( ipsec_cryptoapi_fini )
+{
+ unsetup_cipher_list(alg_capi_carray);
+ return;
+}
+#ifdef MODULE_LICENSE
+MODULE_LICENSE("GPL");
+#endif
+
+EXPORT_NO_SYMBOLS;
+#endif /* NO_CRYPTOAPI_SUPPORT */
diff --git a/linux/net/ipsec/alg/ipsec_alg_serpent.c b/linux/net/ipsec/alg/ipsec_alg_serpent.c
new file mode 100644
index 000000000..1f26b0b01
--- /dev/null
+++ b/linux/net/ipsec/alg/ipsec_alg_serpent.c
@@ -0,0 +1,139 @@
+/*
+ * ipsec_alg SERPENT cipher stubs
+ *
+ * Author: JuanJo Ciarlante <jjo-ipsec@mendoza.gov.ar>
+ *
+ * $Id: ipsec_alg_serpent.c,v 1.2 2004/03/22 21:53:19 as Exp $
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ */
+#include <linux/config.h>
+#include <linux/version.h>
+
+/*
+ * special case: ipsec core modular with this static algo inside:
+ * must avoid MODULE magic for this file
+ */
+#if CONFIG_IPSEC_MODULE && CONFIG_IPSEC_ALG_SERPENT
+#undef MODULE
+#endif
+
+#include <linux/module.h>
+#include <linux/init.h>
+
+#include <linux/kernel.h> /* printk() */
+#include <linux/errno.h> /* error codes */
+#include <linux/types.h> /* size_t */
+#include <linux/string.h>
+
+/* Check if __exit is defined, if not null it */
+#ifndef __exit
+#define __exit
+#endif
+
+/* Low freeswan header coupling */
+#include "freeswan/ipsec_alg.h"
+#include "libserpent/serpent.h"
+#include "libserpent/serpent_cbc.h"
+
+#define ESP_SERPENT 252 /* from ipsec drafts */
+
+/* 128, 192 or 256 */
+#define ESP_SERPENT_KEY_SZ_MIN 16 /* 128 bit secret key */
+#define ESP_SERPENT_KEY_SZ_MAX 32 /* 256 bit secret key */
+#define ESP_SERPENT_CBC_BLK_LEN 16 /* SERPENT-CBC block size */
+
+MODULE_AUTHOR("JuanJo Ciarlante <jjo-ipsec@mendoza.gov.ar>");
+static int debug=0;
+MODULE_PARM(debug, "i");
+static int test=0;
+MODULE_PARM(test, "i");
+static int excl=0;
+MODULE_PARM(excl, "i");
+static int keyminbits=0;
+MODULE_PARM(keyminbits, "i");
+static int keymaxbits=0;
+MODULE_PARM(keymaxbits, "i");
+
+static int _serpent_set_key(struct ipsec_alg_enc *alg, __u8 * key_e, const __u8 * key, size_t keysize) {
+ serpent_context *ctx=(serpent_context *)key_e;
+ if (debug > 0)
+ printk(KERN_DEBUG "klips_debug:_serpent_set_key:"
+ "key_e=%p key=%p keysize=%d\n",
+ key_e, key, keysize);
+ serpent_set_key(ctx, key, keysize);
+ return 0;
+}
+static int _serpent_cbc_encrypt(struct ipsec_alg_enc *alg, __u8 * key_e, __u8 * in, int ilen, const __u8 * iv, int encrypt) {
+ serpent_context *ctx=(serpent_context *)key_e;
+ if (debug > 0)
+ printk(KERN_DEBUG "klips_debug:_serpent_cbc_encrypt:"
+ "key_e=%p in=%p ilen=%d iv=%p encrypt=%d\n",
+ key_e, in, ilen, iv, encrypt);
+ serpent_cbc_encrypt(ctx, in, in, ilen, iv, encrypt);
+ return ilen;
+}
+static struct ipsec_alg_enc ipsec_alg_SERPENT = {
+ ixt_version: IPSEC_ALG_VERSION,
+ ixt_module: THIS_MODULE,
+ ixt_refcnt: ATOMIC_INIT(0),
+ ixt_alg_type: IPSEC_ALG_TYPE_ENCRYPT,
+ ixt_alg_id: ESP_SERPENT,
+ ixt_name: "serpent",
+ ixt_blocksize: ESP_SERPENT_CBC_BLK_LEN,
+ ixt_keyminbits: ESP_SERPENT_KEY_SZ_MIN * 8,
+ ixt_keymaxbits: ESP_SERPENT_KEY_SZ_MAX * 8,
+ ixt_e_keylen: ESP_SERPENT_KEY_SZ_MAX,
+ ixt_e_ctx_size: sizeof(serpent_context),
+ ixt_e_set_key: _serpent_set_key,
+ ixt_e_cbc_encrypt:_serpent_cbc_encrypt,
+};
+
+IPSEC_ALG_MODULE_INIT(ipsec_serpent_init)
+{
+ int ret, test_ret;
+ if (keyminbits)
+ ipsec_alg_SERPENT.ixt_keyminbits=keyminbits;
+ if (keymaxbits) {
+ ipsec_alg_SERPENT.ixt_keymaxbits=keymaxbits;
+ if (keymaxbits*8>ipsec_alg_SERPENT.ixt_keymaxbits)
+ ipsec_alg_SERPENT.ixt_e_keylen=keymaxbits*8;
+ }
+ if (excl) ipsec_alg_SERPENT.ixt_state |= IPSEC_ALG_ST_EXCL;
+ ret=register_ipsec_alg_enc(&ipsec_alg_SERPENT);
+ printk("ipsec_serpent_init(alg_type=%d alg_id=%d name=%s): ret=%d\n",
+ ipsec_alg_SERPENT.ixt_alg_type,
+ ipsec_alg_SERPENT.ixt_alg_id,
+ ipsec_alg_SERPENT.ixt_name,
+ ret);
+ if (ret==0 && test) {
+ test_ret=ipsec_alg_test(
+ ipsec_alg_SERPENT.ixt_alg_type,
+ ipsec_alg_SERPENT.ixt_alg_id,
+ test);
+ printk("ipsec_serpent_init(alg_type=%d alg_id=%d): test_ret=%d\n",
+ ipsec_alg_SERPENT.ixt_alg_type,
+ ipsec_alg_SERPENT.ixt_alg_id,
+ test_ret);
+ }
+ return ret;
+}
+IPSEC_ALG_MODULE_EXIT(ipsec_serpent_fini)
+{
+ unregister_ipsec_alg_enc(&ipsec_alg_SERPENT);
+ return;
+}
+#ifdef MODULE_LICENSE
+MODULE_LICENSE("GPL");
+#endif
+
+EXPORT_NO_SYMBOLS;
diff --git a/linux/net/ipsec/alg/ipsec_alg_sha2.c b/linux/net/ipsec/alg/ipsec_alg_sha2.c
new file mode 100644
index 000000000..548585c16
--- /dev/null
+++ b/linux/net/ipsec/alg/ipsec_alg_sha2.c
@@ -0,0 +1,185 @@
+/*
+ * ipsec_alg SHA2 hash stubs
+ *
+ * Author: JuanJo Ciarlante <jjo-ipsec@mendoza.gov.ar>
+ *
+ * $Id: ipsec_alg_sha2.c,v 1.2 2004/03/22 21:53:19 as Exp $
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ */
+#include <linux/config.h>
+#include <linux/version.h>
+
+/*
+ * special case: ipsec core modular with this static algo inside:
+ * must avoid MODULE magic for this file
+ */
+#if CONFIG_IPSEC_MODULE && CONFIG_IPSEC_ALG_SHA2
+#undef MODULE
+#endif
+
+#include <linux/module.h>
+#include <linux/init.h>
+
+#include <linux/kernel.h> /* printk() */
+#include <linux/errno.h> /* error codes */
+#include <linux/types.h> /* size_t */
+#include <linux/string.h>
+
+/* Check if __exit is defined, if not null it */
+#ifndef __exit
+#define __exit
+#endif
+
+/* Low freeswan header coupling */
+#include "freeswan/ipsec_alg.h"
+#include "libsha2/sha2.h"
+#include "libsha2/hmac_sha2.h"
+
+MODULE_AUTHOR("JuanJo Ciarlante <jjo-ipsec@mendoza.gov.ar>");
+static int debug=0;
+MODULE_PARM(debug, "i");
+static int test=0;
+MODULE_PARM(test, "i");
+static int excl=0;
+MODULE_PARM(excl, "i");
+
+/* almost constants ...: draft-ietf-ipsec-ciph-aes-cbc-03.txt */
+#define AH_SHA2_256 5
+#define AH_SHA2_384 6
+#define AH_SHA2_512 7
+
+static int _sha256_hmac_set_key(struct ipsec_alg_auth *alg, __u8 * key_a, const __u8 * key, int keylen) {
+ sha256_hmac_context *hctx=(sha256_hmac_context*)(key_a);
+ sha256_hmac_set_key(hctx, key, keylen);
+ if (debug > 0)
+ printk(KERN_DEBUG "klips_debug: _sha256_hmac_set_key(): "
+ "key_a=%p key=%p keysize=%d\n",
+ key_a, key, keylen);
+ return 0;
+}
+static int _sha256_hmac_hash(struct ipsec_alg_auth *alg, __u8 * key_a, const __u8 * dat, int len, __u8 * hash, int hashlen) {
+ sha256_hmac_context *hctx=(sha256_hmac_context*)(key_a);
+ if (debug > 0)
+ printk(KERN_DEBUG "klips_debug: _sha256_hmac_hash(): "
+ "key_a=%p dat=%p len=%d hash=%p hashlen=%d\n",
+ key_a, dat, len, hash, hashlen);
+ sha256_hmac_hash(hctx, dat, len, hash, hashlen);
+ return 0;
+}
+static int _sha512_hmac_set_key(struct ipsec_alg_auth *alg, __u8 * key_a, const __u8 * key, int keylen) {
+ sha512_hmac_context *hctx=(sha512_hmac_context*)(key_a);
+ sha512_hmac_set_key(hctx, key, keylen);
+ if (debug > 0)
+ printk(KERN_DEBUG "klips_debug: _sha512_hmac_set_key(): "
+ "key_a=%p key=%p keysize=%d\n",
+ key_a, key, keylen);
+ return 0;
+}
+static int _sha512_hmac_hash(struct ipsec_alg_auth *alg, __u8 * key_a, const __u8 * dat, int len, __u8 * hash, int hashlen) {
+ sha512_hmac_context *hctx=(sha512_hmac_context*)(key_a);
+ if (debug > 0)
+ printk(KERN_DEBUG "klips_debug: _sha512_hmac_hash(): "
+ "key_a=%p dat=%p len=%d hash=%p hashlen=%d\n",
+ key_a, dat, len, hash, hashlen);
+ sha512_hmac_hash(hctx, dat, len, hash, hashlen);
+ return 0;
+}
+static struct ipsec_alg_auth ipsec_alg_SHA2_256 = {
+ ixt_version: IPSEC_ALG_VERSION,
+ ixt_module: THIS_MODULE,
+ ixt_refcnt: ATOMIC_INIT(0),
+ ixt_alg_type: IPSEC_ALG_TYPE_AUTH,
+ ixt_alg_id: AH_SHA2_256,
+ ixt_name: "sha2_256",
+ ixt_blocksize: SHA256_BLOCKSIZE,
+ ixt_keyminbits: 256,
+ ixt_keymaxbits: 256,
+ ixt_a_keylen: 256/8,
+ ixt_a_ctx_size: sizeof(sha256_hmac_context),
+ ixt_a_hmac_set_key: _sha256_hmac_set_key,
+ ixt_a_hmac_hash: _sha256_hmac_hash,
+};
+static struct ipsec_alg_auth ipsec_alg_SHA2_512 = {
+ ixt_version: IPSEC_ALG_VERSION,
+ ixt_module: THIS_MODULE,
+ ixt_refcnt: ATOMIC_INIT(0),
+ ixt_alg_type: IPSEC_ALG_TYPE_AUTH,
+ ixt_alg_id: AH_SHA2_512,
+ ixt_name: "sha2_512",
+ ixt_blocksize: SHA512_BLOCKSIZE,
+ ixt_keyminbits: 512,
+ ixt_keymaxbits: 512,
+ ixt_a_keylen: 512/8,
+ ixt_a_ctx_size: sizeof(sha512_hmac_context),
+ ixt_a_hmac_set_key: _sha512_hmac_set_key,
+ ixt_a_hmac_hash: _sha512_hmac_hash,
+};
+
+IPSEC_ALG_MODULE_INIT( ipsec_sha2_init )
+{
+ int ret, test_ret;
+ if (excl) ipsec_alg_SHA2_256.ixt_state |= IPSEC_ALG_ST_EXCL;
+ ret=register_ipsec_alg_auth(&ipsec_alg_SHA2_256);
+ printk("ipsec_sha2_init(alg_type=%d alg_id=%d name=%s): ret=%d\n",
+ ipsec_alg_SHA2_256.ixt_alg_type,
+ ipsec_alg_SHA2_256.ixt_alg_id,
+ ipsec_alg_SHA2_256.ixt_name,
+ ret);
+ if (ret != 0)
+ goto out;
+ if (ret==0 && test) {
+ test_ret=ipsec_alg_test(
+ ipsec_alg_SHA2_256.ixt_alg_type,
+ ipsec_alg_SHA2_256.ixt_alg_id,
+ test);
+ printk("ipsec_sha2_init(alg_type=%d alg_id=%d): test_ret=%d\n",
+ ipsec_alg_SHA2_256.ixt_alg_type,
+ ipsec_alg_SHA2_256.ixt_alg_id,
+ test_ret);
+ }
+ if (excl) ipsec_alg_SHA2_512.ixt_state |= IPSEC_ALG_ST_EXCL;
+ ret=register_ipsec_alg_auth(&ipsec_alg_SHA2_512);
+ printk("ipsec_sha2_init(alg_type=%d alg_id=%d name=%s): ret=%d\n",
+ ipsec_alg_SHA2_512.ixt_alg_type,
+ ipsec_alg_SHA2_512.ixt_alg_id,
+ ipsec_alg_SHA2_512.ixt_name,
+ ret);
+ if (ret != 0)
+ goto out_256;
+ if (ret==0 && test) {
+ test_ret=ipsec_alg_test(
+ ipsec_alg_SHA2_512.ixt_alg_type,
+ ipsec_alg_SHA2_512.ixt_alg_id,
+ test);
+ printk("ipsec_sha2_init(alg_type=%d alg_id=%d): test_ret=%d\n",
+ ipsec_alg_SHA2_512.ixt_alg_type,
+ ipsec_alg_SHA2_512.ixt_alg_id,
+ test_ret);
+ }
+ goto out;
+out_256:
+ unregister_ipsec_alg_auth(&ipsec_alg_SHA2_256);
+out:
+ return ret;
+}
+IPSEC_ALG_MODULE_EXIT( ipsec_sha2_fini )
+{
+ unregister_ipsec_alg_auth(&ipsec_alg_SHA2_512);
+ unregister_ipsec_alg_auth(&ipsec_alg_SHA2_256);
+ return;
+}
+#ifdef MODULE_LICENSE
+MODULE_LICENSE("GPL");
+#endif
+
+EXPORT_NO_SYMBOLS;
diff --git a/linux/net/ipsec/alg/ipsec_alg_twofish.c b/linux/net/ipsec/alg/ipsec_alg_twofish.c
new file mode 100644
index 000000000..dfeba1f1b
--- /dev/null
+++ b/linux/net/ipsec/alg/ipsec_alg_twofish.c
@@ -0,0 +1,138 @@
+/*
+ * ipsec_alg TWOFISH cipher stubs
+ *
+ * Author: JuanJo Ciarlante <jjo-ipsec@mendoza.gov.ar>
+ *
+ * $Id: ipsec_alg_twofish.c,v 1.2 2004/03/22 21:53:19 as Exp $
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ *
+ */
+#include <linux/config.h>
+#include <linux/version.h>
+
+/*
+ * special case: ipsec core modular with this static algo inside:
+ * must avoid MODULE magic for this file
+ */
+#if CONFIG_IPSEC_MODULE && CONFIG_IPSEC_ALG_TWOFISH
+#undef MODULE
+#endif
+
+#include <linux/module.h>
+#include <linux/init.h>
+
+#include <linux/kernel.h> /* printk() */
+#include <linux/errno.h> /* error codes */
+#include <linux/types.h> /* size_t */
+#include <linux/string.h>
+
+/* Check if __exit is defined, if not null it */
+#ifndef __exit
+#define __exit
+#endif
+
+/* Low freeswan header coupling */
+#include "freeswan/ipsec_alg.h"
+#include "libtwofish/twofish.h"
+#include "libtwofish/twofish_cbc.h"
+
+#define ESP_TWOFISH 253 /* from ipsec drafts */
+
+/* 128, 192 or 256 */
+#define ESP_TWOFISH_KEY_SZ_MIN 16 /* 128 bit secret key */
+#define ESP_TWOFISH_KEY_SZ_MAX 32 /* 256 bit secret key */
+#define ESP_TWOFISH_CBC_BLK_LEN 16 /* TWOFISH-CBC block size */
+
+MODULE_AUTHOR("JuanJo Ciarlante <jjo-ipsec@mendoza.gov.ar>");
+static int debug=0;
+MODULE_PARM(debug, "i");
+static int test=0;
+MODULE_PARM(test, "i");
+static int excl=0;
+MODULE_PARM(excl, "i");
+static int keyminbits=0;
+MODULE_PARM(keyminbits, "i");
+static int keymaxbits=0;
+MODULE_PARM(keymaxbits, "i");
+
+static int _twofish_set_key(struct ipsec_alg_enc *alg, __u8 * key_e, const __u8 * key, size_t keysize) {
+ twofish_context *ctx=(twofish_context *)key_e;
+ if (debug > 0)
+ printk(KERN_DEBUG "klips_debug:_twofish_set_key:"
+ "key_e=%p key=%p keysize=%d\n",
+ key_e, key, keysize);
+ twofish_set_key(ctx, key, keysize);
+ return 0;
+}
+static int _twofish_cbc_encrypt(struct ipsec_alg_enc *alg, __u8 * key_e, __u8 * in, int ilen, const __u8 * iv, int encrypt) {
+ twofish_context *ctx=(twofish_context *)key_e;
+ if (debug > 0)
+ printk(KERN_DEBUG "klips_debug:_twofish_cbc_encrypt:"
+ "key_e=%p in=%p ilen=%d iv=%p encrypt=%d\n",
+ key_e, in, ilen, iv, encrypt);
+ twofish_cbc_encrypt(ctx, in, in, ilen, iv, encrypt);
+ return ilen;
+}
+static struct ipsec_alg_enc ipsec_alg_TWOFISH = {
+ ixt_version: IPSEC_ALG_VERSION,
+ ixt_module: THIS_MODULE,
+ ixt_refcnt: ATOMIC_INIT(0),
+ ixt_alg_type: IPSEC_ALG_TYPE_ENCRYPT,
+ ixt_alg_id: ESP_TWOFISH,
+ ixt_name: "twofish",
+ ixt_blocksize: ESP_TWOFISH_CBC_BLK_LEN,
+ ixt_keyminbits: ESP_TWOFISH_KEY_SZ_MIN * 8,
+ ixt_keymaxbits: ESP_TWOFISH_KEY_SZ_MAX * 8,
+ ixt_e_keylen: ESP_TWOFISH_KEY_SZ_MAX,
+ ixt_e_ctx_size: sizeof(twofish_context),
+ ixt_e_set_key: _twofish_set_key,
+ ixt_e_cbc_encrypt:_twofish_cbc_encrypt,
+};
+
+IPSEC_ALG_MODULE_INIT( ipsec_twofish_init )
+{
+ int ret, test_ret;
+ if (keyminbits)
+ ipsec_alg_TWOFISH.ixt_keyminbits=keyminbits;
+ if (keymaxbits) {
+ ipsec_alg_TWOFISH.ixt_keymaxbits=keymaxbits;
+ if (keymaxbits*8>ipsec_alg_TWOFISH.ixt_keymaxbits)
+ ipsec_alg_TWOFISH.ixt_e_keylen=keymaxbits*8;
+ }
+ if (excl) ipsec_alg_TWOFISH.ixt_state |= IPSEC_ALG_ST_EXCL;
+ ret=register_ipsec_alg_enc(&ipsec_alg_TWOFISH);
+ printk("ipsec_twofish_init(alg_type=%d alg_id=%d name=%s): ret=%d\n",
+ ipsec_alg_TWOFISH.ixt_alg_type,
+ ipsec_alg_TWOFISH.ixt_alg_id,
+ ipsec_alg_TWOFISH.ixt_name, ret);
+ if (ret==0 && test) {
+ test_ret=ipsec_alg_test(
+ ipsec_alg_TWOFISH.ixt_alg_type,
+ ipsec_alg_TWOFISH.ixt_alg_id,
+ test);
+ printk("ipsec_twofish_init(alg_type=%d alg_id=%d): test_ret=%d\n",
+ ipsec_alg_TWOFISH.ixt_alg_type,
+ ipsec_alg_TWOFISH.ixt_alg_id,
+ ret);
+ }
+ return ret;
+}
+IPSEC_ALG_MODULE_EXIT( ipsec_twofish_fini )
+{
+ unregister_ipsec_alg_enc(&ipsec_alg_TWOFISH);
+ return;
+}
+#ifdef MODULE_LICENSE
+MODULE_LICENSE("GPL");
+
+EXPORT_NO_SYMBOLS;
+#endif
diff --git a/linux/net/ipsec/alg/scripts/mk-static_init.c.sh b/linux/net/ipsec/alg/scripts/mk-static_init.c.sh
new file mode 100644
index 000000000..8a17c670e
--- /dev/null
+++ b/linux/net/ipsec/alg/scripts/mk-static_init.c.sh
@@ -0,0 +1,18 @@
+#!/bin/sh
+cat << EOF
+#include <linux/kernel.h>
+#include <linux/list.h>
+#include "freeswan/ipsec_alg.h"
+$(for i in $*; do
+ test -z "$i" && continue
+ echo "extern int $i(void);"
+done)
+void ipsec_alg_static_init(void){
+ int __attribute__ ((unused)) err=0;
+$(for i in $*; do
+ test -z "$i" && continue
+ echo " if ((err=$i()) < 0)"
+ echo " printk(KERN_WARNING \"$i() returned %d\", err);"
+done)
+}
+EOF