2017-04-09 62 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” –