Skip to content

Commit 3093e7c

Browse files
committed
X.509: Fix modular build of public_key_sm2
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 <lkp@intel.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
1 parent 10b0f78 commit 3093e7c

4 files changed

Lines changed: 57 additions & 76 deletions

File tree

crypto/asymmetric_keys/Makefile

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ asymmetric_keys-y := \
1111
signature.o
1212

1313
obj-$(CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE) += public_key.o
14-
obj-$(CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE) += public_key_sm2.o
1514
obj-$(CONFIG_ASYMMETRIC_TPM_KEY_SUBTYPE) += asym_tpm.o
1615

1716
#

crypto/asymmetric_keys/public_key.c

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
#include <keys/asymmetric-subtype.h>
1818
#include <crypto/public_key.h>
1919
#include <crypto/akcipher.h>
20+
#include <crypto/sm2.h>
21+
#include <crypto/sm3_base.h>
2022

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

251+
#if IS_REACHABLE(CONFIG_CRYPTO_SM2)
252+
static int cert_sig_digest_update(const struct public_key_signature *sig,
253+
struct crypto_akcipher *tfm_pkey)
254+
{
255+
struct crypto_shash *tfm;
256+
struct shash_desc *desc;
257+
size_t desc_size;
258+
unsigned char dgst[SM3_DIGEST_SIZE];
259+
int ret;
260+
261+
BUG_ON(!sig->data);
262+
263+
ret = sm2_compute_z_digest(tfm_pkey, SM2_DEFAULT_USERID,
264+
SM2_DEFAULT_USERID_LEN, dgst);
265+
if (ret)
266+
return ret;
267+
268+
tfm = crypto_alloc_shash(sig->hash_algo, 0, 0);
269+
if (IS_ERR(tfm))
270+
return PTR_ERR(tfm);
271+
272+
desc_size = crypto_shash_descsize(tfm) + sizeof(*desc);
273+
desc = kzalloc(desc_size, GFP_KERNEL);
274+
if (!desc) {
275+
ret = -ENOMEM;
276+
goto error_free_tfm;
277+
}
278+
279+
desc->tfm = tfm;
280+
281+
ret = crypto_shash_init(desc);
282+
if (ret < 0)
283+
goto error_free_desc;
284+
285+
ret = crypto_shash_update(desc, dgst, SM3_DIGEST_SIZE);
286+
if (ret < 0)
287+
goto error_free_desc;
288+
289+
ret = crypto_shash_finup(desc, sig->data, sig->data_size, sig->digest);
290+
291+
error_free_desc:
292+
kfree(desc);
293+
error_free_tfm:
294+
crypto_free_shash(tfm);
295+
return ret;
296+
}
297+
#else
298+
static inline int cert_sig_digest_update(
299+
const struct public_key_signature *sig,
300+
struct crypto_akcipher *tfm_pkey)
301+
{
302+
return -ENOTSUPP;
303+
}
304+
#endif /* ! IS_REACHABLE(CONFIG_CRYPTO_SM2) */
305+
249306
/*
250307
* Verify a signature using a public key.
251308
*/

crypto/asymmetric_keys/public_key_sm2.c

Lines changed: 0 additions & 63 deletions
This file was deleted.

include/crypto/public_key.h

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -84,16 +84,4 @@ extern int verify_signature(const struct key *,
8484
int public_key_verify_signature(const struct public_key *pkey,
8585
const struct public_key_signature *sig);
8686

87-
#if IS_REACHABLE(CONFIG_CRYPTO_SM2)
88-
int cert_sig_digest_update(const struct public_key_signature *sig,
89-
struct crypto_akcipher *tfm_pkey);
90-
#else
91-
static inline
92-
int cert_sig_digest_update(const struct public_key_signature *sig,
93-
struct crypto_akcipher *tfm_pkey)
94-
{
95-
return -ENOTSUPP;
96-
}
97-
#endif
98-
9987
#endif /* _LINUX_PUBLIC_KEY_H */

0 commit comments

Comments
 (0)