我在 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
我的结果使用PKCS
“ 1122334455667788112233445566778899”作为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 派生密钥的示例,请告诉我