Этот коммит содержится в:
Henry Case 2019-07-24 17:17:14 +01:00
родитель d60d62307b
Коммит e4e305c83e
17 изменённых файлов: 1199 добавлений и 0 удалений

38
bssl_perf/Makefile Обычный файл
Просмотреть файл

@ -0,0 +1,38 @@
BORINGSSL_DIR=/home/hdc/repos/cloudflare/boringssl
BORINGSSL_LIB=$(BORINGSSL_DIR)/build.64bitRel/
CC = clang
SRCDIR = src
OBJDIR = obj
DBG ?= 1
ifeq ($(DBG),1)
DEBUG = -DDEBUG -g -O0
else
DEBUG = -O3
endif
CFLAGS = -std=c99
CFLAGS+= $(DEBUG)
CFLAGS+= -I$(BORINGSSL_DIR)/ -I$(BORINGSSL_DIR)/include
LDFLAGS = -L$(BORINGSSL_LIB)/crypto -L$(BORINGSSL_LIB)/ssl
LDFLAGS+= -lssl -lcrypto -lpthread
all: server client
clean:
rm -rf $(OBJDIR)
rm -rf client server
client: common
$(CC) -c $(SRCDIR)/client.c -o $(OBJDIR)/client.o $(CFLAGS)
$(CC) -o client $(OBJDIR)/client.o $(OBJDIR)/common.o $(LDFLAGS)
server: common
$(CC) -c $(SRCDIR)/server.c -o $(OBJDIR)/server.o $(CFLAGS)
$(CC) -o server $(OBJDIR)/server.o $(OBJDIR)/common.o $(LDFLAGS)
common:
mkdir -p $(OBJDIR)
$(CC) -c $(SRCDIR)/common.c -o $(OBJDIR)/common.o $(CFLAGS)

24
bssl_perf/etc/ca/ca.cert.pem Обычный файл
Просмотреть файл

@ -0,0 +1,24 @@
-----BEGIN CERTIFICATE-----
MIID8jCCAtqgAwIBAgIJALuIdyUDX1d+MA0GCSqGSIb3DQEBCwUAMIGFMQswCQYD
VQQGEwJGUjENMAsGA1UECAwEUEFDQTEXMBUGA1UEBwwOQ2FnbmVzIHN1ciBNZXIx
JjAkBgNVBAsMHURvbWFpbiBDb250cm9sIFZhbGlkYXRlZCBTQVJMMSYwJAYDVQQD
DB1Eb21haW4gQ29udHJvbCBWYWxpZGF0ZWQgU0FSTDAeFw0xODA0MDkxNjMxMDVa
Fw00NTA4MjUxNjMxMDVaMIGFMQswCQYDVQQGEwJGUjENMAsGA1UECAwEUEFDQTEX
MBUGA1UEBwwOQ2FnbmVzIHN1ciBNZXIxJjAkBgNVBAsMHURvbWFpbiBDb250cm9s
IFZhbGlkYXRlZCBTQVJMMSYwJAYDVQQDDB1Eb21haW4gQ29udHJvbCBWYWxpZGF0
ZWQgU0FSTDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALBjh23Spt4I
AvaFLNL9LXDngLy6OyJbqPYNOEfn9vdvzcCJZbBDhD1HNoIuJux340wcio5TZajX
sJCIUl/n+e+8BGwxzZvp3qM2e/Rs94roZjlUWHMaX/a8Q7MvrR9XWM1SaEp2fHa9
nBgdfSo+BvvILq8lZU7vO+xw7Yjtx0YNk1v3IAMoQyrfaeZcb9uE1tuAj0oPwmEp
CWqGVkQEIJ6MJBbA+6SW6yi/5h3s0mbc7hdcmLr+vSv5Bkg8qOaPwh0ffuTCMuGq
8q9en4WSW/mnbDZpPdGZwp4Ub7po4Zp9dVQoD7Skf9chz26+pivmIfUB1Xwr48b2
gFfbZcwDsFsCAwEAAaNjMGEwHQYDVR0OBBYEFPSjEiJgM3NjauAc0lzUrgExAgvg
MB8GA1UdIwQYMBaAFPSjEiJgM3NjauAc0lzUrgExAgvgMA8GA1UdEwEB/wQFMAMB
Af8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4IBAQAQALRSOq1IwOMG
qZeXvNmd+jGomDH4IDV+s+agGWWneVzRJzP1qSxvrG5BgyP+STzvxEJBgGfCZKHw
qW2HH2bt3vU0KhF90zthmLlZSphuF3XTBUyWfhmUgxuSWxgScBLHrk2vwQv55Mxn
N88DPwYfRLjJUfEIDhzgNRsrVP1mbP0tmXjfmuQzE9Ht8L3fqJ+Tfk/eHdJIOkeM
YRYSOT6oa7g49Vi6ONE7m+BqCDS7D+2p6t6Zb/1lEI82TvmbUq7gd9xHCROFmhis
gBKsJxp0aVI5pB9mLqnluB21c4sVqt6si8sWcJjtTCmojp192aSxB3A6hVI0P8qY
7iJBFwa1
-----END CERTIFICATE-----

8
bssl_perf/etc/ecdsa_256.key Обычный файл
Просмотреть файл

@ -0,0 +1,8 @@
-----BEGIN EC PARAMETERS-----
BggqhkjOPQMBBw==
-----END EC PARAMETERS-----
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIF8KXjVrcF0u+J3dDxrOPHr3/xQlxwpZowwdDxiM72iUoAoGCCqGSM49
AwEHoUQDQgAE7HJPLOV22gIiLMIR1btCTDQMbtwwWqhuErrk2r4+p3Oino2fSDBm
9T76CNfnLjmUue1qoLj144aK86GB0rGy4A==
-----END EC PRIVATE KEY-----

15
bssl_perf/etc/ecdsa_256.pem Обычный файл
Просмотреть файл

@ -0,0 +1,15 @@
-----BEGIN CERTIFICATE-----
MIICTTCCATUCCQD7FNAespFtBDANBgkqhkiG9w0BAQsFADCBhTELMAkGA1UEBhMC
RlIxDTALBgNVBAgMBFBBQ0ExFzAVBgNVBAcMDkNhZ25lcyBzdXIgTWVyMSYwJAYD
VQQLDB1Eb21haW4gQ29udHJvbCBWYWxpZGF0ZWQgU0FSTDEmMCQGA1UEAwwdRG9t
YWluIENvbnRyb2wgVmFsaWRhdGVkIFNBUkwwHhcNMTgwNDA5MjAxMTEwWhcNNDUw
ODI0MjAxMTEwWjAWMRQwEgYDVQQDDAt3d3cuZG12LmNvbTBZMBMGByqGSM49AgEG
CCqGSM49AwEHA0IABOxyTyzldtoCIizCEdW7Qkw0DG7cMFqobhK65Nq+Pqdzop6N
n0gwZvU++gjX5y45lLntaqC49eOGivOhgdKxsuAwDQYJKoZIhvcNAQELBQADggEB
ADEx+x0XXiTyBjEi5wVFEx/36tD4TMck5GLzyWFBPMgY5rVk0/scyYslqikF7j/M
OY/Z+3WG/Wx0OqH+inA+aYb2xg6qLd4JR9eIRU7luSKyFDRCK3BYcpPYa9DQKVim
Q4jA17rLRKqLLSDWUr0VO+YaXk9EqpkjjEeo3Dn1xIKtwwqvEocFUWlc1MPUrfgX
OpPP4fSyqPcE0I75vWsznGyrYax9k7fAFV/UdC2p/jQPs+lVVesml2DJA9IjEdpJ
1HOKpzjPXrPkCixoXqjM0HZRLuCNUb1sl8bWvpCQ6xTtDH0mkt8yHO6HeqKLpgpZ
2O99VHKVMmEzsFOyE+4khVM=
-----END CERTIFICATE-----

Двоичные данные
bssl_perf/etc/random_data Обычный файл

Двоичный файл не отображается.

