/* * Send the initial client hello. */ static int send_client_hello(SSL *ssl) { uint8_t *buf = ssl->bm_data; #if defined(CONFIG_PLATFORM_ESP8266) time_t tm = rand(); #else time_t tm = time(NULL); #endif uint8_t *tm_ptr = &buf[6]; /* time will go here */ int i, offset; buf[0] = HS_CLIENT_HELLO; buf[1] = 0; buf[2] = 0; /* byte 3 is calculated later */ buf[4] = 0x03; buf[5] = ssl->version & 0x0f; /* client random value - spec says that 1st 4 bytes are big endian time */ *tm_ptr++ = (uint8_t)(((long)tm & 0xff000000) >> 24); *tm_ptr++ = (uint8_t)(((long)tm & 0x00ff0000) >> 16); *tm_ptr++ = (uint8_t)(((long)tm & 0x0000ff00) >> 8); *tm_ptr++ = (uint8_t)(((long)tm & 0x000000ff)); get_random(SSL_RANDOM_SIZE-4, &buf[10]); memcpy(ssl->dc->client_random, &buf[6], SSL_RANDOM_SIZE); offset = 6 + SSL_RANDOM_SIZE; /* give session resumption a go */ if (IS_SET_SSL_FLAG(SSL_SESSION_RESUME)) /* set initially by user */ { buf[offset++] = ssl->sess_id_size; memcpy(&buf[offset], ssl->session_id, ssl->sess_id_size); offset += ssl->sess_id_size; CLR_SSL_FLAG(SSL_SESSION_RESUME); /* clear so we can set later */ } else { /* no session id - because no session resumption just yet */ buf[offset++] = 0; } buf[offset++] = 0; /* number of ciphers */ buf[offset++] = NUM_PROTOCOLS*2;/* number of ciphers */ /* put all our supported protocols in our request */ for (i = 0; i < NUM_PROTOCOLS; i++) { buf[offset++] = 0; /* cipher we are using */ buf[offset++] = ssl_prot_prefs[i]; } buf[offset++] = 1; /* no compression */ buf[offset++] = 0; buf[3] = offset - 4; /* handshake size */ return send_packet(ssl, PT_HANDSHAKE_PROTOCOL, NULL, offset); }
/* * Send the initial client hello. */ static int send_client_hello(SSL *ssl) { uint8_t *buf = ssl->bm_data; time_t tm = time(NULL); uint8_t *tm_ptr = &buf[6]; /* time will go here */ int i, offset; buf[0] = HS_CLIENT_HELLO; buf[1] = 0; buf[2] = 0; /* byte 3 is calculated later */ buf[4] = 0x03; buf[5] = ssl->version & 0x0f; /* client random value - spec says that 1st 4 bytes are big endian time */ *tm_ptr++ = (uint8_t)(((long)tm & 0xff000000) >> 24); *tm_ptr++ = (uint8_t)(((long)tm & 0x00ff0000) >> 16); *tm_ptr++ = (uint8_t)(((long)tm & 0x0000ff00) >> 8); *tm_ptr++ = (uint8_t)(((long)tm & 0x000000ff)); get_random(SSL_RANDOM_SIZE-4, &buf[10]); memcpy(ssl->dc->client_random, &buf[6], SSL_RANDOM_SIZE); offset = 6 + SSL_RANDOM_SIZE; /* give session resumption a go */ if (IS_SET_SSL_FLAG(SSL_SESSION_RESUME)) /* set initially by user */ { buf[offset++] = ssl->sess_id_size; memcpy(&buf[offset], ssl->session_id, ssl->sess_id_size); offset += ssl->sess_id_size; CLR_SSL_FLAG(SSL_SESSION_RESUME); /* clear so we can set later */ } else { /* no session id - because no session resumption just yet */ buf[offset++] = 0; } buf[offset++] = 0; /* number of ciphers */ buf[offset++] = NUM_PROTOCOLS*2;/* number of ciphers */ /* put all our supported protocols in our request */ for (i = 0; i < NUM_PROTOCOLS; i++) { buf[offset++] = 0; /* cipher we are using */ buf[offset++] = ssl_prot_prefs[i]; } buf[offset++] = 1; /* no compression */ buf[offset++] = 0; #ifdef CONFIG_SSL_SNI if (ssl->host_name[0] != 0) { const char * end = (const char *) memchr((char*) ssl->host_name, '\0', 255); unsigned int host_len = end == NULL ? 255 : end - (char*) ssl->host_name; buf[offset++] = 0; buf[offset++] = host_len+9; /* extensions length */ buf[offset++] = 0; buf[offset++] = 0; /* server_name(0) (65535) */ buf[offset++] = 0; buf[offset++] = host_len+5; /* server_name length */ buf[offset++] = 0; buf[offset++] = host_len+3; /* server_list length */ buf[offset++] = 0; /* host_name(0) (255) */ buf[offset++] = 0; buf[offset++] = host_len; /* host_name length */ strncpy((char*) &buf[offset], ssl->host_name, host_len); offset += host_len; } #endif buf[3] = offset - 4; /* handshake size */ return send_packet(ssl, PT_HANDSHAKE_PROTOCOL, NULL, offset); }