static int set_ocsp_issuer(X509 *issuer);
static canl_x509store_t * store_dup(canl_x509store_t *store_from);
static X509_STORE * canl_create_x509store(canl_x509store_t *store);
-static canl_error get_verify_result(unsigned long ssl_err, const SSL *ssl);
+
+static canl_error map_verify_result(unsigned long ssl_err, const SSL *ssl);
+static canl_error map_proxy_error(int reason);
static void setup_SSL_proxy_handler(SSL *ssl, char *cadir);
extern proxy_verify_desc *pvd_setup_initializers(char *cadir);
" handshake: timeout reached");
}
else if (ret2 < 0 && ssl_err){
- canl_err = get_verify_result(ssl_err, ssl);
+ canl_err = map_verify_result(ssl_err, ssl);
if (canl_err)
update_error (cc, canl_err, CANL_ERROR,
"Error during SSL handshake");
set_error (cc, ECONNREFUSED, POSIX_ERROR, "Connection closed by"
" the other side");
else if (ret2 < 0 && ssl_err){
- canl_err = get_verify_result(ssl_err, ssl);
+ canl_err = map_verify_result(ssl_err, ssl);
if (canl_err)
set_error(cc, canl_err, CANL_ERROR,
"Error during SSL handshake");
}
static canl_error
-get_verify_result(unsigned long ssl_err, const SSL *ssl)
+map_verify_result(unsigned long ssl_err, const SSL *ssl)
{
long result = 0;
canl_error canl_err = 0;
+ int err_lib = 0;
+
+ /*Try PRXYERR codes first*/
+ if ((err_lib = ERR_GET_LIB(ssl_err)) == ERR_USER_LIB_PRXYERR_NUMBER) {
+ canl_err = map_proxy_error(ERR_GET_REASON(ssl_err));
+ }
+ if (canl_err)
+ return canl_err;
+
+ /*Then openssl verify error codes*/
result = SSL_get_verify_result(ssl);
switch (result) {
case X509_V_OK:
return canl_err;
}
+/*go through PRXYERR reasons and map them on canl error codes*/
+static canl_error
+map_proxy_error(int reason)
+{
+ canl_error canl_err = 0;
+ switch (reason) {
+ case PRXYERR_R_UNKNOWN_CRIT_EXT:
+ canl_err = CANL_ERR_unknownCriticalExt;
+ break;
+ case PRXYERR_R_CA_POLICY_VIOLATION: //TODO map
+ break;
+ case PRXYERR_R_CERT_REVOKED:
+ canl_err = CANL_ERR_certRevoked;
+ case PRXYERR_R_CRL_HAS_EXPIRED: //TODO map
+ break;
+ case PRXYERR_R_CRL_NEXT_UPDATE_FIELD: //TODO map
+ break;
+ case PRXYERR_R_CRL_SIGNATURE_FAILURE: //TODO map
+ break;
+ case PRXYERR_R_LPROXY_MISSED_USED: //TODO map
+ break;
+ case PRXYERR_R_BAD_PROXY_ISSUER:
+// canl_err = CANL_ERR_certWrongProxyIssuer; //TODO does not exist yet
+ break;
+ case PRXYERR_R_BAD_MAGIC: //Todo map
+ break;
+ }
+
+ return canl_err;
+}
+
/* this function has to return # bytes written or ret < 0 when sth went wrong*/
static size_t
ssl_write(glb_ctx *cc, io_handler *io, void *auth_ctx,