X.509: Fix modular build of public_key_sm2
authorHerbert Xu <herbert@gondor.apana.org.au>
Wed, 7 Oct 2020 06:05:45 +0000 (17:05 +1100)
committerHerbert Xu <herbert@gondor.apana.org.au>
Thu, 8 Oct 2020 05:39:14 +0000 (16:39 +1100)
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: 215525639631 ("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>
crypto/asymmetric_keys/Makefile
crypto/asymmetric_keys/public_key.c
crypto/asymmetric_keys/public_key_sm2.c [deleted file]
include/crypto/public_key.h

index 1a99ea5..28b91ad 100644 (file)
@@ -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
 
 #
index 1d04920..8892908 100644 (file)
@@ -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.");
@@ -246,6 +248,61 @@ error_free_tfm:
        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.
  */
diff --git a/crypto/asymmetric_keys/public_key_sm2.c b/crypto/asymmetric_keys/public_key_sm2.c
deleted file mode 100644 (file)
index 66b614e..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-or-later */
-/*
- * asymmetric public-key algorithm for SM2-with-SM3 certificate
- * as specified by OSCCA GM/T 0003.1-2012 -- 0003.5-2012 SM2 and
- * described at https://tools.ietf.org/html/draft-shen-sm2-ecdsa-02
- *
- * Copyright (c) 2020, Alibaba Group.
- * Authors: Tianjia Zhang <tianjia.zhang@linux.alibaba.com>
- */
-
-#include <crypto/sm3_base.h>
-#include <crypto/sm2.h>
-#include <crypto/public_key.h>
-
-#if IS_REACHABLE(CONFIG_CRYPTO_SM2)
-
-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;
-}
-
-#endif /* ! IS_REACHABLE(CONFIG_CRYPTO_SM2) */
index 02a6dbe..948c520 100644 (file)
@@ -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 */