Blame SOURCES/0005-Fix-storing-of-public-token-objects-in-new-data-form.patch

1bd38d
From 6850ae623f9d36b70f1d2919c8390a4b14d393a1 Mon Sep 17 00:00:00 2001
1bd38d
From: Ingo Franzki <ifranzki@linux.ibm.com>
1bd38d
Date: Mon, 6 Jul 2020 13:16:01 +0200
1bd38d
Subject: [PATCH 5/5] Fix storing of public token objects in new data format
1bd38d
1bd38d
The tokversion and object length field are supposed to be stored
1bd38d
in big endian (BE) on all platforms. This was not the case for public
1bd38d
token objects.
1bd38d
1bd38d
Fix this by always storing it in BE, and add logic to the read routines
1bd38d
to automatically detect if the fields are in the expected byte order,
1bd38d
or not, and handle them accordingly.
1bd38d
1bd38d
Signed-off-by: Ingo Franzki <ifranzki@linux.ibm.com>
1bd38d
---
1bd38d
 usr/lib/common/loadsave.c | 32 +++++++++++++++++++++++++++-----
1bd38d
 1 file changed, 27 insertions(+), 5 deletions(-)
1bd38d
1bd38d
diff --git a/usr/lib/common/loadsave.c b/usr/lib/common/loadsave.c
1bd38d
index 068fdf36..b76dea9f 100644
1bd38d
--- a/usr/lib/common/loadsave.c
1bd38d
+++ b/usr/lib/common/loadsave.c
1bd38d
@@ -2557,6 +2557,7 @@ CK_RV reload_token_object(STDLL_TokData_t *tokdata, OBJECT *obj)
1bd38d
     CK_ULONG size_64;
1bd38d
     CK_RV rc;
1bd38d
     uint32_t len;
1bd38d
+    uint32_t ver;
1bd38d
 
1bd38d
     if (tokdata->version < TOK_NEW_DATA_STORE)
1bd38d
         return reload_token_object_old(tokdata, obj);
1bd38d
@@ -2580,9 +2581,18 @@ CK_RV reload_token_object(STDLL_TokData_t *tokdata, OBJECT *obj)
1bd38d
         goto done;
1bd38d
     }
1bd38d
 
1bd38d
+    memcpy(&ver, header, 4);
1bd38d
     memcpy(&priv, header + 4, 1);
1bd38d
     memcpy(&len, header + 60, 4);
1bd38d
-    size = be32toh(len);
1bd38d
+
1bd38d
+    /*
1bd38d
+     * In OCK 3.12 - 3.14 the version and size was not stored in BE. So if
1bd38d
+     * version field is in platform endianness, keep size as is also.
1bd38d
+     */
1bd38d
+    if (ver == TOK_NEW_DATA_STORE)
1bd38d
+        size = len;
1bd38d
+    else
1bd38d
+        size = be32toh(len);
1bd38d
 
1bd38d
     buf = (CK_BYTE *) malloc(size);
1bd38d
     if (buf == NULL) {
1bd38d
@@ -2647,8 +2657,9 @@ CK_RV save_public_token_object(STDLL_TokData_t *tokdata, OBJECT *obj)
1bd38d
     CK_ULONG clear_len;
1bd38d
     CK_BBOOL flag = FALSE;
1bd38d
     CK_RV rc;
1bd38d
-    CK_ULONG_32 len;
1bd38d
+    CK_ULONG_32 len, be_len;
1bd38d
     unsigned char reserved[7] = {0};
1bd38d
+    uint32_t tmp;
1bd38d
 
1bd38d
     if (tokdata->version < TOK_NEW_DATA_STORE)
1bd38d
         return save_public_token_object_old(tokdata, obj);
1bd38d
@@ -2669,11 +2680,14 @@ CK_RV save_public_token_object(STDLL_TokData_t *tokdata, OBJECT *obj)
1bd38d
         goto done;
1bd38d
     }
1bd38d
 
1bd38d
+    tmp = htobe32(tokdata->version);
1bd38d
+    be_len = htobe32(len);
1bd38d
+
1bd38d
     set_perm(fileno(fp));
1bd38d
-    if (fwrite(&tokdata->version, 4, 1, fp) != 1
1bd38d
+    if (fwrite(&tmp, 4, 1, fp) != 1
1bd38d
         || fwrite(&flag, 1, 1, fp) != 1
1bd38d
         || fwrite(reserved, 7, 1, fp) != 1
1bd38d
-        || fwrite(&len, 4, 1, fp) != 1
1bd38d
+        || fwrite(&be_len, 4, 1, fp) != 1
1bd38d
         || fwrite(clear, len, 1, fp) != 1) {
1bd38d
         rc = CKR_FUNCTION_FAILED;
1bd38d
         goto done;
1bd38d
@@ -2704,6 +2718,7 @@ CK_RV load_public_token_objects(STDLL_TokData_t *tokdata)
1bd38d
     CK_BBOOL priv;
1bd38d
     CK_ULONG_32 size;
1bd38d
     unsigned char header[PUB_HEADER_LEN];
1bd38d
+    uint32_t ver;
1bd38d
 
1bd38d
     if (tokdata->version < TOK_NEW_DATA_STORE)
1bd38d
         return load_public_token_objects_old(tokdata);
1bd38d
@@ -2731,9 +2746,16 @@ CK_RV load_public_token_objects(STDLL_TokData_t *tokdata)
1bd38d
             continue;
1bd38d
         }
1bd38d
 
1bd38d
+        memcpy(&ver, header, 4);
1bd38d
         memcpy(&priv, header + 4, 1);
1bd38d
         memcpy(&size, header + 12, 4);
1bd38d
-        size = be32toh(size);
1bd38d
+
1bd38d
+        /*
1bd38d
+         * In OCK 3.12 - 3.14 the version and size was not stored in BE. So if
1bd38d
+         * version field is in platform endianness, keep size as is also
1bd38d
+         */
1bd38d
+        if (ver != TOK_NEW_DATA_STORE)
1bd38d
+            size = be32toh(size);
1bd38d
 
1bd38d
         if (priv == TRUE) {
1bd38d
             fclose(fp2);
1bd38d
-- 
1bd38d
2.16.2.windows.1
1bd38d