diff --git fwcutter_list.h fwcutter_list.h index c48bc6d..65c8671 100644 --- fwcutter_list.h +++ fwcutter_list.h @@ -238,7 +238,106 @@ static struct extract _2dd738b8feb8b3559fd9d8fbaf3bfffc[] = EXTRACT_LIST_END }; -/* +static struct extract _1a258b2d93efa641c32ddf3c3a962028[] = +{ + /* { .name = "ucode4", .offset = 0xAFE08, .type = EXT_UCODE_1, .length = 0x4EA0 }, */ + /* { .name = "pcm4", .offset = 0xE8FE0, .type = EXT_PCM, .length = 0x520 }, */ + /* { .name = "b0g0initvals4", .offset = 0xA2878, .type = EXT_IV, .length = 0xE80 }, */ + /* { .name = "a0g0bsinitvals4", .offset = 0xA45C0, .type = EXT_IV, .length = 0x30 }, */ + /* { .name = "b0g0bsinitvals4", .offset = 0xA3700, .type = EXT_IV, .length = 0x30 }, */ + /* { .name = "a0g0initvals4", .offset = 0xA3738, .type = EXT_IV, .length = 0xE80 }, */ + { .name = "ucode5", .offset = 0xB4CAC, .type = EXT_UCODE_2, .length = 0x56F0 }, + { .name = "pcm5", .offset = 0xE9504, .type = EXT_PCM, .length = 0x520 }, + { .name = "a0g0bsinitvals5", .offset = 0xA6578, .type = EXT_IV, .length = 0x118 }, + { .name = "b0g0bsinitvals5", .offset = 0xA5018, .type = EXT_IV, .length = 0x118 }, + { .name = "a0g0initvals5", .offset = 0xA5138, .type = EXT_IV, .length = 0xA18 }, + { .name = "a0g1initvals5", .offset = 0xA5B58, .type = EXT_IV, .length = 0xA18 }, + { .name = "b0g0initvals5", .offset = 0xA45F8, .type = EXT_IV, .length = 0xA18 }, + { .name = "a0g1bsinitvals5", .offset = 0xA6698, .type = EXT_IV, .length = 0x118 }, + { .name = "ucode9", .offset = 0xBA3A0, .type = EXT_UCODE_2, .length = 0x6248 }, + { .name = "a0g0bsinitvals9", .offset = 0xA89C0, .type = EXT_IV, .length = 0x118 }, + { .name = "b0g0initvals9", .offset = 0xA67B8, .type = EXT_IV, .length = 0xAF0 }, + { .name = "a0g1bsinitvals9", .offset = 0xA8AE0, .type = EXT_IV, .length = 0x118 }, + { .name = "b0g0bsinitvals9", .offset = 0xA72B0, .type = EXT_IV, .length = 0x118 }, + { .name = "a0g0initvals9", .offset = 0xA73D0, .type = EXT_IV, .length = 0xAF0 }, + { .name = "a0g1initvals9", .offset = 0xA7EC8, .type = EXT_IV, .length = 0xAF0 }, + { .name = "ucode11", .offset = 0xC05EC, .type = EXT_UCODE_2, .length = 0x8000 }, + { .name = "n0initvals11", .offset = 0xA8C00, .type = EXT_IV, .length = 0xBC8 }, + { .name = "n0bsinitvals11", .offset = 0xA97D0, .type = EXT_IV, .length = 0x118 }, + { .name = "n0absinitvals11", .offset = 0xA98F0, .type = EXT_IV, .length = 0x118 }, + { .name = "ucode13", .offset = 0xC85F0, .type = EXT_UCODE_2, .length = 0x7AC8 }, + { .name = "b0g0bsinitvals13", .offset = 0xABA70, .type = EXT_IV, .length = 0x118 }, + { .name = "b0g0initvals13", .offset = 0xAAED0, .type = EXT_IV, .length = 0xB98 }, + { .name = "a0g1bsinitvals13", .offset = 0xAC730, .type = EXT_IV, .length = 0x118 }, + { .name = "a0g1initvals13", .offset = 0xABB90, .type = EXT_IV, .length = 0xB98 }, + { .name = "lp0bsinitvals13", .offset = 0xAADB0, .type = EXT_IV, .length = 0x118 }, + { .name = "lp0initvals13", .offset = 0xA9A10, .type = EXT_IV, .length = 0x1398 }, + { .name = "ucode14", .offset = 0xD00BC, .type = EXT_UCODE_2, .length = 0x7910 }, + { .name = "lp0initvals14", .offset = 0xAC850, .type = EXT_IV, .length = 0xB80 }, + { .name = "lp0bsinitvals14", .offset = 0xAD3D8, .type = EXT_IV, .length = 0x118 }, + { .name = "ucode15", .offset = 0xD79D0, .type = EXT_UCODE_3, .length = 0x8768 }, + { .name = "lp0initvals15", .offset = 0xAD4F8, .type = EXT_IV, .length = 0xC68 }, + { .name = "lp0bsinitvals15", .offset = 0xAE168, .type = EXT_IV, .length = 0x118 }, + { .name = "ucode16", .offset = 0xE013C, .type = EXT_UCODE_3, .length = 0x8EA0 }, + { .name = "lp0bsinitvals16", .offset = 0xAFCE8, .type = EXT_IV, .length = 0x118 }, + { .name = "n0bsinitvals16", .offset = 0xAEF20, .type = EXT_IV, .length = 0x118 }, + { .name = "sslpn0initvals16", .offset = 0xAF040, .type = EXT_IV, .length = 0x0 }, + { .name = "n0initvals16", .offset = 0xAE288, .type = EXT_IV, .length = 0xC90 }, + { .name = "lp0initvals16", .offset = 0xAF050, .type = EXT_IV, .length = 0xC90 }, + { .name = "sslpn0bsinitvals16", .offset = 0xAF048, .type = EXT_IV, .length = 0x0 }, + EXTRACT_LIST_END +}; +static struct extract _bb8537e3204a1ea5903fe3e66b5e2763[] = +{ + /* ucode major version at offset 0xa8b70 */ + /* ucode minor version at offset 0xa8b74 */ + /* { .name = "ucode4", .offset = 0xB6108, .type = EXT_UCODE_1, .length = 0x4EA0 }, */ + /* { .name = "pcm4", .offset = 0xEF2E0, .type = EXT_PCM, .length = 0x520 }, */ + /* { .name = "b0g0initvals4", .offset = 0xA8B78, .type = EXT_IV, .length = 0xE80 }, */ + /* { .name = "a0g0bsinitvals4", .offset = 0xAA8C0, .type = EXT_IV, .length = 0x30 }, */ + /* { .name = "b0g0bsinitvals4", .offset = 0xA9A00, .type = EXT_IV, .length = 0x30 }, */ + /* { .name = "a0g0initvals4", .offset = 0xA9A38, .type = EXT_IV, .length = 0xE80 }, */ + { .name = "ucode5", .offset = 0xBAFAC, .type = EXT_UCODE_2, .length = 0x56F0 }, + { .name = "pcm5", .offset = 0xEF804, .type = EXT_PCM, .length = 0x520 }, + { .name = "b0g0bsinitvals5", .offset = 0xAB318, .type = EXT_IV, .length = 0x118 }, + { .name = "a0g0bsinitvals5", .offset = 0xAC878, .type = EXT_IV, .length = 0x118 }, + { .name = "b0g0initvals5", .offset = 0xAA8F8, .type = EXT_IV, .length = 0xA18 }, + { .name = "a0g1initvals5", .offset = 0xABE58, .type = EXT_IV, .length = 0xA18 }, + { .name = "a0g0initvals5", .offset = 0xAB438, .type = EXT_IV, .length = 0xA18 }, + { .name = "a0g1bsinitvals5", .offset = 0xAC998, .type = EXT_IV, .length = 0x118 }, + { .name = "ucode9", .offset = 0xC06A0, .type = EXT_UCODE_2, .length = 0x6248 }, + { .name = "a0g1initvals9", .offset = 0xAE1C8, .type = EXT_IV, .length = 0xAF0 }, + { .name = "a0g0bsinitvals9", .offset = 0xAECC0, .type = EXT_IV, .length = 0x118 }, + { .name = "b0g0bsinitvals9", .offset = 0xAD5B0, .type = EXT_IV, .length = 0x118 }, + { .name = "b0g0initvals9", .offset = 0xACAB8, .type = EXT_IV, .length = 0xAF0 }, + { .name = "a0g1bsinitvals9", .offset = 0xAEDE0, .type = EXT_IV, .length = 0x118 }, + { .name = "a0g0initvals9", .offset = 0xAD6D0, .type = EXT_IV, .length = 0xAF0 }, + { .name = "ucode11", .offset = 0xC68EC, .type = EXT_UCODE_2, .length = 0x8000 }, + { .name = "n0bsinitvals11", .offset = 0xAFAD0, .type = EXT_IV, .length = 0x118 }, + { .name = "n0absinitvals11", .offset = 0xAFBF0, .type = EXT_IV, .length = 0x118 }, + { .name = "n0initvals11", .offset = 0xAEF00, .type = EXT_IV, .length = 0xBC8 }, + { .name = "ucode13", .offset = 0xCE8F0, .type = EXT_UCODE_2, .length = 0x7AC8 }, + { .name = "b0g0initvals13", .offset = 0xB11D0, .type = EXT_IV, .length = 0xB98 }, + { .name = "a0g1bsinitvals13", .offset = 0xB2A30, .type = EXT_IV, .length = 0x118 }, + { .name = "a0g1initvals13", .offset = 0xB1E90, .type = EXT_IV, .length = 0xB98 }, + { .name = "lp0bsinitvals13", .offset = 0xB10B0, .type = EXT_IV, .length = 0x118 }, + { .name = "b0g0bsinitvals13", .offset = 0xB1D70, .type = EXT_IV, .length = 0x118 }, + { .name = "lp0initvals13", .offset = 0xAFD10, .type = EXT_IV, .length = 0x1398 }, + { .name = "ucode14", .offset = 0xD63BC, .type = EXT_UCODE_2, .length = 0x7910 }, + { .name = "lp0initvals14", .offset = 0xB2B50, .type = EXT_IV, .length = 0xB80 }, + { .name = "lp0bsinitvals14", .offset = 0xB36D8, .type = EXT_IV, .length = 0x118 }, + { .name = "ucode15", .offset = 0xDDCD0, .type = EXT_UCODE_3, .length = 0x8768 }, + { .name = "lp0bsinitvals15", .offset = 0xB4468, .type = EXT_IV, .length = 0x118 }, + { .name = "lp0initvals15", .offset = 0xB37F8, .type = EXT_IV, .length = 0xC68 }, + { .name = "ucode16", .offset = 0xE643C, .type = EXT_UCODE_3, .length = 0x8EA0 }, + { .name = "n0bsinitvals16", .offset = 0xB5220, .type = EXT_IV, .length = 0x118 }, + { .name = "sslpn0initvals16", .offset = 0xB5340, .type = EXT_IV, .length = 0x0 }, + { .name = "n0initvals16", .offset = 0xB4588, .type = EXT_IV, .length = 0xC90 }, + { .name = "lp0initvals16", .offset = 0xB5350, .type = EXT_IV, .length = 0xC90 }, + { .name = "sslpn0bsinitvals16", .offset = 0xB5348, .type = EXT_IV, .length = 0x0 }, + { .name = "lp0bsinitvals16", .offset = 0xB5FE8, .type = EXT_IV, .length = 0x118 }, + EXTRACT_LIST_END +};/* * Links change, so let's not put them into the README. * I still put them here so we know where the file was obtained. */ @@ -299,6 +398,24 @@ static const struct file files[] = .flags = FW_FLAG_LE | FW_FLAG_V4 | FW_FLAG_UNSUPPORTED, .extract = _2dd738b8feb8b3559fd9d8fbaf3bfffc, }, + { + /* ftp://downloads.netgear.com/files/GPL/WNDR3300-V1.0.29_gpl_src.zip */ + .name = "wl_apsta.o", + .id = "FW15", + .ucode_version = "478.104", + .md5 = "1a258b2d93efa641c32ddf3c3a962028", + .flags = FW_FLAG_LE | FW_FLAG_V4, + .extract = _1a258b2d93efa641c32ddf3c3a962028, + }, + { + /* http://downloads.openwrt.org/sources/broadcom-wl-4.178.10.4.tar.bz2 */ + .name = "wl_apsta.o", + .id = "FW15", + .ucode_version = "478.104", + .md5 = "bb8537e3204a1ea5903fe3e66b5e2763", + .flags = FW_FLAG_LE | FW_FLAG_V4, + .extract = _bb8537e3204a1ea5903fe3e66b5e2763, + }, }; #define FILES (sizeof(files) / sizeof(files[0])) diff --git fwcutter.c fwcutter.c index 5d5aa80..0d82806 100644 --- fwcutter.c +++ fwcutter.c @@ -462,10 +462,10 @@ static void print_supported_files(void) "\t" "\n\n"); /* print for legacy driver first */ - for (i = 0; i < FILES; i++) + for (i = 0; i < ARRAY_SIZE(files); i++) if (file_ok(&files[i]) && !(files[i].flags & FW_FLAG_V4)) print_file(&files[i]); - for (i = 0; i < FILES; i++) + for (i = 0; i < ARRAY_SIZE(files); i++) if (file_ok(&files[i]) && files[i].flags & FW_FLAG_V4) print_file(&files[i]); printf("\n"); @@ -491,7 +491,7 @@ static const struct file *find_file(FILE *fd) signature[8], signature[9], signature[10], signature[11], signature[12], signature[13], signature[14], signature[15]); - for (i = 0; i < FILES; ++i) { + for (i = 0; i < ARRAY_SIZE(files); i++) { if (file_ok(&files[i]) && strcasecmp(md5sig, files[i].md5) == 0) { printf("This file is recognised as:\n"); diff --git fwcutter.h fwcutter.h index ac2df63..4a887b6 100644 --- fwcutter.h +++ fwcutter.h @@ -9,6 +9,9 @@ #define fwcutter_stringify(x) fwcutter_stringify_1(x) #define FWCUTTER_VERSION fwcutter_stringify(FWCUTTER_VERSION_) +#undef ARRAY_SIZE +#define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0])) + typedef uint16_t be16_t; /* Big-endian 16bit */ typedef uint32_t be32_t; /* Big-endian 32bit */ diff --git fwcutter_list.h fwcutter_list.h index 65c8671..5175bbd 100644 --- fwcutter_list.h +++ fwcutter_list.h @@ -287,6 +287,7 @@ static struct extract _1a258b2d93efa641c32ddf3c3a962028[] = { .name = "sslpn0bsinitvals16", .offset = 0xAF048, .type = EXT_IV, .length = 0x0 }, EXTRACT_LIST_END }; + static struct extract _bb8537e3204a1ea5903fe3e66b5e2763[] = { /* ucode major version at offset 0xa8b70 */ @@ -337,7 +338,9 @@ static struct extract _bb8537e3204a1ea5903fe3e66b5e2763[] = { .name = "sslpn0bsinitvals16", .offset = 0xB5348, .type = EXT_IV, .length = 0x0 }, { .name = "lp0bsinitvals16", .offset = 0xB5FE8, .type = EXT_IV, .length = 0x118 }, EXTRACT_LIST_END -};/* +}; + +/* * Links change, so let's not put them into the README. * I still put them here so we know where the file was obtained. */ @@ -417,6 +420,3 @@ static const struct file files[] = .extract = _bb8537e3204a1ea5903fe3e66b5e2763, }, }; - -#define FILES (sizeof(files) / sizeof(files[0])) - diff --git Makefile Makefile index 2eb2e84..197ddef 100644 --- Makefile +++ Makefile @@ -1,34 +1,63 @@ VERSION = 012 -CC ?= cc -PREFIX ?= /usr/local -CFLAGS ?= -Os -fomit-frame-pointer -CFLAGS += -std=c99 -Wall -pedantic -D_BSD_SOURCE -LDFLAGS ?= +# The toolchain definitions +CC = cc +SPARSE = sparse + +V = @ # Verbose build: make V=1 +C = 0 # Sparsechecker build: make C=1 +Q = $(V:1=) +QUIET_CC = $(Q:@=@echo ' CC '$@;)$(CC) +QUIET_DEPEND = $(Q:@=@echo ' DEPEND '$@;)$(CC) +ifeq ($(C),1) +QUIET_SPARSE = $(Q:@=@echo ' SPARSE '$@;)$(SPARSE) +else +QUIET_SPARSE = @/bin/true +endif +PREFIX ?= /usr/local +CFLAGS ?= -Os -fomit-frame-pointer +CFLAGS += -std=c99 -Wall -pedantic -D_BSD_SOURCE +LDFLAGS ?= -OBJECTS = fwcutter.o md5.o +SRCS = fwcutter.c md5.c BIN = b43-fwcutter CFLAGS += -DFWCUTTER_VERSION_=$(VERSION) -all: $(BIN) +.SUFFIXES: +.PHONY: all install clean distclean +.DEFAULT_GOAL := all + +DEPS = $(sort $(patsubst %.c,dep/%.d,$(1))) +OBJS = $(sort $(patsubst %.c,obj/%.o,$(1))) -fwcutter.o: fwcutter.h fwcutter_list.h md5.h +# Generate dependencies +$(call DEPS,$(SRCS)): dep/%.d: %.c + @mkdir -p $(dir $@) + $(QUIET_DEPEND) -o $@.tmp -MM -MG -MT "$@ $(patsubst dep/%.d,obj/%.o,$@)" $(CFLAGS) $< && mv -f $@.tmp $@ -md5.o: md5.h +-include $(call DEPS,$(SRCS)) + +# Generate object files +$(call OBJS,$(SRCS)): obj/%.o: + @mkdir -p $(dir $@) + $(QUIET_SPARSE) $(SPARSEFLAGS) $< + $(QUIET_CC) -o $@ -c $(CFLAGS) $< + +all: $(BIN) -$(BIN): $(OBJECTS) - $(CC) $(CFLAGS) -o $(BIN) $(OBJECTS) $(LDFLAGS) +$(BIN): $(call OBJS,$(SRCS)) + $(QUIET_CC) $(CFLAGS) -o $(BIN) $(call OBJS,$(SRCS)) $(LDFLAGS) install: all - -install -d -o 0 -g 0 -m 755 $(PREFIX)/bin/ - -install -o 0 -g 0 -m 755 $(BIN) $(PREFIX)/bin/ - -install -d -o 0 -g 0 -m 755 $(PREFIX)/man/man1/ - -install -o 0 -g 0 -m 644 $(BIN).1 $(PREFIX)/man/man1/ + install -d $(PREFIX)/bin/ + install $(BIN) $(PREFIX)/bin/ + install -d $(PREFIX)/share/man/man1/ + install -m 444 $(BIN).1 $(PREFIX)/share/man/man1/ clean: - -rm -f *.o $(BIN) + -rm -Rf obj dep *.orig *.rej *~ distclean: clean - -rm -f *.fw *.orig *.rej *~ + -rm -f *.fw $(BIN)