On Tue, Jun 11, 2019 at 03:47:45PM +0200, Ard Biesheuvel wrote:
>
> -void ieee80211_wep_free(struct ieee80211_local *local)
> -{
> - if (!IS_ERR(local->wep_tx_tfm))
> - crypto_free_cipher(local->wep_tx_tfm);
> - if (!IS_ERR(local->wep_rx_tfm))
> - crypto_free_cipher(local->wep_rx_tfm);
> -}
> -
This function was removed, but its declaration in net/mac80211/wep.h was not.
> static inline bool ieee80211_wep_weak_iv(u32 iv, int keylen)
> {
> /*
> @@ -131,21 +110,16 @@ static void ieee80211_wep_remove_iv(struct
> ieee80211_local *local,
> /* Perform WEP encryption using given key. data buffer must have tailroom
> * for 4-byte ICV. data_len must not include this ICV. Note: this function
> * does _not_ add IV. data = RC4(data | CRC32(data)) */
> -int ieee80211_wep_encrypt_data(struct crypto_cipher *tfm, u8 *rc4key,
> +int ieee80211_wep_encrypt_data(struct arc4_ctx *ctx, u8 *rc4key,
> size_t klen, u8 *data, size_t data_len)
> {
> __le32 icv;
> - int i;
> -
> - if (IS_ERR(tfm))
> - return -1;
>
> icv = cpu_to_le32(~crc32_le(~0, data, data_len));
> put_unaligned(icv, (__le32 *)(data + data_len));
>
> - crypto_cipher_setkey(tfm, rc4key, klen);
> - for (i = 0; i < data_len + IEEE80211_WEP_ICV_LEN; i++)
> - crypto_cipher_encrypt_one(tfm, data + i, data + i);
> + arc4_setkey(ctx, rc4key, klen);
> + arc4_crypt(ctx, data, data, data_len + IEEE80211_WEP_ICV_LEN);
How about adding:
memzero_explicit(ctx, sizeof(*ctx));
> -int ieee80211_wep_decrypt_data(struct crypto_cipher *tfm, u8 *rc4key,
> +int ieee80211_wep_decrypt_data(struct arc4_ctx *ctx, u8 *rc4key,
> size_t klen, u8 *data, size_t data_len)
> {
> __le32 crc;
> - int i;
> -
> - if (IS_ERR(tfm))
> - return -1;
>
> - crypto_cipher_setkey(tfm, rc4key, klen);
> - for (i = 0; i < data_len + IEEE80211_WEP_ICV_LEN; i++)
> - crypto_cipher_decrypt_one(tfm, data + i, data + i);
> + arc4_setkey(ctx, rc4key, klen);
> + arc4_crypt(ctx, data, data, data_len + IEEE80211_WEP_ICV_LEN);
Same here.
- Eric