#ifndef OPENSSL_NO_SRP
SSL_SRP_CTX_free(s);
-#endif
-#ifndef OPENSSL_NO_TLSEXT
- if (s->s3->serverinfo_client_tlsext_custom_types != NULL)
- OPENSSL_free(s->s3->serverinfo_client_tlsext_custom_types);
#endif
OPENSSL_cleanse(s->s3,sizeof *s->s3);
OPENSSL_free(s->s3);
}
#endif
#ifndef OPENSSL_NO_TLSEXT
- if (s->s3->serverinfo_client_tlsext_custom_types != NULL)
- {
- OPENSSL_free(s->s3->serverinfo_client_tlsext_custom_types);
- s->s3->serverinfo_client_tlsext_custom_types = NULL;
- }
- s->s3->serverinfo_client_tlsext_custom_types_count = 0;
#ifndef OPENSSL_NO_EC
s->s3->is_probably_safari = 0;
#endif /* !OPENSSL_NO_EC */
char is_probably_safari;
#endif /* !OPENSSL_NO_EC */
- /* serverinfo_client_tlsext_custom_types contains an array of TLS Extension types which
- * were advertised by the client in its ClientHello and leveraged by ServerInfo TLS extension callbacks.
- * The array does not contain any duplicates, and is in the same order
- * as the types were received in the client hello. */
- unsigned short *serverinfo_client_tlsext_custom_types;
- size_t serverinfo_client_tlsext_custom_types_count; /* how many serverinfo_client_tlsext_custom_types */
-
/* ALPN information
* (we are in the process of transitioning from NPN to ALPN.) */
unsigned short inlen, int *al,
void *arg)
{
- size_t i = 0;
if (inlen != 0)
{
return 0;
}
- /* if already in list, error out */
- for (i = 0; i < s->s3->serverinfo_client_tlsext_custom_types_count; i++)
- {
- if (s->s3->serverinfo_client_tlsext_custom_types[i] == ext_type)
- {
- *al = SSL_AD_DECODE_ERROR;
- return 0;
- }
- }
- s->s3->serverinfo_client_tlsext_custom_types_count++;
- s->s3->serverinfo_client_tlsext_custom_types = OPENSSL_realloc(
- s->s3->serverinfo_client_tlsext_custom_types,
- s->s3->serverinfo_client_tlsext_custom_types_count * 2);
- if (s->s3->serverinfo_client_tlsext_custom_types == NULL)
- {
- s->s3->serverinfo_client_tlsext_custom_types_count = 0;
- *al = TLS1_AD_INTERNAL_ERROR;
- return 0;
- }
- s->s3->serverinfo_client_tlsext_custom_types[
- s->s3->serverinfo_client_tlsext_custom_types_count - 1] = ext_type;
-
return 1;
}
{
const unsigned char *serverinfo = NULL;
size_t serverinfo_length = 0;
- size_t i = 0;
- unsigned int match = 0;
- /* Did the client send a TLS extension for this type? */
- for (i = 0; i < s->s3->serverinfo_client_tlsext_custom_types_count; i++)
- {
- if (s->s3->serverinfo_client_tlsext_custom_types[i] == ext_type)
- {
- match = 1;
- break;
- }
- }
- if (!match)
- {
- /* extension not sent by client...don't send extension */
- return -1;
- }
/* Is there serverinfo data for the chosen server cert? */
if ((ssl_get_server_cert_serverinfo(s, &serverinfo,
s->s3->next_proto_neg_seen = 0;
#endif
- /* Clear observed custom extensions */
- s->s3->serverinfo_client_tlsext_custom_types_count = 0;
- if (s->s3->serverinfo_client_tlsext_custom_types != NULL)
- {
- OPENSSL_free(s->s3->serverinfo_client_tlsext_custom_types);
- s->s3->serverinfo_client_tlsext_custom_types = NULL;
- }
-
if (s->s3->alpn_selected)
{
OPENSSL_free(s->s3->alpn_selected);