patch-2.4.23 linux-2.4.23/net/sctp/hashdriver.c

Next file: linux-2.4.23/net/sctp/input.c
Previous file: linux-2.4.23/net/sctp/endpointola.c
Back to the patch index
Back to the overall index

diff -urN linux-2.4.22/net/sctp/hashdriver.c linux-2.4.23/net/sctp/hashdriver.c
@@ -0,0 +1,128 @@
+/* SCTP reference Implementation Copyright (C) 1999 Cisco And Motorola
+ * 
+ * This file origiantes from Randy Stewart's SCTP reference Implementation.
+ * 
+ * The SCTP reference implementation is free software; 
+ * you can redistribute it and/or modify it under the terms of 
+ * the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ * 
+ * The SCTP reference implementation is distributed in the hope that it 
+ * will be useful, but WITHOUT ANY WARRANTY; without even the implied
+ *                 ************************
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with GNU CC; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.  
+ * 
+ * Please send any bug reports or fixes you make to the
+ * email address(es):
+ *    lksctp developers <lksctp-developers@lists.sourceforge.net>
+ * 
+ * Or submit a bug report through the following website:
+ *    http://www.sf.net/projects/lksctp
+ *
+ * Written or modified by: 
+ *    Randy Stewart  rstewar1@email.mot.com
+ *    Ken Morneau    kmorneau@cisco.com
+ *    Qiaobing Xie   qxie1@email.mot.com
+ * 
+ * Any bugs reported given to us we will try to fix... any fixes shared will
+ * be incorperated into the next SCTP release.
+ * 
+ * There are still LOTS of bugs in this code... I always run on the motto
+ * "it is a wonder any code ever works :)"
+ */
+
+#include <linux/types.h>
+#include <asm/string.h>
+#include <net/sctp/sctp.h>
+#include <net/sctp/sla1.h>
+
+/* SCTP Main driver.
+ * passing a two pointers and two lengths,
+ * returning a digest pointer filled. The md5 code
+ * was taken directly from the RFC (2104) so to understand it
+ * you may want to go look at the RFC referenced in the
+ * SCTP spec. We did modify this code to either user OUR
+ * implementation of SLA1 or the MD5 that comes from its
+ * RFC. SLA1 may have IPR issues so you need to check in
+ * to this if you wish to use it... Or at least that is
+ * what the FIP-180.1 web page says.
+ */
+
+void sctp_hash_digest(const char *key, const int in_key_len,
+		      const char *text, const int text_len,
+		      __u8 *digest)
+{
+	int key_len = in_key_len;
+	struct SLA_1_Context context;
+
+	__u8 k_ipad[65];	/* inner padding -
+				 * key XORd with ipad
+				 */
+	__u8 k_opad[65];	/* outer padding -
+				 * key XORd with opad
+				 */
+	__u8 tk[20];
+	int i;
+
+	/* if key is longer than 64 bytes reset it to key=MD5(key) */
+	if (key_len > 64) {
+		struct SLA_1_Context tctx;
+
+		SLA1_Init(&tctx);
+		SLA1_Process(&tctx, key, key_len);
+		SLA1_Final(&tctx,tk);
+		key = tk;
+		key_len = 20;
+        }
+
+	/*
+	 * the HMAC_MD5 transform looks like:
+	 *
+	 * MD5(K XOR opad, MD5(K XOR ipad, text))
+	 *
+	 * where K is an n byte key
+	 * ipad is the byte 0x36 repeated 64 times
+	 * opad is the byte 0x5c repeated 64 times
+	 * and text is the data being protected
+	 */
+
+	/* start out by storing key in pads */
+	memset(k_ipad, 0, sizeof k_ipad);
+	memset(k_opad, 0, sizeof k_opad);
+	memcpy(k_ipad, key, key_len);
+	memcpy(k_opad, key, key_len);
+
+	/* XOR key with ipad and opad values */
+	for (i = 0; i < 64; i++) {
+		k_ipad[i] ^= 0x36;
+		k_opad[i] ^= 0x5c;
+	}
+
+	/* perform inner hash */
+	SLA1_Init(&context);                     /* init context for 1st
+						  * pass
+						  */
+	SLA1_Process(&context, k_ipad, 64);      /* start with inner pad */
+	SLA1_Process(&context, text, text_len);  /* then text of datagram */
+	SLA1_Final(&context,digest);             /* finish up 1st pass */
+
+	/*
+         * perform outer hash
+         */
+	SLA1_Init(&context);                   /* init context for 2nd
+						* pass
+						*/
+	SLA1_Process(&context, k_opad, 64);     /* start with outer pad */
+	SLA1_Process(&context, digest, 20);     /* then results of 1st
+						 * hash
+						 */
+	SLA1_Final(&context, digest);          /* finish up 2nd pass */
+}
+

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)