crypto: dh - Make public key test FIPS-only
authorHerbert Xu <herbert@gondor.apana.org.au>
Wed, 21 Feb 2024 05:19:15 +0000 (13:19 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 1 Mar 2024 10:35:40 +0000 (18:35 +0800)
The function dh_is_pubkey_valid was added to for FIPS but it was
only partially conditional to fips_enabled.

In particular, the first test in the function relies on the last
test to work properly, but the last test is only run in FIPS mode.

Fix this inconsistency by making the whole function conditional
on fips_enabled.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
crypto/dh.c

index 0fcad279e6fe9295fa2037569ea1bbba2648a6af..68d11d66c0b54d45018867da41f7f26309dd77a7 100644 (file)
@@ -106,6 +106,12 @@ err_clear_ctx:
  */
 static int dh_is_pubkey_valid(struct dh_ctx *ctx, MPI y)
 {
+       MPI val, q;
+       int ret;
+
+       if (!fips_enabled)
+               return 0;
+
        if (unlikely(!ctx->p))
                return -EINVAL;
 
@@ -125,40 +131,35 @@ static int dh_is_pubkey_valid(struct dh_ctx *ctx, MPI y)
         *
         * For the safe-prime groups q = (p - 1)/2.
         */
-       if (fips_enabled) {
-               MPI val, q;
-               int ret;
+       val = mpi_alloc(0);
+       if (!val)
+               return -ENOMEM;
 
-               val = mpi_alloc(0);
-               if (!val)
-                       return -ENOMEM;
+       q = mpi_alloc(mpi_get_nlimbs(ctx->p));
+       if (!q) {
+               mpi_free(val);
+               return -ENOMEM;
+       }
 
-               q = mpi_alloc(mpi_get_nlimbs(ctx->p));
-               if (!q) {
-                       mpi_free(val);
-                       return -ENOMEM;
-               }
+       /*
+        * ->p is odd, so no need to explicitly subtract one
+        * from it before shifting to the right.
+        */
+       mpi_rshift(q, ctx->p, 1);
 
-               /*
-                * ->p is odd, so no need to explicitly subtract one
-                * from it before shifting to the right.
-                */
-               mpi_rshift(q, ctx->p, 1);
-
-               ret = mpi_powm(val, y, q, ctx->p);
-               mpi_free(q);
-               if (ret) {
-                       mpi_free(val);
-                       return ret;
-               }
+       ret = mpi_powm(val, y, q, ctx->p);
+       mpi_free(q);
+       if (ret) {
+               mpi_free(val);
+               return ret;
+       }
 
-               ret = mpi_cmp_ui(val, 1);
+       ret = mpi_cmp_ui(val, 1);
 
-               mpi_free(val);
+       mpi_free(val);
 
-               if (ret != 0)
-                       return -EINVAL;
-       }
+       if (ret != 0)
+               return -EINVAL;
 
        return 0;
 }