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

Commit 470b8c8

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 48b8bc1 commit 470b8c8

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
@@ -507,6 +507,11 @@ typedef int (*SSL_verify_cb)(int preverify_ok, X509_STORE_CTX *x509_ctx);
507507
*/
508508
# define SSL_MODE_DTLS_SCTP_LABEL_LENGTH_BUG 0x00000400U
509509

510+
/*
511+
* Support QUIC Hack
512+
*/
513+
# define SSL_MODE_QUIC_HACK 0x00000800U
514+
510515
/* Cert related flags */
511516
/*
512517
* Many implementations ignore some aspects of the TLS standards such as
@@ -634,6 +639,20 @@ void SSL_set_msg_callback(SSL *ssl,
634639
# define SSL_CTX_set_msg_callback_arg(ctx, arg) SSL_CTX_ctrl((ctx), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg))
635640
# define SSL_set_msg_callback_arg(ssl, arg) SSL_ctrl((ssl), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg))
636641

642+
typedef enum {
643+
SSL_KEY_CLIENT_EARLY_TRAFFIC,
644+
SSL_KEY_CLIENT_HANDSHAKE_TRAFFIC,
645+
SSL_KEY_CLIENT_APPLICATION_TRAFFIC,
646+
SSL_KEY_SERVER_HANDSHAKE_TRAFFIC,
647+
SSL_KEY_SERVER_APPLICATION_TRAFFIC
648+
} OSSL_KEY_TYPE;
649+
650+
void SSL_set_key_callback(SSL *ssl,
651+
int (*cb)(SSL *ssl, int name,
652+
const unsigned char *secret,
653+
size_t secretlen, void *arg),
654+
void *arg);
655+
637656
# define SSL_get_extms_support(s) \
638657
SSL_ctrl((s),SSL_CTRL_GET_EXTMS_SUPPORT,0,NULL)
639658

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
@@ -4319,6 +4319,16 @@ void SSL_set_msg_callback(SSL *ssl,
43194319
SSL_callback_ctrl(ssl, SSL_CTRL_SET_MSG_CALLBACK, (void (*)(void))cb);
43204320
}
43214321

4322+
void SSL_set_key_callback(SSL *ssl,
4323+
int (*cb)(SSL *ssl, int name,
4324+
const unsigned char *secret,
4325+
size_t secretlen, void *arg),
4326+
void *arg)
4327+
{
4328+
ssl->key_callback = cb;
4329+
ssl->key_callback_arg = arg;
4330+
}
4331+
43224332
void SSL_CTX_set_not_resumable_session_callback(SSL_CTX *ctx,
43234333
int (*cb) (SSL *ssl,
43244334
int

deps/openssl/openssl/ssl/ssl_locl.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1132,6 +1132,9 @@ struct ssl_st {
11321132
void (*msg_callback) (int write_p, int version, int content_type,
11331133
const void *buf, size_t len, SSL *ssl, void *arg);
11341134
void *msg_callback_arg;
1135+
int (*key_callback)(SSL *ssl, int name, const unsigned char *secret,
1136+
size_t secretlen, void *arg);
1137+
void *key_callback_arg;
11351138
int hit; /* reusing a previous session */
11361139
X509_VERIFY_PARAM *param;
11371140
/* 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
@@ -640,6 +640,56 @@ int tls13_change_cipher_state(SSL *s, int which)
640640
goto err;
641641
}
642642

643+
if (s->key_callback) {
644+
int type;
645+
if (label == client_early_traffic) {
646+
type = SSL_KEY_CLIENT_EARLY_TRAFFIC;
647+
} else if (label == client_handshake_traffic) {
648+
type = SSL_KEY_CLIENT_HANDSHAKE_TRAFFIC;
649+
} else if (label == client_application_traffic) {
650+
type = SSL_KEY_CLIENT_APPLICATION_TRAFFIC;
651+
} else if (label == server_handshake_traffic) {
652+
type = SSL_KEY_SERVER_HANDSHAKE_TRAFFIC;
653+
} else if (label == server_application_traffic) {
654+
type = SSL_KEY_SERVER_APPLICATION_TRAFFIC;
655+
} else {
656+
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS13_CHANGE_CIPHER_STATE,
657+
ERR_R_INTERNAL_ERROR);
658+
goto err;
659+
}
660+
if (!s->key_callback(s, type, secret, hashlen, s->key_callback_arg)) {
661+
SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS13_CHANGE_CIPHER_STATE,
662+
ERR_R_INTERNAL_ERROR);
663+
goto err;
664+
}
665+
666+
if (s->server) {
667+
switch (type) {
668+
case SSL_KEY_CLIENT_HANDSHAKE_TRAFFIC:
669+
case SSL_KEY_CLIENT_APPLICATION_TRAFFIC:
670+
if (s->rlayer.rbuf.left) {
671+
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
672+
SSL_F_TLS13_CHANGE_CIPHER_STATE,
673+
ERR_R_INTERNAL_ERROR);
674+
goto err;
675+
}
676+
break;
677+
}
678+
} else {
679+
switch (type) {
680+
case SSL_KEY_SERVER_HANDSHAKE_TRAFFIC:
681+
case SSL_KEY_SERVER_APPLICATION_TRAFFIC:
682+
if (s->rlayer.rbuf.left) {
683+
SSLfatal(s, SSL_AD_INTERNAL_ERROR,
684+
SSL_F_TLS13_CHANGE_CIPHER_STATE,
685+
ERR_R_INTERNAL_ERROR);
686+
goto err;
687+
}
688+
break;
689+
}
690+
}
691+
}
692+
643693
if (label == server_application_traffic) {
644694
memcpy(s->server_app_traffic_secret, secret, hashlen);
645695
/* 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)