4 * Copyright (C) AB Strakt
5 * See LICENSE for details.
7 * Exports from crypto.c.
8 * See the file RATIONALE for a short explanation of why this module was written.
13 #ifndef PyOpenSSL_CRYPTO_H_
14 #define PyOpenSSL_CRYPTO_H_
19 #include "netscape_spki.h"
20 #include "x509store.h"
30 extern PyObject *crypto_Error;
32 #define crypto_X509_New_NUM 0
33 #define crypto_X509_New_RETURN crypto_X509Obj *
34 #define crypto_X509_New_PROTO (X509 *, int)
36 #define crypto_X509Req_New_NUM 1
37 #define crypto_X509Req_New_RETURN crypto_X509ReqObj *
38 #define crypto_X509Req_New_PROTO (X509_REQ *, int)
40 #define crypto_X509Store_New_NUM 2
41 #define crypto_X509Store_New_RETURN crypto_X509StoreObj *
42 #define crypto_X509Store_New_PROTO (X509_STORE *, int)
44 #define crypto_PKey_New_NUM 3
45 #define crypto_PKey_New_RETURN crypto_PKeyObj *
46 #define crypto_PKey_New_PROTO (EVP_PKEY *, int)
48 #define crypto_X509Name_New_NUM 4
49 #define crypto_X509Name_New_RETURN crypto_X509NameObj *
50 #define crypto_X509Name_New_PROTO (X509_NAME *, int)
52 #define crypto_X509Extension_New_NUM 5
53 #define crypto_X509Extension_New_RETURN crypto_X509ExtensionObj *
54 #define crypto_X509Extension_New_PROTO (char *, int, char *, crypto_X509Obj *, crypto_X509Obj *)
56 #define crypto_PKCS7_New_NUM 6
57 #define crypto_PKCS7_New_RETURN crypto_PKCS7Obj *
58 #define crypto_PKCS7_New_PROTO (PKCS7 *, int)
60 #define crypto_NetscapeSPKI_New_NUM 7
61 #define crypto_NetscapeSPKI_New_RETURN crypto_NetscapeSPKIObj *
62 #define crypto_NetscapeSPKI_New_PROTO (NETSCAPE_SPKI *, int)
64 #define crypto_API_pointers 8
66 #if defined(PY3) || defined(crypto_MODULE)
69 #define EXPORT __declspec(dllexport)
74 extern EXPORT crypto_X509_New_RETURN crypto_X509_New crypto_X509_New_PROTO;
75 extern EXPORT crypto_X509Name_New_RETURN crypto_X509Name_New crypto_X509Name_New_PROTO;
76 extern crypto_X509Req_New_RETURN crypto_X509Req_New crypto_X509Req_New_PROTO;
77 extern EXPORT crypto_X509Store_New_RETURN crypto_X509Store_New crypto_X509Store_New_PROTO;
78 extern crypto_PKey_New_RETURN crypto_PKey_New crypto_PKey_New_PROTO;
79 extern crypto_X509Extension_New_RETURN crypto_X509Extension_New crypto_X509Extension_New_PROTO;
80 extern crypto_PKCS7_New_RETURN crypto_PKCS7_New crypto_PKCS7_New_PROTO;
81 extern crypto_NetscapeSPKI_New_RETURN crypto_NetscapeSPKI_New crypto_NetscapeSPKI_New_PROTO;
83 int crypto_byte_converter(PyObject *input, void *output);
85 #else /* crypto_MODULE */
87 extern void **crypto_API;
89 #define crypto_X509_New \
90 (*(crypto_X509_New_RETURN (*)crypto_X509_New_PROTO) crypto_API[crypto_X509_New_NUM])
91 #define crypto_X509Name_New \
92 (*(crypto_X509Name_New_RETURN (*)crypto_X509Name_New_PROTO) crypto_API[crypto_X509Name_New_NUM])
93 #define crypto_X509Req_New \
94 (*(crypto_X509Req_New_RETURN (*)crypto_X509Req_New_PROTO) crypto_API[crypto_X509Req_New_NUM])
95 #define crypto_X509Store_New \
96 (*(crypto_X509Store_New_RETURN (*)crypto_X509Store_New_PROTO) crypto_API[crypto_X509Store_New_NUM])
97 #define crypto_PKey_New \
98 (*(crypto_PKey_New_RETURN (*)crypto_PKey_New_PROTO) crypto_API[crypto_PKey_New_NUM])
99 #define crypto_X509Extension_New\
100 (*(crypto_X509Extension_New_RETURN (*)crypto_X509Extension_New_PROTO) crypto_API[crypto_X509Extension_New_NUM])
101 #define crypto_PKCS7_New \
102 (*(crypto_PKCS7_New_RETURN (*)crypto_PKCS7_New_PROTO) crypto_API[crypto_PKCS7_New_NUM])
103 #define crypto_NetscapeSPKI_New \
104 (*(crypto_NetscapeSPKI_New_RETURN (*)crypto_NetscapeSPKI_New_PROTO) crypto_API[crypto_NetscapeSPKI_New_NUM])
106 #define import_crypto() \
108 PyObject *crypto_module = PyImport_ImportModule("OpenSSL.crypto"); \
109 if (crypto_module != NULL) { \
110 PyObject *crypto_dict, *crypto_api_object; \
111 crypto_dict = PyModule_GetDict(crypto_module); \
112 crypto_api_object = PyDict_GetItemString(crypto_dict, "_C_API"); \
113 if (PyCObject_Check(crypto_api_object)) { \
114 crypto_API = (void **)PyCObject_AsVoidPtr(crypto_api_object); \
119 #endif /* crypto_MODULE */
121 /* Define a new type for emitting text. Hopefully these don't collide with
122 * future official OpenSSL constants, but the switch statement of
123 * dump_certificate() will alert us if it matters.
125 #ifndef X509_FILETYPE_TEXT
126 #define X509_FILETYPE_TEXT (58)
129 #endif /* PyOpenSSL_CRYPTO_H_ */