Ticket #9261: main.cpp

File main.cpp, 4.3 KB (added by Joakim Goldkuhl <joakim@…>, 9 years ago)

code to set up ssl client/server handshake failure

Line 
1#include <cstdlib>
2#include <iostream>
3#include <unistd.h>
4
5#include <boost/bind.hpp>
6#include <boost/asio.hpp>
7#include <boost/asio/ssl.hpp>
8
9typedef boost::asio::ssl::stream<boost::asio::ip::tcp::socket> ssl_socket;
10
11class Server
12 {
13 public:
14 Server(boost::asio::io_service& io_service, unsigned short port) :
15 io_service_(io_service),
16 acceptor_(io_service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port)),
17 context_(boost::asio::ssl::context::sslv3)
18 {
19 context_.set_options(boost::asio::ssl::context::no_sslv2
20 | boost::asio::ssl::context::single_dh_use);
21 context_.use_certificate_chain_file("cert.pem");
22 context_.use_private_key_file("key.pem", boost::asio::ssl::context::pem);
23 context_.use_tmp_dh_file("dh512.pem");
24
25 std::cout << "Server: Server accepting connection on localhost 5005\n";
26 socket_ = boost::shared_ptr<ssl_socket>(new ssl_socket(io_service_, context_));
27
28 acceptor_.async_accept(socket_->lowest_layer(),
29 boost::bind(&Server::HandleAccept, this,
30 boost::asio::placeholders::error));
31 }
32
33 void HandleAccept(const boost::system::error_code& error)
34 {
35 if (error)
36 {
37 std::cerr << "Server: Connect error: " << error.message() << "\n";
38 }
39 else
40 {
41 std::cout << "Server: Client connected\n";
42 socket_->async_handshake(boost::asio::ssl::stream_base::server,
43 boost::bind(&Server::HandleHandshake, this,
44 boost::asio::placeholders::error));
45 }
46 }
47
48 void HandleHandshake(const boost::system::error_code& error)
49 {
50 if (error)
51 {
52 std::cerr << "Server: Handshake failed: " << error.message() << "\n";
53 }
54 else
55 {
56 std::cout << "Server: Handshake succeeded\n";
57 }
58 }
59
60
61 private:
62 boost::asio::io_service& io_service_;
63 boost::asio::ip::tcp::acceptor acceptor_;
64 boost::asio::ssl::context context_;
65 boost::shared_ptr<ssl_socket> socket_;
66 };
67
68 class Client
69 {
70 public:
71 Client(boost::asio::io_service& io_service,
72 boost::asio::ssl::context& context,
73 boost::asio::ip::tcp::resolver::iterator endpoint_iterator)
74 : socket_(io_service, context)
75 {
76 socket_.set_verify_mode(boost::asio::ssl::verify_peer);
77 boost::asio::async_connect(socket_.lowest_layer(), endpoint_iterator,
78 boost::bind(&Client::HandleConnect, this,
79 boost::asio::placeholders::error));
80 }
81
82 void HandleConnect(const boost::system::error_code& error)
83 {
84 if (error)
85 {
86 std::cerr << "Client: Connection failed: " << error.message() << "\n";
87 }
88 else
89 {
90 std::cout << "Client: Connected\n";
91 socket_.async_handshake(boost::asio::ssl::stream_base::client,
92 boost::bind(&Client::HandleHandshake, this,
93 boost::asio::placeholders::error));
94 }
95 }
96
97 void HandleHandshake(const boost::system::error_code& error)
98 {
99 if (error)
100 {
101 std::cerr << "Client: Handshake failed: " << error.message() << "\n";
102 }
103 else
104 {
105 std::cout << "Client: Handshake succeeded\n";
106 }
107 }
108
109 private:
110 boost::asio::ssl::stream<boost::asio::ip::tcp::socket> socket_;
111 };
112
113
114
115 void StartServer()
116 {
117 try
118 {
119 boost::asio::io_service io_service;
120 Server server(io_service, 5005);
121
122 io_service.run();
123 }
124 catch(const std::exception& e)
125 {
126 std::cerr << "Exception: " << std::string(e.what()) + "\n";
127 }
128 }
129
130
131 void StartClient()
132 {
133 try
134 {
135 boost::asio::io_service io_service;
136
137 boost::asio::ip::tcp::resolver resolver(io_service);
138 boost::asio::ip::tcp::resolver::query query("127.0.0.1", "5005");
139 boost::asio::ip::tcp::resolver::iterator iterator = resolver.resolve(query);
140
141 boost::asio::ssl::context ctx(boost::asio::ssl::context::tlsv1);
142 ctx.load_verify_file("ca.pem");
143 ctx.set_options(boost::asio::ssl::context::no_sslv2);
144 ctx.set_options(boost::asio::ssl::context::no_sslv3);
145
146 Client client(io_service, ctx, iterator);
147
148 io_service.run();
149 }
150 catch (std::exception& e)
151 {
152 std::cerr << "Exception: " << e.what() << "\n";
153 }
154 }
155
156
157 int main(int argc, char *argv[])
158 {
159 pid_t pid = fork();
160 if (pid > 0)
161 {
162 //parent
163 StartServer();
164 }
165 else if (pid == 0)
166 {
167 //child
168 sleep(2);
169 StartClient();
170 }
171 else
172 {
173 std::cerr << "Fork failed\n";
174 }
175 return 0;
176 }