Skip to content
This repository was archived by the owner on Aug 11, 2020. It is now read-only.

Commit 6412a2c

Browse files
committed
deps: Add interface required to implement QUIC draft-17
Ported from tatsuhiro-t/openssl@920a331 PR-URL: #6 Reviewed-By: Daniel Bevenius <[email protected]>
1 parent e61a2e7 commit 6412a2c

File tree

7 files changed

+229
-3
lines changed

7 files changed

+229
-3
lines changed

deps/openssl/openssl/include/openssl/ssl.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,11 @@ typedef int (*SSL_verify_cb)(int preverify_ok, X509_STORE_CTX *x509_ctx);
494494
*/
495495
# define SSL_MODE_ASYNC 0x00000100U
496496

497+
/*
498+
* Support QUIC Hack
499+
*/
500+
# define SSL_MODE_QUIC_HACK 0x00000800U
501+
497502
/* Cert related flags */
498503
/*
499504
* Many implementations ignore some aspects of the TLS standards such as
@@ -621,6 +626,20 @@ void SSL_set_msg_callback(SSL *ssl,
621626
# define SSL_CTX_set_msg_callback_arg(ctx, arg) SSL_CTX_ctrl((ctx), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg))
622627
# define SSL_set_msg_callback_arg(ssl, arg) SSL_ctrl((ssl), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg))
623628

629+
typedef enum {
630+
SSL_KEY_CLIENT_EARLY_TRAFFIC,
631+
SSL_KEY_CLIENT_HANDSHAKE_TRAFFIC,
632+
SSL_KEY_CLIENT_APPLICATION_TRAFFIC,
633+
SSL_KEY_SERVER_HANDSHAKE_TRAFFIC,
634+
SSL_KEY_SERVER_APPLICATION_TRAFFIC
635+
} OSSL_KEY_TYPE;
636+
637+
void SSL_set_key_callback(SSL *ssl,
638+
int (*cb)(SSL *ssl, int name,
639+
const unsigned char *secret,
640+
size_t secretlen, void *arg),
641+
void *arg);
642+
624643
# define SSL_get_extms_support(s) \
625644
SSL_ctrl((s),SSL_CTRL_GET_EXTMS_SUPPORT,0,NULL)
626645

deps/openssl/openssl/ssl/record/rec_layer_s3.c

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <stdio.h>
1111
#include <limits.h>
1212
#include <errno.h>
13+
#include <assert.h>
1314
#include "../ssl_locl.h"
1415
#include <openssl/evp.h>
1516
#include <openssl/buffer.h>
@@ -347,6 +348,22 @@ int ssl3_write_bytes(SSL *s, int type, const void *buf_, size_t len,
347348
int i;
348349
size_t tmpwrit;
349350

351+
if (s->mode & SSL_MODE_QUIC_HACK) {
352+
/* If we have an alert to send, lets send it */
353+
if (s->s3->alert_dispatch) {
354+
i = s->method->ssl_dispatch_alert(s);
355+
if (i <= 0) {
356+
/* SSLfatal() already called if appropriate */
357+
return i;
358+
}
359+
}
360+
361+
s->rwstate = SSL_WRITING;
362+
*written = len;
363+
364+
return 1;
365+
}
366+
350367
s->rwstate = SSL_NOTHING;
351368
tot = s->rlayer.wnum;
352369
/*
@@ -659,6 +676,10 @@ int do_ssl3_write(SSL *s, int type, const unsigned char *buf,
659676
size_t totlen = 0, len, wpinited = 0;
660677
size_t j;
661678

679+
if (s->mode & SSL_MODE_QUIC_HACK) {
680+
assert(0);
681+
}
682+
662683
for (j = 0; j < numpipes; j++)
663684
totlen += pipelens[j];
664685
/*
@@ -1123,6 +1144,10 @@ int ssl3_write_pending(SSL *s, int type, const unsigned char *buf, size_t len,
11231144
size_t currbuf = 0;
11241145
size_t tmpwrit = 0;
11251146

1147+
if (s->mode & SSL_MODE_QUIC_HACK) {
1148+
assert(0);
1149+
}
1150+
11261151
if ((s->rlayer.wpend_tot > len)
11271152
|| (!(s->mode & SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER)
11281153
&& (s->rlayer.wpend_buf != buf))
@@ -1226,6 +1251,117 @@ int ssl3_read_bytes(SSL *s, int type, int *recvd_type, unsigned char *buf,
12261251
}
12271252
}
12281253

1254+
if (s->mode & SSL_MODE_QUIC_HACK) {
1255+
/* In QUIC, we only expect handshake protocol. Alerts are
1256+
notified by decicated API function. */
1257+
if (!ossl_statem_get_in_handshake(s)) {
1258+
/* We found handshake data, so we're going back into init */
1259+
ossl_statem_set_in_init(s, 1);
1260+
1261+
i = s->handshake_func(s);
1262+
/* SSLfatal() already called if appropriate */
1263+
if (i < 0)
1264+
return i;
1265+
if (i == 0) {
1266+
return -1;
1267+
}
1268+
*readbytes = 0;
1269+
return 1;
1270+
}
1271+
1272+
if (s->rlayer.packet_length == 0) {
1273+
if (rbuf->left < 4) {
1274+
if (rbuf->len - rbuf->offset < 4 - rbuf->left) {
1275+
memmove(rbuf->buf, rbuf->buf + rbuf->offset - rbuf->left,
1276+
rbuf->left);
1277+
rbuf->offset = rbuf->left;
1278+
}
1279+
s->rwstate = SSL_READING;
1280+
/* TODO(size_t): Convert this function */
1281+
ret = BIO_read(s->rbio, rbuf->buf + rbuf->offset,
1282+
rbuf->len - rbuf->offset);
1283+
if (ret < 0) {
1284+
return -1;
1285+
}
1286+
/* TODO Check this is really ok */
1287+
if (ret == 0) {
1288+
*readbytes = 0;
1289+
return 1;
1290+
}
1291+
1292+
rbuf->left += ret;
1293+
rbuf->offset += ret;
1294+
1295+
if (rbuf->left < 4) {
1296+
*readbytes = 0;
1297+
return 1;
1298+
}
1299+
rbuf->offset -= rbuf->left;
1300+
}
1301+
1302+
switch (rbuf->buf[rbuf->offset]) {
1303+
case SSL3_MT_CLIENT_HELLO:
1304+
case SSL3_MT_SERVER_HELLO:
1305+
case SSL3_MT_NEWSESSION_TICKET:
1306+
case SSL3_MT_END_OF_EARLY_DATA:
1307+
case SSL3_MT_ENCRYPTED_EXTENSIONS:
1308+
case SSL3_MT_CERTIFICATE:
1309+
case SSL3_MT_CERTIFICATE_REQUEST:
1310+
case SSL3_MT_CERTIFICATE_VERIFY:
1311+
case SSL3_MT_FINISHED:
1312+
case SSL3_MT_KEY_UPDATE:
1313+
case SSL3_MT_MESSAGE_HASH:
1314+
break;
1315+
default:
1316+
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL3_READ_BYTES,
1317+
ERR_R_INTERNAL_ERROR);
1318+
return -1;
1319+
}
1320+
1321+
s->rlayer.packet_length = (rbuf->buf[rbuf->offset + 1] << 16)
1322+
+ (rbuf->buf[rbuf->offset + 2] << 8)
1323+
+ rbuf->buf[rbuf->offset + 3] + 4;
1324+
}
1325+
1326+
if (s->rlayer.packet_length) {
1327+
size_t n;
1328+
1329+
n = len < s->rlayer.packet_length ? len : s->rlayer.packet_length;
1330+
if (rbuf->left == 0) {
1331+
s->rwstate = SSL_READING;
1332+
ret = BIO_read(s->rbio, buf, n);
1333+
if (ret >= 0) {
1334+
s->rlayer.packet_length -= ret;
1335+
*readbytes = ret;
1336+
if (recvd_type) {
1337+
*recvd_type = SSL3_RT_HANDSHAKE;
1338+
}
1339+
return 1;
1340+
}
1341+
return -1;
1342+
}
1343+
1344+
n = n < rbuf->left ? n : rbuf->left;
1345+
1346+
memcpy(buf, rbuf->buf + rbuf->offset, n);
1347+
rbuf->offset += n;
1348+
rbuf->left -= n;
1349+
s->rlayer.packet_length -= n;
1350+
if (rbuf->left == 0) {
1351+
rbuf->offset = 0;
1352+
}
1353+
*readbytes = n;
1354+
if (recvd_type) {
1355+
*recvd_type = SSL3_RT_HANDSHAKE;
1356+
}
1357+
return 1;
1358+
}
1359+
1360+
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_SSL3_READ_BYTES,
1361+
ERR_R_INTERNAL_ERROR);
1362+
return -1;
1363+
}
1364+
12291365
if ((type && (type != SSL3_RT_APPLICATION_DATA)
12301366
&& (type != SSL3_RT_HANDSHAKE)) || (peek
12311367
&& (type !=

deps/openssl/openssl/ssl/s3_msg.c

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,16 @@ int ssl3_dispatch_alert(SSL *s)
7474
size_t written;
7575

7676
s->s3->alert_dispatch = 0;
77-
alertlen = 2;
78-
i = do_ssl3_write(s, SSL3_RT_ALERT, &s->s3->send_alert[0], &alertlen, 1, 0,
79-
&written);
77+
78+
if (!(s->mode & SSL_MODE_QUIC_HACK)) {
79+
alertlen = 2;
80+
i = do_ssl3_write(s, SSL3_RT_ALERT, &s->s3->send_alert[0], &alertlen, 1,
81+
0, &written);
82+
} else {
83+
s->rwstate = SSL_WRITING;
84+
i = 1;
85+
}
86+
8087
if (i <= 0) {
8188
s->s3->alert_dispatch = 1;
8289
} else {

deps/openssl/openssl/ssl/ssl_lib.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4299,6 +4299,16 @@ void SSL_set_msg_callback(SSL *ssl,
42994299
SSL_callback_ctrl(ssl, SSL_CTRL_SET_MSG_CALLBACK, (void (*)(void))cb);
43004300
}
43014301

4302+
void SSL_set_key_callback(SSL *ssl,
4303+
int (*cb)(SSL *ssl, int name,
4304+
const unsigned char *secret,
4305+
size_t secretlen, void *arg),
4306+
void *arg)
4307+
{
4308+
ssl->key_callback = cb;
4309+
ssl->key_callback_arg = arg;
4310+
}
4311+
43024312
void SSL_CTX_set_not_resumable_session_callback(SSL_CTX *ctx,
43034313
int (*cb) (SSL *ssl,
43044314
int

deps/openssl/openssl/ssl/ssl_locl.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1133,6 +1133,9 @@ struct ssl_st {
11331133
void (*msg_callback) (int write_p, int version, int content_type,
11341134
const void *buf, size_t len, SSL *ssl, void *arg);
11351135
void *msg_callback_arg;
1136+
int (*key_callback)(SSL *ssl, int name, const unsigned char *secret,
1137+
size_t secretlen, void *arg);
1138+
void *key_callback_arg;
11361139
int hit; /* reusing a previous session */
11371140
X509_VERIFY_PARAM *param;
11381141
/* Per connection DANE state */

deps/openssl/openssl/ssl/tls13_enc.c

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -625,6 +625,56 @@ int tls13_change_cipher_state(SSL *s, int which)
625625
goto err;
626626
}
627627

628+
if (s->key_callback) {
629+
int type;
630+
if (label == client_early_traffic) {
631+
type = SSL_KEY_CLIENT_EARLY_TRAFFIC;
632+
} else if (label == client_handshake_traffic) {
633+
type = SSL_KEY_CLIENT_HANDSHAKE_TRAFFIC;
634+
} else if (label == client_application_traffic) {
635+
type = SSL_KEY_CLIENT_APPLICATION_TRAFFIC;
636+
} else if (label == server_handshake_traffic) {
637+
type = SSL_KEY_SERVER_HANDSHAKE_TRAFFIC;
638+
} else if (label == server_application_traffic) {
639+
type = SSL_KEY_SERVER_APPLICATION_TRAFFIC;
640+
} else {
641+
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS13_CHANGE_CIPHER_STATE,
642+
ERR_R_INTERNAL_ERROR);
643+
goto err;
644+
}
645+
if (!s->key_callback(s, type, secret, hashlen, s->key_callback_arg)) {
646+
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS13_CHANGE_CIPHER_STATE,
647+
ERR_R_INTERNAL_ERROR);
648+
goto err;
649+
}
650+
651+
if (s->server) {
652+
switch (type) {
653+
case SSL_KEY_CLIENT_HANDSHAKE_TRAFFIC:
654+
case SSL_KEY_CLIENT_APPLICATION_TRAFFIC:
655+
if (s->rlayer.rbuf.left) {
656+
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
657+
SSL_F_TLS13_CHANGE_CIPHER_STATE,
658+
ERR_R_INTERNAL_ERROR);
659+
goto err;
660+
}
661+
break;
662+
}
663+
} else {
664+
switch (type) {
665+
case SSL_KEY_SERVER_HANDSHAKE_TRAFFIC:
666+
case SSL_KEY_SERVER_APPLICATION_TRAFFIC:
667+
if (s->rlayer.rbuf.left) {
668+
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
669+
SSL_F_TLS13_CHANGE_CIPHER_STATE,
670+
ERR_R_INTERNAL_ERROR);
671+
goto err;
672+
}
673+
break;
674+
}
675+
}
676+
}
677+
628678
if (label == server_application_traffic) {
629679
memcpy(s->server_app_traffic_secret, secret, hashlen);
630680
/* Now we create the exporter master secret */

deps/openssl/openssl/util/libssl.num

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -498,3 +498,4 @@ SSL_CTX_get_recv_max_early_data 498 1_1_1 EXIST::FUNCTION:
498498
SSL_CTX_set_recv_max_early_data 499 1_1_1 EXIST::FUNCTION:
499499
SSL_CTX_set_post_handshake_auth 500 1_1_1 EXIST::FUNCTION:
500500
SSL_get_signature_type_nid 501 1_1_1a EXIST::FUNCTION:
501+
SSL_set_key_callback 502 3_0_0 EXIST::FUNCTION:

0 commit comments

Comments
 (0)