#include <QtCrypto>
#include <QCoreApplication>
#include <QTcpSocket>
#ifdef QT_STATICPLUGIN
#include "import_plugins.h"
#endif
char exampleCA_cert[] =
"-----BEGIN CERTIFICATE-----\n"
"MIICSzCCAbSgAwIBAgIBADANBgkqhkiG9w0BAQUFADA4MRMwEQYDVQQDEwpFeGFt\n"
"cGxlIENBMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRXhhbXBsZSBPcmcwHhcNMDYw\n"
"MzE1MDY1ODMyWhcNMDYwNDE1MDY1ODMyWjA4MRMwEQYDVQQDEwpFeGFtcGxlIENB\n"
"MQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRXhhbXBsZSBPcmcwgZ8wDQYJKoZIhvcN\n"
"AQEBBQADgY0AMIGJAoGBAL6ULdOxmpeZ+G/ypV12eNO4qnHSVIPTrYPkQuweXqPy\n"
"atwGFheG+hLVsNIh9GGOS0tCe7a3hBBKN0BJg1ppfk2x39cDx7hefYqjBuZvp/0O\n"
"8Ja3qlQiJLezITZKLxMBrsibcvcuH8zpfUdys2yaN+YGeqNfjQuoNN3Byl1TwuGJ\n"
"AgMBAAGjZTBjMB0GA1UdDgQWBBSQKCUCLNM7uKrAt5o7qv/yQm6qEzASBgNVHRMB\n"
"Af8ECDAGAQEBAgEIMB4GA1UdEQQXMBWBE2V4YW1wbGVAZXhhbXBsZS5jb20wDgYD\n"
"VR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4GBAAh+SIeT1Ao5qInw8oMSoTdO\n"
"lQ6h67ec/Jk5KmK4OoskuimmHI0Sp0C5kOCLehXbsVWW8pXsNC2fv0d2HkdaSUcX\n"
"hwLzqgyZXd4mupIYlaOTZhuHDwWPCAOZS4LVsi2tndTRHKCP12441JjNKhmZRhkR\n"
"u5zzD60nWgM9dKTaxuZM\n"
"-----END CERTIFICATE-----\n";
{
printf("-- Cert --\n");
printf(
" CN: %s\n", qPrintable(cert.
commonName()));
printf(" Valid from: %s, until %s\n",
printf(
" PEM:\n%s\n", qPrintable(cert.
toPEM()));
}
{
QString s;
switch(v)
{
s = "Validated";
break;
s = "Root CA is marked to reject the specified purpose";
break;
s = "Certificate not trusted for the required purpose";
break;
s = "Invalid signature";
break;
s = "Invalid CA certificate";
break;
s = "Invalid certificate purpose";
break;
s = "Certificate is self-signed";
break;
s = "Certificate has been revoked";
break;
s = "Maximum certificate chain length exceeded";
break;
s = "Certificate has expired";
break;
s = "CA has expired";
break;
default:
s = "General certificate validation error";
break;
}
return s;
}
{
Q_OBJECT
public:
SecureTest()
{
sock_done = false;
ssl_done = false;
sock = new QTcpSocket;
connect(sock, SIGNAL(connected()), SLOT(sock_connected()));
connect(sock, SIGNAL(readyRead()), SLOT(sock_readyRead()));
connect(sock, SIGNAL(error(QAbstractSocket::SocketError)),
SLOT(sock_error(QAbstractSocket::SocketError)));
connect(ssl, SIGNAL(certificateRequested()), SLOT(ssl_certificateRequested()));
connect(ssl, SIGNAL(handshaken()), SLOT(ssl_handshaken()));
connect(ssl, SIGNAL(readyRead()), SLOT(ssl_readyRead()));
connect(ssl, SIGNAL(readyReadOutgoing()),
SLOT(ssl_readyReadOutgoing()));
connect(ssl, SIGNAL(closed()), SLOT(ssl_closed()));
connect(ssl, SIGNAL(error()), SLOT(ssl_error()));
}
~SecureTest()
{
delete ssl;
delete sock;
}
void start(const QString &_host)
{
int n = _host.indexOf(':');
int port;
if(n != -1)
{
host = _host.mid(0, n);
port = _host.mid(n+1).toInt();
}
else
{
host = _host;
port = 443;
}
printf("Trying %s:%d...\n", qPrintable(host), port);
sock->connectToHost(host, port);
}
signals:
void quit();
private slots:
void sock_connected()
{
printf("Connected, starting TLS handshake...\n");
printf("Warning: no root certs\n");
else
}
void sock_readyRead()
{
}
void sock_connectionClosed()
{
printf("\nConnection closed.\n");
sock_done = true;
if(ssl_done && sock_done)
emit quit();
}
void sock_error(QAbstractSocket::SocketError x)
{
if(x == QAbstractSocket::RemoteHostClosedError)
{
sock_connectionClosed();
return;
}
printf("\nSocket error.\n");
emit quit();
}
void ssl_handshaken()
{
printf("Successful SSL handshake using %s (%i of %i bits)\n",
{
if(!cert.isNull())
showCertInfo(cert);
}
QString str = "Peer Identity: ";
str += "Valid";
str += "Error: Wrong certificate";
str += "Error: Invalid certificate.\n -> Reason: " +
else
str += "Error: No certificate";
printf("%s\n", qPrintable(str));
printf("Let's try a GET request now.\n");
QString req = "GET / HTTP/1.0\nHost: " + host + "\n\n";
ssl->
write(req.toLatin1());
}
void ssl_certificateRequested()
{
printf("Server requested client certificate.\n");
if(!issuerList.isEmpty())
{
printf("Allowed issuers:\n");
printf(
" %s\n", qPrintable(i.
toString()));
}
}
void ssl_readyRead()
{
QByteArray a = ssl->
read();
printf("%s", a.data());
}
void ssl_readyReadOutgoing()
{
}
void ssl_closed()
{
printf("SSL session closed.\n");
ssl_done = true;
if(ssl_done && sock_done)
emit quit();
}
void ssl_error()
{
{
printf("SSL Handshake Error!\n");
emit quit();
}
else
{
printf("SSL Error!\n");
emit quit();
}
}
private:
QString host;
QTcpSocket *sock;
bool sock_done, ssl_done;
};
#include "ssltest.moc"
int main(int argc, char **argv)
{
QCoreApplication app(argc, argv);
QString host = argc > 1 ? argv[1] : "andbit.net";
{
printf("TLS not supported!\n");
return 1;
}
SecureTest *s = new SecureTest;
QObject::connect(s, SIGNAL(quit()), &app, SLOT(quit()));
s->start(host);
app.exec();
delete s;
return 0;
}