summaryrefslogtreecommitdiffstats
path: root/sys/crypto
diff options
context:
space:
mode:
authorume <ume@FreeBSD.org>2001-06-11 12:39:29 +0000
committerume <ume@FreeBSD.org>2001-06-11 12:39:29 +0000
commit832f8d224926758a9ae0b23a6b45353e44fbc87a (patch)
treea79fc7ad2b97862c4a404f352f0211ad93a7b5f1 /sys/crypto
parent2693854b01a52b0395a91322aa3edf926bddff38 (diff)
downloadFreeBSD-src-832f8d224926758a9ae0b23a6b45353e44fbc87a.zip
FreeBSD-src-832f8d224926758a9ae0b23a6b45353e44fbc87a.tar.gz
Sync with recent KAME.
This work was based on kame-20010528-freebsd43-snap.tgz and some critical problem after the snap was out were fixed. There are many many changes since last KAME merge. TODO: - The definitions of SADB_* in sys/net/pfkeyv2.h are still different from RFC2407/IANA assignment because of binary compatibility issue. It should be fixed under 5-CURRENT. - ip6po_m member of struct ip6_pktopts is no longer used. But, it is still there because of binary compatibility issue. It should be removed under 5-CURRENT. Reviewed by: itojun Obtained from: KAME MFC after: 3 weeks
Diffstat (limited to 'sys/crypto')
-rw-r--r--sys/crypto/blowfish/bf_cbc.c151
-rw-r--r--sys/crypto/blowfish/bf_cbc_m.c343
-rw-r--r--sys/crypto/blowfish/bf_enc.c124
-rw-r--r--sys/crypto/blowfish/bf_locl.h62
-rw-r--r--sys/crypto/blowfish/bf_skey.c85
-rw-r--r--sys/crypto/blowfish/blowfish.h49
-rw-r--r--sys/crypto/cast128/cast128.c2
-rw-r--r--sys/crypto/cast128/cast128.h6
-rw-r--r--sys/crypto/cast128/cast128_cbc.c222
-rw-r--r--sys/crypto/des/des.h205
-rw-r--r--sys/crypto/des/des_3cbc.c250
-rw-r--r--sys/crypto/des/des_cbc.c331
-rw-r--r--sys/crypto/des/des_ecb.c4
-rw-r--r--sys/crypto/des/des_locl.h105
-rw-r--r--sys/crypto/des/des_setkey.c10
-rw-r--r--sys/crypto/md5.c2
-rw-r--r--sys/crypto/rc5/rc5.c219
-rw-r--r--sys/crypto/rc5/rc5.h87
-rw-r--r--sys/crypto/rc5/rc5_cbc.c215
-rw-r--r--sys/crypto/rijndael/boxes-fst.dat76
-rw-r--r--sys/crypto/rijndael/rijndael-alg-fst.c57
-rw-r--r--sys/crypto/rijndael/rijndael-alg-fst.h3
-rw-r--r--sys/crypto/rijndael/rijndael-api-fst.c52
-rw-r--r--sys/crypto/rijndael/rijndael-api-fst.h9
-rw-r--r--sys/crypto/rijndael/rijndael_local.h2
-rw-r--r--sys/crypto/sha1.c2
-rw-r--r--sys/crypto/sha2/sha2.c1048
-rw-r--r--sys/crypto/sha2/sha2.h141
28 files changed, 1485 insertions, 2377 deletions
diff --git a/sys/crypto/blowfish/bf_cbc.c b/sys/crypto/blowfish/bf_cbc.c
deleted file mode 100644
index 6eb6d3b..0000000
--- a/sys/crypto/blowfish/bf_cbc.c
+++ /dev/null
@@ -1,151 +0,0 @@
-/* $FreeBSD$ */
-/* $KAME: bf_cbc.c,v 1.3 2000/03/27 04:36:25 sumikawa Exp $ */
-
-/* crypto/bf/bf_cbc.c */
-/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au)
- * All rights reserved.
- *
- * This package is an SSL implementation written
- * by Eric Young (eay@mincom.oz.au).
- * 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@mincom.oz.au).
- *
- * 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@mincom.oz.au)"
- * 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@mincom.oz.au)"
- *
- * 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.]
- */
-
-#include <crypto/blowfish/blowfish.h>
-#include <crypto/blowfish/bf_locl.h>
-
-void BF_cbc_encrypt(in, out, length, ks, iv, encrypt)
-unsigned char *in;
-unsigned char *out;
-long length;
-BF_KEY *ks;
-unsigned char *iv;
-int encrypt;
- {
- register BF_LONG tin0,tin1;
- register BF_LONG tout0,tout1,xor0,xor1;
- register long l=length;
- BF_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;
- BF_encrypt(tin,ks,BF_ENCRYPT);
- tout0=tin[0];
- tout1=tin[1];
- l2n(tout0,out);
- l2n(tout1,out);
- }
- if (l != -8)
- {
- n2ln(in,tin0,tin1,l+8);
- tin0^=tout0;
- tin1^=tout1;
- tin[0]=tin0;
- tin[1]=tin1;
- BF_encrypt(tin,ks,BF_ENCRYPT);
- tout0=tin[0];
- tout1=tin[1];
- l2n(tout0,out);
- 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);
- n2l(in,tin1);
- tin[0]=tin0;
- tin[1]=tin1;
- BF_encrypt(tin,ks,BF_DECRYPT);
- tout0=tin[0]^xor0;
- tout1=tin[1]^xor1;
- l2n(tout0,out);
- l2n(tout1,out);
- xor0=tin0;
- xor1=tin1;
- }
- if (l != -8)
- {
- n2l(in,tin0);
- n2l(in,tin1);
- tin[0]=tin0;
- tin[1]=tin1;
- BF_encrypt(tin,ks,BF_DECRYPT);
- 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;
- }
-
diff --git a/sys/crypto/blowfish/bf_cbc_m.c b/sys/crypto/blowfish/bf_cbc_m.c
deleted file mode 100644
index 088adad..0000000
--- a/sys/crypto/blowfish/bf_cbc_m.c
+++ /dev/null
@@ -1,343 +0,0 @@
-/* $FreeBSD$ */
-/* $KAME: bf_cbc_m.c,v 1.4 2000/06/14 10:41:16 itojun Exp $ */
-
-/*
- * heavily modified to accept mbuf, by Jun-ichiro itojun Itoh
- * <itojun@itojun.org>, 1997.
- */
-/* crypto/bf/bf_cbc.c */
-/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au)
- * All rights reserved.
- *
- * This package is an SSL implementation written
- * by Eric Young (eay@mincom.oz.au).
- * 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@mincom.oz.au).
- *
- * 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@mincom.oz.au)"
- * 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@mincom.oz.au)"
- *
- * 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.]
- */
-
-#include <sys/param.h>
-#include <sys/mbuf.h>
-#include <sys/systm.h>
-
-#include <crypto/blowfish/blowfish.h>
-#include <crypto/blowfish/bf_locl.h>
-
-#define panic(x) do { printf(x); return EINVAL; } while (0)
-
-int BF_cbc_encrypt_m(m0, skip, length, key, iv, mode)
- struct mbuf *m0;
- int skip;
- int length;
- BF_KEY *key;
- unsigned char *iv;
- int mode;
-{
- u_int8_t inbuf[8], outbuf[8];
- struct mbuf *m;
- size_t off;
- register BF_LONG tin0, tin1;
- register BF_LONG tout0, tout1;
- BF_LONG tin[2];
-
- /* sanity checks */
- if (m0->m_pkthdr.len < skip) {
- printf("mbuf length < skip\n");
- return EINVAL;
- }
- if (m0->m_pkthdr.len < length) {
- printf("mbuf length < encrypt length\n");
- return EINVAL;
- }
- if (m0->m_pkthdr.len < skip + length) {
- printf("mbuf length < skip + encrypt length\n");
- return EINVAL;
- }
- if (length % 8) {
- printf("length is not multiple of 8\n");
- return EINVAL;
- }
-
- m = m0;
- off = 0;
-
- /* skip over the header */
- while (skip) {
- if (!m)
- panic("mbuf chain?\n");
- if (m->m_len <= skip) {
- skip -= m->m_len;
- m = m->m_next;
- off = 0;
- } else {
- off = skip;
- skip = 0;
- }
- }
-
- /* initialize */
- tin0 = tin1 = tout0 = tout1 = 0;
- tin[0] = tin[1] = 0;
-
- if (mode == BF_ENCRYPT) {
- u_int8_t *in, *out;
-
- n2l(iv, tout0);
- n2l(iv, tout1);
-
- while (0 < length) {
- if (!m)
- panic("mbuf chain?\n");
-
- /*
- * copy the source into input buffer.
- * don't update off or m, since we need to use them * later.
- */
- if (off + 8 <= m->m_len)
- bcopy(mtod(m, u_int8_t *) + off, &inbuf[0], 8);
- else {
- struct mbuf *n;
- size_t noff;
- u_int8_t *p;
- u_int8_t *in;
-
- n = m;
- noff = off;
- p = mtod(n, u_int8_t *) + noff;
-
- in = &inbuf[0];
- while (in - &inbuf[0] < 8) {
- if (!p)
- panic("mbuf chain?\n");
-
- *in++ = *p++;
- noff++;
- if (noff < n->m_len)
- continue;
- do {
- n = n->m_next;
- } while (n && ! n->m_len);
- noff = 0;
- if (n)
- p = mtod(n, u_int8_t *) + noff;
- else
- p = NULL;
- }
- }
-
- in = &inbuf[0];
- out = &outbuf[0];
- n2l(in, tin0);
- n2l(in, tin1);
-
- tin0 ^= tout0; tin[0] = tin0;
- tin1 ^= tout1; tin[1] = tin1;
- BF_encrypt(tin, key, BF_ENCRYPT);
- tout0 = tin[0]; l2n(tout0, out);
- tout1 = tin[1]; l2n(tout1, out);
-
- /*
- * copy the output buffer into the result.
- * need to update off and m.
- */
- if (off + 8 < m->m_len) {
- bcopy(&outbuf[0], mtod(m, u_int8_t *) + off, 8);
- off += 8;
- } else if (off + 8 == m->m_len) {
- bcopy(&outbuf[0], mtod(m, u_int8_t *) + off, 8);
- do {
- m = m->m_next;
- } while (m && ! m->m_len);
- off = 0;
- } else {
- struct mbuf *n;
- size_t noff;
- u_int8_t *p;
- u_int8_t *out;
-
- n = m;
- noff = off;
- p = mtod(n, u_int8_t *) + noff;
-
- out = &outbuf[0];
- while (out - &outbuf[0] < 8) {
- if (!p)
- panic("mbuf chain?");
- *p++ = *out++;
- noff++;
- if (noff < n->m_len)
- continue;
- do {
- n = n->m_next;
- } while (n && ! n->m_len);
- noff = 0;
- if (n)
- p = mtod(n, u_int8_t *) + noff;
- else
- p = NULL;
- }
-
- m = n;
- off = noff;
- }
-
- length -= 8;
- }
- } else if (mode == BF_DECRYPT) {
- register BF_LONG xor0, xor1;
- u_int8_t *in, *out;
-
- xor0 = xor1 = 0;
- n2l(iv, xor0);
- n2l(iv, xor1);
-
- while (0 < length) {
- if (!m)
- panic("mbuf chain?\n");
-
- /*
- * copy the source into input buffer.
- * don't update off or m, since we need to use them * later.
- */
- if (off + 8 <= m->m_len)
- bcopy(mtod(m, u_int8_t *) + off, &inbuf[0], 8);
- else {
- struct mbuf *n;
- size_t noff;
- u_int8_t *p;
- u_int8_t *in;
-
- n = m;
- noff = off;
- p = mtod(n, u_int8_t *) + noff;
-
- in = &inbuf[0];
- while (in - &inbuf[0] < 8) {
- if (!p)
- panic("mbuf chain?\n");
- *in++ = *p++;
- noff++;
- if (noff < n->m_len)
- continue;
- do {
- n = n->m_next;
- } while (n && ! n->m_len);
- noff = 0;
- if (n)
- p = mtod(n, u_int8_t *) + noff;
- else
- p = NULL;
- }
- }
-
- in = &inbuf[0];
- out = &outbuf[0];
- n2l(in, tin0); tin[0] = tin0;
- n2l(in, tin1); tin[1] = tin1;
- BF_encrypt(tin, key, BF_DECRYPT);
- tout0 = tin[0] ^ xor0;
- tout1 = tin[1] ^ xor1;
- l2n(tout0, out);
- l2n(tout1, out);
- xor0 = tin0;
- xor1 = tin1;
-
-
- /*
- * copy the output buffer into the result.
- * need to update off and m.
- */
- if (off + 8 < m->m_len) {
- bcopy(&outbuf[0], mtod(m, u_int8_t *) + off, 8);
- off += 8;
- } else if (off + 8 == m->m_len) {
- bcopy(&outbuf[0], mtod(m, u_int8_t *) + off, 8);
- do {
- m = m->m_next;
- } while (m && ! m->m_len);
- off = 0;
- } else {
- struct mbuf *n;
- size_t noff;
- u_int8_t *p;
- u_int8_t *out;
-
- n = m;
- noff = off;
- p = mtod(n, u_int8_t *) + noff;
-
- out = &outbuf[0];
- while (out - &outbuf[0] < 8) {
- if (!p)
- panic("mbuf chain?\n");
- *p++ = *out++;
- noff++;
- if (noff < n->m_len)
- continue;
- do {
- n = n->m_next;
- } while (n && ! n->m_len);
- noff = 0;
- if (n)
- p = mtod(n, u_int8_t *) + noff;
- else
- p = NULL;
- }
-
- m = n;
- off = noff;
- }
-
- length -= 8;
- }
- }
-
- return 0;
-}
diff --git a/sys/crypto/blowfish/bf_enc.c b/sys/crypto/blowfish/bf_enc.c
index 6a3bef6..5edd6db 100644
--- a/sys/crypto/blowfish/bf_enc.c
+++ b/sys/crypto/blowfish/bf_enc.c
@@ -1,5 +1,5 @@
/* $FreeBSD$ */
-/* $KAME: bf_enc.c,v 1.3 2000/03/27 04:36:26 sumikawa Exp $ */
+/* $KAME: bf_enc.c,v 1.5 2000/09/18 21:21:19 itojun Exp $ */
/* crypto/bf/bf_enc.c */
/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au)
@@ -59,6 +59,7 @@
* [including the GNU Public Licence.]
*/
+#include <sys/types.h>
#include <crypto/blowfish/blowfish.h>
#include <crypto/blowfish/bf_locl.h>
@@ -72,72 +73,71 @@ If you set BF_ROUNDS to some value other than 16 or 20, you will have
to modify the code.
#endif
-void BF_encrypt(data,key,encrypt)
-BF_LONG *data;
-BF_KEY *key;
-int encrypt;
- {
- register BF_LONG l,r,*p,*s;
+/* XXX "data" is host endian */
+void
+BF_encrypt(data, key, encrypt)
+ BF_LONG *data;
+ BF_KEY *key;
+ int encrypt;
+{
+ register BF_LONG l, r, *p, *s;
- p=key->P;
- s= &(key->S[0]);
- l=data[0];
- r=data[1];
+ p = key->P;
+ s= &key->S[0];
+ l = data[0];
+ r = data[1];
- if (encrypt)
- {
+ if (encrypt) {
l^=p[0];
- BF_ENC(r,l,s,p[ 1]);
- BF_ENC(l,r,s,p[ 2]);
- BF_ENC(r,l,s,p[ 3]);
- BF_ENC(l,r,s,p[ 4]);
- BF_ENC(r,l,s,p[ 5]);
- BF_ENC(l,r,s,p[ 6]);
- BF_ENC(r,l,s,p[ 7]);
- BF_ENC(l,r,s,p[ 8]);
- BF_ENC(r,l,s,p[ 9]);
- BF_ENC(l,r,s,p[10]);
- BF_ENC(r,l,s,p[11]);
- BF_ENC(l,r,s,p[12]);
- BF_ENC(r,l,s,p[13]);
- BF_ENC(l,r,s,p[14]);
- BF_ENC(r,l,s,p[15]);
- BF_ENC(l,r,s,p[16]);
+ BF_ENC(r, l, s, p[ 1]);
+ BF_ENC(l, r, s, p[ 2]);
+ BF_ENC(r, l, s, p[ 3]);
+ BF_ENC(l, r, s, p[ 4]);
+ BF_ENC(r, l, s, p[ 5]);
+ BF_ENC(l, r, s, p[ 6]);
+ BF_ENC(r, l, s, p[ 7]);
+ BF_ENC(l, r, s, p[ 8]);
+ BF_ENC(r, l, s, p[ 9]);
+ BF_ENC(l, r, s, p[10]);
+ BF_ENC(r, l, s, p[11]);
+ BF_ENC(l, r, s, p[12]);
+ BF_ENC(r, l, s, p[13]);
+ BF_ENC(l, r, s, p[14]);
+ BF_ENC(r, l, s, p[15]);
+ BF_ENC(l, r, s, p[16]);
#if BF_ROUNDS == 20
- BF_ENC(r,l,s,p[17]);
- BF_ENC(l,r,s,p[18]);
- BF_ENC(r,l,s,p[19]);
- BF_ENC(l,r,s,p[20]);
+ BF_ENC(r, l, s, p[17]);
+ BF_ENC(l, r, s, p[18]);
+ BF_ENC(r, l, s, p[19]);
+ BF_ENC(l, r, s, p[20]);
#endif
- r^=p[BF_ROUNDS+1];
- }
- else
- {
- l^=p[BF_ROUNDS+1];
+ r ^= p[BF_ROUNDS + 1];
+ } else {
+ l ^= p[BF_ROUNDS + 1];
#if BF_ROUNDS == 20
- BF_ENC(r,l,s,p[20]);
- BF_ENC(l,r,s,p[19]);
- BF_ENC(r,l,s,p[18]);
- BF_ENC(l,r,s,p[17]);
+ BF_ENC(r, l, s, p[20]);
+ BF_ENC(l, r, s, p[19]);
+ BF_ENC(r, l, s, p[18]);
+ BF_ENC(l, r, s, p[17]);
#endif
- BF_ENC(r,l,s,p[16]);
- BF_ENC(l,r,s,p[15]);
- BF_ENC(r,l,s,p[14]);
- BF_ENC(l,r,s,p[13]);
- BF_ENC(r,l,s,p[12]);
- BF_ENC(l,r,s,p[11]);
- BF_ENC(r,l,s,p[10]);
- BF_ENC(l,r,s,p[ 9]);
- BF_ENC(r,l,s,p[ 8]);
- BF_ENC(l,r,s,p[ 7]);
- BF_ENC(r,l,s,p[ 6]);
- BF_ENC(l,r,s,p[ 5]);
- BF_ENC(r,l,s,p[ 4]);
- BF_ENC(l,r,s,p[ 3]);
- BF_ENC(r,l,s,p[ 2]);
- BF_ENC(l,r,s,p[ 1]);
- r^=p[0];
- }
- data[1]=l&0xffffffff;
- data[0]=r&0xffffffff;
+ BF_ENC(r, l, s, p[16]);
+ BF_ENC(l, r, s, p[15]);
+ BF_ENC(r, l, s, p[14]);
+ BF_ENC(l, r, s, p[13]);
+ BF_ENC(r, l, s, p[12]);
+ BF_ENC(l, r, s, p[11]);
+ BF_ENC(r, l, s, p[10]);
+ BF_ENC(l, r, s, p[ 9]);
+ BF_ENC(r, l, s, p[ 8]);
+ BF_ENC(l, r, s, p[ 7]);
+ BF_ENC(r, l, s, p[ 6]);
+ BF_ENC(l, r, s, p[ 5]);
+ BF_ENC(r, l, s, p[ 4]);
+ BF_ENC(l, r, s, p[ 3]);
+ BF_ENC(r, l, s, p[ 2]);
+ BF_ENC(l, r, s, p[ 1]);
+ r ^= p[0];
}
+ data[1] = l & 0xffffffff;
+ data[0] = r & 0xffffffff;
+}
diff --git a/sys/crypto/blowfish/bf_locl.h b/sys/crypto/blowfish/bf_locl.h
index 07598d2..52585bb 100644
--- a/sys/crypto/blowfish/bf_locl.h
+++ b/sys/crypto/blowfish/bf_locl.h
@@ -1,5 +1,5 @@
/* $FreeBSD$ */
-/* $KAME: bf_locl.h,v 1.3 2000/03/27 04:36:26 sumikawa Exp $ */
+/* $KAME: bf_locl.h,v 1.5 2000/08/31 06:03:48 itojun Exp $ */
/* crypto/bf/bf_local.h */
/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au)
@@ -67,10 +67,10 @@
*/
#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)
+#define c2l(c,l) (l =((BF_LONG)(*((c)++))) , \
+ l|=((BF_LONG)(*((c)++)))<< 8L, \
+ l|=((BF_LONG)(*((c)++)))<<16L, \
+ l|=((BF_LONG)(*((c)++)))<<24L)
/* NOTE - c is not incremented as per c2l */
#undef c2ln
@@ -78,14 +78,14 @@
c+=n; \
l1=l2=0; \
switch (n) { \
- case 8: l2 =((unsigned long)(*(--(c))))<<24L; \
- case 7: l2|=((unsigned long)(*(--(c))))<<16L; \
- case 6: l2|=((unsigned long)(*(--(c))))<< 8L; \
- case 5: l2|=((unsigned long)(*(--(c)))); \
- case 4: l1 =((unsigned long)(*(--(c))))<<24L; \
- case 3: l1|=((unsigned long)(*(--(c))))<<16L; \
- case 2: l1|=((unsigned long)(*(--(c))))<< 8L; \
- case 1: l1|=((unsigned long)(*(--(c)))); \
+ case 8: l2 =((BF_LONG)(*(--(c))))<<24L; \
+ case 7: l2|=((BF_LONG)(*(--(c))))<<16L; \
+ case 6: l2|=((BF_LONG)(*(--(c))))<< 8L; \
+ case 5: l2|=((BF_LONG)(*(--(c)))); \
+ case 4: l1 =((BF_LONG)(*(--(c))))<<24L; \
+ case 3: l1|=((BF_LONG)(*(--(c))))<<16L; \
+ case 2: l1|=((BF_LONG)(*(--(c))))<< 8L; \
+ case 1: l1|=((BF_LONG)(*(--(c)))); \
} \
}
@@ -116,14 +116,14 @@
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; \
+ case 8: l2 =((BF_LONG)(*(--(c)))) ; \
+ case 7: l2|=((BF_LONG)(*(--(c))))<< 8; \
+ case 6: l2|=((BF_LONG)(*(--(c))))<<16; \
+ case 5: l2|=((BF_LONG)(*(--(c))))<<24; \
+ case 4: l1 =((BF_LONG)(*(--(c)))) ; \
+ case 3: l1|=((BF_LONG)(*(--(c))))<< 8; \
+ case 2: l1|=((BF_LONG)(*(--(c))))<<16; \
+ case 1: l1|=((BF_LONG)(*(--(c))))<<24; \
} \
}
@@ -143,10 +143,10 @@
}
#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)++))))
+#define n2l(c,l) (l =((BF_LONG)(*((c)++)))<<24L, \
+ l|=((BF_LONG)(*((c)++)))<<16L, \
+ l|=((BF_LONG)(*((c)++)))<< 8L, \
+ l|=((BF_LONG)(*((c)++))))
#undef l2n
#define l2n(l,c) (*((c)++)=(unsigned char)(((l)>>24L)&0xff), \
@@ -161,9 +161,17 @@
* BF_PTR for sparc and MIPS/SGI
* use nothing for Alpha and HP.
*/
-#if !defined(BF_PTR) && !defined(BF_PTR2)
-#undef BF_PTR
+#undef BF_PTR
+#undef BF_PTR2
+#ifdef __NetBSD__
+#ifdef __i386__
+#define BF_PTR2
+#else
+#ifdef __mips__
+#define BF_PTR
+#endif
#endif
+#endif /*NetBSD*/
#define BF_M 0x3fc
#define BF_0 22L
diff --git a/sys/crypto/blowfish/bf_skey.c b/sys/crypto/blowfish/bf_skey.c
index 5717c3f..4bbe036 100644
--- a/sys/crypto/blowfish/bf_skey.c
+++ b/sys/crypto/blowfish/bf_skey.c
@@ -1,5 +1,5 @@
/* $FreeBSD$ */
-/* $KAME: bf_skey.c,v 1.3 2000/03/27 04:36:27 sumikawa Exp $ */
+/* $KAME: bf_skey.c,v 1.5 2000/11/06 13:58:08 itojun Exp $ */
/* crypto/bf/bf_skey.c */
/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au)
@@ -66,58 +66,55 @@
#include <crypto/blowfish/bf_locl.h>
#include <crypto/blowfish/bf_pi.h>
-void BF_set_key(key,len,data)
-BF_KEY *key;
-int len;
-unsigned char *data;
- {
+void
+BF_set_key(key, len, data)
+ BF_KEY *key;
+ int len;
+ unsigned char *data;
+{
int i;
- BF_LONG *p,ri,in[2];
- unsigned char *d,*end;
+ BF_LONG *p, ri, in[2];
+ unsigned char *d, *end;
+ memcpy((char *)key, (char *)&bf_init, sizeof(BF_KEY));
+ p = key->P;
- memcpy((char *)key,(char *)&bf_init,sizeof(BF_KEY));
- p=key->P;
+ if (len > ((BF_ROUNDS + 2) * 4))
+ len = (BF_ROUNDS + 2) * 4;
- if (len > ((BF_ROUNDS+2)*4)) len=(BF_ROUNDS+2)*4;
-
- d=data;
+ d = data;
end= &(data[len]);
- for (i=0; i<(BF_ROUNDS+2); i++)
- {
- ri= *(d++);
- if (d >= end) d=data;
-
- ri<<=8;
- ri|= *(d++);
- if (d >= end) d=data;
+ for (i = 0; i < BF_ROUNDS + 2; i++) {
+ ri = *(d++);
+ if (d >= end) d = data;
- ri<<=8;
- ri|= *(d++);
- if (d >= end) d=data;
+ ri <<= 8;
+ ri |= *(d++);
+ if (d >= end) d = data;
- ri<<=8;
- ri|= *(d++);
- if (d >= end) d=data;
+ ri <<= 8;
+ ri |= *(d++);
+ if (d >= end) d = data;
- p[i]^=ri;
- }
+ ri <<= 8;
+ ri |= *(d++);
+ if (d >= end) d = data;
- in[0]=0L;
- in[1]=0L;
- for (i=0; i<(BF_ROUNDS+2); i+=2)
- {
- BF_encrypt(in,key,BF_ENCRYPT);
- p[i ]=in[0];
- p[i+1]=in[1];
- }
+ p[i] ^= ri;
+ }
- p=key->S;
- for (i=0; i<4*256; i+=2)
- {
- BF_encrypt(in,key,BF_ENCRYPT);
- p[i ]=in[0];
- p[i+1]=in[1];
- }
+ in[0] = 0L;
+ in[1] = 0L;
+ for (i = 0; i < BF_ROUNDS + 2; i += 2) {
+ BF_encrypt(in, key, BF_ENCRYPT);
+ p[i ] = in[0];
+ p[i+1] = in[1];
}
+ p = key->S;
+ for (i = 0; i < 4 * 256; i += 2) {
+ BF_encrypt(in, key, BF_ENCRYPT);
+ p[i ] = in[0];
+ p[i+1] = in[1];
+ }
+}
diff --git a/sys/crypto/blowfish/blowfish.h b/sys/crypto/blowfish/blowfish.h
index c96b4ec..76605f8 100644
--- a/sys/crypto/blowfish/blowfish.h
+++ b/sys/crypto/blowfish/blowfish.h
@@ -1,5 +1,5 @@
/* $FreeBSD$ */
-/* $KAME: blowfish.h,v 1.4 2000/06/14 10:41:16 itojun Exp $ */
+/* $KAME: blowfish.h,v 1.10 2000/09/18 21:21:20 itojun Exp $ */
/* crypto/bf/blowfish.h */
/* Copyright (C) 1995-1997 Eric Young (eay@mincom.oz.au)
@@ -69,54 +69,19 @@ extern "C" {
#define BF_ENCRYPT 1
#define BF_DECRYPT 0
-/* If you make this 'unsigned int' the pointer variants will work on
- * the Alpha, otherwise they will not. Strangly using the '8 byte'
- * BF_LONG and the default 'non-pointer' inner loop is the best configuration
- * for the Alpha */
-#define BF_LONG unsigned long
+/* must be 32bit quantity */
+#define BF_LONG u_int32_t
#define BF_ROUNDS 16
#define BF_BLOCK 8
-typedef struct bf_key_st
- {
+typedef struct bf_key_st {
BF_LONG P[BF_ROUNDS+2];
BF_LONG S[4*256];
- } BF_KEY;
-
-#ifndef NOPROTO
-
-void BF_set_key(BF_KEY *key, int len, unsigned char *data);
-void BF_ecb_encrypt(unsigned char *in,unsigned char *out,BF_KEY *key,
- int encrypt);
-void BF_encrypt(BF_LONG *data,BF_KEY *key,int encrypt);
-void BF_cbc_encrypt(unsigned char *in, unsigned char *out, long length,
- BF_KEY *ks, unsigned char *iv, int encrypt);
-void BF_cfb64_encrypt(unsigned char *in, unsigned char *out, long length,
- BF_KEY *schedule, unsigned char *ivec, int *num, int encrypt);
-void BF_ofb64_encrypt(unsigned char *in, unsigned char *out, long length,
- BF_KEY *schedule, unsigned char *ivec, int *num);
-char *BF_options(void);
-
-/* added by itojun */
-struct mbuf;
-int BF_cbc_encrypt_m(struct mbuf *, int, int, BF_KEY *, unsigned char *, int);
-
-#else
-
-void BF_set_key();
-void BF_ecb_encrypt();
-void BF_encrypt();
-void BF_cbc_encrypt();
-void BF_cfb64_encrypt();
-void BF_ofb64_encrypt();
-char *BF_options();
-
-/* added by itojun */
-void BF_cbc_encrypt_m();
-
-#endif
+} BF_KEY;
+void BF_set_key __P((BF_KEY *, int, unsigned char *));
+void BF_encrypt __P((BF_LONG *, BF_KEY *, int));
#ifdef __cplusplus
}
#endif
diff --git a/sys/crypto/cast128/cast128.c b/sys/crypto/cast128/cast128.c
index 4df1be9..88873f2 100644
--- a/sys/crypto/cast128/cast128.c
+++ b/sys/crypto/cast128/cast128.c
@@ -1,5 +1,5 @@
/* $FreeBSD$ */
-/* $KAME: cast128.c,v 1.3 2000/03/27 04:36:29 sumikawa Exp $ */
+/* $KAME: cast128.c,v 1.4 2000/11/06 13:58:08 itojun Exp $ */
/*
* heavily modified by Tomomi Suzuki <suzuki@grelot.elec.ryukoku.ac.jp>
diff --git a/sys/crypto/cast128/cast128.h b/sys/crypto/cast128/cast128.h
index 019c2de..4057a1f 100644
--- a/sys/crypto/cast128/cast128.h
+++ b/sys/crypto/cast128/cast128.h
@@ -1,5 +1,5 @@
/* $FreeBSD$ */
-/* $KAME: cast128.h,v 1.4 2000/06/14 10:41:16 itojun Exp $ */
+/* $KAME: cast128.h,v 1.6 2000/09/18 20:59:20 itojun Exp $ */
/*
* heavily modified by Tomomi Suzuki <suzuki@grelot.elec.ryukoku.ac.jp>
@@ -40,7 +40,6 @@
#define RFC2144_CAST_128_H
#include <sys/param.h>
-#include <sys/mbuf.h>
#define CAST128_ENCRYPT 1
@@ -56,8 +55,5 @@ extern void cast128_encrypt_round12 __P((u_int8_t *, const u_int8_t *,
u_int32_t *));
extern void cast128_decrypt_round12 __P((u_int8_t *, const u_int8_t *,
u_int32_t *));
-extern int cast128_cbc_process __P((struct mbuf *, size_t, size_t,
- u_int32_t *, u_int8_t *, size_t, int));
-
#endif
diff --git a/sys/crypto/cast128/cast128_cbc.c b/sys/crypto/cast128/cast128_cbc.c
deleted file mode 100644
index e4725a9..0000000
--- a/sys/crypto/cast128/cast128_cbc.c
+++ /dev/null
@@ -1,222 +0,0 @@
-/* $FreeBSD$ */
-/* $KAME: cast128_cbc.c,v 1.4 2000/06/14 10:41:17 itojun Exp $ */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * 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.
- * 3. Neither the name of the project nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT 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 PROJECT 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.
- */
-/*
- * based on sys/crypto/des/des_cbc.c, rewrote by Tomomi Suzuki
- */
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/mbuf.h>
-#include <crypto/cast128/cast128.h>
-
-#define panic(x) do { printf(x); return EINVAL; } while (0)
-
-int
-cast128_cbc_process(m0, skip, length, subkey, iv, keylen, mode)
- struct mbuf *m0;
- size_t skip;
- size_t length;
- u_int32_t *subkey;
- u_int8_t *iv;
- size_t keylen;
- int mode;
-{
- struct mbuf *m;
- u_int8_t inbuf[8], outbuf[8];
- size_t off;
-
- /* sanity check */
- if (m0->m_pkthdr.len < skip) {
- printf("cast128_cbc_process: mbuf length < skip\n");
- return EINVAL;
- }
- if (m0->m_pkthdr.len < length) {
- printf("cast128_cbc_process: mbuf length < encrypt length\n");
- return EINVAL;
- }
- if (m0->m_pkthdr.len < skip + length) {
- printf("cast128_cbc_process: "
- "mbuf length < skip + encrypt length\n");
- return EINVAL;
- }
- if (length % 8) {
- printf("cast128_cbc_process: length is not multiple of 8\n");
- return EINVAL;
- }
-
- m = m0;
- off = 0;
-
- /* skip over the header */
- while (skip) {
- if (!m)
- panic("cast128_cbc_process: mbuf chain?\n");
- if (m->m_len <= skip) {
- skip -= m->m_len;
- m = m->m_next;
- off = 0;
- } else {
- off = skip;
- skip = 0;
- }
- }
-
- /* copy iv into outbuf for XOR (encrypt) */
- bcopy(iv, outbuf, 8);
-
- /*
- * encrypt/decrypt packet
- */
- while (length > 0) {
- int i;
-
- if (!m)
- panic("cast128_cbc_process: mbuf chain?\n");
-
- /*
- * copy the source into input buffer.
- * don't update off or m, since we need to use them
- * later.
- */
- if (off + 8 <= m->m_len)
- bcopy(mtod(m, u_int8_t *)+off, inbuf, 8);
- else {
- struct mbuf *n;
- size_t noff;
- u_int8_t *p, *in;
-
- n = m;
- noff = off;
- p = mtod(n, u_int8_t *) + noff;
-
- in = inbuf;
- while (in - inbuf < 8) {
- if (!p) {
- panic("cast128_cbc_process: "
- "mbuf chain?\n");
- }
- *in++ = *p++;
- noff++;
- if (noff < n->m_len)
- continue;
- do {
- n = n->m_next;
- } while (n && !n->m_len);
- noff = 0;
- if (n)
- p = mtod(n, u_int8_t *);
- else
- p = NULL;
- }
- }
-
- /* encrypt/decrypt */
- switch (mode) {
- case CAST128_ENCRYPT:
- /* XOR */
- for (i = 0; i < 8; i++)
- inbuf[i] ^= outbuf[i];
-
- /* encrypt */
- if (keylen <= 80/8)
- cast128_encrypt_round12(outbuf, inbuf, subkey);
- else
- cast128_encrypt_round16(outbuf, inbuf, subkey);
- break;
-
- case CAST128_DECRYPT:
- /* decrypt */
- if (keylen <= 80/8)
- cast128_decrypt_round12(outbuf, inbuf, subkey);
- else
- cast128_decrypt_round16(outbuf, inbuf, subkey);
-
- /* XOR */
- for (i = 0; i < 8; i++)
- outbuf[i] ^= iv[i];
-
- /* copy inbuf into iv for next XOR */
- bcopy(inbuf, iv, 8);
- break;
- }
-
- /*
- * copy the output buffer into the result.
- * need to update off and m.
- */
- if (off + 8 < m->m_len) {
- bcopy(outbuf, mtod(m, u_int8_t *) + off, 8);
- off += 8;
- } else if (off + 8 == m->m_len) {
- bcopy(outbuf, mtod(m, u_int8_t *) + off, 8);
- do {
- m = m->m_next;
- } while (m && !m->m_len);
- off = 0;
- } else {
- struct mbuf *n;
- size_t noff;
- u_int8_t *p, *out;
-
- n = m;
- noff = off;
- p = mtod(n, u_int8_t *) + noff;
-
- out = outbuf;
- while (out - outbuf < 8) {
- if (!p) {
- panic("cast128_cbc_process: "
- "mbuf chain?\n");
- }
- *p++ = *out++;
- noff++;
- if (noff < n->m_len)
- continue;
- do {
- n = n->m_next;
- } while (n && !n->m_len);
- noff = 0;
- if (n)
- p = mtod(n, u_int8_t *);
- else
- p = NULL;
- }
-
- m = n;
- off = noff;
- }
-
- length -= 8;
- }
-
- return 0;
-}
diff --git a/sys/crypto/des/des.h b/sys/crypto/des/des.h
index 536f0c9..c21f972 100644
--- a/sys/crypto/des/des.h
+++ b/sys/crypto/des/des.h
@@ -1,5 +1,5 @@
/* $FreeBSD$ */
-/* $KAME: des.h,v 1.4 2000/06/14 10:41:17 itojun Exp $ */
+/* $KAME: des.h,v 1.7 2000/09/18 20:59:21 itojun Exp $ */
/* lib/des/des.h */
/* Copyright (C) 1995-1996 Eric Young (eay@mincom.oz.au)
@@ -55,11 +55,8 @@
extern "C" {
#endif
-/* If this is set to 'unsigned int' on a DEC Alpha, this gives about a
- * %20 speed up (longs are 8 bytes, int's are 4). */
-#ifndef DES_LONG
-#define DES_LONG unsigned long
-#endif
+/* must be 32bit quantity */
+#define DES_LONG u_int32_t
typedef unsigned char des_cblock[8];
typedef struct des_ks_struct
@@ -83,196 +80,18 @@ typedef struct des_ks_struct
#define DES_CBC_MODE 0
#define DES_PCBC_MODE 1
-#define des_ecb2_encrypt(i,o,k1,k2,e) \
- des_ecb3_encrypt((i),(o),(k1),(k2),(k1),(e))
-
-#define des_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \
- des_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e))
-
-#define des_ede2_cfb64_encrypt(i,o,l,k1,k2,iv,n,e) \
- des_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n),(e))
-
-#define des_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \
- des_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n))
-
-#define C_Block des_cblock
-#define Key_schedule des_key_schedule
-#ifdef KERBEROS
-#define ENCRYPT DES_ENCRYPT
-#define DECRYPT DES_DECRYPT
-#endif
-#define KEY_SZ DES_KEY_SZ
-#define string_to_key des_string_to_key
-#define read_pw_string des_read_pw_string
-#define random_key des_random_key
-#define pcbc_encrypt des_pcbc_encrypt
-#define set_key des_set_key
-#define key_sched des_key_sched
-#define ecb_encrypt des_ecb_encrypt
-#define cbc_encrypt des_cbc_encrypt
-#define ncbc_encrypt des_ncbc_encrypt
-#define xcbc_encrypt des_xcbc_encrypt
-#define cbc_cksum des_cbc_cksum
-#define quad_cksum des_quad_cksum
-
-/* For compatibility with the MIT lib - eay 20/05/92 */
-typedef des_key_schedule bit_64;
-#define des_fixup_key_parity des_set_odd_parity
-#define des_check_key_parity check_parity
-
extern int des_check_key; /* defaults to false */
-extern int des_rw_mode; /* defaults to DES_PCBC_MODE */
-/* The next line is used to disable full ANSI prototypes, if your
- * compiler has problems with the prototypes, make sure this line always
- * evaluates to true :-) */
-#if defined(MSDOS) || defined(__STDC__)
-#undef NOPROTO
-#endif
-#ifndef NOPROTO
-char *des_options(void);
-void des_ecb3_encrypt(des_cblock *input,des_cblock *output,
- des_key_schedule ks1,des_key_schedule ks2,
- des_key_schedule ks3, int enc);
-DES_LONG des_cbc_cksum(des_cblock *input,des_cblock *output,
- long length,des_key_schedule schedule,des_cblock *ivec);
-/*
-void des_cbc_encrypt(des_cblock *input,des_cblock *output,long length,
- des_key_schedule schedule,des_cblock *ivec,int enc);
-*/
-int des_cbc_encrypt(struct mbuf *, size_t, size_t,
- des_key_schedule schedule,des_cblock *ivec, int enc);
-void des_ncbc_encrypt(des_cblock *input,des_cblock *output,long length,
- des_key_schedule schedule,des_cblock *ivec,int enc);
-void des_xcbc_encrypt(des_cblock *input,des_cblock *output,long length,
- des_key_schedule schedule,des_cblock *ivec,
- des_cblock *inw,des_cblock *outw,int enc);
-void des_3cbc_encrypt(des_cblock *input,des_cblock *output,long length,
- des_key_schedule sk1,des_key_schedule sk2,
- des_cblock *ivec1,des_cblock *ivec2,int enc);
-extern int des_3cbc_process(struct mbuf *, size_t, size_t,
- des_key_schedule *schedule, des_cblock *ivec, int mode);
-void des_cfb_encrypt(unsigned char *in,unsigned char *out,int numbits,
- long length,des_key_schedule schedule,des_cblock *ivec,int enc);
-void des_ecb_encrypt(des_cblock *input,des_cblock *output,
- des_key_schedule ks,int enc);
-void des_encrypt(DES_LONG *data,des_key_schedule ks, int enc);
-void des_encrypt2(DES_LONG *data,des_key_schedule ks, int enc);
-void des_ede3_cbc_encrypt(des_cblock *input, des_cblock *output,
- long length, des_key_schedule ks1, des_key_schedule ks2,
- des_key_schedule ks3, des_cblock *ivec, int enc);
-void des_ede3_cfb64_encrypt(unsigned char *in, unsigned char *out,
- long length, des_key_schedule ks1, des_key_schedule ks2,
- des_key_schedule ks3, des_cblock *ivec, int *num, int encrypt);
-void des_ede3_ofb64_encrypt(unsigned char *in, unsigned char *out,
- long length, des_key_schedule ks1, des_key_schedule ks2,
- des_key_schedule ks3, des_cblock *ivec, int *num);
+char *des_options __P((void));
+void des_ecb_encrypt __P((des_cblock *, des_cblock *,
+ des_key_schedule, int));
+void des_encrypt __P((DES_LONG *, des_key_schedule, int));
+void des_encrypt2 __P((DES_LONG *, des_key_schedule, int));
-int des_enc_read(int fd,char *buf,int len,des_key_schedule sched,
- des_cblock *iv);
-int des_enc_write(int fd,char *buf,int len,des_key_schedule sched,
- des_cblock *iv);
-#ifdef PERL5
-char *des_crypt(const char *buf,const char *salt);
-#else
-/* some stupid compilers complain because I have declared char instead
- * of const char */
-#if 1
-char *crypt(const char *buf,const char *salt);
-#else
-char *crypt();
-#endif
-#endif
-void des_ofb_encrypt(unsigned char *in,unsigned char *out,
- int numbits,long length,des_key_schedule schedule,des_cblock *ivec);
-void des_pcbc_encrypt(des_cblock *input,des_cblock *output,long length,
- des_key_schedule schedule,des_cblock *ivec,int enc);
-DES_LONG des_quad_cksum(des_cblock *input,des_cblock *output,
- long length,int out_count,des_cblock *seed);
-void des_random_seed(des_cblock key);
-void des_random_key(des_cblock ret);
-int des_read_password(des_cblock *key,char *prompt,int verify);
-int des_read_2passwords(des_cblock *key1,des_cblock *key2,
- char *prompt,int verify);
-int des_read_pw_string(char *buf,int length,char *prompt,int verify);
-void des_set_odd_parity(des_cblock *key);
-int des_is_weak_key(des_cblock *key);
-int des_set_key(des_cblock *key,des_key_schedule schedule);
-int des_key_sched(des_cblock *key,des_key_schedule schedule);
-void des_string_to_key(char *str,des_cblock *key);
-void des_string_to_2keys(char *str,des_cblock *key1,des_cblock *key2);
-void des_cfb64_encrypt(unsigned char *in, unsigned char *out, long length,
- des_key_schedule schedule, des_cblock *ivec, int *num, int enc);
-void des_ofb64_encrypt(unsigned char *in, unsigned char *out, long length,
- des_key_schedule schedule, des_cblock *ivec, int *num);
-
-/* Extra functions from Mark Murray <mark@grondar.za> */
-/*
-void des_cblock_print_file(des_cblock *cb, FILE *fp);
-*/
-/* The following functions are not in the normal unix build or the
- * SSLeay build. When using the SSLeay build, use RAND_seed()
- * and RAND_bytes() instead. */
-int des_new_random_key(des_cblock *key);
-void des_init_random_number_generator(des_cblock *key);
-void des_set_random_generator_seed(des_cblock *key);
-void des_set_sequence_number(des_cblock new_sequence_number);
-void des_generate_random_block(des_cblock *block);
-
-#else
-
-char *des_options();
-void des_ecb3_encrypt();
-DES_LONG des_cbc_cksum();
-void des_cbc_encrypt();
-void des_ncbc_encrypt();
-void des_xcbc_encrypt();
-void des_3cbc_encrypt();
-void des_cfb_encrypt();
-void des_ede3_cfb64_encrypt();
-void des_ede3_ofb64_encrypt();
-void des_ecb_encrypt();
-void des_encrypt();
-void des_encrypt2();
-void des_ede3_cbc_encrypt();
-int des_enc_read();
-int des_enc_write();
-#ifdef PERL5
-char *des_crypt();
-#else
-char *crypt();
-#endif
-void des_ofb_encrypt();
-void des_pcbc_encrypt();
-DES_LONG des_quad_cksum();
-void des_random_seed();
-void des_random_key();
-int des_read_password();
-int des_read_2passwords();
-int des_read_pw_string();
-void des_set_odd_parity();
-int des_is_weak_key();
-int des_set_key();
-int des_key_sched();
-void des_string_to_key();
-void des_string_to_2keys();
-void des_cfb64_encrypt();
-void des_ofb64_encrypt();
-
-/* Extra functions from Mark Murray <mark@grondar.za> */
-void des_cblock_print_file();
-/* The following functions are not in the normal unix build or the
- * SSLeay build. When using the SSLeay build, use RAND_seed()
- * and RAND_bytes() instead. */
-#ifdef FreeBSD
-int des_new_random_key();
-void des_init_random_number_generator();
-void des_set_random_generator_seed();
-void des_set_sequence_number();
-void des_generate_random_block();
-#endif
-
-#endif
+void des_set_odd_parity __P((des_cblock *));
+int des_is_weak_key __P((des_cblock *));
+int des_set_key __P((des_cblock *, des_key_schedule));
+int des_key_sched __P((des_cblock *, des_key_schedule));
#ifdef __cplusplus
}
diff --git a/sys/crypto/des/des_3cbc.c b/sys/crypto/des/des_3cbc.c
deleted file mode 100644
index e675871..0000000
--- a/sys/crypto/des/des_3cbc.c
+++ /dev/null
@@ -1,250 +0,0 @@
-/* $FreeBSD$ */
-/* $KAME: des_3cbc.c,v 1.4 2000/06/14 10:41:17 itojun Exp $ */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * 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.
- * 3. Neither the name of the project nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT 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 PROJECT 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.
- */
-/*
- * based on sys/crypto/des/des_cbc.c, rewrote by Tomomi Suzuki
- */
-#include <crypto/des/des_locl.h>
-
-#define panic(x) do { printf(x); return EINVAL; } while (0)
-
-int des_3cbc_process(m0, skip, length, schedule, ivec, mode)
- struct mbuf *m0;
- size_t skip;
- size_t length;
- des_key_schedule *schedule;
- des_cblock (*ivec);
- int mode;
-{
- u_int8_t inbuf[8], outbuf[8];
- struct mbuf *m;
- size_t off;
- DES_LONG tin0, tin1;
- DES_LONG tout0, tout1;
- DES_LONG tin[2];
- DES_LONG xor0 = 0, xor1 = 0;
- u_int8_t *iv;
- u_int8_t *in, *out;
-
- /* sanity check */
- if (m0->m_pkthdr.len < skip) {
- printf("des_3cbc_process: mbuf length < skip\n");
- return EINVAL;
- }
- if (m0->m_pkthdr.len < length) {
- printf("des_3cbc_process: mbuf length < encrypt length\n");
- return EINVAL;
- }
- if (m0->m_pkthdr.len < skip + length) {
- printf("des_3cbc_process: mbuf length < "
- "skip + encrypt length\n");
- return EINVAL;
- }
- if (length % 8) {
- printf("des_3cbc_process: length(%lu) is not multiple of 8\n",
- (u_long)length);
- return EINVAL;
- }
-
- m = m0;
- off = 0;
-
- /* skip over the header */
- while (skip) {
- if (!m)
- panic("des_3cbc_process: mbuf chain?\n");
- if (m->m_len <= skip) {
- skip -= m->m_len;
- m = m->m_next;
- off = 0;
- } else {
- off = skip;
- skip = 0;
- }
- }
-
- /* initialize */
- tin0 = tin1 = tout0 = tout1 = 0;
- tin[0] = tin[1] = 0;
-
- switch (mode) {
- case DES_ENCRYPT:
- iv = (u_int8_t *)ivec;
- c2l(iv, tout0);
- c2l(iv, tout1);
- break;
- case DES_DECRYPT:
- xor0 = xor1 = 0;
- iv = (u_int8_t *)ivec;
- c2l(iv, xor0);
- c2l(iv, xor1);
- break;
- }
-
- /*
- * encrypt/decrypt packet
- */
- while (length > 0) {
- if (!m)
- panic("des_3cbc_process: mbuf chain?\n");
-
- /*
- * copy the source into input buffer.
- * don't update off or m, since we need to use them
- * later.
- */
- if (off + 8 <= m->m_len)
- bcopy(mtod(m, u_int8_t *) + off, &inbuf[0], 8);
- else {
- struct mbuf *n;
- size_t noff;
- u_int8_t *p;
- u_int8_t *in;
-
- n = m;
- noff = off;
- p = mtod(n, u_int8_t *) + noff;
-
- in = &inbuf[0];
- while (in - &inbuf[0] < 8) {
- if (!p) {
- panic("des_3cbc_process: "
- "mbuf chain?\n");
- }
- *in++ = *p++;
- noff++;
- if (noff < n->m_len)
- continue;
- do {
- n = n->m_next;
- } while (n && !n->m_len);
- noff = 0;
- if (n)
- p = mtod(n, u_int8_t *) + noff;
- else
- p = NULL;
- }
- }
-
- /* encrypt/decrypt */
- switch (mode) {
- case DES_ENCRYPT:
- in = &inbuf[0];
- out = &outbuf[0];
- c2l(in, tin0);
- c2l(in, tin1);
-
- /* XOR */
- tin0 ^= tout0; tin[0] = tin0;
- tin1 ^= tout1; tin[1] = tin1;
-
- des_encrypt((DES_LONG *)tin, schedule[0], DES_ENCRYPT);
- des_encrypt((DES_LONG *)tin, schedule[1], DES_DECRYPT);
- des_encrypt((DES_LONG *)tin, schedule[2], DES_ENCRYPT);
-
- tout0 = tin[0]; l2c(tout0, out);
- tout1 = tin[1]; l2c(tout1, out);
- break;
- case DES_DECRYPT:
- in = &inbuf[0];
- out = &outbuf[0];
- c2l(in, tin0); tin[0] = tin0;
- c2l(in, tin1); tin[1] = tin1;
-
- des_encrypt((DES_LONG *)tin, schedule[2], DES_DECRYPT);
- des_encrypt((DES_LONG *)tin, schedule[1], DES_ENCRYPT);
- des_encrypt((DES_LONG *)tin, schedule[0], DES_DECRYPT);
-
- /* XOR */
- tout0 = tin[0] ^ xor0;
- tout1 = tin[1] ^ xor1;
- l2c(tout0, out);
- l2c(tout1, out);
-
- /* for next iv */
- xor0 = tin0;
- xor1 = tin1;
- break;
- }
-
- /*
- * copy the output buffer int the result.
- * need to update off and m.
- */
- if (off + 8 < m->m_len) {
- bcopy(&outbuf[0], mtod(m, u_int8_t *) + off, 8);
- off += 8;
- } else if (off + 8 == m->m_len) {
- bcopy(&outbuf[0], mtod(m, u_int8_t *) + off, 8);
- do {
- m = m->m_next;
- } while (m && !m->m_len);
- off = 0;
- } else {
- struct mbuf *n;
- size_t noff;
- u_int8_t *p;
- u_int8_t *out;
-
- n = m;
- noff = off;
- p = mtod(n, u_int8_t *) + noff;
-
- out = &outbuf[0];
- while (out - &outbuf[0] < 8) {
- if (!p) {
- panic("des_3cbc_process: "
- "mbuf chain?\n");
- }
- *p++ = *out++;
- noff++;
- if (noff < n->m_len)
- continue;
- do {
- n = n->m_next;
- } while (n && !n->m_len);
- noff = 0;
- if (n)
- p = mtod(n, u_int8_t *) + noff;
- else
- p = NULL;
- }
-
- m = n;
- off = noff;
- }
-
- length -= 8;
- }
-
- return 0;
-}
-
diff --git a/sys/crypto/des/des_cbc.c b/sys/crypto/des/des_cbc.c
deleted file mode 100644
index 92de8f8..0000000
--- a/sys/crypto/des/des_cbc.c
+++ /dev/null
@@ -1,331 +0,0 @@
-/* $FreeBSD$ */
-/* $KAME: des_cbc.c,v 1.4 2000/06/14 10:41:17 itojun Exp $ */
-
-/*
- * heavily modified by Yoshifumi Nishida <nishida@sfc.wide.ad.jp>.
- * then, completely rewrote by Jun-ichiro itojun Itoh <itojun@itojun.org>,
- * 1997.
- */
-/* crypto/des/cbc_enc.c */
-/* Copyright (C) 1995-1996 Eric Young (eay@mincom.oz.au)
- * All rights reserved.
- *
- * This file is part of an SSL implementation written
- * by Eric Young (eay@mincom.oz.au).
- * The implementation was written so as to conform with Netscapes SSL
- * specification. This library and applications are
- * FREE FOR COMMERCIAL AND NON-COMMERCIAL USE
- * as long as the following conditions are aheared to.
- *
- * Copyright remains Eric Young's, and as such any Copyright notices in
- * the code are not to be removed. If this code is used in a product,
- * Eric Young should be given attribution as the author of the parts 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 software developed by Eric Young (eay@mincom.oz.au)
- *
- * 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.]
- */
-
-#include <crypto/des/des_locl.h>
-
-#define panic(x) do {printf(x); return EINVAL;} while (0)
-
-int des_cbc_encrypt(m0, skip, length, schedule, ivec, mode)
- struct mbuf *m0;
- size_t skip;
- size_t length;
- des_key_schedule schedule;
- des_cblock (*ivec);
- int mode;
-{
- u_int8_t inbuf[8], outbuf[8];
- struct mbuf *m;
- size_t off;
- register DES_LONG tin0, tin1;
- register DES_LONG tout0, tout1;
- DES_LONG tin[2];
- u_int8_t *iv;
-
- /* sanity checks */
- if (m0->m_pkthdr.len < skip) {
- printf("mbuf length < skip\n");
- return EINVAL;
- }
- if (m0->m_pkthdr.len < length) {
- printf("mbuf length < encrypt length\n");
- return EINVAL;
- }
- if (m0->m_pkthdr.len < skip + length) {
- printf("mbuf length < skip + encrypt length\n");
- return EINVAL;
- }
- if (length % 8) {
- printf("length is not multiple of 8\n");
- return EINVAL;
- }
-
- m = m0;
- off = 0;
-
- /* skip over the header */
- while (skip) {
- if (!m)
- panic("mbuf chain?\n");
- if (m->m_len <= skip) {
- skip -= m->m_len;
- m = m->m_next;
- off = 0;
- } else {
- off = skip;
- skip = 0;
- }
- }
-
- /* initialize */
- tin0 = tin1 = tout0 = tout1 = 0;
- tin[0] = tin[1] = 0;
-
- if (mode == DES_ENCRYPT) {
- u_int8_t *in, *out;
-
- iv = (u_int8_t *)ivec;
- c2l(iv, tout0);
- c2l(iv, tout1);
-
- while (0 < length) {
- if (!m)
- panic("mbuf chain?\n");
-
- /*
- * copy the source into input buffer.
- * don't update off or m, since we need to use them * later.
- */
- if (off + 8 <= m->m_len)
- bcopy(mtod(m, u_int8_t *) + off, &inbuf[0], 8);
- else {
- struct mbuf *n;
- size_t noff;
- u_int8_t *p;
- u_int8_t *in;
-
- n = m;
- noff = off;
- p = mtod(n, u_int8_t *) + noff;
-
- in = &inbuf[0];
- while (in - &inbuf[0] < 8) {
- if (!p)
- panic("mbuf chain?\n");
-
- *in++ = *p++;
- noff++;
- if (noff < n->m_len)
- continue;
- do {
- n = n->m_next;
- } while (n && ! n->m_len);
- noff = 0;
- if (n)
- p = mtod(n, u_int8_t *) + noff;
- else
- p = NULL;
- }
- }
-
- in = &inbuf[0];
- out = &outbuf[0];
- c2l(in, tin0);
- c2l(in, tin1);
-
- tin0 ^= tout0; tin[0] = tin0;
- tin1 ^= tout1; tin[1] = tin1;
- des_encrypt((DES_LONG *)tin, schedule, DES_ENCRYPT);
- tout0 = tin[0]; l2c(tout0, out);
- tout1 = tin[1]; l2c(tout1, out);
-
- /*
- * copy the output buffer into the result.
- * need to update off and m.
- */
- if (off + 8 < m->m_len) {
- bcopy(&outbuf[0], mtod(m, u_int8_t *) + off, 8);
- off += 8;
- } else if (off + 8 == m->m_len) {
- bcopy(&outbuf[0], mtod(m, u_int8_t *) + off, 8);
- do {
- m = m->m_next;
- } while (m && ! m->m_len);
- off = 0;
- } else {
- struct mbuf *n;
- size_t noff;
- u_int8_t *p;
- u_int8_t *out;
-
- n = m;
- noff = off;
- p = mtod(n, u_int8_t *) + noff;
-
- out = &outbuf[0];
- while (out - &outbuf[0] < 8) {
- if (!p)
- panic("mbuf chain?");
- *p++ = *out++;
- noff++;
- if (noff < n->m_len)
- continue;
- do {
- n = n->m_next;
- } while (n && ! n->m_len);
- noff = 0;
- if (n)
- p = mtod(n, u_int8_t *) + noff;
- else
- p = NULL;
- }
-
- m = n;
- off = noff;
- }
-
- length -= 8;
- }
- } else if (mode == DES_DECRYPT) {
- register DES_LONG xor0, xor1;
- u_int8_t *in, *out;
-
- xor0 = xor1 = 0;
- iv = (u_int8_t *)ivec;
- c2l(iv, xor0);
- c2l(iv, xor1);
-
- while (0 < length) {
- if (!m)
- panic("mbuf chain?\n");
-
- /*
- * copy the source into input buffer.
- * don't update off or m, since we need to use them * later.
- */
- if (off + 8 <= m->m_len)
- bcopy(mtod(m, u_int8_t *) + off, &inbuf[0], 8);
- else {
- struct mbuf *n;
- size_t noff;
- u_int8_t *p;
- u_int8_t *in;
-
- n = m;
- noff = off;
- p = mtod(n, u_int8_t *) + noff;
-
- in = &inbuf[0];
- while (in - &inbuf[0] < 8) {
- if (!p)
- panic("mbuf chain?\n");
- *in++ = *p++;
- noff++;
- if (noff < n->m_len)
- continue;
- do {
- n = n->m_next;
- } while (n && ! n->m_len);
- noff = 0;
- if (n)
- p = mtod(n, u_int8_t *) + noff;
- else
- p = NULL;
- }
- }
-
- in = &inbuf[0];
- out = &outbuf[0];
- c2l(in, tin0); tin[0] = tin0;
- c2l(in, tin1); tin[1] = tin1;
- des_encrypt((DES_LONG *)tin, schedule, DES_DECRYPT);
- tout0 = tin[0] ^ xor0;
- tout1 = tin[1] ^ xor1;
- l2c(tout0, out);
- l2c(tout1, out);
- xor0 = tin0;
- xor1 = tin1;
-
-
- /*
- * copy the output buffer into the result.
- * need to update off and m.
- */
- if (off + 8 < m->m_len) {
- bcopy(&outbuf[0], mtod(m, u_int8_t *) + off, 8);
- off += 8;
- } else if (off + 8 == m->m_len) {
- bcopy(&outbuf[0], mtod(m, u_int8_t *) + off, 8);
- do {
- m = m->m_next;
- } while (m && ! m->m_len);
- off = 0;
- } else {
- struct mbuf *n;
- size_t noff;
- u_int8_t *p;
- u_int8_t *out;
-
- n = m;
- noff = off;
- p = mtod(n, u_int8_t *) + noff;
-
- out = &outbuf[0];
- while (out - &outbuf[0] < 8) {
- if (!p)
- panic("mbuf chain?\n");
- *p++ = *out++;
- noff++;
- if (noff < n->m_len)
- continue;
- do {
- n = n->m_next;
- } while (n && ! n->m_len);
- noff = 0;
- if (n)
- p = mtod(n, u_int8_t *) + noff;
- else
- p = NULL;
- }
-
- m = n;
- off = noff;
- }
-
- length -= 8;
- }
- }
-
- return 0;
-}
diff --git a/sys/crypto/des/des_ecb.c b/sys/crypto/des/des_ecb.c
index d828b91..aa1b22b 100644
--- a/sys/crypto/des/des_ecb.c
+++ b/sys/crypto/des/des_ecb.c
@@ -1,5 +1,5 @@
/* $FreeBSD$ */
-/* $KAME: des_ecb.c,v 1.3 2000/03/27 04:36:33 sumikawa Exp $ */
+/* $KAME: des_ecb.c,v 1.5 2000/11/06 13:58:08 itojun Exp $ */
/* crypto/des/ecb_enc.c */
/* Copyright (C) 1995-1996 Eric Young (eay@mincom.oz.au)
@@ -48,6 +48,8 @@
* [including the GNU Public Licence.]
*/
+#include <sys/param.h>
+#include <sys/systm.h>
#include <crypto/des/des_locl.h>
#include <crypto/des/spr.h>
diff --git a/sys/crypto/des/des_locl.h b/sys/crypto/des/des_locl.h
index ae6e828..82486dc 100644
--- a/sys/crypto/des/des_locl.h
+++ b/sys/crypto/des/des_locl.h
@@ -1,5 +1,5 @@
/* $FreeBSD$ */
-/* $KAME: des_locl.h,v 1.4 2000/03/27 04:43:46 sumikawa Exp $ */
+/* $KAME: des_locl.h,v 1.6 2000/11/06 13:58:09 itojun Exp $ */
/* lib/des/des_locl.h */
/* Copyright (C) 1995-1996 Eric Young (eay@mincom.oz.au)
@@ -55,83 +55,17 @@
* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
*/
-#include <sys/param.h>
-#include <sys/malloc.h>
-#include <sys/mbuf.h>
-#include <sys/systm.h>
-
#ifndef HEADER_DES_LOCL_H
#define HEADER_DES_LOCL_H
-#if defined(WIN32) || defined(WIN16)
-#ifndef MSDOS
-#define MSDOS
-#endif
-#endif
-
-/*
-#include <stdio.h>
-#include <stdlib.h>
-#ifndef MSDOS
-#include <unistd.h>
-#endif
-*/
#include <crypto/des/des.h>
-/* the following is tweaked from a config script, that is why it is a
- * protected undef/define */
-#ifndef DES_PTR
#undef DES_PTR
-#endif
-
-#ifdef MSDOS /* Visual C++ 2.1 (Windows NT/95) */
-#include <stdlib.h>
-#include <errno.h>
-#include <time.h>
-#include <io.h>
-#ifndef RAND
-#define RAND
-#endif
-#undef NOPROTO
-#endif
-
-#if !defined(_KERNEL) && (defined(__STDC__) || defined(VMS) || defined(M_XENIX) || defined(MSDOS))
-#ifndef __NetBSD__
-#include <string.h>
-#endif
-#endif
-
-#ifdef __NetBSD__
-#include <sys/systm.h>
-#endif
-
-#ifndef RAND
-#define RAND
-#endif
-
-#ifdef linux
-#undef RAND
-#endif
-
-#ifdef MSDOS
-#define getpid() 2
-#define RAND
-#undef NOPROTO
-#endif
-
-#if defined(NOCONST)
-#define const
-#endif
#ifdef __STDC__
#undef NOPROTO
#endif
-#ifdef RAND
-#define srandom(s) srand(s)
-#define random rand
-#endif
-
#define ITERATIONS 16
#define HALF_ITERATIONS 8
@@ -194,11 +128,7 @@
} \
}
-#if defined(WIN32)
-#define ROTATE(a,n) (_lrotr(a,n))
-#else
#define ROTATE(a,n) (((a)>>(n))+((a)<<(32-(n))))
-#endif
/* The changes to this macro may help or hinder, depending on the
* compiler and the achitecture. gcc2 always seems to do well :-).
@@ -313,36 +243,3 @@
PERM_OP(l,r,tt, 4,0x0f0f0f0fL); \
}
#endif
-
-
-/*
-#define mbuf2char(i_mbuf, i_index, in) \
- { \
- register int i; \
- struct mbuf *m; \
- char *buf; \
- m = i_mbuf; \
- for (i = 0; i < 8; i ++){ \
- if (i_index + i == m->m_len){ \
- m = m->m_next; \
- } \
- buf = mtod(m, char *); \
- in[i] = *(buf + i); \
- }
-
-
-#define char2mbuf(o_mbuf, o_index, out) \
- { \
- register int i; \
- struct mbuf *m; \
- char *buf; \
- m = o_mbuf; \
- for (i = 0; i < 8; i ++){ \
- if (i_index + i == m->m_len){ \
- m = m->m_next; \
- } \
- buf = mtod(m, char *); \
- *(buf + i) = out[i]; \
- }
-*/
-
diff --git a/sys/crypto/des/des_setkey.c b/sys/crypto/des/des_setkey.c
index 48d13fc..2ddf8bd 100644
--- a/sys/crypto/des/des_setkey.c
+++ b/sys/crypto/des/des_setkey.c
@@ -1,5 +1,5 @@
/* $FreeBSD$ */
-/* $KAME: des_setkey.c,v 1.3 2000/03/27 04:36:33 sumikawa Exp $ */
+/* $KAME: des_setkey.c,v 1.5 2000/11/06 13:58:09 itojun Exp $ */
/* crypto/des/set_key.c */
/* Copyright (C) 1995-1996 Eric Young (eay@mincom.oz.au)
@@ -55,15 +55,13 @@
* 1.1 added norm_expand_bits
* 1.0 First working version
*/
+#include <sys/param.h>
+#include <sys/systm.h>
#include <crypto/des/des_locl.h>
#include <crypto/des/podd.h>
#include <crypto/des/sk.h>
-#ifndef NOPROTO
-static int check_parity(des_cblock (*key));
-#else
-static int check_parity();
-#endif
+static int check_parity __P((des_cblock (*)));
int des_check_key=0;
diff --git a/sys/crypto/md5.c b/sys/crypto/md5.c
index e827700..3351d41 100644
--- a/sys/crypto/md5.c
+++ b/sys/crypto/md5.c
@@ -1,5 +1,5 @@
/* $FreeBSD$ */
-/* $KAME: md5.c,v 1.4 2000/03/27 04:36:22 sumikawa Exp $ */
+/* $KAME: md5.c,v 1.5 2000/11/08 06:13:08 itojun Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
diff --git a/sys/crypto/rc5/rc5.c b/sys/crypto/rc5/rc5.c
deleted file mode 100644
index 99a8ac6..0000000
--- a/sys/crypto/rc5/rc5.c
+++ /dev/null
@@ -1,219 +0,0 @@
-/* $FreeBSD$ */
-/* $KAME: rc5.c,v 1.3 2000/03/27 04:36:36 sumikawa Exp $ */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * 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.
- * 3. Neither the name of the project nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT 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 PROJECT 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.
- */
-#include <crypto/rc5/rc5.h>
-
-
-void
-set_rc5_expandkey(e_key, key, keylen, rounds)
- RC5_WORD *e_key;
- u_int8_t *key;
- size_t keylen;
- int rounds;
-{
- int i, j, k, LL, t, T;
- RC5_WORD L[256/WW];
- RC5_WORD A, B;
-
- LL = (keylen + WW - 1) / WW;
-
- bzero(L, sizeof(RC5_WORD)*LL);
-
- for (i = 0; i < keylen; i++) {
- t = (key[i] & 0xff) << (8*(i%4));
- L[i/WW] = L[i/WW] + t;
- }
-
- T = 2 * (rounds + 1);
- e_key[0] = Pw;
- for (i = 1; i < T; i++)
- e_key[i] = e_key[i-1] + Qw;
-
- i = j = 0;
- A = B = 0;
- if (LL > T)
- k = 3 * LL;
- else
- k = 3 * T;
-
- for (; k > 0; k--) {
- A = ROTL(e_key[i]+A+B, 3, W);
- e_key[i] = A;
- B = ROTL(L[j]+A+B, A+B, W);
- L[j] = B;
-
- i = (i + 1) % T;
- j = (j + 1) % LL;
- }
-}
-
-
-/*
- *
- */
-void
-rc5_encrypt_round16(out, in, e_key)
- u_int8_t *out;
- const u_int8_t *in;
- const RC5_WORD *e_key;
-{
- RC5_WORD A, B;
- const RC5_WORD *e_keyA, *e_keyB;
-
- A = in[0] & 0xff;
- A += (in[1] & 0xff) << 8;
- A += (in[2] & 0xff) << 16;
- A += (in[3] & 0xff) << 24;
- B = in[4] & 0xff;
- B += (in[5] & 0xff) << 8;
- B += (in[6] & 0xff) << 16;
- B += (in[7] & 0xff) << 24;
-
- e_keyA = e_key;
- e_keyB = e_key + 1;
-
- A += *e_keyA; e_keyA += 2;
- B += *e_keyB; e_keyB += 2;
-
- A = ROTL(A^B, B, W) + *e_keyA; e_keyA += 2;
- B = ROTL(B^A, A, W) + *e_keyB; e_keyB += 2;
- A = ROTL(A^B, B, W) + *e_keyA; e_keyA += 2;
- B = ROTL(B^A, A, W) + *e_keyB; e_keyB += 2;
- A = ROTL(A^B, B, W) + *e_keyA; e_keyA += 2;
- B = ROTL(B^A, A, W) + *e_keyB; e_keyB += 2;
- A = ROTL(A^B, B, W) + *e_keyA; e_keyA += 2;
- B = ROTL(B^A, A, W) + *e_keyB; e_keyB += 2; /* round 4 */
- A = ROTL(A^B, B, W) + *e_keyA; e_keyA += 2;
- B = ROTL(B^A, A, W) + *e_keyB; e_keyB += 2;
- A = ROTL(A^B, B, W) + *e_keyA; e_keyA += 2;
- B = ROTL(B^A, A, W) + *e_keyB; e_keyB += 2;
- A = ROTL(A^B, B, W) + *e_keyA; e_keyA += 2;
- B = ROTL(B^A, A, W) + *e_keyB; e_keyB += 2;
- A = ROTL(A^B, B, W) + *e_keyA; e_keyA += 2;
- B = ROTL(B^A, A, W) + *e_keyB; e_keyB += 2; /* round 8 */
- A = ROTL(A^B, B, W) + *e_keyA; e_keyA += 2;
- B = ROTL(B^A, A, W) + *e_keyB; e_keyB += 2;
- A = ROTL(A^B, B, W) + *e_keyA; e_keyA += 2;
- B = ROTL(B^A, A, W) + *e_keyB; e_keyB += 2;
- A = ROTL(A^B, B, W) + *e_keyA; e_keyA += 2;
- B = ROTL(B^A, A, W) + *e_keyB; e_keyB += 2;
- A = ROTL(A^B, B, W) + *e_keyA; e_keyA += 2;
- B = ROTL(B^A, A, W) + *e_keyB; e_keyB += 2; /* round 12 */
- A = ROTL(A^B, B, W) + *e_keyA; e_keyA += 2;
- B = ROTL(B^A, A, W) + *e_keyB; e_keyB += 2;
- A = ROTL(A^B, B, W) + *e_keyA; e_keyA += 2;
- B = ROTL(B^A, A, W) + *e_keyB; e_keyB += 2;
- A = ROTL(A^B, B, W) + *e_keyA; e_keyA += 2;
- B = ROTL(B^A, A, W) + *e_keyB; e_keyB += 2;
- A = ROTL(A^B, B, W) + *e_keyA; e_keyA += 2;
- B = ROTL(B^A, A, W) + *e_keyB; e_keyB += 2; /* round 16 */
-
- out[0] = A & 0xff;
- out[1] = (A >> 8) & 0xff;
- out[2] = (A >> 16) & 0xff;
- out[3] = (A >> 24) & 0xff;
- out[4] = B & 0xff;
- out[5] = (B >> 8) & 0xff;
- out[6] = (B >> 16) & 0xff;
- out[7] = (B >> 24) & 0xff;
-}
-
-
-/*
- *
- */
-void
-rc5_decrypt_round16(out, in, e_key)
- u_int8_t *out;
- const u_int8_t *in;
- const RC5_WORD *e_key;
-{
- RC5_WORD A, B;
- const RC5_WORD *e_keyA, *e_keyB;
-
- A = in[0] & 0xff;
- A += (in[1] & 0xff) << 8;
- A += (in[2] & 0xff) << 16;
- A += (in[3] & 0xff) << 24;
- B = in[4] & 0xff;
- B += (in[5] & 0xff) << 8;
- B += (in[6] & 0xff) << 16;
- B += (in[7] & 0xff) << 24;
-
- e_keyA = e_key + 2*16;
- e_keyB = e_key + 2*16 + 1;
-
- B = ROTR(B-*e_keyB, A, W) ^ A; e_keyB -= 2;
- A = ROTR(A-*e_keyA, B, W) ^ B; e_keyA -= 2;
- B = ROTR(B-*e_keyB, A, W) ^ A; e_keyB -= 2;
- A = ROTR(A-*e_keyA, B, W) ^ B; e_keyA -= 2;
- B = ROTR(B-*e_keyB, A, W) ^ A; e_keyB -= 2;
- A = ROTR(A-*e_keyA, B, W) ^ B; e_keyA -= 2;
- B = ROTR(B-*e_keyB, A, W) ^ A; e_keyB -= 2;
- A = ROTR(A-*e_keyA, B, W) ^ B; e_keyA -= 2; /* round 4 */
- B = ROTR(B-*e_keyB, A, W) ^ A; e_keyB -= 2;
- A = ROTR(A-*e_keyA, B, W) ^ B; e_keyA -= 2;
- B = ROTR(B-*e_keyB, A, W) ^ A; e_keyB -= 2;
- A = ROTR(A-*e_keyA, B, W) ^ B; e_keyA -= 2;
- B = ROTR(B-*e_keyB, A, W) ^ A; e_keyB -= 2;
- A = ROTR(A-*e_keyA, B, W) ^ B; e_keyA -= 2;
- B = ROTR(B-*e_keyB, A, W) ^ A; e_keyB -= 2;
- A = ROTR(A-*e_keyA, B, W) ^ B; e_keyA -= 2; /* round 8 */
- B = ROTR(B-*e_keyB, A, W) ^ A; e_keyB -= 2;
- A = ROTR(A-*e_keyA, B, W) ^ B; e_keyA -= 2;
- B = ROTR(B-*e_keyB, A, W) ^ A; e_keyB -= 2;
- A = ROTR(A-*e_keyA, B, W) ^ B; e_keyA -= 2;
- B = ROTR(B-*e_keyB, A, W) ^ A; e_keyB -= 2;
- A = ROTR(A-*e_keyA, B, W) ^ B; e_keyA -= 2;
- B = ROTR(B-*e_keyB, A, W) ^ A; e_keyB -= 2;
- A = ROTR(A-*e_keyA, B, W) ^ B; e_keyA -= 2; /* round 12 */
- B = ROTR(B-*e_keyB, A, W) ^ A; e_keyB -= 2;
- A = ROTR(A-*e_keyA, B, W) ^ B; e_keyA -= 2;
- B = ROTR(B-*e_keyB, A, W) ^ A; e_keyB -= 2;
- A = ROTR(A-*e_keyA, B, W) ^ B; e_keyA -= 2;
- B = ROTR(B-*e_keyB, A, W) ^ A; e_keyB -= 2;
- A = ROTR(A-*e_keyA, B, W) ^ B; e_keyA -= 2;
- B = ROTR(B-*e_keyB, A, W) ^ A; e_keyB -= 2;
- A = ROTR(A-*e_keyA, B, W) ^ B; e_keyA -= 2; /* round 16 */
-
- B = B - *e_keyB;
- A = A - *e_keyA;
-
- out[0] = A & 0xff;
- out[1] = (A >> 8) & 0xff;
- out[2] = (A >> 16) & 0xff;
- out[3] = (A >> 24) & 0xff;
- out[4] = B & 0xff;
- out[5] = (B >> 8) & 0xff;
- out[6] = (B >> 16) & 0xff;
- out[7] = (B >> 24) & 0xff;
-}
-
diff --git a/sys/crypto/rc5/rc5.h b/sys/crypto/rc5/rc5.h
deleted file mode 100644
index ae2339b..0000000
--- a/sys/crypto/rc5/rc5.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/* $FreeBSD$ */
-/* $KAME: rc5.h,v 1.4 2000/06/14 10:41:17 itojun Exp $ */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * 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.
- * 3. Neither the name of the project nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT 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 PROJECT 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.
- */
-
-#ifndef _RFC2040_RC5_H_
-#define _RFC2040_RC5_H_
-
-#include <sys/param.h>
-#include <sys/systm.h>
-#include <sys/mbuf.h>
-
-/*
- * if RC5_WORD change, W also may be changed.
- */
-typedef u_int32_t RC5_WORD;
-
-#define W (32)
-#define WW (W / 8)
-#define ROT_MASK (W - 1)
-#define BB ((2 * W) / 8)
-
-#define SHLL(x, s) ((RC5_WORD)((x) << ((s)&ROT_MASK)))
-#define SHLR(x, s, w) ((RC5_WORD)((x) >> ((w)-((s)&ROT_MASK))))
-#define SHRL(x, s, w) ((RC5_WORD)((x) << ((w)-((s)&ROT_MASK))))
-#define SHRR(x, s) ((RC5_WORD)((x) >> ((s)&ROT_MASK)))
-
-#define ROTL(x, s, w) ((RC5_WORD)(SHLL((x), (s))|SHLR((x), (s), (w))))
-#define ROTR(x, s, w) ((RC5_WORD)(SHRL((x), (s), (w))|SHRR((x), (s))))
-
-#define P16 0xb7e1
-#define Q16 0x9e37
-#define P32 0xb7e15163
-#define Q32 0x9e3779b9
-#define P64 0xb7e151628aed2a6b
-#define Q64 0x9e3779b97f4a7c15
-
-#if W == 16
-#define Pw P16
-#define Qw Q16
-#elif W == 32
-#define Pw P32
-#define Qw Q32
-#elif W == 64
-#define Pw P64
-#define Qw Q64
-#endif
-
-#define RC5_ENCRYPT 1
-#define RC5_DECRYPT 0
-
-extern void set_rc5_expandkey __P((RC5_WORD *, u_int8_t *, size_t, int));
-extern void rc5_encrypt_round16 __P((u_int8_t *, const u_int8_t *,
- const RC5_WORD *));
-extern void rc5_decrypt_round16 __P((u_int8_t *, const u_int8_t *,
- const RC5_WORD *));
-extern int rc5_cbc_process __P((struct mbuf *, size_t, size_t, RC5_WORD *,
- u_int8_t *, int));
-
-#endif
diff --git a/sys/crypto/rc5/rc5_cbc.c b/sys/crypto/rc5/rc5_cbc.c
deleted file mode 100644
index 5972cc6..0000000
--- a/sys/crypto/rc5/rc5_cbc.c
+++ /dev/null
@@ -1,215 +0,0 @@
-/* $FreeBSD$ */
-/* $KAME: rc5_cbc.c,v 1.4 2000/06/14 10:41:17 itojun Exp $ */
-
-/*
- * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
- * 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.
- * 3. Neither the name of the project nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE PROJECT 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 PROJECT 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.
- */
-/*
- * based on sys/crypto/des/des_cbc.c, rewrote by Tomomi Suzuki
- */
-#include <crypto/rc5/rc5.h>
-
-#define panic(x) do { printf(x); return EINVAL; } while (0)
-
-int
-rc5_cbc_process(m0, skip, length, e_key, iv, mode)
- struct mbuf *m0;
- size_t skip;
- size_t length;
- RC5_WORD *e_key;
- u_int8_t *iv;
- int mode;
-{
- u_int8_t inbuf[8], outbuf[8];
- struct mbuf *m;
- size_t off;
-
- /* sanity check */
- if (m0->m_pkthdr.len < skip) {
- printf("rc5_cbc_process: mbuf length < skip\n");
- return EINVAL;
- }
- if (m0->m_pkthdr.len < length) {
- printf("rc5_cbc_process: mbuf length < encrypt length\n");
- return EINVAL;
- }
- if (m0->m_pkthdr.len < skip + length) {
- printf("rc5_cbc_process: mbuf length < "
- "skip + encrypt length\n");
- return EINVAL;
- }
- if (length % 8) {
- printf("rc5_cbc_process: length(%lu)is not multipleof 8\n",
- (u_long)length);
- return EINVAL;
- }
-
- m = m0;
- off = 0;
-
- /* skip over the header */
- while (skip) {
- if (!m)
- panic("rc5_cbc_process: mbuf chain?\n");
- if (m->m_len <= skip) {
- skip -= m->m_len;
- m = m->m_next;
- off = 0;
- } else {
- off = skip;
- skip = 0;
- }
- }
-
- /* copy iv into outbuf for XOR (encrypt) */
- bcopy(iv, outbuf, 8);
-
- /*
- * encrypt/decrypt packet
- */
- while (length > 0) {
- int i;
-
- if (!m)
- panic("rc5_cbc_process: mbuf chain?\n");
-
- /*
- * copy the source into input buffer.
- * don't update off or m, since we need to use them
- * later.
- */
- if (off + 8 <= m->m_len)
- bcopy(mtod(m, u_int8_t *) + off, &inbuf[0], 8);
- else {
- struct mbuf *n;
- size_t noff;
- u_int8_t *p;
- u_int8_t *in;
-
- n = m;
- noff = off;
- p = mtod(n, u_int8_t *) + noff;
-
- in = &inbuf[0];
- while (in - &inbuf[0] < 8) {
- if (!p) {
- panic("rc5_cbc_process: "
- "mbuf chain?\n");
- }
- *in++ = *p++;
- noff++;
- if (noff < n->m_len)
- continue;
- do {
- n = n->m_next;
- } while (n && !n->m_len);
- noff = 0;
- if (n)
- p = mtod(n, u_int8_t *) + noff;
- else
- p = NULL;
- }
- }
-
- /* encrypt/decrypt */
- switch (mode) {
- case RC5_ENCRYPT:
- /* XOR */
- for (i = 0; i < 8; i++)
- inbuf[i] ^= outbuf[i];
-
- /* encrypt */
- rc5_encrypt_round16(outbuf, inbuf, e_key);
- break;
-
- case RC5_DECRYPT:
- /* decrypt */
- rc5_decrypt_round16(outbuf, inbuf, e_key);
-
- /* XOR */
- for (i = 0; i < 8; i++)
- outbuf[i] ^= iv[i];
-
- /* copy inbuf into iv for next XOR */
- bcopy(inbuf, iv, 8);
- break;
- }
-
- /*
- * copy the output buffer into the result.
- * need to update off and m.
- */
- if (off + 8 < m->m_len) {
- bcopy(&outbuf[0], mtod(m, u_int8_t *) + off, 8);
- off += 8;
- } else if (off + 8 == m->m_len) {
- bcopy(&outbuf[0], mtod(m, u_int8_t *) + off, 8);
- do {
- m = m->m_next;
- } while (m && !m->m_len);
- off = 0;
- } else {
- struct mbuf *n;
- size_t noff;
- u_int8_t *p;
- u_int8_t *out;
-
- n = m;
- noff = off;
- p = mtod(n, u_int8_t *) + noff;
-
- out = &outbuf[0];
- while (out - &outbuf[0] < 8) {
- if (!p) {
- panic("rc5_cbc_process: "
- "mbuf chain?\n");
- }
- *p++ = *out++;
- noff++;
- if (noff < n->m_len)
- continue;
- do {
- n = n->m_next;
- } while (n && !n->m_len);
- noff = 0;
- if (n)
- p = mtod(n, u_int8_t *) + noff;
- else
- p = NULL;
- }
-
- m = n;
- off = noff;
- }
-
- length -= 8;
- }
-
- return 0;
-}
-
diff --git a/sys/crypto/rijndael/boxes-fst.dat b/sys/crypto/rijndael/boxes-fst.dat
index 6315523..3fed9c0 100644
--- a/sys/crypto/rijndael/boxes-fst.dat
+++ b/sys/crypto/rijndael/boxes-fst.dat
@@ -1,6 +1,7 @@
-/* $KAME$ */
+/* $FreeBSD$ */
+/* $KAME: boxes-fst.dat,v 1.6 2001/05/27 00:23:22 itojun Exp $ */
-word8 S[256] = {
+const word8 S[256] = {
99, 124, 119, 123, 242, 107, 111, 197, 48, 1, 103, 43, 254, 215, 171, 118,
202, 130, 201, 125, 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, 114, 192,
183, 253, 147, 38, 54, 63, 247, 204, 52, 165, 229, 241, 113, 216, 49, 21,
@@ -20,7 +21,7 @@ word8 S[256] = {
};
#ifdef INTERMEDIATE_VALUE_KAT
-static word8 Si[256] = {
+static const word8 Si[256] = {
82, 9, 106, 213, 48, 54, 165, 56, 191, 64, 163, 158, 129, 243, 215, 251,
124, 227, 57, 130, 155, 47, 255, 135, 52, 142, 67, 68, 196, 222, 233, 203,
84, 123, 148, 50, 166, 194, 35, 61, 238, 76, 149, 11, 66, 250, 195, 78,
@@ -40,7 +41,13 @@ static word8 Si[256] = {
};
#endif /* INTERMEDIATE_VALUE_KAT */
-static word8 T1[256][4] = {
+union xtab {
+ word32 xt32[256];
+ word8 xt8[256][4];
+};
+
+static const union xtab xT1 = {
+ .xt8 = {
{0xc6,0x63,0x63,0xa5}, {0xf8,0x7c,0x7c,0x84}, {0xee,0x77,0x77,0x99}, {0xf6,0x7b,0x7b,0x8d},
{0xff,0xf2,0xf2,0x0d}, {0xd6,0x6b,0x6b,0xbd}, {0xde,0x6f,0x6f,0xb1}, {0x91,0xc5,0xc5,0x54},
{0x60,0x30,0x30,0x50}, {0x02,0x01,0x01,0x03}, {0xce,0x67,0x67,0xa9}, {0x56,0x2b,0x2b,0x7d},
@@ -105,9 +112,12 @@ static word8 T1[256][4] = {
{0x65,0xbf,0xbf,0xda}, {0xd7,0xe6,0xe6,0x31}, {0x84,0x42,0x42,0xc6}, {0xd0,0x68,0x68,0xb8},
{0x82,0x41,0x41,0xc3}, {0x29,0x99,0x99,0xb0}, {0x5a,0x2d,0x2d,0x77}, {0x1e,0x0f,0x0f,0x11},
{0x7b,0xb0,0xb0,0xcb}, {0xa8,0x54,0x54,0xfc}, {0x6d,0xbb,0xbb,0xd6}, {0x2c,0x16,0x16,0x3a}
+ }
};
+#define T1 xT1.xt8
-static word8 T2[256][4] = {
+static const union xtab xT2 = {
+ .xt8 = {
{0xa5,0xc6,0x63,0x63}, {0x84,0xf8,0x7c,0x7c}, {0x99,0xee,0x77,0x77}, {0x8d,0xf6,0x7b,0x7b},
{0x0d,0xff,0xf2,0xf2}, {0xbd,0xd6,0x6b,0x6b}, {0xb1,0xde,0x6f,0x6f}, {0x54,0x91,0xc5,0xc5},
{0x50,0x60,0x30,0x30}, {0x03,0x02,0x01,0x01}, {0xa9,0xce,0x67,0x67}, {0x7d,0x56,0x2b,0x2b},
@@ -172,9 +182,12 @@ static word8 T2[256][4] = {
{0xda,0x65,0xbf,0xbf}, {0x31,0xd7,0xe6,0xe6}, {0xc6,0x84,0x42,0x42}, {0xb8,0xd0,0x68,0x68},
{0xc3,0x82,0x41,0x41}, {0xb0,0x29,0x99,0x99}, {0x77,0x5a,0x2d,0x2d}, {0x11,0x1e,0x0f,0x0f},
{0xcb,0x7b,0xb0,0xb0}, {0xfc,0xa8,0x54,0x54}, {0xd6,0x6d,0xbb,0xbb}, {0x3a,0x2c,0x16,0x16}
+ }
};
+#define T2 xT2.xt8
-static word8 T3[256][4] = {
+static const union xtab xT3 = {
+ .xt8 = {
{0x63,0xa5,0xc6,0x63}, {0x7c,0x84,0xf8,0x7c}, {0x77,0x99,0xee,0x77}, {0x7b,0x8d,0xf6,0x7b},
{0xf2,0x0d,0xff,0xf2}, {0x6b,0xbd,0xd6,0x6b}, {0x6f,0xb1,0xde,0x6f}, {0xc5,0x54,0x91,0xc5},
{0x30,0x50,0x60,0x30}, {0x01,0x03,0x02,0x01}, {0x67,0xa9,0xce,0x67}, {0x2b,0x7d,0x56,0x2b},
@@ -239,9 +252,12 @@ static word8 T3[256][4] = {
{0xbf,0xda,0x65,0xbf}, {0xe6,0x31,0xd7,0xe6}, {0x42,0xc6,0x84,0x42}, {0x68,0xb8,0xd0,0x68},
{0x41,0xc3,0x82,0x41}, {0x99,0xb0,0x29,0x99}, {0x2d,0x77,0x5a,0x2d}, {0x0f,0x11,0x1e,0x0f},
{0xb0,0xcb,0x7b,0xb0}, {0x54,0xfc,0xa8,0x54}, {0xbb,0xd6,0x6d,0xbb}, {0x16,0x3a,0x2c,0x16}
+ }
};
+#define T3 xT3.xt8
-static word8 T4[256][4] = {
+static const union xtab xT4 = {
+ .xt8 = {
{0x63,0x63,0xa5,0xc6}, {0x7c,0x7c,0x84,0xf8}, {0x77,0x77,0x99,0xee}, {0x7b,0x7b,0x8d,0xf6},
{0xf2,0xf2,0x0d,0xff}, {0x6b,0x6b,0xbd,0xd6}, {0x6f,0x6f,0xb1,0xde}, {0xc5,0xc5,0x54,0x91},
{0x30,0x30,0x50,0x60}, {0x01,0x01,0x03,0x02}, {0x67,0x67,0xa9,0xce}, {0x2b,0x2b,0x7d,0x56},
@@ -306,9 +322,12 @@ static word8 T4[256][4] = {
{0xbf,0xbf,0xda,0x65}, {0xe6,0xe6,0x31,0xd7}, {0x42,0x42,0xc6,0x84}, {0x68,0x68,0xb8,0xd0},
{0x41,0x41,0xc3,0x82}, {0x99,0x99,0xb0,0x29}, {0x2d,0x2d,0x77,0x5a}, {0x0f,0x0f,0x11,0x1e},
{0xb0,0xb0,0xcb,0x7b}, {0x54,0x54,0xfc,0xa8}, {0xbb,0xbb,0xd6,0x6d}, {0x16,0x16,0x3a,0x2c}
+ }
};
+#define T4 xT4.xt8
-static word8 T5[256][4] = {
+static const union xtab xT5 = {
+ .xt8 = {
{0x51,0xf4,0xa7,0x50}, {0x7e,0x41,0x65,0x53}, {0x1a,0x17,0xa4,0xc3}, {0x3a,0x27,0x5e,0x96},
{0x3b,0xab,0x6b,0xcb}, {0x1f,0x9d,0x45,0xf1}, {0xac,0xfa,0x58,0xab}, {0x4b,0xe3,0x03,0x93},
{0x20,0x30,0xfa,0x55}, {0xad,0x76,0x6d,0xf6}, {0x88,0xcc,0x76,0x91}, {0xf5,0x02,0x4c,0x25},
@@ -373,9 +392,12 @@ static word8 T5[256][4] = {
{0x16,0x1d,0xc3,0x72}, {0xbc,0xe2,0x25,0x0c}, {0x28,0x3c,0x49,0x8b}, {0xff,0x0d,0x95,0x41},
{0x39,0xa8,0x01,0x71}, {0x08,0x0c,0xb3,0xde}, {0xd8,0xb4,0xe4,0x9c}, {0x64,0x56,0xc1,0x90},
{0x7b,0xcb,0x84,0x61}, {0xd5,0x32,0xb6,0x70}, {0x48,0x6c,0x5c,0x74}, {0xd0,0xb8,0x57,0x42}
+ }
};
+#define T5 xT5.xt8
-static word8 T6[256][4] = {
+static const union xtab xT6 = {
+ .xt8 = {
{0x50,0x51,0xf4,0xa7}, {0x53,0x7e,0x41,0x65}, {0xc3,0x1a,0x17,0xa4}, {0x96,0x3a,0x27,0x5e},
{0xcb,0x3b,0xab,0x6b}, {0xf1,0x1f,0x9d,0x45}, {0xab,0xac,0xfa,0x58}, {0x93,0x4b,0xe3,0x03},
{0x55,0x20,0x30,0xfa}, {0xf6,0xad,0x76,0x6d}, {0x91,0x88,0xcc,0x76}, {0x25,0xf5,0x02,0x4c},
@@ -440,9 +462,12 @@ static word8 T6[256][4] = {
{0x72,0x16,0x1d,0xc3}, {0x0c,0xbc,0xe2,0x25}, {0x8b,0x28,0x3c,0x49}, {0x41,0xff,0x0d,0x95},
{0x71,0x39,0xa8,0x01}, {0xde,0x08,0x0c,0xb3}, {0x9c,0xd8,0xb4,0xe4}, {0x90,0x64,0x56,0xc1},
{0x61,0x7b,0xcb,0x84}, {0x70,0xd5,0x32,0xb6}, {0x74,0x48,0x6c,0x5c}, {0x42,0xd0,0xb8,0x57}
+ }
};
+#define T6 xT6.xt8
-static word8 T7[256][4] = {
+static const union xtab xT7 = {
+ .xt8 = {
{0xa7,0x50,0x51,0xf4}, {0x65,0x53,0x7e,0x41}, {0xa4,0xc3,0x1a,0x17}, {0x5e,0x96,0x3a,0x27},
{0x6b,0xcb,0x3b,0xab}, {0x45,0xf1,0x1f,0x9d}, {0x58,0xab,0xac,0xfa}, {0x03,0x93,0x4b,0xe3},
{0xfa,0x55,0x20,0x30}, {0x6d,0xf6,0xad,0x76}, {0x76,0x91,0x88,0xcc}, {0x4c,0x25,0xf5,0x02},
@@ -507,9 +532,12 @@ static word8 T7[256][4] = {
{0xc3,0x72,0x16,0x1d}, {0x25,0x0c,0xbc,0xe2}, {0x49,0x8b,0x28,0x3c}, {0x95,0x41,0xff,0x0d},
{0x01,0x71,0x39,0xa8}, {0xb3,0xde,0x08,0x0c}, {0xe4,0x9c,0xd8,0xb4}, {0xc1,0x90,0x64,0x56},
{0x84,0x61,0x7b,0xcb}, {0xb6,0x70,0xd5,0x32}, {0x5c,0x74,0x48,0x6c}, {0x57,0x42,0xd0,0xb8}
+ }
};
+#define T7 xT7.xt8
-static word8 T8[256][4] = {
+static const union xtab xT8 = {
+ .xt8 = {
{0xf4,0xa7,0x50,0x51}, {0x41,0x65,0x53,0x7e}, {0x17,0xa4,0xc3,0x1a}, {0x27,0x5e,0x96,0x3a},
{0xab,0x6b,0xcb,0x3b}, {0x9d,0x45,0xf1,0x1f}, {0xfa,0x58,0xab,0xac}, {0xe3,0x03,0x93,0x4b},
{0x30,0xfa,0x55,0x20}, {0x76,0x6d,0xf6,0xad}, {0xcc,0x76,0x91,0x88}, {0x02,0x4c,0x25,0xf5},
@@ -574,9 +602,11 @@ static word8 T8[256][4] = {
{0x1d,0xc3,0x72,0x16}, {0xe2,0x25,0x0c,0xbc}, {0x3c,0x49,0x8b,0x28}, {0x0d,0x95,0x41,0xff},
{0xa8,0x01,0x71,0x39}, {0x0c,0xb3,0xde,0x08}, {0xb4,0xe4,0x9c,0xd8}, {0x56,0xc1,0x90,0x64},
{0xcb,0x84,0x61,0x7b}, {0x32,0xb6,0x70,0xd5}, {0x6c,0x5c,0x74,0x48}, {0xb8,0x57,0x42,0xd0}
+ }
};
+#define T8 xT8.xt8
-static word8 S5[256] = {
+static const word8 S5[256] = {
0x52,0x09,0x6a,0xd5,
0x30,0x36,0xa5,0x38,
0xbf,0x40,0xa3,0x9e,
@@ -643,7 +673,8 @@ static word8 S5[256] = {
0x55,0x21,0x0c,0x7d
};
-static word8 U1[256][4] = {
+static const union xtab xU1 = {
+ .xt8 = {
{0x00,0x00,0x00,0x00}, {0x0e,0x09,0x0d,0x0b}, {0x1c,0x12,0x1a,0x16}, {0x12,0x1b,0x17,0x1d},
{0x38,0x24,0x34,0x2c}, {0x36,0x2d,0x39,0x27}, {0x24,0x36,0x2e,0x3a}, {0x2a,0x3f,0x23,0x31},
{0x70,0x48,0x68,0x58}, {0x7e,0x41,0x65,0x53}, {0x6c,0x5a,0x72,0x4e}, {0x62,0x53,0x7f,0x45},
@@ -708,9 +739,12 @@ static word8 U1[256][4] = {
{0xef,0x15,0xe8,0xe6}, {0xe1,0x1c,0xe5,0xed}, {0xf3,0x07,0xf2,0xf0}, {0xfd,0x0e,0xff,0xfb},
{0xa7,0x79,0xb4,0x92}, {0xa9,0x70,0xb9,0x99}, {0xbb,0x6b,0xae,0x84}, {0xb5,0x62,0xa3,0x8f},
{0x9f,0x5d,0x80,0xbe}, {0x91,0x54,0x8d,0xb5}, {0x83,0x4f,0x9a,0xa8}, {0x8d,0x46,0x97,0xa3}
+ }
};
+#define U1 xU1.xt8
-static word8 U2[256][4] = {
+static const union xtab xU2 = {
+ .xt8 = {
{0x00,0x00,0x00,0x00}, {0x0b,0x0e,0x09,0x0d}, {0x16,0x1c,0x12,0x1a}, {0x1d,0x12,0x1b,0x17},
{0x2c,0x38,0x24,0x34}, {0x27,0x36,0x2d,0x39}, {0x3a,0x24,0x36,0x2e}, {0x31,0x2a,0x3f,0x23},
{0x58,0x70,0x48,0x68}, {0x53,0x7e,0x41,0x65}, {0x4e,0x6c,0x5a,0x72}, {0x45,0x62,0x53,0x7f},
@@ -775,9 +809,12 @@ static word8 U2[256][4] = {
{0xe6,0xef,0x15,0xe8}, {0xed,0xe1,0x1c,0xe5}, {0xf0,0xf3,0x07,0xf2}, {0xfb,0xfd,0x0e,0xff},
{0x92,0xa7,0x79,0xb4}, {0x99,0xa9,0x70,0xb9}, {0x84,0xbb,0x6b,0xae}, {0x8f,0xb5,0x62,0xa3},
{0xbe,0x9f,0x5d,0x80}, {0xb5,0x91,0x54,0x8d}, {0xa8,0x83,0x4f,0x9a}, {0xa3,0x8d,0x46,0x97}
+ }
};
+#define U2 xU2.xt8
-static word8 U3[256][4] = {
+static const union xtab xU3 = {
+ .xt8 = {
{0x00,0x00,0x00,0x00}, {0x0d,0x0b,0x0e,0x09}, {0x1a,0x16,0x1c,0x12}, {0x17,0x1d,0x12,0x1b},
{0x34,0x2c,0x38,0x24}, {0x39,0x27,0x36,0x2d}, {0x2e,0x3a,0x24,0x36}, {0x23,0x31,0x2a,0x3f},
{0x68,0x58,0x70,0x48}, {0x65,0x53,0x7e,0x41}, {0x72,0x4e,0x6c,0x5a}, {0x7f,0x45,0x62,0x53},
@@ -842,9 +879,12 @@ static word8 U3[256][4] = {
{0xe8,0xe6,0xef,0x15}, {0xe5,0xed,0xe1,0x1c}, {0xf2,0xf0,0xf3,0x07}, {0xff,0xfb,0xfd,0x0e},
{0xb4,0x92,0xa7,0x79}, {0xb9,0x99,0xa9,0x70}, {0xae,0x84,0xbb,0x6b}, {0xa3,0x8f,0xb5,0x62},
{0x80,0xbe,0x9f,0x5d}, {0x8d,0xb5,0x91,0x54}, {0x9a,0xa8,0x83,0x4f}, {0x97,0xa3,0x8d,0x46}
+ }
};
+#define U3 xU3.xt8
-static word8 U4[256][4] = {
+static const union xtab xU4 = {
+ .xt8 = {
{0x00,0x00,0x00,0x00}, {0x09,0x0d,0x0b,0x0e}, {0x12,0x1a,0x16,0x1c}, {0x1b,0x17,0x1d,0x12},
{0x24,0x34,0x2c,0x38}, {0x2d,0x39,0x27,0x36}, {0x36,0x2e,0x3a,0x24}, {0x3f,0x23,0x31,0x2a},
{0x48,0x68,0x58,0x70}, {0x41,0x65,0x53,0x7e}, {0x5a,0x72,0x4e,0x6c}, {0x53,0x7f,0x45,0x62},
@@ -909,8 +949,10 @@ static word8 U4[256][4] = {
{0x15,0xe8,0xe6,0xef}, {0x1c,0xe5,0xed,0xe1}, {0x07,0xf2,0xf0,0xf3}, {0x0e,0xff,0xfb,0xfd},
{0x79,0xb4,0x92,0xa7}, {0x70,0xb9,0x99,0xa9}, {0x6b,0xae,0x84,0xbb}, {0x62,0xa3,0x8f,0xb5},
{0x5d,0x80,0xbe,0x9f}, {0x54,0x8d,0xb5,0x91}, {0x4f,0x9a,0xa8,0x83}, {0x46,0x97,0xa3,0x8d}
+ }
};
+#define U4 xU4.xt8
-static word32 rcon[30] = {
+static const word32 rcon[30] = {
0x01,0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91
};
diff --git a/sys/crypto/rijndael/rijndael-alg-fst.c b/sys/crypto/rijndael/rijndael-alg-fst.c
index 33d0d8a..ac9668e 100644
--- a/sys/crypto/rijndael/rijndael-alg-fst.c
+++ b/sys/crypto/rijndael/rijndael-alg-fst.c
@@ -1,4 +1,5 @@
-/* $KAME$ */
+/* $FreeBSD$ */
+/* $KAME: rijndael-alg-fst.c,v 1.7 2001/05/27 00:23:23 itojun Exp $ */
/*
* rijndael-alg-fst.c v2.3 April '2000
@@ -14,6 +15,11 @@
#include <sys/cdefs.h>
#include <sys/types.h>
+#ifdef _KERNEL
+#include <sys/systm.h>
+#else
+#include <string.h>
+#endif
#include <crypto/rijndael/rijndael-alg-fst.h>
#include <crypto/rijndael/rijndael_local.h>
@@ -24,7 +30,11 @@ int rijndaelKeySched(word8 k[MAXKC][4], word8 W[MAXROUNDS+1][4][4], int ROUNDS)
* The number of calculations depends on keyBits and blockBits
*/
int j, r, t, rconpointer = 0;
- word8 tk[MAXKC][4];
+ union {
+ word8 x8[MAXKC][4];
+ word32 x32[MAXKC];
+ } xtk;
+#define tk xtk.x8
int KC = ROUNDS - 6;
for (j = KC-1; j >= 0; j--) {
@@ -79,6 +89,7 @@ int rijndaelKeySched(word8 k[MAXKC][4], word8 W[MAXROUNDS+1][4][4], int ROUNDS)
}
}
return 0;
+#undef tk
}
int rijndaelKeyEncToDec(word8 W[MAXROUNDS+1][4][4], int ROUNDS) {
@@ -120,9 +131,21 @@ int rijndaelKeyEncToDec(word8 W[MAXROUNDS+1][4][4], int ROUNDS) {
/**
* Encrypt a single block.
*/
-int rijndaelEncrypt(word8 a[16], word8 b[16], word8 rk[MAXROUNDS+1][4][4], int ROUNDS) {
+int rijndaelEncrypt(word8 in[16], word8 out[16], word8 rk[MAXROUNDS+1][4][4], int ROUNDS) {
int r;
- word8 temp[4][4];
+ union {
+ word8 x8[16];
+ word32 x32[4];
+ } xa, xb;
+#define a xa.x8
+#define b xb.x8
+ union {
+ word8 x8[4][4];
+ word32 x32[4];
+ } xtemp;
+#define temp xtemp.x8
+
+ memcpy(a, in, sizeof a);
*((word32*)temp[0]) = *((word32*)(a )) ^ *((word32*)rk[0][0]);
*((word32*)temp[1]) = *((word32*)(a+ 4)) ^ *((word32*)rk[0][1]);
@@ -193,7 +216,12 @@ int rijndaelEncrypt(word8 a[16], word8 b[16], word8 rk[MAXROUNDS+1][4][4], int R
*((word32*)(b+ 8)) ^= *((word32*)rk[ROUNDS][2]);
*((word32*)(b+12)) ^= *((word32*)rk[ROUNDS][3]);
+ memcpy(out, b, sizeof b /* XXX out */);
+
return 0;
+#undef a
+#undef b
+#undef temp
}
#ifdef INTERMEDIATE_VALUE_KAT
@@ -268,10 +296,22 @@ int rijndaelEncryptRound(word8 a[4][4], word8 rk[MAXROUNDS+1][4][4], int ROUNDS,
/**
* Decrypt a single block.
*/
-int rijndaelDecrypt(word8 a[16], word8 b[16], word8 rk[MAXROUNDS+1][4][4], int ROUNDS) {
+int rijndaelDecrypt(word8 in[16], word8 out[16], word8 rk[MAXROUNDS+1][4][4], int ROUNDS) {
int r;
- word8 temp[4][4];
+ union {
+ word8 x8[16];
+ word32 x32[4];
+ } xa, xb;
+#define a xa.x8
+#define b xb.x8
+ union {
+ word8 x8[4][4];
+ word32 x32[4];
+ } xtemp;
+#define temp xtemp.x8
+ memcpy(a, in, sizeof a);
+
*((word32*)temp[0]) = *((word32*)(a )) ^ *((word32*)rk[ROUNDS][0]);
*((word32*)temp[1]) = *((word32*)(a+ 4)) ^ *((word32*)rk[ROUNDS][1]);
*((word32*)temp[2]) = *((word32*)(a+ 8)) ^ *((word32*)rk[ROUNDS][2]);
@@ -341,7 +381,12 @@ int rijndaelDecrypt(word8 a[16], word8 b[16], word8 rk[MAXROUNDS+1][4][4], int R
*((word32*)(b+ 8)) ^= *((word32*)rk[0][2]);
*((word32*)(b+12)) ^= *((word32*)rk[0][3]);
+ memcpy(out, b, sizeof b /* XXX out */);
+
return 0;
+#undef a
+#undef b
+#undef temp
}
diff --git a/sys/crypto/rijndael/rijndael-alg-fst.h b/sys/crypto/rijndael/rijndael-alg-fst.h
index 6061bf4..5b22ef4c 100644
--- a/sys/crypto/rijndael/rijndael-alg-fst.h
+++ b/sys/crypto/rijndael/rijndael-alg-fst.h
@@ -1,4 +1,5 @@
-/* $KAME$ */
+/* $FreeBSD$ */
+/* $KAME: rijndael-alg-fst.h,v 1.4 2000/10/02 17:14:26 itojun Exp $ */
/*
* rijndael-alg-fst.h v2.3 April '2000
diff --git a/sys/crypto/rijndael/rijndael-api-fst.c b/sys/crypto/rijndael/rijndael-api-fst.c
index 1a2de50..1eec694 100644
--- a/sys/crypto/rijndael/rijndael-api-fst.c
+++ b/sys/crypto/rijndael/rijndael-api-fst.c
@@ -1,4 +1,5 @@
-/* $KAME: $ */
+/* $FreeBSD$ */
+/* $KAME: rijndael-api-fst.c,v 1.10 2001/05/27 09:34:18 itojun Exp $ */
/*
* rijndael-api-fst.c v2.3 April '2000
@@ -16,8 +17,12 @@
*/
#include <sys/param.h>
-#include <sys/systm.h>
#include <sys/types.h>
+#ifdef _KERNEL
+#include <sys/systm.h>
+#else
+#include <string.h>
+#endif
#include <crypto/rijndael/rijndael-alg-fst.h>
#include <crypto/rijndael/rijndael-api-fst.h>
#include <crypto/rijndael/rijndael_local.h>
@@ -44,36 +49,16 @@ int rijndael_makeKey(keyInstance *key, BYTE direction, int keyLen, char *keyMate
}
if (keyMaterial != NULL) {
- strncpy(key->keyMaterial, keyMaterial, keyLen/4);
+ bcopy(keyMaterial, key->keyMaterial, keyLen/8);
}
key->ROUNDS = keyLen/32 + 6;
/* initialize key schedule: */
keyMat = key->keyMaterial;
-#ifndef BINARY_KEY_MATERIAL
- for (i = 0; i < key->keyLen/8; i++) {
- int t, j;
-
- t = *keyMat++;
- if ((t >= '0') && (t <= '9')) j = (t - '0') << 4;
- else if ((t >= 'a') && (t <= 'f')) j = (t - 'a' + 10) << 4;
- else if ((t >= 'A') && (t <= 'F')) j = (t - 'A' + 10) << 4;
- else return BAD_KEY_MAT;
-
- t = *keyMat++;
- if ((t >= '0') && (t <= '9')) j ^= (t - '0');
- else if ((t >= 'a') && (t <= 'f')) j ^= (t - 'a' + 10);
- else if ((t >= 'A') && (t <= 'F')) j ^= (t - 'A' + 10);
- else return BAD_KEY_MAT;
-
- k[i >> 2][i & 3] = (word8)j;
- }
-#else
for (i = 0; i < key->keyLen/8; i++) {
k[i >> 2][i & 3] = (word8)keyMat[i];
}
-#endif /* ?BINARY_KEY_MATERIAL */
rijndaelKeySched(k, key->keySched, key->ROUNDS);
if (direction == DIR_DECRYPT) {
rijndaelKeyEncToDec(key->keySched, key->ROUNDS);
@@ -89,28 +74,7 @@ int rijndael_cipherInit(cipherInstance *cipher, BYTE mode, char *IV) {
return BAD_CIPHER_MODE;
}
if (IV != NULL) {
-#ifndef BINARY_KEY_MATERIAL
- int i;
- for (i = 0; i < MAX_IV_SIZE; i++) {
- int t, j;
-
- t = IV[2*i];
- if ((t >= '0') && (t <= '9')) j = (t - '0') << 4;
- else if ((t >= 'a') && (t <= 'f')) j = (t - 'a' + 10) << 4;
- else if ((t >= 'A') && (t <= 'F')) j = (t - 'A' + 10) << 4;
- else return BAD_CIPHER_INSTANCE;
-
- t = IV[2*i+1];
- if ((t >= '0') && (t <= '9')) j ^= (t - '0');
- else if ((t >= 'a') && (t <= 'f')) j ^= (t - 'a' + 10);
- else if ((t >= 'A') && (t <= 'F')) j ^= (t - 'A' + 10);
- else return BAD_CIPHER_INSTANCE;
-
- cipher->IV[i] = (word8)j;
- }
-#else
bcopy(IV, cipher->IV, MAX_IV_SIZE);
-#endif /* ?BINARY_KEY_MATERIAL */
} else {
bzero(cipher->IV, MAX_IV_SIZE);
}
diff --git a/sys/crypto/rijndael/rijndael-api-fst.h b/sys/crypto/rijndael/rijndael-api-fst.h
index c98f3f4..a4ab920 100644
--- a/sys/crypto/rijndael/rijndael-api-fst.h
+++ b/sys/crypto/rijndael/rijndael-api-fst.h
@@ -1,4 +1,5 @@
-/* $KAME$ */
+/* $FreeBSD$ */
+/* $KAME: rijndael-api-fst.h,v 1.6 2001/05/27 00:23:23 itojun Exp $ */
/*
* rijndael-api-fst.h v2.3 April '2000
@@ -55,7 +56,11 @@ typedef struct {
/* The following parameters are algorithm dependent, replace or add as necessary */
int ROUNDS; /* key-length-dependent number of rounds */
int blockLen; /* block length */
- u_int8_t keySched[RIJNDAEL_MAXROUNDS+1][4][4]; /* key schedule */
+ union {
+ u_int8_t xkS8[RIJNDAEL_MAXROUNDS+1][4][4]; /* key schedule */
+ u_int32_t xkS32[RIJNDAEL_MAXROUNDS+1][4]; /* key schedule */
+ } xKeySched;
+#define keySched xKeySched.xkS8
} keyInstance;
/* The structure for cipher information */
diff --git a/sys/crypto/rijndael/rijndael_local.h b/sys/crypto/rijndael/rijndael_local.h
index 23e909c..a959b1b 100644
--- a/sys/crypto/rijndael/rijndael_local.h
+++ b/sys/crypto/rijndael/rijndael_local.h
@@ -9,5 +9,3 @@ typedef u_int32_t word32;
#define MAXKC RIJNDAEL_MAXKC
#define MAXROUNDS RIJNDAEL_MAXROUNDS
-
-#define BINARY_KEY_MATERIAL 1
diff --git a/sys/crypto/sha1.c b/sys/crypto/sha1.c
index bbf20b8..b210b52 100644
--- a/sys/crypto/sha1.c
+++ b/sys/crypto/sha1.c
@@ -1,5 +1,5 @@
/* $FreeBSD$ */
-/* $KAME: sha1.c,v 1.4 2000/03/27 04:36:23 sumikawa Exp $ */
+/* $KAME: sha1.c,v 1.5 2000/11/08 06:13:08 itojun Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
diff --git a/sys/crypto/sha2/sha2.c b/sys/crypto/sha2/sha2.c
new file mode 100644
index 0000000..9b3a5c6
--- /dev/null
+++ b/sys/crypto/sha2/sha2.c
@@ -0,0 +1,1048 @@
+/* $FreeBSD$ */
+/* $KAME: sha2.c,v 1.6 2001/03/12 11:31:04 itojun Exp $ */
+
+/*
+ * sha2.c
+ *
+ * Version 1.0.0beta1
+ *
+ * Written by Aaron D. Gifford <me@aarongifford.com>
+ *
+ * Copyright 2000 Aaron D. Gifford. 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.
+ * 3. Neither the name of the copyright holder nor the names of contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) AND CONTRIBUTOR(S) ``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(S) OR CONTRIBUTOR(S) 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.
+ *
+ */
+
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/systm.h>
+#include <machine/endian.h>
+#include <crypto/sha2/sha2.h>
+
+/*
+ * ASSERT NOTE:
+ * Some sanity checking code is included using assert(). On my FreeBSD
+ * system, this additional code can be removed by compiling with NDEBUG
+ * defined. Check your own systems manpage on assert() to see how to
+ * compile WITHOUT the sanity checking code on your system.
+ *
+ * UNROLLED TRANSFORM LOOP NOTE:
+ * You can define SHA2_UNROLL_TRANSFORM to use the unrolled transform
+ * loop version for the hash transform rounds (defined using macros
+ * later in this file). Either define on the command line, for example:
+ *
+ * cc -DSHA2_UNROLL_TRANSFORM -o sha2 sha2.c sha2prog.c
+ *
+ * or define below:
+ *
+ * #define SHA2_UNROLL_TRANSFORM
+ *
+ */
+
+#if defined(__bsdi__) || defined(__FreeBSD__)
+#define assert(x)
+#endif
+
+
+/*** SHA-256/384/512 Machine Architecture Definitions *****************/
+/*
+ * BYTE_ORDER NOTE:
+ *
+ * Please make sure that your system defines BYTE_ORDER. If your
+ * architecture is little-endian, make sure it also defines
+ * LITTLE_ENDIAN and that the two (BYTE_ORDER and LITTLE_ENDIAN) are
+ * equivilent.
+ *
+ * If your system does not define the above, then you can do so by
+ * hand like this:
+ *
+ * #define LITTLE_ENDIAN 1234
+ * #define BIG_ENDIAN 4321
+ *
+ * And for little-endian machines, add:
+ *
+ * #define BYTE_ORDER LITTLE_ENDIAN
+ *
+ * Or for big-endian machines:
+ *
+ * #define BYTE_ORDER BIG_ENDIAN
+ *
+ * The FreeBSD machine this was written on defines BYTE_ORDER
+ * appropriately by including <sys/types.h> (which in turn includes
+ * <machine/endian.h> where the appropriate definitions are actually
+ * made).
+ */
+#if !defined(BYTE_ORDER) || (BYTE_ORDER != LITTLE_ENDIAN && BYTE_ORDER != BIG_ENDIAN)
+#error Define BYTE_ORDER to be equal to either LITTLE_ENDIAN or BIG_ENDIAN
+#endif
+
+/*
+ * Define the followingsha2_* types to types of the correct length on
+ * the native archtecture. Most BSD systems and Linux define u_intXX_t
+ * types. Machines with very recent ANSI C headers, can use the
+ * uintXX_t definintions from inttypes.h by defining SHA2_USE_INTTYPES_H
+ * during compile or in the sha.h header file.
+ *
+ * Machines that support neither u_intXX_t nor inttypes.h's uintXX_t
+ * will need to define these three typedefs below (and the appropriate
+ * ones in sha.h too) by hand according to their system architecture.
+ *
+ * Thank you, Jun-ichiro itojun Hagino, for suggesting using u_intXX_t
+ * types and pointing out recent ANSI C support for uintXX_t in inttypes.h.
+ */
+#if 0 /*def SHA2_USE_INTTYPES_H*/
+
+typedef uint8_t sha2_byte; /* Exactly 1 byte */
+typedef uint32_t sha2_word32; /* Exactly 4 bytes */
+typedef uint64_t sha2_word64; /* Exactly 8 bytes */
+
+#else /* SHA2_USE_INTTYPES_H */
+
+typedef u_int8_t sha2_byte; /* Exactly 1 byte */
+typedef u_int32_t sha2_word32; /* Exactly 4 bytes */
+typedef u_int64_t sha2_word64; /* Exactly 8 bytes */
+
+#endif /* SHA2_USE_INTTYPES_H */
+
+
+/*** SHA-256/384/512 Various Length Definitions ***********************/
+/* NOTE: Most of these are in sha2.h */
+#define SHA256_SHORT_BLOCK_LENGTH (SHA256_BLOCK_LENGTH - 8)
+#define SHA384_SHORT_BLOCK_LENGTH (SHA384_BLOCK_LENGTH - 16)
+#define SHA512_SHORT_BLOCK_LENGTH (SHA512_BLOCK_LENGTH - 16)
+
+
+/*** ENDIAN REVERSAL MACROS *******************************************/
+#if BYTE_ORDER == LITTLE_ENDIAN
+#define REVERSE32(w,x) { \
+ sha2_word32 tmp = (w); \
+ tmp = (tmp >> 16) | (tmp << 16); \
+ (x) = ((tmp & 0xff00ff00UL) >> 8) | ((tmp & 0x00ff00ffUL) << 8); \
+}
+#define REVERSE64(w,x) { \
+ sha2_word64 tmp = (w); \
+ tmp = (tmp >> 32) | (tmp << 32); \
+ tmp = ((tmp & 0xff00ff00ff00ff00ULL) >> 8) | \
+ ((tmp & 0x00ff00ff00ff00ffULL) << 8); \
+ (x) = ((tmp & 0xffff0000ffff0000ULL) >> 16) | \
+ ((tmp & 0x0000ffff0000ffffULL) << 16); \
+}
+#endif /* BYTE_ORDER == LITTLE_ENDIAN */
+
+/*
+ * Macro for incrementally adding the unsigned 64-bit integer n to the
+ * unsigned 128-bit integer (represented using a two-element array of
+ * 64-bit words):
+ */
+#define ADDINC128(w,n) { \
+ (w)[0] += (sha2_word64)(n); \
+ if ((w)[0] < (n)) { \
+ (w)[1]++; \
+ } \
+}
+
+/*** THE SIX LOGICAL FUNCTIONS ****************************************/
+/*
+ * Bit shifting and rotation (used by the six SHA-XYZ logical functions:
+ *
+ * NOTE: The naming of R and S appears backwards here (R is a SHIFT and
+ * S is a ROTATION) because the SHA-256/384/512 description document
+ * (see http://csrc.nist.gov/cryptval/shs/sha256-384-512.pdf) uses this
+ * same "backwards" definition.
+ */
+/* Shift-right (used in SHA-256, SHA-384, and SHA-512): */
+#define R(b,x) ((x) >> (b))
+/* 32-bit Rotate-right (used in SHA-256): */
+#define S32(b,x) (((x) >> (b)) | ((x) << (32 - (b))))
+/* 64-bit Rotate-right (used in SHA-384 and SHA-512): */
+#define S64(b,x) (((x) >> (b)) | ((x) << (64 - (b))))
+
+/* Two of six logical functions used in SHA-256, SHA-384, and SHA-512: */
+#define Ch(x,y,z) (((x) & (y)) ^ ((~(x)) & (z)))
+#define Maj(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
+
+/* Four of six logical functions used in SHA-256: */
+#define Sigma0_256(x) (S32(2, (x)) ^ S32(13, (x)) ^ S32(22, (x)))
+#define Sigma1_256(x) (S32(6, (x)) ^ S32(11, (x)) ^ S32(25, (x)))
+#define sigma0_256(x) (S32(7, (x)) ^ S32(18, (x)) ^ R(3 , (x)))
+#define sigma1_256(x) (S32(17, (x)) ^ S32(19, (x)) ^ R(10, (x)))
+
+/* Four of six logical functions used in SHA-384 and SHA-512: */
+#define Sigma0_512(x) (S64(28, (x)) ^ S64(34, (x)) ^ S64(39, (x)))
+#define Sigma1_512(x) (S64(14, (x)) ^ S64(18, (x)) ^ S64(41, (x)))
+#define sigma0_512(x) (S64( 1, (x)) ^ S64( 8, (x)) ^ R( 7, (x)))
+#define sigma1_512(x) (S64(19, (x)) ^ S64(61, (x)) ^ R( 6, (x)))
+
+/*** INTERNAL FUNCTION PROTOTYPES *************************************/
+/* NOTE: These should not be accessed directly from outside this
+ * library -- they are intended for private internal visibility/use
+ * only.
+ */
+void SHA512_Last(SHA512_CTX*);
+void SHA256_Transform(SHA256_CTX*, const sha2_word32*);
+void SHA512_Transform(SHA512_CTX*, const sha2_word64*);
+
+
+/*** SHA-XYZ INITIAL HASH VALUES AND CONSTANTS ************************/
+/* Hash constant words K for SHA-256: */
+const static sha2_word32 K256[64] = {
+ 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL,
+ 0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL,
+ 0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL,
+ 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL,
+ 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
+ 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL,
+ 0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL,
+ 0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL,
+ 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL,
+ 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
+ 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL,
+ 0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL,
+ 0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL,
+ 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL,
+ 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
+ 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
+};
+
+/* Initial hash value H for SHA-256: */
+const static sha2_word32 sha256_initial_hash_value[8] = {
+ 0x6a09e667UL,
+ 0xbb67ae85UL,
+ 0x3c6ef372UL,
+ 0xa54ff53aUL,
+ 0x510e527fUL,
+ 0x9b05688cUL,
+ 0x1f83d9abUL,
+ 0x5be0cd19UL
+};
+
+/* Hash constant words K for SHA-384 and SHA-512: */
+const static sha2_word64 K512[80] = {
+ 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL,
+ 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL,
+ 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL,
+ 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL,
+ 0xd807aa98a3030242ULL, 0x12835b0145706fbeULL,
+ 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL,
+ 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL,
+ 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL,
+ 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL,
+ 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL,
+ 0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL,
+ 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,
+ 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL,
+ 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL,
+ 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL,
+ 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL,
+ 0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL,
+ 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL,
+ 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL,
+ 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL,
+ 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL,
+ 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL,
+ 0xd192e819d6ef5218ULL, 0xd69906245565a910ULL,
+ 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,
+ 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL,
+ 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL,
+ 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL,
+ 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL,
+ 0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL,
+ 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL,
+ 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL,
+ 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL,
+ 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL,
+ 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL,
+ 0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL,
+ 0x113f9804bef90daeULL, 0x1b710b35131c471bULL,
+ 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL,
+ 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL,
+ 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL,
+ 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL
+};
+
+/* Initial hash value H for SHA-384 */
+const static sha2_word64 sha384_initial_hash_value[8] = {
+ 0xcbbb9d5dc1059ed8ULL,
+ 0x629a292a367cd507ULL,
+ 0x9159015a3070dd17ULL,
+ 0x152fecd8f70e5939ULL,
+ 0x67332667ffc00b31ULL,
+ 0x8eb44a8768581511ULL,
+ 0xdb0c2e0d64f98fa7ULL,
+ 0x47b5481dbefa4fa4ULL
+};
+
+/* Initial hash value H for SHA-512 */
+const static sha2_word64 sha512_initial_hash_value[8] = {
+ 0x6a09e667f3bcc908ULL,
+ 0xbb67ae8584caa73bULL,
+ 0x3c6ef372fe94f82bULL,
+ 0xa54ff53a5f1d36f1ULL,
+ 0x510e527fade682d1ULL,
+ 0x9b05688c2b3e6c1fULL,
+ 0x1f83d9abfb41bd6bULL,
+ 0x5be0cd19137e2179ULL
+};
+
+/*
+ * Constant used by SHA256/384/512_End() functions for converting the
+ * digest to a readable hexadecimal character string:
+ */
+static const char *sha2_hex_digits = "0123456789abcdef";
+
+
+/*** SHA-256: *********************************************************/
+void SHA256_Init(SHA256_CTX* context) {
+ if (context == (SHA256_CTX*)0) {
+ return;
+ }
+ bcopy(sha256_initial_hash_value, context->state, SHA256_DIGEST_LENGTH);
+ bzero(context->buffer, SHA256_BLOCK_LENGTH);
+ context->bitcount = 0;
+}
+
+#ifdef SHA2_UNROLL_TRANSFORM
+
+/* Unrolled SHA-256 round macros: */
+
+#if BYTE_ORDER == LITTLE_ENDIAN
+
+#define ROUND256_0_TO_15(a,b,c,d,e,f,g,h) \
+ REVERSE32(*data++, W256[j]); \
+ T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + \
+ K256[j] + W256[j]; \
+ (d) += T1; \
+ (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \
+ j++
+
+
+#else /* BYTE_ORDER == LITTLE_ENDIAN */
+
+#define ROUND256_0_TO_15(a,b,c,d,e,f,g,h) \
+ T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + \
+ K256[j] + (W256[j] = *data++); \
+ (d) += T1; \
+ (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \
+ j++
+
+#endif /* BYTE_ORDER == LITTLE_ENDIAN */
+
+#define ROUND256(a,b,c,d,e,f,g,h) \
+ s0 = W256[(j+1)&0x0f]; \
+ s0 = sigma0_256(s0); \
+ s1 = W256[(j+14)&0x0f]; \
+ s1 = sigma1_256(s1); \
+ T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + K256[j] + \
+ (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0); \
+ (d) += T1; \
+ (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \
+ j++
+
+void SHA256_Transform(SHA256_CTX* context, const sha2_word32* data) {
+ sha2_word32 a, b, c, d, e, f, g, h, s0, s1;
+ sha2_word32 T1, *W256;
+ int j;
+
+ W256 = (sha2_word32*)context->buffer;
+
+ /* Initialize registers with the prev. intermediate value */
+ a = context->state[0];
+ b = context->state[1];
+ c = context->state[2];
+ d = context->state[3];
+ e = context->state[4];
+ f = context->state[5];
+ g = context->state[6];
+ h = context->state[7];
+
+ j = 0;
+ do {
+ /* Rounds 0 to 15 (unrolled): */
+ ROUND256_0_TO_15(a,b,c,d,e,f,g,h);
+ ROUND256_0_TO_15(h,a,b,c,d,e,f,g);
+ ROUND256_0_TO_15(g,h,a,b,c,d,e,f);
+ ROUND256_0_TO_15(f,g,h,a,b,c,d,e);
+ ROUND256_0_TO_15(e,f,g,h,a,b,c,d);
+ ROUND256_0_TO_15(d,e,f,g,h,a,b,c);
+ ROUND256_0_TO_15(c,d,e,f,g,h,a,b);
+ ROUND256_0_TO_15(b,c,d,e,f,g,h,a);
+ } while (j < 16);
+
+ /* Now for the remaining rounds to 64: */
+ do {
+ ROUND256(a,b,c,d,e,f,g,h);
+ ROUND256(h,a,b,c,d,e,f,g);
+ ROUND256(g,h,a,b,c,d,e,f);
+ ROUND256(f,g,h,a,b,c,d,e);
+ ROUND256(e,f,g,h,a,b,c,d);
+ ROUND256(d,e,f,g,h,a,b,c);
+ ROUND256(c,d,e,f,g,h,a,b);
+ ROUND256(b,c,d,e,f,g,h,a);
+ } while (j < 64);
+
+ /* Compute the current intermediate hash value */
+ context->state[0] += a;
+ context->state[1] += b;
+ context->state[2] += c;
+ context->state[3] += d;
+ context->state[4] += e;
+ context->state[5] += f;
+ context->state[6] += g;
+ context->state[7] += h;
+
+ /* Clean up */
+ a = b = c = d = e = f = g = h = T1 = 0;
+}
+
+#else /* SHA2_UNROLL_TRANSFORM */
+
+void SHA256_Transform(SHA256_CTX* context, const sha2_word32* data) {
+ sha2_word32 a, b, c, d, e, f, g, h, s0, s1;
+ sha2_word32 T1, T2, *W256;
+ int j;
+
+ W256 = (sha2_word32*)context->buffer;
+
+ /* Initialize registers with the prev. intermediate value */
+ a = context->state[0];
+ b = context->state[1];
+ c = context->state[2];
+ d = context->state[3];
+ e = context->state[4];
+ f = context->state[5];
+ g = context->state[6];
+ h = context->state[7];
+
+ j = 0;
+ do {
+#if BYTE_ORDER == LITTLE_ENDIAN
+ /* Copy data while converting to host byte order */
+ REVERSE32(*data++,W256[j]);
+ /* Apply the SHA-256 compression function to update a..h */
+ T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + W256[j];
+#else /* BYTE_ORDER == LITTLE_ENDIAN */
+ /* Apply the SHA-256 compression function to update a..h with copy */
+ T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + (W256[j] = *data++);
+#endif /* BYTE_ORDER == LITTLE_ENDIAN */
+ T2 = Sigma0_256(a) + Maj(a, b, c);
+ h = g;
+ g = f;
+ f = e;
+ e = d + T1;
+ d = c;
+ c = b;
+ b = a;
+ a = T1 + T2;
+
+ j++;
+ } while (j < 16);
+
+ do {
+ /* Part of the message block expansion: */
+ s0 = W256[(j+1)&0x0f];
+ s0 = sigma0_256(s0);
+ s1 = W256[(j+14)&0x0f];
+ s1 = sigma1_256(s1);
+
+ /* Apply the SHA-256 compression function to update a..h */
+ T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] +
+ (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0);
+ T2 = Sigma0_256(a) + Maj(a, b, c);
+ h = g;
+ g = f;
+ f = e;
+ e = d + T1;
+ d = c;
+ c = b;
+ b = a;
+ a = T1 + T2;
+
+ j++;
+ } while (j < 64);
+
+ /* Compute the current intermediate hash value */
+ context->state[0] += a;
+ context->state[1] += b;
+ context->state[2] += c;
+ context->state[3] += d;
+ context->state[4] += e;
+ context->state[5] += f;
+ context->state[6] += g;
+ context->state[7] += h;
+
+ /* Clean up */
+ a = b = c = d = e = f = g = h = T1 = T2 = 0;
+}
+
+#endif /* SHA2_UNROLL_TRANSFORM */
+
+void SHA256_Update(SHA256_CTX* context, const sha2_byte *data, size_t len) {
+ unsigned int freespace, usedspace;
+
+ if (len == 0) {
+ /* Calling with no data is valid - we do nothing */
+ return;
+ }
+
+ /* Sanity check: */
+ assert(context != (SHA256_CTX*)0 && data != (sha2_byte*)0);
+
+ usedspace = (context->bitcount >> 3) % SHA256_BLOCK_LENGTH;
+ if (usedspace > 0) {
+ /* Calculate how much free space is available in the buffer */
+ freespace = SHA256_BLOCK_LENGTH - usedspace;
+
+ if (len >= freespace) {
+ /* Fill the buffer completely and process it */
+ bcopy(data, &context->buffer[usedspace], freespace);
+ context->bitcount += freespace << 3;
+ len -= freespace;
+ data += freespace;
+ SHA256_Transform(context, (sha2_word32*)context->buffer);
+ } else {
+ /* The buffer is not yet full */
+ bcopy(data, &context->buffer[usedspace], len);
+ context->bitcount += len << 3;
+ /* Clean up: */
+ usedspace = freespace = 0;
+ return;
+ }
+ }
+ while (len >= SHA256_BLOCK_LENGTH) {
+ /* Process as many complete blocks as we can */
+ SHA256_Transform(context, (sha2_word32*)data);
+ context->bitcount += SHA256_BLOCK_LENGTH << 3;
+ len -= SHA256_BLOCK_LENGTH;
+ data += SHA256_BLOCK_LENGTH;
+ }
+ if (len > 0) {
+ /* There's left-overs, so save 'em */
+ bcopy(data, context->buffer, len);
+ context->bitcount += len << 3;
+ }
+ /* Clean up: */
+ usedspace = freespace = 0;
+}
+
+void SHA256_Final(sha2_byte digest[], SHA256_CTX* context) {
+ sha2_word32 *d = (sha2_word32*)digest;
+ unsigned int usedspace;
+
+ /* Sanity check: */
+ assert(context != (SHA256_CTX*)0);
+
+ /* If no digest buffer is passed, we don't bother doing this: */
+ if (digest != (sha2_byte*)0) {
+ usedspace = (context->bitcount >> 3) % SHA256_BLOCK_LENGTH;
+#if BYTE_ORDER == LITTLE_ENDIAN
+ /* Convert FROM host byte order */
+ REVERSE64(context->bitcount,context->bitcount);
+#endif
+ if (usedspace > 0) {
+ /* Begin padding with a 1 bit: */
+ context->buffer[usedspace++] = 0x80;
+
+ if (usedspace < SHA256_SHORT_BLOCK_LENGTH) {
+ /* Set-up for the last transform: */
+ bzero(&context->buffer[usedspace], SHA256_SHORT_BLOCK_LENGTH - usedspace);
+ } else {
+ if (usedspace < SHA256_BLOCK_LENGTH) {
+ bzero(&context->buffer[usedspace], SHA256_BLOCK_LENGTH - usedspace);
+ }
+ /* Do second-to-last transform: */
+ SHA256_Transform(context, (sha2_word32*)context->buffer);
+
+ /* And set-up for the last transform: */
+ bzero(context->buffer, SHA256_SHORT_BLOCK_LENGTH);
+ }
+ } else {
+ /* Set-up for the last transform: */
+ bzero(context->buffer, SHA256_SHORT_BLOCK_LENGTH);
+
+ /* Begin padding with a 1 bit: */
+ *context->buffer = 0x80;
+ }
+ /* Set the bit count: */
+ *(sha2_word64*)&context->buffer[SHA256_SHORT_BLOCK_LENGTH] = context->bitcount;
+
+ /* Final transform: */
+ SHA256_Transform(context, (sha2_word32*)context->buffer);
+
+#if BYTE_ORDER == LITTLE_ENDIAN
+ {
+ /* Convert TO host byte order */
+ int j;
+ for (j = 0; j < 8; j++) {
+ REVERSE32(context->state[j],context->state[j]);
+ *d++ = context->state[j];
+ }
+ }
+#else
+ bcopy(context->state, d, SHA256_DIGEST_LENGTH);
+#endif
+ }
+
+ /* Clean up state data: */
+ bzero(context, sizeof(context));
+ usedspace = 0;
+}
+
+char *SHA256_End(SHA256_CTX* context, char buffer[]) {
+ sha2_byte digest[SHA256_DIGEST_LENGTH], *d = digest;
+ int i;
+
+ /* Sanity check: */
+ assert(context != (SHA256_CTX*)0);
+
+ if (buffer != (char*)0) {
+ SHA256_Final(digest, context);
+
+ for (i = 0; i < SHA256_DIGEST_LENGTH; i++) {
+ *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
+ *buffer++ = sha2_hex_digits[*d & 0x0f];
+ d++;
+ }
+ *buffer = (char)0;
+ } else {
+ bzero(context, sizeof(context));
+ }
+ bzero(digest, SHA256_DIGEST_LENGTH);
+ return buffer;
+}
+
+char* SHA256_Data(const sha2_byte* data, size_t len, char digest[SHA256_DIGEST_STRING_LENGTH]) {
+ SHA256_CTX context;
+
+ SHA256_Init(&context);
+ SHA256_Update(&context, data, len);
+ return SHA256_End(&context, digest);
+}
+
+
+/*** SHA-512: *********************************************************/
+void SHA512_Init(SHA512_CTX* context) {
+ if (context == (SHA512_CTX*)0) {
+ return;
+ }
+ bcopy(sha512_initial_hash_value, context->state, SHA512_DIGEST_LENGTH);
+ bzero(context->buffer, SHA512_BLOCK_LENGTH);
+ context->bitcount[0] = context->bitcount[1] = 0;
+}
+
+#ifdef SHA2_UNROLL_TRANSFORM
+
+/* Unrolled SHA-512 round macros: */
+#if BYTE_ORDER == LITTLE_ENDIAN
+
+#define ROUND512_0_TO_15(a,b,c,d,e,f,g,h) \
+ REVERSE64(*data++, W512[j]); \
+ T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + \
+ K512[j] + W512[j]; \
+ (d) += T1, \
+ (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)), \
+ j++
+
+
+#else /* BYTE_ORDER == LITTLE_ENDIAN */
+
+#define ROUND512_0_TO_15(a,b,c,d,e,f,g,h) \
+ T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + \
+ K512[j] + (W512[j] = *data++); \
+ (d) += T1; \
+ (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)); \
+ j++
+
+#endif /* BYTE_ORDER == LITTLE_ENDIAN */
+
+#define ROUND512(a,b,c,d,e,f,g,h) \
+ s0 = W512[(j+1)&0x0f]; \
+ s0 = sigma0_512(s0); \
+ s1 = W512[(j+14)&0x0f]; \
+ s1 = sigma1_512(s1); \
+ T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + K512[j] + \
+ (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0); \
+ (d) += T1; \
+ (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)); \
+ j++
+
+void SHA512_Transform(SHA512_CTX* context, const sha2_word64* data) {
+ sha2_word64 a, b, c, d, e, f, g, h, s0, s1;
+ sha2_word64 T1, *W512 = (sha2_word64*)context->buffer;
+ int j;
+
+ /* Initialize registers with the prev. intermediate value */
+ a = context->state[0];
+ b = context->state[1];
+ c = context->state[2];
+ d = context->state[3];
+ e = context->state[4];
+ f = context->state[5];
+ g = context->state[6];
+ h = context->state[7];
+
+ j = 0;
+ do {
+ ROUND512_0_TO_15(a,b,c,d,e,f,g,h);
+ ROUND512_0_TO_15(h,a,b,c,d,e,f,g);
+ ROUND512_0_TO_15(g,h,a,b,c,d,e,f);
+ ROUND512_0_TO_15(f,g,h,a,b,c,d,e);
+ ROUND512_0_TO_15(e,f,g,h,a,b,c,d);
+ ROUND512_0_TO_15(d,e,f,g,h,a,b,c);
+ ROUND512_0_TO_15(c,d,e,f,g,h,a,b);
+ ROUND512_0_TO_15(b,c,d,e,f,g,h,a);
+ } while (j < 16);
+
+ /* Now for the remaining rounds up to 79: */
+ do {
+ ROUND512(a,b,c,d,e,f,g,h);
+ ROUND512(h,a,b,c,d,e,f,g);
+ ROUND512(g,h,a,b,c,d,e,f);
+ ROUND512(f,g,h,a,b,c,d,e);
+ ROUND512(e,f,g,h,a,b,c,d);
+ ROUND512(d,e,f,g,h,a,b,c);
+ ROUND512(c,d,e,f,g,h,a,b);
+ ROUND512(b,c,d,e,f,g,h,a);
+ } while (j < 80);
+
+ /* Compute the current intermediate hash value */
+ context->state[0] += a;
+ context->state[1] += b;
+ context->state[2] += c;
+ context->state[3] += d;
+ context->state[4] += e;
+ context->state[5] += f;
+ context->state[6] += g;
+ context->state[7] += h;
+
+ /* Clean up */
+ a = b = c = d = e = f = g = h = T1 = 0;
+}
+
+#else /* SHA2_UNROLL_TRANSFORM */
+
+void SHA512_Transform(SHA512_CTX* context, const sha2_word64* data) {
+ sha2_word64 a, b, c, d, e, f, g, h, s0, s1;
+ sha2_word64 T1, T2, *W512 = (sha2_word64*)context->buffer;
+ int j;
+
+ /* Initialize registers with the prev. intermediate value */
+ a = context->state[0];
+ b = context->state[1];
+ c = context->state[2];
+ d = context->state[3];
+ e = context->state[4];
+ f = context->state[5];
+ g = context->state[6];
+ h = context->state[7];
+
+ j = 0;
+ do {
+#if BYTE_ORDER == LITTLE_ENDIAN
+ /* Convert TO host byte order */
+ REVERSE64(*data++, W512[j]);
+ /* Apply the SHA-512 compression function to update a..h */
+ T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + W512[j];
+#else /* BYTE_ORDER == LITTLE_ENDIAN */
+ /* Apply the SHA-512 compression function to update a..h with copy */
+ T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + (W512[j] = *data++);
+#endif /* BYTE_ORDER == LITTLE_ENDIAN */
+ T2 = Sigma0_512(a) + Maj(a, b, c);
+ h = g;
+ g = f;
+ f = e;
+ e = d + T1;
+ d = c;
+ c = b;
+ b = a;
+ a = T1 + T2;
+
+ j++;
+ } while (j < 16);
+
+ do {
+ /* Part of the message block expansion: */
+ s0 = W512[(j+1)&0x0f];
+ s0 = sigma0_512(s0);
+ s1 = W512[(j+14)&0x0f];
+ s1 = sigma1_512(s1);
+
+ /* Apply the SHA-512 compression function to update a..h */
+ T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] +
+ (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0);
+ T2 = Sigma0_512(a) + Maj(a, b, c);
+ h = g;
+ g = f;
+ f = e;
+ e = d + T1;
+ d = c;
+ c = b;
+ b = a;
+ a = T1 + T2;
+
+ j++;
+ } while (j < 80);
+
+ /* Compute the current intermediate hash value */
+ context->state[0] += a;
+ context->state[1] += b;
+ context->state[2] += c;
+ context->state[3] += d;
+ context->state[4] += e;
+ context->state[5] += f;
+ context->state[6] += g;
+ context->state[7] += h;
+
+ /* Clean up */
+ a = b = c = d = e = f = g = h = T1 = T2 = 0;
+}
+
+#endif /* SHA2_UNROLL_TRANSFORM */
+
+void SHA512_Update(SHA512_CTX* context, const sha2_byte *data, size_t len) {
+ unsigned int freespace, usedspace;
+
+ if (len == 0) {
+ /* Calling with no data is valid - we do nothing */
+ return;
+ }
+
+ /* Sanity check: */
+ assert(context != (SHA512_CTX*)0 && data != (sha2_byte*)0);
+
+ usedspace = (context->bitcount[0] >> 3) % SHA512_BLOCK_LENGTH;
+ if (usedspace > 0) {
+ /* Calculate how much free space is available in the buffer */
+ freespace = SHA512_BLOCK_LENGTH - usedspace;
+
+ if (len >= freespace) {
+ /* Fill the buffer completely and process it */
+ bcopy(data, &context->buffer[usedspace], freespace);
+ ADDINC128(context->bitcount, freespace << 3);
+ len -= freespace;
+ data += freespace;
+ SHA512_Transform(context, (sha2_word64*)context->buffer);
+ } else {
+ /* The buffer is not yet full */
+ bcopy(data, &context->buffer[usedspace], len);
+ ADDINC128(context->bitcount, len << 3);
+ /* Clean up: */
+ usedspace = freespace = 0;
+ return;
+ }
+ }
+ while (len >= SHA512_BLOCK_LENGTH) {
+ /* Process as many complete blocks as we can */
+ SHA512_Transform(context, (sha2_word64*)data);
+ ADDINC128(context->bitcount, SHA512_BLOCK_LENGTH << 3);
+ len -= SHA512_BLOCK_LENGTH;
+ data += SHA512_BLOCK_LENGTH;
+ }
+ if (len > 0) {
+ /* There's left-overs, so save 'em */
+ bcopy(data, context->buffer, len);
+ ADDINC128(context->bitcount, len << 3);
+ }
+ /* Clean up: */
+ usedspace = freespace = 0;
+}
+
+void SHA512_Last(SHA512_CTX* context) {
+ unsigned int usedspace;
+
+ usedspace = (context->bitcount[0] >> 3) % SHA512_BLOCK_LENGTH;
+#if BYTE_ORDER == LITTLE_ENDIAN
+ /* Convert FROM host byte order */
+ REVERSE64(context->bitcount[0],context->bitcount[0]);
+ REVERSE64(context->bitcount[1],context->bitcount[1]);
+#endif
+ if (usedspace > 0) {
+ /* Begin padding with a 1 bit: */
+ context->buffer[usedspace++] = 0x80;
+
+ if (usedspace < SHA512_SHORT_BLOCK_LENGTH) {
+ /* Set-up for the last transform: */
+ bzero(&context->buffer[usedspace], SHA512_SHORT_BLOCK_LENGTH - usedspace);
+ } else {
+ if (usedspace < SHA512_BLOCK_LENGTH) {
+ bzero(&context->buffer[usedspace], SHA512_BLOCK_LENGTH - usedspace);
+ }
+ /* Do second-to-last transform: */
+ SHA512_Transform(context, (sha2_word64*)context->buffer);
+
+ /* And set-up for the last transform: */
+ bzero(context->buffer, SHA512_BLOCK_LENGTH - 2);
+ }
+ } else {
+ /* Prepare for final transform: */
+ bzero(context->buffer, SHA512_SHORT_BLOCK_LENGTH);
+
+ /* Begin padding with a 1 bit: */
+ *context->buffer = 0x80;
+ }
+ /* Store the length of input data (in bits): */
+ *(sha2_word64*)&context->buffer[SHA512_SHORT_BLOCK_LENGTH] = context->bitcount[1];
+ *(sha2_word64*)&context->buffer[SHA512_SHORT_BLOCK_LENGTH+8] = context->bitcount[0];
+
+ /* Final transform: */
+ SHA512_Transform(context, (sha2_word64*)context->buffer);
+}
+
+void SHA512_Final(sha2_byte digest[], SHA512_CTX* context) {
+ sha2_word64 *d = (sha2_word64*)digest;
+
+ /* Sanity check: */
+ assert(context != (SHA512_CTX*)0);
+
+ /* If no digest buffer is passed, we don't bother doing this: */
+ if (digest != (sha2_byte*)0) {
+ SHA512_Last(context);
+
+ /* Save the hash data for output: */
+#if BYTE_ORDER == LITTLE_ENDIAN
+ {
+ /* Convert TO host byte order */
+ int j;
+ for (j = 0; j < 8; j++) {
+ REVERSE64(context->state[j],context->state[j]);
+ *d++ = context->state[j];
+ }
+ }
+#else
+ bcopy(context->state, d, SHA512_DIGEST_LENGTH);
+#endif
+ }
+
+ /* Zero out state data */
+ bzero(context, sizeof(context));
+}
+
+char *SHA512_End(SHA512_CTX* context, char buffer[]) {
+ sha2_byte digest[SHA512_DIGEST_LENGTH], *d = digest;
+ int i;
+
+ /* Sanity check: */
+ assert(context != (SHA512_CTX*)0);
+
+ if (buffer != (char*)0) {
+ SHA512_Final(digest, context);
+
+ for (i = 0; i < SHA512_DIGEST_LENGTH; i++) {
+ *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
+ *buffer++ = sha2_hex_digits[*d & 0x0f];
+ d++;
+ }
+ *buffer = (char)0;
+ } else {
+ bzero(context, sizeof(context));
+ }
+ bzero(digest, SHA512_DIGEST_LENGTH);
+ return buffer;
+}
+
+char* SHA512_Data(const sha2_byte* data, size_t len, char digest[SHA512_DIGEST_STRING_LENGTH]) {
+ SHA512_CTX context;
+
+ SHA512_Init(&context);
+ SHA512_Update(&context, data, len);
+ return SHA512_End(&context, digest);
+}
+
+
+/*** SHA-384: *********************************************************/
+void SHA384_Init(SHA384_CTX* context) {
+ if (context == (SHA384_CTX*)0) {
+ return;
+ }
+ bcopy(sha384_initial_hash_value, context->state, SHA512_DIGEST_LENGTH);
+ bzero(context->buffer, SHA384_BLOCK_LENGTH);
+ context->bitcount[0] = context->bitcount[1] = 0;
+}
+
+void SHA384_Update(SHA384_CTX* context, const sha2_byte* data, size_t len) {
+ SHA512_Update((SHA512_CTX*)context, data, len);
+}
+
+void SHA384_Final(sha2_byte digest[], SHA384_CTX* context) {
+ sha2_word64 *d = (sha2_word64*)digest;
+
+ /* Sanity check: */
+ assert(context != (SHA384_CTX*)0);
+
+ /* If no digest buffer is passed, we don't bother doing this: */
+ if (digest != (sha2_byte*)0) {
+ SHA512_Last((SHA512_CTX*)context);
+
+ /* Save the hash data for output: */
+#if BYTE_ORDER == LITTLE_ENDIAN
+ {
+ /* Convert TO host byte order */
+ int j;
+ for (j = 0; j < 6; j++) {
+ REVERSE64(context->state[j],context->state[j]);
+ *d++ = context->state[j];
+ }
+ }
+#else
+ bcopy(context->state, d, SHA384_DIGEST_LENGTH);
+#endif
+ }
+
+ /* Zero out state data */
+ bzero(context, sizeof(context));
+}
+
+char *SHA384_End(SHA384_CTX* context, char buffer[]) {
+ sha2_byte digest[SHA384_DIGEST_LENGTH], *d = digest;
+ int i;
+
+ /* Sanity check: */
+ assert(context != (SHA384_CTX*)0);
+
+ if (buffer != (char*)0) {
+ SHA384_Final(digest, context);
+
+ for (i = 0; i < SHA384_DIGEST_LENGTH; i++) {
+ *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
+ *buffer++ = sha2_hex_digits[*d & 0x0f];
+ d++;
+ }
+ *buffer = (char)0;
+ } else {
+ bzero(context, sizeof(context));
+ }
+ bzero(digest, SHA384_DIGEST_LENGTH);
+ return buffer;
+}
+
+char* SHA384_Data(const sha2_byte* data, size_t len, char digest[SHA384_DIGEST_STRING_LENGTH]) {
+ SHA384_CTX context;
+
+ SHA384_Init(&context);
+ SHA384_Update(&context, data, len);
+ return SHA384_End(&context, digest);
+}
+
diff --git a/sys/crypto/sha2/sha2.h b/sys/crypto/sha2/sha2.h
new file mode 100644
index 0000000..084faa7
--- /dev/null
+++ b/sys/crypto/sha2/sha2.h
@@ -0,0 +1,141 @@
+/* $FreeBSD$ */
+/* $KAME: sha2.h,v 1.3 2001/03/12 08:27:48 itojun Exp $ */
+
+/*
+ * sha2.h
+ *
+ * Version 1.0.0beta1
+ *
+ * Written by Aaron D. Gifford <me@aarongifford.com>
+ *
+ * Copyright 2000 Aaron D. Gifford. 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.
+ * 3. Neither the name of the copyright holder nor the names of contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) AND CONTRIBUTOR(S) ``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(S) OR CONTRIBUTOR(S) 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.
+ *
+ */
+
+#ifndef __SHA2_H__
+#define __SHA2_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*** SHA-256/384/512 Various Length Definitions ***********************/
+#define SHA256_BLOCK_LENGTH 64
+#define SHA256_DIGEST_LENGTH 32
+#define SHA256_DIGEST_STRING_LENGTH (SHA256_DIGEST_LENGTH * 2 + 1)
+#define SHA384_BLOCK_LENGTH 128
+#define SHA384_DIGEST_LENGTH 48
+#define SHA384_DIGEST_STRING_LENGTH (SHA384_DIGEST_LENGTH * 2 + 1)
+#define SHA512_BLOCK_LENGTH 128
+#define SHA512_DIGEST_LENGTH 64
+#define SHA512_DIGEST_STRING_LENGTH (SHA512_DIGEST_LENGTH * 2 + 1)
+
+
+/*** SHA-256/384/512 Context Structures *******************************/
+/* NOTE: If your architecture does not define either u_intXX_t types or
+ * uintXX_t (from inttypes.h), you may need to define things by hand
+ * for your system:
+ */
+#if 0
+typedef unsigned char u_int8_t; /* 1-byte (8-bits) */
+typedef unsigned int u_int32_t; /* 4-bytes (32-bits) */
+typedef unsigned long long u_int64_t; /* 8-bytes (64-bits) */
+#endif
+/*
+ * Most BSD systems already define u_intXX_t types, as does Linux.
+ * Some systems, however, like Compaq's Tru64 Unix instead can use
+ * uintXX_t types defined by very recent ANSI C standards and included
+ * in the file:
+ *
+ * #include <inttypes.h>
+ *
+ * If you choose to use <inttypes.h> then please define:
+ *
+ * #define SHA2_USE_INTTYPES_H
+ *
+ * Or on the command line during compile:
+ *
+ * cc -DSHA2_USE_INTTYPES_H ...
+ */
+#if 0 /*def SHA2_USE_INTTYPES_H*/
+
+typedef struct _SHA256_CTX {
+ uint32_t state[8];
+ uint64_t bitcount;
+ uint8_t buffer[SHA256_BLOCK_LENGTH];
+} SHA256_CTX;
+typedef struct _SHA512_CTX {
+ uint64_t state[8];
+ uint64_t bitcount[2];
+ uint8_t buffer[SHA512_BLOCK_LENGTH];
+} SHA512_CTX;
+
+#else /* SHA2_USE_INTTYPES_H */
+
+typedef struct _SHA256_CTX {
+ u_int32_t state[8];
+ u_int64_t bitcount;
+ u_int8_t buffer[SHA256_BLOCK_LENGTH];
+} SHA256_CTX;
+typedef struct _SHA512_CTX {
+ u_int64_t state[8];
+ u_int64_t bitcount[2];
+ u_int8_t buffer[SHA512_BLOCK_LENGTH];
+} SHA512_CTX;
+
+#endif /* SHA2_USE_INTTYPES_H */
+
+typedef SHA512_CTX SHA384_CTX;
+
+
+/*** SHA-256/384/512 Function Prototypes ******************************/
+
+void SHA256_Init __P((SHA256_CTX *));
+void SHA256_Update __P((SHA256_CTX*, const u_int8_t*, size_t));
+void SHA256_Final __P((u_int8_t[SHA256_DIGEST_LENGTH], SHA256_CTX*));
+char* SHA256_End __P((SHA256_CTX*, char[SHA256_DIGEST_STRING_LENGTH]));
+char* SHA256_Data __P((const u_int8_t*, size_t, char[SHA256_DIGEST_STRING_LENGTH]));
+
+void SHA384_Init __P((SHA384_CTX*));
+void SHA384_Update __P((SHA384_CTX*, const u_int8_t*, size_t));
+void SHA384_Final __P((u_int8_t[SHA384_DIGEST_LENGTH], SHA384_CTX*));
+char* SHA384_End __P((SHA384_CTX*, char[SHA384_DIGEST_STRING_LENGTH]));
+char* SHA384_Data __P((const u_int8_t*, size_t, char[SHA384_DIGEST_STRING_LENGTH]));
+
+void SHA512_Init __P((SHA512_CTX*));
+void SHA512_Update __P((SHA512_CTX*, const u_int8_t*, size_t));
+void SHA512_Final __P((u_int8_t[SHA512_DIGEST_LENGTH], SHA512_CTX*));
+char* SHA512_End __P((SHA512_CTX*, char[SHA512_DIGEST_STRING_LENGTH]));
+char* SHA512_Data __P((const u_int8_t*, size_t, char[SHA512_DIGEST_STRING_LENGTH]));
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __SHA2_H__ */
+
OpenPOWER on IntegriCloud