diff --git a/ssl/statem/extensions.c b/ssl/statem/extensions.c
index 2d0a323..51f8965 100644
--- a/ssl/statem/extensions.c
+++ b/ssl/statem/extensions.c
@@ -10,59 +10,63 @@
 #include "../ssl_locl.h"
 #include "statem_locl.h"
 
-static int tls_ext_final_renegotiate(SSL *s, unsigned int context, int sent,
+static int final_renegotiate(SSL *s, unsigned int context, int sent,
                                      int *al);
-static int tls_ext_init_server_name(SSL *s, unsigned int context);
-static int tls_ext_final_server_name(SSL *s, unsigned int context, int sent,
+static int init_server_name(SSL *s, unsigned int context);
+static int final_server_name(SSL *s, unsigned int context, int sent,
                                      int *al);
 #ifndef OPENSSL_NO_EC
-static int tls_ext_final_ec_pt_formats(SSL *s, unsigned int context, int sent,
+static int final_ec_pt_formats(SSL *s, unsigned int context, int sent,
                                        int *al);
 #endif
-static int tls_ext_init_session_ticket(SSL *s, unsigned int context);
-static int tls_ext_init_status_request(SSL *s, unsigned int context);
-static int tls_ext_final_status_request(SSL *s, unsigned int context, int sent,
+static int init_session_ticket(SSL *s, unsigned int context);
+static int init_status_request(SSL *s, unsigned int context);
+static int final_status_request(SSL *s, unsigned int context, int sent,
                                         int *al);
 #ifndef OPENSSL_NO_NEXTPROTONEG
-static int tls_ext_init_npn(SSL *s, unsigned int context);
+static int init_npn(SSL *s, unsigned int context);
 #endif
-static int tls_ext_init_alpn(SSL *s, unsigned int context);
-static int tls_ext_final_alpn(SSL *s, unsigned int context, int sent, int *al);
-static int tls_ext_init_sig_algs(SSL *s, unsigned int context);
+static int init_alpn(SSL *s, unsigned int context);
+static int final_alpn(SSL *s, unsigned int context, int sent, int *al);
+static int init_sig_algs(SSL *s, unsigned int context);
 #ifndef OPENSSL_NO_SRP
-static int tls_ext_init_srp(SSL *s, unsigned int context);
+static int init_srp(SSL *s, unsigned int context);
 #endif
-static int tls_ext_init_etm(SSL *s, unsigned int context);
-static int tls_ext_init_ems(SSL *s, unsigned int context);
-static int tls_ext_final_ems(SSL *s, unsigned int context, int sent, int *al);
+static int init_etm(SSL *s, unsigned int context);
+static int init_ems(SSL *s, unsigned int context);
+static int final_ems(SSL *s, unsigned int context, int sent, int *al);
 #ifndef OPENSSL_NO_SRTP
-static int tls_ext_init_srtp(SSL *s, unsigned int context);
+static int init_srtp(SSL *s, unsigned int context);
 #endif
 
 /* Structure to define a built-in extension */
-typedef struct {
-    /* The ID for the extension */
+typedef struct extensions_definition_st {
+    /* The defined type for the extension */
     unsigned int type;
     /*
+     * The context that this extension applies to, e.g. what messages and
+     * protocol versions
+     */
+    unsigned int context;
+    /*
      * Initialise extension before parsing. Always called for relevant contexts
      * even if extension not present
      */
-    int (*init_ext)(SSL *s, unsigned int context);
-    /* Parse extension received by server from client */
-    int (*parse_client_ext)(SSL *s, PACKET *pkt, int *al);
-    /* Parse extension received by client from server */
-    int (*parse_server_ext)(SSL *s, PACKET *pkt, int *al);
-    /* Construct extension sent by server */
-    int (*construct_server_ext)(SSL *s, WPACKET *pkt, int *al);
-    /* Construct extension sent by client */
-    int (*construct_client_ext)(SSL *s, WPACKET *pkt, int *al);
+    int (*init)(SSL *s, unsigned int context);
+    /* Parse extension sent from client to server */
+    int (*parse_ctos)(SSL *s, PACKET *pkt, int *al);
+    /* Parse extension send from server to client */
+    int (*parse_stoc)(SSL *s, PACKET *pkt, int *al);
+    /* Construct extension sent from server to client */
+    int (*construct_stoc)(SSL *s, WPACKET *pkt, int *al);
+    /* Construct extension sent from client to server */
+    int (*construct_ctos)(SSL *s, WPACKET *pkt, int *al);
     /*
      * Finalise extension after parsing. Always called where an extensions was
      * initialised even if the extension was not present. |sent| is set to 1 if
      * the extension was seen, or 0 otherwise.
      */
-    int (*finalise_ext)(SSL *s, unsigned int context, int sent, int *al);
-    unsigned int context;
+    int (*final)(SSL *s, unsigned int context, int sent, int *al);
 } EXTENSION_DEFINITION;
 
 /*
@@ -91,103 +95,73 @@
 static const EXTENSION_DEFINITION ext_defs[] = {
     {
         TLSEXT_TYPE_renegotiate,
-        NULL,
-        tls_parse_client_renegotiate,
-        tls_parse_server_renegotiate,
-        tls_construct_server_renegotiate,
-        tls_construct_client_renegotiate,
-        tls_ext_final_renegotiate,
         EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO | EXT_SSL3_ALLOWED
-        | EXT_TLS1_2_AND_BELOW_ONLY
+        | EXT_TLS1_2_AND_BELOW_ONLY,
+        NULL, tls_parse_ctos_renegotiate, tls_parse_stoc_renegotiate,
+        tls_construct_stoc_renegotiate, tls_construct_ctos_renegotiate,
+        final_renegotiate
     },
     {
         TLSEXT_TYPE_server_name,
-        tls_ext_init_server_name,
-        tls_parse_client_server_name,
-        tls_parse_server_server_name,
-        tls_construct_server_server_name,
-        tls_construct_client_server_name,
-        tls_ext_final_server_name,
         EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO
-        | EXT_TLS1_3_ENCRYPTED_EXTENSIONS
+        | EXT_TLS1_3_ENCRYPTED_EXTENSIONS,
+        init_server_name,
+        tls_parse_ctos_server_name, tls_parse_stoc_server_name,
+        tls_construct_stoc_server_name, tls_construct_ctos_server_name,
+        final_server_name
     },
 #ifndef OPENSSL_NO_SRP
     {
         TLSEXT_TYPE_srp,
-        tls_ext_init_srp,
-        tls_parse_client_srp,
-        NULL,
-        NULL,
-        tls_construct_client_srp,
-        NULL,
-        EXT_CLIENT_HELLO | EXT_TLS1_2_AND_BELOW_ONLY
+        EXT_CLIENT_HELLO | EXT_TLS1_2_AND_BELOW_ONLY,
+        init_srp, tls_parse_ctos_srp, NULL, NULL, tls_construct_ctos_srp, NULL
     },
 #endif
 #ifndef OPENSSL_NO_EC
     {
         TLSEXT_TYPE_ec_point_formats,
-        NULL,
-        tls_parse_client_ec_pt_formats,
-        tls_parse_server_ec_pt_formats,
-        tls_construct_server_ec_pt_formats,
-        tls_construct_client_ec_pt_formats,
-        tls_ext_final_ec_pt_formats,
-        EXT_CLIENT_HELLO | EXT_TLS1_2_AND_BELOW_ONLY
+        EXT_CLIENT_HELLO | EXT_TLS1_2_AND_BELOW_ONLY,
+        NULL, tls_parse_ctos_ec_pt_formats, tls_parse_stoc_ec_pt_formats,
+        tls_construct_stoc_ec_pt_formats, tls_construct_ctos_ec_pt_formats,
+        final_ec_pt_formats
     },
     {
         TLSEXT_TYPE_supported_groups,
-        NULL,
-        tls_parse_client_supported_groups,
-        NULL,
+        EXT_CLIENT_HELLO | EXT_TLS1_3_ENCRYPTED_EXTENSIONS,
+        NULL, tls_parse_ctos_supported_groups, NULL,
         NULL /* TODO(TLS1.3): Need to add this */,
-        tls_construct_client_supported_groups,
-        NULL,
-        EXT_CLIENT_HELLO | EXT_TLS1_3_ENCRYPTED_EXTENSIONS
+        tls_construct_ctos_supported_groups, NULL
     },
 #endif
     {
         TLSEXT_TYPE_session_ticket,
-        tls_ext_init_session_ticket,
-        tls_parse_client_session_ticket,
-        tls_parse_server_session_ticket,
-        tls_construct_server_session_ticket,
-        tls_construct_client_session_ticket,
-        NULL,
-        EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO | EXT_TLS1_2_AND_BELOW_ONLY
+        EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO | EXT_TLS1_2_AND_BELOW_ONLY,
+        init_session_ticket, tls_parse_ctos_session_ticket,
+        tls_parse_stoc_session_ticket, tls_construct_stoc_session_ticket,
+        tls_construct_ctos_session_ticket, NULL
     },
     {
         TLSEXT_TYPE_signature_algorithms,
-        tls_ext_init_sig_algs,
-        tls_parse_client_sig_algs,
-        NULL,
-        NULL,
-        tls_construct_client_sig_algs,
-        NULL,
-        EXT_CLIENT_HELLO
+        EXT_CLIENT_HELLO,
+        init_sig_algs, tls_parse_ctos_sig_algs, NULL, NULL,
+        tls_construct_ctos_sig_algs, NULL
     },
 #ifndef OPENSSL_NO_OCSP
     {
         TLSEXT_TYPE_status_request,
-        tls_ext_init_status_request,
-        tls_parse_client_status_request,
-        tls_parse_server_status_request,
-        tls_construct_server_status_request,
-        tls_construct_client_status_request,
-        tls_ext_final_status_request,
         EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO
-        | EXT_TLS1_3_CERTIFICATE
+        | EXT_TLS1_3_CERTIFICATE,
+        init_status_request, tls_parse_ctos_status_request,
+        tls_parse_stoc_status_request, tls_construct_stoc_status_request,
+        tls_construct_ctos_status_request, final_status_request
     },
 #endif
 #ifndef OPENSSL_NO_NEXTPROTONEG
     {
         TLSEXT_TYPE_next_proto_neg,
-        tls_ext_init_npn,
-        tls_parse_client_npn,
-        tls_parse_server_npn,
-        tls_construct_server_next_proto_neg,
-        tls_construct_client_npn,
-        NULL,
-        EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO | EXT_TLS1_2_AND_BELOW_ONLY
+        EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO | EXT_TLS1_2_AND_BELOW_ONLY,
+        init_npn, tls_parse_ctos_npn, tls_parse_stoc_npn,
+        tls_construct_stoc_next_proto_neg, tls_construct_ctos_npn, NULL
     },
 #endif
     {
@@ -196,76 +170,52 @@
          * happens after server_name callbacks
          */
         TLSEXT_TYPE_application_layer_protocol_negotiation,
-        tls_ext_init_alpn,
-        tls_parse_client_alpn,
-        tls_parse_server_alpn,
-        tls_construct_server_alpn,
-        tls_construct_client_alpn,
-        tls_ext_final_alpn,
         EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO
-        | EXT_TLS1_3_ENCRYPTED_EXTENSIONS
+        | EXT_TLS1_3_ENCRYPTED_EXTENSIONS,
+        init_alpn, tls_parse_ctos_alpn, tls_parse_stoc_alpn,
+        tls_construct_stoc_alpn, tls_construct_ctos_alpn, final_alpn
     },
 #ifndef OPENSSL_NO_SRTP
     {
         TLSEXT_TYPE_use_srtp,
-        tls_ext_init_srtp,
-        tls_parse_client_use_srtp,
-        tls_parse_server_use_srtp,
-        tls_construct_server_use_srtp,
-        tls_construct_client_use_srtp,
-        NULL,
         EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO
-        | EXT_TLS1_3_ENCRYPTED_EXTENSIONS | EXT_DTLS_ONLY
+        | EXT_TLS1_3_ENCRYPTED_EXTENSIONS | EXT_DTLS_ONLY,
+        init_srtp, tls_parse_ctos_use_srtp, tls_parse_stoc_use_srtp,
+        tls_construct_stoc_use_srtp, tls_construct_ctos_use_srtp, NULL
     },
 #endif
     {
         TLSEXT_TYPE_encrypt_then_mac,
-        tls_ext_init_etm,
-        tls_parse_client_etm,
-        tls_parse_server_etm,
-        tls_construct_server_etm,
-        tls_construct_client_etm,
-        NULL,
-        EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO | EXT_TLS1_2_AND_BELOW_ONLY
+        EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO | EXT_TLS1_2_AND_BELOW_ONLY,
+        init_etm, tls_parse_ctos_etm, tls_parse_stoc_etm,
+        tls_construct_stoc_etm, tls_construct_ctos_etm, NULL
     },
 #ifndef OPENSSL_NO_CT
     {
         TLSEXT_TYPE_signed_certificate_timestamp,
+        EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO
+        | EXT_TLS1_3_CERTIFICATE,
         NULL,
         /*
          * No server side support for this, but can be provided by a custom
          * extension. This is an exception to the rule that custom extensions
          * cannot override built in ones.
          */
-        NULL,
-        tls_parse_server_sct,
-        NULL,
-        tls_construct_client_sct,
-        NULL,
-        EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO
-        | EXT_TLS1_3_CERTIFICATE
+        NULL, tls_parse_stoc_sct, NULL, tls_construct_ctos_sct,  NULL
     },
 #endif
     {
         TLSEXT_TYPE_extended_master_secret,
-        tls_ext_init_ems,
-        tls_parse_client_ems,
-        tls_parse_server_ems,
-        tls_construct_server_ems,
-        tls_construct_client_ems,
-        tls_ext_final_ems,
-        EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO | EXT_TLS1_2_AND_BELOW_ONLY
+        EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO | EXT_TLS1_2_AND_BELOW_ONLY,
+        init_ems, tls_parse_ctos_ems, tls_parse_stoc_ems,
+        tls_construct_stoc_ems, tls_construct_ctos_ems, final_ems
     },
     {
         TLSEXT_TYPE_supported_versions,
+        EXT_CLIENT_HELLO | EXT_TLS_IMPLEMENTATION_ONLY | EXT_TLS1_3_ONLY,
         NULL,
         /* Processed inline as part of version selection */
-        NULL,
-        NULL,
-        NULL,
-        tls_construct_client_supported_versions,
-        NULL,
-        EXT_CLIENT_HELLO | EXT_TLS_IMPLEMENTATION_ONLY | EXT_TLS1_3_ONLY
+        NULL, NULL, NULL, tls_construct_ctos_supported_versions, NULL
     },
     {
         /*
@@ -273,15 +223,11 @@
          * been parsed before we do this one.
          */
         TLSEXT_TYPE_key_share,
-        NULL,
-        tls_parse_client_key_share,
-        tls_parse_server_key_share,
-        tls_construct_server_key_share,
-        tls_construct_client_key_share,
-        NULL,
         EXT_CLIENT_HELLO | EXT_TLS1_3_SERVER_HELLO
         | EXT_TLS1_3_HELLO_RETRY_REQUEST | EXT_TLS_IMPLEMENTATION_ONLY
-        | EXT_TLS1_3_ONLY
+        | EXT_TLS1_3_ONLY,
+        NULL, tls_parse_ctos_key_share, tls_parse_stoc_key_share,
+        tls_construct_stoc_key_share, tls_construct_ctos_key_share, NULL
     },
     {
         /*
@@ -289,25 +235,16 @@
          * SSL_OP_CRYPTOPRO_TLSEXT_BUG is set
          */
         TLSEXT_TYPE_cryptopro_bug,
-        NULL,
-        NULL,
-        NULL,
-        tls_construct_server_cryptopro_bug,
-        NULL,
-        NULL,
-        EXT_TLS1_2_SERVER_HELLO | EXT_TLS1_2_AND_BELOW_ONLY
+        EXT_TLS1_2_SERVER_HELLO | EXT_TLS1_2_AND_BELOW_ONLY,
+        NULL, NULL, NULL, tls_construct_stoc_cryptopro_bug, NULL, NULL
     },
     {
         /* Last in the list because it must be added as the last extension */
         TLSEXT_TYPE_padding,
+        EXT_CLIENT_HELLO,
         NULL,
         /* We send this, but don't read it */
-        NULL,
-        NULL,
-        NULL,
-        tls_construct_client_padding,
-        NULL,
-        EXT_CLIENT_HELLO
+        NULL, NULL, NULL, tls_construct_ctos_padding, NULL
     }
 };
 
@@ -318,26 +255,27 @@
  * 1 if we found a definition for the extension, and |*idx| is set to its index
  */
 static int verify_extension(SSL *s, unsigned int context, unsigned int type,
-                            custom_ext_methods *meths, int *found, size_t *idx)
+                            custom_ext_methods *meths, RAW_EXTENSION *rawexlist,
+                            RAW_EXTENSION **found)
 {
     size_t i;
     size_t builtin_num = OSSL_NELEM(ext_defs);
+    EXTENSION_DEFINITION *thisext;
 
-    for (i = 0; i < builtin_num; i++) {
-        if (type == ext_defs[i].type) {
+    for (i = 0, thisext = ext_defs; i < builtin_num; i++, thisext++) {
+        if (type == thisext->type) {
             /* Check we're allowed to use this extension in this context */
-            if ((context & ext_defs[i].context) == 0)
+            if ((context & thisext->context) == 0)
                 return 0;
 
             if (SSL_IS_DTLS(s)) {
-                if ((ext_defs[i].context & EXT_TLS_ONLY) != 0)
+                if ((thisext->context & EXT_TLS_ONLY) != 0)
                     return 0;
-            } else if ((ext_defs[i].context & EXT_DTLS_ONLY) != 0) {
+            } else if ((thisext->context & EXT_DTLS_ONLY) != 0) {
                     return 0;
             }
 
-            *found = 1;
-            *idx = i;
+            *found = &rawexlist[i];
             return 1;
         }
     }
@@ -347,7 +285,7 @@
          * Custom extensions only apply to <=TLS1.2. This extension is unknown
          * in this context - we allow it
          */
-        *found = 0;
+        *found = NULL;
         return 1;
     }
 
@@ -355,15 +293,14 @@
     if (meths != NULL) {
         for (i = builtin_num; i < builtin_num + meths->meths_count; i++) {
             if (meths->meths[i - builtin_num].ext_type == type) {
-                *found = 1;
-                *idx = i;
+                *found = &rawexlist[i];
                 return 1;
             }
         }
     }
 
     /* Unknown extension. We allow it */
-    *found = 0;
+    *found = NULL;
     return 1;
 }
 
@@ -390,16 +327,17 @@
 /*
  * Gather a list of all the extensions from the data in |packet]. |context|
  * tells us which message this extension is for. The raw extension data is
- * stored in |*res|. In the event of an error the alert type to use is stored in
- * |*al|. We don't actually process the content of the extensions yet, except to
- * check their types. This function also runs the initialiser functions for all
- * known extensions (whether we have collected them or not).
+ * stored in |*res| on success. In the event of an error the alert type to use
+ * is stored in |*al|. We don't actually process the content of the extensions
+ * yet, except to check their types. This function also runs the initialiser
+ * functions for all known extensions (whether we have collected them or not).
+ * If successful the caller is responsible for freeing the contents of |*res|.
  *
  * Per http://tools.ietf.org/html/rfc5246#section-7.4.1.4, there may not be
  * more than one extension of the same type in a ClientHello or ServerHello.
  * This function returns 1 if all extensions are unique and we have parsed their
  * types, and 0 if the extensions contain duplicates, could not be successfully
- * collected, or an internal error occurred. We only check duplicates for
+ * found, or an internal error occurred. We only check duplicates for
  * extensions that we know about. We ignore others.
  */
 int tls_collect_extensions(SSL *s, PACKET *packet, unsigned int context,
@@ -410,6 +348,7 @@
     int found = 0;
     custom_ext_methods *exts = NULL;
     RAW_EXTENSION *raw_extensions = NULL;
+    EXTENSION_DEFINITION *thisexd;
 
     /*
      * Initialise server side custom extensions. Client side is done during
@@ -424,7 +363,7 @@
 
     raw_extensions = OPENSSL_zalloc((OSSL_NELEM(ext_defs)
                                      + (exts != NULL ? exts->meths_count : 0))
-                                     * sizeof(RAW_EXTENSION));
+                                     * sizeof(*raw_extensions));
     if (raw_extensions == NULL) {
         *al = SSL_AD_INTERNAL_ERROR;
         SSLerr(SSL_F_TLS_COLLECT_EXTENSIONS, ERR_R_MALLOC_FAILURE);
@@ -434,6 +373,7 @@
     while (PACKET_remaining(&extensions) > 0) {
         unsigned int type;
         PACKET extension;
+        RAW_EXTENSION *thisex;
 
         if (!PACKET_get_net_2(&extensions, &type) ||
             !PACKET_get_length_prefixed_2(&extensions, &extension)) {
@@ -445,17 +385,16 @@
          * Verify this extension is allowed. We only check duplicates for
          * extensions that we recognise.
          */
-        if (!verify_extension(s, context, type, exts, &found, &idx)
-                || (found == 1
-                    && raw_extensions[idx].present == 1)) {
+        if (!verify_extension(s, context, type, exts, raw_extensions, &thisex)
+                || (thisex != NULL && thisex->present == 1)) {
             SSLerr(SSL_F_TLS_COLLECT_EXTENSIONS, SSL_R_BAD_EXTENSION);
             *al = SSL_AD_ILLEGAL_PARAMETER;
             goto err;
         }
-        if (found) {
-            raw_extensions[idx].data = extension;
-            raw_extensions[idx].present = 1;
-            raw_extensions[idx].type = type;
+        if (thisex != NULL) {
+            thisex->data = extension;
+            thisex->present = 1;
+            thisex->type = type;
         }
     }
 
@@ -463,10 +402,10 @@
      * Initialise all known extensions relevant to this context, whether we have
      * found them or not
      */
-    for (i = 0; i < OSSL_NELEM(ext_defs); i++) {
-        if(ext_defs[i].init_ext != NULL && (ext_defs[i].context & context) != 0
-                && extension_is_relevant(s, ext_defs[i].context, context)
-                && !ext_defs[i].init_ext(s, context)) {
+    for (thisexd = ext_defs, i = 0; i < OSSL_NELEM(ext_defs); i++, thisexd++) {
+        if(thisexd->init != NULL && (thisexd->context & context) != 0
+                && extension_is_relevant(s, thisexd->context, context)
+                && !thisexd->init(s, context)) {
             *al = SSL_AD_INTERNAL_ERROR;
             goto err;
         }
@@ -518,14 +457,10 @@
         if (!extension_is_relevant(s, extdef->context, context))
             return 1;
 
-        parser = s->server ? extdef->parse_client_ext : extdef->parse_server_ext;
+        parser = s->server ? extdef->parse_ctos : extdef->parse_stoc;
 
-        if (parser != NULL) {
-            if (!parser(s, &currext->data, al))
-                return 0;
-
-            return 1;
-        }
+        if (parser != NULL)
+            return parser(s, &currext->data, al);
 
         /*
          * If the parser is NULL we fall through to the custom extension
@@ -561,7 +496,8 @@
  */
 int tls_parse_all_extensions(SSL *s, int context, RAW_EXTENSION *exts, int *al)
 {
-    size_t loop, numexts = OSSL_NELEM(ext_defs);
+    size_t i, numexts = OSSL_NELEM(ext_defs);
+    EXTENSION_DEFINITION *thisexd;
 
     /* Calculate the number of extensions in the extensions list */
     if ((context & EXT_CLIENT_HELLO) != 0) {
@@ -571,7 +507,7 @@
     }
 
     /* Parse each extension in turn */
-    for (loop = 0; loop < numexts; loop++) {
+    for (i = 0; i < numexts; i++) {
         if (!tls_parse_extension(s, loop, context, exts, al))
             return 0;
     }
@@ -580,11 +516,10 @@
      * Finalise all known extensions relevant to this context, whether we have
      * found them or not
      */
-    for (loop = 0; loop < OSSL_NELEM(ext_defs); loop++) {
-        if(ext_defs[loop].finalise_ext != NULL
-                && (ext_defs[loop].context & context) != 0
-                && !ext_defs[loop].finalise_ext(s, context, exts[loop].present,
-                                                al))
+    for (i = 0, thisexd = ext_defs; i < OSSL_NELEM(ext_defs); i++, thisexd++) {
+        if(thisexd->final != NULL
+                && (thisexd->context & context) != 0
+                && !thisexd->final(s, context, exts[i].present, al))
             return 0;
     }
 
@@ -594,14 +529,15 @@
 /*
  * Construct all the extensions relevant to the current |context| and write
  * them to |pkt|. Returns 1 on success or 0 on failure. If a failure occurs then
- * |al| is populated with a suitable alert code.
+ * |al| is populated with a suitable alert code. On a failure construction stops
+ * at the first extension to fail to construct.
  */
 int tls_construct_extensions(SSL *s, WPACKET *pkt, unsigned int context,
                              int *al)
 {
-    size_t loop;
-    int addcustom = 0;
-    int min_version, max_version = 0, reason, tmpal;
+    size_t i;
+    int addcustom = 0, min_version, max_version = 0, reason, tmpal;
+    EXTENSION_DEFINITION *thisexd;
 
     /*
      * Normally if something goes wrong during construction it's an internal
@@ -651,29 +587,29 @@
         goto err;
     }
 
-    for (loop = 0; loop < OSSL_NELEM(ext_defs); loop++) {
+    for (i = 0, thisexd = ext_defs; i < OSSL_NELEM(ext_defs); i++, thisexd++) {
         int (*construct)(SSL *s, WPACKET *pkt, int *al);
 
         /* Skip if not relevant for our context */
         if ((ext_defs[loop].context & context) == 0)
             continue;
 
-        construct = s->server ? ext_defs[loop].construct_server_ext
-                              : ext_defs[loop].construct_client_ext;
+        construct = s->server ? thisexd->construct_stoc
+                              : thisexd->construct_ctos;
 
         /* Check if this extension is defined for our protocol. If not, skip */
         if ((SSL_IS_DTLS(s)
-                    && (ext_defs[loop].context & EXT_TLS_IMPLEMENTATION_ONLY)
+                    && (thisexd->context & EXT_TLS_IMPLEMENTATION_ONLY)
                        != 0)
                 || (s->version == SSL3_VERSION
-                        && (ext_defs[loop].context & EXT_SSL3_ALLOWED) == 0)
+                        && (thisexd->context & EXT_SSL3_ALLOWED) == 0)
                 || (SSL_IS_TLS13(s)
-                    && (ext_defs[loop].context & EXT_TLS1_2_AND_BELOW_ONLY)
+                    && (thisexd->context & EXT_TLS1_2_AND_BELOW_ONLY)
                        != 0)
                 || (!SSL_IS_TLS13(s)
-                    && (ext_defs[loop].context & EXT_TLS1_3_ONLY) != 0
+                    && (thisexd->context & EXT_TLS1_3_ONLY) != 0
                     && (context & EXT_CLIENT_HELLO) == 0)
-                || ((ext_defs[loop].context & EXT_TLS1_3_ONLY) != 0
+                || ((thisexd->context & EXT_TLS1_3_ONLY) != 0
                     && (context & EXT_CLIENT_HELLO) != 0
                     && (SSL_IS_DTLS(s) || max_version < TLS1_3_VERSION))
                 || construct == NULL)
@@ -703,7 +639,7 @@
  * of a failure then |*al| is populated with a suitable error code.
  */
 
-static int tls_ext_final_renegotiate(SSL *s, unsigned int context, int sent,
+static int final_renegotiate(SSL *s, unsigned int context, int sent,
                                      int *al)
 {
     if (!s->server) {
@@ -737,7 +673,7 @@
     return 1;
 }
 
-static int tls_ext_init_server_name(SSL *s, unsigned int context)
+static int init_server_name(SSL *s, unsigned int context)
 {
     if (s->server)
         s->servername_done = 0;
@@ -745,7 +681,7 @@
     return 1;
 }
 
-static int tls_ext_final_server_name(SSL *s, unsigned int context, int sent,
+static int final_server_name(SSL *s, unsigned int context, int sent,
                                      int *al)
 {
     int ret = SSL_TLSEXT_ERR_NOACK;
@@ -778,7 +714,7 @@
 }
 
 #ifndef OPENSSL_NO_EC
-static int tls_ext_final_ec_pt_formats(SSL *s, unsigned int context, int sent,
+static int final_ec_pt_formats(SSL *s, unsigned int context, int sent,
                                        int *al)
 {
     unsigned long alg_k, alg_a;
@@ -794,23 +730,20 @@
      * suite, then if server returns an EC point formats lists extension it
      * must contain uncompressed.
      */
-    if ((s->tlsext_ecpointformatlist != NULL)
-        && (s->tlsext_ecpointformatlist_length > 0)
-        && (s->session->tlsext_ecpointformatlist != NULL)
-        && (s->session->tlsext_ecpointformatlist_length > 0)
-        && ((alg_k & SSL_kECDHE) || (alg_a & SSL_aECDSA))) {
+    if (s->tlsext_ecpointformatlist != NULL
+            && s->tlsext_ecpointformatlist_length > 0
+            && s->session->tlsext_ecpointformatlist != NULL
+            && s->session->tlsext_ecpointformatlist_length > 0
+            && ((alg_k & SSL_kECDHE) || (alg_a & SSL_aECDSA))) {
         /* we are using an ECC cipher */
         size_t i;
-        unsigned char *list;
-        int found_uncompressed = 0;
-        list = s->session->tlsext_ecpointformatlist;
+        unsigned char *list = s->session->tlsext_ecpointformatlist;
+
         for (i = 0; i < s->session->tlsext_ecpointformatlist_length; i++) {
-            if (*(list++) == TLSEXT_ECPOINTFORMAT_uncompressed) {
-                found_uncompressed = 1;
+            if (*list++ == TLSEXT_ECPOINTFORMAT_uncompressed)
                 break;
-            }
         }
-        if (!found_uncompressed) {
+        if (i == s->session->tlsext_ecpointformatlist_length) {
             SSLerr(SSL_F_TLS_EXT_FINAL_EC_PT_FORMATS,
                    SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST);
             return 0;
@@ -821,7 +754,7 @@
 }
 #endif
 
-static int tls_ext_init_session_ticket(SSL *s, unsigned int context)
+static int init_session_ticket(SSL *s, unsigned int context)
 {
     if (!s->server)
         s->tlsext_ticket_expected = 0;
@@ -829,7 +762,7 @@
     return 1;
 }
 
-static int tls_ext_init_status_request(SSL *s, unsigned int context)
+static int init_status_request(SSL *s, unsigned int context)
 {
     if (s->server)
         s->tlsext_status_type = -1;
@@ -837,7 +770,7 @@
     return 1;
 }
 
-static int tls_ext_final_status_request(SSL *s, unsigned int context, int sent,
+static int final_status_request(SSL *s, unsigned int context, int sent,
                                         int *al)
 {
     if (s->server)
@@ -855,7 +788,7 @@
 }
 
 #ifndef OPENSSL_NO_NEXTPROTONEG
-static int tls_ext_init_npn(SSL *s, unsigned int context)
+static int init_npn(SSL *s, unsigned int context)
 {
     s->s3->next_proto_neg_seen = 0;
 
@@ -863,7 +796,7 @@
 }
 #endif
 
-static int tls_ext_init_alpn(SSL *s, unsigned int context)
+static int init_alpn(SSL *s, unsigned int context)
 {
     OPENSSL_free(s->s3->alpn_selected);
     s->s3->alpn_selected = NULL;
@@ -876,7 +809,7 @@
     return 1;
 }
 
-static int tls_ext_final_alpn(SSL *s, unsigned int context, int sent, int *al)
+static int final_alpn(SSL *s, unsigned int context, int sent, int *al)
 {
     const unsigned char *selected = NULL;
     unsigned char selected_len = 0;
@@ -911,7 +844,7 @@
     return 1;
 }
 
-static int tls_ext_init_sig_algs(SSL *s, unsigned int context)
+static int init_sig_algs(SSL *s, unsigned int context)
 {
     /* Clear any signature algorithms extension received */
     OPENSSL_free(s->s3->tmp.peer_sigalgs);
@@ -921,7 +854,7 @@
 }
 
 #ifndef OPENSSL_NO_SRP
-static int tls_ext_init_srp(SSL *s, unsigned int context)
+static int init_srp(SSL *s, unsigned int context)
 {
     OPENSSL_free(s->srp_ctx.login);
     s->srp_ctx.login = NULL;
@@ -930,14 +863,14 @@
 }
 #endif
 
-static int tls_ext_init_etm(SSL *s, unsigned int context)
+static int init_etm(SSL *s, unsigned int context)
 {
     s->s3->flags &= ~TLS1_FLAGS_ENCRYPT_THEN_MAC;
 
     return 1;
 }
 
-static int tls_ext_init_ems(SSL *s, unsigned int context)
+static int init_ems(SSL *s, unsigned int context)
 {
     if (!s->server)
         s->s3->flags &= ~TLS1_FLAGS_RECEIVED_EXTMS;
@@ -945,7 +878,7 @@
     return 1;
 }
 
-static int tls_ext_final_ems(SSL *s, unsigned int context, int sent, int *al)
+static int final_ems(SSL *s, unsigned int context, int sent, int *al)
 {
     if (!s->server && s->hit) {
         /*
@@ -964,7 +897,7 @@
 }
 
 #ifndef OPENSSL_NO_SRTP
-static int tls_ext_init_srtp(SSL *s, unsigned int context)
+static int init_srtp(SSL *s, unsigned int context)
 {
     if (s->server)
         s->srtp_profile = NULL;
diff --git a/ssl/statem/extensions_clnt.c b/ssl/statem/extensions_clnt.c
index df12969..950f199 100644
--- a/ssl/statem/extensions_clnt.c
+++ b/ssl/statem/extensions_clnt.c
@@ -12,7 +12,7 @@
 #include "../ssl_locl.h"
 #include "statem_locl.h"
 
-int tls_construct_client_renegotiate(SSL *s, WPACKET *pkt, int *al)
+int tls_construct_ctos_renegotiate(SSL *s, WPACKET *pkt, int *al)
 {
     /* Add RI if renegotiating */
     if (!s->renegotiate)
@@ -30,7 +30,7 @@
     return 1;
 }
 
-int tls_construct_client_server_name(SSL *s, WPACKET *pkt, int *al)
+int tls_construct_ctos_server_name(SSL *s, WPACKET *pkt, int *al)
 {
     if (s->tlsext_hostname == NULL)
         return 1;
@@ -54,7 +54,7 @@
 }
 
 #ifndef OPENSSL_NO_SRP
-int tls_construct_client_srp(SSL *s, WPACKET *pkt, int *al)
+int tls_construct_ctos_srp(SSL *s, WPACKET *pkt, int *al)
 {
     /* Add SRP username if there is one */
     if (s->srp_ctx.login == NULL)
@@ -81,8 +81,7 @@
 #ifndef OPENSSL_NO_EC
 static int use_ecc(SSL *s)
 {
-    int using_ecc = 0;
-    int i;
+    int i, end;
     unsigned long alg_k, alg_a;
     STACK_OF(SSL_CIPHER) *cipher_stack = NULL;
 
@@ -90,26 +89,23 @@
     if (s->version == SSL3_VERSION)
         return 0;
 
-
     cipher_stack = SSL_get_ciphers(s);
-
-    for (i = 0; i < sk_SSL_CIPHER_num(cipher_stack); i++) {
+    end = sk_SSL_CIPHER_num(cipher_stack);
+    for (i = 0; i < end; i++) {
         const SSL_CIPHER *c = sk_SSL_CIPHER_value(cipher_stack, i);
 
         alg_k = c->algorithm_mkey;
         alg_a = c->algorithm_auth;
         if ((alg_k & (SSL_kECDHE | SSL_kECDHEPSK))
-            || (alg_a & SSL_aECDSA)
-            || c->min_tls >= TLS1_3_VERSION) {
-            using_ecc = 1;
+                || (alg_a & SSL_aECDSA)
+                || c->min_tls >= TLS1_3_VERSION)
             break;
-        }
     }
 
-    return using_ecc;
+    return i < end;
 }
 
-int tls_construct_client_ec_pt_formats(SSL *s, WPACKET *pkt, int *al)
+int tls_construct_ctos_ec_pt_formats(SSL *s, WPACKET *pkt, int *al)
 {
     const unsigned char *pformats;
     size_t num_formats;
@@ -118,7 +114,6 @@
         return 1;
 
     /* Add TLS extension ECPointFormats to the ClientHello message */
-
     tls1_get_formatlist(s, &pformats, &num_formats);
 
     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_ec_point_formats)
@@ -134,7 +129,7 @@
 }
 
 
-int tls_construct_client_supported_groups(SSL *s, WPACKET *pkt, int *al)
+int tls_construct_ctos_supported_groups(SSL *s, WPACKET *pkt, int *al)
 {
     const unsigned char *pcurves = NULL, *pcurvestmp;
     size_t num_curves = 0, i;
@@ -183,7 +178,7 @@
 }
 #endif
 
-int tls_construct_client_session_ticket(SSL *s, WPACKET *pkt, int *al)
+int tls_construct_ctos_session_ticket(SSL *s, WPACKET *pkt, int *al)
 {
     size_t ticklen;
 
@@ -222,7 +217,7 @@
     return 1;
 }
 
-int tls_construct_client_sig_algs(SSL *s, WPACKET *pkt, int *al)
+int tls_construct_ctos_sig_algs(SSL *s, WPACKET *pkt, int *al)
 {
     size_t salglen;
     const unsigned char *salg;
@@ -231,7 +226,6 @@
         return 1;
 
     salglen = tls12_get_psigalgs(s, &salg);
-
     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_signature_algorithms)
                /* Sub-packet for sig-algs extension */
             || !WPACKET_start_sub_packet_u16(pkt)
@@ -248,7 +242,7 @@
 }
 
 #ifndef OPENSSL_NO_OCSP
-int tls_construct_client_status_request(SSL *s, WPACKET *pkt, int *al)
+int tls_construct_ctos_status_request(SSL *s, WPACKET *pkt, int *al)
 {
     int i;
 
@@ -266,11 +260,9 @@
     }
     for (i = 0; i < sk_OCSP_RESPID_num(s->tlsext_ocsp_ids); i++) {
         unsigned char *idbytes;
-        int idlen;
-        OCSP_RESPID *id;
+        OCSP_RESPID *id = sk_OCSP_RESPID_value(s->tlsext_ocsp_ids, i);
+        int idlen = i2d_OCSP_RESPID(id, NULL);
 
-        id = sk_OCSP_RESPID_value(s->tlsext_ocsp_ids, i);
-        idlen = i2d_OCSP_RESPID(id, NULL);
         if (idlen <= 0
                    /* Sub-packet for an individual id */
                 || !WPACKET_sub_allocate_bytes_u16(pkt, idlen, &idbytes)
@@ -312,7 +304,7 @@
 #endif
 
 #ifndef OPENSSL_NO_NEXTPROTONEG
-int tls_construct_client_npn(SSL *s, WPACKET *pkt, int *al)
+int tls_construct_ctos_npn(SSL *s, WPACKET *pkt, int *al)
 {
     if (s->ctx->next_proto_select_cb == NULL || s->s3->tmp.finish_md_len != 0)
         return 1;
@@ -331,7 +323,7 @@
 }
 #endif
 
-int tls_construct_client_alpn(SSL *s, WPACKET *pkt, int *al)
+int tls_construct_ctos_alpn(SSL *s, WPACKET *pkt, int *al)
 {
     s->s3->alpn_sent = 0;
 
@@ -359,11 +351,10 @@
 
 
 #ifndef OPENSSL_NO_SRTP
-int tls_construct_client_use_srtp(SSL *s, WPACKET *pkt, int *al)
+int tls_construct_ctos_use_srtp(SSL *s, WPACKET *pkt, int *al)
 {
     STACK_OF(SRTP_PROTECTION_PROFILE) *clnt = SSL_get_srtp_profiles(s);
-    SRTP_PROTECTION_PROFILE *prof;
-    int i, ct;
+    int i, end;
 
     if (clnt == NULL)
         return 1;
@@ -376,9 +367,12 @@
         SSLerr(SSL_F_TLS_CONSTRUCT_CLIENT_USE_SRTP, ERR_R_INTERNAL_ERROR);
         return 0;
     }
-    ct = sk_SRTP_PROTECTION_PROFILE_num(clnt);
-    for (i = 0; i < ct; i++) {
-        prof = sk_SRTP_PROTECTION_PROFILE_value(clnt, i);
+
+    end = sk_SRTP_PROTECTION_PROFILE_num(clnt);
+    for (i = 0; i < end; i++) {
+        const SRTP_PROTECTION_PROFILE *prof =
+            sk_SRTP_PROTECTION_PROFILE_value(clnt, i);
+
         if (prof == NULL || !WPACKET_put_bytes_u16(pkt, prof->id)) {
             SSLerr(SSL_F_TLS_CONSTRUCT_CLIENT_USE_SRTP, ERR_R_INTERNAL_ERROR);
             return 0;
@@ -396,7 +390,7 @@
 }
 #endif
 
-int tls_construct_client_etm(SSL *s, WPACKET *pkt, int *al)
+int tls_construct_ctos_etm(SSL *s, WPACKET *pkt, int *al)
 {
     if (s->options & SSL_OP_NO_ENCRYPT_THEN_MAC)
         return 1;
@@ -411,7 +405,7 @@
 }
 
 #ifndef OPENSSL_NO_CT
-int tls_construct_client_sct(SSL *s, WPACKET *pkt, int *al)
+int tls_construct_ctos_sct(SSL *s, WPACKET *pkt, int *al)
 {
     if (s->ct_validation_callback == NULL)
         return 1;
@@ -426,7 +420,7 @@
 }
 #endif
 
-int tls_construct_client_ems(SSL *s, WPACKET *pkt, int *al)
+int tls_construct_ctos_ems(SSL *s, WPACKET *pkt, int *al)
 {
     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_extended_master_secret)
             || !WPACKET_put_bytes_u16(pkt, 0)) {
@@ -437,7 +431,7 @@
     return 1;
 }
 
-int tls_construct_client_supported_versions(SSL *s, WPACKET *pkt, int *al)
+int tls_construct_ctos_supported_versions(SSL *s, WPACKET *pkt, int *al)
 {
     int currv, min_version, max_version, reason;
 
@@ -484,7 +478,7 @@
 }
 
 
-int tls_construct_client_key_share(SSL *s, WPACKET *pkt, int *al)
+int tls_construct_ctos_key_share(SSL *s, WPACKET *pkt, int *al)
 {
     size_t i, sharessent = 0, num_curves = 0;
     const unsigned char *pcurves = NULL;
@@ -569,7 +563,10 @@
     return 1;
 }
 
-int tls_construct_client_padding(SSL *s, WPACKET *pkt, int *al)
+#define F5_WORKAROUND_MIN_MSG_LEN   0xff
+#define F5_WORKAROUND_MAX_MSG_LEN   0x200
+
+int tls_construct_ctos_padding(SSL *s, WPACKET *pkt, int *al)
 {
     unsigned char *padbytes;
     size_t hlen;
@@ -580,7 +577,7 @@
     /*
      * Add padding to workaround bugs in F5 terminators. See
      * https://tools.ietf.org/html/draft-agl-tls-padding-03 NB: because this
-     * code works out the length of all existing extensions it MUST always
+     * code calculates the length of all existing extensions it MUST always
      * appear last.
      */
     if (!WPACKET_get_total_written(pkt, &hlen)) {
@@ -588,8 +585,14 @@
         return 0;
     }
 
-    if (hlen > 0xff && hlen < 0x200) {
-        hlen = 0x200 - hlen;
+    if (hlen > F5_WORKAROUND_MIN_MSG_LEN && hlen < F5_WORKAROUND_MAX_MSG_LEN) {
+        /* Calculate the amond of padding we need to add */
+        hlen = F5_WORKAROUND_MAX_MSG_LEN - hlen;
+
+        /*
+         * Take off the size of extension header itself (2 bytes for type and
+         * 2 bytes for length bytes)
+         */
         if (hlen >= 4)
             hlen -= 4;
         else
@@ -609,7 +612,7 @@
 /*
  * Parse the server's renegotiation binding and abort if it's not right
  */
-int tls_parse_server_renegotiate(SSL *s, PACKET *pkt, int *al)
+int tls_parse_stoc_renegotiate(SSL *s, PACKET *pkt, int *al)
 {
     size_t expected_len = s->s3->previous_client_finished_len
         + s->s3->previous_server_finished_len;
@@ -666,7 +669,7 @@
     return 1;
 }
 
-int tls_parse_server_server_name(SSL *s, PACKET *pkt, int *al)
+int tls_parse_stoc_server_name(SSL *s, PACKET *pkt, int *al)
 {
     if (s->tlsext_hostname == NULL || PACKET_remaining(pkt) > 0) {
         *al = SSL_AD_UNRECOGNIZED_NAME;
@@ -689,7 +692,7 @@
 }
 
 #ifndef OPENSSL_NO_EC
-int tls_parse_server_ec_pt_formats(SSL *s, PACKET *pkt, int *al)
+int tls_parse_stoc_ec_pt_formats(SSL *s, PACKET *pkt, int *al)
 {
     unsigned int ecpointformatlist_length;
     PACKET ecptformatlist;
@@ -724,26 +727,28 @@
 }
 #endif
 
-int tls_parse_server_session_ticket(SSL *s, PACKET *pkt, int *al)
+int tls_parse_stoc_session_ticket(SSL *s, PACKET *pkt, int *al)
 {
-    if (s->tls_session_ticket_ext_cb &&
+    if (s->tls_session_ticket_ext_cb != NULL &&
         !s->tls_session_ticket_ext_cb(s, PACKET_data(pkt),
                                       PACKET_remaining(pkt),
                                       s->tls_session_ticket_ext_cb_arg)) {
         *al = SSL_AD_INTERNAL_ERROR;
         return 0;
     }
+
     if (!tls_use_ticket(s) || PACKET_remaining(pkt) > 0) {
         *al = SSL_AD_UNSUPPORTED_EXTENSION;
         return 0;
     }
+
     s->tlsext_ticket_expected = 1;
 
     return 1;
 }
 
 #ifndef OPENSSL_NO_OCSP
-int tls_parse_server_status_request(SSL *s, PACKET *pkt, int *al)
+int tls_parse_stoc_status_request(SSL *s, PACKET *pkt, int *al)
 {
     /*
      * MUST be empty and only sent if we've requested a status
@@ -762,7 +767,7 @@
 
 
 #ifndef OPENSSL_NO_CT
-int tls_parse_server_sct(SSL *s, PACKET *pkt, int *al)
+int tls_parse_stoc_sct(SSL *s, PACKET *pkt, int *al)
 {
     /*
      * Only take it if we asked for it - i.e if there is no CT validation
@@ -773,10 +778,9 @@
         size_t size = PACKET_remaining(pkt);
 
         /* Simply copy it off for later processing */
-        if (s->tlsext_scts != NULL) {
-            OPENSSL_free(s->tlsext_scts);
-            s->tlsext_scts = NULL;
-        }
+        OPENSSL_free(s->tlsext_scts);
+        s->tlsext_scts = NULL;
+
         s->tlsext_scts_len = size;
         if (size > 0) {
             s->tlsext_scts = OPENSSL_malloc(size);
@@ -816,12 +820,13 @@
     return 1;
 }
 
-int tls_parse_server_npn(SSL *s, PACKET *pkt, int *al)
+int tls_parse_stoc_npn(SSL *s, PACKET *pkt, int *al)
 {
     unsigned char *selected;
     unsigned char selected_len;
     PACKET tmppkt;
 
+    /* Check if we are in a renegotiation. If so ignore this extension */
     if (s->s3->tmp.finish_md_len != 0)
         return 1;
 
@@ -830,6 +835,7 @@
         *al = SSL_AD_UNSUPPORTED_EXTENSION;
         return 0;
     }
+
     /* The data must be valid */
     tmppkt = *pkt;
     if (!ssl_next_proto_validate(&tmppkt)) {
@@ -844,6 +850,7 @@
         *al = SSL_AD_INTERNAL_ERROR;
         return 0;
     }
+
     /*
      * Could be non-NULL if server has sent multiple NPN extensions in
      * a single Serverhello
@@ -863,7 +870,7 @@
 }
 #endif
 
-int tls_parse_server_alpn(SSL *s, PACKET *pkt, int *al)
+int tls_parse_stoc_alpn(SSL *s, PACKET *pkt, int *al)
 {
     size_t len;
 
@@ -900,17 +907,17 @@
 }
 
 #ifndef OPENSSL_NO_SRTP
-int tls_parse_server_use_srtp(SSL *s, PACKET *pkt, int *al)
+int tls_parse_stoc_use_srtp(SSL *s, PACKET *pkt, int *al)
 {
     unsigned int id, ct, mki;
     int i;
     STACK_OF(SRTP_PROTECTION_PROFILE) *clnt;
     SRTP_PROTECTION_PROFILE *prof;
 
-    if (!PACKET_get_net_2(pkt, &ct)
-        || ct != 2 || !PACKET_get_net_2(pkt, &id)
-        || !PACKET_get_1(pkt, &mki)
-        || PACKET_remaining(pkt) != 0) {
+    if (!PACKET_get_net_2(pkt, &ct) || ct != 2
+            || !PACKET_get_net_2(pkt, &id)
+            || !PACKET_get_1(pkt, &mki)
+            || PACKET_remaining(pkt) != 0) {
         SSLerr(SSL_F_TLS_PARSE_SERVER_USE_SRTP,
                SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST);
         *al = SSL_AD_DECODE_ERROR;
@@ -924,9 +931,8 @@
         return 0;
     }
 
-    clnt = SSL_get_srtp_profiles(s);
-
     /* Throw an error if the server gave us an unsolicited extension */
+    clnt = SSL_get_srtp_profiles(s);
     if (clnt == NULL) {
         SSLerr(SSL_F_TLS_PARSE_SERVER_USE_SRTP, SSL_R_NO_SRTP_PROFILES);
         *al = SSL_AD_DECODE_ERROR;
@@ -954,7 +960,7 @@
 }
 #endif
 
-int tls_parse_server_etm(SSL *s, PACKET *pkt, int *al)
+int tls_parse_stoc_etm(SSL *s, PACKET *pkt, int *al)
 {
     /* Ignore if inappropriate ciphersuite */
     if (!(s->options & SSL_OP_NO_ENCRYPT_THEN_MAC)
@@ -965,7 +971,7 @@
     return 1;
 }
 
-int tls_parse_server_ems(SSL *s, PACKET *pkt, int *al)
+int tls_parse_stoc_ems(SSL *s, PACKET *pkt, int *al)
 {
     s->s3->flags |= TLS1_FLAGS_RECEIVED_EXTMS;
     if (!s->hit)
@@ -974,7 +980,7 @@
     return 1;
 }
 
-int tls_parse_server_key_share(SSL *s, PACKET *pkt, int *al)
+int tls_parse_stoc_key_share(SSL *s, PACKET *pkt, int *al)
 {
     unsigned int group_id;
     PACKET encoded_pt;
diff --git a/ssl/statem/extensions_srvr.c b/ssl/statem/extensions_srvr.c
index 370d0b9..9763c47 100644
--- a/ssl/statem/extensions_srvr.c
+++ b/ssl/statem/extensions_srvr.c
@@ -14,7 +14,7 @@
 /*
  * Parse the client's renegotiation binding and abort if it's not right
  */
-int tls_parse_client_renegotiate(SSL *s, PACKET *pkt, int *al)
+int tls_parse_ctos_renegotiate(SSL *s, PACKET *pkt, int *al)
 {
     unsigned int ilen;
     const unsigned char *data;
@@ -49,35 +49,34 @@
     return 1;
 }
 
-int tls_parse_client_server_name(SSL *s, PACKET *pkt, int *al)
+/*-
+ * The servername extension is treated as follows:
+ *
+ * - Only the hostname type is supported with a maximum length of 255.
+ * - The servername is rejected if too long or if it contains zeros,
+ *   in which case an fatal alert is generated.
+ * - The servername field is maintained together with the session cache.
+ * - When a session is resumed, the servername call back invoked in order
+ *   to allow the application to position itself to the right context.
+ * - The servername is acknowledged if it is new for a session or when
+ *   it is identical to a previously used for the same session.
+ *   Applications can control the behaviour.  They can at any time
+ *   set a 'desirable' servername for a new SSL object. This can be the
+ *   case for example with HTTPS when a Host: header field is received and
+ *   a renegotiation is requested. In this case, a possible servername
+ *   presented in the new client hello is only acknowledged if it matches
+ *   the value of the Host: field.
+ * - Applications must  use SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION
+ *   if they provide for changing an explicit servername context for the
+ *   session, i.e. when the session has been established with a servername
+ *   extension.
+ * - On session reconnect, the servername extension may be absent.
+ */
+int tls_parse_ctos_server_name(SSL *s, PACKET *pkt, int *al)
 {
     unsigned int servname_type;
     PACKET sni, hostname;
 
-    /*-
-     * The servername extension is treated as follows:
-     *
-     * - Only the hostname type is supported with a maximum length of 255.
-     * - The servername is rejected if too long or if it contains zeros,
-     *   in which case an fatal alert is generated.
-     * - The servername field is maintained together with the session cache.
-     * - When a session is resumed, the servername call back invoked in order
-     *   to allow the application to position itself to the right context.
-     * - The servername is acknowledged if it is new for a session or when
-     *   it is identical to a previously used for the same session.
-     *   Applications can control the behaviour.  They can at any time
-     *   set a 'desirable' servername for a new SSL object. This can be the
-     *   case for example with HTTPS when a Host: header field is received and
-     *   a renegotiation is requested. In this case, a possible servername
-     *   presented in the new client hello is only acknowledged if it matches
-     *   the value of the Host: field.
-     * - Applications must  use SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION
-     *   if they provide for changing an explicit servername context for the
-     *   session, i.e. when the session has been established with a servername
-     *   extension.
-     * - On session reconnect, the servername extension may be absent.
-     *
-     */
     if (!PACKET_as_length_prefixed_2(pkt, &sni)
         /* ServerNameList must be at least 1 byte long. */
         || PACKET_remaining(&sni) == 0) {
@@ -88,7 +87,7 @@
     /*
      * Although the server_name extension was intended to be
      * extensible to new name types, RFC 4366 defined the
-     * syntax inextensibility and OpenSSL 1.0.x parses it as
+     * syntax inextensibly and OpenSSL 1.0.x parses it as
      * such.
      * RFC 6066 corrected the mistake but adding new name types
      * is nevertheless no longer feasible, so act as if no other
@@ -135,7 +134,7 @@
 }
 
 #ifndef OPENSSL_NO_SRP
-int tls_parse_client_srp(SSL *s, PACKET *pkt, int *al)
+int tls_parse_ctos_srp(SSL *s, PACKET *pkt, int *al)
 {
     PACKET srp_I;
 
@@ -159,7 +158,7 @@
 #endif
 
 #ifndef OPENSSL_NO_EC
-int tls_parse_client_ec_pt_formats(SSL *s, PACKET *pkt, int *al)
+int tls_parse_ctos_ec_pt_formats(SSL *s, PACKET *pkt, int *al)
 {
     PACKET ec_point_format_list;
 
@@ -182,7 +181,7 @@
 }
 #endif                          /* OPENSSL_NO_EC */
 
-int tls_parse_client_session_ticket(SSL *s, PACKET *pkt, int *al)
+int tls_parse_ctos_session_ticket(SSL *s, PACKET *pkt, int *al)
 {
     if (s->tls_session_ticket_ext_cb &&
             !s->tls_session_ticket_ext_cb(s, PACKET_data(pkt),
@@ -195,7 +194,7 @@
     return 1;
 }
 
-int tls_parse_client_sig_algs(SSL *s, PACKET *pkt, int *al)
+int tls_parse_ctos_sig_algs(SSL *s, PACKET *pkt, int *al)
 {
     PACKET supported_sig_algs;
 
@@ -216,93 +215,93 @@
 }
 
 #ifndef OPENSSL_NO_OCSP
-int tls_parse_client_status_request(SSL *s, PACKET *pkt, int *al)
+int tls_parse_ctos_status_request(SSL *s, PACKET *pkt, int *al)
 {
+    PACKET responder_id_list, exts;
+
     if (!PACKET_get_1(pkt, (unsigned int *)&s->tlsext_status_type)) {
         *al = SSL_AD_DECODE_ERROR;
         return 0;
     }
 
-    if (s->tlsext_status_type == TLSEXT_STATUSTYPE_ocsp) {
-        const unsigned char *ext_data;
-        PACKET responder_id_list, exts;
-        if (!PACKET_get_length_prefixed_2 (pkt, &responder_id_list)) {
-            *al = SSL_AD_DECODE_ERROR;
-            return 0;
-        }
-
-        /*
-         * We remove any OCSP_RESPIDs from a previous handshake
-         * to prevent unbounded memory growth - CVE-2016-6304
-         */
-        sk_OCSP_RESPID_pop_free(s->tlsext_ocsp_ids, OCSP_RESPID_free);
-        if (PACKET_remaining(&responder_id_list) > 0) {
-            s->tlsext_ocsp_ids = sk_OCSP_RESPID_new_null();
-            if (s->tlsext_ocsp_ids == NULL) {
-                *al = SSL_AD_INTERNAL_ERROR;
-                return 0;
-            }
-        } else {
-            s->tlsext_ocsp_ids = NULL;
-        }
-
-        while (PACKET_remaining(&responder_id_list) > 0) {
-            OCSP_RESPID *id;
-            PACKET responder_id;
-            const unsigned char *id_data;
-
-            if (!PACKET_get_length_prefixed_2(&responder_id_list,
-                                              &responder_id)
-                    || PACKET_remaining(&responder_id) == 0) {
-                *al = SSL_AD_DECODE_ERROR;
-                return 0;
-            }
-
-            id_data = PACKET_data(&responder_id);
-            /* TODO(size_t): Convert d2i_* to size_t */
-            id = d2i_OCSP_RESPID(NULL, &id_data,
-                                 (int)PACKET_remaining(&responder_id));
-            if (id == NULL) {
-                *al = SSL_AD_DECODE_ERROR;
-                return 0;
-            }
-
-            if (id_data != PACKET_end(&responder_id)) {
-                OCSP_RESPID_free(id);
-                *al = SSL_AD_DECODE_ERROR;
-                return 0;
-            }
-
-            if (!sk_OCSP_RESPID_push(s->tlsext_ocsp_ids, id)) {
-                OCSP_RESPID_free(id);
-                *al = SSL_AD_INTERNAL_ERROR;
-                return 0;
-            }
-        }
-
-        /* Read in request_extensions */
-        if (!PACKET_as_length_prefixed_2(pkt, &exts)) {
-            *al = SSL_AD_DECODE_ERROR;
-            return 0;
-        }
-
-        if (PACKET_remaining(&exts) > 0) {
-            ext_data = PACKET_data(&exts);
-            sk_X509_EXTENSION_pop_free(s->tlsext_ocsp_exts,
-                                       X509_EXTENSION_free);
-            s->tlsext_ocsp_exts =
-                d2i_X509_EXTENSIONS(NULL, &ext_data,
-                                    (int)PACKET_remaining(&exts));
-            if (s->tlsext_ocsp_exts == NULL || ext_data != PACKET_end(&exts)) {
-                *al = SSL_AD_DECODE_ERROR;
-                return 0;
-            }
-        }
-    } else {
+    if (s->tlsext_status_type != TLSEXT_STATUSTYPE_ocsp) {
         /*
          * We don't know what to do with any other type so ignore it.
          */
         s->tlsext_status_type = -1;
+        return 1;
+    }
+
+    if (!PACKET_get_length_prefixed_2 (pkt, &responder_id_list)) {
+        *al = SSL_AD_DECODE_ERROR;
+        return 0;
+    }
+
+    /*
+     * We remove any OCSP_RESPIDs from a previous handshake
+     * to prevent unbounded memory growth - CVE-2016-6304
+     */
+    sk_OCSP_RESPID_pop_free(s->tlsext_ocsp_ids, OCSP_RESPID_free);
+    if (PACKET_remaining(&responder_id_list) > 0) {
+        s->tlsext_ocsp_ids = sk_OCSP_RESPID_new_null();
+        if (s->tlsext_ocsp_ids == NULL) {
+            *al = SSL_AD_INTERNAL_ERROR;
+            return 0;
+        }
+    } else {
+        s->tlsext_ocsp_ids = NULL;
+    }
+
+    while (PACKET_remaining(&responder_id_list) > 0) {
+        OCSP_RESPID *id;
+        PACKET responder_id;
+        const unsigned char *id_data;
+
+        if (!PACKET_get_length_prefixed_2(&responder_id_list, &responder_id)
+                || PACKET_remaining(&responder_id) == 0) {
+            *al = SSL_AD_DECODE_ERROR;
+            return 0;
+        }
+
+        id_data = PACKET_data(&responder_id);
+        /* TODO(size_t): Convert d2i_* to size_t */
+        id = d2i_OCSP_RESPID(NULL, &id_data,
+                             (int)PACKET_remaining(&responder_id));
+        if (id == NULL) {
+            *al = SSL_AD_DECODE_ERROR;
+            return 0;
+        }
+
+        if (id_data != PACKET_end(&responder_id)) {
+            OCSP_RESPID_free(id);
+            *al = SSL_AD_DECODE_ERROR;
+            return 0;
+        }
+
+        if (!sk_OCSP_RESPID_push(s->tlsext_ocsp_ids, id)) {
+            OCSP_RESPID_free(id);
+            *al = SSL_AD_INTERNAL_ERROR;
+            return 0;
+        }
+    }
+
+    /* Read in request_extensions */
+    if (!PACKET_as_length_prefixed_2(pkt, &exts)) {
+        *al = SSL_AD_DECODE_ERROR;
+        return 0;
+    }
+
+    if (PACKET_remaining(&exts) > 0) {
+        const unsigned char *ext_data = PACKET_data(&exts);
+
+        sk_X509_EXTENSION_pop_free(s->tlsext_ocsp_exts,
+                                   X509_EXTENSION_free);
+        s->tlsext_ocsp_exts =
+            d2i_X509_EXTENSIONS(NULL, &ext_data, (int)PACKET_remaining(&exts));
+        if (s->tlsext_ocsp_exts == NULL || ext_data != PACKET_end(&exts)) {
+            *al = SSL_AD_DECODE_ERROR;
+            return 0;
+        }
     }
 
     return 1;
@@ -310,40 +309,38 @@
 #endif
 
 #ifndef OPENSSL_NO_NEXTPROTONEG
-int tls_parse_client_npn(SSL *s, PACKET *pkt, int *al)
+int tls_parse_ctos_npn(SSL *s, PACKET *pkt, int *al)
 {
-    if (s->s3->tmp.finish_md_len == 0) {
-        /*-
-         * We shouldn't accept this extension on a
-         * renegotiation.
-         *
-         * s->new_session will be set on renegotiation, but we
-         * probably shouldn't rely that it couldn't be set on
-         * the initial renegotiation too in certain cases (when
-         * there's some other reason to disallow resuming an
-         * earlier session -- the current code won't be doing
-         * anything like that, but this might change).
-         *
-         * A valid sign that there's been a previous handshake
-         * in this connection is if s->s3->tmp.finish_md_len >
-         * 0.  (We are talking about a check that will happen
-         * in the Hello protocol round, well before a new
-         * Finished message could have been computed.)
-         */
+    /*
+     * We shouldn't accept this extension on a
+     * renegotiation.
+     *
+     * s->new_session will be set on renegotiation, but we
+     * probably shouldn't rely that it couldn't be set on
+     * the initial renegotiation too in certain cases (when
+     * there's some other reason to disallow resuming an
+     * earlier session -- the current code won't be doing
+     * anything like that, but this might change).
+     *
+     * A valid sign that there's been a previous handshake
+     * in this connection is if s->s3->tmp.finish_md_len >
+     * 0.  (We are talking about a check that will happen
+     * in the Hello protocol round, well before a new
+     * Finished message could have been computed.)
+     */
+    if (s->s3->tmp.finish_md_len == 0)
         s->s3->next_proto_neg_seen = 1;
-    }
 
     return 1;
 }
 #endif
 
 /*
- * Save the ALPN extension in a ClientHello.
- * pkt: the contents of the ALPN extension, not including type and length.
- * al: a pointer to the  alert value to send in the event of a failure.
- * returns: 1 on success, 0 on error.
+ * Save the ALPN extension in a ClientHello.|pkt| holds the contents of the ALPN
+ * extension, not including type and length. |al| is a pointer to the alert
+ * value to send in the event of a failure. Returns: 1 on success, 0 on error.
  */
-int tls_parse_client_alpn(SSL *s, PACKET *pkt, int *al)
+int tls_parse_ctos_alpn(SSL *s, PACKET *pkt, int *al)
 {
     PACKET protocol_list, save_protocol_list, protocol;
 
@@ -376,9 +373,8 @@
 }
 
 #ifndef OPENSSL_NO_SRTP
-int tls_parse_client_use_srtp(SSL *s, PACKET *pkt, int *al)
+int tls_parse_ctos_use_srtp(SSL *s, PACKET *pkt, int *al)
 {
-    SRTP_PROTECTION_PROFILE *sprof;
     STACK_OF(SRTP_PROTECTION_PROFILE) *srvr;
     unsigned int ct, mki_len, id;
     int i, srtp_pref;
@@ -389,8 +385,8 @@
         return 1;
 
     /* Pull off the length of the cipher suite list  and check it is even */
-    if (!PACKET_get_net_2(pkt, &ct)
-        || (ct & 1) != 0 || !PACKET_get_sub_packet(pkt, &subpkt, ct)) {
+    if (!PACKET_get_net_2(pkt, &ct) || (ct & 1) != 0
+            || !PACKET_get_sub_packet(pkt, &subpkt, ct)) {
         SSLerr(SSL_F_TLS_PARSE_CLIENT_USE_SRTP,
                SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST);
         *al = SSL_AD_DECODE_ERROR;
@@ -417,7 +413,9 @@
          * does nothing.
          */
         for (i = 0; i < srtp_pref; i++) {
-            sprof = sk_SRTP_PROTECTION_PROFILE_value(srvr, i);
+            const SRTP_PROTECTION_PROFILE *sprof =
+                sk_SRTP_PROTECTION_PROFILE_value(srvr, i);
+
             if (sprof->id == id) {
                 s->srtp_profile = sprof;
                 srtp_pref = i;
@@ -426,9 +424,7 @@
         }
     }
 
-    /*
-     * Now extract the MKI value as a sanity check, but discard it for now
-     */
+    /* Now extract the MKI value as a sanity check, but discard it for now */
     if (!PACKET_get_1(pkt, &mki_len)) {
         SSLerr(SSL_F_TLS_PARSE_CLIENT_USE_SRTP,
                SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST);
@@ -447,7 +443,7 @@
 }
 #endif
 
-int tls_parse_client_etm(SSL *s, PACKET *pkt, int *al)
+int tls_parse_ctos_etm(SSL *s, PACKET *pkt, int *al)
 {
     if (!(s->options & SSL_OP_NO_ENCRYPT_THEN_MAC))
         s->s3->flags |= TLS1_FLAGS_ENCRYPT_THEN_MAC;
@@ -474,8 +470,8 @@
         unsigned int share_id = (groups[0] << 8) | (groups[1]);
 
         if (group_id == share_id
-                && (!checkallow || tls_curve_allowed(s, groups,
-                                                     SSL_SECOP_CURVE_CHECK))) {
+                && (!checkallow
+                    || tls_curve_allowed(s, groups, SSL_SECOP_CURVE_CHECK))) {
             break;
         }
     }
@@ -489,7 +485,7 @@
  * the raw PACKET data for the extension. Returns 1 on success or 0 on failure.
  * If a failure occurs then |*al| is set to an appropriate alert value.
  */
-int tls_parse_client_key_share(SSL *s, PACKET *pkt, int *al)
+int tls_parse_ctos_key_share(SSL *s, PACKET *pkt, int *al)
 {
     unsigned int group_id;
     PACKET key_share_list, encoded_pt;
@@ -585,6 +581,7 @@
         } else {
             /* Set up EVP_PKEY with named curve as parameters */
             EVP_PKEY_CTX *pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL);
+
             if (pctx == NULL
                     || EVP_PKEY_paramgen_init(pctx) <= 0
                     || EVP_PKEY_CTX_set_ec_paramgen_curve_nid(pctx,
@@ -615,7 +612,7 @@
 }
 
 #ifndef OPENSSL_NO_EC
-int tls_parse_client_supported_groups(SSL *s, PACKET *pkt, int *al)
+int tls_parse_ctos_supported_groups(SSL *s, PACKET *pkt, int *al)
 {
     PACKET supported_groups_list;
 
@@ -639,7 +636,7 @@
 }
 #endif
 
-int tls_parse_client_ems(SSL *s, PACKET *pkt, int *al)
+int tls_parse_ctos_ems(SSL *s, PACKET *pkt, int *al)
 {
     /* The extension must always be empty */
     if (PACKET_remaining(pkt) != 0) {
@@ -652,8 +649,10 @@
     return 1;
 }
 
-/* Add the server's renegotiation binding */
-int tls_construct_server_renegotiate(SSL *s, WPACKET *pkt, int *al)
+/*
+ * Add the server's renegotiation binding
+ */
+int tls_construct_stoc_renegotiate(SSL *s, WPACKET *pkt, int *al)
 {
     if (!s->s3->send_connection_binding)
         return 1;
@@ -674,7 +673,7 @@
     return 1;
 }
 
-int tls_construct_server_server_name(SSL *s, WPACKET *pkt, int *al)
+int tls_construct_stoc_server_name(SSL *s, WPACKET *pkt, int *al)
 {
     if (s->hit || s->servername_done != 1
             || s->session->tlsext_hostname == NULL)
@@ -690,7 +689,7 @@
 }
 
 #ifndef OPENSSL_NO_EC
-int tls_construct_server_ec_pt_formats(SSL *s, WPACKET *pkt, int *al)
+int tls_construct_stoc_ec_pt_formats(SSL *s, WPACKET *pkt, int *al)
 {
     unsigned long alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
     unsigned long alg_a = s->s3->tmp.new_cipher->algorithm_auth;
@@ -703,7 +702,6 @@
         return 1;
 
     tls1_get_formatlist(s, &plist, &plistlen);
-
     if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_ec_point_formats)
             || !WPACKET_start_sub_packet_u16(pkt)
             || !WPACKET_sub_memcpy_u8(pkt, plist, plistlen)
@@ -716,7 +714,7 @@
 }
 #endif
 
-int tls_construct_server_session_ticket(SSL *s, WPACKET *pkt, int *al)
+int tls_construct_stoc_session_ticket(SSL *s, WPACKET *pkt, int *al)
 {
     if (!s->tlsext_ticket_expected || !tls_use_ticket(s)) {
         s->tlsext_ticket_expected = 0;
@@ -733,7 +731,7 @@
 }
 
 #ifndef OPENSSL_NO_OCSP
-int tls_construct_server_status_request(SSL *s, WPACKET *pkt, int *al)
+int tls_construct_stoc_status_request(SSL *s, WPACKET *pkt, int *al)
 {
     if (!s->tlsext_status_expected)
         return 1;
@@ -750,7 +748,7 @@
 
 
 #ifndef OPENSSL_NO_NEXTPROTONEG
-int tls_construct_server_next_proto_neg(SSL *s, WPACKET *pkt, int *al)
+int tls_construct_stoc_next_proto_neg(SSL *s, WPACKET *pkt, int *al)
 {
     const unsigned char *npa;
     unsigned int npalen;
@@ -777,7 +775,7 @@
 }
 #endif
 
-int tls_construct_server_alpn(SSL *s, WPACKET *pkt, int *al)
+int tls_construct_stoc_alpn(SSL *s, WPACKET *pkt, int *al)
 {
     if (s->s3->alpn_selected == NULL)
         return 1;
@@ -798,7 +796,7 @@
 }
 
 #ifndef OPENSSL_NO_SRTP
-int tls_construct_server_use_srtp(SSL *s, WPACKET *pkt, int *al)
+int tls_construct_stoc_use_srtp(SSL *s, WPACKET *pkt, int *al)
 {
     if (s->srtp_profile == NULL)
         return 1;
@@ -817,7 +815,7 @@
 }
 #endif
 
-int tls_construct_server_etm(SSL *s, WPACKET *pkt, int *al)
+int tls_construct_stoc_etm(SSL *s, WPACKET *pkt, int *al)
 {
     if ((s->s3->flags & TLS1_FLAGS_ENCRYPT_THEN_MAC) == 0)
         return 1;
@@ -843,7 +841,7 @@
     return 1;
 }
 
-int tls_construct_server_ems(SSL *s, WPACKET *pkt, int *al)
+int tls_construct_stoc_ems(SSL *s, WPACKET *pkt, int *al)
 {
     if ((s->s3->flags & TLS1_FLAGS_RECEIVED_EXTMS) == 0)
         return 1;
@@ -857,7 +855,7 @@
     return 1;
 }
 
-int tls_construct_server_key_share(SSL *s, WPACKET *pkt, int *al)
+int tls_construct_stoc_key_share(SSL *s, WPACKET *pkt, int *al)
 {
     unsigned char *encodedPoint;
     size_t encoded_pt_len = 0;
@@ -911,7 +909,7 @@
     return 1;
 }
 
-int tls_construct_server_cryptopro_bug(SSL *s, WPACKET *pkt, int *al)
+int tls_construct_stoc_cryptopro_bug(SSL *s, WPACKET *pkt, int *al)
 {
     const unsigned char cryptopro_ext[36] = {
         0xfd, 0xe8,         /* 65000 */
diff --git a/ssl/statem/statem_clnt.c b/ssl/statem/statem_clnt.c
index 38b8ecb..7017615 100644
--- a/ssl/statem/statem_clnt.c
+++ b/ssl/statem/statem_clnt.c
@@ -1132,7 +1132,7 @@
      * server wants to resume.
      */
     if (s->version >= TLS1_VERSION && !SSL_IS_TLS13(s)
-            && s->tls_session_secret_cb && s->session->tlsext_tick) {
+            && s->tls_session_secret_cb != NULL && s->session->tlsext_tick) {
         const SSL_CIPHER *pref_cipher = NULL;
         /*
          * s->session->master_key_length is a size_t, but this is an int for
@@ -3112,10 +3112,11 @@
      */
     if (!tls_collect_extensions(s, &extensions,
                                 EXT_TLS1_3_ENCRYPTED_EXTENSIONS
-                                | EXT_TLS1_3_CERTIFICATE, &rawexts, &al)
+                                    | EXT_TLS1_3_CERTIFICATE,
+                                &rawexts, &al)
             || !tls_parse_all_extensions(s,
                                          EXT_TLS1_3_ENCRYPTED_EXTENSIONS
-                                         | EXT_TLS1_3_CERTIFICATE,
+                                            | EXT_TLS1_3_CERTIFICATE,
                                          rawexts, &al))
         goto err;
 
diff --git a/ssl/statem/statem_locl.h b/ssl/statem/statem_locl.h
index b0c77ce..9d9c1a9 100644
--- a/ssl/statem/statem_locl.h
+++ b/ssl/statem/statem_locl.h
@@ -163,106 +163,106 @@
                                     int *al);
 
 /* Server Extension processing */
-int tls_parse_client_renegotiate(SSL *s, PACKET *pkt, int *al);
-int tls_parse_client_server_name(SSL *s, PACKET *pkt, int *al);
+int tls_parse_ctos_renegotiate(SSL *s, PACKET *pkt, int *al);
+int tls_parse_ctos_server_name(SSL *s, PACKET *pkt, int *al);
 #ifndef OPENSSL_NO_SRP
-int tls_parse_client_srp(SSL *s, PACKET *pkt, int *al);
+int tls_parse_ctos_srp(SSL *s, PACKET *pkt, int *al);
 #endif
 #ifndef OPENSSL_NO_EC
-int tls_parse_client_ec_pt_formats(SSL *s, PACKET *pkt, int *al);
-int tls_parse_client_supported_groups(SSL *s, PACKET *pkt, int *al);
+int tls_parse_ctos_ec_pt_formats(SSL *s, PACKET *pkt, int *al);
+int tls_parse_ctos_supported_groups(SSL *s, PACKET *pkt, int *al);
 #endif
-int tls_parse_client_session_ticket(SSL *s, PACKET *pkt, int *al);
-int tls_parse_client_sig_algs(SSL *s, PACKET *pkt, int *al);
+int tls_parse_ctos_session_ticket(SSL *s, PACKET *pkt, int *al);
+int tls_parse_ctos_sig_algs(SSL *s, PACKET *pkt, int *al);
 #ifndef OPENSSL_NO_OCSP
-int tls_parse_client_status_request(SSL *s, PACKET *pkt, int *al);
+int tls_parse_ctos_status_request(SSL *s, PACKET *pkt, int *al);
 #endif
 #ifndef OPENSSL_NO_NEXTPROTONEG
-int tls_parse_client_npn(SSL *s, PACKET *pkt, int *al);
+int tls_parse_ctos_npn(SSL *s, PACKET *pkt, int *al);
 #endif
-int tls_parse_client_alpn(SSL *s, PACKET *pkt, int *al);
+int tls_parse_ctos_alpn(SSL *s, PACKET *pkt, int *al);
 #ifndef OPENSSL_NO_SRTP
-int tls_parse_client_use_srtp(SSL *s, PACKET *pkt, int *al);
+int tls_parse_ctos_use_srtp(SSL *s, PACKET *pkt, int *al);
 #endif
-int tls_parse_client_etm(SSL *s, PACKET *pkt, int *al);
-int tls_parse_client_key_share(SSL *s, PACKET *pkt, int *al);
-int tls_parse_client_ems(SSL *s, PACKET *pkt, int *al);
+int tls_parse_ctos_etm(SSL *s, PACKET *pkt, int *al);
+int tls_parse_ctos_key_share(SSL *s, PACKET *pkt, int *al);
+int tls_parse_ctos_ems(SSL *s, PACKET *pkt, int *al);
 
-int tls_construct_server_renegotiate(SSL *s, WPACKET *pkt, int *al);
-int tls_construct_server_server_name(SSL *s, WPACKET *pkt, int *al);
+int tls_construct_stoc_renegotiate(SSL *s, WPACKET *pkt, int *al);
+int tls_construct_stoc_server_name(SSL *s, WPACKET *pkt, int *al);
 #ifndef OPENSSL_NO_EC
-int tls_construct_server_ec_pt_formats(SSL *s, WPACKET *pkt, int *al);
+int tls_construct_stoc_ec_pt_formats(SSL *s, WPACKET *pkt, int *al);
 #endif
-int tls_construct_server_session_ticket(SSL *s, WPACKET *pkt, int *al);
+int tls_construct_stoc_session_ticket(SSL *s, WPACKET *pkt, int *al);
 #ifndef OPENSSL_NO_OCSP
-int tls_construct_server_status_request(SSL *s, WPACKET *pkt, int *al);
+int tls_construct_stoc_status_request(SSL *s, WPACKET *pkt, int *al);
 #endif
 #ifndef OPENSSL_NO_NEXTPROTONEG
-int tls_construct_server_next_proto_neg(SSL *s, WPACKET *pkt, int *al);
+int tls_construct_stoc_next_proto_neg(SSL *s, WPACKET *pkt, int *al);
 #endif
-int tls_construct_server_alpn(SSL *s, WPACKET *pkt, int *al);
+int tls_construct_stoc_alpn(SSL *s, WPACKET *pkt, int *al);
 #ifndef OPENSSL_NO_SRTP
-int tls_construct_server_use_srtp(SSL *s, WPACKET *pkt, int *al);
+int tls_construct_stoc_use_srtp(SSL *s, WPACKET *pkt, int *al);
 #endif
-int tls_construct_server_etm(SSL *s, WPACKET *pkt, int *al);
-int tls_construct_server_ems(SSL *s, WPACKET *pkt, int *al);
-int tls_construct_server_key_share(SSL *s, WPACKET *pkt, int *al);
+int tls_construct_stoc_etm(SSL *s, WPACKET *pkt, int *al);
+int tls_construct_stoc_ems(SSL *s, WPACKET *pkt, int *al);
+int tls_construct_stoc_key_share(SSL *s, WPACKET *pkt, int *al);
 /*
  * Not in public headers as this is not an official extension. Only used when
  * SSL_OP_CRYPTOPRO_TLSEXT_BUG is set.
  */
 #define TLSEXT_TYPE_cryptopro_bug      0xfde8
-int tls_construct_server_cryptopro_bug(SSL *s, WPACKET *pkt, int *al);
+int tls_construct_stoc_cryptopro_bug(SSL *s, WPACKET *pkt, int *al);
 
 /* Client Extension processing */
-int tls_construct_client_renegotiate(SSL *s, WPACKET *pkt, int *al);
-int tls_construct_client_server_name(SSL *s, WPACKET *pkt, int *al);
+int tls_construct_ctos_renegotiate(SSL *s, WPACKET *pkt, int *al);
+int tls_construct_ctos_server_name(SSL *s, WPACKET *pkt, int *al);
 #ifndef OPENSSL_NO_SRP
-int tls_construct_client_srp(SSL *s, WPACKET *pkt, int *al);
+int tls_construct_ctos_srp(SSL *s, WPACKET *pkt, int *al);
 #endif
 #ifndef OPENSSL_NO_EC
-int tls_construct_client_ec_pt_formats(SSL *s, WPACKET *pkt, int *al);
-int tls_construct_client_supported_groups(SSL *s, WPACKET *pkt, int *al);
+int tls_construct_ctos_ec_pt_formats(SSL *s, WPACKET *pkt, int *al);
+int tls_construct_ctos_supported_groups(SSL *s, WPACKET *pkt, int *al);
 #endif
-int tls_construct_client_session_ticket(SSL *s, WPACKET *pkt, int *al);
-int tls_construct_client_sig_algs(SSL *s, WPACKET *pkt, int *al);
+int tls_construct_ctos_session_ticket(SSL *s, WPACKET *pkt, int *al);
+int tls_construct_ctos_sig_algs(SSL *s, WPACKET *pkt, int *al);
 #ifndef OPENSSL_NO_OCSP
-int tls_construct_client_status_request(SSL *s, WPACKET *pkt, int *al);
+int tls_construct_ctos_status_request(SSL *s, WPACKET *pkt, int *al);
 #endif
 #ifndef OPENSSL_NO_NEXTPROTONEG
-int tls_construct_client_npn(SSL *s, WPACKET *pkt, int *al);
+int tls_construct_ctos_npn(SSL *s, WPACKET *pkt, int *al);
 #endif
-int tls_construct_client_alpn(SSL *s, WPACKET *pkt, int *al);
+int tls_construct_ctos_alpn(SSL *s, WPACKET *pkt, int *al);
 #ifndef OPENSSL_NO_SRTP
-int tls_construct_client_use_srtp(SSL *s, WPACKET *pkt, int *al);
+int tls_construct_ctos_use_srtp(SSL *s, WPACKET *pkt, int *al);
 #endif
-int tls_construct_client_etm(SSL *s, WPACKET *pkt, int *al);
+int tls_construct_ctos_etm(SSL *s, WPACKET *pkt, int *al);
 #ifndef OPENSSL_NO_CT
-int tls_construct_client_sct(SSL *s, WPACKET *pkt, int *al);
+int tls_construct_ctos_sct(SSL *s, WPACKET *pkt, int *al);
 #endif
-int tls_construct_client_ems(SSL *s, WPACKET *pkt, int *al);
-int tls_construct_client_supported_versions(SSL *s, WPACKET *pkt, int *al);
-int tls_construct_client_key_share(SSL *s, WPACKET *pkt, int *al);
-int tls_construct_client_padding(SSL *s, WPACKET *pkt, int *al);
-int tls_parse_server_renegotiate(SSL *s, PACKET *pkt, int *al);
-int tls_parse_server_server_name(SSL *s, PACKET *pkt, int *al);
+int tls_construct_ctos_ems(SSL *s, WPACKET *pkt, int *al);
+int tls_construct_ctos_supported_versions(SSL *s, WPACKET *pkt, int *al);
+int tls_construct_ctos_key_share(SSL *s, WPACKET *pkt, int *al);
+int tls_construct_ctos_padding(SSL *s, WPACKET *pkt, int *al);
+int tls_parse_stoc_renegotiate(SSL *s, PACKET *pkt, int *al);
+int tls_parse_stoc_server_name(SSL *s, PACKET *pkt, int *al);
 #ifndef OPENSSL_NO_EC
-int tls_parse_server_ec_pt_formats(SSL *s, PACKET *pkt, int *al);
+int tls_parse_stoc_ec_pt_formats(SSL *s, PACKET *pkt, int *al);
 #endif
-int tls_parse_server_session_ticket(SSL *s, PACKET *pkt, int *al);
+int tls_parse_stoc_session_ticket(SSL *s, PACKET *pkt, int *al);
 #ifndef OPENSSL_NO_OCSP
-int tls_parse_server_status_request(SSL *s, PACKET *pkt, int *al);
+int tls_parse_stoc_status_request(SSL *s, PACKET *pkt, int *al);
 #endif
 #ifndef OPENSSL_NO_CT
-int tls_parse_server_sct(SSL *s, PACKET *pkt, int *al);
+int tls_parse_stoc_sct(SSL *s, PACKET *pkt, int *al);
 #endif
 #ifndef OPENSSL_NO_NEXTPROTONEG
-int tls_parse_server_npn(SSL *s, PACKET *pkt, int *al);
+int tls_parse_stoc_npn(SSL *s, PACKET *pkt, int *al);
 #endif
-int tls_parse_server_alpn(SSL *s, PACKET *pkt, int *al);
+int tls_parse_stoc_alpn(SSL *s, PACKET *pkt, int *al);
 #ifndef OPENSSL_NO_SRTP
-int tls_parse_server_use_srtp(SSL *s, PACKET *pkt, int *al);
+int tls_parse_stoc_use_srtp(SSL *s, PACKET *pkt, int *al);
 #endif
-int tls_parse_server_etm(SSL *s, PACKET *pkt, int *al);
-int tls_parse_server_ems(SSL *s, PACKET *pkt, int *al);
-int tls_parse_server_key_share(SSL *s, PACKET *pkt, int *al);
+int tls_parse_stoc_etm(SSL *s, PACKET *pkt, int *al);
+int tls_parse_stoc_ems(SSL *s, PACKET *pkt, int *al);
+int tls_parse_stoc_key_share(SSL *s, PACKET *pkt, int *al);
diff --git a/ssl/statem/statem_srvr.c b/ssl/statem/statem_srvr.c
index d40141d..12d1670 100644
--- a/ssl/statem/statem_srvr.c
+++ b/ssl/statem/statem_srvr.c
@@ -1078,10 +1078,6 @@
  */
 static void ssl_check_for_safari(SSL *s, const CLIENTHELLO_MSG *hello)
 {
-    unsigned int type;
-    PACKET sni, tmppkt;
-    size_t ext_len;
-
     static const unsigned char kSafariExtensionsBlock[] = {
         0x00, 0x0a,             /* elliptic_curves extension */
         0x00, 0x08,             /* 8 bytes */
@@ -1104,9 +1100,11 @@
         0x04, 0x03,             /* SHA-256/ECDSA */
         0x02, 0x03,             /* SHA-1/ECDSA */
     };
-
     /* Length of the common prefix (first two extensions). */
     static const size_t kSafariCommonExtensionsLength = 18;
+    unsigned int type;
+    PACKET sni, tmppkt;
+    size_t ext_len;
 
     tmppkt = hello->extensions;
 
@@ -1694,7 +1692,7 @@
 
 /*
  * Call the status request callback if needed. Upon success, returns 1.
- * Upon failure, returns 0 and sets |al| to the appropriate fatal alert.
+ * Upon failure, returns 0 and sets |*al| to the appropriate fatal alert.
  */
 static int tls_handle_status_request(SSL *s, int *al)
 {
@@ -1706,10 +1704,11 @@
      * and must be called after the cipher has been chosen because this may
      * influence which certificate is sent
      */
-    if ((s->tlsext_status_type != -1) && s->ctx && s->ctx->tlsext_status_cb) {
+    if (s->tlsext_status_type != -1 && s->ctx != NULL
+            && s->ctx->tlsext_status_cb != NULL) {
         int ret;
-        CERT_PKEY *certpkey;
-        certpkey = ssl_get_server_send_pkey(s);
+        CERT_PKEY *certpkey = ssl_get_server_send_pkey(s);
+
         /* If no certificate can't return certificate status */
         if (certpkey != NULL) {
             /*
@@ -1912,8 +1911,8 @@
                 && !WPACKET_put_bytes_u8(pkt, compm))
             || !tls_construct_extensions(s, pkt,
                                          SSL_IS_TLS13(s)
-                                         ? EXT_TLS1_3_SERVER_HELLO
-                                         : EXT_TLS1_2_SERVER_HELLO, &al)) {
+                                            ? EXT_TLS1_3_SERVER_HELLO
+                                            : EXT_TLS1_2_SERVER_HELLO, &al)) {
         SSLerr(SSL_F_TLS_CONSTRUCT_SERVER_HELLO, ERR_R_INTERNAL_ERROR);
         goto err;
     }
diff --git a/ssl/t1_trce.c b/ssl/t1_trce.c
index 948931d..796759e 100644
--- a/ssl/t1_trce.c
+++ b/ssl/t1_trce.c
@@ -593,6 +593,7 @@
                              unsigned int *version)
 {
     int vers;
+
     if (*pmsglen < 2)
         return 0;
     vers = ((*pmsg)[0] << 8) | (*pmsg)[1];
@@ -867,6 +868,7 @@
 {
     unsigned int cs;
     unsigned int vers;
+
     if (!ssl_print_version(bio, indent, "server_version", &msg, &msglen, &vers))
         return 0;
     if (!ssl_print_random(bio, indent, &msg, &msglen))
