Blame SOURCES/0006-EP11-Pass-back-chain-code-for-CKM_IBM_BTC_DERIVE.patch

1f6f0c
From c6d6be8b7c1c1fa346af420daada56e28da5af6d Mon Sep 17 00:00:00 2001
1f6f0c
From: Ingo Franzki <ifranzki@linux.ibm.com>
1f6f0c
Date: Fri, 4 Nov 2022 09:44:35 +0100
1f6f0c
Subject: [PATCH 06/34] EP11: Pass back chain code for CKM_IBM_BTC_DERIVE
1f6f0c
1f6f0c
When deriving a key using CKM_IBM_BTC_DERIVE, the resulting chain code
1f6f0c
must be passed back in the buffer supplied by the caller in the
1f6f0c
mechanism parameter (field pChainCode in CK_IBM_BTC_DERIVE_PARAMS).
1f6f0c
This chain code can then be used to derive further keys from the just
1f6f0c
derived key.
1f6f0c
1f6f0c
Note that field ulChainCodeLen must be zero for any BTC master key
1f6f0c
derivation, but pChainCode must still point to a buffer of 32 bytes
1f6f0c
(CK_IBM_BTC_CHAINCODE_LENGTH) to receive the resulting chain code.
1f6f0c
1f6f0c
Signed-off-by: Ingo Franzki <ifranzki@linux.ibm.com>
1f6f0c
---
1f6f0c
 usr/lib/ep11_stdll/ep11_specific.c | 20 ++++++++++++++++++++
1f6f0c
 1 file changed, 20 insertions(+)
1f6f0c
1f6f0c
diff --git a/usr/lib/ep11_stdll/ep11_specific.c b/usr/lib/ep11_stdll/ep11_specific.c
1f6f0c
index 432790f1..a56b5b82 100644
1f6f0c
--- a/usr/lib/ep11_stdll/ep11_specific.c
1f6f0c
+++ b/usr/lib/ep11_stdll/ep11_specific.c
1f6f0c
@@ -4988,6 +4988,7 @@ CK_RV ep11tok_derive_key(STDLL_TokData_t * tokdata, SESSION * session,
1f6f0c
     CK_ULONG used_firmware_API_version;
1f6f0c
     CK_MECHANISM_PTR mech_orig = mech;
1f6f0c
     CK_ATTRIBUTE *ec_params;
1f6f0c
+    CK_IBM_BTC_DERIVE_PARAMS *btc_params = NULL;
1f6f0c
 
1f6f0c
     memset(newblob, 0, sizeof(newblob));
1f6f0c
 
1f6f0c
@@ -5106,6 +5107,18 @@ CK_RV ep11tok_derive_key(STDLL_TokData_t * tokdata, SESSION * session,
1f6f0c
         }
1f6f0c
     }
1f6f0c
 
1f6f0c
+    if (mech->mechanism == CKM_IBM_BTC_DERIVE) {
1f6f0c
+        if (mech->ulParameterLen != sizeof(CK_IBM_BTC_DERIVE_PARAMS) ||
1f6f0c
+            mech->pParameter == NULL) {
1f6f0c
+            TRACE_ERROR("%s Param NULL or len for %s wrong: %lu\n",
1f6f0c
+                        __func__, ep11_get_ckm(tokdata, mech->mechanism),
1f6f0c
+                        mech->ulParameterLen);
1f6f0c
+            return CKR_MECHANISM_PARAM_INVALID;
1f6f0c
+        }
1f6f0c
+
1f6f0c
+        btc_params = (CK_IBM_BTC_DERIVE_PARAMS *)mech->pParameter;
1f6f0c
+    }
1f6f0c
+
1f6f0c
     rc = h_opaque_2_blob(tokdata, hBaseKey, &keyblob, &keyblobsize,
1f6f0c
                          &base_key_obj, READ_LOCK);
1f6f0c
     if (rc != CKR_OK) {
1f6f0c
@@ -5300,6 +5313,13 @@ CK_RV ep11tok_derive_key(STDLL_TokData_t * tokdata, SESSION * session,
1f6f0c
     }
1f6f0c
     opaque_attr = NULL;
1f6f0c
 
1f6f0c
+    if (mech->mechanism == CKM_IBM_BTC_DERIVE &&
1f6f0c
+        btc_params != NULL && btc_params->pChainCode != NULL &&
1f6f0c
+        cslen >= CK_IBM_BTC_CHAINCODE_LENGTH) {
1f6f0c
+        memcpy(btc_params->pChainCode, csum, CK_IBM_BTC_CHAINCODE_LENGTH);
1f6f0c
+        btc_params->ulChainCodeLen = CK_IBM_BTC_CHAINCODE_LENGTH;
1f6f0c
+    }
1f6f0c
+
1f6f0c
     if (mech->mechanism == CKM_IBM_BTC_DERIVE && class == CKO_PUBLIC_KEY) {
1f6f0c
         /* Derived blob is an SPKI, extract public EC key attributes */
1f6f0c
         rc = ecdsa_priv_unwrap_get_data(key_obj->template,
1f6f0c
-- 
1f6f0c
2.16.2.windows.1
1f6f0c