From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-lf1-f42.google.com (mail-lf1-f42.google.com [209.85.167.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AA65B4611CF for ; Wed, 15 Jul 2026 12:50:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.42 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784119828; cv=none; b=Y2lrxEkbWdbfCG2xpD7bjusWpSXByOJHPioladvWx4BbViwxQ/KZSBfUaO01BCJrngZFoIfBFQq3woDg87T559k2V1GatqY/L69aYa7ZzsdW5oPtVE1KSr0KYChY8mtIlujMLg3/CA5x8wxBgRw50+FD6HOGp11jCCMUkWqhvhU= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784119828; c=relaxed/simple; bh=NOu+QKY6jsX2LnO+iETScrif+QOXGjEILuQoLxRWFUs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Nvu2RPLER+o6BOnkTJxzI4+3Ir+HDMAzkxK3wESBCg/k67hx3UWvTVT2NEvW3+WooFOjdjpBEKIuyYrnfhVOagb1RjHSaWTpdn67Ynz+Id77x7okTAS7HlpGjsw0OA0sCvEx6W575cVkEykpnuEIQqo3SvtAVTyYG0rSAHu7ZrE= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=VmtnJHoq; arc=none smtp.client-ip=209.85.167.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="VmtnJHoq" Received: by mail-lf1-f42.google.com with SMTP id 2adb3069b0e04-5b00d1e7082so4097667e87.1 for ; Wed, 15 Jul 2026 05:50:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784119825; x=1784724625; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=ZEnR8SqaeKZjrKQV+NuifoqLhEKS4MdSPiq8mhVLsXU=; b=VmtnJHoqpmvd4f6reCEGDFzuwrr+1BF+yyieiVAqONwgo5NAnRQOpX72gty8F08wLq pvR2l1OAzvAQugJ6gbu29JpO5+Tad3KrH7//sJVic7zrNYS85Ag1v7ZDN6KBLUgZ6UiB R0yHukfD7FKxvQXSVfguKeYAZXEPq3eHLpQ9BHE4Vx7LBBNurtIDPzW0hCa6Lx/lIp7O z6p30jqeKD8UIAjvLTswrDS0Y8xfERr6ZMAzDkGcwWK6NkdnVRShGJEk6AGISZWoVoFV qpN6ukyIDF7sIp/JSQqyVGDc9Z3L433Rb9ukIjv9Tps9kIMVXaRuliEJ8+U4feuFgynX r0kg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784119825; x=1784724625; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=ZEnR8SqaeKZjrKQV+NuifoqLhEKS4MdSPiq8mhVLsXU=; b=L+KMsn4ePog9QF1H+UFbR51grspOKp2bdWCCDD0A+DCj9vd/bdSXlfOjhAujEYqrYt 5pSQJPIFgy0qMnhhf4n9UyZ6l2PySYsn8SezZeZU4phvBwWSdDKncmmCCV3lCpYtqqsW YObySMGV8K1Pe5HG++CHVMg7gIpqFYlwJEQSABgjqfvml2PdwEetxGNhX97nRcy0ORt7 EpqMIO1FeLEuQU/8jDcVQ3f+RUvn3F2N9G5Nba8h3P3ZcjEwMKLYlBHCmRBQn+U17yDp E3sAuEILBmcGsByaXGPIxX6AsSxsYILzGwhdGQFEYRRNwqFqGFl9wVuDikyJjC5QtpGX WqyA== X-Forwarded-Encrypted: i=1; AHgh+Ro4Frob5klCrBtviFLDogWLu/mR9ZMtEIdnFEQq5C65+cwChn9VleCV7lBCA4qwd/GBbrw2JCaB1WvS5gM=@vger.kernel.org X-Gm-Message-State: AOJu0Yx+LMo8VQoYp6+yLokEFAzANmB2sTRS3mV2e2rTjDOlHmNfPoFb GyTnDRJleye2u1q/2OFdcLZB9omBYF9x8qGvLhqy+5nha1WuSSMrKQRDk5lToSXJbZQ= X-Gm-Gg: AfdE7cl99YmXC0jBih/iwkl+BQBuZnbXu+SzGa1zIebqZVZ24aqNmMHthh42Zw9igBZ 3HjEEmeHnllBFhB29YYjwBZFc6Ns8EoynvWEvmFEGH1ZCVDXDjvLDBrgl6FExrWMCdiVYYoaVOi Y84aPjEfSUXrltRjHkyB+UyTc2E7cBP615psNkJ4drfL8DEqfKKKRkc5+iwh5l6F+7Z6xVD3wBU uHpPQZK9C3Lykxmso8bRozb+eCtU8ga5pXEOG659LGorA6Gwqb7ysiSP3u/4CPWeICTx/TM88Wn UnLyuqFm87NfnBJU4Gt+4CLEXpxz9/dMqREkeandl0i4Usu/W7BVHxUolSLV2DACI6zbsAETySm d+vVQ7jc+f1RoLi8jr7k4juOo+sHfSbgTvCnvdIiC9cBssWYm6PVwoAqD0kwHivXmNUXI6LGnmK RpJwCuilxR+y9fnLqYIzGYw8ne3FJAwOMSTGGqwzJ4/GUxum/G7VfNtCsJNqJHERq7nAX3++fOg Bb8GbkwNUjk4Q== X-Received: by 2002:a05:6512:3414:b0:5ae:bf95:38e7 with SMTP id 2adb3069b0e04-5b159b6abddmr1397925e87.10.1784119824588; Wed, 15 Jul 2026 05:50:24 -0700 (PDT) Received: from archlinux ([94.180.44.28]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5b022fac999sm3404042e87.55.2026.07.15.05.50.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 Jul 2026 05:50:24 -0700 (PDT) From: Arsenii Pashchenko To: Greg Kroah-Hartman Cc: linux-staging@lists.linux.dev, linux-kernel@vger.kernel.org, ulijg308@gmail.com Subject: [PATCH 12/61] staging: rtl8723bs: replace custom CMAC with kernel Crypto API helper Date: Wed, 15 Jul 2026 19:47:40 +0700 Message-ID: <20260715124829.90290-13-ulijg308@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260715124829.90290-1-ulijg308@gmail.com> References: <20260715124829.90290-1-ulijg308@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Introduce rtw_bip_cmac() as a wrapper around the kernel Crypto API "cmac(aes)" to handle 802.11w BIP MIC calculation. Convert both callers to use this new helper function. This allows complete removal of the custom, duplicated implementations of omac1_aes_128() and omac1_aes_128_vector(), along with the now unused gf_mulx() helper, significantly cleaning up the driver code. Signed-off-by: Arsenii Pashchenko --- drivers/staging/rtl8723bs/core/rtw_security.c | 114 +++--------------- drivers/staging/rtl8723bs/core/rtw_xmit.c | 3 +- .../staging/rtl8723bs/include/rtw_security.h | 2 +- 3 files changed, 18 insertions(+), 101 deletions(-) diff --git a/drivers/staging/rtl8723bs/core/rtw_security.c b/drivers/staging/rtl8723bs/core/rtw_security.c index 0cfd7734c..a4a4f0e6d 100644 --- a/drivers/staging/rtl8723bs/core/rtw_security.c +++ b/drivers/staging/rtl8723bs/core/rtw_security.c @@ -9,6 +9,7 @@ #include #include #include +#include static const char * const _security_type_str[] = { "N/A", @@ -1315,7 +1316,8 @@ u32 rtw_BIP_verify(struct adapter *padapter, u8 *precvframe) /* conscruct AAD, copy address 1 to address 3 */ memcpy(BIP_AAD + 2, &pwlanhdr->addrs, sizeof(pwlanhdr->addrs)); - if (omac1_aes_128(padapter->securitypriv.dot11wBIPKey[padapter->securitypriv.dot11wBIPKeyid].skey + if (rtw_bip_cmac( + padapter->securitypriv.dot11wBIPKey[padapter->securitypriv.dot11wBIPKeyid].skey , BIP_AAD, ori_len, mic)) goto BIP_exit; @@ -1335,109 +1337,23 @@ u32 rtw_BIP_verify(struct adapter *padapter, u8 *precvframe) return res; } -static void gf_mulx(u8 *pad) -{ - int i, carry; - - carry = pad[0] & 0x80; - for (i = 0; i < AES_BLOCK_SIZE - 1; i++) - pad[i] = (pad[i] << 1) | (pad[i + 1] >> 7); - pad[AES_BLOCK_SIZE - 1] <<= 1; - if (carry) - pad[AES_BLOCK_SIZE - 1] ^= 0x87; -} - -/** - * omac1_aes_128_vector - One-Key CBC MAC (OMAC1) hash with AES-128 - * @key: 128-bit key for the hash operation - * @num_elem: Number of elements in the data vector - * @addr: Pointers to the data areas - * @len: Lengths of the data blocks - * @mac: Buffer for MAC (128 bits, i.e., 16 bytes) - * Returns: 0 on success, -1 on failure - * - * This is a mode for using block cipher (AES in this case) for authentication. - * OMAC1 was standardized with the name CMAC by NIST in a Special Publication - * (SP) 800-38B. - */ -static int omac1_aes_128_vector(u8 *key, size_t num_elem, - u8 *addr[], size_t *len, u8 *mac) +int rtw_bip_cmac(u8 *key, u8 *data, size_t data_len, u8 *mac) { - struct aes_enckey aes; - u8 cbc[AES_BLOCK_SIZE], pad[AES_BLOCK_SIZE]; - u8 *pos, *end; - size_t i, e, left, total_len; - int ret; - - ret = aes_prepareenckey(&aes, key, 16); - if (ret) - return -1; - memset(cbc, 0, AES_BLOCK_SIZE); - - total_len = 0; - for (e = 0; e < num_elem; e++) - total_len += len[e]; - left = total_len; - - e = 0; - pos = addr[0]; - end = pos + len[0]; - - while (left >= AES_BLOCK_SIZE) { - for (i = 0; i < AES_BLOCK_SIZE; i++) { - cbc[i] ^= *pos++; - if (pos >= end) { - e++; - pos = addr[e]; - end = pos + len[e]; - } - } - if (left > AES_BLOCK_SIZE) - aes_encrypt(&aes, cbc, cbc); - left -= AES_BLOCK_SIZE; - } + struct crypto_shash *tfm; + int err; - memset(pad, 0, AES_BLOCK_SIZE); - aes_encrypt(&aes, pad, pad); - gf_mulx(pad); - - if (left || total_len == 0) { - for (i = 0; i < left; i++) { - cbc[i] ^= *pos++; - if (pos >= end) { - e++; - pos = addr[e]; - end = pos + len[e]; - } - } - cbc[left] ^= 0x80; - gf_mulx(pad); - } + tfm = crypto_alloc_shash("cmac(aes)", 0, 0); + if (IS_ERR(tfm)) + return PTR_ERR(tfm); - for (i = 0; i < AES_BLOCK_SIZE; i++) - pad[i] ^= cbc[i]; - aes_encrypt(&aes, pad, mac); - memzero_explicit(&aes, sizeof(aes)); - return 0; -} + err = crypto_shash_setkey(tfm, key, 16); + if (err) { + crypto_free_shash(tfm); + return err; + } -/** - * omac1_aes_128 - One-Key CBC MAC (OMAC1) hash with AES-128 (aka AES-CMAC) - * @key: 128-bit key for the hash operation - * @data: Data buffer for which a MAC is determined - * @data_len: Length of data buffer in bytes - * @mac: Buffer for MAC (128 bits, i.e., 16 bytes) - * Returns: 0 on success, -1 on failure - * - * This is a mode for using block cipher (AES in this case) for authentication. - * OMAC1 was standardized with the name CMAC by NIST in a Special Publication - * (SP) 800-38B. - * modify for CONFIG_IEEE80211W - */ -int omac1_aes_128(u8 *key, u8 *data, size_t data_len, u8 *mac) -{ - return omac1_aes_128_vector(key, 1, &data, &data_len, mac); + return crypto_shash_tfm_digest(tfm, data, data_len, mac); } /* Restore HW wep key setting according to key_mask */ diff --git a/drivers/staging/rtl8723bs/core/rtw_xmit.c b/drivers/staging/rtl8723bs/core/rtw_xmit.c index 444966c0d..fdda407c1 100644 --- a/drivers/staging/rtl8723bs/core/rtw_xmit.c +++ b/drivers/staging/rtl8723bs/core/rtw_xmit.c @@ -1283,7 +1283,8 @@ s32 rtw_mgmt_xmitframe_coalesce(struct adapter *padapter, struct sk_buff *pkt, s /* copy management fram body */ memcpy(BIP_AAD + BIP_AAD_SIZE, MGMT_body, frame_body_len); /* calculate mic */ - if (omac1_aes_128(padapter->securitypriv.dot11wBIPKey[padapter->securitypriv.dot11wBIPKeyid].skey + if (rtw_bip_cmac( + padapter->securitypriv.dot11wBIPKey[padapter->securitypriv.dot11wBIPKeyid].skey , BIP_AAD, BIP_AAD_SIZE + frame_body_len, mic)) goto xmitframe_coalesce_fail; diff --git a/drivers/staging/rtl8723bs/include/rtw_security.h b/drivers/staging/rtl8723bs/include/rtw_security.h index 32f6d3a5e..22eec2215 100644 --- a/drivers/staging/rtl8723bs/include/rtw_security.h +++ b/drivers/staging/rtl8723bs/include/rtw_security.h @@ -243,7 +243,7 @@ struct mic_data { * public domain by Tom St Denis. */ -int omac1_aes_128(u8 *key, u8 *data, size_t data_len, u8 *mac); +int rtw_bip_cmac(u8 *key, u8 *data, size_t data_len, u8 *mac); void rtw_secmicsetkey(struct mic_data *pmicdata, u8 *key); void rtw_secmicappendbyte(struct mic_data *pmicdata, u8 b); void rtw_secmicappend(struct mic_data *pmicdata, u8 *src, u32 nBytes); -- 2.55.0