ksslcertificate.cc

来自「将konqueror浏览器移植到ARM9 2410中」· CC 代码 · 共 643 行 · 第 1/2 页

CC
643
字号
case X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE:case X509_V_ERR_CERT_SIGNATURE_FAILURE:case X509_V_ERR_CRL_SIGNATURE_FAILURE:case X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE:case X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE:  rc = KSSLCertificate::SignatureFailed;break;case X509_V_ERR_INVALID_CA:case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:case X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY:case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:  rc = KSSLCertificate::InvalidCA;break;case X509_V_ERR_INVALID_PURPOSE:  rc = KSSLCertificate::InvalidPurpose;break;case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN:  rc = KSSLCertificate::SelfSigned;break;case X509_V_ERR_CERT_REVOKED:  rc = KSSLCertificate::Revoked;break;case X509_V_ERR_PATH_LENGTH_EXCEEDED:  rc = KSSLCertificate::PathLengthExceeded;break;case X509_V_ERR_CERT_NOT_YET_VALID:case X509_V_ERR_CERT_HAS_EXPIRED:case X509_V_ERR_CRL_NOT_YET_VALID:case X509_V_ERR_CRL_HAS_EXPIRED:case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:case X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD:case X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD: rc = KSSLCertificate::Expired; kdDebug(7029) << "KSSL apparently this is expired.  Not after: "           << getNotAfter() << endl;break;case 1:case X509_V_ERR_APPLICATION_VERIFICATION:case X509_V_ERR_OUT_OF_MEM:case X509_V_ERR_UNABLE_TO_GET_CRL:case X509_V_ERR_CERT_CHAIN_TOO_LONG:default:  rc = KSSLCertificate::Unknown;break;}d->m_stateCache = rc;d->m_stateCached = true;#endifreturn rc;}QString KSSLCertificate::getNotBefore() const {#ifdef HAVE_SSLreturn ASN1_UTCTIME_QString(X509_get_notBefore(d->m_cert));#elsereturn QString::null;#endif}QString KSSLCertificate::getNotAfter() const {#ifdef HAVE_SSLreturn ASN1_UTCTIME_QString(X509_get_notAfter(d->m_cert));#elsereturn QString::null;#endif}QDateTime KSSLCertificate::getQDTNotBefore() const {#ifdef HAVE_SSLreturn ASN1_UTCTIME_QDateTime(X509_get_notBefore(d->m_cert), NULL);#elsereturn QDateTime::currentDateTime();#endif}QDateTime KSSLCertificate::getQDTNotAfter() const {#ifdef HAVE_SSLreturn ASN1_UTCTIME_QDateTime(X509_get_notAfter(d->m_cert), NULL);#elsereturn QDateTime::currentDateTime();#endif}int operator==(KSSLCertificate &x, KSSLCertificate &y) {#ifndef HAVE_SSL  return 1;#else  if (!KOSSL::self()->X509_cmp(x.getCert(), y.getCert())) return 1;  return 0;#endif}KSSLCertificate::KSSLCertificate(const KSSLCertificate& x) {  d = new KSSLCertificatePrivate;  d->m_stateCached = false;  KGlobal::dirs()->addResourceType("kssl", "share/apps/kssl");#ifdef HAVE_SSL  d->m_cert = NULL;  setCert(KOSSL::self()->X509_dup(const_cast<KSSLCertificate&>(x).getCert()));  KSSLCertChain *c = x.d->_chain.replicate();  setChain(c->rawChain());  delete c;#endif}KSSLCertificate *KSSLCertificate::replicate() {  // The new certificate doesn't have the cached value.  It's probably  // better this way.  We can't anticipate every reason for doing this.  KSSLCertificate *newOne = new KSSLCertificate();  #ifdef HAVE_SSL  newOne->setCert(d->kossl->X509_dup(getCert()));  KSSLCertChain *c = d->_chain.replicate();  newOne->setChain(c->rawChain());  delete c;  #endif  return newOne;}QString KSSLCertificate::toString() {return KCodecs::base64Encode(toDer());}QString KSSLCertificate::verifyText(KSSLValidation x) {  switch (x) {  case KSSLCertificate::Ok:     return i18n("The certificate is valid.");  case KSSLCertificate::PathLengthExceeded:  case KSSLCertificate::ErrorReadingRoot:  case KSSLCertificate::NoCARoot:     return i18n("Certificate signing authority root files could not be found so the certificate is not verified.");  case KSSLCertificate::InvalidCA:     return i18n("Certificate signing authority is unknown or invalid.");  case KSSLCertificate::SelfSigned:     return i18n("Certificate is self-signed and thus may not be trustworthy.");  case KSSLCertificate::Expired:     return i18n("Certificate has expired.");  case KSSLCertificate::Revoked:     return i18n("Certificate has been revoked.");  case KSSLCertificate::NoSSL:     return i18n("SSL support was not found.");  case KSSLCertificate::Untrusted:  case KSSLCertificate::SignatureFailed:  case KSSLCertificate::Rejected:  case KSSLCertificate::InvalidPurpose:  break;  }return i18n("The certificate is invalid.");}QByteArray KSSLCertificate::toDer() {QByteArray qba;#ifdef HAVE_SSL      unsigned int certlen = d->kossl->i2d_X509(getCert(), NULL);      // These should technically be unsigned char * but it doesn't matter      // for our purposes      char *cert = new char[certlen];      char *p = cert;      // FIXME: return code!      d->kossl->i2d_X509(getCert(), (unsigned char **)&p);       // encode it into a QString      qba.duplicate(cert, certlen);      delete[] cert;#endifreturn qba;}QByteArray KSSLCertificate::toPem() {QByteArray qba;QString thecert = toString();const char *header = "-----BEGIN CERTIFICATE-----\n";const char *footer = "-----END CERTIFICATE-----\n";   // We just do base64 on the ASN1   //  64 character lines  (unpadded)   unsigned int xx = thecert.length()-1;   for (unsigned int i = 0; i < xx/64; i++) {      thecert.insert(64*(i+1)+i, '\n');   }   thecert.prepend(header);   if (thecert[thecert.length()-1] != '\n')      thecert += "\n";   thecert.append(footer);   qba.duplicate(thecert.local8Bit(), thecert.length());return qba;}#define NETSCAPE_CERT_HDR     "certificate"// what a piece of crap this isQByteArray KSSLCertificate::toNetscape() {QByteArray qba;#ifdef HAVE_SSL      ASN1_HEADER ah;      ASN1_OCTET_STRING os;      KTempFile ktf;       os.data=(unsigned char *)NETSCAPE_CERT_HDR;      os.length=strlen(NETSCAPE_CERT_HDR);      ah.header= &os;      ah.data=(char *)getCert();      ah.meth=d->kossl->X509_asn1_meth();       d->kossl->ASN1_i2d_fp(ktf.fstream(),(unsigned char *)&ah);      ktf.close();      QFile qf(ktf.name());      qf.open(IO_ReadOnly);      char *buf = new char[qf.size()];      qf.readBlock(buf, qf.size());      qba.duplicate(buf, qf.size());      qf.close();      delete[] buf;      ktf.unlink();#endifreturn qba;}QString KSSLCertificate::toText() {QString text;#ifdef HAVE_SSLKTempFile ktf;   d->kossl->X509_print(ktf.fstream(), getCert());   ktf.close();   QFile qf(ktf.name());   qf.open(IO_ReadOnly);   char *buf = new char[qf.size()+1];   qf.readBlock(buf, qf.size());   buf[qf.size()] = 0;   text = buf;   delete[] buf;   qf.close();   ktf.unlink();#endifreturn text;}bool KSSLCertificate::setCert(QString& cert) {#ifdef HAVE_SSL    QByteArray qba, qbb = cert.local8Bit().copy();    KCodecs::base64Decode(qbb, qba);    unsigned char *qbap = reinterpret_cast<unsigned char *>(qba.data());    X509 *x5c = KOSSL::self()->d2i_X509(NULL, &qbap, qba.size());    if (x5c) {       setCert(x5c);       return true;    }#endifreturn false;}QDataStream& operator<<(QDataStream& s, const KSSLCertificate& r) {QStringList qsl;QList<KSSLCertificate> cl = const_cast<KSSLCertificate&>(r).chain().getChain();      for (KSSLCertificate *c = cl.first(); c != 0; c = cl.next()) {         //kdDebug() << "Certificate in chain: " <<  c->toString() << endl;         qsl << c->toString();      }      cl.setAutoDelete(true);s << const_cast<KSSLCertificate&>(r).toString() << qsl;return s;}QDataStream& operator>>(QDataStream& s, KSSLCertificate& r) {QStringList qsl;QString cert;s >> cert >> qsl;       if (r.setCert(cert) && !qsl.isEmpty())          r.chain().setChain(qsl);return s;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?