r4704 - in developers/werner/wep: . tests

werner at docs.openmoko.org werner at docs.openmoko.org
Wed Oct 8 07:09:19 CEST 2008


Author: werner
Date: 2008-10-08 07:09:09 +0200 (Wed, 08 Oct 2008)
New Revision: 4704

Added:
   developers/werner/wep/tests/Common
   developers/werner/wep/tests/empty
   developers/werner/wep/tests/index
Modified:
   developers/werner/wep/Makefile
   developers/werner/wep/tests/foobar
   developers/werner/wep/wep.c
   developers/werner/wep/wepkey.c
   developers/werner/wep/wepkey.h
Log:
Lots of small cleanup.

- wepkey.c (wepkey_128, wepkey_64): also fail if the key index is out of range
  or if the key length is zero
- wepkey.c (wepkey_64): simplified the PRNG loops and avoided an ugly cast
- wep.c (dump): allow errors (-1) to be passed and report them
- wep.c (main, usage): accept key index as optional argument
- wep.c (main): reversed order of 64-bit and 128-bit invocation
- wepkey.h: added description of general purpose and the arguments
- Makefile: added dependencies
- Makefile (clean): it's $(OBJS), not $(WEPKEY)
- tests/foobar, tests/Common: separated test harness from test
- tests/index: test retrieval by index and error handling
- tests/empty: test handling of empty key string



Modified: developers/werner/wep/Makefile
===================================================================
--- developers/werner/wep/Makefile	2008-10-07 21:48:14 UTC (rev 4703)
+++ developers/werner/wep/Makefile	2008-10-08 05:09:09 UTC (rev 4704)
@@ -3,18 +3,26 @@
 
 OBJS=wep.o wepkey.o
 
-.PHONY:		all test tests clean spotless
+.PHONY:		all depend dep test tests clean spotless
 
 
 all:		wep
 
 wep:		$(OBJS)
 
+depend dep:
+		$(CPP) $(CFLAGS) -MM -MG *.c >.depend || \
+		  { rm -f .depend; exit 1; }
+
+ifeq (.depend,$(wildcard .depend))
+include .depend
+endif
+
 test tests:	wep
 		$(MAKE) -C tests
 
 clean:
-		rm -f $(WEPKEY)
+		rm -f $(OBJS) .depend
 
 spotless:	clean
 		rm -f wep

Added: developers/werner/wep/tests/Common
===================================================================
--- developers/werner/wep/tests/Common	                        (rev 0)
+++ developers/werner/wep/tests/Common	2008-10-08 05:09:09 UTC (rev 4704)
@@ -0,0 +1,27 @@
+fail()
+{
+    echo "$title:" FAILED 1>&2
+    exit 1
+}
+
+
+wep()
+{
+    title="$1"
+    shift
+    ../wep "$@" >_out 2>&1 || fail
+    diff -u - _out || fail
+    rm -f _out
+    echo "$title:" PASS 1>&2
+}
+
+
+wep_error()
+{
+    title="$1"
+    shift
+    ../wep "$@" >_out 2>&1 && fail
+    diff -u - _out || fail
+    rm -f _out
+    echo "$title:" PASS 1>&2
+}

Added: developers/werner/wep/tests/empty
===================================================================
--- developers/werner/wep/tests/empty	                        (rev 0)
+++ developers/werner/wep/tests/empty	2008-10-08 05:09:09 UTC (rev 4704)
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+. ./Common
+
+wep_error "Empty key string" "" <<EOF
+error
+EOF


Property changes on: developers/werner/wep/tests/empty
___________________________________________________________________
Name: svn:executable
   + *

Modified: developers/werner/wep/tests/foobar
===================================================================
--- developers/werner/wep/tests/foobar	2008-10-07 21:48:14 UTC (rev 4703)
+++ developers/werner/wep/tests/foobar	2008-10-08 05:09:09 UTC (rev 4704)
@@ -1,23 +1,14 @@
 #!/bin/sh
 
-fail()
-{
-    echo TEST FAILED 1>&2
-    exit 1
-}
+. ./Common
 
-
-../wep foobar >_out || fail
-diff -u - _out <<EOF || fail
-49d68437b1ffb0db3fdf2d4a93
-a240f0feabe487bfcb2cfdb05b
-0c81b0bfab27187ea7b5467c63
-80b0656e46bc81e0627a046701
+wep "Hash 'foobar'" foobar <<EOF
 a4beb3b8ec
 b697e900c8
 b5d2bb755b
 197ea2abe7
+49d68437b1ffb0db3fdf2d4a93
+a240f0feabe487bfcb2cfdb05b
+0c81b0bfab27187ea7b5467c63
+80b0656e46bc81e0627a046701
 EOF
-
-echo PASSED
-exit 0

Added: developers/werner/wep/tests/index
===================================================================
--- developers/werner/wep/tests/index	                        (rev 0)
+++ developers/werner/wep/tests/index	2008-10-08 05:09:09 UTC (rev 4704)
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+. ./Common
+
+wep "Select key index (2)" Test 2 <<EOF
+0e3171a65e
+716af1404abc3220568da0818d
+EOF
+
+wep "Select key index (3)" Test 3 <<EOF
+a04dd8af33
+ec3c15db839815f12e7fca8494
+EOF
+
+wep_error "Negative index" foo -1 <<EOF
+error
+EOF
+
+wep_error "Index too big" bar 5 <<EOF
+error
+EOF


