From nobody Wed Apr 1 12:34:28 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 290DC258EC2 for ; Tue, 31 Mar 2026 08:21:19 +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=1774945280; cv=none; b=MWHkFD2rVoYMdc5Gij0CNM5Xkl24UBw23CQ/EYATwx5AMNYzfIpccJIS1lPcRozcBEoSzZQjcrXE7OH8WTXIAV0uISwQUAmINUlAIn6FM2NE7Nx0FbNviSIpG/sID443Ji7OA0M+wq3hIXWHbAV3C4aTGcLmT/6zqMxuojZlDVM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774945280; c=relaxed/simple; bh=8IgV1on/CYjRoqaNPKrhP/jyDrUspemaCDxzCZHev6c=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=QbtRvyXrIXVdva58N5HAfxol8JckmlFWUZyC3lTw6Ol66qvWmNe4cGGZXIMyvjXBfxBxk7vJMbONG1mwcLKj19azFqSLMQz91+o8zGr7iGGNIC7NeMI5yUMS5lcP/wvOFw4abt/xTva4d7BQNk4M0KFXDhYQQgEekH1a/ErWElI= 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=OVz/Y51f; 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="OVz/Y51f" Received: by mail-wm1-f54.google.com with SMTP id 5b1f17b1804b1-48371104ffdso8024565e9.1 for ; Tue, 31 Mar 2026 01:21:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774945278; x=1775550078; 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=ZlXweF85hjs0Cz7hgZ4Sc8jEj+2x0ePWSuvmjZUgVoc=; b=OVz/Y51fQxzM9AEi/DIJuUxGcsOy1/jYZ0tEvclQb+SHqh+e9Xm2Tv2lXecb3OJbbM kls+b2Mb/jVPDVIFRlnlcbhtiyIdZkBhSfHCVfzg3NGUMtt4q9JM4q9IdfRwTsUUZFCb Yeb+QYaAkM8SI0PIMXThNFlXV+U5mv1VCCpBe4RsqJ0Ad1Y5bsRyjMNjAyZrCIPtlGq6 OV1gga4jCdKV8r40nFWkgoAfId/6zuzrEBaLDo3aWTuYYuMDsn72X/2IcMrOa0mady/x cCRp++jG7MOiUBS+hHB8nN8meMv0YQYtoVeFacV/ySp6ISD1I0KrtNk5vuOFGol2irFe 7A+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774945278; x=1775550078; 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=ZlXweF85hjs0Cz7hgZ4Sc8jEj+2x0ePWSuvmjZUgVoc=; b=QbB/JWWNE7wxxXpE0/fKyDzQvHNAL7xfL/IVfzMDgTLgyELwKxXqaleXWn9dYdtAMK fas9ASov2t7JZdVNhMp7yhM2SQ+GIDhZ+mSeg+2fKNSTf5U2e+DUIVo1gfr08aWfu1PK uCqY3QPFN9Ml6vLJpkGGwGnMf+lI53vA8qkA3kP5CWUBWxHhGyIrOQpGYEl6LWGRsFWp ZKDkbC2T0n7gDuvw6XoOxU5VIwlNgLPA4XPicneN9WckovKw6PoEEcahQh5nwTn36uDp pzU1zgVdDAFSszBQr5+uJ7o8F78pNbHNHOuOazqxaRyd7witrmPmH3yTnLVSPVsridTO lx8Q== X-Forwarded-Encrypted: i=1; AJvYcCV9tuk554SSXGVAzL5Zpx2j+j0/ZqiAVBStXDW+9ALnuC1c1Fim/aONM9dW+2YIKWrdvYT8Tik8bliPLQA=@vger.kernel.org X-Gm-Message-State: AOJu0Yx0r9bTfFhV2lb8VqF/qGi+5zfd87w/cbNtImdrOXt9VzWECvd1 hq4M/uhly6wdFKkllDupxI/x96xCjC93+Mxc7p6xtJym0NOWTVDk0r8Q X-Gm-Gg: ATEYQzx3KtFCc3Bvq/v3H87/Ynnpdo06PATxNDEGRM4jK5nbDy+CFgREfBcNYpn2fYG ENIupF1HeM8PBC4uLmyygF+jOK8UoRlTCtLtJjyiqLE51quOEP+kQ2Y1H6St69kLnKXyCqltIYR 67Ui6ZMiSXncNtChslmDRiRbdXbFkPYZ9LQAkEdv0cDbDv1uMrpW2NZ0a0N39rap5gjd/byNjSt WydhNZgzp3YrJEOtHeNjuDKu1ytIINVg6QIQ/Rn6r2AF0CoqI5Z9pIIs7p+sNtHKT3GAB9zVCdy QXItqOiEKW32IPoJEPBWh0E+B1c+UbVx9FiEmq/gj5bdYxaQBeGz0pWNAFp9swxNY+P4E94zTpC rJUBB8IcaiYE8W2Qpl4KtyTQJtyT2aE8P2/wI+fyy+eThl6v8nwSquAC6PB6v+Fh+cPMvKWXk4g p4jOyg9jT5GbZ/OCTtoDxR7lDquHB7bDqhtuqlTVshmxqdWeeSf9CkEjSwUXY6PeM= X-Received: by 2002:a05:600c:1f8d:b0:47a:94fc:d063 with SMTP id 5b1f17b1804b1-48727d6fc1cmr150113965e9.1.1774945277374; Tue, 31 Mar 2026 01:21:17 -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-4887ad8d28bsm14542485e9.10.2026.03.31.01.21.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Mar 2026 01:21:17 -0700 (PDT) From: Lothar Rubusch To: herbert@gondor.apana.org.au, 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 v2 1/3] crypto: atmel-sha204a - fix memory leak at non-blocking RNG work_data Date: Tue, 31 Mar 2026 08:21:03 +0000 Message-Id: <20260331082105.697468-2-l.rubusch@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260331082105.697468-1-l.rubusch@gmail.com> References: <20260331082105.697468-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 | 44 +++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/drivers/crypto/atmel-sha204a.c b/drivers/crypto/atmel-sha204a.c index 98d1023007e3..1baf4750d311 100644 --- a/drivers/crypto/atmel-sha204a.c +++ b/drivers/crypto/atmel-sha204a.c @@ -24,15 +24,20 @@ 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, size_t max) { @@ -41,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.39.5 From nobody Wed Apr 1 12:34:28 2026 Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48]) (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 3EE003D9DC0 for ; Tue, 31 Mar 2026 08:21:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774945281; cv=none; b=fzy4xmhgXR6LEjI6gDcW60k/fYVdQ2iMJOZUpbs9X9pbEA6pxCVdNYOW+TcGA+KFcwD4RGoGkV58cTUQoo6jdulkzVuR7+aFxT3cH80UvJDgBMru7o9Uj0j0zSvIqjmYuiFQtJOHDnU/QVMZscFlgZpkZ25hscJzD20GUOPhYII= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774945281; c=relaxed/simple; bh=X8pf/RdhoihV+vUE+GHa2UaVGVZmQs8OtVynhGYcOlk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=mIHHn8rtSnj/K4omAPdEwzAcVkv4ueJTCu5h76npHTvH66XWs7QdBDZzJy48hG26td+fZFYSVEaYLnq3NNsI9JG1ku185xDGezGuwcQRfTk7yT9AZau99wFCP3l42sn1s0sHOVmIkXk+3gQ2olvEMxPK4gwq3qr01YeXbh4aFbY= 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=QcF001pf; arc=none smtp.client-ip=209.85.128.48 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="QcF001pf" Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-4836cd6e0d4so7264715e9.3 for ; Tue, 31 Mar 2026 01:21:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774945279; x=1775550079; 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=2GwQ4+C9ATAPLFcmqTbKzY7v6j7eVjPD9TBcAmNWpQc=; b=QcF001pfW4yu/KPbpiqGMsS0cDwkTJFIy1IyPKGeqYgPW3ryXGClY66FJlp2B2Tf0C IV3iHkQvh0bz0gaCM8CcVl/PhWk48RTcWhXN7k7Z9HBHBdO3okE8Bm64J0wO+nyEuHNR oUZZjHHiJ6nkZyp2Mq99aZLcJRRWQs171yxQ9FowbfbbdBGp2HyR4Qzoytm7jXFo+bhb P/n7oRisG8+tAgyEcwsZzHrWXT7kTPWrKdKkj52GV2fC3gHihjdnDcVGd/E5zitTnLfO zIZfF2ASn1gVNIVKbm1gOr5KGm5YBMye09/rQBBcRV56W5iRVVx4hQmM7KthOpoxMFqP /Wgw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774945279; x=1775550079; 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=2GwQ4+C9ATAPLFcmqTbKzY7v6j7eVjPD9TBcAmNWpQc=; b=Z3fJf6mzUpwRhUfe2QLnhYg6eyb/AwfZjgQCLr19+35WZ525RTyED2oyQ6HYBnUlNv 5GNIgvzw0JkF4juBWkqVkZfbOJqmA7U7jyzW4Y+pKfEKgnTX8ycABjw+RSU0ornmbA0/ Aqh3emNXIBMwjkubmJBXGZnTli68hhiUmCIlFPYcerJm8jzjrbXdWW7YuzSRetnUCKFL J7O2ysoLZVWSIiGxJWvUbZzsrbMVaBorjjrM1eALzYqFakCppDvM0mpsv+ACfrsXN/vr yPZW35lM96MEaNsDepXVJO74SGs7rgkuxn23TxbMZPDWNVh+fkzYZSTCfnpl+VCdG6yg cwWA== X-Forwarded-Encrypted: i=1; AJvYcCX23xzgcfVvp0IBOBjyiZ6CY/usjpKmsKkOtwPzgi3T1gMlT67NcJYzDBzE2FA+r+dNmJ1IvcgzTf/td68=@vger.kernel.org X-Gm-Message-State: AOJu0YxpkihczST6mbnkI+SwPm738aRRMuRxyz98ot7zFLMveFv78kUQ r9ki7rWA1bS6YJc8GvPQ1PO4SQMDP7gCVXfH9IuGL2v8bi9165vKyNti X-Gm-Gg: ATEYQzzBVfgdKL1gc7xPem8Eh68J6EG73uQw+RsI/F5Za27FL7fykIALRVqB7fPIYEi nBDxKOXV/E2C3fdd6o9Khbaq5N63qR7+fWBj6jh2wVgpRF5EmNrawyG61uAVlZCuGipoZqXMbWI 4Ezfcop+hQKhjOmmvdJAh8Q0XBlyVVG4OBV35YVdoLX5Q16Bt/1Al2G+MXNmTtGI5sWv8IYTGa5 cNHx+7LPLRFzN5/UATh6KYoM7+MxRsKIHLr8w3SyeJssFBy30fMuUIzr76aoAOL1HN3i8Qw0yiK S3kp4paLh+T+Rccx7Vu7qfPQFC4sr6+xot+6U4PiZ9V3OoNyTcKXl7wy3e/19ZJZZLk2EQmIOM+ mPT9HmEQHSg5omPMcIoquBBfVGGLN8Eb5RIi+J0BB+8XXE1Wbom2CQctL807/CEexW8M/NY/gCZ HsvExHUXs328ROWumHUAwPNAOLjQPeuPIzJPrLGwKJzs7CnY8CzLGhqc+bTfkppAg= X-Received: by 2002:a05:600c:4f09:b0:477:9c9e:ec7e with SMTP id 5b1f17b1804b1-48727ef6489mr109750975e9.6.1774945278456; Tue, 31 Mar 2026 01:21:18 -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-4887ad8d28bsm14542485e9.10.2026.03.31.01.21.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Mar 2026 01:21:18 -0700 (PDT) From: Lothar Rubusch To: herbert@gondor.apana.org.au, 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 v2 2/3] crypto: atmel-sha204a - fix truncated 32-byte blocking read Date: Tue, 31 Mar 2026 08:21:04 +0000 Message-Id: <20260331082105.697468-3-l.rubusch@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260331082105.697468-1-l.rubusch@gmail.com> References: <20260331082105.697468-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 1baf4750d311..350ba8618c69 100644 --- a/drivers/crypto/atmel-sha204a.c +++ b/drivers/crypto/atmel-sha204a.c @@ -18,6 +18,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.39.5 From nobody Wed Apr 1 12:34:28 2026 Received: from mail-wr1-f45.google.com (mail-wr1-f45.google.com [209.85.221.45]) (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 52EAB3DCDA6 for ; Tue, 31 Mar 2026 08:21:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774945283; cv=none; b=DgVqdM1DQbxD9dJbplsn9ok/QdWewYmY3OvDh1pabQxJp/H5XadSgTRbgluZIfmJhM/oIf/emK0sU17gLx5n6kf4eyciqMARb7osx2NtofIk3nfxg1ZZwKlAhGuLmk0Ob9RvGoy0RI/NxQpM7wbrF6Qrn2/tdYL+2IA5c/ilOn0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774945283; c=relaxed/simple; bh=2flK/UJa1UrZ/JEeL6RqU15Vn2qjY+wp87o+KBrBy54=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=dMUZf7aA3WOZqlf4QlIR213+ZgNwixhWE3S7rti4EyFb6y9EY9N4m/tBPOE9CxMWaOVPsVAJnwUouMVaFDGHVDFceDfu598itDq+bPz9Y39lka+QZCc/wO+FnyH/v1pnx+pDZy6xI1ttt9nmdnO45ldAZPce+3mWSoynCD641gc= 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=ifqEdwyA; arc=none smtp.client-ip=209.85.221.45 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="ifqEdwyA" Received: by mail-wr1-f45.google.com with SMTP id ffacd0b85a97d-43b99df9649so318146f8f.3 for ; Tue, 31 Mar 2026 01:21:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774945280; x=1775550080; 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=pzLIANwxZ+5V5JDtMYwIGXlBV/CrkOF0yZpzbS4Kpx4=; b=ifqEdwyAxEcS/UMN6E1KXgwW8Mv/IvRIVmdNS4bzGwztqNxUDMfmUOBfmjAJ7HeAnW G8tObCYK8KvjlmfwANAJ9eJyKSeA/ZN5eeIj53EKElK4AeiBjz7ZwS+yw0OUOGp0vI5W MefpLiP6kbdCL0nzQxrKSuJ5nwjMNGdcinyzPG02KSDXw+HdolB+SRIZHmfnRyDL5swb q/MuSBCeFy78QtAfwgbKHyqIrjhpyMZXopMUDU/GT1KeHhEtYFWVv/ponzoxtTh47Ti7 07P2qrX9UUG+zjhBGPtyfiFPnjdEXA1PirbCp4dlLKJ7KNPj3eovZqVuxNWdQatuk2Ne HDpA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774945280; x=1775550080; 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=pzLIANwxZ+5V5JDtMYwIGXlBV/CrkOF0yZpzbS4Kpx4=; b=S5NvhqiI7tv4vkPImc8GEvRzDxRTCcvWYVWtF+aIv0uJ8o5J4TvFZ3yUfVAdsb71Ei AlWsw9+r/pUGgB8L3AGBODqXxfIph/+9N+INJk+MVtVeOfcqOElTg5jczpbwWdi0V6fW J6nI+kJocNaUbR58ausrOqAqCp5KTJbJpq5DhzVmKszkTE9Ubm5QWPoRG327tssMD/XI XbnReqiYlAH1KPHuu0TjejwYxhZymUXkWFo65Yx7g/FmMpbHTGL1/1mDyzo1m0f5lhST DXxMhDibrdO7jtD1cNPOby9qatO3dFge96W0Rq1LqX2oIaFgPvDTpth5Gu+hRcjPtUMA IMGA== X-Forwarded-Encrypted: i=1; AJvYcCUK59SYkhPbQDZt6MSSYORYozLtHsXDASg2Gg5y8PqkR//vFm7QwxUpCaWgmjYwYn5y5Luflueu3GuSrVE=@vger.kernel.org X-Gm-Message-State: AOJu0YxWorG0d/OTLK3sTrS9SgcMzQyeEehkqZP8qwD55IT65EJnMRCW V6Jz+iLQGyQB+BsyhVWXK9/oSMlebBWVg7+RvBMsSwL41LJ+T2E/Qb23 X-Gm-Gg: ATEYQzwEb/YrWIwNhzl4lk0OilRj0SFe92Xad4E6OpGC0pYvJRLKqN+2EDR0KSN/FKA eF6wZGXP6wpnvr9Xmrm/6pbOXmM4NhIiSsEw+1OpA0RSyTSXFkRgHVF0Yy06cW90UT6VQ06MM8M FJSuuc8KFXaWNC4hEuiegejILxO3XdqRVoIVtdWICeMAqXYaV+jswGMVe0Oupaxb6LUZ5OYlWvr jhPZkjgNLKiYPmotiQzPOH4aNWyPZj/VQo0gUFEVG6RCHBUrZaTGgQIUuqvzTVsGSuEbQ8wdoed BmWZ/iArl4GOoCH89+lkVXNlbN2jOVHZiHqGNL0VshwkMxUXaqahzIvx83sPkUNRHN/KGWtBb/j RrSVVVvDhC2W+lud+1qFsxH+1QzHXidbQ9bBAOx+gfoxofz4ir1D0iwvLzpzeef2Bgt9Eo70Ov4 pnRCVz7f3A4NRsJ1Ni7iHAoctsVqmi0cfL6gZLBkHs/XIUt3Te8nSbfHGLtpfOxGc= X-Received: by 2002:a05:600c:1d1c:b0:487:1fbb:5a28 with SMTP id 5b1f17b1804b1-48727f2d043mr122939545e9.1.1774945279542; Tue, 31 Mar 2026 01:21:19 -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-4887ad8d28bsm14542485e9.10.2026.03.31.01.21.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 31 Mar 2026 01:21:19 -0700 (PDT) From: Lothar Rubusch To: herbert@gondor.apana.org.au, 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 v2 3/3] crypto: atmel-sha204a - fix non-blocking read logic Date: Tue, 31 Mar 2026 08:21:05 +0000 Message-Id: <20260331082105.697468-4-l.rubusch@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260331082105.697468-1-l.rubusch@gmail.com> References: <20260331082105.697468-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 350ba8618c69..c0a1d34bbd9e 100644 --- a/drivers/crypto/atmel-sha204a.c +++ b/drivers/crypto/atmel-sha204a.c @@ -32,7 +32,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.39.5