|
Packit Service |
4684c1 |
#include <config.h>
|
|
Packit Service |
4684c1 |
#include <iostream>
|
|
Packit Service |
4684c1 |
#include <stdexcept>
|
|
Packit Service |
4684c1 |
#include <gnutls/gnutls.h>
|
|
Packit Service |
4684c1 |
#include <gnutls/gnutlsxx.h>
|
|
Packit Service |
4684c1 |
#include <cstring> /* for strlen */
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
/* A very basic TLS client, with anonymous authentication.
|
|
Packit Service |
4684c1 |
* written by Eduardo Villanueva Che.
|
|
Packit Service |
4684c1 |
*/
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#define MAX_BUF 1024
|
|
Packit Service |
4684c1 |
#define SA struct sockaddr
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
#define CAFILE "ca.pem"
|
|
Packit Service |
4684c1 |
#define MSG "GET / HTTP/1.0\r\n\r\n"
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
extern "C"
|
|
Packit Service |
4684c1 |
{
|
|
Packit Service |
4684c1 |
int tcp_connect(void);
|
|
Packit Service |
4684c1 |
void tcp_close(int sd);
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
int main(void)
|
|
Packit Service |
4684c1 |
{
|
|
Packit Service |
4684c1 |
int sd = -1;
|
|
Packit Service |
4684c1 |
gnutls_global_init();
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
try
|
|
Packit Service |
4684c1 |
{
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
/* Allow connections to servers that have OpenPGP keys as well.
|
|
Packit Service |
4684c1 |
*/
|
|
Packit Service |
4684c1 |
gnutls::client_session session;
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
/* X509 stuff */
|
|
Packit Service |
4684c1 |
gnutls::certificate_credentials credentials;
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
/* sets the trusted cas file
|
|
Packit Service |
4684c1 |
*/
|
|
Packit Service |
4684c1 |
credentials.set_x509_trust_file(CAFILE, GNUTLS_X509_FMT_PEM);
|
|
Packit Service |
4684c1 |
/* put the x509 credentials to the current session
|
|
Packit Service |
4684c1 |
*/
|
|
Packit Service |
4684c1 |
session.set_credentials(credentials);
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
/* Use default priorities */
|
|
Packit Service |
4684c1 |
session.set_priority ("NORMAL", NULL);
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
/* connect to the peer
|
|
Packit Service |
4684c1 |
*/
|
|
Packit Service |
4684c1 |
sd = tcp_connect();
|
|
Packit Service |
4684c1 |
session.set_transport_ptr((gnutls_transport_ptr_t) (ptrdiff_t)sd);
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
/* Perform the TLS handshake
|
|
Packit Service |
4684c1 |
*/
|
|
Packit Service |
4684c1 |
int ret = session.handshake();
|
|
Packit Service |
4684c1 |
if (ret < 0)
|
|
Packit Service |
4684c1 |
{
|
|
Packit Service |
4684c1 |
throw std::runtime_error("Handshake failed");
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
else
|
|
Packit Service |
4684c1 |
{
|
|
Packit Service |
4684c1 |
std::cout << "- Handshake was completed" << std::endl;
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
session.send(MSG, strlen(MSG));
|
|
Packit Service |
4684c1 |
char buffer[MAX_BUF + 1];
|
|
Packit Service |
4684c1 |
ret = session.recv(buffer, MAX_BUF);
|
|
Packit Service |
4684c1 |
if (ret == 0)
|
|
Packit Service |
4684c1 |
{
|
|
Packit Service |
4684c1 |
throw std::runtime_error("Peer has closed the TLS connection");
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
else if (ret < 0)
|
|
Packit Service |
4684c1 |
{
|
|
Packit Service |
4684c1 |
throw std::runtime_error(gnutls_strerror(ret));
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
std::cout << "- Received " << ret << " bytes:" << std::endl;
|
|
Packit Service |
4684c1 |
std::cout.write(buffer, ret);
|
|
Packit Service |
4684c1 |
std::cout << std::endl;
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
session.bye(GNUTLS_SHUT_RDWR);
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
catch (std::exception &ex)
|
|
Packit Service |
4684c1 |
{
|
|
Packit Service |
4684c1 |
std::cerr << "Exception caught: " << ex.what() << std::endl;
|
|
Packit Service |
4684c1 |
}
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
if (sd != -1)
|
|
Packit Service |
4684c1 |
tcp_close(sd);
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
gnutls_global_deinit();
|
|
Packit Service |
4684c1 |
|
|
Packit Service |
4684c1 |
return 0;
|
|
Packit Service |
4684c1 |
}
|