Property changes on: developers/werner/wep/tests/index
___________________________________________________________________
Name: svn:executable
   + *

Modified: developers/werner/wep/wep.c
===================================================================
--- developers/werner/wep/wep.c	2008-10-07 21:48:14 UTC (rev 4703)
+++ developers/werner/wep/wep.c	2008-10-08 05:09:09 UTC (rev 4704)
@@ -18,10 +18,14 @@
 #include "wepkey.h"
 
 
-static void dump(void *buf, size_t len)
+static void dump(void *buf, ssize_t len)
 {
 	uint8_t *p;
 
+	if (len < 0) {
+		fprintf(stderr, "error\n");
+		exit(1);
+	}
 	for (p = buf; p != buf+len; p++)
 		printf("%02x", *p);
 	putchar('\n');
@@ -30,7 +34,7 @@
 
 static void usage(const char *name)
 {
-	fprintf(stderr, "usage: %s key_phrase\n", name);
+	fprintf(stderr, "usage: %s key_phrase [key_index]\n", name);
 	exit(1);
 }
 
@@ -38,13 +42,28 @@
 int main(int argc, char **argv)
 {
 	char buf[13];
-	int i;
+	int key_index;
 
-	if (argc != 2)
+	switch (argc) {
+	case 2:
+		for (key_index = 0; key_index != 4; key_index++)
+			dump(buf,
+			    wepkey_64(buf, sizeof(buf), argv[1], key_index));
+		for (key_index = 0; key_index != 4; key_index++)
+			dump(buf,
+			    wepkey_128(buf, sizeof(buf), argv[1], key_index));
+		break;
+	case 3:
+		/*
+		 * We intentionally don't sanitize this argument, so that we
+		 * can test the error handling in wepkey_*.
+		 */
+		key_index = atoi(argv[2]);
+		dump(buf, wepkey_64(buf, sizeof(buf), argv[1], key_index));
+		dump(buf, wepkey_128(buf, sizeof(buf), argv[1], key_index));
+		break;
+	default:
 		usage(*argv);
-	for (i = 0; i != 4; i++)
-		dump(buf, wepkey_128(buf, sizeof(buf), argv[1], i));
-	for (i = 0; i != 4; i++)
-		dump(buf, wepkey_64(buf, sizeof(buf), argv[1], i));
+	}
 	return 0;
 }

Modified: developers/werner/wep/wepkey.c
===================================================================
--- developers/werner/wep/wepkey.c	2008-10-07 21:48:14 UTC (rev 4703)
+++ developers/werner/wep/wepkey.c	2008-10-08 05:09:09 UTC (rev 4704)
@@ -37,7 +37,13 @@
 
 	if (size < WEPKEY_128_BYTES)
 		return -1;
+	if (n < 0 || n >= 4)
+		return -1;
+
 	len = strlen(in);
+	if (!len)
+		return -1;
+
 	for (i = 0; i != sizeof(buf); i++) {
 		j = i % (len+n*3);
 		buf[i] = j < len ? in[j] : extra[j-len];
@@ -52,24 +58,30 @@
 
 ssize_t wepkey_64(void *out, size_t size, const char *in, int n)
 {
-	int len, i, j;
+	int len, i;
 	uint32_t prn;
+	uint8_t *p;
 
 	if (size < WEPKEY_64_BYTES)
 		return -1;
+	if (n < 0 || n >= 4)
+		return -1;
+
+	len = strlen(in);
+	if (!len)
+		return -1;
+
 	prn = 0;
-	len = strlen(in);
 	for (i = 0; i != len; i++)
 		prn ^= ((uint8_t *) in)[i] << (8*(i & 3));
-	for (i = 0; i != n; i++)
-		for (j = 0; j != WEPKEY_64_BYTES; j++) {
-			prn *= 0x343fd;
-			prn += 0x269ec3;
-		}
-	for (i = 0; i != WEPKEY_64_BYTES; i++) {
+	for (i = 0; i != n*WEPKEY_64_BYTES; i++) {
 		prn *= 0x343fd;
 		prn += 0x269ec3;
-		((uint8_t *) out)[i] = prn >> 16;
 	}
+	for (p = out; p != out+WEPKEY_64_BYTES; p++) {
+		prn *= 0x343fd;
+		prn += 0x269ec3;
+		*p = prn >> 16;
+	}
 	return WEPKEY_64_BYTES;
 }

Modified: developers/werner/wep/wepkey.h
===================================================================
--- developers/werner/wep/wepkey.h	2008-10-07 21:48:14 UTC (rev 4703)
+++ developers/werner/wep/wepkey.h	2008-10-08 05:09:09 UTC (rev 4704)
@@ -11,6 +11,10 @@
  * version 2.1 of the License, or (at your option) any later version.
  */
 
+/*
+ * wpkey_64 and wepkey_128 implement the keyphrase hash algorithm found in many
+ * (but not all) common access points, including the Linksys WRT54G series.
+ */
 
 #ifndef WEPKEY_H
 #define WEPKEY_H
@@ -22,6 +26,11 @@
 #define WEPKEY_64_BYTES		5
 
 
+/*
+ * "size" is the size of the buffer at "out", in bytes. It has to be at least 5
+ * or 13 bytes, respectively. "n" is the key index, in the range 0...3.
+ */
+
 ssize_t wepkey_128(void *out, size_t size, const char *in, int n);
 ssize_t wepkey_64(void *out, size_t size, const char *in, int n);
 




More information about the commitlog mailing list