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

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