30
bssl_perf/etc/rsa_2048.key Обычный файл
Просмотреть файл

@ -0,0 +1,30 @@
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,298AA9B5B7606E863BB9183F689D9346
VvURRUrBBi/AlUA4AlFUKm+aVzvnG4TQrhHKTV3nFGOHeqB+Sua+3R+e6svyiY+p
d0VaZtlpS2mE7lxPqy0+VOarCYYkJOF2juGVMwFzEG8lkoEUyC8qyOobaRj4OCcb
PgIk9b3i5Lv2PBLTpC4lxo6FrUykKXqLKeg0Lp4EEfFRGOKQB5CQBDeGOA1oBeqt
cwRxXP8k3KPiIs+P+Lswk5qLD4gTtlf8ycQmJuCDFUQ3ARgRvngqFvu/44fm5Ztv
6fBvAQvoHXJ9I+HuJAJcT1wGn9itZYFRMXyA2pf1Q2WHpxm1ZS7AiZrn5nyqPpnV
aoBlwR7D0OxyoRumSHA3Y4YheN+uId27Gg12AWUalDcFes3DD2DZOkSQrzsIT0X3
EifJSSnuOTLe8w+SSvUVIMxkW5CRE0uOi/wuZHTpRN0ZxsvmeL+EHQmqtAOcjS5g
RPMidMdSGfCnqC0N2EAalUU2BsIGRgG5yvmG5ZIqu0Bm6WIIX1T34HS8HUhDqgRX
jOi8Ch7J/6xMZcxSeqRvdss96s6SzehqpG3kW7EsualJqWwmAGF0oJOxX6LupIRd
0GacwZv+NcWPYKL9oDNINPrU8hvobhaSeLvK8Gum8DK4TTd0evng6LYvkgejIcRF
pzfC+ONTiHZO4ayxleJVFAdph2LY3itO/TKD6KBLq0vnd+HvOKPWq0s0zDtQ/mSF
PMEwZ0DvYq5mtko5MOIqlIJKXS+p+jmzAhIZzqPt57HoyZjuRKTKkvlTeOoY7cax
UDGJffDrnagbP3R12i+bm7Bmz7aQQktuwhV7/SrEnJDM2PLDOYuWnGV5v/Cb+L/7
gGMFs9PTro8p4OkCLcpyGS/FoA7J5B1JixhUJ4tSEzEkTBSYz5WCi7NqrRZ9nnDf
drYBNpMHlK4DNRe9qhusdRPrbd9srDH8g74QQgzWorYx0TqBUS45NLyyUZPydFxJ
vAT1lmdWo7DhhnqSkPAcrwKdakDIravzvw0Ex+iEzAPSaflDvVybu6Gf8r6FrFIR
SrR2pT4EztvPViaS9KZHZ0PQYKporwsWM1ZLyGX2qi3d5+YFijE3IT67rSLuEBMO
/RFY0OCHbmKNrOiCaXk51+04hXg8ptjAxD8YCFpOzaDlSW2LX9D2QAfghoArZVTb
OHThemZ4zIvamGkZLQB44nuvduIRGBA2LiQ0YiH4FhuJCP7zTCtCqQu4Wnn6J4tb
YCEtm9ntFSGGCipErqqENPTBhxz6exO8emd2/y0INY4d9xJYjfhqCrKShpeF+/Lf
6pJ3Pj9qA3D8wWcizER5N4R1fzmhTOSCxinC6OVJOzdk76M6gi+bD5RV8HD60TyG
VEmTusA8lrLlKSYiE+4VFYBJjBSCopybJAaNsKXaYM3hwaPTPJwsgPWxwQ5m/vPT
7dvkPOnhqwQ7DEvr2y3AgEUJxXxtsNwQEiKgMuRxNIQNE5mp68dJ5hMFnbJUPvvo
80IsUH11LLDQJV60aLLF8M37BFvNPUayaS+oP78UwRMbnpC92nuHNgvGfdXFKhV3
/8z6lNYPlMGgBwdCD6NBXpXHkp7rxOAGvHx5eUocjgXfF2b8zSXyN/9egK9sfMZZ
-----END RSA PRIVATE KEY-----

19
bssl_perf/etc/rsa_2048.pem Обычный файл
Просмотреть файл

@ -0,0 +1,19 @@
-----BEGIN CERTIFICATE-----
MIIDGDCCAgACCQD7FNAespFtAjANBgkqhkiG9w0BAQsFADCBhTELMAkGA1UEBhMC
RlIxDTALBgNVBAgMBFBBQ0ExFzAVBgNVBAcMDkNhZ25lcyBzdXIgTWVyMSYwJAYD
VQQLDB1Eb21haW4gQ29udHJvbCBWYWxpZGF0ZWQgU0FSTDEmMCQGA1UEAwwdRG9t
YWluIENvbnRyb2wgVmFsaWRhdGVkIFNBUkwwHhcNMTgwNDA5MTYzMjEwWhcNNDUw
ODI0MTYzMjEwWjAWMRQwEgYDVQQDDAt3d3cuZG12LmNvbTCCASIwDQYJKoZIhvcN
AQEBBQADggEPADCCAQoCggEBANDw1tIr4IHqfivyIBMn4MPRaPQFxOZPIRaIOo85
4gaeHD11tLbxIh++lzfxk//ubC5a5K/PUDsVhLupTQVNKklcg4eRymZROkXoqgRg
+ibEH5IYRu64aVlhQe4lGiK/Z8njUtq31zeyn2RaYWW/4uq/wmOKB/qVinARISKf
lvTjtSN5cBg55tyDV5Cb7GgpSBXVGc8J4WKU6BAn43FTqgj8XkVvGYR3C/X5ZR/+
3xXVqe/VwLHyYNe61ySYRmymdoXJnJE7l0+MJhcpvepzEZ1pCULomNbHcxGfSZnc
XsajvNKp/Y+cjC/IYmzkpTHgHhUEVs1rAdotNr0j5vRS/iECAwEAATANBgkqhkiG
9w0BAQsFAAOCAQEAXjyhGLvT1waoYofYhkN3xmrkDxtM8HmG/xGad1vhkx6Qi2M/
kdX/UlEMwlkh1Of20iJVcMmTPleiOcIO2cE8F0BQ4wIGN3PGw8guxa11ToyyMarg
cWNUWdA4gwYvMQv6tceUtsJUjNp0O6JW563jejVaiqBHhG50riJ2wfzqgMItjZY0
/TLVRQbEJ+NGeYZJ9/jL5xmHxoL8ROQ3RXtZjxU6Jr0pe3Y7XKT27QE3007EkCYb
XG7K1U/rbixqfphXys677gjJ8xXChunjNqCijNk2xjHmu2MakspSqIB86oB50oLj
Pu+AVI/SGD1qlJBC9qlgDoUkm9VI9mTIKJzALg==
-----END CERTIFICATE-----

40
bssl_perf/etc/rsa_3072.key Обычный файл
Просмотреть файл

@ -0,0 +1,40 @@
-----BEGIN PRIVATE KEY-----
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
u5evFUiLOWw7CJ9Sy1/Jaws=
-----END PRIVATE KEY-----

18
bssl_perf/etc/rsa_3072.pem Обычный файл
Просмотреть файл

