Skip to content

Commit

Permalink
X.509: Fix modular build of public_key_sm2
Browse files Browse the repository at this point in the history
The sm2 code was split out of public_key.c in a way that breaks
modular builds.  This patch moves the code back into the same file
as the original motivation was to minimise ifdefs and that has
nothing to do with splitting the code out.

Fixes: 2155256 ("X.509: support OSCCA SM2-with-SM3...")
Reported-by: kernel test robot <[email protected]>
Signed-off-by: Herbert Xu <[email protected]>
  • Loading branch information
herbertx committed Oct 8, 2020
1 parent 10b0f78 commit 3093e7c
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 76 deletions.
1 change: 0 additions & 1 deletion crypto/asymmetric_keys/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ asymmetric_keys-y := \
signature.o

obj-$(CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE) += public_key.o
obj-$(CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE) += public_key_sm2.o
obj-$(CONFIG_ASYMMETRIC_TPM_KEY_SUBTYPE) += asym_tpm.o

#
Expand Down
57 changes: 57 additions & 0 deletions crypto/asymmetric_keys/public_key.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
#include <keys/asymmetric-subtype.h>
#include <crypto/public_key.h>
#include <crypto/akcipher.h>
#include <crypto/sm2.h>
#include <crypto/sm3_base.h>

MODULE_DESCRIPTION("In-software asymmetric public-key subtype");
MODULE_AUTHOR("Red Hat, Inc.");
Expand Down Expand Up @@ -246,6 +248,61 @@ static int software_key_eds_op(struct kernel_pkey_params *params,
return ret;
}

#if IS_REACHABLE(CONFIG_CRYPTO_SM2)
static int cert_sig_digest_update(const struct public_key_signature *sig,
struct crypto_akcipher *tfm_pkey)
{
struct crypto_shash *tfm;
struct shash_desc *desc;
size_t desc_size;
unsigned char dgst[SM3_DIGEST_SIZE];
int ret;

BUG_ON(!sig->data);

ret = sm2_compute_z_digest(tfm_pkey, SM2_DEFAULT_USERID,
SM2_DEFAULT_USERID_LEN, dgst);
if (ret)
return ret;

tfm = crypto_alloc_shash(sig->hash_algo, 0, 0);
if (IS_ERR(tfm))
return PTR_ERR(tfm);

desc_size = crypto_shash_descsize(tfm) + sizeof(*desc);
desc = kzalloc(desc_size, GFP_KERNEL);
if (!desc) {
ret = -ENOMEM;
goto error_free_tfm;
}

desc->tfm = tfm;

ret = crypto_shash_init(desc);
if (ret < 0)
goto error_free_desc;

ret = crypto_shash_update(desc, dgst, SM3_DIGEST_SIZE);
if (ret < 0)
goto error_free_desc;

ret = crypto_shash_finup(desc, sig->data, sig->data_size, sig->digest);

error_free_desc:
kfree(desc);
error_free_tfm:
crypto_free_shash(tfm);
return ret;
}
#else
static inline int cert_sig_digest_update(
const struct public_key_signature *sig,
struct crypto_akcipher *tfm_pkey)
{
return -ENOTSUPP;
}
#endif /* ! IS_REACHABLE(CONFIG_CRYPTO_SM2) */

/*
* Verify a signature using a public key.
*/
Expand Down
63 changes: 0 additions & 63 deletions crypto/asymmetric_keys/public_key_sm2.c

This file was deleted.

12 changes: 0 additions & 12 deletions include/crypto/public_key.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,16 +84,4 @@ extern int verify_signature(const struct key *,
int public_key_verify_signature(const struct public_key *pkey,
const struct public_key_signature *sig);

#if IS_REACHABLE(CONFIG_CRYPTO_SM2)
int cert_sig_digest_update(const struct public_key_signature *sig,
struct crypto_akcipher *tfm_pkey);
#else
static inline
int cert_sig_digest_update(const struct public_key_signature *sig,
struct crypto_akcipher *tfm_pkey)
{
return -ENOTSUPP;
}
#endif

#endif /* _LINUX_PUBLIC_KEY_H */

0 comments on commit 3093e7c

Please sign in to comment.