cryptodev: fix supported size check
authorPablo de Lara <pablo.de.lara.guarch@intel.com>
Tue, 15 May 2018 19:13:13 +0000 (20:13 +0100)
committerPablo de Lara <pablo.de.lara.guarch@intel.com>
Tue, 22 May 2018 14:36:11 +0000 (16:36 +0200)
Crypto capability structure contains supported
sizes for key, IV, digest, etc. on different algorithms.
These sizes can be expressed as a single value or
a range of values.
The check was broken when a size was checked against
a range with multiple values.

Also, for more clarity, the param_range_check macro
has been converted into a function.

Fixes: 38227c0e3ad2 ("cryptodev: retrieve device info")
Cc: stable@dpdk.org
Signed-off-by: Pablo de Lara <pablo.de.lara.guarch@intel.com>
Acked-by: Fiona Trahe <fiona.trahe@intel.com>
lib/librte_cryptodev/rte_cryptodev.c

index 2a95a35..4959f2a 100644 (file)
@@ -262,19 +262,40 @@ rte_cryptodev_sym_capability_get(uint8_t dev_id,
 
 }
 
-#define param_range_check(x, y) \
-       (((x < y.min) || (x > y.max)) || \
-       (y.increment != 0 && (x % y.increment) != 0))
+static int
+param_range_check(uint16_t size, const struct rte_crypto_param_range *range)
+{
+       unsigned int next_size;
+
+       /* Check lower/upper bounds */
+       if (size < range->min)
+               return -1;
+
+       if (size > range->max)
+               return -1;
+
+       /* If range is actually only one value, size is correct */
+       if (range->increment == 0)
+               return 0;
+
+       /* Check if value is one of the supported sizes */
+       for (next_size = range->min; next_size <= range->max;
+                       next_size += range->increment)
+               if (size == next_size)
+                       return 0;
+
+       return -1;
+}
 
 int
 rte_cryptodev_sym_capability_check_cipher(
                const struct rte_cryptodev_symmetric_capability *capability,
                uint16_t key_size, uint16_t iv_size)
 {
-       if (param_range_check(key_size, capability->cipher.key_size))
+       if (param_range_check(key_size, &capability->cipher.key_size) != 0)
                return -1;
 
-       if (param_range_check(iv_size, capability->cipher.iv_size))
+       if (param_range_check(iv_size, &capability->cipher.iv_size) != 0)
                return -1;
 
        return 0;
@@ -285,13 +306,13 @@ rte_cryptodev_sym_capability_check_auth(
                const struct rte_cryptodev_symmetric_capability *capability,
                uint16_t key_size, uint16_t digest_size, uint16_t iv_size)
 {
-       if (param_range_check(key_size, capability->auth.key_size))
+       if (param_range_check(key_size, &capability->auth.key_size) != 0)
                return -1;
 
-       if (param_range_check(digest_size, capability->auth.digest_size))
+       if (param_range_check(digest_size, &capability->auth.digest_size) != 0)
                return -1;
 
-       if (param_range_check(iv_size, capability->auth.iv_size))
+       if (param_range_check(iv_size, &capability->auth.iv_size) != 0)
                return -1;
 
        return 0;
@@ -303,16 +324,16 @@ rte_cryptodev_sym_capability_check_aead(
                uint16_t key_size, uint16_t digest_size, uint16_t aad_size,
                uint16_t iv_size)
 {
-       if (param_range_check(key_size, capability->aead.key_size))
+       if (param_range_check(key_size, &capability->aead.key_size) != 0)
                return -1;
 
-       if (param_range_check(digest_size, capability->aead.digest_size))
+       if (param_range_check(digest_size, &capability->aead.digest_size) != 0)
                return -1;
 
-       if (param_range_check(aad_size, capability->aead.aad_size))
+       if (param_range_check(aad_size, &capability->aead.aad_size) != 0)
                return -1;
 
-       if (param_range_check(iv_size, capability->aead.iv_size))
+       if (param_range_check(iv_size, &capability->aead.iv_size) != 0)
                return -1;
 
        return 0;