mirror of
https://github.com/torvalds/linux.git
synced 2026-01-24 23:16:46 +00:00
Merge tag 'v6.19-p1' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
Pull crypto updates from Herbert Xu: "API: - Rewrite memcpy_sglist from scratch - Add on-stack AEAD request allocation - Fix partial block processing in ahash Algorithms: - Remove ansi_cprng - Remove tcrypt tests for poly1305 - Fix EINPROGRESS processing in authenc - Fix double-free in zstd Drivers: - Use drbg ctr helper when reseeding xilinx-trng - Add support for PCI device 0x115A to ccp - Add support of paes in caam - Add support for aes-xts in dthev2 Others: - Use likely in rhashtable lookup - Fix lockdep false-positive in padata by removing a helper" * tag 'v6.19-p1' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6: (71 commits) crypto: zstd - fix double-free in per-CPU stream cleanup crypto: ahash - Zero positive err value in ahash_update_finish crypto: ahash - Fix crypto_ahash_import with partial block data crypto: lib/mpi - use min() instead of min_t() crypto: ccp - use min() instead of min_t() hwrng: core - use min3() instead of nested min_t() crypto: aesni - ctr_crypt() use min() instead of min_t() crypto: drbg - Delete unused ctx from struct sdesc crypto: testmgr - Add missing DES weak and semi-weak key tests Revert "crypto: scatterwalk - Move skcipher walk and use it for memcpy_sglist" crypto: scatterwalk - Fix memcpy_sglist() to always succeed crypto: iaa - Request to add Kanchana P Sridhar to Maintainers. crypto: tcrypt - Remove unused poly1305 support crypto: ansi_cprng - Remove unused ansi_cprng algorithm crypto: asymmetric_keys - fix uninitialized pointers with free attribute KEYS: Avoid -Wflex-array-member-not-at-end warning crypto: ccree - Correctly handle return of sg_nents_for_len crypto: starfive - Correctly handle return of sg_nents_for_len crypto: iaa - Fix incorrect return value in save_iaa_wq() crypto: zstd - Remove unnecessary size_t cast ...
This commit is contained in:
@@ -1,12 +1,14 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (C) 2021 Pengutronix, Ahmad Fatoum <kernel@pengutronix.de>
|
||||
* Copyright 2025 NXP
|
||||
*/
|
||||
|
||||
#include <keys/trusted_caam.h>
|
||||
#include <keys/trusted-type.h>
|
||||
#include <linux/build_bug.h>
|
||||
#include <linux/key-type.h>
|
||||
#include <linux/parser.h>
|
||||
#include <soc/fsl/caam-blob.h>
|
||||
|
||||
static struct caam_blob_priv *blobifier;
|
||||
@@ -16,6 +18,77 @@ static struct caam_blob_priv *blobifier;
|
||||
static_assert(MAX_KEY_SIZE + CAAM_BLOB_OVERHEAD <= CAAM_BLOB_MAX_LEN);
|
||||
static_assert(MAX_BLOB_SIZE <= CAAM_BLOB_MAX_LEN);
|
||||
|
||||
enum {
|
||||
opt_err,
|
||||
opt_key_enc_algo,
|
||||
};
|
||||
|
||||
static const match_table_t key_tokens = {
|
||||
{opt_key_enc_algo, "key_enc_algo=%s"},
|
||||
{opt_err, NULL}
|
||||
};
|
||||
|
||||
#ifdef CAAM_DEBUG
|
||||
static inline void dump_options(const struct caam_pkey_info *pkey_info)
|
||||
{
|
||||
pr_info("key encryption algo %d\n", pkey_info->key_enc_algo);
|
||||
}
|
||||
#else
|
||||
static inline void dump_options(const struct caam_pkey_info *pkey_info)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
static int get_pkey_options(char *c,
|
||||
struct caam_pkey_info *pkey_info)
|
||||
{
|
||||
substring_t args[MAX_OPT_ARGS];
|
||||
unsigned long token_mask = 0;
|
||||
u16 key_enc_algo;
|
||||
char *p = c;
|
||||
int token;
|
||||
int res;
|
||||
|
||||
if (!c)
|
||||
return 0;
|
||||
|
||||
while ((p = strsep(&c, " \t"))) {
|
||||
if (*p == '\0' || *p == ' ' || *p == '\t')
|
||||
continue;
|
||||
token = match_token(p, key_tokens, args);
|
||||
if (test_and_set_bit(token, &token_mask))
|
||||
return -EINVAL;
|
||||
|
||||
switch (token) {
|
||||
case opt_key_enc_algo:
|
||||
res = kstrtou16(args[0].from, 16, &key_enc_algo);
|
||||
if (res < 0)
|
||||
return -EINVAL;
|
||||
pkey_info->key_enc_algo = key_enc_algo;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool is_key_pkey(char **datablob)
|
||||
{
|
||||
char *c = NULL;
|
||||
|
||||
do {
|
||||
/* Second argument onwards,
|
||||
* determine if tied to HW
|
||||
*/
|
||||
c = strsep(datablob, " \t");
|
||||
if (c && (strcmp(c, "pk") == 0))
|
||||
return true;
|
||||
} while (c);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static int trusted_caam_seal(struct trusted_key_payload *p, char *datablob)
|
||||
{
|
||||
int ret;
|
||||
@@ -25,11 +98,30 @@ static int trusted_caam_seal(struct trusted_key_payload *p, char *datablob)
|
||||
.key_mod = KEYMOD, .key_mod_len = sizeof(KEYMOD) - 1,
|
||||
};
|
||||
|
||||
/*
|
||||
* If it is to be treated as protected key,
|
||||
* read next arguments too.
|
||||
*/
|
||||
if (is_key_pkey(&datablob)) {
|
||||
info.pkey_info.plain_key_sz = p->key_len;
|
||||
info.pkey_info.is_pkey = 1;
|
||||
ret = get_pkey_options(datablob, &info.pkey_info);
|
||||
if (ret < 0)
|
||||
return 0;
|
||||
dump_options(&info.pkey_info);
|
||||
}
|
||||
|
||||
ret = caam_encap_blob(blobifier, &info);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
p->blob_len = info.output_len;
|
||||
if (info.pkey_info.is_pkey) {
|
||||
p->key_len = p->blob_len + sizeof(struct caam_pkey_info);
|
||||
memcpy(p->key, &info.pkey_info, sizeof(struct caam_pkey_info));
|
||||
memcpy(p->key + sizeof(struct caam_pkey_info), p->blob, p->blob_len);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -42,11 +134,27 @@ static int trusted_caam_unseal(struct trusted_key_payload *p, char *datablob)
|
||||
.key_mod = KEYMOD, .key_mod_len = sizeof(KEYMOD) - 1,
|
||||
};
|
||||
|
||||
if (is_key_pkey(&datablob)) {
|
||||
info.pkey_info.plain_key_sz = p->blob_len - CAAM_BLOB_OVERHEAD;
|
||||
info.pkey_info.is_pkey = 1;
|
||||
ret = get_pkey_options(datablob, &info.pkey_info);
|
||||
if (ret < 0)
|
||||
return 0;
|
||||
dump_options(&info.pkey_info);
|
||||
|
||||
p->key_len = p->blob_len + sizeof(struct caam_pkey_info);
|
||||
memcpy(p->key, &info.pkey_info, sizeof(struct caam_pkey_info));
|
||||
memcpy(p->key + sizeof(struct caam_pkey_info), p->blob, p->blob_len);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
ret = caam_decap_blob(blobifier, &info);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
p->key_len = info.output_len;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user