From nobody Wed Jun 17 05:10:49 2026 Received: from mail-wm1-f46.google.com (mail-wm1-f46.google.com [209.85.128.46]) (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 DF3E82C15A9 for ; Wed, 22 Apr 2026 21:09:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776892192; cv=none; b=Ii6b+Z5SzQjmYT1JVm3wIu9yDbJHHjmU1Knr3vaR2LXb92cQJPTfbjDtYSaESZbAwRtG+AbWUggY6JBnru59rVk0+sRCojgErBs0OJbkrNsxk+BuwUp6rx3Al+tbFQTrsFnn/ZPdwsD4KcRISdDOJIQqorZUq2WixJInroVAeDs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776892192; c=relaxed/simple; bh=CWTfy5Lc1Yj5Iqo4EanzIFN6ZiyVeBIDFOhpC2O15bU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=j3aw7JTf8GFyAZVfa7aUAu/exbw4QMN/fVAWKLAyuqfDdT0/dHasQStEImSEXNcG9qdQxDmXuHv2mXm0UE3ACHoLrcVMnVLTgNQK5eW5MwQvmbVqhGk+iYlUorcgy25G4CTJlW2SyvN+OvLdCEwsRSsnOgSfw8LAl3iMmrEPXgQ= 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=dtd/8txd; arc=none smtp.client-ip=209.85.128.46 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="dtd/8txd" Received: by mail-wm1-f46.google.com with SMTP id 5b1f17b1804b1-488a8f97f6bso10996605e9.2 for ; Wed, 22 Apr 2026 14:09:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776892189; x=1777496989; 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; bh=clwVc7+iR/ZLUiHHguQE2LgazwMIBXludQgv/pgrOYk=; b=dtd/8txdlkNsRrEjM8IH7qLXdY741g+Lo8EQOjy4pLx6z5Eyrsl8YB944f9eSvdP3Z IjpiOmyuEgs9E6veGrZ5bvajcmzCNTDhvSxm511be2eLZcQDEofbGdrB0iIysLz9LoVn 1FVFrCc2fcCiGAIWtsEbSVo4cAmhJ4jcRuSXJa2uIjzXclDMRUF6442oGOybRRGEfs9g QG5NaIndInwc+f59FtfyiCbRj6lKr0sgaYezJ1sgEGNtbsPhisx4A1+MebhsszhjpGyu 3f4lMP/seNE8MzTkwfwwXubn8Zu3qTC/+cDLOobZvfi/Xf2JFqvvozjvV+C0hrv7z7eN 4g9Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776892189; x=1777496989; 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; bh=clwVc7+iR/ZLUiHHguQE2LgazwMIBXludQgv/pgrOYk=; b=bpRr1LXaMd9Z++4MjO10LHtGAlyDRkiuI0SHu6BF6c2ck1nAynjiMVOPCBAUPOGYjt M1fzH00yuy3CfiL7jhetI7Go7CNEJcr9HaK3UQZiY3p8R/pw4bS40gFeOvU002QLx2EA ls1/uatWejeaI1x1UGhfUJxhpXYxxUfEzJdOt6CWX2kuuPyEbkA9x5Qh7AnwFVW8hOXK WMbSMgdDawzdZ4ZFDqLHvcx8iUzdKfZRAhvq8zQaw8z8wY/kkH4+SRCNQ4ZQP1dLkM51 /L778/qwNCpnkO1n9CCKImgfoRhWSsENThp8DOcTW0UxL306FkfjihpKj+oj+/yJpEyC GsiA== X-Forwarded-Encrypted: i=1; AFNElJ8JJlHfrrK7v7YPUXIcZe4HDo3Xk7GhthVRtaRth2HCmpRyXkVMh8BMPgPen7TV1y9SZ+/G9+spHC/SkR8=@vger.kernel.org X-Gm-Message-State: AOJu0Yxlc/ITcZqOQ+rWvDG9sxR3/S1ff7lxtP8isnazk08/SguQX11O nowDZ0GiiHTCuPnXuAC1JAGcn0hrBD2BV4+L6JjzcprI5C1/gMBnus4L X-Gm-Gg: AeBDietG9hSyCtxvDkGi+PFX8mRGTyhbXB0hH32en9otmRhG7Kdy2ZaNw1v30RmIEd5 c2H7aCVkjhtNrorkOKsn0KoQ6vVgP+MU9nPFKmJ2jLN85VMcs1d6Xcp7Hks6cMOX6jMVlsR4Eyf XlCBUtoF160cGxhbUdJjDpHqq/ZVjXP4T4UYSsapUP5CMud2CLJPEMHJ2kJrRMpVZatCuqCxhbA 63oPDdLzWFvPUfFmNtgszDuM5n9vKNCreDUmWpwIgeQ/8UpL0PFeN9CaZ2CBtjnwqsGn5jFSKuS AJOxP0p85KVTT2OzxWQFRRlup9htnF/EBJUMAuNVQXfol/20lh3VO1CYvj82U0QNZuNveEY3TT+ 528S8yMiYyUMzvMDaS1T83gGP+73pIQgUYz8+2kB0iDCuTNA/ZlwPVaU52jOjOmMfUi98f+rL6n 7ZQlbRmcsAXy211Qnf8r0/dQ+fhEX6tecI6huaLvXixwxVxeMZKn5lEe57M7ZGDwimcJQQNLeqL S4ZB32wC5Xr X-Received: by 2002:a05:600c:1389:b0:486:b967:5c9b with SMTP id 5b1f17b1804b1-488fb75b9f8mr178126435e9.3.1776892189199; Wed, 22 Apr 2026 14:09:49 -0700 (PDT) Received: from menon.v.cablecom.net (84-74-0-139.dclient.hispeed.ch. [84.74.0.139]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-48a4b329542sm352469085e9.3.2026.04.22.14.09.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Apr 2026 14:09:48 -0700 (PDT) From: Lothar Rubusch To: herbert@gondor.apana.org.au, thorsten.blum@linux.dev, davem@davemloft.net, nicolas.ferre@microchip.com, alexandre.belloni@bootlin.com, claudiu.beznea@tuxon.dev, ardb@kernel.org, linusw@kernel.org Cc: linux-crypto@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, l.rubusch@gmail.com Subject: [PATCH v3 1/3] crypto: atmel-sha204a - fix memory leak at non-blocking RNG work_data Date: Wed, 22 Apr 2026 21:09:34 +0000 Message-Id: <20260422210936.20095-2-l.rubusch@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260422210936.20095-1-l.rubusch@gmail.com> References: <20260422210936.20095-1-l.rubusch@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: quoted-printable Content-Type: text/plain; charset="utf-8" The driver allocated memory for work_data in the non-blocking read path but never free'd it again. After first read-out the memory pointer seemed to be recycled and never was allocated again, due to some errors in the logic, so that the leak was not growing. Add kfree(work_data) in the completion callback on error. then add kfree(work_data) after the data is consumed in the subsequent read call. Finally ensure atomic_dec() is called only after the data has been consumed or an error occurred to prevent race conditions. Fixes: da001fb651b0 ("crypto: atmel-i2c - add support for SHA204A random nu= mber generator") Signed-off-by: Lothar Rubusch --- drivers/crypto/atmel-sha204a.c | 43 ++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/drivers/crypto/atmel-sha204a.c b/drivers/crypto/atmel-sha204a.c index dbb39ed0cea1..19720bdd446d 100644 --- a/drivers/crypto/atmel-sha204a.c +++ b/drivers/crypto/atmel-sha204a.c @@ -25,13 +25,17 @@ static void atmel_sha204a_rng_done(struct atmel_i2c_wor= k_data *work_data, struct atmel_i2c_client_priv *i2c_priv =3D work_data->ctx; struct hwrng *rng =3D areq; =20 - if (status) + if (status) { dev_warn_ratelimited(&i2c_priv->client->dev, "i2c transaction failed (%d)\n", status); + kfree(work_data); + rng->priv =3D 0; + atomic_dec(&i2c_priv->tfm_count); + return; + } =20 rng->priv =3D (unsigned long)work_data; - atomic_dec(&i2c_priv->tfm_count); } =20 static int atmel_sha204a_rng_read_nonblocking(struct hwrng *rng, void *dat= a, @@ -42,31 +46,36 @@ static int atmel_sha204a_rng_read_nonblocking(struct hw= rng *rng, void *data, =20 i2c_priv =3D container_of(rng, struct atmel_i2c_client_priv, hwrng); =20 - /* keep maximum 1 asynchronous read in flight at any time */ - if (!atomic_add_unless(&i2c_priv->tfm_count, 1, 1)) - return 0; - + /* Verify if data available from last run */ if (rng->priv) { work_data =3D (struct atmel_i2c_work_data *)rng->priv; max =3D min(sizeof(work_data->cmd.data), max); memcpy(data, &work_data->cmd.data, max); - rng->priv =3D 0; - } else { - work_data =3D kmalloc_obj(*work_data, GFP_ATOMIC); - if (!work_data) { - atomic_dec(&i2c_priv->tfm_count); - return -ENOMEM; - } - work_data->ctx =3D i2c_priv; - work_data->client =3D i2c_priv->client; =20 - max =3D 0; + /* Now, free memory */ + kfree(work_data); + rng->priv =3D 0; + atomic_dec(&i2c_priv->tfm_count); + return max; } =20 + /* When a request is still in-flight but not processed */ + if (atomic_read(&i2c_priv->tfm_count) > 0) + return 0; + + /* Start a new request */ + work_data =3D kmalloc_obj(*work_data, GFP_ATOMIC); + if (!work_data) + return -ENOMEM; + + atomic_inc(&i2c_priv->tfm_count); + work_data->ctx =3D i2c_priv; + work_data->client =3D i2c_priv->client; + atmel_i2c_init_random_cmd(&work_data->cmd); atmel_i2c_enqueue(work_data, atmel_sha204a_rng_done, rng); =20 - return max; + return 0; } =20 static int atmel_sha204a_rng_read(struct hwrng *rng, void *data, size_t ma= x, --=20 2.53.0 From nobody Wed Jun 17 05:10:49 2026 Received: from mail-wm1-f54.google.com (mail-wm1-f54.google.com [209.85.128.54]) (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 41B423659FF for ; Wed, 22 Apr 2026 21:09:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776892195; cv=none; b=aKnhJB1YueEsZyH8J8q7IuLo/JBEPF1iucxAFYlWXx1+jGOrCPijZd8yKklUBJRvwUspjl8Z0e9/zryx2VCoVVBgCc4tHzfcIc1RquTITD9YCr/D2j6v1+OlkUUfTbbanrBQavdip+HUyuwKRhAgM85JB9vBCucTiXlij2quMYM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776892195; c=relaxed/simple; bh=ZMoydrc7o7FmKlzETkRm5Lk1yNUKiQmCgwkgRQfgdqM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=s9rZGYsDrlhPqH/HommhO6N3TYGvFDSwBfguWwvDYjdC6hCgjnk3qMnxvsqTt5HfJPNeT6rF6mkrsEm+9+EhceOCiHQ+qZpa7SkH7Mofgfj7ZN2Ly8Rp9TkMHLLoaKrTW0F0QAwK+bCCgvgpBPKch/djwOn4G7vRzrNeNT1qnIc= 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=qU7afEuA; arc=none smtp.client-ip=209.85.128.54 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="qU7afEuA" Received: by mail-wm1-f54.google.com with SMTP id 5b1f17b1804b1-4891b02a0acso4465255e9.3 for ; Wed, 22 Apr 2026 14:09:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776892190; x=1777496990; 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; bh=oFbIAxTdzhK2l/tqKW0C6io62S5s+Mdv160kLRimrJs=; b=qU7afEuAXwkANkmwYluTJGrMIGGjUlyJZh1b6L4a/jg1QBl26MPAa95/zWLqVvYe9k ZtzSkkH/G/EJ0xMjIJyret08HmG1HB5fvUlSydYFl3keGXVcxl8vaZwAsMvos8DkijmI B9vy+9yPFi4nr2pmlT/hRuCiviw8rX/QZ751odpLlMuiQ/jKSDtJIzfXZIbIrewpDrmk GyUn9DoQDTzHeUdG3SmrmOZnj0NP/4uOhWvly7PEZA5bw7v/FFVWu8mEp6xGRLsNtou0 hYjaxFFVdi7tDMd4hCFcJ9LNBWTCK0a2R7ROe4B/sYKzthhd6LoEareDa2nM95Lyfczl DcSA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776892190; x=1777496990; 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; bh=oFbIAxTdzhK2l/tqKW0C6io62S5s+Mdv160kLRimrJs=; b=b3xYS9Qpi+Sad2tQyazdUUHhBRApSsSbhdbCQMlHygdqGE7lckuEuoQc3MXxbkTIEh 9iI02yOzpgRBzxi8WacV3tUY+uLmhFxhxR8GEDI0wEJo3kB3zy15ZD5MdChPgBc+Lagv zZZTESXX1E11wL2b25YB6Wvt49tp8RhXFmEWdNwhrkFf2ZopmA9dY530ab0e9SDnL8PQ hRSenNNVFR5GOhzlzQlfNS7N4y/W3RYOxpqWNQK24WgzTibiXjcJIwo8UQITOxk7Eg7z aRQqvDMvRbPB4SDBqLs6VVw0sC50O3RwV1h4URcrroQlvn+pGh/WIbdiGQMbblWcYWuB u2qw== X-Forwarded-Encrypted: i=1; AFNElJ8bvPU5EheNSLL1fYfFKoPkDeU1iH5qRhrg8QHNzpZND7wojQkA9ha98pOa3A1AZyc3KNQBAS8Ep7wFLOk=@vger.kernel.org X-Gm-Message-State: AOJu0Ywou+Ehaq2iQaxvOGAoSA63nqcxSwGXNCC8se2V8m1qxDClBfA7 +04vaCIY3GBU9RS6HaFgV29DxCN6HMLwfNHW38j/oCCQowSV2yfd2sjW X-Gm-Gg: AeBDievQXTVVmPKaheb1mvYqdEvUys8SyxJ+/XznVafCSEQeCkZdyOBphgkFDEvhyXx BUu+c44xxaUv9ZaTZX5rzO0Hrk4yV+FKTSx4QUXf2RkLnw7oSYBXZKwMPGde6xgAjAP+r2hms5u ky4UXMIX40MahydOMI4gHP2YVFN1FmUbOIea/7gLQzeD4GZwajcQZxGeb/7k7/puQ5xxVfRhIVo uVwe9F/dqYqDKew26+UyIj7cxsX1NhwXgoHhy9fhQYA+gWyHocAe7jnBCTJpxCJKxhpWN6ltoOC +ZKJb4qDcVEskfoaWIeaP9OJQk8HRUB55ZjcaS0EEjqDgPihhSBdyWbCTKb8xSHWDUpvAE058Mz UwrA0vAMgOci/zMJ0YnpFUSUQei+GmrqyDPUZeNSi4PwzWdPFv+QMepo070QALMZlislrRf7Bqq o25EpKjCPmVZcmEeghPIDxKtT8Q07fIwv9VKXgsXgEMlHnAwGsEVCF/XJ4up8Fkgcyijdf4tMRD bMn7YYguCVn X-Received: by 2002:a05:600c:314c:b0:48a:5664:f44a with SMTP id 5b1f17b1804b1-48a56650076mr69908225e9.2.1776892190398; Wed, 22 Apr 2026 14:09:50 -0700 (PDT) Received: from menon.v.cablecom.net (84-74-0-139.dclient.hispeed.ch. [84.74.0.139]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-48a4b329542sm352469085e9.3.2026.04.22.14.09.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Apr 2026 14:09:49 -0700 (PDT) From: Lothar Rubusch To: herbert@gondor.apana.org.au, thorsten.blum@linux.dev, davem@davemloft.net, nicolas.ferre@microchip.com, alexandre.belloni@bootlin.com, claudiu.beznea@tuxon.dev, ardb@kernel.org, linusw@kernel.org Cc: linux-crypto@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, l.rubusch@gmail.com Subject: [PATCH v3 2/3] crypto: atmel-sha204a - fix truncated 32-byte blocking read Date: Wed, 22 Apr 2026 21:09:35 +0000 Message-Id: <20260422210936.20095-3-l.rubusch@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260422210936.20095-1-l.rubusch@gmail.com> References: <20260422210936.20095-1-l.rubusch@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: quoted-printable Content-Type: text/plain; charset="utf-8" The ATSHA204A returns a 35-byte packet consisting of a 1-byte count, 32 bytes of entropy, and a 2-byte CRC. The current blocking read implementation was incorrectly copying data starting from the count byte, leading to offset data and truncated entropy. Additionally, the chip requires significant execution time to generate random numbers, going by the datasheet. Reading the I2C bus too early results in the chip NACK-ing or returning a partial buffer followed by zeros. Verification: Tests before showed repeadetly reading only 8 bytes of entropy: $ head -c 32 /dev/hwrng | hexdump -C 00000000 02 28 85 b3 47 40 f2 ee 00 00 00 00 00 00 00 00 |.(..G@........= ..| 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |..............= ..| 00000020 After this patch applied, the result will be as follows: $ head -c 32 /dev/hwrng | hexdump -C 00000000 5a fc 3f 13 14 68 fe 06 68 0a bd 04 83 6e 09 69 |Z.?..h..h....n= .i| 00000010 75 ff cf 87 10 84 3b c9 c1 df ae eb 45 53 4c c3 |u.....;.....ES= L.| 00000020 Fix these issues by: Increase cmd.msecs to 30ms to provide sufficient execution time. Then set cmd.rxsize to RANDOM_RSP_SIZE (35 bytes) to capture the entire hardware response. Eventually, correct the memcpy() offset to index 1 of the data buffer to skip the count byte and retrieve exactly 32 bytes of entropy. Fixes: da001fb651b0 ("crypto: atmel-i2c - add support for SHA204A random nu= mber generator") Signed-off-by: Lothar Rubusch --- drivers/crypto/atmel-sha204a.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/drivers/crypto/atmel-sha204a.c b/drivers/crypto/atmel-sha204a.c index 19720bdd446d..f7dc00d0f4cd 100644 --- a/drivers/crypto/atmel-sha204a.c +++ b/drivers/crypto/atmel-sha204a.c @@ -19,6 +19,9 @@ #include #include "atmel-i2c.h" =20 +#define ATMEL_RNG_BLOCK_SIZE 32 +#define ATMEL_RNG_EXEC_TIME 30 + static void atmel_sha204a_rng_done(struct atmel_i2c_work_data *work_data, void *areq, int status) { @@ -91,13 +94,15 @@ static int atmel_sha204a_rng_read(struct hwrng *rng, vo= id *data, size_t max, i2c_priv =3D container_of(rng, struct atmel_i2c_client_priv, hwrng); =20 atmel_i2c_init_random_cmd(&cmd); + cmd.msecs =3D ATMEL_RNG_EXEC_TIME; + cmd.rxsize =3D RANDOM_RSP_SIZE; =20 ret =3D atmel_i2c_send_receive(i2c_priv->client, &cmd); if (ret) return ret; =20 - max =3D min(sizeof(cmd.data), max); - memcpy(data, cmd.data, max); + max =3D min_t(size_t, ATMEL_RNG_BLOCK_SIZE, max); + memcpy(data, &cmd.data[1], max); =20 return max; } --=20 2.53.0 From nobody Wed Jun 17 05:10:49 2026 Received: from mail-wm1-f41.google.com (mail-wm1-f41.google.com [209.85.128.41]) (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 2FA1F36CDE0 for ; Wed, 22 Apr 2026 21:09:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776892206; cv=none; b=fLpCDY9tzkMSQaO0cXctWYXE7GUV7b5NGKrVZSxwAUhrSOYNlajfsDNA/PYcORUiMVmnijaNpkFayLnXH4PahnF4UY2md6GtxDBf58mv5GK/oZnHxPnnT2Tn3HamWmpNlLK0J/dmsdLgBYROUrQ3Sz8B+4YTywXOcxucfKu5SzU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776892206; c=relaxed/simple; bh=fPUaGhBV9y5Y+5CqPe9ESQSxmwi2xQpZVeZbeoJlQuE=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=K3AgbNV6CZqbx40NN85j9Yeq1/My6S3cwMCxQRpN5k4eYqRqTZnu9gXP4zkJHNeuZrL+JGcfFViPUltp9B77iesV+3DkQMSityy370GImz3fL1BrLBplQhxHGkMnVWRxu0rGoDlpicrL78sMY64nI0iZS/oyJrHxD1Ud6T1seEQ= 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=cL8BQ+LP; arc=none smtp.client-ip=209.85.128.41 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="cL8BQ+LP" Received: by mail-wm1-f41.google.com with SMTP id 5b1f17b1804b1-483708b697cso8624325e9.3 for ; Wed, 22 Apr 2026 14:09:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776892192; x=1777496992; 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; bh=qHDnqtZPzLje7acSFaV39CbG4kFW6b0D4B/rafiqA78=; b=cL8BQ+LPcLC0EFK5+p5xvzMD4/8l6dPWKJ3kgmiMDMOAy6YJUWADOM+5GKA76z7hgl juaydtZmqKp+X47qbH7pLEYia62nTL/kHmdL4ANnUnQRIMH8iwL/pJlSIGUf3Fjo+QRP hsWlyprypIRmHagA3k5PYlFZIXRfqD9jsXDqPItmjrGGmBKm0sulG+fdmyAqKC8tG3o9 YWx83GZPmpXsLyCNzPBQC1DUCTM3a+wgZtTeX0FgspNHHEfW9wQWxkgYghNe48ZGUKzI 6bvDbYBAcnWlKhC04UJmXbwm3PtgHqI5cv7LG+f5gSAryWA9mSb2Gothu6fzhfMA4Ji6 c07A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776892192; x=1777496992; 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; bh=qHDnqtZPzLje7acSFaV39CbG4kFW6b0D4B/rafiqA78=; b=U6CW/rFp/Ee3nB9UwvJGH/G1FhSYtlludJwcD5csrS+Ww5IIw48Augqo4kWU/uPmrT BJpQQ+Wxy3xhxIVTi1s1Wl3KKOtuX3i5QAvrK6QuLuf3s/HIqBfmYm0MP7lJxEXSdpeB bPhD93MYvMF18JWmwJQ/sWgQJVX2jg1o0H6xtjuIhxpDBTVoA43RlP/NA1K7OVXooH1u wHJDp9PEPWiQ+3XHQwH/vEeowMA2dZlLAXLEz5ZOTN26CDM0vwloIZYuQDAHYkUvsevt 3qFL5oupT75dJBArCQPuDaj2o3LfQiMyIZixgaFBaB8kiDbBAtJtCnm1Cl50lwlNvoM3 jAgg== X-Forwarded-Encrypted: i=1; AFNElJ8Sv6pq9OGNNBpaI7Q/jsreWqu2liMiYTeLAxWUzbznwEzwlTRtH0NpWWuU+hi8E55TXXFjkUWp9LIeapw=@vger.kernel.org X-Gm-Message-State: AOJu0YziTXFLN8GRuN4BJnwzWn6T1ui9nvEGDroEaFVtIrJznilsYUWr 4HSqLtU6OmE0Vrwu6Aa8/w1YJ5Nv/4tOumt5JnbxHqGSWuezLHIzanCQ X-Gm-Gg: AeBDietPWi8DyMtrEpFC0XBm9XMqr/wakXvzw5T3v4To3xqVcQxicIypP7QvmU+6nAX iFve0C//YLJMEX1JzxPGv2yjMoBq59R81fCczGfmLdypj0pSoxl/wPJWQHgG++BcZqJX4sZcF/y KG0NYEqsKJQ5nto2LsbrBYLv43Cc6VK1p9AgSYwZbYpGDPtW9fCOxhZ4m0OeGEqEAr2v6OcbKVa Dv7EOJSFutf6pXbeIgPwkAmz4RibuOtWnZZqIxKVIgCpSEIPWKutXlAoMe1InyU87aoVEyV0spU Xr8BCPPvPfsoVj9KPbQmolJqZHb7IbvhmCsOEhl3BWp8LbDCgg1joaKfpo7MoKwhZqjyLqvgrlc tOQ5zqB/cjQL3+nPabkM652kMoTir0AwdGzOry1VPNvm34Ieu/g+kqur70pTrNWJBDS8VB6gD24 JIRP1tyZm6R8EVKT1HQs+mys7BVlWCtW3UECIyVjhQ8FsFYotptjsrrfmbUaIdWyWgci8JA1KGZ lFRRCDpm/Oz X-Received: by 2002:a05:600c:4ecb:b0:485:358b:e7ee with SMTP id 5b1f17b1804b1-488fb6e1addmr189465975e9.0.1776892191490; Wed, 22 Apr 2026 14:09:51 -0700 (PDT) Received: from menon.v.cablecom.net (84-74-0-139.dclient.hispeed.ch. [84.74.0.139]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-48a4b329542sm352469085e9.3.2026.04.22.14.09.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Apr 2026 14:09:51 -0700 (PDT) From: Lothar Rubusch To: herbert@gondor.apana.org.au, thorsten.blum@linux.dev, davem@davemloft.net, nicolas.ferre@microchip.com, alexandre.belloni@bootlin.com, claudiu.beznea@tuxon.dev, ardb@kernel.org, linusw@kernel.org Cc: linux-crypto@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, l.rubusch@gmail.com Subject: [PATCH v3 3/3] crypto: atmel-sha204a - fix non-blocking read logic Date: Wed, 22 Apr 2026 21:09:36 +0000 Message-Id: <20260422210936.20095-4-l.rubusch@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260422210936.20095-1-l.rubusch@gmail.com> References: <20260422210936.20095-1-l.rubusch@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: quoted-printable Content-Type: text/plain; charset="utf-8" The non-blocking path was (also) failing to provide valid entropy due to improper buffer management and a lack of hardware execution time. Ensure cmd.msecs (30ms) and cmd.rxsize (35ms) are initialized before enqueuing the background work. Fix the data offset to skip the 1-byte hardware count header when copying bits to the caller. Correctly return 0 (busy) to the hwrng core while hardware execution is in progress, preventing zero-filled buffers, which was the situation before. With this fix applied, tests will look similar to this: $ socat -u OPEN:/dev/hwrng,nonblock - | head -c 32 | hexdump -C 00000000 23 cc 42 3c 90 b1 38 fc 54 37 35 4b 09 c5 e1 0d |#.B<..8.T75K..= ..| 2026/03/23 14:30:18 socat[858] E read(5, 0x55be363000, 8192): Resource temp= orarily unavailable 00000010 73 3b af d9 02 70 76 bd 2d 59 4b 12 01 ac ae 2b |s;...pv.-YK...= .+| 00000020 Fixes: da001fb651b0 ("crypto: atmel-i2c - add support for SHA204A random nu= mber generator") Signed-off-by: Lothar Rubusch --- drivers/crypto/atmel-sha204a.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/drivers/crypto/atmel-sha204a.c b/drivers/crypto/atmel-sha204a.c index f7dc00d0f4cd..04cbf80c1411 100644 --- a/drivers/crypto/atmel-sha204a.c +++ b/drivers/crypto/atmel-sha204a.c @@ -33,7 +33,6 @@ static void atmel_sha204a_rng_done(struct atmel_i2c_work_= data *work_data, "i2c transaction failed (%d)\n", status); kfree(work_data); - rng->priv =3D 0; atomic_dec(&i2c_priv->tfm_count); return; } @@ -49,20 +48,19 @@ static int atmel_sha204a_rng_read_nonblocking(struct hw= rng *rng, void *data, =20 i2c_priv =3D container_of(rng, struct atmel_i2c_client_priv, hwrng); =20 - /* Verify if data available from last run */ if (rng->priv) { work_data =3D (struct atmel_i2c_work_data *)rng->priv; - max =3D min(sizeof(work_data->cmd.data), max); - memcpy(data, &work_data->cmd.data, max); + max =3D min_t(size_t, ATMEL_RNG_BLOCK_SIZE, max); + memcpy(data, &work_data->cmd.data[1], max); =20 - /* Now, free memory */ + /* Free memory and clear the in-flight flag */ kfree(work_data); rng->priv =3D 0; atomic_dec(&i2c_priv->tfm_count); return max; } =20 - /* When a request is still in-flight but not processed */ + /* If a request is still in-flight, return 0 (busy) */ if (atomic_read(&i2c_priv->tfm_count) > 0) return 0; =20 @@ -76,8 +74,14 @@ static int atmel_sha204a_rng_read_nonblocking(struct hwr= ng *rng, void *data, work_data->client =3D i2c_priv->client; =20 atmel_i2c_init_random_cmd(&work_data->cmd); + + /* Set the execution time for the RNG command (from datasheet) */ + work_data->cmd.msecs =3D ATMEL_RNG_EXEC_TIME; + work_data->cmd.rxsize =3D RANDOM_RSP_SIZE; + atmel_i2c_enqueue(work_data, atmel_sha204a_rng_done, rng); =20 + /* Return 0 to indicate 'busy', data will be ready on next call */ return 0; } =20 --=20 2.53.0