int X509Credential::loadFromFileP12(const std::string &p12_cred, const std::string & passwd, DavixError **err){ d_ptr->clear_cert(); if( (d_ptr->_cred = ne_ssl_clicert_read(p12_cred.c_str())) == NULL){ Davix::DavixError::setupError(err, davix_scope_x509cred(),StatusCode::CredentialNotFound, std::string("Impossible to load credential ").append(p12_cred)); return -1; } if( ne_ssl_clicert_encrypted(d_ptr->_cred) !=0 && ne_ssl_clicert_decrypt(d_ptr->_cred, passwd.c_str()) !=0){ Davix::DavixError::setupError(err, davix_scope_x509cred(), StatusCode::LoginPasswordError, std::string("Impossible to decrypt the credential ").append(p12_cred).append(" with the provided password")); d_ptr->clear_cert(); return -1; } return 0; }
static void provide_clicert(void *userdata, ne_session *sess, const ne_ssl_dname *const *dname, int dncount) { const char *ccfn = userdata; int n; printf("The server has requested a client certificate.\n"); #if 0 /* display CA names? */ for (n = 0; n < dncount; n++) { char *dn = ne_ssl_readable_dname(dname[n]); printf("Name: %s\n", dn); free(dn); } #endif if (ne_ssl_clicert_encrypted(client_cert)) { const char *name = ne_ssl_clicert_name(client_cert); char *pass; if (!name) name = ccfn; printf("Client certificate `%s' is encrypted.\n", name); for (n = 0; n < 3; n++) { pass = fm_getpassword(_("Decryption password: "******"Password incorrect, try again.\n"); } else { break; } } } if (!ne_ssl_clicert_encrypted(client_cert)) { printf("Using client certificate.\n"); ne_ssl_set_clicert(session.sess, client_cert); } }