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)
|| (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;
|| (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') {
} 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++;
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");