1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
|
#include "writeall.h"
#include "log.h"
#include "tls.h"
/* sendapp */
unsigned char *tls_engine_sendapp_buf(struct tls_context *ctx, size_t *len) {
if (ctx->flagdelayedenc) {
if (ctx->childclosed) return 0;
*len = sizeof ctx->tonetbuf - ctx->tonetbuflen;
if (!*len) return 0;
return ctx->tonetbuf + ctx->tonetbuflen;
}
return br_ssl_engine_sendapp_buf(&ctx->cc.eng, len);
}
void tls_engine_sendapp_ack(struct tls_context *ctx, size_t len) {
if (ctx->flagdelayedenc) {
ctx->tonetbuflen += len;
return;
}
br_ssl_engine_sendapp_ack(&ctx->cc.eng, len);
}
/* recvapp */
unsigned char *tls_engine_recvapp_buf(struct tls_context *ctx, size_t *len) {
if (ctx->flagdelayedenc) {
if (ctx->childclosed) return 0;
*len = ctx->tochildbuflen;
if (!*len) return 0;
return ctx->tochildbuf;
}
return br_ssl_engine_recvapp_buf(&ctx->cc.eng, len);
}
void tls_engine_recvapp_ack(struct tls_context *ctx, size_t len) {
if (ctx->flagdelayedenc) {
memmove(ctx->tochildbuf, ctx->tochildbuf + len,
ctx->tochildbuflen - len);
ctx->tochildbuflen -= len;
return;
}
br_ssl_engine_recvapp_ack(&ctx->cc.eng, len);
}
/* sendrec */
unsigned char *tls_engine_sendrec_buf(struct tls_context *ctx, size_t *len) {
if (ctx->flagdelayedenc) {
if (ctx->netclosed) return 0;
*len = ctx->tonetbuflen;
if (!*len) return 0;
return ctx->tonetbuf;
}
return br_ssl_engine_sendrec_buf(&ctx->cc.eng, len);
}
void tls_engine_sendrec_ack(struct tls_context *ctx, size_t len) {
if (ctx->flagdelayedenc) {
memmove(ctx->tonetbuf, ctx->tonetbuf + len, ctx->tonetbuflen - len);
ctx->tonetbuflen -= len;
return;
}
br_ssl_engine_sendrec_ack(&ctx->cc.eng, len);
}
/* recvrec */
unsigned char *tls_engine_recvrec_buf(struct tls_context *ctx, size_t *len) {
if (ctx->flagdelayedenc) {
if (ctx->netclosed) return 0;
*len = sizeof ctx->tochildbuf - ctx->tochildbuflen;
if (!*len) return 0;
return ctx->tochildbuf + ctx->tochildbuflen;
}
return br_ssl_engine_recvrec_buf(&ctx->cc.eng, len);
}
void tls_engine_recvrec_ack(struct tls_context *ctx, size_t len) {
if (ctx->flagdelayedenc) {
ctx->tochildbuflen += len;
return;
}
br_ssl_engine_recvrec_ack(&ctx->cc.eng, len);
}
/* sendapp5 */
unsigned char *tls_engine_sendapp5_buf(struct tls_context *ctx, size_t *len) {
if (ctx->flagdelayedenc) {
if (ctx->childclosed) return 0;
*len = sizeof ctx->tonet5buf - ctx->tonet5buflen;
if (!*len) return 0;
return ctx->tonet5buf + ctx->tonet5buflen;
}
return 0;
}
void tls_engine_sendapp5_ack(struct tls_context *ctx, size_t len) {
if (ctx->flagdelayedenc) {
ctx->tonet5buflen += len;
return;
}
return;
}
void tls_engine_flush(struct tls_context *ctx, int force) {
if (ctx->flagdelayedenc) return;
br_ssl_engine_flush(&ctx->cc.eng, force);
}
void tls_engine_close(struct tls_context *ctx) {
if (ctx->flagdelayedenc) {
ctx->childclosed = 1;
return;
}
br_ssl_engine_close(&ctx->cc.eng);
}
int tls_engine_handshakedone(struct tls_context *ctx) {
if (!ctx->flagdelayedenc && !ctx->flaghandshakedone) {
unsigned int st = tls_engine_current_state(ctx);
if (st & BR_SSL_SENDAPP) {
ctx->flaghandshakedone = 1;
return 1;
}
}
return 0;
}
unsigned int tls_engine_current_state(struct tls_context *ctx) {
unsigned int st = 0;
size_t len;
if (ctx->flagdelayedenc) {
if (ctx->childclosed && !tls_engine_sendrec_buf(ctx, &len)) {
st |= BR_SSL_CLOSED;
log_d1("TCP closed normally, child closed the connection");
}
if (ctx->netclosed && !tls_engine_recvapp_buf(ctx, &len)) {
st |= BR_SSL_CLOSED;
log_d1("TCP closed normally, remote closed the connection");
}
if (tls_engine_sendrec_buf(ctx, &len) != 0) st |= BR_SSL_SENDREC;
if (tls_engine_recvrec_buf(ctx, &len) != 0) st |= BR_SSL_RECVREC;
if (tls_engine_sendapp_buf(ctx, &len) != 0) st |= BR_SSL_SENDAPP;
if (tls_engine_recvapp_buf(ctx, &len) != 0) st |= BR_SSL_RECVAPP;
goto ret;
}
else {
st = br_ssl_engine_current_state(&ctx->cc.eng);
}
if (st & BR_SSL_CLOSED) {
int err;
err = br_ssl_engine_last_error(&ctx->cc.eng);
if (err == BR_ERR_OK) { log_d1("SSL closed normally"); }
else {
if (err >= BR_ERR_SEND_FATAL_ALERT) {
err -= BR_ERR_SEND_FATAL_ALERT;
if (ctx->flaghandshakedone) {
log_e2("SSL closed abnormally, sent alert: ",
tls_error_str(err));
}
else {
log_d2("SSL closed abnormally, sent alert: ",
tls_error_str(err));
}
}
else if (err >= BR_ERR_RECV_FATAL_ALERT) {
err -= BR_ERR_RECV_FATAL_ALERT;
if (ctx->flaghandshakedone) {
log_e2("SSL closed abnormally, received alert: ",
tls_error_str(err));
}
else {
log_d2("SSL closed abnormally, received alert: ",
tls_error_str(err));
}
}
else {
if (ctx->flaghandshakedone) {
log_e2("SSL closed abnormally: ", tls_error_str(err));
}
else {
log_d2("SSL closed abnormally: ", tls_error_str(err));
}
}
}
}
ret:
log_t2("br_ssl_engine_current_state(&ctx->cc.eng) = ", lognum(st));
return st;
}
|