Commit 5d32071a1900495adcbb1aff027ec9faddfbcf81
1 parent
019aa4ba
Exists in
master
and in
3 other branches
Refactoring CRL check.
Showing
2 changed files
with
65 additions
and
3 deletions
Show diff stats
src/ssl/negotiate.c
... | ... | @@ -40,6 +40,7 @@ |
40 | 40 | #include <openssl/ssl.h> |
41 | 41 | #include <openssl/err.h> |
42 | 42 | #include <openssl/x509_vfy.h> |
43 | + #include <openssl/x509v3.h> | |
43 | 44 | |
44 | 45 | #ifndef SSL_ST_OK |
45 | 46 | #define SSL_ST_OK 3 |
... | ... | @@ -73,6 +74,24 @@ |
73 | 74 | */ |
74 | 75 | SSL_CTX * ssl_ctx = NULL; |
75 | 76 | |
77 | + /** | |
78 | + * @brief X509 auto-cleanup. | |
79 | + */ | |
80 | +static inline void lib3270_autoptr_cleanup_X509(X509 **ptr) | |
81 | +{ | |
82 | + if(*ptr) | |
83 | + X509_free(*ptr); | |
84 | +} | |
85 | + | |
86 | + /** | |
87 | + * @brief Dist points auto-cleanup. | |
88 | + */ | |
89 | +static inline void lib3270_autoptr_cleanup_CRL_DIST_POINTS(CRL_DIST_POINTS **ptr) | |
90 | +{ | |
91 | + if(*ptr) | |
92 | + CRL_DIST_POINTS_free(*ptr); | |
93 | +} | |
94 | + | |
76 | 95 | /** |
77 | 96 | * @brief Initialize openssl session. |
78 | 97 | * |
... | ... | @@ -81,7 +100,6 @@ |
81 | 100 | * @return 0 if ok, non zero if fails. |
82 | 101 | * |
83 | 102 | */ |
84 | - | |
85 | 103 | static int background_ssl_init(H3270 *hSession, void *message) |
86 | 104 | { |
87 | 105 | set_ssl_state(hSession,LIB3270_SSL_UNDEFINED); |
... | ... | @@ -114,6 +132,24 @@ static int background_ssl_init(H3270 *hSession, void *message) |
114 | 132 | return 0; |
115 | 133 | } |
116 | 134 | |
135 | +#if !defined(SSL_DEFAULT_CRL_URL) && defined(SSL_ENABLE_CRL_CHECK) | |
136 | + | |
137 | +static int getCRLFromDistPoints(CRL_DIST_POINTS * dist_points, SSL_ERROR_MESSAGE *message) | |
138 | +{ | |
139 | + int ix; | |
140 | + | |
141 | + for(ix = 0; ix < sk_DIST_POINT_num(dist_points); ix++) { | |
142 | + | |
143 | + debug("CRL(%d):", ix); | |
144 | + | |
145 | + | |
146 | + } | |
147 | + | |
148 | + return 0; | |
149 | +} | |
150 | + | |
151 | +#endif // !SSL_DEFAULT_CRL_URL && SSL_ENABLE_CRL_CHECK | |
152 | + | |
117 | 153 | static int background_ssl_negotiation(H3270 *hSession, void *message) |
118 | 154 | { |
119 | 155 | int rv; |
... | ... | @@ -166,7 +202,7 @@ static int background_ssl_negotiation(H3270 *hSession, void *message) |
166 | 202 | // |
167 | 203 | |
168 | 204 | // Get peer certificate, notify application before validation. |
169 | - X509 * peer = SSL_get_peer_certificate(hSession->ssl.con); | |
205 | + lib3270_autoptr(X509) peer = SSL_get_peer_certificate(hSession->ssl.con); | |
170 | 206 | |
171 | 207 | if(peer) |
172 | 208 | { |
... | ... | @@ -193,7 +229,29 @@ static int background_ssl_negotiation(H3270 *hSession, void *message) |
193 | 229 | |
194 | 230 | hSession->cbk.set_peer_certificate(peer); |
195 | 231 | |
196 | - X509_free(peer); | |
232 | +#if !defined(SSL_DEFAULT_CRL_URL) && defined(SSL_ENABLE_CRL_CHECK) | |
233 | + // | |
234 | + // No default CRL, try to download from the peer | |
235 | + // | |
236 | + // References: | |
237 | + // | |
238 | + // http://www.zedwood.com/article/cpp-check-crl-for-revocation | |
239 | + // | |
240 | + | |
241 | + lib3270_autoptr(CRL_DIST_POINTS) dist_points = (CRL_DIST_POINTS *) X509_get_ext_d2i(peer, NID_crl_distribution_points, NULL, NULL); | |
242 | + if(!dist_points) | |
243 | + { | |
244 | + ((SSL_ERROR_MESSAGE *) message)->title = _( "Security error" ); | |
245 | + ((SSL_ERROR_MESSAGE *) message)->text = _( "Can't verify." ); | |
246 | + ((SSL_ERROR_MESSAGE *) message)->description = _( "The host certificate doesn't have CRL distribution points" ); | |
247 | + return EACCES; | |
248 | + } | |
249 | + | |
250 | + if(getCRLFromDistPoints(dist_points, (SSL_ERROR_MESSAGE *) message)) | |
251 | + return EACCES; | |
252 | + | |
253 | +#endif // !SSL_DEFAULT_CRL_URL && SSL_ENABLE_CRL_CHECK | |
254 | + | |
197 | 255 | } |
198 | 256 | |
199 | 257 | ... | ... |
src/testprogram/testprogram.c
... | ... | @@ -107,6 +107,7 @@ int main(int argc, char *argv[]) |
107 | 107 | lib3270_wait_for_ready(h,10); |
108 | 108 | printf("Waiting ends %u\n\n",(unsigned int) time(NULL)); |
109 | 109 | |
110 | + /* | |
110 | 111 | lib3270_enter(h); |
111 | 112 | lib3270_wait(h,5); |
112 | 113 | |
... | ... | @@ -128,6 +129,9 @@ int main(int argc, char *argv[]) |
128 | 129 | if(text) |
129 | 130 | printf("Screen:\n[%s]\n",text); |
130 | 131 | } |
132 | + */ | |
133 | + | |
134 | + lib3270_disconnect(h); | |
131 | 135 | |
132 | 136 | } |
133 | 137 | ... | ... |