/*
 * Apple Airport WEP key generation
 *
 * gcc -o applewepkey applewepkey.c -lcrypto
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <openssl/md5.h>

extern char *__progname;

const unsigned char salt[] =
	"\x16\xeb\xad\x57\x0f\xf4\xe3\xde\x7d\x74\x72\xe8\xd2\xab\xa6\xa7";

int
main(argc, argv)
	int argc;
	char *argv[];
{
	unsigned char md[16];
	MD5_CTX c;
	int bits, i;

	if (argc != 3) {
		fprintf(stderr, "Usage: %s {-40|-104} <passphrase>\n", __progname);
		exit(0);
	}

	if (strcmp(argv[1], "-40")==0)
		bits=5;
	else if (strcmp(argv[1], "-104")==0)
		bits=13;
	else {
		fprintf(stderr, "WEP key must be 40 or 104 bits!\n");
		exit(-1);
	}

	MD5_Init(&c);
	MD5_Update(&c, argv[2], strlen(argv[2]));
	MD5_Update(&c, salt, 16);
	MD5_Final(md, &c);

	c.A=0; c.B=0; c.C=0; c.D=0; c.Nl=0; c.Nh=0; c.num=0;
	MD5_Update(&c, md, 16);
	MD5_Final(md, &c);

	c.A=0; c.B=0; c.C=0; c.D=0; c.Nl=0; c.Nh=0; c.num=0;
	MD5_Update(&c, md, 16);
	MD5_Final(md, &c);

	for(i=0; i<bits ;i++)
		printf("%.2x", md[i]);
	printf("\n");

	return 0;
}
