summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crypto/openssl/crypto/idea/Makefile.save91
-rw-r--r--crypto/openssl/crypto/idea/Makefile.ssl91
-rw-r--r--crypto/openssl/crypto/idea/Makefile.uni74
-rw-r--r--crypto/openssl/crypto/idea/i_cbc.c169
-rw-r--r--crypto/openssl/crypto/idea/i_cfb64.c123
-rw-r--r--crypto/openssl/crypto/idea/i_ecb.c86
-rw-r--r--crypto/openssl/crypto/idea/i_ofb64.c111
-rw-r--r--crypto/openssl/crypto/idea/i_skey.c157
-rw-r--r--crypto/openssl/crypto/idea/idea.h100
-rw-r--r--crypto/openssl/crypto/idea/idea_lcl.h216
-rw-r--r--crypto/openssl/crypto/idea/idea_spd.c297
-rw-r--r--crypto/openssl/crypto/idea/ideatest.c231
-rw-r--r--crypto/openssl/crypto/idea/version13
-rw-r--r--share/examples/kld/dyn_sysctl/Makefile18
-rw-r--r--share/examples/kld/dyn_sysctl/README8
-rw-r--r--share/examples/kld/dyn_sysctl/dyn_sysctl.c168
-rw-r--r--share/man/man4/md.4118
-rw-r--r--usr.bin/fetch/fetch.c645
18 files changed, 2716 insertions, 0 deletions
diff --git a/crypto/openssl/crypto/idea/Makefile.save b/crypto/openssl/crypto/idea/Makefile.save
new file mode 100644
index 000000000000..ac32f1348131
--- /dev/null
+++ b/crypto/openssl/crypto/idea/Makefile.save
@@ -0,0 +1,91 @@
+#
+# SSLeay/crypto/idea/Makefile
+# $FreeBSD$
+#
+
+DIR= idea
+TOP= ../..
+CC= cc
+INCLUDES=
+CFLAG=-g
+INSTALL_PREFIX=
+OPENSSLDIR= /usr/local/ssl
+INSTALLTOP=/usr/local/ssl
+MAKE= make -f Makefile.ssl
+MAKEDEPEND= $(TOP)/util/domd $(TOP)
+MAKEFILE= Makefile.ssl
+AR= ar r
+
+CFLAGS= $(INCLUDES) $(CFLAG)
+
+GENERAL=Makefile
+TEST=ideatest.c
+APPS=
+
+LIB=$(TOP)/libcrypto.a
+LIBSRC=i_cbc.c i_cfb64.c i_ofb64.c i_ecb.c i_skey.c
+LIBOBJ=i_cbc.o i_cfb64.o i_ofb64.o i_ecb.o i_skey.o
+
+SRC= $(LIBSRC)
+
+EXHEADER= idea.h
+HEADER= idea_lcl.h $(EXHEADER)
+
+ALL= $(GENERAL) $(SRC) $(HEADER)
+
+top:
+ (cd ../..; $(MAKE) DIRS=crypto SDIRS=$(DIR) sub_all)
+
+all: lib
+
+lib: $(LIBOBJ)
+ $(AR) $(LIB) $(LIBOBJ)
+ $(RANLIB) $(LIB)
+ @touch lib
+
+files:
+ $(PERL) $(TOP)/util/files.pl Makefile.ssl >> $(TOP)/MINFO
+
+links:
+ @$(TOP)/util/point.sh Makefile.ssl Makefile
+ @$(PERL) $(TOP)/util/mklink.pl ../../include/openssl $(EXHEADER)
+ @$(PERL) $(TOP)/util/mklink.pl ../../test $(TEST)
+ @$(PERL) $(TOP)/util/mklink.pl ../../apps $(APPS)
+
+install:
+ @for i in $(EXHEADER) ; \
+ do \
+ (cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i; \
+ chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i ); \
+ done;
+
+tags:
+ ctags $(SRC)
+
+tests:
+
+lint:
+ lint -DLINT $(INCLUDES) $(SRC)>fluff
+
+depend:
+ $(MAKEDEPEND) $(INCLUDES) $(DEPFLAG) $(PROGS) $(LIBSRC)
+
+dclean:
+ $(PERL) -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) >Makefile.new
+ mv -f Makefile.new $(MAKEFILE)
+
+clean:
+ rm -f *.o *.obj lib tags core .pure .nfs* *.old *.bak fluff
+
+# DO NOT DELETE THIS LINE -- make depend depends on it.
+
+i_cbc.o: ../../include/openssl/idea.h ../../include/openssl/opensslconf.h
+i_cbc.o: idea_lcl.h
+i_cfb64.o: ../../include/openssl/idea.h ../../include/openssl/opensslconf.h
+i_cfb64.o: idea_lcl.h
+i_ecb.o: ../../include/openssl/idea.h ../../include/openssl/opensslconf.h
+i_ecb.o: ../../include/openssl/opensslv.h idea_lcl.h
+i_ofb64.o: ../../include/openssl/idea.h ../../include/openssl/opensslconf.h
+i_ofb64.o: idea_lcl.h
+i_skey.o: ../../include/openssl/idea.h ../../include/openssl/opensslconf.h
+i_skey.o: idea_lcl.h
diff --git a/crypto/openssl/crypto/idea/Makefile.ssl b/crypto/openssl/crypto/idea/Makefile.ssl
new file mode 100644
index 000000000000..ac32f1348131
--- /dev/null
+++ b/crypto/openssl/crypto/idea/Makefile.ssl
@@ -0,0 +1,91 @@
+#
+# SSLeay/crypto/idea/Makefile
+# $FreeBSD$
+#
+
+DIR= idea
+TOP= ../..
+CC= cc
+INCLUDES=
+CFLAG=-g
+INSTALL_PREFIX=
+OPENSSLDIR= /usr/local/ssl
+INSTALLTOP=/usr/local/ssl
+MAKE= make -f Makefile.ssl
+MAKEDEPEND= $(TOP)/util/domd $(TOP)
+MAKEFILE= Makefile.ssl
+AR= ar r
+
+CFLAGS= $(INCLUDES) $(CFLAG)
+
+GENERAL=Makefile
+TEST=ideatest.c
+APPS=
+
+LIB=$(TOP)/libcrypto.a
+LIBSRC=i_cbc.c i_cfb64.c i_ofb64.c i_ecb.c i_skey.c
+LIBOBJ=i_cbc.o i_cfb64.o i_ofb64.o i_ecb.o i_skey.o
+
+SRC= $(LIBSRC)
+
+EXHEADER= idea.h
+HEADER= idea_lcl.h $(EXHEADER)
+
+ALL= $(GENERAL) $(SRC) $(HEADER)
+
+top:
+ (cd ../..; $(MAKE) DIRS=crypto SDIRS=$(DIR) sub_all)
+
+all: lib
+
+lib: $(LIBOBJ)
+ $(AR) $(LIB) $(LIBOBJ)
+ $(RANLIB) $(LIB)
+ @touch lib
+
+files:
+ $(PERL) $(TOP)/util/files.pl Makefile.ssl >> $(TOP)/MINFO
+
+links:
+ @$(TOP)/util/point.sh Makefile.ssl Makefile
+ @$(PERL) $(TOP)/util/mklink.pl ../../include/openssl $(EXHEADER)
+ @$(PERL) $(TOP)/util/mklink.pl ../../test $(TEST)
+ @$(PERL) $(TOP)/util/mklink.pl ../../apps $(APPS)
+
+install:
+ @for i in $(EXHEADER) ; \
+ do \
+ (cp $$i $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i; \
+ chmod 644 $(INSTALL_PREFIX)$(INSTALLTOP)/include/openssl/$$i ); \
+ done;
+
+tags:
+ ctags $(SRC)
+
+tests:
+
+lint:
+ lint -DLINT $(INCLUDES) $(SRC)>fluff
+
+depend:
+ $(MAKEDEPEND) $(INCLUDES) $(DEPFLAG) $(PROGS) $(LIBSRC)
+
+dclean:
+ $(PERL) -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) >Makefile.new
+ mv -f Makefile.new $(MAKEFILE)
+
+clean:
+ rm -f *.o *.obj lib tags core .pure .nfs* *.old *.bak fluff
+
+# DO NOT DELETE THIS LINE -- make depend depends on it.
+
+i_cbc.o: ../../include/openssl/idea.h ../../include/openssl/opensslconf.h
+i_cbc.o: idea_lcl.h
+i_cfb64.o: ../../include/openssl/idea.h ../../include/openssl/opensslconf.h
+i_cfb64.o: idea_lcl.h
+i_ecb.o: ../../include/openssl/idea.h ../../include/openssl/opensslconf.h
+i_ecb.o: ../../include/openssl/opensslv.h idea_lcl.h
+i_ofb64.o: ../../include/openssl/idea.h ../../include/openssl/opensslconf.h
+i_ofb64.o: idea_lcl.h
+i_skey.o: ../../include/openssl/idea.h ../../include/openssl/opensslconf.h
+i_skey.o: idea_lcl.h
diff --git a/crypto/openssl/crypto/idea/Makefile.uni b/crypto/openssl/crypto/idea/Makefile.uni
new file mode 100644
index 000000000000..d7c9844f3272
--- /dev/null
+++ b/crypto/openssl/crypto/idea/Makefile.uni
@@ -0,0 +1,74 @@
+# Targets
+# make - twidle the options yourself :-)
+# make cc - standard cc options
+# make gcc - standard gcc options
+# $FreeBSD$
+
+DIR= cast
+TOP= .
+CC= gcc
+CFLAG= -O3 -fomit-frame-pointer
+
+CPP= $(CC) -E
+INCLUDES=
+INSTALLTOP=/usr/local/lib
+MAKE= make
+MAKEDEPEND= makedepend
+MAKEFILE= Makefile.uni
+AR= ar r
+RANLIB= ranlib
+
+IDEA_ENC=i_cbc.o
+
+CFLAGS= $(INCLUDES) $(CFLAG)
+
+GENERAL=Makefile
+TEST=ideatest
+APPS=idea_spd
+
+LIB=libidea.a
+LIBSRC=i_skey.c i_ecb.c i_cbc.c i_cfb64.c i_ofb64.c
+LIBOBJ=i_skey.o i_ecb.o $(IDEA_ENC) i_cfb64.o i_ofb64.o
+
+SRC= $(LIBSRC)
+
+EXHEADER= idea.h
+HEADER= idea_lcl.h $(EXHEADER)
+
+ALL= $(GENERAL) $(SRC) $(HEADER)
+
+all: $(LIB) $(TEST) $(APPS)
+
+$(LIB): $(LIBOBJ)
+ $(AR) $(LIB) $(LIBOBJ)
+ $(RANLIB) $(LIB)
+
+test: $(TEST)
+ ./$(TEST)
+
+$(TEST): $(TEST).c $(LIB)
+ $(CC) -o $(TEST) $(CFLAGS) $(TEST).c $(LIB)
+
+$(APPS): $(APPS).c $(LIB)
+ $(CC) -o $(APPS) $(CFLAGS) $(APPS).c $(LIB)
+
+lint:
+ lint -DLINT $(INCLUDES) $(SRC)>fluff
+
+depend:
+ $(MAKEDEPEND) $(INCLUDES) $(PROGS) $(LIBSRC)
+
+dclean:
+ perl -pe 'if (/^# DO NOT DELETE THIS LINE/) {print; exit(0);}' $(MAKEFILE) >Makefile.new
+ mv -f Makefile.new $(MAKEFILE)
+
+clean:
+ /bin/rm -f $(LIB) $(TEST) $(APPS) *.o asm/*.o *.obj lib tags core .pure .nfs* *.old *.bak fluff
+
+cc:
+ $(MAKE) CC="cc" CFLAG="-O" all
+
+gcc:
+ $(MAKE) CC="gcc" CFLAGS="-O3 -fomit-frame-pointer" all
+
+# DO NOT DELETE THIS LINE -- make depend depends on it.
diff --git a/crypto/openssl/crypto/idea/i_cbc.c b/crypto/openssl/crypto/idea/i_cbc.c
new file mode 100644
index 000000000000..76b610073c3c
--- /dev/null
+++ b/crypto/openssl/crypto/idea/i_cbc.c
@@ -0,0 +1,169 @@
+/* crypto/idea/i_cbc.c */
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ *
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to. The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code. The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ *
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * "This product includes cryptographic software written by
+ * Eric Young (eay@cryptsoft.com)"
+ * The word 'cryptographic' can be left out if the rouines from the library
+ * being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from
+ * the apps directory (application code) you must include an acknowledgement:
+ * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed. i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ * $FreeBSD$
+ */
+
+#include <openssl/idea.h>
+#include "idea_lcl.h"
+
+void idea_cbc_encrypt(unsigned char *in, unsigned char *out, long length,
+ IDEA_KEY_SCHEDULE *ks, unsigned char *iv, int encrypt)
+ {
+ register unsigned long tin0,tin1;
+ register unsigned long tout0,tout1,xor0,xor1;
+ register long l=length;
+ unsigned long tin[2];
+
+ if (encrypt)
+ {
+ n2l(iv,tout0);
+ n2l(iv,tout1);
+ iv-=8;
+ for (l-=8; l>=0; l-=8)
+ {
+ n2l(in,tin0);
+ n2l(in,tin1);
+ tin0^=tout0;
+ tin1^=tout1;
+ tin[0]=tin0;
+ tin[1]=tin1;
+ idea_encrypt(tin,ks);
+ tout0=tin[0]; l2n(tout0,out);
+ tout1=tin[1]; l2n(tout1,out);
+ }
+ if (l != -8)
+ {
+ n2ln(in,tin0,tin1,l+8);
+ tin0^=tout0;
+ tin1^=tout1;
+ tin[0]=tin0;
+ tin[1]=tin1;
+ idea_encrypt(tin,ks);
+ tout0=tin[0]; l2n(tout0,out);
+ tout1=tin[1]; l2n(tout1,out);
+ }
+ l2n(tout0,iv);
+ l2n(tout1,iv);
+ }
+ else
+ {
+ n2l(iv,xor0);
+ n2l(iv,xor1);
+ iv-=8;
+ for (l-=8; l>=0; l-=8)
+ {
+ n2l(in,tin0); tin[0]=tin0;
+ n2l(in,tin1); tin[1]=tin1;
+ idea_encrypt(tin,ks);
+ tout0=tin[0]^xor0;
+ tout1=tin[1]^xor1;
+ l2n(tout0,out);
+ l2n(tout1,out);
+ xor0=tin0;
+ xor1=tin1;
+ }
+ if (l != -8)
+ {
+ n2l(in,tin0); tin[0]=tin0;
+ n2l(in,tin1); tin[1]=tin1;
+ idea_encrypt(tin,ks);
+ tout0=tin[0]^xor0;
+ tout1=tin[1]^xor1;
+ l2nn(tout0,tout1,out,l+8);
+ xor0=tin0;
+ xor1=tin1;
+ }
+ l2n(xor0,iv);
+ l2n(xor1,iv);
+ }
+ tin0=tin1=tout0=tout1=xor0=xor1=0;
+ tin[0]=tin[1]=0;
+ }
+
+void idea_encrypt(unsigned long *d, IDEA_KEY_SCHEDULE *key)
+ {
+ register IDEA_INT *p;
+ register unsigned long x1,x2,x3,x4,t0,t1,ul;
+
+ x2=d[0];
+ x1=(x2>>16);
+ x4=d[1];
+ x3=(x4>>16);
+
+ p= &(key->data[0][0]);
+
+ E_IDEA(0);
+ E_IDEA(1);
+ E_IDEA(2);
+ E_IDEA(3);
+ E_IDEA(4);
+ E_IDEA(5);
+ E_IDEA(6);
+ E_IDEA(7);
+
+ x1&=0xffff;
+ idea_mul(x1,x1,*p,ul); p++;
+
+ t0= x3+ *(p++);
+ t1= x2+ *(p++);
+
+ x4&=0xffff;
+ idea_mul(x4,x4,*p,ul);
+
+ d[0]=(t0&0xffff)|((x1&0xffff)<<16);
+ d[1]=(x4&0xffff)|((t1&0xffff)<<16);
+ }
diff --git a/crypto/openssl/crypto/idea/i_cfb64.c b/crypto/openssl/crypto/idea/i_cfb64.c
new file mode 100644
index 000000000000..2093aaa72803
--- /dev/null
+++ b/crypto/openssl/crypto/idea/i_cfb64.c
@@ -0,0 +1,123 @@
+/* crypto/idea/i_cfb64.c */
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ *
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to. The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code. The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ *
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * "This product includes cryptographic software written by
+ * Eric Young (eay@cryptsoft.com)"
+ * The word 'cryptographic' can be left out if the rouines from the library
+ * being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from
+ * the apps directory (application code) you must include an acknowledgement:
+ * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed. i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ * $FreeBSD$
+ */
+
+#include <openssl/idea.h>
+#include "idea_lcl.h"
+
+/* The input and output encrypted as though 64bit cfb mode is being
+ * used. The extra state information to record how much of the
+ * 64bit block we have used is contained in *num;
+ */
+
+void idea_cfb64_encrypt(unsigned char *in, unsigned char *out, long length,
+ IDEA_KEY_SCHEDULE *schedule, unsigned char *ivec, int *num,
+ int encrypt)
+ {
+ register unsigned long v0,v1,t;
+ register int n= *num;
+ register long l=length;
+ unsigned long ti[2];
+ unsigned char *iv,c,cc;
+
+ iv=(unsigned char *)ivec;
+ if (encrypt)
+ {
+ while (l--)
+ {
+ if (n == 0)
+ {
+ n2l(iv,v0); ti[0]=v0;
+ n2l(iv,v1); ti[1]=v1;
+ idea_encrypt((unsigned long *)ti,schedule);
+ iv=(unsigned char *)ivec;
+ t=ti[0]; l2n(t,iv);
+ t=ti[1]; l2n(t,iv);
+ iv=(unsigned char *)ivec;
+ }
+ c= *(in++)^iv[n];
+ *(out++)=c;
+ iv[n]=c;
+ n=(n+1)&0x07;
+ }
+ }
+ else
+ {
+ while (l--)
+ {
+ if (n == 0)
+ {
+ n2l(iv,v0); ti[0]=v0;
+ n2l(iv,v1); ti[1]=v1;
+ idea_encrypt((unsigned long *)ti,schedule);
+ iv=(unsigned char *)ivec;
+ t=ti[0]; l2n(t,iv);
+ t=ti[1]; l2n(t,iv);
+ iv=(unsigned char *)ivec;
+ }
+ cc= *(in++);
+ c=iv[n];
+ iv[n]=cc;
+ *(out++)=c^cc;
+ n=(n+1)&0x07;
+ }
+ }
+ v0=v1=ti[0]=ti[1]=t=c=cc=0;
+ *num=n;
+ }
+
diff --git a/crypto/openssl/crypto/idea/i_ecb.c b/crypto/openssl/crypto/idea/i_ecb.c
new file mode 100644
index 000000000000..73f684e94c1b
--- /dev/null
+++ b/crypto/openssl/crypto/idea/i_ecb.c
@@ -0,0 +1,86 @@
+/* crypto/idea/i_ecb.c */
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ *
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to. The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code. The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ *
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * "This product includes cryptographic software written by
+ * Eric Young (eay@cryptsoft.com)"
+ * The word 'cryptographic' can be left out if the rouines from the library
+ * being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from
+ * the apps directory (application code) you must include an acknowledgement:
+ * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed. i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ * $FreeBSD$
+ */
+
+#include <openssl/idea.h>
+#include "idea_lcl.h"
+#include <openssl/opensslv.h>
+
+const char *IDEA_version="IDEA" OPENSSL_VERSION_PTEXT;
+
+const char *idea_options(void)
+ {
+ if (sizeof(short) != sizeof(IDEA_INT))
+ return("idea(int)");
+ else
+ return("idea(short)");
+ }
+
+void idea_ecb_encrypt(unsigned char *in, unsigned char *out,
+ IDEA_KEY_SCHEDULE *ks)
+ {
+ unsigned long l0,l1,d[2];
+
+ n2l(in,l0); d[0]=l0;
+ n2l(in,l1); d[1]=l1;
+ idea_encrypt(d,ks);
+ l0=d[0]; l2n(l0,out);
+ l1=d[1]; l2n(l1,out);
+ l0=l1=d[0]=d[1]=0;
+ }
+
diff --git a/crypto/openssl/crypto/idea/i_ofb64.c b/crypto/openssl/crypto/idea/i_ofb64.c
new file mode 100644
index 000000000000..41d1be89894c
--- /dev/null
+++ b/crypto/openssl/crypto/idea/i_ofb64.c
@@ -0,0 +1,111 @@
+/* crypto/idea/i_ofb64.c */
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ *
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to. The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code. The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ *
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * "This product includes cryptographic software written by
+ * Eric Young (eay@cryptsoft.com)"
+ * The word 'cryptographic' can be left out if the rouines from the library
+ * being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from
+ * the apps directory (application code) you must include an acknowledgement:
+ * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed. i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ * $FreeBSD$
+ */
+
+#include <openssl/idea.h>
+#include "idea_lcl.h"
+
+/* The input and output encrypted as though 64bit ofb mode is being
+ * used. The extra state information to record how much of the
+ * 64bit block we have used is contained in *num;
+ */
+void idea_ofb64_encrypt(unsigned char *in, unsigned char *out, long length,
+ IDEA_KEY_SCHEDULE *schedule, unsigned char *ivec, int *num)
+ {
+ register unsigned long v0,v1,t;
+ register int n= *num;
+ register long l=length;
+ unsigned char d[8];
+ register char *dp;
+ unsigned long ti[2];
+ unsigned char *iv;
+ int save=0;
+
+ iv=(unsigned char *)ivec;
+ n2l(iv,v0);
+ n2l(iv,v1);
+ ti[0]=v0;
+ ti[1]=v1;
+ dp=(char *)d;
+ l2n(v0,dp);
+ l2n(v1,dp);
+ while (l--)
+ {
+ if (n == 0)
+ {
+ idea_encrypt((unsigned long *)ti,schedule);
+ dp=(char *)d;
+ t=ti[0]; l2n(t,dp);
+ t=ti[1]; l2n(t,dp);
+ save++;
+ }
+ *(out++)= *(in++)^d[n];
+ n=(n+1)&0x07;
+ }
+ if (save)
+ {
+ v0=ti[0];
+ v1=ti[1];
+ iv=(unsigned char *)ivec;
+ l2n(v0,iv);
+ l2n(v1,iv);
+ }
+ t=v0=v1=ti[0]=ti[1]=0;
+ *num=n;
+ }
+
diff --git a/crypto/openssl/crypto/idea/i_skey.c b/crypto/openssl/crypto/idea/i_skey.c
new file mode 100644
index 000000000000..da2fd85c5237
--- /dev/null
+++ b/crypto/openssl/crypto/idea/i_skey.c
@@ -0,0 +1,157 @@
+/* crypto/idea/i_skey.c */
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ *
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to. The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code. The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ *
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * "This product includes cryptographic software written by
+ * Eric Young (eay@cryptsoft.com)"
+ * The word 'cryptographic' can be left out if the rouines from the library
+ * being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from
+ * the apps directory (application code) you must include an acknowledgement:
+ * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed. i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ * $FreeBSD$
+ */
+
+#include <openssl/idea.h>
+#include "idea_lcl.h"
+
+static IDEA_INT inverse(unsigned int xin);
+void idea_set_encrypt_key(unsigned char *key, IDEA_KEY_SCHEDULE *ks)
+ {
+ int i;
+ register IDEA_INT *kt,*kf,r0,r1,r2;
+
+ kt= &(ks->data[0][0]);
+ n2s(key,kt[0]); n2s(key,kt[1]); n2s(key,kt[2]); n2s(key,kt[3]);
+ n2s(key,kt[4]); n2s(key,kt[5]); n2s(key,kt[6]); n2s(key,kt[7]);
+
+ kf=kt;
+ kt+=8;
+ for (i=0; i<6; i++)
+ {
+ r2= kf[1];
+ r1= kf[2];
+ *(kt++)= ((r2<<9) | (r1>>7))&0xffff;
+ r0= kf[3];
+ *(kt++)= ((r1<<9) | (r0>>7))&0xffff;
+ r1= kf[4];
+ *(kt++)= ((r0<<9) | (r1>>7))&0xffff;
+ r0= kf[5];
+ *(kt++)= ((r1<<9) | (r0>>7))&0xffff;
+ r1= kf[6];
+ *(kt++)= ((r0<<9) | (r1>>7))&0xffff;
+ r0= kf[7];
+ *(kt++)= ((r1<<9) | (r0>>7))&0xffff;
+ r1= kf[0];
+ if (i >= 5) break;
+ *(kt++)= ((r0<<9) | (r1>>7))&0xffff;
+ *(kt++)= ((r1<<9) | (r2>>7))&0xffff;
+ kf+=8;
+ }
+ }
+
+void idea_set_decrypt_key(IDEA_KEY_SCHEDULE *ek, IDEA_KEY_SCHEDULE *dk)
+ {
+ int r;
+ register IDEA_INT *fp,*tp,t;
+
+ tp= &(dk->data[0][0]);
+ fp= &(ek->data[8][0]);
+ for (r=0; r<9; r++)
+ {
+ *(tp++)=inverse(fp[0]);
+ *(tp++)=((int)(0x10000L-fp[2])&0xffff);
+ *(tp++)=((int)(0x10000L-fp[1])&0xffff);
+ *(tp++)=inverse(fp[3]);
+ if (r == 8) break;
+ fp-=6;
+ *(tp++)=fp[4];
+ *(tp++)=fp[5];
+ }
+
+ tp= &(dk->data[0][0]);
+ t=tp[1];
+ tp[1]=tp[2];
+ tp[2]=t;
+
+ t=tp[49];
+ tp[49]=tp[50];
+ tp[50]=t;
+ }
+
+/* taken directly from the 'paper' I'll have a look at it later */
+static IDEA_INT inverse(unsigned int xin)
+ {
+ long n1,n2,q,r,b1,b2,t;
+
+ if (xin == 0)
+ b2=0;
+ else
+ {
+ n1=0x10001;
+ n2=xin;
+ b2=1;
+ b1=0;
+
+ do {
+ r=(n1%n2);
+ q=(n1-r)/n2;
+ if (r == 0)
+ { if (b2 < 0) b2=0x10001+b2; }
+ else
+ {
+ n1=n2;
+ n2=r;
+ t=b2;
+ b2=b1-q*b2;
+ b1=t;
+ }
+ } while (r != 0);
+ }
+ return((IDEA_INT)b2);
+ }
diff --git a/crypto/openssl/crypto/idea/idea.h b/crypto/openssl/crypto/idea/idea.h
new file mode 100644
index 000000000000..38e553fbc683
--- /dev/null
+++ b/crypto/openssl/crypto/idea/idea.h
@@ -0,0 +1,100 @@
+/* crypto/idea/idea.h */
+/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ *
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to. The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code. The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ *
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * "This product includes cryptographic software written by
+ * Eric Young (eay@cryptsoft.com)"
+ * The word 'cryptographic' can be left out if the rouines from the library
+ * being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from
+ * the apps directory (application code) you must include an acknowledgement:
+ * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed. i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ * $FreeBSD$
+ */
+
+#ifndef HEADER_IDEA_H
+#define HEADER_IDEA_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef NO_IDEA
+#error IDEA is disabled.
+#endif
+
+#define IDEA_ENCRYPT 1
+#define IDEA_DECRYPT 0
+
+#include <openssl/opensslconf.h> /* IDEA_INT */
+#define IDEA_BLOCK 8
+#define IDEA_KEY_LENGTH 16
+
+typedef struct idea_key_st
+ {
+ IDEA_INT data[9][6];
+ } IDEA_KEY_SCHEDULE;
+
+const char *idea_options(void);
+void idea_ecb_encrypt(unsigned char *in, unsigned char *out,
+ IDEA_KEY_SCHEDULE *ks);
+void idea_set_encrypt_key(unsigned char *key, IDEA_KEY_SCHEDULE *ks);
+void idea_set_decrypt_key(IDEA_KEY_SCHEDULE *ek, IDEA_KEY_SCHEDULE *dk);
+void idea_cbc_encrypt(unsigned char *in, unsigned char *out,
+ long length, IDEA_KEY_SCHEDULE *ks, unsigned char *iv,int enc);
+void idea_cfb64_encrypt(unsigned char *in, unsigned char *out,
+ long length, IDEA_KEY_SCHEDULE *ks, unsigned char *iv,
+ int *num,int enc);
+void idea_ofb64_encrypt(unsigned char *in, unsigned char *out,
+ long length, IDEA_KEY_SCHEDULE *ks, unsigned char *iv, int *num);
+void idea_encrypt(unsigned long *in, IDEA_KEY_SCHEDULE *ks);
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/crypto/openssl/crypto/idea/idea_lcl.h b/crypto/openssl/crypto/idea/idea_lcl.h
new file mode 100644
index 000000000000..019059977145
--- /dev/null
+++ b/crypto/openssl/crypto/idea/idea_lcl.h
@@ -0,0 +1,216 @@
+/* crypto/idea/idea_lcl.h */
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ *
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to. The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code. The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ *
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * "This product includes cryptographic software written by
+ * Eric Young (eay@cryptsoft.com)"
+ * The word 'cryptographic' can be left out if the rouines from the library
+ * being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from
+ * the apps directory (application code) you must include an acknowledgement:
+ * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed. i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ * $FreeBSD$
+ */
+
+/* The new form of this macro (check if the a*b == 0) was suggested by
+ * Colin Plumb <colin@nyx10.cs.du.edu> */
+/* Removal of the inner if from from Wei Dai 24/4/96 */
+#define idea_mul(r,a,b,ul) \
+ul=(unsigned long)a*b; \
+if (ul != 0) \
+ { \
+ r=(ul&0xffff)-(ul>>16); \
+ r-=((r)>>16); \
+ } \
+else \
+ r=(-(int)a-b+1); /* assuming a or b is 0 and in range */ \
+
+#ifdef undef
+#define idea_mul(r,a,b,ul,sl) \
+if (a == 0) r=(0x10001-b)&0xffff; \
+else if (b == 0) r=(0x10001-a)&0xffff; \
+else { \
+ ul=(unsigned long)a*b; \
+ sl=(ul&0xffff)-(ul>>16); \
+ if (sl <= 0) sl+=0x10001; \
+ r=sl; \
+ }
+#endif
+
+/* 7/12/95 - Many thanks to Rhys Weatherley <rweather@us.oracle.com>
+ * for pointing out that I was assuming little endian
+ * byte order for all quantities what idea
+ * actually used bigendian. No where in the spec does it mention
+ * this, it is all in terms of 16 bit numbers and even the example
+ * does not use byte streams for the input example :-(.
+ * If you byte swap each pair of input, keys and iv, the functions
+ * would produce the output as the old version :-(.
+ */
+
+/* NOTE - c is not incremented as per n2l */
+#define n2ln(c,l1,l2,n) { \
+ c+=n; \
+ l1=l2=0; \
+ switch (n) { \
+ case 8: l2 =((unsigned long)(*(--(c)))) ; \
+ case 7: l2|=((unsigned long)(*(--(c))))<< 8; \
+ case 6: l2|=((unsigned long)(*(--(c))))<<16; \
+ case 5: l2|=((unsigned long)(*(--(c))))<<24; \
+ case 4: l1 =((unsigned long)(*(--(c)))) ; \
+ case 3: l1|=((unsigned long)(*(--(c))))<< 8; \
+ case 2: l1|=((unsigned long)(*(--(c))))<<16; \
+ case 1: l1|=((unsigned long)(*(--(c))))<<24; \
+ } \
+ }
+
+/* NOTE - c is not incremented as per l2n */
+#define l2nn(l1,l2,c,n) { \
+ c+=n; \
+ switch (n) { \
+ case 8: *(--(c))=(unsigned char)(((l2) )&0xff); \
+ case 7: *(--(c))=(unsigned char)(((l2)>> 8)&0xff); \
+ case 6: *(--(c))=(unsigned char)(((l2)>>16)&0xff); \
+ case 5: *(--(c))=(unsigned char)(((l2)>>24)&0xff); \
+ case 4: *(--(c))=(unsigned char)(((l1) )&0xff); \
+ case 3: *(--(c))=(unsigned char)(((l1)>> 8)&0xff); \
+ case 2: *(--(c))=(unsigned char)(((l1)>>16)&0xff); \
+ case 1: *(--(c))=(unsigned char)(((l1)>>24)&0xff); \
+ } \
+ }
+
+#undef n2l
+#define n2l(c,l) (l =((unsigned long)(*((c)++)))<<24L, \
+ l|=((unsigned long)(*((c)++)))<<16L, \
+ l|=((unsigned long)(*((c)++)))<< 8L, \
+ l|=((unsigned long)(*((c)++))))
+
+#undef l2n
+#define l2n(l,c) (*((c)++)=(unsigned char)(((l)>>24L)&0xff), \
+ *((c)++)=(unsigned char)(((l)>>16L)&0xff), \
+ *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \
+ *((c)++)=(unsigned char)(((l) )&0xff))
+
+#undef s2n
+#define s2n(l,c) (*((c)++)=(unsigned char)(((l) )&0xff), \
+ *((c)++)=(unsigned char)(((l)>> 8L)&0xff))
+
+#undef n2s
+#define n2s(c,l) (l =((IDEA_INT)(*((c)++)))<< 8L, \
+ l|=((IDEA_INT)(*((c)++))) )
+
+#ifdef undef
+/* NOTE - c is not incremented as per c2l */
+#define c2ln(c,l1,l2,n) { \
+ c+=n; \
+ l1=l2=0; \
+ switch (n) { \
+ case 8: l2 =((unsigned long)(*(--(c))))<<24; \
+ case 7: l2|=((unsigned long)(*(--(c))))<<16; \
+ case 6: l2|=((unsigned long)(*(--(c))))<< 8; \
+ case 5: l2|=((unsigned long)(*(--(c)))); \
+ case 4: l1 =((unsigned long)(*(--(c))))<<24; \
+ case 3: l1|=((unsigned long)(*(--(c))))<<16; \
+ case 2: l1|=((unsigned long)(*(--(c))))<< 8; \
+ case 1: l1|=((unsigned long)(*(--(c)))); \
+ } \
+ }
+
+/* NOTE - c is not incremented as per l2c */
+#define l2cn(l1,l2,c,n) { \
+ c+=n; \
+ switch (n) { \
+ case 8: *(--(c))=(unsigned char)(((l2)>>24)&0xff); \
+ case 7: *(--(c))=(unsigned char)(((l2)>>16)&0xff); \
+ case 6: *(--(c))=(unsigned char)(((l2)>> 8)&0xff); \
+ case 5: *(--(c))=(unsigned char)(((l2) )&0xff); \
+ case 4: *(--(c))=(unsigned char)(((l1)>>24)&0xff); \
+ case 3: *(--(c))=(unsigned char)(((l1)>>16)&0xff); \
+ case 2: *(--(c))=(unsigned char)(((l1)>> 8)&0xff); \
+ case 1: *(--(c))=(unsigned char)(((l1) )&0xff); \
+ } \
+ }
+
+#undef c2s
+#define c2s(c,l) (l =((unsigned long)(*((c)++))) , \
+ l|=((unsigned long)(*((c)++)))<< 8L)
+
+#undef s2c
+#define s2c(l,c) (*((c)++)=(unsigned char)(((l) )&0xff), \
+ *((c)++)=(unsigned char)(((l)>> 8L)&0xff))
+
+#undef c2l
+#define c2l(c,l) (l =((unsigned long)(*((c)++))) , \
+ l|=((unsigned long)(*((c)++)))<< 8L, \
+ l|=((unsigned long)(*((c)++)))<<16L, \
+ l|=((unsigned long)(*((c)++)))<<24L)
+
+#undef l2c
+#define l2c(l,c) (*((c)++)=(unsigned char)(((l) )&0xff), \
+ *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \
+ *((c)++)=(unsigned char)(((l)>>16L)&0xff), \
+ *((c)++)=(unsigned char)(((l)>>24L)&0xff))
+#endif
+
+#define E_IDEA(num) \
+ x1&=0xffff; \
+ idea_mul(x1,x1,*p,ul); p++; \
+ x2+= *(p++); \
+ x3+= *(p++); \
+ x4&=0xffff; \
+ idea_mul(x4,x4,*p,ul); p++; \
+ t0=(x1^x3)&0xffff; \
+ idea_mul(t0,t0,*p,ul); p++; \
+ t1=(t0+(x2^x4))&0xffff; \
+ idea_mul(t1,t1,*p,ul); p++; \
+ t0+=t1; \
+ x1^=t1; \
+ x4^=t0; \
+ ul=x2^t0; /* do the swap to x3 */ \
+ x2=x3^t1; \
+ x3=ul;
+
diff --git a/crypto/openssl/crypto/idea/idea_spd.c b/crypto/openssl/crypto/idea/idea_spd.c
new file mode 100644
index 000000000000..aefe1783b601
--- /dev/null
+++ b/crypto/openssl/crypto/idea/idea_spd.c
@@ -0,0 +1,297 @@
+/* crypto/idea/idea_spd.c */
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ *
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to. The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code. The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ *
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * "This product includes cryptographic software written by
+ * Eric Young (eay@cryptsoft.com)"
+ * The word 'cryptographic' can be left out if the rouines from the library
+ * being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from
+ * the apps directory (application code) you must include an acknowledgement:
+ * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed. i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ * $FreeBSD$
+ */
+
+/* 11-Sep-92 Andrew Daviel Support for Silicon Graphics IRIX added */
+/* 06-Apr-92 Luke Brennan Support for VMS and add extra signal calls */
+
+#if !defined(MSDOS) && (!defined(VMS) || defined(__DECC))
+#define TIMES
+#endif
+
+#include <stdio.h>
+
+#include <openssl/e_os2.h>
+#include OPENSSL_UNISTD_IO
+OPENSSL_DECLARE_EXIT
+
+#include <signal.h>
+#ifndef _IRIX
+#include <time.h>
+#endif
+#ifdef TIMES
+#include <sys/types.h>
+#include <sys/times.h>
+#endif
+
+/* Depending on the VMS version, the tms structure is perhaps defined.
+ The __TMS macro will show if it was. If it wasn't defined, we should
+ undefine TIMES, since that tells the rest of the program how things
+ should be handled. -- Richard Levitte */
+#if defined(VMS) && defined(__DECC) && !defined(__TMS)
+#undef TIMES
+#endif
+
+#ifndef TIMES
+#include <sys/timeb.h>
+#endif
+
+#if defined(sun) || defined(__ultrix)
+#define _POSIX_SOURCE
+#include <limits.h>
+#include <sys/param.h>
+#endif
+
+#include <openssl/idea.h>
+
+/* The following if from times(3) man page. It may need to be changed */
+#ifndef HZ
+#ifndef CLK_TCK
+#define HZ 100.0
+#else /* CLK_TCK */
+#define HZ ((double)CLK_TCK)
+#endif
+#endif
+
+#define BUFSIZE ((long)1024)
+long run=0;
+
+double Time_F(int s);
+#ifdef SIGALRM
+#if defined(__STDC__) || defined(sgi) || defined(_AIX)
+#define SIGRETTYPE void
+#else
+#define SIGRETTYPE int
+#endif
+
+SIGRETTYPE sig_done(int sig);
+SIGRETTYPE sig_done(int sig)
+ {
+ signal(SIGALRM,sig_done);
+ run=0;
+#ifdef LINT
+ sig=sig;
+#endif
+ }
+#endif
+
+#define START 0
+#define STOP 1
+
+double Time_F(int s)
+ {
+ double ret;
+#ifdef TIMES
+ static struct tms tstart,tend;
+
+ if (s == START)
+ {
+ times(&tstart);
+ return(0);
+ }
+ else
+ {
+ times(&tend);
+ ret=((double)(tend.tms_utime-tstart.tms_utime))/HZ;
+ return((ret == 0.0)?1e-6:ret);
+ }
+#else /* !times() */
+ static struct timeb tstart,tend;
+ long i;
+
+ if (s == START)
+ {
+ ftime(&tstart);
+ return(0);
+ }
+ else
+ {
+ ftime(&tend);
+ i=(long)tend.millitm-(long)tstart.millitm;
+ ret=((double)(tend.time-tstart.time))+((double)i)/1e3;
+ return((ret == 0.0)?1e-6:ret);
+ }
+#endif
+ }
+
+int main(int argc, char **argv)
+ {
+ long count;
+ static unsigned char buf[BUFSIZE];
+ static unsigned char key[] ={
+ 0x12,0x34,0x56,0x78,0x9a,0xbc,0xde,0xf0,
+ 0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10,
+ };
+ IDEA_KEY_SCHEDULE sch;
+ double a,aa,b,c,d;
+#ifndef SIGALRM
+ long ca,cca,cb,cc;
+#endif
+
+#ifndef TIMES
+ printf("To get the most accurate results, try to run this\n");
+ printf("program when this computer is idle.\n");
+#endif
+
+#ifndef SIGALRM
+ printf("First we calculate the approximate speed ...\n");
+ idea_set_encrypt_key(key,&sch);
+ count=10;
+ do {
+ long i;
+ IDEA_INT data[2];
+
+ count*=2;
+ Time_F(START);
+ for (i=count; i; i--)
+ idea_encrypt(data,&sch);
+ d=Time_F(STOP);
+ } while (d < 3.0);
+ ca=count/4;
+ cca=count/200;
+ cb=count;
+ cc=count*8/BUFSIZE+1;
+ printf("idea_set_encrypt_key %ld times\n",ca);
+#define COND(d) (count <= (d))
+#define COUNT(d) (d)
+#else
+#define COND(c) (run)
+#define COUNT(d) (count)
+ signal(SIGALRM,sig_done);
+ printf("Doing idea_set_encrypt_key for 10 seconds\n");
+ alarm(10);
+#endif
+
+ Time_F(START);
+ for (count=0,run=1; COND(ca); count+=4)
+ {
+ idea_set_encrypt_key(key,&sch);
+ idea_set_encrypt_key(key,&sch);
+ idea_set_encrypt_key(key,&sch);
+ idea_set_encrypt_key(key,&sch);
+ }
+ d=Time_F(STOP);
+ printf("%ld idea idea_set_encrypt_key's in %.2f seconds\n",count,d);
+ a=((double)COUNT(ca))/d;
+
+#ifdef SIGALRM
+ printf("Doing idea_set_decrypt_key for 10 seconds\n");
+ alarm(10);
+#else
+ printf("Doing idea_set_decrypt_key %ld times\n",cca);
+#endif
+
+ Time_F(START);
+ for (count=0,run=1; COND(cca); count+=4)
+ {
+ idea_set_decrypt_key(&sch,&sch);
+ idea_set_decrypt_key(&sch,&sch);
+ idea_set_decrypt_key(&sch,&sch);
+ idea_set_decrypt_key(&sch,&sch);
+ }
+ d=Time_F(STOP);
+ printf("%ld idea idea_set_decrypt_key's in %.2f seconds\n",count,d);
+ aa=((double)COUNT(cca))/d;
+
+#ifdef SIGALRM
+ printf("Doing idea_encrypt's for 10 seconds\n");
+ alarm(10);
+#else
+ printf("Doing idea_encrypt %ld times\n",cb);
+#endif
+ Time_F(START);
+ for (count=0,run=1; COND(cb); count+=4)
+ {
+ unsigned long data[2];
+
+ idea_encrypt(data,&sch);
+ idea_encrypt(data,&sch);
+ idea_encrypt(data,&sch);
+ idea_encrypt(data,&sch);
+ }
+ d=Time_F(STOP);
+ printf("%ld idea_encrypt's in %.2f second\n",count,d);
+ b=((double)COUNT(cb)*8)/d;
+
+#ifdef SIGALRM
+ printf("Doing idea_cbc_encrypt on %ld byte blocks for 10 seconds\n",
+ BUFSIZE);
+ alarm(10);
+#else
+ printf("Doing idea_cbc_encrypt %ld times on %ld byte blocks\n",cc,
+ BUFSIZE);
+#endif
+ Time_F(START);
+ for (count=0,run=1; COND(cc); count++)
+ idea_cbc_encrypt(buf,buf,BUFSIZE,&sch,
+ &(key[0]),IDEA_ENCRYPT);
+ d=Time_F(STOP);
+ printf("%ld idea_cbc_encrypt's of %ld byte blocks in %.2f second\n",
+ count,BUFSIZE,d);
+ c=((double)COUNT(cc)*BUFSIZE)/d;
+
+ printf("IDEA set_encrypt_key per sec = %12.2f (%9.3fuS)\n",a,1.0e6/a);
+ printf("IDEA set_decrypt_key per sec = %12.2f (%9.3fuS)\n",aa,1.0e6/aa);
+ printf("IDEA raw ecb bytes per sec = %12.2f (%9.3fuS)\n",b,8.0e6/b);
+ printf("IDEA cbc bytes per sec = %12.2f (%9.3fuS)\n",c,8.0e6/c);
+ exit(0);
+#if defined(LINT) || defined(MSDOS)
+ return(0);
+#endif
+ }
+
diff --git a/crypto/openssl/crypto/idea/ideatest.c b/crypto/openssl/crypto/idea/ideatest.c
new file mode 100644
index 000000000000..810f351713ec
--- /dev/null
+++ b/crypto/openssl/crypto/idea/ideatest.c
@@ -0,0 +1,231 @@
+/* crypto/idea/ideatest.c */
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
+ * All rights reserved.
+ *
+ * This package is an SSL implementation written
+ * by Eric Young (eay@cryptsoft.com).
+ * The implementation was written so as to conform with Netscapes SSL.
+ *
+ * This library is free for commercial and non-commercial use as long as
+ * the following conditions are aheared to. The following conditions
+ * apply to all code found in this distribution, be it the RC4, RSA,
+ * lhash, DES, etc., code; not just the SSL code. The SSL documentation
+ * included with this distribution is covered by the same copyright terms
+ * except that the holder is Tim Hudson (tjh@cryptsoft.com).
+ *
+ * Copyright remains Eric Young's, and as such any Copyright notices in
+ * the code are not to be removed.
+ * If this package is used in a product, Eric Young should be given attribution
+ * as the author of the parts of the library used.
+ * This can be in the form of a textual message at program startup or
+ * in documentation (online or textual) provided with the package.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * "This product includes cryptographic software written by
+ * Eric Young (eay@cryptsoft.com)"
+ * The word 'cryptographic' can be left out if the rouines from the library
+ * being used are not cryptographic related :-).
+ * 4. If you include any Windows specific code (or a derivative thereof) from
+ * the apps directory (application code) you must include an acknowledgement:
+ * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
+ *
+ * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * The licence and distribution terms for any publically available version or
+ * derivative of this code cannot be changed. i.e. this code cannot simply be
+ * copied and put under another distribution licence
+ * [including the GNU Public Licence.]
+ * $FreeBSD$
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#ifdef NO_IDEA
+int main(int argc, char *argv[])
+{
+ printf("No IDEA support\n");
+ return(0);
+}
+#else
+#include <openssl/idea.h>
+
+unsigned char k[16]={
+ 0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,
+ 0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08};
+
+unsigned char in[8]={0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03};
+unsigned char c[8]={0x11,0xFB,0xED,0x2B,0x01,0x98,0x6D,0xE5};
+unsigned char out[80];
+
+char *text="Hello to all people out there";
+
+static unsigned char cfb_key[16]={
+ 0xe1,0xf0,0xc3,0xd2,0xa5,0xb4,0x87,0x96,
+ 0x69,0x78,0x4b,0x5a,0x2d,0x3c,0x0f,0x1e,
+ };
+static unsigned char cfb_iv[80]={0x34,0x12,0x78,0x56,0xab,0x90,0xef,0xcd};
+static unsigned char cfb_buf1[40],cfb_buf2[40],cfb_tmp[8];
+#define CFB_TEST_SIZE 24
+static unsigned char plain[CFB_TEST_SIZE]=
+ {
+ 0x4e,0x6f,0x77,0x20,0x69,0x73,
+ 0x20,0x74,0x68,0x65,0x20,0x74,
+ 0x69,0x6d,0x65,0x20,0x66,0x6f,
+ 0x72,0x20,0x61,0x6c,0x6c,0x20
+ };
+static unsigned char cfb_cipher64[CFB_TEST_SIZE]={
+ 0x59,0xD8,0xE2,0x65,0x00,0x58,0x6C,0x3F,
+ 0x2C,0x17,0x25,0xD0,0x1A,0x38,0xB7,0x2A,
+ 0x39,0x61,0x37,0xDC,0x79,0xFB,0x9F,0x45
+
+/* 0xF9,0x78,0x32,0xB5,0x42,0x1A,0x6B,0x38,
+ 0x9A,0x44,0xD6,0x04,0x19,0x43,0xC4,0xD9,
+ 0x3D,0x1E,0xAE,0x47,0xFC,0xCF,0x29,0x0B,*/
+ };
+
+static int cfb64_test(unsigned char *cfb_cipher);
+static char *pt(unsigned char *p);
+int main(int argc, char *argv[])
+ {
+ int i,err=0;
+ IDEA_KEY_SCHEDULE key,dkey;
+ unsigned char iv[8];
+
+ idea_set_encrypt_key(k,&key);
+ idea_ecb_encrypt(in,out,&key);
+ if (memcmp(out,c,8) != 0)
+ {
+ printf("ecb idea error encrypting\n");
+ printf("got :");
+ for (i=0; i<8; i++)
+ printf("%02X ",out[i]);
+ printf("\n");
+ printf("expected:");
+ for (i=0; i<8; i++)
+ printf("%02X ",c[i]);
+ err=20;
+ printf("\n");
+ }
+
+ idea_set_decrypt_key(&key,&dkey);
+ idea_ecb_encrypt(c,out,&dkey);
+ if (memcmp(out,in,8) != 0)
+ {
+ printf("ecb idea error decrypting\n");
+ printf("got :");
+ for (i=0; i<8; i++)
+ printf("%02X ",out[i]);
+ printf("\n");
+ printf("expected:");
+ for (i=0; i<8; i++)
+ printf("%02X ",in[i]);
+ printf("\n");
+ err=3;
+ }
+
+ if (err == 0) printf("ecb idea ok\n");
+
+ memcpy(iv,k,8);
+ idea_cbc_encrypt((unsigned char *)text,out,strlen(text)+1,&key,iv,1);
+ memcpy(iv,k,8);
+ idea_cbc_encrypt(out,out,8,&dkey,iv,0);
+ idea_cbc_encrypt(&(out[8]),&(out[8]),strlen(text)+1-8,&dkey,iv,0);
+ if (memcmp(text,out,strlen(text)+1) != 0)
+ {
+ printf("cbc idea bad\n");
+ err=4;
+ }
+ else
+ printf("cbc idea ok\n");
+
+ printf("cfb64 idea ");
+ if (cfb64_test(cfb_cipher64))
+ {
+ printf("bad\n");
+ err=5;
+ }
+ else
+ printf("ok\n");
+
+ exit(err);
+ return(err);
+ }
+
+static int cfb64_test(unsigned char *cfb_cipher)
+ {
+ IDEA_KEY_SCHEDULE eks,dks;
+ int err=0,i,n;
+
+ idea_set_encrypt_key(cfb_key,&eks);
+ idea_set_decrypt_key(&eks,&dks);
+ memcpy(cfb_tmp,cfb_iv,8);
+ n=0;
+ idea_cfb64_encrypt(plain,cfb_buf1,(long)12,&eks,
+ cfb_tmp,&n,IDEA_ENCRYPT);
+ idea_cfb64_encrypt(&(plain[12]),&(cfb_buf1[12]),
+ (long)CFB_TEST_SIZE-12,&eks,
+ cfb_tmp,&n,IDEA_ENCRYPT);
+ if (memcmp(cfb_cipher,cfb_buf1,CFB_TEST_SIZE) != 0)
+ {
+ err=1;
+ printf("idea_cfb64_encrypt encrypt error\n");
+ for (i=0; i<CFB_TEST_SIZE; i+=8)
+ printf("%s\n",pt(&(cfb_buf1[i])));
+ }
+ memcpy(cfb_tmp,cfb_iv,8);
+ n=0;
+ idea_cfb64_encrypt(cfb_buf1,cfb_buf2,(long)17,&eks,
+ cfb_tmp,&n,IDEA_DECRYPT);
+ idea_cfb64_encrypt(&(cfb_buf1[17]),&(cfb_buf2[17]),
+ (long)CFB_TEST_SIZE-17,&dks,
+ cfb_tmp,&n,IDEA_DECRYPT);
+ if (memcmp(plain,cfb_buf2,CFB_TEST_SIZE) != 0)
+ {
+ err=1;
+ printf("idea_cfb_encrypt decrypt error\n");
+ for (i=0; i<24; i+=8)
+ printf("%s\n",pt(&(cfb_buf2[i])));
+ }
+ return(err);
+ }
+
+static char *pt(unsigned char *p)
+ {
+ static char bufs[10][20];
+ static int bnum=0;
+ char *ret;
+ int i;
+ static char *f="0123456789ABCDEF";
+
+ ret= &(bufs[bnum++][0]);
+ bnum%=10;
+ for (i=0; i<8; i++)
+ {
+ ret[i*2]=f[(p[i]>>4)&0xf];
+ ret[i*2+1]=f[p[i]&0xf];
+ }
+ ret[16]='\0';
+ return(ret);
+ }
+#endif
diff --git a/crypto/openssl/crypto/idea/version b/crypto/openssl/crypto/idea/version
new file mode 100644
index 000000000000..c269d8531e4d
--- /dev/null
+++ b/crypto/openssl/crypto/idea/version
@@ -0,0 +1,13 @@
+# $FreeBSD$
+1.1 07/12/95 - eay
+ Many thanks to Rhys Weatherley <rweather@us.oracle.com>
+ for pointing out that I was assuming little endian byte
+ order for all quantities what idea actually used
+ bigendian. No where in the spec does it mention
+ this, it is all in terms of 16 bit numbers and even the example
+ does not use byte streams for the input example :-(.
+ If you byte swap each pair of input, keys and iv, the functions
+ would produce the output as the old version :-(.
+
+1.0 ??/??/95 - eay
+ First version.
diff --git a/share/examples/kld/dyn_sysctl/Makefile b/share/examples/kld/dyn_sysctl/Makefile
new file mode 100644
index 000000000000..3c63a8a5f6ad
--- /dev/null
+++ b/share/examples/kld/dyn_sysctl/Makefile
@@ -0,0 +1,18 @@
+# $FreeBSD$
+
+SRCS = dyn_sysctl.c
+CFLAGS = -I/sys
+KMOD = dyn_sysctl
+KO = ${KMOD}.ko
+KLDMOD = t
+
+KLDLOAD = /sbin/kldload
+KLDUNLOAD = /sbin/kldunload
+
+load: ${KO}
+ ${KLDLOAD} -v ./${KO}
+
+unload: ${KO}
+ ${KLDUNLOAD} -v -n ${KO}
+
+.include <bsd.kmod.mk>
diff --git a/share/examples/kld/dyn_sysctl/README b/share/examples/kld/dyn_sysctl/README
new file mode 100644
index 000000000000..4dfa3c6bdfbd
--- /dev/null
+++ b/share/examples/kld/dyn_sysctl/README
@@ -0,0 +1,8 @@
+This example module creates partially overlapping subtrees to demonstrate
+reference counting. It also contains example of attaching a subtree to the
+wrong place, i.e. to a dynamic oid that could belong to someone else.
+The framework should deal with this case gracefully.
+
+Andrzej Bialecki <abial@freebsd.org>
+
+$FreeBSD$
diff --git a/share/examples/kld/dyn_sysctl/dyn_sysctl.c b/share/examples/kld/dyn_sysctl/dyn_sysctl.c
new file mode 100644
index 000000000000..e066b56be316
--- /dev/null
+++ b/share/examples/kld/dyn_sysctl/dyn_sysctl.c
@@ -0,0 +1,168 @@
+/*-
+ * Copyright (c) 2000 Andrzej Bialecki <abial@freebsd.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/module.h>
+#include <sys/sysctl.h>
+#include <sys/kernel.h>
+
+
+/* Some example data */
+static long a = 100;
+static int b = 200;
+static char *c = "hi there from dyn_sysctl";
+static struct sysctl_oid *a_root, *a_root1, *b_root;
+static struct sysctl_ctx_list clist, clist1, clist2;
+
+static int
+sysctl_dyn_sysctl_test (SYSCTL_HANDLER_ARGS)
+{
+ char *buf = "let's produce some text...";
+
+ return (sysctl_handle_string(oidp, buf, strlen(buf), req));
+}
+
+/*
+ * The function called at load/unload.
+ */
+static int
+load (module_t mod, int cmd, void *arg)
+{
+ int error;
+
+ error = 0;
+ switch (cmd) {
+ case MOD_LOAD :
+ /* Initialize the contexts */
+ printf("Initializing contexts and creating subtrees.\n\n");
+ sysctl_ctx_init(&clist);
+ sysctl_ctx_init(&clist1);
+ sysctl_ctx_init(&clist2);
+ /*
+ * Create two partially overlapping subtrees, belonging
+ * to different contexts.
+ */
+ printf("TREE ROOT NAME\n");
+ a_root = SYSCTL_ADD_NODE(&clist,
+ SYSCTL_STATIC_CHILDREN(/* top of sysctl tree */),
+ OID_AUTO, dyn_sysctl, CTLFLAG_RW, 0,
+ "dyn_sysctl root node");
+ a_root = SYSCTL_ADD_NODE(&clist1,
+ SYSCTL_STATIC_CHILDREN(/* top of sysctl tree */),
+ OID_AUTO, dyn_sysctl, CTLFLAG_RW, 0,
+ "dyn_sysctl root node");
+ if(a_root == NULL) {
+ printf("SYSCTL_ADD_NODE failed!\n");
+ return (EINVAL);
+ }
+ SYSCTL_ADD_LONG(&clist, SYSCTL_CHILDREN(a_root),
+ OID_AUTO, long_a, CTLFLAG_RW, &a, "just to try");
+ SYSCTL_ADD_INT(&clist, SYSCTL_CHILDREN(a_root),
+ OID_AUTO, int_b, CTLFLAG_RW, &b, 0, "just to try 1");
+ a_root1=SYSCTL_ADD_NODE(&clist, SYSCTL_CHILDREN(a_root),
+ OID_AUTO, nextlevel, CTLFLAG_RD, 0, "one level down");
+ SYSCTL_ADD_STRING(&clist, SYSCTL_CHILDREN(a_root1),
+ OID_AUTO, string_c, CTLFLAG_RD, c, 0, "just to try 2");
+ printf("1. (%p) / dyn_sysctl\n", &clist);
+
+ /* Add a subtree under already existing category */
+ a_root1 = SYSCTL_ADD_NODE(&clist, SYSCTL_STATIC_CHILDREN(_kern),
+ OID_AUTO, dyn_sysctl, CTLFLAG_RW, 0, "dyn_sysctl root node");
+ if(a_root1 == NULL) {
+ printf("SYSCTL_ADD_NODE failed!\n");
+ return (EINVAL);
+ }
+ SYSCTL_ADD_PROC(&clist, SYSCTL_CHILDREN(a_root1),
+ OID_AUTO, procedure, CTLFLAG_RD, 0, 0,
+ sysctl_dyn_sysctl_test, "A", "I can be here, too");
+ printf(" (%p) /kern dyn_sysctl\n", &clist);
+
+ /* Overlap second tree with the first. */
+ b_root = SYSCTL_ADD_NODE(&clist1, SYSCTL_CHILDREN(a_root),
+ OID_AUTO, nextlevel, CTLFLAG_RD, 0, "one level down");
+ SYSCTL_ADD_STRING(&clist1, SYSCTL_CHILDREN(b_root),
+ OID_AUTO, string_c1, CTLFLAG_RD, c, 0, "just to try 2");
+ printf("2. (%p) / dyn_sysctl (overlapping #1)\n", &clist1);
+
+ /*
+ * And now do something stupid. Connect another subtree to
+ * dynamic oid.
+ * WARNING: this is an example of WRONG use of dynamic sysctls.
+ */
+ b_root=SYSCTL_ADD_NODE(&clist2, SYSCTL_CHILDREN(a_root1),
+ OID_AUTO, bad, CTLFLAG_RW, 0, "dependent node");
+ SYSCTL_ADD_STRING(&clist2, SYSCTL_CHILDREN(b_root),
+ OID_AUTO, string_c, CTLFLAG_RD, c, 0, "shouldn't panic");
+ printf("3. (%p) /kern/dyn_sysctl bad (WRONG!)\n", &clist2);
+ break;
+ case MOD_UNLOAD :
+ printf("1. Try to free ctx1 (%p): ", &clist);
+ if(sysctl_ctx_free(&clist))
+ printf("failed: expected. Need to remove ctx3 first.\n");
+ else
+ printf("HELP! sysctl_ctx_free(%p) succeeded. EXPECT PANIC!!!\n", &clist);
+ printf("2. Try to free ctx3 (%p): ", &clist2);
+ if(sysctl_ctx_free(&clist2)) {
+ printf("sysctl_ctx_free(%p) failed!\n", &clist2);
+ /* Remove subtree forcefully... */
+ sysctl_remove_oid(b_root, 1, 1);
+ printf("sysctl_remove_oid(%p) succeeded\n", b_root);
+ } else
+ printf("Ok\n");
+ printf("3. Try to free ctx1 (%p) again: ", &clist);
+ if(sysctl_ctx_free(&clist)) {
+ printf("sysctl_ctx_free(%p) failed!\n", &clist);
+ /* Remove subtree forcefully... */
+ sysctl_remove_oid(a_root1, 1, 1);
+ printf("sysctl_remove_oid(%p) succeeded\n", a_root1);
+ } else
+ printf("Ok\n");
+ printf("4. Try to free ctx2 (%p): ", &clist1);
+ if(sysctl_ctx_free(&clist1)) {
+ printf("sysctl_ctx_free(%p) failed!\n", &clist1);
+ /* Remove subtree forcefully... */
+ sysctl_remove_oid(a_root, 1, 1);
+ } else
+ printf("Ok\n");
+ break;
+ default :
+ error = EINVAL;
+ break;
+ }
+ return error;
+}
+
+static moduledata_t mod_data= {
+ "dyn_sysctl",
+ load,
+ 0
+};
+
+DECLARE_MODULE(dyn_sysctl, mod_data, SI_SUB_EXEC, SI_ORDER_ANY);
diff --git a/share/man/man4/md.4 b/share/man/man4/md.4
new file mode 100644
index 000000000000..5a771e334244
--- /dev/null
+++ b/share/man/man4/md.4
@@ -0,0 +1,118 @@
+.\" ----------------------------------------------------------------------------
+.\" "THE BEER-WARE LICENSE" (Revision 42):
+.\" <phk@FreeBSD.ORG> wrote this file. As long as you retain this notice you
+.\" can do whatever you want with this stuff. If we meet some day, and you think
+.\" this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp
+.\" ----------------------------------------------------------------------------
+.\"
+.\" $FreeBSD$
+.\"
+.Dd July 4, 2000
+.Dt MD 4
+.Os
+.Sh NAME
+.Nm md
+.Nd memory disk
+.Sh SYNOPSIS
+.Cd device md
+.Pp
+To specify the default maximum size of
+.Xr malloc 9
+backed disks:
+.Cd options MD_NSECT=20000
+.Sh DESCRIPTION
+The
+.Nm
+driver provides support for two kinds of memory backed virtual disks:
+.Xr malloc 9
+backed
+and pre-loaded module backed.
+.Pp
+The
+.Xr malloc 9
+backed
+disks
+are severely limited in size by constraints imposed by
+.Xr malloc 9 .
+The limit imposed depends on the amount of physical RAM in the machine,
+and covers all
+.Xr malloc 9
+backed instances of
+.Nm
+devices.
+.Pp
+A sector filled with identical bytes does not consume storage,
+and therefore the storage allocated by a
+.Nm
+disk can be freed with a command such as this:
+.Bd -literal -offset indent
+dd if=/dev/zero of=/dev/md567
+.Ed
+.Pp
+The default maximum size of a
+.Nm
+disk
+backed by
+.Xr malloc 9
+is 20,000 sectors of 512 bytes each.
+This can be changed
+with the kernel option
+.Dv MD_NSECT .
+.Pp
+At boot time the
+.Nm
+driver will search for pre-loaded modules of type
+.Sq md_image
+and instantiate a
+.Nm
+device for each of these modules.
+The type
+.Sq mfs_root
+is also allowed for backward compatibility.
+These devices are backed by the RAM reserved by the
+.Xr loader 8 ,
+and as such not limited by the
+.Xr malloc 9
+size constraints.
+However, this also means that the storage cannot be released.
+For the same reason,
+the
+.Dq identical byte
+detection is not applicable.
+.Pp
+The
+.Nm
+driver uses the
+.Dq almost-clone
+convention,
+whereby opening device number N creates device instance number N+1.
+.Pp
+The
+.Xr vmstat 8
+utility can be used to monitor memory usage by
+.Xr malloc 9
+backed
+.Nm
+disks,
+but not those backed by pre-loaded modules.
+.Sh SEE ALSO
+.Xr disklabel 5 ,
+.Xr disklabel 8 ,
+.Xr fdisk 8 ,
+.Xr loader 8 ,
+.Xr newfs 8 ,
+.Xr vmstat 8
+.Sh HISTORY
+The
+.Nm
+driver first appeared in
+.Fx 4.0
+as a cleaner replacement
+for the MFS functionality previously used in PicoBSD
+and in the FreeBSD installation process.
+.Sh AUTHORS
+The
+.Nm
+driver was written by
+.An Poul-Henning Kamp
+.Aq phk@FreeBSD.org .
diff --git a/usr.bin/fetch/fetch.c b/usr.bin/fetch/fetch.c
new file mode 100644
index 000000000000..02a0cd511ed3
--- /dev/null
+++ b/usr.bin/fetch/fetch.c
@@ -0,0 +1,645 @@
+/*-
+ * Copyright (c) 2000 Dag-Erling Coïdan Smørgrav
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer
+ * in this position and unchanged.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/param.h>
+#include <sys/stat.h>
+#include <sys/socket.h>
+
+#include <ctype.h>
+#include <err.h>
+#include <errno.h>
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sysexits.h>
+#include <unistd.h>
+
+#include <fetch.h>
+
+#define MINBUFSIZE 4096
+
+/* Option flags */
+int A_flag; /* -A: do not follow 302 redirects */
+int a_flag; /* -a: auto retry */
+size_t B_size; /* -B: buffer size */
+int b_flag; /*! -b: workaround TCP bug */
+char *c_dirname; /* -c: remote directory */
+int d_flag; /* -d: direct connection */
+int F_flag; /* -F: restart without checking mtime */
+char *f_filename; /* -f: file to fetch */
+int H_flag; /* -H: use high port */
+char *h_hostname; /* -h: host to fetch from */
+int l_flag; /* -l: link rather than copy file: URLs */
+int m_flag; /* -[Mm]: mirror mode */
+int n_flag; /* -n: do not preserve modification time */
+int o_flag; /* -o: specify output file */
+int o_directory; /* output file is a directory */
+char *o_filename; /* name of output file */
+int o_stdout; /* output file is stdout */
+int once_flag; /* -1: stop at first successful file */
+int p_flag = 1; /* -[Pp]: use passive FTP */
+int R_flag; /* -R: don't delete partially transferred files */
+int r_flag; /* -r: restart previously interrupted transfer */
+u_int T_secs = 0; /* -T: transfer timeout in seconds */
+int s_flag; /* -s: show size, don't fetch */
+off_t S_size; /* -S: require size to match */
+int t_flag; /*! -t: workaround TCP bug */
+int v_level = 1; /* -v: verbosity level */
+int v_tty; /* stdout is a tty */
+u_int w_secs; /* -w: retry delay */
+int family = PF_UNSPEC; /* -[46]: address family to use */
+
+int sigalrm; /* SIGALRM received */
+int sigint; /* SIGINT received */
+
+u_int ftp_timeout; /* default timeout for FTP transfers */
+u_int http_timeout; /* default timeout for HTTP transfers */
+u_char *buf; /* transfer buffer */
+
+
+void
+sig_handler(int sig)
+{
+ switch (sig) {
+ case SIGALRM:
+ sigalrm = 1;
+ break;
+ case SIGINT:
+ sigint = 1;
+ break;
+ }
+}
+
+struct xferstat {
+ char name[40];
+ struct timeval start;
+ struct timeval end;
+ struct timeval last;
+ off_t size;
+ off_t offset;
+ off_t rcvd;
+};
+
+void
+stat_display(struct xferstat *xs, int force)
+{
+ struct timeval now;
+
+ if (!v_tty)
+ return;
+
+ gettimeofday(&now, NULL);
+ if (!force && now.tv_sec <= xs->last.tv_sec)
+ return;
+ xs->last = now;
+
+ fprintf(stderr, "\rReceiving %s", xs->name);
+ if (xs->size == -1)
+ fprintf(stderr, ": %lld bytes", xs->rcvd);
+ else
+ fprintf(stderr, " (%lld bytes): %d%%", xs->size,
+ (int)((100.0 * xs->rcvd) / xs->size));
+}
+
+void
+stat_start(struct xferstat *xs, char *name, off_t size, off_t offset)
+{
+ snprintf(xs->name, sizeof xs->name, "%s", name);
+ gettimeofday(&xs->start, NULL);
+ xs->last.tv_sec = xs->last.tv_usec = 0;
+ xs->end = xs->last;
+ xs->size = size;
+ xs->offset = offset;
+ xs->rcvd = offset;
+ stat_display(xs, 1);
+}
+
+void
+stat_update(struct xferstat *xs, off_t rcvd, int force)
+{
+ xs->rcvd = rcvd;
+ stat_display(xs, 0);
+}
+
+void
+stat_end(struct xferstat *xs)
+{
+ double delta;
+ double bps;
+
+ gettimeofday(&xs->end, NULL);
+
+ stat_display(xs, 1);
+ fputc('\n', stderr);
+ delta = (xs->end.tv_sec + (xs->end.tv_usec / 1.e6))
+ - (xs->start.tv_sec + (xs->start.tv_usec / 1.e6));
+ fprintf(stderr, "%lld bytes transferred in %.1f seconds ",
+ xs->rcvd - xs->offset, delta);
+ bps = (xs->rcvd - xs->offset) / delta;
+ if (bps > 1024*1024)
+ fprintf(stderr, "(%.2f MBps)\n", bps / (1024*1024));
+ else if (bps > 1024)
+ fprintf(stderr, "(%.2f kBps)\n", bps / 1024);
+ else
+ fprintf(stderr, "(%.2f Bps)\n", bps);
+}
+
+int
+fetch(char *URL, char *path)
+{
+ struct url *url;
+ struct url_stat us;
+ struct stat sb;
+ struct xferstat xs;
+ FILE *f, *of;
+ size_t size;
+ off_t count;
+ char flags[8];
+ int n, r;
+ u_int timeout;
+
+ f = of = NULL;
+
+ /* parse URL */
+ if ((url = fetchParseURL(URL)) == NULL) {
+ warnx("%s: parse error", URL);
+ goto failure;
+ }
+
+ timeout = 0;
+ *flags = 0;
+
+ /* common flags */
+ if (v_level > 2)
+ strcat(flags, "v");
+ switch (family) {
+ case PF_INET:
+ strcat(flags, "4");
+ break;
+ case PF_INET6:
+ strcat(flags, "6");
+ break;
+ }
+
+ /* FTP specific flags */
+ if (strcmp(url->scheme, "ftp") == 0) {
+ if (p_flag)
+ strcat(flags, "p");
+ if (d_flag)
+ strcat(flags, "d");
+ if (H_flag)
+ strcat(flags, "h");
+ timeout = T_secs ? T_secs : ftp_timeout;
+ }
+
+ /* HTTP specific flags */
+ if (strcmp(url->scheme, "http") == 0) {
+ if (d_flag)
+ strcat(flags, "d");
+ if (A_flag)
+ strcat(flags, "A");
+ timeout = T_secs ? T_secs : http_timeout;
+ }
+
+ /* set the protocol timeout. */
+ fetchTimeout = timeout;
+
+ /* stat remote file */
+ if (fetchStat(url, &us, flags) == -1)
+ goto failure;
+
+ /* just print size */
+ if (s_flag) {
+ if (us.size == -1)
+ printf("Unknown\n");
+ else
+ printf("%lld\n", us.size);
+ goto success;
+ }
+
+ /* check that size is as expected */
+ if (S_size && us.size != -1 && us.size != S_size) {
+ warnx("%s: size mismatch: expected %lld, actual %lld",
+ path, S_size, us.size);
+ goto failure;
+ }
+
+ /* symlink instead of copy */
+ if (l_flag && strcmp(url->scheme, "file") == 0 && !o_stdout) {
+ if (symlink(url->doc, path) == -1) {
+ warn("%s: symlink()", path);
+ goto failure;
+ }
+ goto success;
+ }
+
+ if (o_stdout) {
+ /* output to stdout */
+ of = stdout;
+ } else if (r_flag && us.size != -1 && stat(path, &sb) != -1
+ && (F_flag || (us.mtime && sb.st_mtime == us.mtime))) {
+ /* output to file, restart aborted transfer */
+ if (us.size == sb.st_size)
+ goto success;
+ else if (sb.st_size > us.size && truncate(path, us.size) == -1) {
+ warn("%s: truncate()", path);
+ goto failure;
+ }
+ if ((of = fopen(path, "a")) == NULL) {
+ warn("%s: open()", path);
+ goto failure;
+ }
+ url->offset = sb.st_size;
+ } else if (m_flag && us.size != -1 && stat(path, &sb) != -1) {
+ /* output to file, mirror mode */
+ if (sb.st_size == us.size && sb.st_mtime == us.mtime)
+ return 0;
+ if ((of = fopen(path, "w")) == NULL) {
+ warn("%s: open()", path);
+ goto failure;
+ }
+ } else {
+ /* output to file, all other cases */
+ if ((of = fopen(path, "w")) == NULL) {
+ warn("%s: open()", path);
+ goto failure;
+ }
+ }
+ count = url->offset;
+
+ /* start the transfer */
+ if ((f = fetchGet(url, flags)) == NULL) {
+ warnx("%s", fetchLastErrString);
+ if (!R_flag && !r_flag && !o_stdout)
+ unlink(path);
+ goto failure;
+ }
+
+ /* start the counter */
+ stat_start(&xs, path, us.size, count);
+
+ sigint = sigalrm = 0;
+
+ /* suck in the data */
+ for (n = 0; !sigint && !sigalrm; ++n) {
+ if (us.size != -1 && us.size - count < B_size)
+ size = us.size - count;
+ else
+ size = B_size;
+ if (timeout)
+ alarm(timeout);
+ if ((size = fread(buf, 1, size, f)) <= 0)
+ break;
+ stat_update(&xs, count += size, 0);
+ if (fwrite(buf, size, 1, of) != 1)
+ break;
+ }
+
+ if (timeout)
+ alarm(0);
+
+ stat_end(&xs);
+
+ /* Set mtime of local file */
+ if (!n_flag && us.mtime && !o_stdout) {
+ struct timeval tv[2];
+
+ fflush(of);
+ tv[0].tv_sec = (long)(us.atime ? us.atime : us.mtime);
+ tv[1].tv_sec = (long)us.mtime;
+ tv[0].tv_usec = tv[1].tv_usec = 0;
+ if (utimes(path, tv))
+ warn("%s: utimes()", path);
+ }
+
+ /* timed out or interrupted? */
+ if (sigalrm)
+ warnx("transfer timed out");
+ if (sigint)
+ warnx("transfer interrupted");
+
+ if (!sigalrm && !sigint) {
+ /* check the status of our files */
+ if (ferror(f))
+ warn("%s", URL);
+ if (ferror(of))
+ warn("%s", path);
+ if (ferror(f) || ferror(of))
+ goto failure;
+ }
+
+ /* did the transfer complete normally? */
+ if (us.size != -1 && count < us.size) {
+ warnx("%s appears to be truncated: %lld/%lld bytes",
+ path, count, us.size);
+ goto failure_keep;
+ }
+
+ success:
+ r = 0;
+ goto done;
+ failure:
+ if (of && of != stdout && !R_flag && !r_flag)
+ unlink(path);
+ failure_keep:
+ r = -1;
+ goto done;
+ done:
+ if (f)
+ fclose(f);
+ if (of && of != stdout)
+ fclose(of);
+ if (url)
+ fetchFreeURL(url);
+ return r;
+}
+
+void
+usage(void)
+{
+ /* XXX badly out of synch */
+ fprintf(stderr,
+ "Usage: fetch [-1AFHMPRabdlmnpqrstv] [-o outputfile] [-S bytes]\n"
+ " [-B bytes] [-T seconds] [-w seconds]\n"
+ " [-f file -h host [-c dir] | URL ...]\n"
+ );
+}
+
+
+#define PARSENUM(NAME, TYPE) \
+int \
+NAME(char *s, TYPE *v) \
+{ \
+ *v = 0; \
+ for (*v = 0; *s; s++) \
+ if (isdigit(*s)) \
+ *v = *v * 10 + *s - '0'; \
+ else \
+ return -1; \
+ return 0; \
+}
+
+PARSENUM(parseint, u_int)
+PARSENUM(parsesize, size_t)
+PARSENUM(parseoff, off_t)
+
+int
+main(int argc, char *argv[])
+{
+ struct stat sb;
+ struct sigaction sa;
+ char *p, *q, *s;
+ int c, e, r;
+
+ while ((c = getopt(argc, argv,
+ "146AaB:bc:dFf:h:lHMmnPpo:qRrS:sT:tvw:")) != EOF)
+ switch (c) {
+ case '1':
+ once_flag = 1;
+ break;
+ case '4':
+ family = PF_INET;
+ break;
+ case '6':
+ family = PF_INET6;
+ break;
+ case 'A':
+ A_flag = 1;
+ break;
+ case 'a':
+ a_flag = 1;
+ break;
+ case 'B':
+ if (parsesize(optarg, &B_size) == -1)
+ errx(1, "invalid buffer size");
+ break;
+ case 'b':
+ warnx("warning: the -b option is deprecated");
+ b_flag = 1;
+ break;
+ case 'c':
+ c_dirname = optarg;
+ break;
+ case 'd':
+ d_flag = 1;
+ break;
+ case 'F':
+ F_flag = 1;
+ break;
+ case 'f':
+ f_filename = optarg;
+ break;
+ case 'H':
+ H_flag = 1;
+ break;
+ case 'h':
+ h_hostname = optarg;
+ break;
+ case 'l':
+ l_flag = 1;
+ break;
+ case 'o':
+ o_flag = 1;
+ o_filename = optarg;
+ break;
+ case 'M':
+ case 'm':
+ m_flag = 1;
+ break;
+ case 'n':
+ n_flag = 1;
+ break;
+ case 'P':
+ case 'p':
+ p_flag = 1;
+ break;
+ case 'q':
+ v_level = 0;
+ break;
+ case 'R':
+ R_flag = 1;
+ break;
+ case 'r':
+ r_flag = 1;
+ break;
+ case 'S':
+ if (parseoff(optarg, &S_size) == -1)
+ errx(1, "invalid size");
+ break;
+ case 's':
+ s_flag = 1;
+ break;
+ case 'T':
+ if (parseint(optarg, &T_secs) == -1)
+ errx(1, "invalid timeout");
+ break;
+ case 't':
+ t_flag = 1;
+ warnx("warning: the -t option is deprecated");
+ break;
+ case 'v':
+ v_level++;
+ break;
+ case 'w':
+ a_flag = 1;
+ if (parseint(optarg, &w_secs) == -1)
+ errx(1, "invalid delay");
+ break;
+ default:
+ usage();
+ exit(EX_USAGE);
+ }
+
+ argc -= optind;
+ argv += optind;
+
+ if (h_hostname || f_filename || c_dirname) {
+ if (!h_hostname || !f_filename || argc) {
+ usage();
+ exit(EX_USAGE);
+ }
+ /* XXX this is a hack. */
+ if (strcspn(h_hostname, "@:/") != strlen(h_hostname))
+ errx(1, "invalid hostname");
+ if (asprintf(argv, "ftp://%s/%s/%s", h_hostname,
+ c_dirname ? c_dirname : "", f_filename) == -1)
+ errx(1, strerror(ENOMEM));
+ argc++;
+ }
+
+ if (!argc) {
+ usage();
+ exit(EX_USAGE);
+ }
+
+ /* allocate buffer */
+ if (B_size < MINBUFSIZE)
+ B_size = MINBUFSIZE;
+ if ((buf = malloc(B_size)) == NULL)
+ errx(1, strerror(ENOMEM));
+
+ /* timeouts */
+ if ((s = getenv("FTP_TIMEOUT")) != NULL) {
+ if (parseint(s, &ftp_timeout) == -1) {
+ warnx("FTP_TIMEOUT is not a positive integer");
+ ftp_timeout = 0;
+ }
+ }
+ if ((s = getenv("HTTP_TIMEOUT")) != NULL) {
+ if (parseint(s, &http_timeout) == -1) {
+ warnx("HTTP_TIMEOUT is not a positive integer");
+ http_timeout = 0;
+ }
+ }
+
+ /* signal handling */
+ sa.sa_flags = 0;
+ sa.sa_handler = sig_handler;
+ sigemptyset(&sa.sa_mask);
+ (void)sigaction(SIGALRM, &sa, NULL);
+ (void)sigaction(SIGINT, &sa, NULL);
+
+ /* output file */
+ if (o_flag) {
+ if (strcmp(o_filename, "-") == 0) {
+ o_stdout = 1;
+ } else if (stat(o_filename, &sb) == -1) {
+ if (errno == ENOENT) {
+ if (argc > 1)
+ errx(EX_USAGE, "%s is not a directory", o_filename);
+ } else {
+ err(EX_IOERR, "%s", o_filename);
+ }
+ } else {
+ if (sb.st_mode & S_IFDIR)
+ o_directory = 1;
+ }
+ }
+
+ /* check if output is to a tty (for progress report) */
+ v_tty = isatty(STDERR_FILENO);
+ r = 0;
+
+ while (argc) {
+ if ((p = strrchr(*argv, '/')) == NULL)
+ p = *argv;
+ else
+ p++;
+
+ if (!*p)
+ p = "fetch.out";
+
+ fetchLastErrCode = 0;
+
+ if (o_flag) {
+ if (o_stdout) {
+ e = fetch(*argv, "-");
+ } else if (o_directory) {
+ asprintf(&q, "%s/%s", o_filename, p);
+ e = fetch(*argv, q);
+ free(q);
+ } else {
+ e = fetch(*argv, o_filename);
+ }
+ } else {
+ e = fetch(*argv, p);
+ }
+
+ if (sigint)
+ exit(1);
+
+ if (e == 0 && once_flag)
+ exit(0);
+
+ if (e) {
+ r = 1;
+ if ((fetchLastErrCode
+ && fetchLastErrCode != FETCH_UNAVAIL
+ && fetchLastErrCode != FETCH_MOVED
+ && fetchLastErrCode != FETCH_URL
+ && fetchLastErrCode != FETCH_RESOLV
+ && fetchLastErrCode != FETCH_UNKNOWN)) {
+ if (w_secs) {
+ if (v_level)
+ fprintf(stderr, "Waiting %d seconds before retrying\n", w_secs);
+ sleep(w_secs);
+ }
+ if (a_flag)
+ continue;
+ fprintf(stderr, "Skipping %s\n", *argv);
+ }
+ }
+
+ argc--, argv++;
+ }
+
+ exit(r);
+}