1*0957b409SSimon J. Gerraty /* 2*0957b409SSimon J. Gerraty * Copyright (c) 2016 Thomas Pornin <pornin@bolet.org> 3*0957b409SSimon J. Gerraty * 4*0957b409SSimon J. Gerraty * Permission is hereby granted, free of charge, to any person obtaining 5*0957b409SSimon J. Gerraty * a copy of this software and associated documentation files (the 6*0957b409SSimon J. Gerraty * "Software"), to deal in the Software without restriction, including 7*0957b409SSimon J. Gerraty * without limitation the rights to use, copy, modify, merge, publish, 8*0957b409SSimon J. Gerraty * distribute, sublicense, and/or sell copies of the Software, and to 9*0957b409SSimon J. Gerraty * permit persons to whom the Software is furnished to do so, subject to 10*0957b409SSimon J. Gerraty * the following conditions: 11*0957b409SSimon J. Gerraty * 12*0957b409SSimon J. Gerraty * The above copyright notice and this permission notice shall be 13*0957b409SSimon J. Gerraty * included in all copies or substantial portions of the Software. 14*0957b409SSimon J. Gerraty * 15*0957b409SSimon J. Gerraty * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16*0957b409SSimon J. Gerraty * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17*0957b409SSimon J. Gerraty * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18*0957b409SSimon J. Gerraty * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 19*0957b409SSimon J. Gerraty * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 20*0957b409SSimon J. Gerraty * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 21*0957b409SSimon J. Gerraty * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22*0957b409SSimon J. Gerraty * SOFTWARE. 23*0957b409SSimon J. Gerraty */ 24*0957b409SSimon J. Gerraty 25*0957b409SSimon J. Gerraty #include "inner.h" 26*0957b409SSimon J. Gerraty 27*0957b409SSimon J. Gerraty /* see bearssl_ssl.h */ 28*0957b409SSimon J. Gerraty void 29*0957b409SSimon J. Gerraty br_ssl_client_zero(br_ssl_client_context *cc) 30*0957b409SSimon J. Gerraty { 31*0957b409SSimon J. Gerraty /* 32*0957b409SSimon J. Gerraty * For really standard C, we should explicitly set to NULL all 33*0957b409SSimon J. Gerraty * pointers, and 0 all other fields. However, on all our target 34*0957b409SSimon J. Gerraty * architectures, a direct memset() will work, be faster, and 35*0957b409SSimon J. Gerraty * use a lot less code. 36*0957b409SSimon J. Gerraty */ 37*0957b409SSimon J. Gerraty memset(cc, 0, sizeof *cc); 38*0957b409SSimon J. Gerraty } 39*0957b409SSimon J. Gerraty 40*0957b409SSimon J. Gerraty /* see bearssl_ssl.h */ 41*0957b409SSimon J. Gerraty int 42*0957b409SSimon J. Gerraty br_ssl_client_reset(br_ssl_client_context *cc, 43*0957b409SSimon J. Gerraty const char *server_name, int resume_session) 44*0957b409SSimon J. Gerraty { 45*0957b409SSimon J. Gerraty size_t n; 46*0957b409SSimon J. Gerraty 47*0957b409SSimon J. Gerraty br_ssl_engine_set_buffer(&cc->eng, NULL, 0, 0); 48*0957b409SSimon J. Gerraty cc->eng.version_out = cc->eng.version_min; 49*0957b409SSimon J. Gerraty if (!resume_session) { 50*0957b409SSimon J. Gerraty br_ssl_client_forget_session(cc); 51*0957b409SSimon J. Gerraty } 52*0957b409SSimon J. Gerraty if (!br_ssl_engine_init_rand(&cc->eng)) { 53*0957b409SSimon J. Gerraty return 0; 54*0957b409SSimon J. Gerraty } 55*0957b409SSimon J. Gerraty 56*0957b409SSimon J. Gerraty /* 57*0957b409SSimon J. Gerraty * We always set back the "reneg" flag to 0 because we use it 58*0957b409SSimon J. Gerraty * to distinguish between first handshake and renegotiation. 59*0957b409SSimon J. Gerraty * Note that "renegotiation" and "session resumption" are two 60*0957b409SSimon J. Gerraty * different things. 61*0957b409SSimon J. Gerraty */ 62*0957b409SSimon J. Gerraty cc->eng.reneg = 0; 63*0957b409SSimon J. Gerraty 64*0957b409SSimon J. Gerraty if (server_name == NULL) { 65*0957b409SSimon J. Gerraty cc->eng.server_name[0] = 0; 66*0957b409SSimon J. Gerraty } else { 67*0957b409SSimon J. Gerraty n = strlen(server_name) + 1; 68*0957b409SSimon J. Gerraty if (n > sizeof cc->eng.server_name) { 69*0957b409SSimon J. Gerraty br_ssl_engine_fail(&cc->eng, BR_ERR_BAD_PARAM); 70*0957b409SSimon J. Gerraty return 0; 71*0957b409SSimon J. Gerraty } 72*0957b409SSimon J. Gerraty memcpy(cc->eng.server_name, server_name, n); 73*0957b409SSimon J. Gerraty } 74*0957b409SSimon J. Gerraty 75*0957b409SSimon J. Gerraty br_ssl_engine_hs_reset(&cc->eng, 76*0957b409SSimon J. Gerraty br_ssl_hs_client_init_main, br_ssl_hs_client_run); 77*0957b409SSimon J. Gerraty return br_ssl_engine_last_error(&cc->eng) == BR_ERR_OK; 78*0957b409SSimon J. Gerraty } 79