crypto/qat: fix smaller modulus cases for mod exp
authorArek Kusztal <arkadiuszx.kusztal@intel.com>
Tue, 1 Mar 2022 14:16:16 +0000 (14:16 +0000)
committerAkhil Goyal <gakhil@marvell.com>
Fri, 4 Mar 2022 10:20:36 +0000 (11:20 +0100)
This patch fixes not working cases when modulus is
smaller than other arguments.

Fixes: 3b78aa7b2317 ("crypto/qat: refactor asymmetric crypto functions")

Signed-off-by: Arek Kusztal <arkadiuszx.kusztal@intel.com>
Acked-by: Fan Zhang <roy.fan.zhang@intel.com>
drivers/common/qat/qat_adf/qat_pke.h
drivers/crypto/qat/qat_asym.c

index 092fc37..b5fb2a0 100644 (file)
@@ -17,38 +17,44 @@ struct qat_asym_function {
 };
 
 static struct qat_asym_function
-get_modexp_function(struct rte_crypto_asym_xform *xform)
+get_modexp_function2(uint32_t bytesize)
 {
        struct qat_asym_function qat_function = { };
 
-       if (xform->modex.modulus.length <= 64) {
+       if (bytesize <= 64) {
                qat_function.func_id = MATHS_MODEXP_L512;
                qat_function.bytesize = 64;
-       } else if (xform->modex.modulus.length <= 128) {
+       } else if (bytesize <= 128) {
                qat_function.func_id = MATHS_MODEXP_L1024;
                qat_function.bytesize = 128;
-       } else if (xform->modex.modulus.length <= 192) {
+       } else if (bytesize <= 192) {
                qat_function.func_id = MATHS_MODEXP_L1536;
                qat_function.bytesize = 192;
-       } else if (xform->modex.modulus.length <= 256) {
+       } else if (bytesize <= 256) {
                qat_function.func_id = MATHS_MODEXP_L2048;
                qat_function.bytesize = 256;
-       } else if (xform->modex.modulus.length <= 320) {
+       } else if (bytesize <= 320) {
                qat_function.func_id = MATHS_MODEXP_L2560;
                qat_function.bytesize = 320;
-       } else if (xform->modex.modulus.length <= 384) {
+       } else if (bytesize <= 384) {
                qat_function.func_id = MATHS_MODEXP_L3072;
                qat_function.bytesize = 384;
-       } else if (xform->modex.modulus.length <= 448) {
+       } else if (bytesize <= 448) {
                qat_function.func_id = MATHS_MODEXP_L3584;
                qat_function.bytesize = 448;
-       } else if (xform->modex.modulus.length <= 512) {
+       } else if (bytesize <= 512) {
                qat_function.func_id = MATHS_MODEXP_L4096;
                qat_function.bytesize = 512;
        }
        return qat_function;
 }
 
+static struct qat_asym_function
+get_modexp_function(struct rte_crypto_asym_xform *xform)
+{
+       return get_modexp_function2(xform->modex.modulus.length);
+}
+
 static struct qat_asym_function
 get_modinv_function(struct rte_crypto_asym_xform *xform)
 {
index 1e4304a..479d530 100644 (file)
@@ -205,7 +205,7 @@ modexp_set_input(struct rte_crypto_asym_op *asym_op,
                struct rte_crypto_asym_xform *xform)
 {
        struct qat_asym_function qat_function;
-       uint32_t alg_bytesize, func_id;
+       uint32_t alg_bytesize, func_id, in_bytesize;
        int status = 0;
 
        CHECK_IF_NOT_EMPTY(xform->modex.modulus, "mod exp",
@@ -215,7 +215,15 @@ modexp_set_input(struct rte_crypto_asym_op *asym_op,
        if (status)
                return status;
 
-       qat_function = get_asym_function(xform);
+       if (asym_op->modex.base.length > xform->modex.exponent.length &&
+               asym_op->modex.base.length > xform->modex.modulus.length) {
+               in_bytesize = asym_op->modex.base.length;
+       } else if (xform->modex.exponent.length > xform->modex.modulus.length)
+               in_bytesize = xform->modex.exponent.length;
+       else
+               in_bytesize = xform->modex.modulus.length;
+
+       qat_function = get_modexp_function2(in_bytesize);
        func_id = qat_function.func_id;
        if (qat_function.func_id == 0) {
                QAT_LOG(ERR, "Cannot obtain functionality id");