我正在用Python为OpenSLLlibeay32.dll
编写小包装器。对于大多数函数,可以按如下方式导入它们:
self.Function_Name = self._dll.Function_Name
self.Function_Name.restype = ctypes.c_int #for example
self.Function_Name.argtypes = [list of ctypes arguments]
很遗憾,我无法以这种方式导入任何宏:
X509_get_notAfter
,X509_get_notBefore
等
有什么想法,如何使用ctypes
?在
不能导入宏。您要导入的是DLL中的函数。宏不是从DLL中导出的,因此没有要导入的内容。在
幸运的是,大多数宏都非常简单,所以您可以在Python中重新实现它们。在
或者,用C语言创建一个为每个宏定义一个函数的包装DLL,编译并链接该宏,然后用
ctypes
导入包装函数。在或者您可能希望使用^{} 或其他一些技术来代替
ctypes
。它们通常的工作方式是生成和编译封装C库并导出Python类型和函数的C代码,通常将C宏导出为Python函数与导出C函数一样容易。在或者,最简单的是,PyOpenSSL是否已经包装了您需要的所有东西?在
经过研究,我决定回答自己的问题。X509_get_notAfter的宏如下所示:
x-是X509结构,它包含X509_CINF结构,它包含X509_VAL结构,其中包含指向notAfter的指针:)
所以我的计划是在python代码中实现整个X509、X509 CINF和X509 VAL结构。在
在C语言里是这样的
^{pr2}$X509的外观如下:
这是X509的价值:
为了使整个任务更简单,我决定用ctypes.c_void\p替换所有指向我不想访问的结构的指针
所以我的python代码如下所示:
最后一步:将结构赋给从函数X509_new()接收的指针:
因此,OpenSSL宏X509的python函数将如下所示:
相关问题 更多 >
编程相关推荐