@ -0,0 +1,18 @@
-----BEGIN CERTIFICATE-----
MIIC1DCCAnsCCQCY04gkucQIkzAKBggqhkjOPQQDAjB9MQswCQYDVQQGEwJGUjEN
MAsGA1UECAwEUEFDQTEXMBUGA1UEBwwOQ2FnbmVzIHN1ciBNZXIxIjAgBgNVBAsM
GUNlcnQgVGVzdGluZyBPcmdhbml6YXRpb24xIjAgBgNVBAMMGUNlcnQgVGVzdGlu
ZyBPcmdhbml6YXRpb24wHhcNMTgwNDE3MTMyNzA4WhcNMTgwNTE3MTMyNzA4WjAf
MR0wGwYDVQQDDBR3d3cuY2VydF90ZXN0aW5nLmNvbTCCAaAwDQYJKoZIhvcNAQEB
BQADggGNADCCAYgCggGBAMKGhSzLDBIZ5y5ocYY0xjw+u8zuc+NekVcPQwrU4bRh
/d5X9CpELdqFLtIgJS+FFOIPMKV7Pjk04rFikfULS78z8O+iMWCsYmUpW87S91yT
GVYLIroNUqLAE/vJKRePL5O5G4hniTEfNYIASV1uA8eUgY/G+FTh0Adcdx0cZ0CA
cv7sCFmHfZpwgOremSVrc9ABrApyX/vaXu89eO7n3iNZmTOuo+NcqknYZFfyrlcW
gw1R7eENHUWThqKPtjaTlpaaQPdZUYe2L0pl2O5rYJginX4FRnbTnDE6JYeWyGlf
OzvcTGPa6/04z99xWWLLlP65Hztroqgir7u+tTrjbJYJY7HenOG9+AEA0KclFZcK
rgI8DIiY1RpqmCesz1MhZHIGa0Pv+qx9DRsMoki1/6nhnPHVBq0soUbyppqg/7qW
JBBpgVE/+/5xcztz0tpTt6UojfLIKUtJShWuDq+n/FSwhxpiNQ/aP7dUy/ngPLXx
5a3YWSZEHWialKn6DpegjwIBAzAKBggqhkjOPQQDAgNHADBEAiBiXGvdsqXGxDtR
09lV6d2w2rYVteso/RVCQVxUWo5BuQIgRXF5XrvhRbpTOaRgLgnOpyLZv7nEwWNG
cRb2Q37V4VM=
-----END CERTIFICATE-----

212
bssl_perf/src/client.c Обычный файл
Просмотреть файл

@ -0,0 +1,212 @@
#include <unistd.h>
#include "common.h"
// include/ path is here for a reason - to make sure we compile against boringssl (temporary solution)
#include <include/openssl/ssl.h>
#include <pthread.h>
// Buffer used for read/write tests
unsigned char rw_buf[BUFFER_SIZE];
static const int Curves[1] = {NID_X25519};
static const uint16_t TLS_PROT_VERSION = TLS1_3_VERSION;
SSL_CTX *setup_client_ctx(void)
{
SSL_CTX* ctx = NULL;
ctx = SSL_CTX_new(TLS_method());
assert(ctx != NULL);
SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
if( SSL_CTX_load_verify_locations(ctx, CACERT, NULL) != 1) {
ERR("Error loading CA DIR");
}
if (SSL_CTX_set1_curves(ctx, Curves, 1) != 1) {
ERR("Can't set SIDH group");
}
if (SSL_CTX_set_min_proto_version(ctx, TLS_PROT_VERSION) != 1 ||
SSL_CTX_set_max_proto_version(ctx, TLS_PROT_VERSION) != 1) {
ERR("Enforcing protocol to TLSv1.2");
}
return ctx;
}
int do_client_loop(SSL* ssl)
{
int err, nwritten;
char buf[80];
for(;;)
{
if( !fgets(buf, sizeof(buf), stdin) )
break;
for(nwritten = 0; nwritten < strlen(buf); nwritten += err)
{
err = SSL_write(ssl, buf + nwritten, strlen(buf) - nwritten);
if(err<=0)
return 0;
}
}
return 1;
}
void test_Handshake(size_t handshake_nb) {
SSL* ssl;
SSL_CTX* ctx;
int err;
init();
ctx = setup_client_ctx();
DBG("Trying to connect");
for (size_t i=0; i<handshake_nb; i++) {
int fd = connect_once();
DBG("SSL ctx setup");
if (!(ssl = SSL_new(ctx))) {
ERR("Error creating an SSL context");
}
SSL_set_fd(ssl, fd);
DBG("SSL handshake");
// OZAPTF: do handshake thing
err = SSL_connect(ssl);
if (err<=0) {
ERR("Error connecting SSL err=%d", err);
}
assert(!SSL_session_reused(ssl));
SSL_free(ssl);
close(fd);
}
SSL_CTX_free(ctx);
}
void test_Read() {
int err, nread=0;
SSL* ssl;
SSL_CTX* ctx;
init();
ctx = setup_client_ctx();
DBG("Trying to connect");
int fd = connect_once();
DBG("SSL ctx setup");
if (!(ssl = SSL_new(ctx))) {
ERR("Error creating an SSL context");
}
SSL_set_fd(ssl, fd);
DBG("SSL handshake");
err = SSL_connect(ssl);
if (err<=0) {
ERR("Error connecting SSL err=%d", err);
}
DBG("SSL writing");
if (SSL_write(ssl, (unsigned char*)READ_REQUEST, sizeof(READ_REQUEST) ) <= 0) {
ERR("SSL_write");
}
DBG("Continue reading");
do {
#ifdef DEBUG
fwrite(rw_buf,1, nread, stdout);
#endif
for(nread=0; nread<sizeof(rw_buf); nread+=err) {
err = SSL_read(ssl, rw_buf+nread, sizeof(rw_buf) - nread);
if(err <= 0) {
break;
}
}
} while(err>0);
if (0==(SSL_get_shutdown(ssl) & SSL_RECEIVED_SHUTDOWN)) {
ERR("SSL_Read");
}
DBG("Shutdown");
assert(SSL_shutdown(ssl) == 1);
SSL_free(ssl);
SSL_CTX_free(ctx);
close(fd);
}
void test_Write() {
SSL* ssl;
SSL_CTX* ctx;
int err,nread=0;
init();
ctx = setup_client_ctx();
DBG("Trying to connect");
int fd = connect_once();
DBG("SSL ctx setup");
if (!(ssl = SSL_new(ctx))) {
ERR("Error creating an SSL context");
}
SSL_set_fd(ssl, fd);
DBG("SSL handshake");
err = SSL_connect(ssl);
if (err<=0) {
ERR("Error connecting SSL err=%d", err);
}
DBG("Writing");
fill_buffer_from_file(rw_buf, sizeof(rw_buf));
for (size_t i=0; i<RW_ITERATIONS; i++) {
for(nread=0; nread<sizeof(rw_buf); nread+=err) {
err = SSL_write(ssl, rw_buf+nread, sizeof(rw_buf) - nread);
if(err <= 0) {
ERR("SSL_write");
}
}
}
DBG("Shutdown");
assert(SSL_shutdown(ssl) == 0);
assert(SSL_shutdown(ssl) == 1);
SSL_free(ssl);
SSL_CTX_free(ctx);
close(fd);
}
int main(int argc, char* argv[]) {
if (argc < 2) {
goto usage;
}
if (!strncmp("test_Handshake", argv[1], strlen("test_Handshake"))) {
test_Handshake(HANDHAKE_REPS);
} else if (!strncmp("test_Read", argv[1], strlen("test_Read"))) {
test_Read();
} else if (!strncmp("test_Write", argv[1], strlen("test_Write"))) {
test_Write();
} else {
printf("Unknown test");
goto usage;
}
exit:
cleanup();
return 0;
usage:
ERR("\n\nUsage: %s <host>:<port> test_name\nOptions for 'test_name':\n\t"
"test_Handshake\n\ttest_Write\n\ttest_Read\n", argv[0]);
goto exit;
}

84
bssl_perf/src/common.c Обычный файл
Просмотреть файл

