370919 | 2002-03-20 | Martin Nilsson | | #pike __REAL_VERSION__
|
576edc | 2014-02-14 | Martin Nilsson | | #require constant(SSL.Cipher)
|
33ef43 | 1997-03-13 | Niels Möller | |
|
d0efae | 2013-10-26 | Henrik Grubbström (Grubba) | |
|
f5bb03 | 2001-09-17 | Martin Nilsson | |
|
bf3f97 | 2013-12-06 | Henrik Grubbström (Grubba) | | #ifndef PORT
|
33ef43 | 1997-03-13 | Niels Möller | | #define PORT 25678
|
bf3f97 | 2013-12-06 | Henrik Grubbström (Grubba) | | #endif
|
33ef43 | 1997-03-13 | Niels Möller | |
|
b06b5d | 2013-08-01 | Martin Nilsson | | #ifdef SSL3_DEBUG
#define SSL3_DEBUG_MSG(X ...) werror(X)
#else /*! SSL3_DEBUG */
#define SSL3_DEBUG_MSG(X ...)
#endif /* SSL3_DEBUG */
|
33ef43 | 1997-03-13 | Niels Möller | | import Stdio;
|
d0efae | 2013-10-26 | Henrik Grubbström (Grubba) | | #ifndef HTTPS_CLIENT
|
b807c0 | 2014-04-12 | Henrik Grubbström (Grubba) | | SSL.sslport port;
|
d0efae | 2013-10-26 | Henrik Grubbström (Grubba) | |
void my_accept_callback(object f)
{
werror("Accept!\n");
|
b807c0 | 2014-04-12 | Henrik Grubbström (Grubba) | | conn(port->accept());
|
d0efae | 2013-10-26 | Henrik Grubbström (Grubba) | | }
#endif
|
33ef43 | 1997-03-13 | Niels Möller | | class conn {
import Stdio;
object sslfile;
|
da4f8b | 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();
}
void read_callback(mixed id, string data)
{
|
b06b5d | 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 | | }
|
b55e17 | 2010-12-26 | Henrik Grubbström (Grubba) | | protected void create(object f)
|
33ef43 | 1997-03-13 | Niels Möller | | {
sslfile = f;
|
5f22e3 | 1997-03-17 | Niels Möller | | sslfile->set_nonblocking(read_callback, 0, 0);
|
33ef43 | 1997-03-13 | Niels Möller | | }
}
class no_random {
|
34adca | 2004-02-03 | Martin Nilsson | | object arcfour = Crypto.Arcfour();
|
33ef43 | 1997-03-13 | Niels Möller | |
|
b55e17 | 2010-12-26 | Henrik Grubbström (Grubba) | | protected void create(string|void secret)
|
33ef43 | 1997-03-13 | Niels Möller | | {
if (!secret)
|
e3bc62 | 2014-04-02 | Martin Nilsson | | secret = sprintf("%s%4c", random_string(32), time());
arcfour->set_encrypt_key(Crypto.SHA256.hash(secret));
read(1000);
|
33ef43 | 1997-03-13 | Niels Möller | | }
string read(int size)
{
|
e3bc62 | 2014-04-02 | Martin Nilsson | | return arcfour->crypt( "\021"*size );
|
33ef43 | 1997-03-13 | Niels Möller | | }
}
|
d0efae | 2013-10-26 | Henrik Grubbström (Grubba) | | class client
|
33ef43 | 1997-03-13 | Niels Möller | | {
|
d0efae | 2013-10-26 | Henrik Grubbström (Grubba) | | constant request =
"HEAD / HTTP/1.0\r\n"
"Host: localhost:" + PORT + "\r\n"
"\r\n";
SSL.sslfile ssl;
int sent;
void write_cb()
{
int bytes = ssl->write(request[sent..]);
if (bytes > 0) {
sent += bytes;
} else if (sent < 0) {
werror("Failed to write data: %s\n", strerror(ssl->errno()));
exit(17);
}
if (sent == sizeof(request)) {
ssl->set_write_callback(UNDEFINED);
}
}
void got_data(mixed ignored, string data)
{
werror("Data: %O\n", data);
}
void con_closed()
{
werror("Connection closed.\n");
exit(0);
}
protected void create(Stdio.File con)
{
SSL.context ctx = SSL.context();
ctx->random = no_random()->read;
|
9c3942 | 2014-03-25 | Henrik Grubbström (Grubba) | |
|
915d77 | 2014-03-25 | Henrik Grubbström (Grubba) | | ctx->preferred_suites = ctx->get_suites(-1, 2);
|
d0efae | 2013-10-26 | Henrik Grubbström (Grubba) | | werror("Starting\n");
ssl = SSL.sslfile(con, ctx, 1);
ssl->set_nonblocking(got_data, write_cb, con_closed);
}
|
33ef43 | 1997-03-13 | Niels Möller | | }
int main()
{
|
d0efae | 2013-10-26 | Henrik Grubbström (Grubba) | | #ifdef HTTPS_CLIENT
Stdio.File con = Stdio.File();
if (!con->connect("127.0.0.1", PORT)) {
werror("Failed to connect to server: %s\n", strerror(con->errno()));
return 17;
}
client(con);
return -17;
|
118e8b | 2014-01-14 | Henrik Grubbström (Grubba) | | #else
|
b807c0 | 2014-04-12 | Henrik Grubbström (Grubba) | | SSL.context ctx = SSL.context();
|
557b46 | 2014-03-08 | Henrik Grubbström (Grubba) | | Crypto.Sign key;
|
935b34 | 2014-04-01 | Martin Nilsson | | string certificate;
|
557b46 | 2014-03-08 | Henrik Grubbström (Grubba) | |
|
e3bc62 | 2014-04-02 | Martin Nilsson | | key = Crypto.RSA()->generate_key(1024);
|
935b34 | 2014-04-01 | Martin Nilsson | | certificate =
|
9c3942 | 2014-03-25 | Henrik Grubbström (Grubba) | | Standards.X509.make_selfsigned_certificate(key, 3600*4, ([
"organizationName" : "Test",
"commonName" : "*",
]));
|
935b34 | 2014-04-01 | Martin Nilsson | |
|
b807c0 | 2014-04-12 | Henrik Grubbström (Grubba) | | ctx->add_cert(key, ({ certificate }), ({ "*" }));
|
9c3942 | 2014-03-25 | Henrik Grubbström (Grubba) | |
|
e3bc62 | 2014-04-02 | Martin Nilsson | | key = Crypto.DSA()->generate_key(1024, 160);
|
935b34 | 2014-04-01 | Martin Nilsson | | certificate =
|
9c3942 | 2014-03-25 | Henrik Grubbström (Grubba) | | Standards.X509.make_selfsigned_certificate(key, 3600*4, ([
"organizationName" : "Test",
"commonName" : "*",
]));
|
b807c0 | 2014-04-12 | Henrik Grubbström (Grubba) | | ctx->add_cert(key, ({ certificate }));
|
9c3942 | 2014-03-25 | Henrik Grubbström (Grubba) | |
#if constant(Crypto.ECC.Curve)
|
0f12b1 | 2014-04-02 | Martin Nilsson | | key = Crypto.ECC.SECP_521R1.ECDSA()->generate_key();
|
935b34 | 2014-04-01 | Martin Nilsson | | certificate =
|
9c3942 | 2014-03-25 | Henrik Grubbström (Grubba) | | Standards.X509.make_selfsigned_certificate(key, 3600*4, ([
"organizationName" : "Test",
"commonName" : "*",
]));
|
b807c0 | 2014-04-12 | Henrik Grubbström (Grubba) | | ctx->add_cert(key, ({ certificate }));
|
9c3942 | 2014-03-25 | Henrik Grubbström (Grubba) | | #endif
|
915d77 | 2014-03-25 | Henrik Grubbström (Grubba) | |
|
b807c0 | 2014-04-12 | Henrik Grubbström (Grubba) | | ctx->preferred_suites = ctx->get_suites(-1, 2);
|
bd7c0f | 2014-04-01 | Martin Nilsson | | SSL3_DEBUG_MSG("Cipher suites:\n%s",
|
b807c0 | 2014-04-12 | Henrik Grubbström (Grubba) | | .Constants.fmt_cipher_suites(ctx->preferred_suites));
SSL3_DEBUG_MSG("Certs:\n%O\n", ctx->cert_pairs);
ctx->random = no_random()->read;
|
915d77 | 2014-03-25 | Henrik Grubbström (Grubba) | |
|
b807c0 | 2014-04-12 | Henrik Grubbström (Grubba) | | port = SSL.sslport(ctx);
|
9c3942 | 2014-03-25 | Henrik Grubbström (Grubba) | |
|
33ef43 | 1997-03-13 | Niels Möller | | werror("Starting\n");
|
b807c0 | 2014-04-12 | Henrik Grubbström (Grubba) | | if (!port->bind(PORT, my_accept_callback))
|
cfc83a | 1997-03-15 | Niels Möller | | {
perror("");
return 17;
}
|
4652a2 | 2013-11-24 | Henrik Grubbström (Grubba) | | else {
werror("Listening on port %d.\n", PORT);
|
cfc83a | 1997-03-15 | Niels Möller | | return -17;
|
4652a2 | 2013-11-24 | Henrik Grubbström (Grubba) | | }
|
d0efae | 2013-10-26 | Henrik Grubbström (Grubba) | | #endif
|
6ecec9 | 1997-03-15 | Niels Möller | | }
|