bool Server::isKeyForCert(const QSslKey &key, const QSslCertificate &cert) { if (key.isNull() || cert.isNull() || (key.type() != QSsl::PrivateKey)) return false; QByteArray qbaKey = key.toDer(); QByteArray qbaCert = cert.toDer(); X509 *x509 = NULL; EVP_PKEY *pkey = NULL; BIO *mem = NULL; mem = BIO_new_mem_buf(qbaKey.data(), qbaKey.size()); Q_UNUSED(BIO_set_close(mem, BIO_NOCLOSE)); pkey = d2i_PrivateKey_bio(mem, NULL); BIO_free(mem); mem = BIO_new_mem_buf(qbaCert.data(), qbaCert.size()); Q_UNUSED(BIO_set_close(mem, BIO_NOCLOSE)); x509 = d2i_X509_bio(mem, NULL); BIO_free(mem); mem = NULL; if (x509 && pkey && X509_check_private_key(x509, pkey)) { EVP_PKEY_free(pkey); X509_free(x509); return true; } if (pkey) EVP_PKEY_free(pkey); if (x509) X509_free(x509); return false; }
QByteArray QSslKeyProto::toDer(const QByteArray & passPhrase) const { QSslKey *item = qscriptvalue_cast<QSslKey*>(thisObject()); if (item) return item->toDer(passPhrase); return QByteArray(); }
/*! Returns true if this key is equal to \a other; otherwise returns false. */ bool QSslKey::operator==(const QSslKey &other) const { if (isNull()) return other.isNull(); if (other.isNull()) return isNull(); if (algorithm() != other.algorithm()) return false; if (type() != other.type()) return false; if (length() != other.length()) return false; return toDer() == other.toDer(); }
void KeyShare::CheckPath() { QDir key_path(_path, "*.pub"); foreach(const QString &key_name, key_path.entryList()) { QString path = _path + "/" + key_name; QFile key_file(path); key_file.open(QIODevice::ReadOnly); QSharedPointer<QSslCertificate> cert(new QSslCertificate(&key_file, QSsl::Der)); QSslKey pubkey = cert->publicKey(); QSharedPointer<AsymmetricKey> key(new DsaPublicKey(pubkey.toDer())); if(!key->IsValid()) { qDebug() << "Invalid key:" << path; continue; } QString name = key_name.left(key_name.length() - 4); AddCertificate(name, cert); } }