@ -0,0 +1,84 @@
#include "common.h"
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <netinet/tcp.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <include/openssl/ssl.h>
/* -----------------------------------------------------------------------------
* @brief Performs TCP 3-way handshake with IP:PORT
* -------------------------------------------------------------------------------- */
int connect_once(void) {
struct sockaddr_in a;
int fd = socket(AF_INET, SOCK_STREAM, 0);
memset(&a, 0, sizeof(a));
a.sin_family = AF_INET;
a.sin_addr.s_addr = inet_addr(IP);
a.sin_port = htons(PORT);
// Set socket to blocking, in order to make things simpler
if (fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) & ~O_NONBLOCK )<0) {
ERR("fcntl");
}
if (connect(fd, (struct sockaddr *) &a, sizeof(a))<0) {
ERR("Econnect");
}
DBG("Connected");
return fd;
}
/* -----------------------------------------------------------------------------
* @brief Fills the buffer with random data.
*------------------------------------------------------------------------------ */
void fill_buffer_from_file(unsigned char *b, size_t sz) {
FILE * fd = fopen(RANDOM_DATA_FILE, "r");
if (!fd) {
ERR("fopen");
}
if (fread(b, 1, sz, fd) < sz) {
// Random data file smaller than a buffer
ERR("fread");
}
if (fclose(fd)) {
ERR("fclose");
}
}
/* -----------------------------------------------------------------------------
* @brief Initializes BoringSSL structures
*------------------------------------------------------------------------------ */
void init(void) {
OpenSSL_add_all_algorithms();
SSL_load_error_strings();
SSL_library_init();
CRYPTO_library_init();
if(!SSL_library_init())
{
fprintf(stderr, "** OpenSSL initialization failed!\n");
exit(-1);
}
}
/* -----------------------------------------------------------------------------
* @brief Tears down what was initialized in init() above
*------------------------------------------------------------------------------ */
void cleanup(void) {
ERR_free_strings();
ERR_clear_error();
CRYPTO_set_locking_callback(NULL);
CRYPTO_set_id_callback(NULL);
EVP_cleanup();
CRYPTO_cleanup_all_ex_data();
}

64
bssl_perf/src/common.h Обычный файл
Просмотреть файл

@ -0,0 +1,64 @@
#ifndef __COMMON_H__
#define __COMMON_H__
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#ifdef DEBUG
#include <stdio.h>
#endif
#define PORT 1443
#define IP "127.0.0.1"
#define SERVER "localhost"
#define CLIENT "localhost"
#define CACERT "etc/ca/ca.cert.pem"
//#define CERT_HOSTNAME "www.cert_testing.com"
#define CERT_HOSTNAME "www.dmv.com"
#define KEYFILE_PASS "test123"
#define READ_REQUEST "ReadRequest"
#define HANDHAKE_REPS 200
// Keep random data file must at least same size as a buffer size
#define RANDOM_DATA_FILE "etc/random_data"
#define BUFFER_SIZE 1024
// Amount bytes of plaintext data exchanged in read-write stets is BUFFER_SIZE*RW_ITERATOIONS
#ifdef DEBUG
#define RW_ITERATIONS (1024*10) // 10 MB
#else
#define RW_ITERATIONS (1024*200) // 1GB
#endif
// Utils
#define LOG_I(...) \
do { \
(void) fprintf(stdout, "[%s() %s:%d] ", __func__, __FILE__, __LINE__); \
(void) fprintf(stdout, __VA_ARGS__); \
(void) fprintf(stdout, "\n"); \
} while (0)
#define ERR(...) \
do { \
LOG_I(__VA_ARGS__); \
exit(-1); \
} while (0)
#define LOG(...) LOG_I(__VA_ARGS__)
#ifdef DEBUG
#define DBG(...) LOG_I(__VA_ARGS__)
#else
#define DBG(...)
#endif
#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
int connect_once(void);
void init(void);
void cleanup(void);
void fill_buffer_from_file(unsigned char *b, size_t sz);
// Available tests
void test_Write(void);
void test_Read(void);
void test_Handshake(size_t);
#endif // __COMMON_H__

260
bssl_perf/src/server.c Обычный файл
Просмотреть файл

@ -0,0 +1,260 @@
#include <netinet/tcp.h>
#include <sys/socket.h>
#include <arpa/inet.h>
// include/ path is here for a reason - to make sure we compile against boringssl (temporary solution)
#include <include/openssl/rand.h>
#include <include/openssl/ssl.h>
#include <include/openssl/x509v3.h>
#include <pthread.h>
#include "common.h"
// Enforce this protocol version
#define TLS_PROT_VERSION TLS1_3_VERSION
static const int Curves[3] = {NID_CECPQ2, NID_CECPQ2b, NID_X25519};
static const struct CertDesc_t {
const char* arg;
const char* cert;
const char* key;
const char* cipher;
const int* curves;
} Certs[] = {
{
.arg = "RSA_2048",
.key = "etc/rsa_2048.key",
.cert = "etc/rsa_2048.pem",
.cipher = "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
.curves = Curves,
},
{
.arg = "RSA_3072",
.key = "etc/rsa_3072.key",
.cert = "etc/rsa_3072.pem",
.cipher = "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
.curves = Curves,
},
{
.arg = "ECDSA_256",
.key = "etc/ecdsa_256.key",
.cert = "etc/ecdsa_256.pem",
.cipher = "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
.curves = Curves,
}
};
const struct CertDesc_t* get_cert_desc(const char* c) {
for(size_t i=0; i<ARRAY_SIZE(Certs); i++) {
if (!memcmp(Certs[i].arg, c, strlen(Certs[i].arg))) {
return &Certs[i];
}
}
ERR("Critical error");
}
// Buffer used for read/write tests
unsigned char rw_buf[BUFFER_SIZE];
int pass_cb(char *buf, int size, int rwflag, void *u) {
DBG("Using password " KEYFILE_PASS);
// password for all keys is "test123"
memcpy(buf, KEYFILE_PASS, strlen(KEYFILE_PASS));
return strlen(KEYFILE_PASS);
}
static int accept_once(void) {
int fd, client;
int reuseval = 1;
struct sockaddr_in a;
size_t a_len = sizeof(a);
// configure
memset(&a, 0, a_len);
a.sin_family = AF_INET;
a.sin_port = htons(PORT);
a.sin_addr.s_addr = INADDR_ANY;
fd = socket(PF_INET, SOCK_STREAM, 0);
if (setsockopt(fd,SOL_SOCKET, SO_REUSEADDR, &reuseval, sizeof(reuseval))) {
ERR("setsockopt");
}
if (bind(fd, (struct sockaddr *)&a, sizeof(a))) {
ERR("bind");
}
if (listen(fd, 1)) {
ERR("listen");
}
client = accept(fd, (struct sockaddr *)&a, (socklen_t *)&a_len);
if (client<0) {
ERR("accept");
}
return client;
}
static SSL_CTX* setup_server_ctx(const char* cert_name) {
SSL_CTX* ctx = SSL_CTX_new(TLS_method());
assert(ctx);
const struct CertDesc_t *c = get_cert_desc(cert_name);
SSL_CTX_set_default_passwd_cb(ctx, &pass_cb);
if(SSL_CTX_use_certificate_file(ctx, c->cert, SSL_FILETYPE_PEM) != 1)
ERR("Error loading certificate from file");
if(SSL_CTX_use_PrivateKey_file(ctx, c->key, SSL_FILETYPE_PEM) != 1)
ERR("Error loading private key from file");
if (SSL_CTX_set_strict_cipher_list(ctx, c->cipher) != 1) {
ERR("Error setting cipher list");
}
if (!SSL_CTX_set1_curves(ctx, c->curves, 1)) {
ERR("Enforcing curve");
}
if (SSL_CTX_set_min_proto_version(ctx, TLS_PROT_VERSION) != 1 ||
SSL_CTX_set_max_proto_version(ctx, TLS_PROT_VERSION) != 1) {
ERR("Enforcing protocol to TLSv1.2");
}
return ctx;
}
static void start_writing(SSL *ssl) {
int nread,err;
DBG("Start writing");
fill_buffer_from_file(rw_buf, sizeof(rw_buf));
for (size_t i=0; i<RW_ITERATIONS; i++) {
for(nread=0; nread<sizeof(rw_buf); nread+=err) {
err = SSL_write(ssl, rw_buf+nread, sizeof(rw_buf) - nread);
if(err <= 0) {
ERR("SSL_write");
}
}
}
}
static int do_server_loop(SSL* ssl) {
int nread,err;
DBG("Check if first packet is ReadRequest");
for(nread=0; nread<strlen(READ_REQUEST); nread+=err) {
err = SSL_read(ssl, rw_buf+nread, sizeof(rw_buf) - nread);
if (err <=0) {
break;
}
}
DBG("Check if server loop should be finished");
// Stop here if shutdown requested
if (SSL_get_shutdown(ssl) & SSL_RECEIVED_SHUTDOWN) {
return 1;
}
// Check if client wants to read
if (nread && !memcmp(READ_REQUEST, rw_buf, nread)) {
start_writing(ssl);
return 2; // server initiated closure
}
// Keep reading till connection closed
DBG("Continue reading");
do {
for(nread=0; nread<sizeof(rw_buf); nread+=err) {
err = SSL_read(ssl, rw_buf+nread, sizeof(rw_buf) - nread);
if(err <= 0) {
break;
}
}
} while(err>0);
return (SSL_get_shutdown(ssl) & SSL_RECEIVED_SHUTDOWN) ? 1 : 0;
}
#ifdef DEBUG
static const char* DBG_get_curve(SSL* ssl) {
const int id = SSL_get_curve_id(ssl);
if (!id) return "N/A";
return SSL_get_curve_name(id);
}
#endif
// Interface for accepting
int main(int argc, char *argv[])
{
SSL *ssl;
SSL_CTX *ctx;
int fd, ret;
if (argc < 2) {
goto usage;
}
// Start server
init();
ctx = setup_server_ctx(argv[1]);
fd = accept_once();
for(;;) {
DBG("SSL Accepting");
if(!(ssl = SSL_new(ctx))) {
DBG("Error creating SSL context");
}
SSL_set_fd(ssl, fd);
ret = SSL_accept(ssl);
//printf("%s\n", SSL_get_curve_name(SSL_get_curve_id(ssl)));
if (ret<=0) {
ret = SSL_get_error(ssl, ret);
if (ret == SSL_ERROR_SYSCALL) {
DBG("Connection closed");
goto end;
} else {
ERR("Critical error occured %d", ret);
}
}
DBG("Protocol: %s Cipher %s Curve %s", SSL_get_version(ssl), SSL_get_cipher_name(ssl), DBG_get_curve(ssl));
DBG("server loop");
ret = do_server_loop(ssl);
if(ret) {
DBG("Shutdown");
SSL_set_read_ahead(ssl, 0);
if (ret==2) {
// Server is closing
SSL_shutdown(ssl);
}
assert(SSL_shutdown(ssl)==1);
}
else {
DBG("Shutdown - error case");
goto end;
}
SSL_clear(ssl);
}
SSL_CTX_free(ctx);
end:
cleanup();
return 0;
usage:
ERR("\n\nUsage: %s server certificate \nOptions for 'server certificate':\n\t"
"RSA_2048\n\t"
"RSA_3072\n\t"
"ECDSA_256\n\t",
argv[0]);
goto end;
}

