Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "../../dprint.h"
00028 #include "tls_verify.h"
00029
00038
00039 #define VERIFY_DEPTH_S 3
00040
00041
00042
00043
00044 int verify_callback(int pre_verify_ok, X509_STORE_CTX *ctx) {
00045 char buf[256];
00046 X509 *err_cert;
00047 int err, depth;
00048
00049 depth = X509_STORE_CTX_get_error_depth(ctx);
00050 DBG("verify_callback: depth = %d\n",depth);
00051 if ( depth > VERIFY_DEPTH_S ) {
00052 LOG(L_NOTICE, "tls_init: verify_callback: cert chain too long ( depth > VERIFY_DEPTH_S)\n");
00053 pre_verify_ok=0;
00054 }
00055
00056 if( pre_verify_ok ) {
00057 LOG(L_NOTICE, "tls_init: verify_callback: preverify is good: verify return: %d\n", pre_verify_ok);
00058 return pre_verify_ok;
00059 }
00060
00061 err_cert = X509_STORE_CTX_get_current_cert(ctx);
00062 err = X509_STORE_CTX_get_error(ctx);
00063 X509_NAME_oneline(X509_get_subject_name(err_cert),buf,sizeof buf);
00064
00065 LOG(L_NOTICE, "tls_init: verify_callback: subject = %s\n", buf);
00066 LOG(L_NOTICE, "tls_init: verify_callback: verify error:num=%d:%s\n", err, X509_verify_cert_error_string(err));
00067 LOG(L_NOTICE, "tls_init: verify_callback: error code is %d\n", ctx->error);
00068
00069 switch (ctx->error) {
00070 case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:
00071 X509_NAME_oneline(X509_get_issuer_name(ctx->current_cert),buf,sizeof buf);
00072 LOG(L_NOTICE, "tls_init: verify_callback: issuer= %s\n",buf);
00073 break;
00074
00075 case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:
00076 case X509_V_ERR_CERT_NOT_YET_VALID:
00077 LOG(L_NOTICE, "tls_init: verify_callback: notBefore\n");
00078 break;
00079
00080 case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:
00081 case X509_V_ERR_CERT_HAS_EXPIRED:
00082 LOG(L_NOTICE, "tls_init: verify_callback: notAfter\n");
00083 break;
00084
00085 case X509_V_ERR_CERT_SIGNATURE_FAILURE:
00086 case X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE:
00087 LOG(L_NOTICE, "tls_init: verify_callback: unable to decrypt cert signature\n");
00088 break;
00089
00090 case X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY:
00091 LOG(L_NOTICE, "tls_init: verify_callback: unable to decode issuer public key\n");
00092 break;
00093
00094 case X509_V_ERR_OUT_OF_MEM:
00095 ERR("tls_init: verify_callback: Out of memory \n");
00096 break;
00097
00098 case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
00099 case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN:
00100 LOG(L_NOTICE, "tls_init: verify_callback: Self signed certificate issue\n");
00101 break;
00102
00103 case X509_V_ERR_CERT_CHAIN_TOO_LONG:
00104 LOG(L_NOTICE, "tls_init: verify_callback: certificate chain too long\n");
00105 break;
00106 case X509_V_ERR_INVALID_CA:
00107 LOG(L_NOTICE, "tls_init: verify_callback: invalid CA\n");
00108 break;
00109 case X509_V_ERR_PATH_LENGTH_EXCEEDED:
00110 LOG(L_NOTICE, "tls_init: verify_callback: path length exceeded\n");
00111 break;
00112 case X509_V_ERR_INVALID_PURPOSE:
00113 LOG(L_NOTICE, "tls_init: verify_callback: invalid purpose\n");
00114 break;
00115 case X509_V_ERR_CERT_UNTRUSTED:
00116 LOG(L_NOTICE, "tls_init: verify_callback: certificate untrusted\n");
00117 break;
00118 case X509_V_ERR_CERT_REJECTED:
00119 LOG(L_NOTICE, "tls_init: verify_callback: certificate rejected\n");
00120 break;
00121
00122 default:
00123 LOG(L_NOTICE, "tls_init: verify_callback: something wrong with the cert ... error code is %d (check x509_vfy.h)\n", ctx->error);
00124 break;
00125 }
00126
00127 LOG(L_NOTICE, "tls_init: verify_callback: verify return:%d\n", pre_verify_ok);
00128 return(pre_verify_ok);
00129 }