app-cdr/k3b:3.5 from kde-sunset
[anomen-overlay.git] / kde-base / kdelibs / files / kdelibs-3.5-openssl-1.0.0.patch
blob5b3a714513c7ed74c22dccc78471a0fb224b7f75
1 Deal with OpenSSL 1.0.0 type-safe stacks.
3 OpenSSL 1.0.0 makes good use of typesafe stacks. This requires a number of
4 modifications for kdelibs. They tend to fall in one of three categories:
5 1. Make stack methods in KOpenSSLProxy typesafe
6 2. Adjust prototypes to match new signatures
7 3. Use proper OpenSSL stack API in places we didn't do so before
9 2010-07-19 Martin von Gagern
11 Index: kdelibs-3.5.10/kio/kssl/kopenssl.cc
12 ===================================================================
13 --- kdelibs-3.5.10.orig/kio/kssl/kopenssl.cc
14 +++ kdelibs-3.5.10/kio/kssl/kopenssl.cc
15 @@ -120,10 +120,10 @@ static void (*K_X509_STORE_CTX_set_chain
16 static void (*K_X509_STORE_CTX_set_purpose) (X509_STORE_CTX *, int) = 0L;
17 static void (*K_sk_free) (STACK*) = 0L;
18 static int (*K_sk_num) (STACK*) = 0L;
19 -static char* (*K_sk_pop) (STACK*) = 0L;
20 -static char* (*K_sk_value) (STACK*, int) = 0L;
21 +static void* (*K_sk_pop) (STACK*) = 0L;
22 +static void* (*K_sk_value) (STACK*, int) = 0L;
23 static STACK* (*K_sk_new) (int (*)()) = 0L;
24 -static int (*K_sk_push) (STACK*, char*) = 0L;
25 +static int (*K_sk_push) (STACK*, void*) = 0L;
26 static STACK* (*K_sk_dup) (STACK *) = 0L;
27 static char * (*K_i2s_ASN1_INTEGER) (X509V3_EXT_METHOD *, ASN1_INTEGER *) =0L;
28 static ASN1_INTEGER * (*K_X509_get_serialNumber) (X509 *) = 0L;
29 @@ -180,8 +180,8 @@ static void (*K_SSL_SESSION_free)(SSL_SE
30 static int (*K_SSL_set_session)(SSL*,SSL_SESSION*) = 0L;
31 static SSL_SESSION* (*K_d2i_SSL_SESSION)(SSL_SESSION**,unsigned char**, long) = 0L;
32 static int (*K_i2d_SSL_SESSION)(SSL_SESSION*,unsigned char**) = 0L;
33 -static STACK *(*K_X509_get1_email)(X509 *x) = 0L;
34 -static void (*K_X509_email_free)(STACK *sk) = 0L;
35 +static KOSSL1_STACK_OF(OPENSSL_STRING) *(*K_X509_get1_email)(X509 *x) = 0L;
36 +static void (*K_X509_email_free)(KOSSL1_STACK_OF(OPENSSL_STRING) *sk) = 0L;
37 static EVP_CIPHER *(*K_EVP_des_ede3_cbc)() = 0L;
38 static EVP_CIPHER *(*K_EVP_des_cbc)() = 0L;
39 static EVP_CIPHER *(*K_EVP_rc2_cbc)() = 0L;
40 @@ -424,10 +424,10 @@ KConfig *cfg;
41 K_X509_STORE_CTX_set_purpose = (void (*)(X509_STORE_CTX *, int)) _cryptoLib->symbol("X509_STORE_CTX_set_purpose");
42 K_sk_free = (void (*) (STACK *)) _cryptoLib->symbol("sk_free");
43 K_sk_num = (int (*) (STACK *)) _cryptoLib->symbol("sk_num");
44 - K_sk_pop = (char* (*) (STACK *)) _cryptoLib->symbol("sk_pop");
45 - K_sk_value = (char* (*) (STACK *, int)) _cryptoLib->symbol("sk_value");
46 + K_sk_pop = (void* (*) (STACK *)) _cryptoLib->symbol("sk_pop");
47 + K_sk_value = (void* (*) (STACK *, int)) _cryptoLib->symbol("sk_value");
48 K_sk_new = (STACK* (*) (int (*)())) _cryptoLib->symbol("sk_new");
49 - K_sk_push = (int (*) (STACK*, char*)) _cryptoLib->symbol("sk_push");
50 + K_sk_push = (int (*) (STACK*, void*)) _cryptoLib->symbol("sk_push");
51 K_sk_dup = (STACK* (*) (STACK *)) _cryptoLib->symbol("sk_dup");
52 K_i2s_ASN1_INTEGER = (char *(*) (X509V3_EXT_METHOD *, ASN1_INTEGER *)) _cryptoLib->symbol("i2s_ASN1_INTEGER");
53 K_X509_get_serialNumber = (ASN1_INTEGER * (*) (X509 *)) _cryptoLib->symbol("X509_get_serialNumber");
54 @@ -478,8 +478,8 @@ KConfig *cfg;
55 K_ERR_clear_error = (void (*)()) _cryptoLib->symbol("ERR_clear_error");
56 K_ERR_get_error = (unsigned long (*)()) _cryptoLib->symbol("ERR_get_error");
57 K_ERR_print_errors_fp = (void (*)(FILE*)) _cryptoLib->symbol("ERR_print_errors_fp");
58 - K_X509_get1_email = (STACK *(*)(X509 *x)) _cryptoLib->symbol("X509_get1_email");
59 - K_X509_email_free = (void (*)(STACK *sk)) _cryptoLib->symbol("X509_email_free");
60 + K_X509_get1_email = (KOSSL1_STACK_OF(OPENSSL_STRING) *(*)(X509 *x)) _cryptoLib->symbol("X509_get1_email");
61 + K_X509_email_free = (void (*)(KOSSL1_STACK_OF(OPENSSL_STRING) *sk)) _cryptoLib->symbol("X509_email_free");
62 K_EVP_des_ede3_cbc = (EVP_CIPHER *(*)()) _cryptoLib->symbol("EVP_des_ede3_cbc");
63 K_EVP_des_cbc = (EVP_CIPHER *(*)()) _cryptoLib->symbol("EVP_des_cbc");
64 K_EVP_rc2_cbc = (EVP_CIPHER *(*)()) _cryptoLib->symbol("EVP_rc2_cbc");
65 @@ -568,7 +568,7 @@ KConfig *cfg;
66 K_SSL_set_session = (int (*)(SSL*,SSL_SESSION*)) _sslLib->symbol("SSL_set_session");
67 K_d2i_SSL_SESSION = (SSL_SESSION* (*)(SSL_SESSION**,unsigned char**, long)) _sslLib->symbol("d2i_SSL_SESSION");
68 K_i2d_SSL_SESSION = (int (*)(SSL_SESSION*,unsigned char**)) _sslLib->symbol("i2d_SSL_SESSION");
69 - K_SSL_get_ciphers = (STACK *(*)(const SSL*)) _sslLib->symbol("SSL_get_ciphers");
70 + K_SSL_get_ciphers = (STACK_OF(SSL_CIPHER) *(*)(const SSL*)) _sslLib->symbol("SSL_get_ciphers");
71 #endif
74 @@ -1075,13 +1075,13 @@ int KOpenSSLProxy::sk_num(STACK *s) {
78 -char *KOpenSSLProxy::sk_pop(STACK *s) {
79 +void *KOpenSSLProxy::sk_pop(STACK *s) {
80 if (K_sk_pop) return (K_sk_pop)(s);
81 else return 0L;
85 -char *KOpenSSLProxy::sk_value(STACK *s, int n) {
86 +void *KOpenSSLProxy::sk_value(STACK *s, int n) {
87 if (K_sk_value) return (K_sk_value)(s, n);
88 else return 0L;
90 @@ -1102,13 +1102,13 @@ STACK* KOpenSSLProxy::sk_dup(STACK *s) {
94 -STACK* KOpenSSLProxy::sk_new(int (*cmp)()) {
95 - if (K_sk_new) return (K_sk_new)(cmp);
96 +STACK* KOpenSSLProxy::sk_new(int (*cmp)(const void*, const void*)) {
97 + if (K_sk_new) return (K_sk_new)(reinterpret_cast<int (*)()>(cmp));
98 else return 0L;
102 -int KOpenSSLProxy::sk_push(STACK* s, char* d) {
103 +int KOpenSSLProxy::sk_push(STACK* s, void* d) {
104 if (K_sk_push) return (K_sk_push)(s,d);
105 else return -1;
107 @@ -1407,12 +1407,12 @@ RSA* KOpenSSLProxy::RSA_generate_key(int
108 else return 0L;
111 -STACK *KOpenSSLProxy::X509_get1_email(X509 *x) {
112 +KOSSL1_STACK_OF(OPENSSL_STRING) *KOpenSSLProxy::X509_get1_email(X509 *x) {
113 if (K_X509_get1_email) return (K_X509_get1_email)(x);
114 else return 0L;
117 -void KOpenSSLProxy::X509_email_free(STACK *sk) {
118 +void KOpenSSLProxy::X509_email_free(KOSSL1_STACK_OF(OPENSSL_STRING) *sk) {
119 if (K_X509_email_free) (K_X509_email_free)(sk);
122 Index: kdelibs-3.5.10/kio/kssl/kopenssl.h
123 ===================================================================
124 --- kdelibs-3.5.10.orig/kio/kssl/kopenssl.h
125 +++ kdelibs-3.5.10/kio/kssl/kopenssl.h
126 @@ -47,6 +47,51 @@ class KOpenSSLProxyPrivate;
127 #include <openssl/evp.h>
128 #include <openssl/stack.h>
129 #include <openssl/bn.h>
130 +#if OPENSSL_VERSION_NUMBER >= 0x10000000L
131 +typedef struct asn1_method_st
133 + i2d_of_void *i2d;
134 + d2i_of_void *d2i;
135 + void *(*create)(void);
136 + void (*destroy)(void *);
137 + } ASN1_METHOD;
138 +typedef struct asn1_header_st
140 + ASN1_OCTET_STRING *header;
141 + void *data;
142 + ASN1_METHOD *meth;
143 + } ASN1_HEADER;
144 +typedef struct stack_st STACK;
146 +#include <openssl/safestack.h>
148 +template<class S> struct KOpenSSLElementType;
149 +template<class T> struct KOpenSSLStackType;
151 +#define KOSSL_DECLARE_STACK_OF(type) \
152 + template<> struct KOpenSSLElementType<STACK_OF(type)> { \
153 + typedef type value_t; \
154 + typedef type* ptr_t; \
155 + }; \
156 + template<> struct KOpenSSLStackType<const type*> { \
157 + typedef STACK_OF(type) stack_t; \
158 + typedef STACK_OF(type) *ptr_t; \
159 + };
161 +KOSSL_DECLARE_STACK_OF(GENERAL_NAME)
162 +KOSSL_DECLARE_STACK_OF(SSL_CIPHER)
163 +KOSSL_DECLARE_STACK_OF(X509)
165 +template<> struct KOpenSSLElementType<STACK_OF(OPENSSL_STRING)> {
166 + typedef char value_t;
167 + typedef OPENSSL_STRING ptr_t;
170 +#define KOSSL1_STACK_OF(type) STACK_OF(type)
171 +#else
172 +#define KOSSL1_STACK_OF(type) STACK
173 +#endif
175 #undef crypt
176 #endif
178 @@ -523,7 +568,7 @@ public:
180 * Pop off the stack
182 - char *sk_pop(STACK *s);
183 + void *sk_pop(STACK *s);
187 @@ -541,19 +586,19 @@ public:
189 * Value of element n in the stack
191 - char *sk_value(STACK *s, int n);
192 + void *sk_value(STACK *s, int n);
196 * Create a new stack
198 - STACK *sk_new(int (*cmp)());
199 + STACK *sk_new(int (*cmp)(const void *, const void *));
203 * Add an element to the stack
205 - int sk_push(STACK *s, char *d);
206 + int sk_push(STACK *s, void *d);
210 @@ -562,6 +607,54 @@ public:
211 STACK *sk_dup(STACK *s);
214 +#if defined(KSSL_HAVE_SSL) && OPENSSL_VERSION_NUMBER >= 0x10000000L
216 + /* Use some template magic to simulate the OpenSSL 1.0.0 safestack macros */
218 + template<class S> typename KOpenSSLElementType<S>::ptr_t
219 + sk_pop(S *s) {
220 + return reinterpret_cast<typename KOpenSSLElementType<S>::ptr_t>
221 + (sk_pop(reinterpret_cast<STACK*>(s)));
224 + template<class S> void
225 + sk_free(S *s) {
226 + typedef typename KOpenSSLElementType<S>::ptr_t ensure_its_a_stack_type;
227 + sk_free(reinterpret_cast<STACK*>(s));
230 + template<class S> int
231 + sk_num(S *s) {
232 + typedef typename KOpenSSLElementType<S>::ptr_t ensure_its_a_stack_type;
233 + return sk_num(reinterpret_cast<STACK*>(s));
236 + template<class S> typename KOpenSSLElementType<S>::ptr_t
237 + sk_value(S *s, int n) {
238 + return reinterpret_cast<typename KOpenSSLElementType<S>::ptr_t>
239 + (sk_value(reinterpret_cast<STACK*>(s), n));
242 + template<class T> typename KOpenSSLStackType<T>::ptr_t
243 + sk_new(int (*cmp)(T const *, T const *)) {
244 + return reinterpret_cast<typename KOpenSSLStackType<T>::ptr_t>
245 + (sk_new(reinterpret_cast<int (*)(const void *, const void *)>(cmp)));
248 + template<class S> int
249 + sk_push(S *s, typename KOpenSSLElementType<S>::ptr_t d) {
250 + return sk_push(reinterpret_cast<STACK*>(s), reinterpret_cast<void*>(d));
253 + template<class S> S*
254 + sk_dup(S* s) {
255 + typedef typename KOpenSSLElementType<S>::ptr_t ensure_its_a_stack_type;
256 + return reinterpret_cast<S*>(sk_dup(reinterpret_cast<STACK*>(s)));
259 +#endif
263 * Convert an ASN1_INTEGER to it's text form
265 @@ -825,8 +918,8 @@ public:
266 int i2d_X509_REQ_fp(FILE *fp, X509_REQ *x);
268 /* SMime support */
269 - STACK *X509_get1_email(X509 *x);
270 - void X509_email_free(STACK *sk);
271 + KOSSL1_STACK_OF(OPENSSL_STRING) *X509_get1_email(X509 *x);
272 + void X509_email_free(KOSSL1_STACK_OF(OPENSSL_STRING) *sk);
274 /* Ciphers needed for SMime */
275 EVP_CIPHER *EVP_des_ede3_cbc();
276 Index: kdelibs-3.5.10/kio/kssl/ksmimecrypto.cc
277 ===================================================================
278 --- kdelibs-3.5.10.orig/kio/kssl/ksmimecrypto.cc
279 +++ kdelibs-3.5.10/kio/kssl/ksmimecrypto.cc
280 @@ -87,7 +87,7 @@ KSMIMECryptoPrivate::KSMIMECryptoPrivate
283 STACK_OF(X509) *KSMIMECryptoPrivate::certsToX509(QPtrList<KSSLCertificate> &certs) {
284 - STACK_OF(X509) *x509 = sk_new(NULL);
285 + STACK_OF(X509) *x509 = sk_X509_new(NULL);
286 KSSLCertificate *cert = certs.first();
287 while(cert) {
288 sk_X509_push(x509, cert->getCert());
289 Index: kdelibs-3.5.10/kio/kssl/ksslcertificate.cc
290 ===================================================================
291 --- kdelibs-3.5.10.orig/kio/kssl/ksslcertificate.cc
292 +++ kdelibs-3.5.10/kio/kssl/ksslcertificate.cc
293 @@ -225,9 +225,10 @@ void KSSLCertificate::getEmails(QStringL
294 if (!d->m_cert)
295 return;
297 - STACK *s = d->kossl->X509_get1_email(d->m_cert);
298 + KOSSL1_STACK_OF(OPENSSL_STRING) *s =
299 + d->kossl->X509_get1_email(d->m_cert);
300 if (s) {
301 - for(int n=0; n < s->num; n++) {
302 + for(int n=0; n < d->kossl->sk_num(s); n++) {
303 to.append(d->kossl->sk_value(s,n));
305 d->kossl->X509_email_free(s);