in tee_core.c [144:196]
static int 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;
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;
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;
}