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