92
rawhammer/Cargo.lock сгенерированный Обычный файл
Просмотреть файл

@ -0,0 +1,92 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
[[package]]
name = "bitflags"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "cc"
version = "1.0.38"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "cfg-if"
version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "ctrlc"
version = "3.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"nix 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "libc"
version = "0.2.60"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "nix"
version = "0.14.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)",
"cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)",
"void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "rawhammer"
version = "0.1.0"
dependencies = [
"ctrlc 3.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
"thread-control 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "thread-control"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "void"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "winapi"
version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "winapi-i686-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[metadata]
"checksum bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3d155346769a6855b86399e9bc3814ab343cd3d62c7e985113d46a0ec3c281fd"
"checksum cc 1.0.38 (registry+https://github.com/rust-lang/crates.io-index)" = "ce400c638d48ee0e9ab75aef7997609ec57367ccfe1463f21bf53c3eca67bf46"
"checksum cfg-if 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "b486ce3ccf7ffd79fdeb678eac06a9e6c09fc88d33836340becb8fffe87c5e33"
"checksum ctrlc 3.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c7dfd2d8b4c82121dfdff120f818e09fc4380b0b7e17a742081a89b94853e87f"
"checksum libc 0.2.60 (registry+https://github.com/rust-lang/crates.io-index)" = "d44e80633f007889c7eff624b709ab43c92d708caad982295768a7b13ca3b5eb"
"checksum nix 0.14.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6c722bee1037d430d0f8e687bbdbf222f27cc6e4e68d5caf630857bb2b6dbdce"
"checksum thread-control 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "22e002431352cce4e76fd6fe77d5bf1b75ff790ea790602f0579ce58641c2eea"
"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
"checksum winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "f10e386af2b13e47c89e7236a7a14a086791a2b88ebad6df9bf42040195cf770"
"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"

11
rawhammer/Cargo.toml Обычный файл
Просмотреть файл

@ -0,0 +1,11 @@
[package]
name = "rawhammer"
version = "0.1.0"
authors = ["Kris Kwiatkowski <kris@cloudflare.com>"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
ctrlc = "3.1.3"
thread-control = "0.1.2"

0
rawhammer/README.md Обычный файл
Просмотреть файл

284
rawhammer/src/main.rs Обычный файл
Просмотреть файл

@ -0,0 +1,284 @@
use std::io::Write;
use std::net::*;
use std::env;
use std::time::Duration;
use std::sync::mpsc::sync_channel;
use std::thread;
use std::time;
use ctrlc;
use thread_control::*;
static CH_X25519: &'static [u8] = b"\
\x16\x03\x01\x00\xfc\x01\x00\x00\xf8\x03\x03\x84\x14\x34\x1d\x32\
\x62\x53\x6c\x37\xb5\xdd\xe6\xd9\x58\x34\xd7\x3b\x36\xf0\xb8\x05\
\xd1\xba\x5c\xa6\x47\x15\xae\xd6\x35\x54\x62\x20\x1f\x31\x5c\xc0\
\x2a\xb3\x05\xb3\x7f\x36\x5d\xe5\xe1\x22\x36\xd3\xd7\x29\xf2\x87\
\xe3\x3a\xbf\xac\x9f\x3b\xd6\x57\xd9\x54\xb5\x48\x00\x24\x13\x01\
\x13\x02\x13\x03\xc0\x2b\xc0\x2f\xc0\x2c\xc0\x30\xcc\xa9\xcc\xa8\
\xc0\x09\xc0\x13\xc0\x0a\xc0\x14\x00\x9c\x00\x9d\x00\x2f\x00\x35\
\x00\x0a\x01\x00\x00\x8b\x00\x00\x00\x17\x00\x15\x00\x00\x12\x77\
\x77\x77\x2e\x63\x6c\x6f\x75\x64\x66\x6c\x61\x72\x65\x2e\x63\x6f\
\x6d\x00\x17\x00\x00\xff\x01\x00\x01\x00\x00\x0a\x00\x04\x00\x02\
\x00\x1d\x00\x0b\x00\x02\x01\x00\x00\x23\x00\x00\x00\x0d\x00\x14\
\x00\x12\x04\x03\x08\x04\x04\x01\x05\x03\x08\x05\x05\x01\x08\x06\
\x06\x01\x02\x01\x00\x33\x00\x26\x00\x24\x00\x1d\x00\x20\x05\x4b\
\x0a\x0a\xb2\xe6\x39\xb1\x25\x40\x88\x8a\x18\x5b\x02\x88\x7e\x0c\
\x49\x5c\xfc\xc8\xd4\xcd\x9d\xab\x2c\x1d\x91\x23\xce\x42\x00\x2d\
\x00\x02\x01\x01\x00\x2b\x00\x09\x08\x03\x04\x03\x03\x03\x02\x03\x01";
static CH_P521: &'static [u8] = b"\
\x16\x03\x01\x02\x00\x01\x00\x01\xfc\x03\x03\x1c\x35\x05\x88\x16\
\x84\x48\xae\xc7\xaf\x40\xed\x64\xa4\x25\x73\xbb\xb9\xc0\x2c\x46\
\x02\x2d\xc8\xa7\x18\x27\xca\x6e\x7a\xe9\x52\x20\x8f\x88\x3d\x7f\
\xd0\xe5\x75\x4e\xa1\x94\x0b\x60\x26\xdf\xdd\xe1\x61\xff\x04\x67\
\xd5\x47\x88\x83\x1f\x49\x2b\xdc\x08\xc2\x10\x82\x00\x24\x13\x01\
\x13\x02\x13\x03\xc0\x2b\xc0\x2f\xc0\x2c\xc0\x30\xcc\xa9\xcc\xa8\
\xc0\x09\xc0\x13\xc0\x0a\xc0\x14\x00\x9c\x00\x9d\x00\x2f\x00\x35\
\x00\x0a\x01\x00\x01\x8f\x00\x00\x00\x17\x00\x15\x00\x00\x12\x77\
\x77\x77\x2e\x63\x6c\x6f\x75\x64\x66\x6c\x61\x72\x65\x2e\x63\x6f\
\x6d\x00\x17\x00\x00\xff\x01\x00\x01\x00\x00\x0a\x00\x04\x00\x02\
\x00\x19\x00\x0b\x00\x02\x01\x00\x00\x23\x00\x00\x00\x0d\x00\x14\
\x00\x12\x04\x03\x08\x04\x04\x01\x05\x03\x08\x05\x05\x01\x08\x06\
\x06\x01\x02\x01\x00\x33\x00\x8b\x00\x89\x00\x19\x00\x85\x04\x01\
\xf0\xe8\x81\xa5\x0b\x6d\x59\x6a\xaf\xfc\xe3\xf0\xfc\x09\x09\x12\
\x2b\x00\x73\xd0\x06\xc5\x4f\x7e\xa1\xb2\x1c\x95\xe4\x2f\x7e\x96\
\x45\x33\xf0\x1e\x40\x31\x9c\xe9\xbe\xc1\x21\x10\xd0\x90\xc8\xa5\
\x0c\x08\xd1\x82\x05\xd9\x03\xcf\xfe\x57\xdc\x5e\xac\x80\x73\x09\
\xf7\x01\xaf\xde\xff\xee\xd4\x49\x05\x5f\xa4\xae\xbb\x16\x40\x36\
\x43\x24\xa6\x2a\x79\xd6\x1e\xa4\xe5\xd1\xf9\x89\xf8\x04\x1a\xf1\
\x42\x7a\xc9\x21\x27\xbc\x04\x7f\x3c\x90\x88\xab\x0c\x2d\xf8\xc8\
\xb4\x3b\x93\x63\x44\xe8\x49\xc0\xec\x46\xa3\x17\x4c\xa0\x8f\x82\
\x9d\x24\x94\x00\x2d\x00\x02\x01\x01\x00\x2b\x00\x09\x08\x03\x04\
\x03\x03\x03\x02\x03\x01\x00\x15\x00\x9b\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00";
static CH_SIKE: &'static [u8] = b"\
\x16\x03\x01\x02\x46\x01\x00\x02\x42\x03\x03\xf6\x5d\xac\x6f\x1d\
\x7c\x4e\x8d\x33\x29\xc2\xc9\xf7\xde\x80\xe1\xd6\x75\xda\x34\x1f\
\x48\xbe\xec\x81\xed\x61\x99\x0b\x14\x0b\x7a\x20\xa6\xe1\x5c\xde\
\x61\xb5\x70\x01\x9a\x8c\x2e\xab\xb2\x52\x66\x53\xa7\x6b\xad\x5c\
\x6e\xc0\x0d\x1b\xba\x37\x4b\x3e\x2c\xbd\x83\x26\x00\x24\x13\x01\
\x13\x02\x13\x03\xc0\x2b\xc0\x2f\xc0\x2c\xc0\x30\xcc\xa9\xcc\xa8\
\xc0\x09\xc0\x13\xc0\x0a\xc0\x14\x00\x9c\x00\x9d\x00\x2f\x00\x35\
\x00\x0a\x01\x00\x01\xd5\x00\x00\x00\x17\x00\x15\x00\x00\x12\x77\
\x77\x77\x2e\x63\x6c\x6f\x75\x64\x66\x6c\x61\x72\x65\x2e\x63\x6f\
\x6d\x00\x17\x00\x00\xff\x01\x00\x01\x00\x00\x0a\x00\x04\x00\x02\
\xfe\x32\x00\x0b\x00\x02\x01\x00\x00\x23\x00\x00\x00\x0d\x00\x14\
\x00\x12\x04\x03\x08\x04\x04\x01\x05\x03\x08\x05\x05\x01\x08\x06\
\x06\x01\x02\x01\x00\x33\x01\x70\x01\x6e\xfe\x32\x01\x6a\x3d\x8e\
\x3e\x33\x88\xb4\x2e\xf9\x24\x6d\x42\x4a\xa1\x20\xc9\x8a\x94\xec\
\x68\xa0\x91\x83\xa9\x9b\xb3\x1f\x80\x17\x7f\xb2\xf0\x31\xc8\x04\
\x32\x67\x42\xc8\xda\x9a\x4d\x33\xbf\xb7\xa8\xb5\x1a\xea\x81\x7d\
\xfc\xc6\xad\x71\x10\x3e\xef\x8f\x70\xcd\x07\x30\x57\x1c\xe4\x2c\
\xec\xca\xbb\xbb\x57\x85\xcf\x83\x93\x1b\x57\x73\xdd\xc8\x84\x77\
\x42\xc3\x8b\x87\x00\xd9\x64\xeb\xa5\xfa\xcb\xbd\xa9\x94\x2e\xd8\
\x17\xf5\x77\x28\x8c\x77\xe5\x11\xbd\x51\x76\x52\x89\x50\x56\x7a\
\x3d\xbf\xfd\xa1\x22\xb0\xc7\xc4\xad\x89\x31\x27\x20\x7a\x45\x43\
\x6a\xf6\x3c\xff\x71\x11\xbd\x28\xf7\x78\x2f\x01\x36\x0e\x18\x72\
\xf3\x8a\x5f\x0e\x34\x6f\xa1\x8e\x33\xeb\x02\x25\x1e\xb8\x61\xb0\
\x10\xb0\xca\x03\x6b\x03\x3e\x71\x9a\xf9\x93\x83\x36\x29\x11\xdc\
\x89\xbd\xa3\xb1\x9b\xac\x3b\x39\x1c\xdc\xf3\x4e\xff\x9d\x86\xb6\
\xc8\x66\x00\x1b\x5e\x0f\x2b\xa2\x08\xde\x4c\xa6\x18\x03\x83\x89\
\x50\x7f\x60\x29\xfa\xac\xf1\x64\xfd\xbc\x0c\x6c\x3c\x48\x73\xd4\
\xc8\x24\xe4\x25\x9d\xb1\xd5\x14\xfa\x54\xc8\xea\xdc\xa1\xb0\x03\
\x4e\xad\x29\x29\xb7\xb6\x8d\xd2\xef\x00\x82\xb0\x3c\x2e\x01\x0b\
\xc3\x4e\x61\x04\xad\xd1\xbd\x4e\xac\x4a\xb5\x40\x46\x36\xfc\xf3\
\x48\xb1\x10\xfb\xcc\xd7\x3b\xa1\xc1\xca\x9e\xf2\xdd\x80\x7d\x8c\
\x12\xfc\x22\x05\x2d\xd8\x15\x8a\x33\x73\xc8\x92\xbd\xf0\x92\x51\
\x00\x5c\xa1\x7b\x4d\x95\x92\xd9\x52\x17\x7b\xbb\xaa\xa1\x02\xc7\
\x2c\x82\x51\x9a\xf0\xb3\xb0\xb7\x28\x78\x85\xf4\x0d\xee\xa4\x1b\
\x67\x72\x25\xf3\x77\xcf\x55\x11\x10\x3b\xa7\xad\xed\x32\x10\x41\
\xdd\x43\x85\xfd\x00\x68\x10\x01\x00\x2d\x00\x02\x01\x01\x00\x2b\
\x00\x09\x08\x03\x04\x03\x03\x03\x02\x03\x01";
static CH_NTRU: &'static [u8] = b"\
\x16\x03\x01\x05\x6e\x01\x00\x05\x6a\x03\x03\xea\xc2\x1e\xc1\x29\
\x8a\xee\x5b\x02\xf1\x7d\x1c\xf3\x54\x02\x8c\x87\x40\x56\x16\xad\
\xa9\x11\xf2\x48\x8a\xde\x33\x82\x42\x02\x04\x20\xd3\x7f\x7a\x35\
\xd3\x8f\xa1\x55\xe2\x49\x78\xca\xc0\xff\x48\xfc\x34\x72\x06\x85\
\xd9\x71\xaf\xb8\xfc\xdf\xef\x2f\x24\xf2\xf2\x51\x00\x24\x13\x01\
\x13\x02\x13\x03\xc0\x2b\xc0\x2f\xc0\x2c\xc0\x30\xcc\xa9\xcc\xa8\
\xc0\x09\xc0\x13\xc0\x0a\xc0\x14\x00\x9c\x00\x9d\x00\x2f\x00\x35\
\x00\x0a\x01\x00\x04\xfd\x00\x00\x00\x17\x00\x15\x00\x00\x12\x77\
\x77\x77\x2e\x63\x6c\x6f\x75\x64\x66\x6c\x61\x72\x65\x2e\x63\x6f\
\x6d\x00\x17\x00\x00\xff\x01\x00\x01\x00\x00\x0a\x00\x04\x00\x02\
\x41\x38\x00\x0b\x00\x02\x01\x00\x00\x23\x00\x00\x00\x0d\x00\x14\
\x00\x12\x04\x03\x08\x04\x04\x01\x05\x03\x08\x05\x05\x01\x08\x06\
\x06\x01\x02\x01\x00\x33\x04\x98\x04\x96\x41\x38\x04\x92\xef\x1c\
\x6b\x86\x5c\x41\xd0\x92\x5c\xcd\x8e\x44\xea\xbb\x5e\xb8\x7d\xd1\
\x96\x41\xeb\xd8\x59\xa1\xf0\xd0\x09\x6d\x50\xca\x69\x7c\xa0\x29\
\x5a\xb6\x07\xd6\xb9\x89\x0d\x4c\x29\xc5\x5e\xb8\xf9\x08\x34\xce\
\xde\xa3\xe0\x04\xee\xfc\x92\x06\x97\xc8\x5f\x48\x27\xd6\xe5\x36\
\xed\x48\x2d\x35\x84\xc2\x87\xc7\x5a\xc6\xbe\xdd\xc2\x52\x12\x23\
\xee\xa5\x0d\x95\xed\xaa\xee\xa6\x83\x4d\x61\xe9\xae\x6a\xb1\x49\
\x95\x5e\x0c\x55\xa1\x53\x48\xe5\x63\x3f\x7c\x85\xb6\xad\xd7\xc6\
\x23\xba\x67\xea\xf4\x0d\x5d\x08\x41\xf9\x46\xab\x86\x6d\x9c\xa3\
\x34\x1d\x77\x80\x3a\xe3\xab\x62\x24\xcb\x9a\xd9\xca\x2e\xb6\xa6\
\x24\x7d\xb5\x6b\x8c\xd5\x46\x03\x52\x36\xa0\x35\xdd\xc4\x52\xa1\
\x74\x1e\x82\xb1\xe0\xc4\x41\xf1\x0b\xa6\xd5\x51\xd1\xd0\x11\xe4\
\x76\x2c\x32\x49\xc6\xc7\x1c\xca\xb2\x4a\xd5\x76\x33\xbf\x52\x8f\
\xd1\x04\x07\xba\x4b\x91\x30\xd8\x35\x01\x62\xdb\x8f\x9f\x48\xd0\
\xf3\x2c\x86\x05\x0e\xaf\x32\xe8\x91\x7b\xa8\x8d\xd2\xf3\x1e\x61\
\x6d\xa3\x3a\x44\x23\x64\xf2\x6e\x53\x90\x33\xd7\x75\x71\x34\x27\
\xfd\x77\x7c\x11\xcc\x21\x19\x96\x2d\x65\xa5\xff\xdc\x9b\x3b\x05\
\xec\xc2\xe2\x3c\xf0\xad\xa7\xd7\x69\xcf\x83\xa7\xb9\xd9\x61\x99\
\xcc\x50\xee\x8d\x76\xac\xf6\x3d\x60\x39\xda\xbc\x96\x1a\xb5\x77\
\xe6\x59\xa4\x72\x54\xee\xc8\x93\x69\x40\x24\xc5\xc2\xdb\x49\x23\
\xf8\xce\xdf\x7e\x59\x80\x4d\x1d\xf9\x06\xf9\x8f\xf1\xd8\xf7\xd3\
\x56\xc2\xfd\x0c\x1c\xe0\x33\x63\xed\x47\xa7\xce\xb6\x2a\x85\x1b\
\x86\x69\xb9\x46\x37\x36\xac\xa5\x10\xe3\x0c\x77\xac\x0b\x17\x39\
\x88\xc3\x71\xac\xdb\x88\x04\x77\x7a\x49\xaf\x9a\xd2\xe6\x27\x51\
\x99\x41\xd9\xea\x9b\x23\x38\xd8\x96\x83\xaa\x0e\x3a\x7c\xe8\x3d\
\x50\x0d\xce\x40\xf2\x77\x1c\x2c\x1f\x20\x4f\x83\x7f\xfa\xc9\xf9\
\xf3\x17\x8d\xba\x92\xee\x18\xa6\xc1\x9f\x1a\x7b\x5d\xd2\xe3\x4f\
\xab\x49\xb3\xf1\x91\xc4\xd6\x7f\x32\xda\xad\x24\x41\x58\xef\xc5\
\xc6\xcc\x58\x6a\x69\x21\x0b\x6f\xa2\x02\xcc\x91\xe2\x2f\x68\x41\
\x43\x9b\x38\x1b\xfa\x03\x1b\x40\x5a\xdc\xfa\x25\xda\x21\x11\x4b\
\x40\x9f\x79\x13\xce\x77\x8d\xbb\x37\x04\xc3\x49\x0f\xf7\xd8\x70\
\xf4\x4e\xa3\xe1\x1b\x00\x09\x3a\x09\xb9\xed\x02\xbc\x06\xb7\x54\
\x75\x2a\x67\x97\xaf\x13\x0d\xd9\x3c\xa9\xff\x48\x66\x3a\xa8\x5b\
\x20\x23\xc7\xf9\x45\x16\x5f\x6c\xa1\x19\xc2\x54\xff\xd9\x5e\xbe\
\xcd\x73\xc1\x41\x09\xf7\xef\xc9\x26\x4b\x9d\xeb\x0c\x16\x06\x92\
\x66\x9d\x8e\xa0\x54\xe8\xe5\x9f\x6c\xfd\x79\x3a\xdd\xc8\x4c\xb8\
\xab\xfa\x42\xfd\x44\x50\xa1\x38\x9f\x6d\xef\x80\xf4\xd3\xe4\x06\
\x5c\xf7\x2e\x01\x75\xd8\x0c\xb9\x01\x7a\xf0\x71\x91\x5d\x1e\x6d\
\x03\x19\x2d\x59\x4d\x8a\x48\x3d\x9c\x4d\x93\xc4\xa3\x9a\xd1\xf5\
\x98\xf6\xf7\x2b\xf1\x9b\xbc\x06\x05\x04\xb6\x4b\x97\x55\x7d\x09\
\x4a\xf6\x69\xf6\x46\x76\xdf\x68\xd6\xd1\x82\xa5\xa6\xc1\x8b\xb9\
\x80\x55\xca\x7b\x6a\x58\x67\x73\x26\xbb\x77\x2c\xa5\xe1\xe2\xc6\
\x5f\x99\x39\x53\xbc\x66\x4f\x2e\xcf\xa8\xe5\x49\xea\xa1\x5b\xaf\
\xf4\x63\x8f\x7e\x72\xa8\x9c\x5b\x45\xba\xd5\x54\x62\xc8\xf6\xb5\
\xe2\x28\x8b\xd7\x96\xf6\xf7\xcd\xfb\x3b\x75\xd6\x73\x7d\x40\xf5\
\xfd\x3a\x5e\x82\xb5\x3f\xcc\x2f\xd6\x04\xf2\xce\x33\x6c\xe4\xb3\
\x56\x0c\x94\x5a\x59\x0a\xf8\xb8\x92\xd1\xaa\x92\x59\xa6\x91\xd5\
\xf5\x5b\x9f\x6b\x25\x02\x18\xa0\x03\x96\x90\x82\x73\x54\x2e\x83\
\xd7\x69\xb4\x73\x81\x69\x82\xca\x40\x50\x16\x46\x7e\x48\x18\xd1\
\x94\x66\xd8\xd1\x44\x4b\x48\x7d\xd7\x1b\xc2\x75\x9e\x29\x03\xa5\
\xef\x79\x5f\xd7\x05\x76\x28\xc8\x02\x3b\x36\x9d\xcb\x5e\x8b\x73\
\x69\x86\xa3\x70\x71\x2b\x3e\xe6\xba\x8e\x50\x64\x85\xb1\x3d\x34\
\xfd\x5f\x33\x95\xe0\xf0\xd5\xfd\x4a\xab\x96\xb4\xbe\xda\x9d\xc3\
\xf4\xf1\xd8\x57\xdc\x12\xe4\x2e\xa6\x64\x20\xa1\x78\xfd\xf5\x10\
\xba\x78\x18\x44\xa4\x8d\x47\x29\xdd\x12\x8e\x7d\x27\x3c\x3d\xc8\
\xe5\x7f\xa7\xaf\xa1\xdc\xa5\x1c\x1d\x84\x4d\x8f\x17\xdd\x15\x84\
\x52\xd9\x9a\x72\x5e\x1a\x68\xfd\xbc\xff\xe2\xd2\xbb\xdc\xc0\x19\
\x33\x96\xf7\x4e\x3b\xad\x3b\xde\xf2\x44\x9e\xf7\x77\x2a\x5b\x0e\
\xb9\xcd\x87\x6e\xc5\x63\x70\xc4\x3d\x0a\x12\x0d\x2a\x63\xca\x6f\
\xbb\x90\x04\x2f\x9c\xf8\x3a\xfd\x04\x20\x78\x58\x1b\x69\x72\x40\
\xfe\x75\xc2\x36\x30\x4f\x36\x6f\x07\x4d\xbb\xca\x8c\xf4\x8c\xd5\
\x1f\x4a\x03\x23\xc3\xcc\x32\xa6\xd8\xb0\xe9\x67\x0f\xda\x47\xa0\
\xa1\x03\xe3\x7a\xc1\xac\x5c\xc7\x3d\x8f\xff\x67\x30\x05\x97\xfb\
\x81\x7a\xc2\xd8\x52\x60\xd0\xdc\x3f\xa8\x97\x73\x55\x70\x81\x58\
\x5d\x17\x57\x13\xeb\xa4\x3d\x94\x93\x1e\x20\x06\x98\x7a\xbe\xd2\
\x79\xb4\x1a\xe8\x80\x73\x01\xa7\xee\xc7\x4f\xfd\x2c\xe5\xef\xc9\
\x76\x13\x3c\xe4\x0a\x9a\x1a\x54\xbb\xf2\xba\xf8\x37\xa5\x28\x0d\
\x73\x30\x4c\x66\x1c\xff\x36\x67\xa8\xd3\x04\x4f\x6e\x2a\x17\x22\
\xed\x77\x75\x3e\xb3\xf3\x63\x1b\x89\xd7\xfe\xd6\x97\x5b\x68\x59\
\x92\x79\x2d\xa0\x17\x9d\x37\x48\xb8\xad\xbf\x47\x2c\xa3\x6b\x00\
\x27\x09\xb4\x53\xe2\xeb\x54\x9e\xe6\x10\xd2\x2c\x6b\xd8\xf1\x61\
\x35\xb0\x26\xbe\xfb\xff\x55\xa9\xaf\xf2\xb6\xe1\xf6\x6a\x4f\xb7\
\x9f\xa7\xb7\xee\xea\x54\xd4\xcd\xdc\xb5\xfb\xc6\x67\xe2\xcf\x44\
\xe0\x25\x7a\xa2\x1c\xf4\x33\xed\x01\x8b\x96\x6b\xad\x41\xd8\x01\
\x00\x2d\x00\x02\x01\x01\x00\x2b\x00\x09\x08\x03\x04\x03\x03\x03\
\x02\x03\x01";
fn sleep(millis: u64, cmt: &'static str) {
println!("[START] {}", cmt);
sleep_no_comment(millis);
println!("[DONE] {}", cmt);
}
fn sleep_no_comment(millis: u64) {
let ten_millis = time::Duration::from_millis(millis);
let _now = time::Instant::now();
thread::sleep(ten_millis);
}
fn main() -> std::io::Result<()> {
// Condition variables to control threads
let (flag_t1, control_t1) = make_pair();
let (flag_t2, control_t2) = make_pair();
ctrlc::set_handler(move || {
println!("Stopping...");
control_t1.stop();
control_t2.stop();
}).expect("Error setting Ctrl-C handler");
// Parse arguments
let _args: Vec<String> = env::args().collect();
// Argument 1 - <host>:<port>
let addr_iter = _args[1].to_socket_addrs().unwrap();
// Argument 2 - timeout tcp TO. Fallback to 1 sec
let dur_sec: u64 = _args[2].parse().unwrap_or(1);
let dur = Duration::new(dur_sec, 0);
// Argument 3 - which client hello to send
let ch_case: usize = _args[3].parse().unwrap();
// Argument 4 - Sends per second
let msg_per_sec: usize = _args[4].parse().unwrap();
// Argument 5 - Number of connections to keep open
let con_num: usize = _args[5].parse().unwrap();
// create FIFO
println!("We will keep {} connections open", con_num);
let (tx, rx) = sync_channel(con_num);
// Start a thread which sends CH
let _t1 = thread::spawn(move || {
let mut sent = 0;
while flag_t1.is_alive() {
// wait until connections are produced
while rx.try_iter().next().is_none() {
sleep(100, "Waiting for connections");
}
// receive next connection and send CH
let mut s: TcpStream = rx.recv().unwrap();
match ch_case {
1 => s.write(&CH_NTRU).unwrap(),
2 => s.write(&CH_SIKE).unwrap(),
3 => s.write(&CH_X25519).unwrap(),
4 => s.write(&CH_P521).unwrap(),
_ => panic!("Unknown case"),
};
s.shutdown(Shutdown::Both).expect("shutdown call failed");
sleep_no_comment(1000/msg_per_sec as u64);
sent += 1;
if sent % 100 == 0 {
println!("nb of queries sent: {}", sent);
}
}
});
// Start a thread which produces connections
let _t2 = thread::spawn(move || {
// First thread owns tx
while flag_t2.is_alive() {
let addr_ref = &addr_iter.as_slice()[0];
let sock = TcpStream::connect_timeout(addr_ref, dur);
if sock.is_err() {
sleep(1000, "Can't connect, waiting...");
continue;
}
let s = sock.unwrap();
s.set_nonblocking(true).expect("set_nonblocking call failed");
match tx.try_send(s) {
Err(_) => sleep(1000, "Can't put in the queue"),
Ok(_) => continue,
}
}
});
// wait for TX thread to finish
_t1.join().unwrap();
_t2.join().unwrap();
Ok(())
}