2017-04-09 59 views
0

如何將由C_FindObject返回的ulong Object_Handle轉換爲C#中的X509Certificate對象。這是代碼。將PKCS'11對象句柄轉換爲C#中的X509Certificate對象

ulong[] foundObjectIds = new ulong[10]; 
foundObjectIds[0] = CK_INVALID_HANDLE; 
success = PKCS11CsharpWrapper.C_FindObjects(session, foundObjectIds, Convert.ToUInt64(foundObjectIds.Length), ref foundObjectCount); 

現在我必須將foundObjectIds [0]轉換爲X509Certificate對象。

我試過下面的方法,它不適合我。

IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(ulong))); 
Marshal.StructureToPtr(foundObjectIds[0], ptr, false); 
IntPtr[] arr = new IntPtr[2]; 
Marshal.Copy(ptr, arr, 0, 1); 
X509Certificate2 cert= new X509Certificate2((IntPtr)foundObjectIds[0]); 

回答

0

對象句柄不能轉換爲X509Certificate2對象。您需要使用C_GetAttributeValue函數讀取證書對象的屬性的值。 屬性包含DER編碼證書,該證書可以作爲byte[]傳遞給X509Certificate2類的構造函數。

順便說一句如果你正在使用Pkcs11Interop庫,那你爲什麼要用LowLevelAPI而不是HighLevelAPI

+0

我最近遇到了這個PKCS11 interop。在那之前我的原型是基於lowlevel api的。我剛開始用highlevel api替換它們,但在兩種情況下它都返回一個IntPtr。我嘗試將內容複製到一個byte []並嘗試使用它來初始化X509Certifcate。但是我得到錯誤。 「字節數組不能轉換爲X509Certificate」 –