test: add two comparision options to fips version test utility code
authorPauli <pauli@openssl.org>
Mon, 14 Nov 2022 02:13:44 +0000 (13:13 +1100)
committerTomas Mraz <tomas@openssl.org>
Tue, 15 Nov 2022 11:10:39 +0000 (12:10 +0100)
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/19666)

test/testutil.h
test/testutil/provider.c

index fde9ff046b48b83752c6b3f881834ad92b55b7b5..3a3aafc655768351b00c0629ddd4245ad5af5161 100644 (file)
@@ -257,7 +257,9 @@ void cleanup_tests(void);
 int fips_provider_version_eq(OSSL_LIB_CTX *libctx, int major, int minor, int patch);
 int fips_provider_version_ne(OSSL_LIB_CTX *libctx, int major, int minor, int patch);
 int fips_provider_version_le(OSSL_LIB_CTX *libctx, int major, int minor, int patch);
+int fips_provider_version_lt(OSSL_LIB_CTX *libctx, int major, int minor, int patch);
 int fips_provider_version_gt(OSSL_LIB_CTX *libctx, int major, int minor, int patch);
+int fips_provider_version_ge(OSSL_LIB_CTX *libctx, int major, int minor, int patch);
 
 /*
  * This function matches fips provider version with (potentially multiple)
index c8b5dfc0617b47f3273b83d3f0dc29199c7efe7b..199e4f03af90afa1be6401d791e7949a4884032e 100644 (file)
@@ -129,6 +129,19 @@ int fips_provider_version_le(OSSL_LIB_CTX *libctx, int major, int minor, int pat
                    || (prov.minor == minor && prov.patch <= patch)));
 }
 
+int fips_provider_version_lt(OSSL_LIB_CTX *libctx, int major, int minor, int patch)
+{
+    FIPS_VERSION prov;
+    int res;
+
+    if ((res = fips_provider_version(libctx, &prov)) <= 0)
+        return res == 0;
+    return prov.major < major
+           || (prov.major == major
+               && (prov.minor < minor
+                   || (prov.minor == minor && prov.patch < patch)));
+}
+
 int fips_provider_version_gt(OSSL_LIB_CTX *libctx, int major, int minor, int patch)
 {
     FIPS_VERSION prov;
@@ -142,12 +155,25 @@ int fips_provider_version_gt(OSSL_LIB_CTX *libctx, int major, int minor, int pat
                    || (prov.minor == minor && prov.patch > patch)));
 }
 
+int fips_provider_version_ge(OSSL_LIB_CTX *libctx, int major, int minor, int patch)
+{
+    FIPS_VERSION prov;
+    int res;
+
+    if ((res = fips_provider_version(libctx, &prov)) <= 0)
+        return res == 0;
+    return prov.major > major
+           || (prov.major == major
+               && (prov.minor > minor
+                   || (prov.minor == minor && prov.patch >= patch)));
+}
+
 int fips_provider_version_match(OSSL_LIB_CTX *libctx, const char *versions)
 {
     const char *p;
     int major, minor, patch, r;
     enum {
-        MODE_EQ, MODE_NE, MODE_LE, MODE_GT
+        MODE_EQ, MODE_NE, MODE_LE, MODE_LT, MODE_GT, MODE_GE
     } mode;
 
     while (*versions != '\0') {
@@ -166,6 +192,12 @@ int fips_provider_version_match(OSSL_LIB_CTX *libctx, const char *versions)
         } else if (*p == '<' && p[1] == '=') {
             mode = MODE_LE;
             p += 2;
+        } else if (*p == '>' && p[1] == '=') {
+            mode = MODE_GE;
+            p += 2;
+        } else if (*p == '<') {
+            mode = MODE_LT;
+            p++;
         } else if (*p == '>') {
             mode = MODE_GT;
             p++;
@@ -189,9 +221,15 @@ int fips_provider_version_match(OSSL_LIB_CTX *libctx, const char *versions)
         case MODE_LE:
             r = fips_provider_version_le(libctx, major, minor, patch);
             break;
+        case MODE_LT:
+            r = fips_provider_version_lt(libctx, major, minor, patch);
+            break;
         case MODE_GT:
             r = fips_provider_version_gt(libctx, major, minor, patch);
             break;
+        case MODE_GE:
+            r = fips_provider_version_ge(libctx, major, minor, patch);
+            break;
         }
         if (r < 0) {
             TEST_info("Error matching FIPS version: internal error\n");