From nobody Sun Apr 5 16:27:57 2026 Received: from mail-wm1-f44.google.com (mail-wm1-f44.google.com [209.85.128.44]) (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 6F92037F007 for ; Mon, 23 Mar 2026 21:28:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774301290; cv=none; b=KhTI9k0K5uPvKXCXVsHBSH7WnUTLDDP0PREQeDJ8w1Tjebt1+wMFAjVS3W5DzRFPcGJNa01RcAW4kHiAGkzZCmuY66taMIdLfZf5IcqGjg9o6CaYpwx62JUpfsTszm1JI4/qGQq9uaviH8McJAVR8BTOVh5klvGD+ERIp5rphOA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774301290; c=relaxed/simple; bh=+MFZd/jt7u0zU2651JBWCrMkeie7unjKau5SU/tLqPs=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=PtrFyaKESz4UHcfX27QF+3nFzXCxtR4bInnGFoCAAzpx1Y+GGNWolPxitXD7Go3z7aHpr8jLt0HnQplA8UKd1OeCRQJjXN0NcAwt3vht/f47c2ufcjAVlV2ESqvTTWqtId1QsayZKY44E6wA+OBR4gBhNH+gA6uiVkm6VPuamRk= 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=rTIqhOci; arc=none smtp.client-ip=209.85.128.44 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="rTIqhOci" Received: by mail-wm1-f44.google.com with SMTP id 5b1f17b1804b1-4836fc075d2so5205805e9.0 for ; Mon, 23 Mar 2026 14:28:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774301288; x=1774906088; 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=0JYhEh1fUyIpN2Nz8LjN/J6gClgKVHGYq375zHFqaMk=; b=rTIqhOcimSdlxe54Kr4SGo7SOJ4z6mwwz4hulghritjro5r7lLwbNDztGLebC6h/pg U9JJYRBfNXSQJd0m1v2ON5vuvOdizceZwD4+uV6LPlKQUOLQIX0eLrDpz1DA8lGTtf6h NEu6ExWZAyK6satEYlQzpVPi6e3St2SnIn5BLr1JdwFXBa8MmSuqTxG/C69YFCjOtLWv WHjr1U6tBQWw0L1hTyRAjnFsA0aPcdZ4qUYVlX3Ue1SH8ykqOlsZu1hIII90L3T38UNV rR+Eai/iWrZM32g5NpAv2vA43AFocglzmTvuuspdzNYOEQbvG66B3Wt+TlvUAKid+f1N 4LLA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774301288; x=1774906088; 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=0JYhEh1fUyIpN2Nz8LjN/J6gClgKVHGYq375zHFqaMk=; b=EkrywW4gqTIrv+rOAtIIb6wfc0vgXo4m4vHY14bMEFxIvHIEeXPz3RxigkLHXCIagL h3yo4kMpGP29maiGurD3JAUdplSvjc3fDm++2dPFOPRcd5/Ez8A7wLrS1VSsb71g3b1X 3AoHq/Qfg2zrvTzb7ij0YxtqdVieomg8lUwBdB8Lgaf1xcA3XjABG/7tZZehr7enFkuZ RrDx+i6DMY8d9mAN7zSBzMxaDIEYU/lyQnzmMFMOFWrw5YrYj9FO/XGMNjd+IIEg5tra Mpl/leRmyh1HbaNjQ1swWp2oh7yYPzQpp7M1EiRG0DqxUVhKmXOyGgjORez4GAzl+T2+ DmrA== X-Forwarded-Encrypted: i=1; AJvYcCU7WQ+p5VJpU57/kwsFlJAaXzDPoIuCGFzeu+t5tEvtmmF8kJzTaxdwNnkojwsf2vvGyQ8gJ0LujoqbT0I=@vger.kernel.org X-Gm-Message-State: AOJu0YygYTkJ03XOhH09zLnftJ9/pRgiO6rdXtgDaiGyrOSWZOAGTWtK accMJmPZOreIgOswoUBAOp10yvkQ5MLMD5jbxSDctJI3zMnaIvTa5OKo X-Gm-Gg: ATEYQzx/HHfGqyC1Yi1frlbfcDblQDeFQcMYMWNj94EuD5o5u1poGErVYSejAU52kE0 7ZsuVua6RLBlA/2fq6oJft2ugFPzg0qutPRLr+ldEiVrxZzzUuJ62aY/nMs+lX9wVgdKCHlcwUp Fxvkk3/9EfjVQ5hGcTULqOnB53c0g55fhSH5JZgblc7svpNT/gGmfFcZexP613cC3qIMjmiaA/+ rid75EW3AL370IYwH/rXD3edUe+xFiUVFhELAvbISa3+O1zGzBiDER/jdTbn9jjCa8c2vcel/LO ggR8zbNHEvA8vH0OxC6BHj6MH/KGmPCECLb8Muj9975P5rsZPl6IMZpta3kFxuql6So/TM5wOZf vCmTBfBX5BwsAO2xDuoULkdVi5qOPL/WkJdZFc9pUNLdigWwlBd7mJ96nE4x5kO5VPp5QVOSypa +Z5E49YqSOgn8PqbH7LUMb5MvGLvdc/WHrLy6C1BV0JicEF6r3LngezT+9AYsb0yI= X-Received: by 2002:a05:6000:4007:b0:43b:4e32:c2a6 with SMTP id ffacd0b85a97d-43b63fdcc61mr10787942f8f.0.1774301287519; Mon, 23 Mar 2026 14:28:07 -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 ffacd0b85a97d-43b6470393fsm33386975f8f.17.2026.03.23.14.28.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Mar 2026 14:28:07 -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 1/3] crypto: atmel-sha204a - fix memory leak at non-blocking RNG work_data Date: Mon, 23 Mar 2026 21:27:53 +0000 Message-Id: <20260323212755.687342-2-l.rubusch@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260323212755.687342-1-l.rubusch@gmail.com> References: <20260323212755.687342-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.53.0 From nobody Sun Apr 5 16:27:57 2026 Received: from mail-wm1-f45.google.com (mail-wm1-f45.google.com [209.85.128.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 DFE0C37F741 for ; Mon, 23 Mar 2026 21:28:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774301292; cv=none; b=L/sGsAgAZsUgJRR6EgBrYzDcJ+KsIKaOrdoj9bmo1TOVHzPzbfV+ni6YrYo55h43IsUAX9JppYIMIYTE6avygcjx1FsE2H8IuhMbErU6DEL8C969NInmuACfvZ2mmtKB5LzBA8sh6NcTBgd4J14daq7g4vA6ASYuOon1l6iTiM0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774301292; c=relaxed/simple; bh=FgIOcFM8s9R6nuzyMTBBlQ7LGLqjwuZuy4bomRP/2e0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Kr0FhfRbo28ZH0VZJ7iQyfCJ1QWFgFJF9YViXzi61gumwyKwZHbjNQOaewf3b81IblGij3WUtdnMz8N9e1QN2aCgTQJ7j5S7+kJTl4CtOR+XlEIdlXU+IRjM1MalJ1NVdrfWpDZsK38z0EWPeYURVko2J4iLjPwTPMlQo45SlyY= 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=SRU5or4+; arc=none smtp.client-ip=209.85.128.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="SRU5or4+" Received: by mail-wm1-f45.google.com with SMTP id 5b1f17b1804b1-4836fc075d2so5205815e9.0 for ; Mon, 23 Mar 2026 14:28:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774301289; x=1774906089; 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=csOGr/K8Tf7uItgGXZwcjonMRapeP/TA0fdd2GZkXSo=; b=SRU5or4+Ebg14RA/5Ua71Ie3UmFmXlyTaKhK5trmUjqJx4NWyQFX+/2HNmBTk+cLtv YTJmGajFBSH14H/C39B7YOo6Dv6o57yLsGKT0+LtAn1Bc4/TDdoVmm+RmpW2WXvX8xEA 8g6ybcvWPYRJUAJ7PjRvsxSMMCRB30ZyJCeo8mWBplp0uiR+QWZUv+cXP/uw/DcVUT2P LWfvNHsFCyxURLXGSXLEz8PLINfqf0ieBum4Hvd2vjCpRKPLYy6NkpsJR4NEAgDx8ylU ZuYbziqvq0//c0kW1wRyikoLkh4NHmGSYNLoYhVDBXMlQWPk/+UpEeMOX2F7OUwN1H/H l/7g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774301289; x=1774906089; 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=csOGr/K8Tf7uItgGXZwcjonMRapeP/TA0fdd2GZkXSo=; b=C3uCgldpl8O8d8Y3zaXGidqt8qO8Pf3lt9+vYAwjtCSPNnV1vUJZs7rVFjaoAR4Kou k1TnsoFWqaytOB3yGosRFU/Lj4/6Hj6BFkAM8BVJ+btJIOkcihUOLEzyAkQCgL6PD4IA WXhACJ9CwzQ50+LKxWHPb+3oFccQ4bBRBG+tY1LKuLIb6IXn3i9w9IuAIT0DAAlVVj0c lkG8p9Jpl4p3ImTi3Tal5jpnT06HiZCxEaq6/AuFmtDQUX68Ujjzy7FZAH7Mgf7nSIl4 Na0ffR/pZLY/b7FcgN8i4m2avIrQ8VWhr3mwHf6ujds3syVhDMfpYqlCVNSxSkcmTSTl uyJw== X-Forwarded-Encrypted: i=1; AJvYcCXlQOrqROVzAWjicZdl1tVPnNNfywJW2Woeo8Oc1+qcAe8Nqiw2SOxgq+PkNLtLYHD1HSq+Gt5X3C2stZY=@vger.kernel.org X-Gm-Message-State: AOJu0YxPzz5hHNZfawBXfAk3Vlx0ojPxONcIrqT8zlJj3mJT2rRDgdJ7 1eZKLWCvGbFyS2jaPTLveSnpXkSeBWk5Mpjylp6Kp/Jj87+r9ZxX4uuJ X-Gm-Gg: ATEYQzyJWGZhyT2AMAzJvQBcJbysSOT13VoQZHyKs0COEL+lFDxEIri66dDZ/uSNVhr dkB2xMx3atRWSBW0yp2kHeCAZrOCI8MsfPd42Ba5qgg8QWWpxyvnI5fjGCG18oD6MNNjqebCczz zIgb3gDGNEox+gM/nSq5hP2I3Oxm+YU/xHRHm19xkHQoVatREUeZOr99xxJBI/vQH2LJSHdFMcx Rp5YTWMs7xuLUF5SDq+ZOG9cSt/JGHVzncqSDIX3CPpceueVmro3/yOwe9jzGah8k8DY8RGGvZZ grJR+TbtBpjwI+DFx3rG7QfD95LUR207Bw8jqtdm/7J0bXN6FLV9bhluLhubmQwjpsYCGhWEwXW p/E99z8o13FZV513NF8vSVDr1vF5uh8pf5698DUfBPio31r9STBB51wb1TmFl8JmKItB1Gc03K2 igXlK9pKvue9UJzi9fcXZGlH/ONZ7hvXQJGfxRK6GEf2muUv/wauNziWHgPmWib8Y= X-Received: by 2002:a05:600c:3b07:b0:485:9a50:338b with SMTP id 5b1f17b1804b1-486febb8560mr105205725e9.2.1774301289309; Mon, 23 Mar 2026 14:28:09 -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 ffacd0b85a97d-43b6470393fsm33386975f8f.17.2026.03.23.14.28.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Mar 2026 14:28:08 -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 2/3] crypto: atmel-sha204a - fix truncated 32-byte blocking read Date: Mon, 23 Mar 2026 21:27:54 +0000 Message-Id: <20260323212755.687342-3-l.rubusch@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260323212755.687342-1-l.rubusch@gmail.com> References: <20260323212755.687342-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.53.0 From nobody Sun Apr 5 16:27:57 2026 Received: from mail-wm1-f49.google.com (mail-wm1-f49.google.com [209.85.128.49]) (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 488593803D0 for ; Mon, 23 Mar 2026 21:28:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774301293; cv=none; b=iaysDCplHHIgZgKnyaH8EZfQCJpOPWuFrAd5Mx5x8rrZK0biMBQXSZJoZMwxJBpRzdIkbNP/0s1oWui46kjE1MRogON4cHKbMqq34t4gz/kIwh6spxxF/YB39BpfcFxR99tqDkVsSDhGQRYWkYQkaUGuL5pqZEvNGP6/zhjieEQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774301293; c=relaxed/simple; bh=qTQRJLJNAq8ElXyosXgSrnt5ksvp9QO20t4c2pOQpwo=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=J3MYthUsldi42mprZcnsV6YNFbrUyc2KR+T3HdQmJFHAv2vPLD0zXTNa/61Cspc0pFKBB+rrQtUJ3odwnoRBwIJWd6nL2YAcAlHzn8oJWeWNQucOAjVHFdH+rFpzlk6iE92K+LVEvFAu2WkaBAKuEwPphw5wUs+E7wMZuT49a4o= 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=mtQUz/X1; arc=none smtp.client-ip=209.85.128.49 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="mtQUz/X1" Received: by mail-wm1-f49.google.com with SMTP id 5b1f17b1804b1-48371104ffdso5602575e9.1 for ; Mon, 23 Mar 2026 14:28:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774301291; x=1774906091; 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=0kj7GWfvFlt9NmwOl42exx2Iv0v0a3deVWNgthIQl6k=; b=mtQUz/X1Nk/ZnCuFdjd5zQHprTbxeepIzdzJXiaDoPyTLQK/Is+N0dhZGb1ynZ/7hN K3xoiy2xqhwpEnWbiySgMtFThHBYidJt0hAW8OWvr+p8qcEhWYdngeSbC+EpiDopUtzY Sut871dcp+TRyJeEBNVQl5VTDdkavq8Y24AWXHlotbjaM0qaccpz+/6guuC7B6MAw8tO XHYhuwpFUCdR5Or7QZ7sMSuW1xLjuyZnYsvll5/RaNAjoLOECAMilGXLQRmxuIfPHUTC SLn4AcoZFcLtae7S3w1Q5ispARYJxJqIBT1/35ML5Aju71MNFE1l8vUjfrbe0USTPt5a pM4A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774301291; x=1774906091; 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=0kj7GWfvFlt9NmwOl42exx2Iv0v0a3deVWNgthIQl6k=; b=PucTJ1dxIfE3ZGOKYkRt2fmYgtv54Nlp720O/86LjhS2GlwLcTDrTaM0pI05DZH6Cv gf3xtTi+bttXFC3Ie7qgKMt2+CbrXHDN4whs+kdETjxVsfxloMwTpqBfl9wYFJiDntmz sVWcGUCuV7am/wfSI7wV71o4GVD5+zzwQvwrwixouIqzw2YXE9Y6MLbICWmyOZ1y2FlG pZaDXzcjBI8CQEq88efviWBN0ZnF2dbEHC0UEYuuB/A/nKhJ6PVyhOrJ55U6qGEQ8kxg 8F2b2J7IwfF82lh0Z7vqEDR6F5c1WnC7EtZa5Zkm9BqQJ6117r4Gx5QrCmIpIARn9Wqg KJFw== X-Forwarded-Encrypted: i=1; AJvYcCW4fkZe+VKdTyhQ8mLquKkrJUs8APmhv2uYcNWoqAf8qwHP7j2QqV8kOnBBDYwuqtDjjZiTFrK0OiSBJro=@vger.kernel.org X-Gm-Message-State: AOJu0YyivcBDBiH3pA8tyG7NO4koeIFvfVmpJ4+qqA/qYSXz0DYsABx1 g4daDStBjP9a4HIqv8mw5+WJgN8RN73SEJLwa4Vt7f85dOyM8MTY7euZ X-Gm-Gg: ATEYQzymvDTyO5dKZFBVT8rCJvVMztxCeHpbzeXuVuhE+RrF/k9v65lyeqsjh1fqVl2 KwryWfHvK1wx6qajYehb+GTHrVriem46+NrypN3W3mGMBsX54CA2el8O3xcgBpMwi8dHftwikw2 8JoIWSIi9HAXsoPeuEv60dijM268RD4eoCHxSDCisiHGA4+jycJ2OzDcqf3KJnHHswZL1WzLVwt ZXBFeJfIUAIs3bgnHsfKsRd4qsJ1SUTzUKrxXwrCXxEUasbw15dP3pMzKubJ1xLcm27iAhR12Fj FQz+SynjNFDlYgQh6bvvfNsbN0doXsAMuKqYxB/To/hcf+Wq44jYtR0YPc00dFqes9XSt9h76cX 2mKXFpxl7hFZirwko8oz+u2sNP1YFmszeoCwMgQgxWvtjZhgdCyp5RrNB8AQ+kAWA+DFAVCITs8 D32iakbtI6i0K2pWLVzh9zrhKi9I2KVr/gv8NrifuJ6Ieu0YFYKx8Om3164vyjznU= X-Received: by 2002:a05:6000:3103:b0:43b:6172:91d2 with SMTP id ffacd0b85a97d-43b6427f665mr12174742f8f.4.1774301290400; Mon, 23 Mar 2026 14:28:10 -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 ffacd0b85a97d-43b6470393fsm33386975f8f.17.2026.03.23.14.28.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Mar 2026 14:28:10 -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 3/3] crypto: atmel-sha204a - fix non-blocking read logic Date: Mon, 23 Mar 2026 21:27:55 +0000 Message-Id: <20260323212755.687342-4-l.rubusch@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260323212755.687342-1-l.rubusch@gmail.com> References: <20260323212755.687342-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..6700847c56a3 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); // Note the [1] index =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