Blame SOURCES/0002-EP11-Fix-host-library-version-query.patch

0971d3
From 20f401a98d5c06648f5dd6ea62aa82f86662d90c Mon Sep 17 00:00:00 2001
0971d3
From: Ingo Franzki <ifranzki@linux.ibm.com>
0971d3
Date: Tue, 8 Mar 2022 15:01:24 +0100
0971d3
Subject: [PATCH 2/2] EP11: Fix host library version query
0971d3
0971d3
Look at release and modification level, not just the modification level.
0971d3
Release and modification level are encoded into the one byte minor
0971d3
field of a CK_VERSION. The high order 4 bits are the release number, the
0971d3
low order 4 bits the modification level.
0971d3
0971d3
This allows host library version checks for release and modification levels.
0971d3
0971d3
Signed-off-by: Ingo Franzki <ifranzki@linux.ibm.com>
0971d3
---
0971d3
 usr/lib/ep11_stdll/ep11_specific.c | 19 ++++++++++++++++---
0971d3
 1 file changed, 16 insertions(+), 3 deletions(-)
0971d3
0971d3
diff --git a/usr/lib/ep11_stdll/ep11_specific.c b/usr/lib/ep11_stdll/ep11_specific.c
0971d3
index 4ca9678a..2d7581fa 100644
0971d3
--- a/usr/lib/ep11_stdll/ep11_specific.c
0971d3
+++ b/usr/lib/ep11_stdll/ep11_specific.c
0971d3
@@ -2588,9 +2588,10 @@ CK_RV ep11tok_init(STDLL_TokData_t * tokdata, CK_SLOT_ID SlotNumber,
0971d3
         goto error;
0971d3
     }
0971d3
 
0971d3
-    TRACE_INFO("%s Host library version: %d.%d\n", __func__,
0971d3
+    TRACE_INFO("%s Host library version: %d.%d.%d\n", __func__,
0971d3
                ep11_data->ep11_lib_version.major,
0971d3
-               ep11_data->ep11_lib_version.minor);
0971d3
+               (ep11_data->ep11_lib_version.minor & 0xF0) >> 4,
0971d3
+               (ep11_data->ep11_lib_version.minor & 0x0F));
0971d3
 
0971d3
     rc = refresh_target_info(tokdata);
0971d3
     if (rc != CKR_OK) {
0971d3
@@ -11289,8 +11290,19 @@ static CK_RV ep11tok_get_ep11_library_version(CK_VERSION *lib_version)
0971d3
                     rc);
0971d3
         return rc;
0971d3
     }
0971d3
+    TRACE_DEVEL("%s host_version=0x08%x\n", __func__, host_version);
0971d3
     lib_version->major = (host_version & 0x00FF0000) >> 16;
0971d3
-    lib_version->minor = host_version & 0x000000FF;
0971d3
+    /* Minor is 4 bits release number and 4 bits modification level */
0971d3
+    lib_version->minor = (host_version & 0x00000F00) >> 4 |
0971d3
+                                            (host_version & 0x0000000F);
0971d3
+    if ((host_version & 0x0000F000) != 0) {
0971d3
+        lib_version->minor |= 0xF0;
0971d3
+        TRACE_DEVEL("%s relelase > 15, treating as 15\n", __func__);
0971d3
+    }
0971d3
+    if ((host_version & 0x000000F0) != 0) {
0971d3
+        lib_version->minor |= 0x0F;
0971d3
+        TRACE_DEVEL("%s modification level > 15, treating as 15\n", __func__);
0971d3
+    }
0971d3
     /*
0971d3
      * EP11 host library < v2.0 returns an invalid version (i.e. 0x100). This
0971d3
      * can safely be treated as version 1.0
0971d3
@@ -11399,6 +11411,7 @@ CK_RV ep11tok_copy_firmware_info(STDLL_TokData_t *tokdata,
0971d3
     if (target_info->card_versions != NULL)
0971d3
         pInfo->hardwareVersion = target_info->card_versions->firmware_version;
0971d3
     pInfo->firmwareVersion = ep11_data->ep11_lib_version;
0971d3
+    pInfo->firmwareVersion.minor >>= 4; /* report release, skip mod-level */
0971d3
     memcpy(pInfo->serialNumber, target_info->serialNumber,
0971d3
            sizeof(pInfo->serialNumber));
0971d3
 
0971d3
-- 
0971d3
2.16.2.windows.1
0971d3