ieee80211_crypto_wep.c.svn-base

来自「最新之atheros芯片driver source code, 基于linux操」· SVN-BASE 代码 · 共 520 行 · 第 1/2 页

SVN-BASE
520
字号
	0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,	0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,	0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,	0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,	0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,	0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,	0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,	0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,	0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,	0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,	0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,	0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,	0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,	0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,	0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,	0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,	0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,	0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,	0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,	0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,	0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,	0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,	0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,	0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,	0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,	0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,	0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,	0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,	0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,	0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,	0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,	0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,	0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,	0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,	0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,	0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,	0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,	0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,	0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,	0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,	0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,	0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,	0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,	0x2d02ef8dL};static intwep_encrypt(struct ieee80211_key *key, struct sk_buff *skb0, int hdrlen){#define S_SWAP(a,b) do { uint8_t t = S[a]; S[a] = S[b]; S[b] = t; } while (0)	struct wep_ctx *ctx = key->wk_private;	struct ieee80211vap *vap = ctx->wc_vap;	struct sk_buff *skb = skb0;	u_int8_t rc4key[IEEE80211_WEP_IVLEN + IEEE80211_KEYBUF_SIZE];	uint8_t *icv;	uint32_t i, j, k, crc;	size_t buflen, data_len;	uint8_t S[256];	uint8_t *pos;	u_int off, keylen;	vap->iv_stats.is_crypto_wep++;	/* NB: this assumes the header was pulled up */	memcpy(rc4key, skb->data + hdrlen, IEEE80211_WEP_IVLEN);	memcpy(rc4key + IEEE80211_WEP_IVLEN, key->wk_key, key->wk_keylen);	/* Setup RC4 state */	for (i = 0; i < 256; i++)		S[i] = i;	j = 0;	keylen = key->wk_keylen + IEEE80211_WEP_IVLEN;	for (i = 0; i < 256; i++) {		j = (j + S[i] + rc4key[i % keylen]) & 0xff;		S_SWAP(i, j);	}	off = hdrlen + wep.ic_header;	data_len = skb->len - off;	/* Compute CRC32 over unencrypted data and apply RC4 to data */	crc = ~0;	i = j = 0;	pos = skb->data + off;	buflen = skb->len - off;	for (;;) {		if (buflen > data_len)			buflen = data_len;		data_len -= buflen;		for (k = 0; k < buflen; k++) {			crc = crc32_table[(crc ^ *pos) & 0xff] ^ (crc >> 8);			i = (i + 1) & 0xff;			j = (j + S[i]) & 0xff;			S_SWAP(i, j);			*pos++ ^= S[(S[i] + S[j]) & 0xff];		}		if (skb->next == NULL) {			if (data_len != 0) {		/* out of data */#ifdef IEEE80211_DEBUG				const struct ieee80211_frame *wh =				    (const struct ieee80211_frame *)skb0->data;#endif				IEEE80211_NOTE_MAC(vap, IEEE80211_MSG_CRYPTO,					wh->i_addr2,					"out of data for WEP (data_len %lu)",					(unsigned long) data_len);				return 0;			}			break;		}		skb = skb->next;		pos = skb->data;		buflen = skb->len;	}	crc = ~crc;	if (skb_tailroom(skb) < wep.ic_trailer) {#ifdef IEEE80211_DEBUG		const struct ieee80211_frame *wh =			(const struct ieee80211_frame *)skb0->data;#endif		/* NB: should not happen */		IEEE80211_NOTE_MAC(ctx->wc_vap, IEEE80211_MSG_CRYPTO,			wh->i_addr1, "no room for %s ICV, tailroom %u",			wep.ic_name, skb_tailroom(skb));		/* XXX statistic */		return 0;	}	/* Append little-endian CRC32 and encrypt it to produce ICV */	icv = skb_put(skb, IEEE80211_WEP_CRCLEN);	icv[0] = crc;	icv[1] = crc >> 8;	icv[2] = crc >> 16;	icv[3] = crc >> 24;	for (k = 0; k < IEEE80211_WEP_CRCLEN; k++) {		i = (i + 1) & 0xff;		j = (j + S[i]) & 0xff;		S_SWAP(i, j);		icv[k] ^= S[(S[i] + S[j]) & 0xff];	}	return 1;#undef S_SWAP}static intwep_decrypt(struct ieee80211_key *key, struct sk_buff *skb0, int hdrlen){#define S_SWAP(a,b) do { uint8_t t = S[a]; S[a] = S[b]; S[b] = t; } while (0)	struct wep_ctx *ctx = key->wk_private;	struct ieee80211vap *vap = ctx->wc_vap;	struct sk_buff *skb = skb0;	u_int8_t rc4key[IEEE80211_WEP_IVLEN + IEEE80211_KEYBUF_SIZE];	uint8_t icv[IEEE80211_WEP_CRCLEN];	uint32_t i, j, k, crc;	size_t buflen, data_len;	uint8_t S[256];	uint8_t *pos;	u_int off, keylen;	vap->iv_stats.is_crypto_wep++;	/* NB: this assumes the header was pulled up */	memcpy(rc4key, skb->data + hdrlen, IEEE80211_WEP_IVLEN);	memcpy(rc4key + IEEE80211_WEP_IVLEN, key->wk_key, key->wk_keylen);	/* Setup RC4 state */	for (i = 0; i < 256; i++)		S[i] = i;	j = 0;	keylen = key->wk_keylen + IEEE80211_WEP_IVLEN;	for (i = 0; i < 256; i++) {		j = (j + S[i] + rc4key[i % keylen]) & 0xff;		S_SWAP(i, j);	}	off = hdrlen + wep.ic_header;	data_len = skb->len - (off + wep.ic_trailer),	/* Compute CRC32 over unencrypted data and apply RC4 to data */	crc = ~0;	i = j = 0;	pos = skb->data + off;	buflen = skb->len - off;	for (;;) {		if (buflen > data_len)			buflen = data_len;		data_len -= buflen;		for (k = 0; k < buflen; k++) {			i = (i + 1) & 0xff;			j = (j + S[i]) & 0xff;			S_SWAP(i, j);			*pos ^= S[(S[i] + S[j]) & 0xff];			crc = crc32_table[(crc ^ *pos) & 0xff] ^ (crc >> 8);			pos++;		}		skb = skb->next;		if (skb == NULL) {			if (data_len != 0) {		/* out of data */#ifdef IEEE80211_DEBUG				const struct ieee80211_frame *wh =					(const struct ieee80211_frame *)skb0->data;#endif				IEEE80211_NOTE_MAC(vap, IEEE80211_MSG_CRYPTO,					wh->i_addr2,					"out of data for WEP (data_len %lu)",					(unsigned long) data_len);				return 0;			}			break;		}		pos = skb->data;		buflen = skb->len;	}	crc = ~crc;	/* Encrypt little-endian CRC32 and verify that it matches with	 * received ICV */	icv[0] = crc;	icv[1] = crc >> 8;	icv[2] = crc >> 16;	icv[3] = crc >> 24;	for (k = 0; k < IEEE80211_WEP_CRCLEN; k++) {		i = (i + 1) & 0xff;		j = (j + S[i]) & 0xff;		S_SWAP(i, j);		/* XXX assumes ICV is contiguous in sk_buf */		if ((icv[k] ^ S[(S[i] + S[j]) & 0xff]) != *pos++) {			/* ICV mismatch - drop frame */			return 0;		}	}	return 1;#undef S_SWAP}/* * Module glue. */MODULE_AUTHOR("Errno Consulting, Sam Leffler");MODULE_DESCRIPTION("802.11 wireless support: WEP cipher");#ifdef MODULE_LICENSEMODULE_LICENSE("Dual BSD/GPL");#endifstatic int __initinit_crypto_wep(void){	ieee80211_crypto_register(&wep);	return 0;}module_init(init_crypto_wep);static void __exitexit_crypto_wep(void){	ieee80211_crypto_unregister(&wep);}module_exit(exit_crypto_wep);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?