0

我在 HSM 中有一把钥匙

我想从中派生另一个密钥并将其用于 SHA1 HMAC 一些数据

我的问题是该CKM_CONCATENATE_DATA_AND_BASE机制无法按预期工作。

我认为它的工作原理如下:

如果我的密钥(BASE)“11 22 33 44 55 66 77 88”并且我想在它的开头添加“00” (DATA)我想新的密钥是“00 11 22 33 44 55 66 77 88”但生成(并保存)键是“00 11 22 33 44 55 66 77”

派生密钥长度不会改变,原始密钥末尾的一个字节会下降!

我应该怎么办?

我尝试添加ObjectAttribute VALUE_LEN. 但派生密钥长度不会改变。

    static void PkcsTest()
        {
            string p11lib = "_pkcs11.dll";
            var factories = new Pkcs11InteropFactories();
            var library = factories.Pkcs11LibraryFactory.LoadPkcs11Library(factories, p11lib, AppType.MultiThreaded);
            var slots = library.GetSlotList(SlotsType.WithTokenPresent);
            var slot = slots[0];
            var session = slot.OpenSession(SessionType.ReadWrite);
            session.Login(CKU.CKU_USER, "123456");

            var data = new byte[] { 0x68, 0x65, 0x6c, 0x6c, 0x6f };
            var originalKey = new byte[]{0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99};
            var dataToAddToKey = new byte[] { 0x00 };
            //Import key to HSM
            var objectAttributes = new List<IObjectAttribute>
            {
                session.Factories.ObjectAttributeFactory.Create(CKA.CKA_CLASS, CKO.CKO_SECRET_KEY),
                session.Factories.ObjectAttributeFactory.Create(CKA.CKA_KEY_TYPE, CKK.CKK_GENERIC_SECRET),
                session.Factories.ObjectAttributeFactory.Create(CKA.CKA_VALUE,originalKey ),
                session.Factories.ObjectAttributeFactory.Create(CKA.CKA_DERIVE,true ),
            };
            var originalKeyHandler = session.CreateObject(objectAttributes);
            //creating extended key
            var mechanismParams = session.Factories.MechanismParamsFactory.CreateCkKeyDerivationStringData(dataToAddToKey);
            var mechanismType = session.Factories.MechanismFactory.Create(CKM.CKM_CONCATENATE_DATA_AND_BASE, mechanismParams);
            var extendedKeyHandler = session.DeriveKey(mechanismType, originalKeyHandler, null);
            //generating SHA1 HMAC 
            var hmacMechanism = session.Factories.MechanismFactory.Create(CKM.CKM_SHA_1_HMAC);
            var hash = session.Sign(hmacMechanism, extendedKeyHandler, data);
            //expected : 04FE079DA27D1D8A8EB812A0BCBE1D264D0A6D7C
            //result   : 31A559C06CE465831D354A3EE058A1C519180E87
        }

这是我使用的结果System.Security.Cryptography.HMACSHA1

data is "0x68, 0x65, 0x6c, 0x6c, 0x6f" in all tests
KEY:1122334455667788112233445566778899 
HASH: F1D20BBBDD3D07D883827F64A55DB58BD2136C9F
KEY:001122334455667788112233445566778899 
HASH: 04FE079DA27D1D8A8EB812A0BCBE1D264D0A6D7C
KEY:0011223344556677881122334455667788 
HASH:31A559C06CE465831D354A3EE058A1C519180E87

我的结果使用PKCS1122334455667788112233445566778899”作为original key

Sign with Original Key : F1D20BBBDD3D07D883827F64A55DB58BD2136C9F
sign with derived key  : 31A559C06CE465831D354A3EE058A1C519180E87
expected result        : 04FE079DA27D1D8A8EB812A0BCBE1D264D0A6D7C

更新 1:

Derive with Concatenate 机制后的密钥大小始终与原始密钥相同。我尝试使用任何大小的数据添加数据 AFTER 键(使用 CKM_CONCATENATE_BASE_AND_DATA),但什么也没发生。派生密钥和原始密钥相同。因为 HSM 将 n 字节添加到原始密钥并再次删除(因此密钥大小保持不变,我不想这样做)

如果有人有使用 CKM_CONCATENATE_BASE_AND_DATA 派生密钥的示例,请告诉我

4

0 回答 0