File gnutls-FIPS-HMAC-x86_64-v3-opt.patch of Package gnutls

Index: gnutls-3.8.9/lib/fips.c
===================================================================
--- gnutls-3.8.9.orig/lib/fips.c
+++ gnutls-3.8.9/lib/fips.c
@@ -268,6 +268,28 @@ static int handler(void *user, const cha
 	return 1;
 }
 
+
+/* In case of x86_64-v3 optmizations, names might differ in version numbers.
+ * @mac_file: buffer where the hmac file path will be written to
+ * @lib_path: path to the dependent library, used to deduce hmac file path
+ * @file_name: The file name of the library
+ */
+ static void get_hwcaps_lib_hmac_path(char *mac_file, const char *lib_path, char *file_name) {
+	// Cut name short if more than SOVER is present 
+	char *soname = strstr(file_name, ".so.");
+	char correct_ext[256];
+	memset(correct_ext, 0x0, 256);
+	soname += strlen(".so.");
+	for (uint32_t i = 0; i < strlen(soname); i++) {
+		if (soname[i] == '.') {
+			int proper_len = soname - file_name + i;
+			strncpy(correct_ext, file_name, proper_len);
+			snprintf(mac_file, 256, "%.*s/.%.*s.hmac",  (int)(file_name-lib_path),lib_path,proper_len,correct_ext);
+			break;	
+		}
+	}
+}
+
 /*
  * get_hmac_path:
  * @mac_file: buffer where the hmac file path will be written to
@@ -300,6 +322,13 @@ static int get_hmac_path(char *mac_file,
 	if (ret == 0)
 		return GNUTLS_E_SUCCESS;
 
+	if (strstr(gnutls_path, "glibc-hwcaps")) {
+		get_hwcaps_lib_hmac_path(mac_file, gnutls_path, p + 1);
+		ret = _gnutls_file_exists(mac_file);
+		if (ret == 0)
+			return GNUTLS_E_SUCCESS;
+	}
+		
 	if (p == NULL)
 		ret = snprintf(mac_file, mac_file_size, "fipscheck/.%s.hmac",
 			       gnutls_path);
openSUSE Build Service is sponsored by