370919 | 2002-03-20 | Martin Nilsson | | #pike __REAL_VERSION__
|
e1fb09 | 2014-02-14 | Martin Nilsson | | #require constant(SSL.Cipher)
|
33ef43 | 1997-03-13 | Niels Möller | |
|
8de161 | 2013-10-26 | Henrik Grubbström (Grubba) | |
|
f5bb03 | 2001-09-17 | Martin Nilsson | |
|
3c859d | 2015-02-25 | Martin Nilsson | | #include "tls.h"
|
52b26e | 2013-12-06 | Henrik Grubbström (Grubba) | | #ifndef PORT
|
33ef43 | 1997-03-13 | Niels Möller | | #define PORT 25678
|
52b26e | 2013-12-06 | Henrik Grubbström (Grubba) | | #endif
|
33ef43 | 1997-03-13 | Niels Möller | |
|
fbd1a5 | 2014-04-15 | Henrik Grubbström (Grubba) | | #ifndef CIPHER_BITS
|
ee2250 | 2014-04-15 | Henrik Grubbström (Grubba) | | #define CIPHER_BITS 112
|
fbd1a5 | 2014-04-15 | Henrik Grubbström (Grubba) | | #endif
#ifndef RSA_BITS
#define RSA_BITS 4096
#endif
#ifndef DSA_BITS
#define DSA_BITS 2048
#endif
#ifndef KE_MODE
#define KE_MODE 1
#endif
#ifndef HOST
#define HOST "127.0.0.1"
#endif
|
1a4837 | 2014-04-12 | Henrik Grubbström (Grubba) | | class MyContext
{
|
dc90a5 | 2014-05-15 | Martin Nilsson | | inherit SSL.Context;
|
1a4837 | 2014-04-12 | Henrik Grubbström (Grubba) | |
|
6a8364 | 2014-05-04 | Martin Nilsson | | SSL.Alert alert_factory(.Connection con,
|
1a4837 | 2014-04-12 | Henrik Grubbström (Grubba) | | int level, int description,
SSL.Constants.ProtocolVersion version,
|
74b5eb | 2014-04-24 | Martin Nilsson | | string|void message)
|
1a4837 | 2014-04-12 | Henrik Grubbström (Grubba) | | {
|
bc3a3d | 2014-09-24 | Martin Nilsson | | if (message && description) {
|
1a4837 | 2014-04-12 | Henrik Grubbström (Grubba) | | werror("ALERT [%s: %d:%d]: %s",
SSL.Constants.fmt_version(version),
level, description, message);
}
|
74b5eb | 2014-04-24 | Martin Nilsson | | return ::alert_factory(con, level, description, version, message);
|
1a4837 | 2014-04-12 | Henrik Grubbström (Grubba) | | }
}
|
8de161 | 2013-10-26 | Henrik Grubbström (Grubba) | | #ifndef HTTPS_CLIENT
|
fc7f09 | 2014-06-01 | Martin Nilsson | | SSL.Port port;
|
8de161 | 2013-10-26 | Henrik Grubbström (Grubba) | |
|
d518a3 | 2015-09-02 | Martin Nilsson | | void my_accept_callback(SSL.File f)
|
8de161 | 2013-10-26 | Henrik Grubbström (Grubba) | | {
|
bda15a | 2014-04-24 | Martin Nilsson | | Conn(port->accept());
|
8de161 | 2013-10-26 | Henrik Grubbström (Grubba) | | }
#endif
|
d518a3 | 2015-09-02 | Martin Nilsson | | class Conn (SSL.File sslfile)
{
|
b7a48e | 2013-11-27 | Henrik Grubbström (Grubba) | | string message =
"HTTP/1.0 200 Ok\r\n"
"Connection: close\r\n"
"Content-Length: 132\r\n"
"Content-Type: text/html; charset=ISO-8859-1\r\n"
"Date: Thu, 01 Jan 1970 00:00:01 GMT\r\n"
"Server: Bare-Bones\r\n"
"\r\n"
"<html><head><title>SSL-3 server</title></head>\n"
"<body><h1>This is a minimal SSL-3 http server</h1>\n"
"<hr><it>/nisse</it></body></html>\n";
|
33ef43 | 1997-03-13 | Niels Möller | | int index = 0;
|
5f22e3 | 1997-03-17 | Niels Möller | | void write_callback()
|
33ef43 | 1997-03-13 | Niels Möller | | {
|
ead972 | 2003-01-20 | Martin Nilsson | | if (index < sizeof(message))
|
33ef43 | 1997-03-13 | Niels Möller | | {
int written = sslfile->write(message[index..]);
if (written > 0)
index += written;
else
sslfile->close();
}
|
ead972 | 2003-01-20 | Martin Nilsson | | if (index == sizeof(message))
|
33ef43 | 1997-03-13 | Niels Möller | | sslfile->close();
}
|
d67d3e | 2015-02-27 | Martin Nilsson | |
|
33ef43 | 1997-03-13 | Niels Möller | | void read_callback(mixed id, string data)
{
|
787114 | 2013-08-01 | Martin Nilsson | | SSL3_DEBUG_MSG("Received: '" + data + "'\n");
|
5f22e3 | 1997-03-17 | Niels Möller | | sslfile->set_write_callback(write_callback);
|
33ef43 | 1997-03-13 | Niels Möller | | }
|
d518a3 | 2015-09-02 | Martin Nilsson | | protected void create()
|
33ef43 | 1997-03-13 | Niels Möller | | {
|
5f22e3 | 1997-03-17 | Niels Möller | | sslfile->set_nonblocking(read_callback, 0, 0);
|
33ef43 | 1997-03-13 | Niels Möller | | }
}
|
bda15a | 2014-04-24 | Martin Nilsson | | class Client
|
33ef43 | 1997-03-13 | Niels Möller | | {
|
4e7ac8 | 2017-06-16 | Martin Nilsson | | Stdio.Buffer request = Stdio.Buffer(
|
8de161 | 2013-10-26 | Henrik Grubbström (Grubba) | | "HEAD / HTTP/1.0\r\n"
|
6df46f | 2014-05-20 | Henrik Grubbström (Grubba) | | "Host: " HOST ":" + PORT + "\r\n"
|
4e7ac8 | 2017-06-16 | Martin Nilsson | | "\r\n");
|
8de161 | 2013-10-26 | Henrik Grubbström (Grubba) | |
|
4e7ac8 | 2017-06-16 | Martin Nilsson | | void write_cb(SSL.File fd)
|
8de161 | 2013-10-26 | Henrik Grubbström (Grubba) | | {
|
4e7ac8 | 2017-06-16 | Martin Nilsson | | if( request->output_to(fd) < 0 )
exit(1, "Failed to write data: %s.\n", strerror(fd->errno()));
if( sizeof(request) ) return;
fd->set_write_callback(UNDEFINED);
|
8de161 | 2013-10-26 | Henrik Grubbström (Grubba) | | }
|
bda15a | 2014-04-24 | Martin Nilsson | |
|
8de161 | 2013-10-26 | Henrik Grubbström (Grubba) | | void got_data(mixed ignored, string data)
{
werror("Data: %O\n", data);
}
|
bda15a | 2014-04-24 | Martin Nilsson | |
|
8de161 | 2013-10-26 | Henrik Grubbström (Grubba) | | void con_closed()
{
|
bda15a | 2014-04-24 | Martin Nilsson | | exit(0, "Connection closed.\n");
|
8de161 | 2013-10-26 | Henrik Grubbström (Grubba) | | }
protected void create(Stdio.File con)
{
|
dc90a5 | 2014-05-15 | Martin Nilsson | | SSL.Context ctx = MyContext();
|
cba3fe | 2014-03-25 | Henrik Grubbström (Grubba) | |
|
74cb40 | 2014-03-25 | Henrik Grubbström (Grubba) | | ctx->preferred_suites = ctx->get_suites(-1, 2);
|
8de161 | 2013-10-26 | Henrik Grubbström (Grubba) | | werror("Starting\n");
|
4e7ac8 | 2017-06-16 | Martin Nilsson | | SSL.File ssl = SSL.File(con, ctx);
|
fd4fd8 | 2014-05-17 | Henrik Grubbström (Grubba) | | ssl->connect();
|
8de161 | 2013-10-26 | Henrik Grubbström (Grubba) | | ssl->set_nonblocking(got_data, write_cb, con_closed);
}
|
33ef43 | 1997-03-13 | Niels Möller | | }
|
a19ac2 | 2014-05-16 | Martin Nilsson | | string common_name;
void make_certificate(SSL.Context ctx, Crypto.Sign key, void|Crypto.Hash hash)
{
mapping attrs = ([
"organizationName" : "Test",
"commonName" : common_name,
]);
string cert = Standards.X509.make_selfsigned_certificate(key, 3600*24, attrs, 0, hash);
ctx->add_cert(key, ({ cert }), ({ "*" }));
}
|
33ef43 | 1997-03-13 | Niels Möller | | int main()
{
|
8de161 | 2013-10-26 | Henrik Grubbström (Grubba) | | #ifdef HTTPS_CLIENT
Stdio.File con = Stdio.File();
|
82a1a1 | 2015-02-23 | Martin Nilsson | | if (!con->connect(HOST, PORT))
|
51f1ce | 2015-09-06 | Martin Nilsson | | exit(1, "Failed to connect to server: %s.\n", strerror(con->errno()));
|
82a1a1 | 2015-02-23 | Martin Nilsson | |
|
bda15a | 2014-04-24 | Martin Nilsson | | Client(con);
|
82a1a1 | 2015-02-23 | Martin Nilsson | | return -1;
|
db61ee | 2014-01-14 | Henrik Grubbström (Grubba) | | #else
|
dc90a5 | 2014-05-15 | Martin Nilsson | | SSL.Context ctx = MyContext();
|
369794 | 2014-04-12 | Henrik Grubbström (Grubba) | |
|
11410b | 2014-03-08 | Henrik Grubbström (Grubba) | | Crypto.Sign key;
|
a19ac2 | 2014-05-16 | Martin Nilsson | | common_name = gethostname();
|
fbd1a5 | 2014-04-15 | Henrik Grubbström (Grubba) | | common_name = (gethostbyname(common_name) || ({ common_name }))[0];
werror("Common name: %O\n", common_name);
werror("Generating RSA certificate (%d bits)...\n", RSA_BITS);
key = Crypto.RSA()->generate_key(RSA_BITS);
|
a19ac2 | 2014-05-16 | Martin Nilsson | | make_certificate(ctx, key);
|
87af18 | 2014-04-01 | Martin Nilsson | |
|
fbd1a5 | 2014-04-15 | Henrik Grubbström (Grubba) | |
|
a19ac2 | 2014-05-16 | Martin Nilsson | | make_certificate(ctx, key, Crypto.SHA1);
|
cba3fe | 2014-03-25 | Henrik Grubbström (Grubba) | |
|
fbd1a5 | 2014-04-15 | Henrik Grubbström (Grubba) | | werror("Generating DSA certificate (%d bits)...\n", DSA_BITS);
catch {
key = Crypto.DSA()->generate_key(DSA_BITS, 256);
|
a19ac2 | 2014-05-16 | Martin Nilsson | | make_certificate(ctx, key);
|
fbd1a5 | 2014-04-15 | Henrik Grubbström (Grubba) | | };
|
2e6875 | 2014-04-02 | Martin Nilsson | | key = Crypto.DSA()->generate_key(1024, 160);
|
a19ac2 | 2014-05-16 | Martin Nilsson | | make_certificate(ctx, key, Crypto.SHA1);
|
cba3fe | 2014-03-25 | Henrik Grubbström (Grubba) | |
#if constant(Crypto.ECC.Curve)
|
fbd1a5 | 2014-04-15 | Henrik Grubbström (Grubba) | | werror("Generating ECDSA certificate (%d bits)...\n", 521);
|
60afeb | 2014-04-02 | Martin Nilsson | | key = Crypto.ECC.SECP_521R1.ECDSA()->generate_key();
|
bd174a | 2015-11-01 | Henrik Grubbström (Grubba) | | make_certificate(ctx, key, Crypto.SHA512);
make_certificate(ctx, key, Crypto.SHA256);
|
fbd1a5 | 2014-04-15 | Henrik Grubbström (Grubba) | |
|
a19ac2 | 2014-05-16 | Martin Nilsson | | make_certificate(ctx, key, Crypto.SHA1);
|
cba3fe | 2014-03-25 | Henrik Grubbström (Grubba) | | #endif
|
74cb40 | 2014-03-25 | Henrik Grubbström (Grubba) | |
|
fbd1a5 | 2014-04-15 | Henrik Grubbström (Grubba) | | ctx->preferred_suites = ctx->get_suites(CIPHER_BITS, KE_MODE);
|
ee5ab9 | 2018-05-12 | Martin Nilsson | | ctx->min_version = SSL.Constants.PROTOCOL_SSL_3_0;
|
d5d6e2 | 2014-04-01 | Martin Nilsson | | SSL3_DEBUG_MSG("Cipher suites:\n%s",
|
369794 | 2014-04-12 | Henrik Grubbström (Grubba) | | .Constants.fmt_cipher_suites(ctx->preferred_suites));
|
c8dde0 | 2014-09-05 | Martin Nilsson | | SSL3_DEBUG_MSG("Certs:\n%O\n", ctx->get_certificates());
|
369794 | 2014-04-12 | Henrik Grubbström (Grubba) | |
|
fc7f09 | 2014-06-01 | Martin Nilsson | | port = SSL.Port(ctx);
|
cba3fe | 2014-03-25 | Henrik Grubbström (Grubba) | |
|
33ef43 | 1997-03-13 | Niels Möller | | werror("Starting\n");
|
00c970 | 2015-03-24 | Martin Nilsson | | if (!port->bind(PORT, my_accept_callback, NetUtils.ANY))
|
82a1a1 | 2015-02-23 | Martin Nilsson | | exit(1, "Failed to bind port %d.\n", PORT);
werror("Listening on port %d.\n", PORT);
return -1;
|
8de161 | 2013-10-26 | Henrik Grubbström (Grubba) | | #endif
|
6ecec9 | 1997-03-15 | Niels Möller | | }
|