Merge tag 'tee-sha1-lib-for-v6.18' of git://git.kernel.org/pub/scm/linux/kernel/git/jenswi/linux-tee into soc/drivers

Use SHA-1 library instead of crypto_shash

* tag 'tee-sha1-lib-for-v6.18' of git://git.kernel.org/pub/scm/linux/kernel/git/jenswi/linux-tee:
  tee: Use SHA-1 library instead of crypto_shash

Link: https://lore.kernel.org/r/20250912091611.GA1442659@rayden
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
Arnd Bergmann
2025-09-15 16:01:35 +02:00
2 changed files with 10 additions and 48 deletions

View File

@@ -3,8 +3,7 @@
menuconfig TEE
tristate "Trusted Execution Environment support"
depends on HAVE_ARM_SMCCC || COMPILE_TEST || CPU_SUP_AMD
select CRYPTO
select CRYPTO_SHA1
select CRYPTO_LIB_SHA1
select DMA_SHARED_BUFFER
select GENERIC_ALLOCATOR
help

View File

@@ -14,7 +14,6 @@
#include <linux/slab.h>
#include <linux/tee_core.h>
#include <linux/uaccess.h>
#include <crypto/hash.h>
#include <crypto/sha1.h>
#include "tee_private.h"
@@ -142,58 +141,22 @@ static int tee_release(struct inode *inode, struct file *filp)
* This implements section (for SHA-1):
* 4.3. Algorithm for Creating a Name-Based UUID
*/
static int uuid_v5(uuid_t *uuid, const uuid_t *ns, const void *name,
size_t size)
static void uuid_v5(uuid_t *uuid, const uuid_t *ns, const void *name,
size_t size)
{
unsigned char hash[SHA1_DIGEST_SIZE];
struct crypto_shash *shash = NULL;
struct shash_desc *desc = NULL;
int rc;
struct sha1_ctx ctx;
shash = crypto_alloc_shash("sha1", 0, 0);
if (IS_ERR(shash)) {
rc = PTR_ERR(shash);
pr_err("shash(sha1) allocation failed\n");
return rc;
}
desc = kzalloc(sizeof(*desc) + crypto_shash_descsize(shash),
GFP_KERNEL);
if (!desc) {
rc = -ENOMEM;
goto out_free_shash;
}
desc->tfm = shash;
rc = crypto_shash_init(desc);
if (rc < 0)
goto out_free_desc;
rc = crypto_shash_update(desc, (const u8 *)ns, sizeof(*ns));
if (rc < 0)
goto out_free_desc;
rc = crypto_shash_update(desc, (const u8 *)name, size);
if (rc < 0)
goto out_free_desc;
rc = crypto_shash_final(desc, hash);
if (rc < 0)
goto out_free_desc;
sha1_init(&ctx);
sha1_update(&ctx, (const u8 *)ns, sizeof(*ns));
sha1_update(&ctx, (const u8 *)name, size);
sha1_final(&ctx, hash);
memcpy(uuid->b, hash, UUID_SIZE);
/* Tag for version 5 */
uuid->b[6] = (hash[6] & 0x0F) | 0x50;
uuid->b[8] = (hash[8] & 0x3F) | 0x80;
out_free_desc:
kfree(desc);
out_free_shash:
crypto_free_shash(shash);
return rc;
}
int tee_session_calc_client_uuid(uuid_t *uuid, u32 connection_method,
@@ -203,7 +166,7 @@ int tee_session_calc_client_uuid(uuid_t *uuid, u32 connection_method,
kgid_t grp = INVALID_GID;
char *name = NULL;
int name_len;
int rc;
int rc = 0;
if (connection_method == TEE_IOCTL_LOGIN_PUBLIC ||
connection_method == TEE_IOCTL_LOGIN_REE_KERNEL) {
@@ -260,7 +223,7 @@ int tee_session_calc_client_uuid(uuid_t *uuid, u32 connection_method,
goto out_free_name;
}
rc = uuid_v5(uuid, &tee_client_uuid_ns, name, name_len);
uuid_v5(uuid, &tee_client_uuid_ns, name, name_len);
out_free_name:
kfree(name);