diff --git a/ssl/s3_enc.c b/ssl/s3_enc.c
index d478925..9209278 100644
--- a/ssl/s3_enc.c
+++ b/ssl/s3_enc.c
@@ -144,759 +144,738 @@
 
 #include "ssl_locl.h"
 
-static const uint8_t ssl3_pad_1[48]={
-	0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
-	0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
-	0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
-	0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
-	0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,
-	0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36 };
 
-static const uint8_t ssl3_pad_2[48]={
-	0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,
-	0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,
-	0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,
-	0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,
-	0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,
-	0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c,0x5c };
-static int ssl3_handshake_mac(SSL *s, int md_nid,
-	const char *sender, int len, unsigned char *p);
-static int ssl3_generate_key_block(SSL *s, unsigned char *km, int num)
-	{
-	EVP_MD_CTX m5;
-	EVP_MD_CTX s1;
-	unsigned char buf[16],smd[SHA_DIGEST_LENGTH];
-	unsigned char c='A';
-	unsigned int i,j,k;
+static const uint8_t ssl3_pad_1[48] = {
+    0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
+    0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
+    0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
+    0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
+};
 
-	k=0;
-	EVP_MD_CTX_init(&m5);
-	EVP_MD_CTX_init(&s1);
-	for (i=0; (int)i<num; i+=MD5_DIGEST_LENGTH)
-		{
-		k++;
-		if (k > sizeof buf)
-			{
-			/* bug: 'buf' is too small for this ciphersuite */
-			OPENSSL_PUT_ERROR(SSL, ssl3_generate_key_block, ERR_R_INTERNAL_ERROR);
-			return 0;
-			}
-		
-		for (j=0; j<k; j++)
-			buf[j]=c;
-		c++;
-		if (!EVP_DigestInit_ex(&s1,EVP_sha1(), NULL))
-			{
-			OPENSSL_PUT_ERROR(SSL, ssl3_generate_key_block, ERR_LIB_EVP);
-			return 0;
-			}
-		EVP_DigestUpdate(&s1,buf,k);
-		EVP_DigestUpdate(&s1,s->session->master_key,
-			s->session->master_key_length);
-		EVP_DigestUpdate(&s1,s->s3->server_random,SSL3_RANDOM_SIZE);
-		EVP_DigestUpdate(&s1,s->s3->client_random,SSL3_RANDOM_SIZE);
-		EVP_DigestFinal_ex(&s1,smd,NULL);
+static const uint8_t ssl3_pad_2[48] = {
+    0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
+    0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
+    0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
+    0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c, 0x5c,
+};
 
-		if (!EVP_DigestInit_ex(&m5,EVP_md5(), NULL))
-			{
-			OPENSSL_PUT_ERROR(SSL, ssl3_generate_key_block, ERR_LIB_EVP);
-			return 0;
-			}
-		EVP_DigestUpdate(&m5,s->session->master_key,
-			s->session->master_key_length);
-		EVP_DigestUpdate(&m5,smd,SHA_DIGEST_LENGTH);
-		if ((int)(i+MD5_DIGEST_LENGTH) > num)
-			{
-			EVP_DigestFinal_ex(&m5,smd,NULL);
-			memcpy(km,smd,(num-i));
-			}
-		else
-			EVP_DigestFinal_ex(&m5,km,NULL);
+static int ssl3_handshake_mac(SSL *s, int md_nid, const char *sender, int len,
+                              uint8_t *p);
 
-		km+=MD5_DIGEST_LENGTH;
-		}
-	OPENSSL_cleanse(smd,SHA_DIGEST_LENGTH);
-	EVP_MD_CTX_cleanup(&m5);
-	EVP_MD_CTX_cleanup(&s1);
-	return 1;
-	}
+static int ssl3_generate_key_block(SSL *s, uint8_t *km, int num) {
+  EVP_MD_CTX md5;
+  EVP_MD_CTX sha1;
+  uint8_t buf[16], smd[SHA_DIGEST_LENGTH];
+  uint8_t c = 'A';
+  unsigned int i, j, k;
 
-int ssl3_change_cipher_state(SSL *s, int which)
-	{
-	unsigned char *p,*mac_secret;
-	unsigned char exp_key[EVP_MAX_KEY_LENGTH];
-	unsigned char exp_iv[EVP_MAX_IV_LENGTH];
-	unsigned char *ms,*key,*iv;
-	EVP_CIPHER_CTX *dd;
-	const EVP_CIPHER *c;
-	const EVP_MD *m;
-	int n,i,j,k,cl;
-	int reuse_dd = 0;
+  k = 0;
+  EVP_MD_CTX_init(&md5);
+  EVP_MD_CTX_init(&sha1);
+  for (i = 0; (int)i < num; i += MD5_DIGEST_LENGTH) {
+    k++;
+    if (k > sizeof(buf)) {
+      /* bug: 'buf' is too small for this ciphersuite */
+      OPENSSL_PUT_ERROR(SSL, ssl3_generate_key_block, ERR_R_INTERNAL_ERROR);
+      return 0;
+    }
 
-	c=s->s3->tmp.new_sym_enc;
-	m=s->s3->tmp.new_hash;
-	/* m == NULL will lead to a crash later */
-	assert(m);
+    for (j = 0; j < k; j++) {
+      buf[j] = c;
+    }
+    c++;
+    if (!EVP_DigestInit_ex(&sha1, EVP_sha1(), NULL)) {
+      OPENSSL_PUT_ERROR(SSL, ssl3_generate_key_block, ERR_LIB_EVP);
+      return 0;
+    }
+    EVP_DigestUpdate(&sha1, buf, k);
+    EVP_DigestUpdate(&sha1, s->session->master_key,
+                     s->session->master_key_length);
+    EVP_DigestUpdate(&sha1, s->s3->server_random, SSL3_RANDOM_SIZE);
+    EVP_DigestUpdate(&sha1, s->s3->client_random, SSL3_RANDOM_SIZE);
+    EVP_DigestFinal_ex(&sha1, smd, NULL);
 
-	if (which & SSL3_CC_READ)
-		{
-		if (s->enc_read_ctx != NULL)
-			reuse_dd = 1;
-		else if ((s->enc_read_ctx=OPENSSL_malloc(sizeof(EVP_CIPHER_CTX))) == NULL)
-			goto err;
-		else
-			/* make sure it's intialized in case we exit later with an error */
-			EVP_CIPHER_CTX_init(s->enc_read_ctx);
-		dd= s->enc_read_ctx;
+    if (!EVP_DigestInit_ex(&md5, EVP_md5(), NULL)) {
+      OPENSSL_PUT_ERROR(SSL, ssl3_generate_key_block, ERR_LIB_EVP);
+      return 0;
+    }
+    EVP_DigestUpdate(&md5, s->session->master_key,
+                     s->session->master_key_length);
+    EVP_DigestUpdate(&md5, smd, SHA_DIGEST_LENGTH);
+    if ((int)(i + MD5_DIGEST_LENGTH) > num) {
+      EVP_DigestFinal_ex(&md5, smd, NULL);
+      memcpy(km, smd, (num - i));
+    } else {
+      EVP_DigestFinal_ex(&md5, km, NULL);
+    }
 
-		ssl_replace_hash(&s->read_hash,m);
-		memset(&(s->s3->read_sequence[0]),0,8);
-		mac_secret= &(s->s3->read_mac_secret[0]);
-		}
-	else
-		{
-		if (s->enc_write_ctx != NULL)
-			reuse_dd = 1;
-		else if ((s->enc_write_ctx=OPENSSL_malloc(sizeof(EVP_CIPHER_CTX))) == NULL)
-			goto err;
-		else
-			/* make sure it's intialized in case we exit later with an error */
-			EVP_CIPHER_CTX_init(s->enc_write_ctx);
-		dd= s->enc_write_ctx;
-		ssl_replace_hash(&s->write_hash,m);
-		memset(&(s->s3->write_sequence[0]),0,8);
-		mac_secret= &(s->s3->write_mac_secret[0]);
-		}
+    km += MD5_DIGEST_LENGTH;
+  }
 
-	if (reuse_dd)
-		EVP_CIPHER_CTX_cleanup(dd);
+  OPENSSL_cleanse(smd, SHA_DIGEST_LENGTH);
+  EVP_MD_CTX_cleanup(&md5);
+  EVP_MD_CTX_cleanup(&sha1);
 
-	p=s->s3->tmp.key_block;
-	i=EVP_MD_size(m);
-	cl=EVP_CIPHER_key_length(c);
-	j = cl;
-	/* Was j=(is_exp)?5:EVP_CIPHER_key_length(c); */
-	k=EVP_CIPHER_iv_length(c);
-	if (	(which == SSL3_CHANGE_CIPHER_CLIENT_WRITE) ||
-		(which == SSL3_CHANGE_CIPHER_SERVER_READ))
-		{
-		ms=  &(p[ 0]); n=i+i;
-		key= &(p[ n]); n+=j+j;
-		iv=  &(p[ n]); n+=k+k;
-		}
-	else
-		{
-		n=i;
-		ms=  &(p[ n]); n+=i+j;
-		key= &(p[ n]); n+=j+k;
-		iv=  &(p[ n]); n+=k;
-		}
+  return 1;
+}
 
-	if (n > s->s3->tmp.key_block_length)
-		{
-		OPENSSL_PUT_ERROR(SSL, ssl3_change_cipher_state, ERR_R_INTERNAL_ERROR);
-		goto err2;
-		}
+int ssl3_change_cipher_state(SSL *s, int which) {
+  uint8_t *p, *mac_secret;
+  uint8_t exp_key[EVP_MAX_KEY_LENGTH];
+  uint8_t exp_iv[EVP_MAX_IV_LENGTH];
+  uint8_t *ms, *key, *iv;
+  EVP_CIPHER_CTX *dd;
+  const EVP_CIPHER *c;
+  const EVP_MD *m;
+  int n, i, j, k, cl;
+  int reuse_dd = 0;
 
-	memcpy(mac_secret,ms,i);
+  c = s->s3->tmp.new_sym_enc;
+  m = s->s3->tmp.new_hash;
+  /* m == NULL will lead to a crash later */
+  assert(m);
 
-	if (!EVP_CipherInit_ex(dd,c,NULL,key,iv,(which & SSL3_CC_WRITE)))
-		goto err2;
+  if (which & SSL3_CC_READ) {
+    if (s->enc_read_ctx != NULL) {
+      reuse_dd = 1;
+    } else {
+      s->enc_read_ctx = OPENSSL_malloc(sizeof(EVP_CIPHER_CTX));
+      if (s->enc_read_ctx == NULL) {
+        goto err;
+      }
+      EVP_CIPHER_CTX_init(s->enc_read_ctx);
+    }
+    dd = s->enc_read_ctx;
 
-#ifdef OPENSSL_SSL_TRACE_CRYPTO
-	if (s->msg_callback)
-		{
- 
-		int wh = which & SSL3_CC_WRITE ?
-				TLS1_RT_CRYPTO_WRITE : TLS1_RT_CRYPTO_READ;
-		s->msg_callback(2, s->version, wh | TLS1_RT_CRYPTO_MAC,
-						mac_secret, EVP_MD_size(m),
-						s, s->msg_callback_arg);
-		if (c->key_len)
-			s->msg_callback(2, s->version, wh | TLS1_RT_CRYPTO_KEY,
-						key, c->key_len,
-						s, s->msg_callback_arg);
-		if (k)
-			{
-			s->msg_callback(2, s->version, wh | TLS1_RT_CRYPTO_IV,
-						iv, k, s, s->msg_callback_arg);
-			}
-		}
-#endif
+    ssl_replace_hash(&s->read_hash, m);
+    memset(&s->s3->read_sequence[0], 0, 8);
+    mac_secret = &s->s3->read_mac_secret[0];
+  } else {
+    if (s->enc_write_ctx != NULL) {
+      reuse_dd = 1;
+    } else {
+      s->enc_write_ctx = OPENSSL_malloc(sizeof(EVP_CIPHER_CTX));
+      if (s->enc_write_ctx == NULL) {
+        goto err;
+      }
+      EVP_CIPHER_CTX_init(s->enc_write_ctx);
+    }
+    dd = s->enc_write_ctx;
+    ssl_replace_hash(&s->write_hash, m);
+    memset(&s->s3->write_sequence[0], 0, 8);
+    mac_secret = &s->s3->write_mac_secret[0];
+  }
 
-	OPENSSL_cleanse(&(exp_key[0]),sizeof(exp_key));
-	OPENSSL_cleanse(&(exp_iv[0]),sizeof(exp_iv));
-	return(1);
+  if (reuse_dd) {
+    EVP_CIPHER_CTX_cleanup(dd);
+  }
+
+  p = s->s3->tmp.key_block;
+  i = EVP_MD_size(m);
+  cl = EVP_CIPHER_key_length(c);
+  j = cl;
+  k = EVP_CIPHER_iv_length(c);
+  if (which == SSL3_CHANGE_CIPHER_CLIENT_WRITE ||
+      which == SSL3_CHANGE_CIPHER_SERVER_READ) {
+    ms = &(p[0]);
+    n = i + i;
+    key = &(p[n]);
+    n += j + j;
+    iv = &(p[n]);
+    n += k + k;
+  } else {
+    n = i;
+    ms = &(p[n]);
+    n += i + j;
+    key = &(p[n]);
+    n += j + k;
+    iv = &(p[n]);
+    n += k;
+  }
+
+  if (n > s->s3->tmp.key_block_length) {
+    OPENSSL_PUT_ERROR(SSL, ssl3_change_cipher_state, ERR_R_INTERNAL_ERROR);
+    goto err2;
+  }
+
+  memcpy(mac_secret, ms, i);
+
+  if (!EVP_CipherInit_ex(dd, c, NULL, key, iv, (which & SSL3_CC_WRITE))) {
+    goto err2;
+  }
+
+  OPENSSL_cleanse(&exp_key[0], sizeof(exp_key));
+  OPENSSL_cleanse(&exp_iv[0], sizeof(exp_iv));
+  return 1;
+
 err:
-	OPENSSL_PUT_ERROR(SSL, ssl3_change_cipher_state, ERR_R_MALLOC_FAILURE);
+  OPENSSL_PUT_ERROR(SSL, ssl3_change_cipher_state, ERR_R_MALLOC_FAILURE);
 err2:
-	return(0);
-	}
+  return 0;
+}
 
-int ssl3_setup_key_block(SSL *s)
-	{
-	unsigned char *p;
-	const EVP_CIPHER *c;
-	const EVP_MD *hash;
-	size_t num;
-	int ret = 0;
+int ssl3_setup_key_block(SSL *s) {
+  uint8_t *p;
+  const EVP_CIPHER *c;
+  const EVP_MD *hash;
+  size_t num;
+  int ret = 0;
 
-	if (s->s3->tmp.key_block_length != 0)
-		return(1);
+  if (s->s3->tmp.key_block_length != 0) {
+    return 1;
+  }
 
-	if (!ssl_cipher_get_evp(s->session,&c,&hash,NULL,NULL))
-		{
-		OPENSSL_PUT_ERROR(SSL, ssl3_setup_key_block, SSL_R_CIPHER_OR_HASH_UNAVAILABLE);
-		return(0);
-		}
+  if (!ssl_cipher_get_evp(s->session, &c, &hash, NULL, NULL)) {
+    OPENSSL_PUT_ERROR(SSL, ssl3_setup_key_block,
+                      SSL_R_CIPHER_OR_HASH_UNAVAILABLE);
+    return 0;
+  }
 
-	s->s3->tmp.new_sym_enc=c;
-	s->s3->tmp.new_hash=hash;
+  s->s3->tmp.new_sym_enc = c;
+  s->s3->tmp.new_hash = hash;
 
-	num=EVP_MD_size(hash);
+  num = EVP_MD_size(hash);
 
-	num=EVP_CIPHER_key_length(c)+num+EVP_CIPHER_iv_length(c);
-	num*=2;
+  num = EVP_CIPHER_key_length(c) + num + EVP_CIPHER_iv_length(c);
+  num *= 2;
 
-	ssl3_cleanup_key_block(s);
+  ssl3_cleanup_key_block(s);
 
-	if ((p=OPENSSL_malloc(num)) == NULL)
-		goto err;
+  p = OPENSSL_malloc(num);
+  if (p == NULL) {
+    goto err;
+  }
 
-	s->s3->tmp.key_block_length=num;
-	s->s3->tmp.key_block=p;
+  s->s3->tmp.key_block_length = num;
+  s->s3->tmp.key_block = p;
 
-	ret = ssl3_generate_key_block(s,p,num);
+  ret = ssl3_generate_key_block(s, p, num);
 
-	/* enable vulnerability countermeasure for CBC ciphers with
-	 * known-IV problem (http://www.openssl.org/~bodo/tls-cbc.txt) */
-	if ((s->mode & SSL_MODE_CBC_RECORD_SPLITTING) != 0)
-		{
-		s->s3->need_record_splitting = 1;
+  /* enable vulnerability countermeasure for CBC ciphers with known-IV problem
+   * (http://www.openssl.org/~bodo/tls-cbc.txt) */
+  if ((s->mode & SSL_MODE_CBC_RECORD_SPLITTING) != 0) {
+    s->s3->need_record_splitting = 1;
 
-		if (s->session->cipher != NULL)
-			{
-			if (s->session->cipher->algorithm_enc == SSL_RC4)
-				s->s3->need_record_splitting = 0;
-			}
-		}
+    if (s->session->cipher != NULL &&
+        s->session->cipher->algorithm_enc == SSL_RC4) {
+      s->s3->need_record_splitting = 0;
+    }
+  }
 
-	return ret;
+  return ret;
 
 err:
-	OPENSSL_PUT_ERROR(SSL, ssl3_setup_key_block, ERR_R_MALLOC_FAILURE);
-	return(0);
-	}
+  OPENSSL_PUT_ERROR(SSL, ssl3_setup_key_block, ERR_R_MALLOC_FAILURE);
+  return 0;
+}
 
-void ssl3_cleanup_key_block(SSL *s)
-	{
-	if (s->s3->tmp.key_block != NULL)
-		{
-		OPENSSL_cleanse(s->s3->tmp.key_block,
-			s->s3->tmp.key_block_length);
-		OPENSSL_free(s->s3->tmp.key_block);
-		s->s3->tmp.key_block=NULL;
-		}
-	s->s3->tmp.key_block_length=0;
-	}
+void ssl3_cleanup_key_block(SSL *s) {
+  if (s->s3->tmp.key_block != NULL) {
+    OPENSSL_cleanse(s->s3->tmp.key_block, s->s3->tmp.key_block_length);
+    OPENSSL_free(s->s3->tmp.key_block);
+    s->s3->tmp.key_block = NULL;
+  }
+  s->s3->tmp.key_block_length = 0;
+}
 
-/* ssl3_enc encrypts/decrypts the record in |s->wrec| / |s->rrec|, respectively.
+/* ssl3_enc encrypts/decrypts the record in |s->wrec| / |s->rrec|,
+ * respectively.
  *
  * Returns:
  *   0: (in non-constant time) if the record is publically invalid (i.e. too
  *       short etc).
  *   1: if the record's padding is valid / the encryption was successful.
  *   -1: if the record's padding is invalid or, if sending, an internal error
- *       occured.
- */
-int ssl3_enc(SSL *s, int send)
-	{
-	SSL3_RECORD *rec;
-	EVP_CIPHER_CTX *ds;
-	unsigned long l;
-	int bs,i,mac_size=0;
-	const EVP_CIPHER *enc;
+ *       occured. */
+int ssl3_enc(SSL *s, int send) {
+  SSL3_RECORD *rec;
+  EVP_CIPHER_CTX *ds;
+  unsigned long l;
+  int bs, i, mac_size = 0;
+  const EVP_CIPHER *enc = NULL;
 
-	if (send)
-		{
-		ds=s->enc_write_ctx;
-		rec= &(s->s3->wrec);
-		if (s->enc_write_ctx == NULL)
-			enc=NULL;
-		else
-			enc=EVP_CIPHER_CTX_cipher(s->enc_write_ctx);
-		}
-	else
-		{
-		ds=s->enc_read_ctx;
-		rec= &(s->s3->rrec);
-		if (s->enc_read_ctx == NULL)
-			enc=NULL;
-		else
-			enc=EVP_CIPHER_CTX_cipher(s->enc_read_ctx);
-		}
+  if (send) {
+    ds = s->enc_write_ctx;
+    rec = &(s->s3->wrec);
+    if (s->enc_write_ctx != NULL) {
+      enc = EVP_CIPHER_CTX_cipher(s->enc_write_ctx);
+    }
+  } else {
+    ds = s->enc_read_ctx;
+    rec = &(s->s3->rrec);
+    if (s->enc_read_ctx != NULL) {
+      enc = EVP_CIPHER_CTX_cipher(s->enc_read_ctx);
+    }
+  }
 
-	if ((s->session == NULL) || (ds == NULL) ||
-		(enc == NULL))
-		{
-		memmove(rec->data,rec->input,rec->length);
-		rec->input=rec->data;
-		}
-	else
-		{
-		l=rec->length;
-		bs=EVP_CIPHER_block_size(ds->cipher);
+  if (s->session == NULL || ds == NULL || enc == NULL) {
+    memmove(rec->data, rec->input, rec->length);
+    rec->input = rec->data;
+  } else {
+    l = rec->length;
+    bs = EVP_CIPHER_block_size(ds->cipher);
 
-		/* COMPRESS */
+    if (bs != 1 && send) {
+      i = bs - ((int)l % bs);
 
-		if ((bs != 1) && send)
-			{
-			i=bs-((int)l%bs);
+      /* we need to add 'i-1' padding bytes */
+      l += i;
+      /* the last of these zero bytes will be overwritten with the padding
+       * length. */
+      memset(&rec->input[rec->length], 0, i);
+      rec->length += i;
+      rec->input[l - 1] = (i - 1);
+    }
 
-			/* we need to add 'i-1' padding bytes */
-			l+=i;
-			/* the last of these zero bytes will be overwritten
-			 * with the padding length. */
-			memset(&rec->input[rec->length], 0, i);
-			rec->length+=i;
-			rec->input[l-1]=(i-1);
-			}
-		
-		if (!send)
-			{
-			if (l == 0 || l%bs != 0)
-				return 0;
-			/* otherwise, rec->length >= bs */
-			}
-		
-		if (!EVP_Cipher(ds, rec->data, rec->input, l))
-			return -1;
+    if (!send) {
+      if (l == 0 || l % bs != 0) {
+        return 0;
+      }
+      /* otherwise, rec->length >= bs */
+    }
 
-		if (EVP_MD_CTX_md(s->read_hash) != NULL)
-			mac_size = EVP_MD_CTX_size(s->read_hash);
-		if ((bs != 1) && !send)
-			return ssl3_cbc_remove_padding(s, rec, bs, mac_size);
-		}
-	return(1);
-	}
+    if (!EVP_Cipher(ds, rec->data, rec->input, l)) {
+      return -1;
+    }
 
-int ssl3_init_finished_mac(SSL *s)
-	{
-	if (s->s3->handshake_buffer) BIO_free(s->s3->handshake_buffer);
-	if (s->s3->handshake_dgst) ssl3_free_digest_list(s);
-	s->s3->handshake_buffer = BIO_new(BIO_s_mem());
-	if (s->s3->handshake_buffer == NULL) {
-		return 0;
-	}
-	(void)BIO_set_close(s->s3->handshake_buffer,BIO_CLOSE);
+    if (EVP_MD_CTX_md(s->read_hash) != NULL) {
+      mac_size = EVP_MD_CTX_size(s->read_hash);
+    }
+    if (bs != 1 && !send) {
+      return ssl3_cbc_remove_padding(s, rec, bs, mac_size);
+    }
+  }
 
-	return 1;
-	}
+  return 1;
+}
 
-void ssl3_free_digest_list(SSL *s) 
-	{
-	int i;
-	if (!s->s3->handshake_dgst) return;
-	for (i=0;i<SSL_MAX_DIGEST;i++) 
-		{
-		if (s->s3->handshake_dgst[i])
-			EVP_MD_CTX_destroy(s->s3->handshake_dgst[i]);
-		}
-	OPENSSL_free(s->s3->handshake_dgst);
-	s->s3->handshake_dgst=NULL;
-	}	
+int ssl3_init_finished_mac(SSL *s) {
+  if (s->s3->handshake_buffer) {
+    BIO_free(s->s3->handshake_buffer);
+  }
+  if (s->s3->handshake_dgst) {
+    ssl3_free_digest_list(s);
+  }
+  s->s3->handshake_buffer = BIO_new(BIO_s_mem());
+  if (s->s3->handshake_buffer == NULL) {
+    return 0;
+  }
+  BIO_set_close(s->s3->handshake_buffer, BIO_CLOSE);
 
+  return 1;
+}
 
+void ssl3_free_digest_list(SSL *s) {
+  int i;
+  if (!s->s3->handshake_dgst) {
+    return;
+  }
+  for (i = 0; i < SSL_MAX_DIGEST; i++) {
+    if (s->s3->handshake_dgst[i]) {
+      EVP_MD_CTX_destroy(s->s3->handshake_dgst[i]);
+    }
+  }
+  OPENSSL_free(s->s3->handshake_dgst);
+  s->s3->handshake_dgst = NULL;
+}
 
-void ssl3_finish_mac(SSL *s, const unsigned char *buf, int len)
-	{
-	if (s->s3->handshake_buffer)
-		{
-		BIO_write (s->s3->handshake_buffer,(void *)buf,len);
-		} 
-	else 
-		{
-		int i;
-		for (i=0;i< SSL_MAX_DIGEST;i++) 
-			{
-			if (s->s3->handshake_dgst[i]!= NULL)
-			EVP_DigestUpdate(s->s3->handshake_dgst[i],buf,len);
-			}
-		}	
-	}
+void ssl3_finish_mac(SSL *s, const uint8_t *buf, int len) {
+  int i;
 
-int ssl3_digest_cached_records(SSL *s, enum should_free_handshake_buffer_t should_free_handshake_buffer)
-	{
-	int i;
-	long mask;
-	const EVP_MD *md;
-	const uint8_t *hdata;
-	size_t hdatalen;
+  if (s->s3->handshake_buffer) {
+    BIO_write(s->s3->handshake_buffer, (void *)buf, len);
+    return;
+  }
 
-	/* Allocate handshake_dgst array */
-	ssl3_free_digest_list(s);
-	s->s3->handshake_dgst = OPENSSL_malloc(SSL_MAX_DIGEST * sizeof(EVP_MD_CTX *));
-	if (s->s3->handshake_dgst == NULL)
-		{
-		OPENSSL_PUT_ERROR(SSL, ssl3_digest_cached_records, ERR_R_MALLOC_FAILURE);
-		return 0;
-		}
+  for (i = 0; i < SSL_MAX_DIGEST; i++) {
+    if (s->s3->handshake_dgst[i] != NULL) {
+      EVP_DigestUpdate(s->s3->handshake_dgst[i], buf, len);
+    }
+  }
+}
 
-	memset(s->s3->handshake_dgst,0,SSL_MAX_DIGEST *sizeof(EVP_MD_CTX *));
-	if (!BIO_mem_contents(s->s3->handshake_buffer, &hdata, &hdatalen))
-		{
-		OPENSSL_PUT_ERROR(SSL, ssl3_digest_cached_records, SSL_R_BAD_HANDSHAKE_LENGTH);
-		return 0;
-		}
+int ssl3_digest_cached_records(
+    SSL *s, enum should_free_handshake_buffer_t should_free_handshake_buffer) {
+  int i;
+  long mask;
+  const EVP_MD *md;
+  const uint8_t *hdata;
+  size_t hdatalen;
 
-	/* Loop through bitso of algorithm2 field and create MD_CTX-es */
-	for (i=0;ssl_get_handshake_digest(i,&mask,&md); i++) 
-		{
-		if ((mask & ssl_get_algorithm2(s)) && md) 
-			{
-			s->s3->handshake_dgst[i] = EVP_MD_CTX_create();
-			if (s->s3->handshake_dgst[i] == NULL)
-				{
-				OPENSSL_PUT_ERROR(SSL, ssl3_digest_cached_records, ERR_LIB_EVP);
-				return 0;
-				}
-			if (!EVP_DigestInit_ex(s->s3->handshake_dgst[i], md, NULL))
-				{
-				EVP_MD_CTX_destroy(s->s3->handshake_dgst[i]);
-				s->s3->handshake_dgst[i] = NULL;
-				OPENSSL_PUT_ERROR(SSL, ssl3_digest_cached_records, ERR_LIB_EVP);
-				return 0;
-				}
-			EVP_DigestUpdate(s->s3->handshake_dgst[i],hdata,hdatalen);
-			} 
-		else 
-			{	
-			s->s3->handshake_dgst[i]=NULL;
-			}
-		}
+  /* Allocate handshake_dgst array */
+  ssl3_free_digest_list(s);
+  s->s3->handshake_dgst = OPENSSL_malloc(SSL_MAX_DIGEST * sizeof(EVP_MD_CTX *));
+  if (s->s3->handshake_dgst == NULL) {
+    OPENSSL_PUT_ERROR(SSL, ssl3_digest_cached_records, ERR_R_MALLOC_FAILURE);
+    return 0;
+  }
 
-	if (should_free_handshake_buffer == free_handshake_buffer)
-		{
-		/* Free handshake_buffer BIO */
-		BIO_free(s->s3->handshake_buffer);
-		s->s3->handshake_buffer = NULL;
-		}
+  memset(s->s3->handshake_dgst, 0, SSL_MAX_DIGEST * sizeof(EVP_MD_CTX *));
+  if (!BIO_mem_contents(s->s3->handshake_buffer, &hdata, &hdatalen)) {
+    OPENSSL_PUT_ERROR(SSL, ssl3_digest_cached_records,
+                      SSL_R_BAD_HANDSHAKE_LENGTH);
+    return 0;
+  }
 
-	return 1;
-	}
+  /* Loop through bits of algorithm2 field and create MD_CTX-es */
+  for (i = 0; ssl_get_handshake_digest(i, &mask, &md); i++) {
+    if ((mask & ssl_get_algorithm2(s)) && md) {
+      s->s3->handshake_dgst[i] = EVP_MD_CTX_create();
+      if (s->s3->handshake_dgst[i] == NULL) {
+        OPENSSL_PUT_ERROR(SSL, ssl3_digest_cached_records, ERR_LIB_EVP);
+        return 0;
+      }
+      if (!EVP_DigestInit_ex(s->s3->handshake_dgst[i], md, NULL)) {
+        EVP_MD_CTX_destroy(s->s3->handshake_dgst[i]);
+        s->s3->handshake_dgst[i] = NULL;
+        OPENSSL_PUT_ERROR(SSL, ssl3_digest_cached_records, ERR_LIB_EVP);
+        return 0;
+      }
+      EVP_DigestUpdate(s->s3->handshake_dgst[i], hdata, hdatalen);
+    } else {
+      s->s3->handshake_dgst[i] = NULL;
+    }
+  }
 
-int ssl3_cert_verify_mac(SSL *s, int md_nid, unsigned char *p)
-	{
-	return(ssl3_handshake_mac(s,md_nid,NULL,0,p));
-	}
-int ssl3_final_finish_mac(SSL *s, 
-	     const char *sender, int len, unsigned char *p)
-	{
-	int ret, sha1len;
-	ret=ssl3_handshake_mac(s,NID_md5,sender,len,p);
-	if(ret == 0)
-		return 0;
+  if (should_free_handshake_buffer == free_handshake_buffer) {
+    /* Free handshake_buffer BIO */
+    BIO_free(s->s3->handshake_buffer);
+    s->s3->handshake_buffer = NULL;
+  }
 
-	p+=ret;
+  return 1;
+}
 
-	sha1len=ssl3_handshake_mac(s,NID_sha1,sender,len,p);
-	if(sha1len == 0)
-		return 0;
+int ssl3_cert_verify_mac(SSL *s, int md_nid, uint8_t *p) {
+  return ssl3_handshake_mac(s, md_nid, NULL, 0, p);
+}
 
-	ret+=sha1len;
-	return(ret);
-	}
+int ssl3_final_finish_mac(SSL *s, const char *sender, int len, uint8_t *p) {
+  int ret, sha1len;
+  ret = ssl3_handshake_mac(s, NID_md5, sender, len, p);
+  if (ret == 0) {
+    return 0;
+  }
 
-static int ssl3_handshake_mac(SSL *s, int md_nid,
-	     const char *sender, int len, unsigned char *p)
-	{
-	unsigned int ret;
-	int npad,n;
-	unsigned int i;
-	unsigned char md_buf[EVP_MAX_MD_SIZE];
-	EVP_MD_CTX ctx,*d=NULL;
+  p += ret;
 
-	if (s->s3->handshake_buffer) 
-		if (!ssl3_digest_cached_records(s, free_handshake_buffer))
-			return 0;
+  sha1len = ssl3_handshake_mac(s, NID_sha1, sender, len, p);
+  if (sha1len == 0) {
+    return 0;
+  }
 
-	/* Search for digest of specified type in the handshake_dgst
-	 * array*/
-	for (i=0;i<SSL_MAX_DIGEST;i++) 
-		{
-		  if (s->s3->handshake_dgst[i]&&EVP_MD_CTX_type(s->s3->handshake_dgst[i])==md_nid) 
-		  	{
-		  	d=s->s3->handshake_dgst[i];
-			break;
-			}
-		}
-	if (!d) {
-		OPENSSL_PUT_ERROR(SSL, ssl3_handshake_mac, SSL_R_NO_REQUIRED_DIGEST);
-		return 0;
-	}	
-	EVP_MD_CTX_init(&ctx);
-	if (!EVP_MD_CTX_copy_ex(&ctx,d))
-		{
-		EVP_MD_CTX_cleanup(&ctx);
-		OPENSSL_PUT_ERROR(SSL, ssl3_generate_key_block, ERR_LIB_EVP);
-		return 0;
-		}
-	n=EVP_MD_CTX_size(&ctx);
-	if (n < 0)
-		return 0;
+  ret += sha1len;
+  return ret;
+}
 
-	npad=(48/n)*n;
-	if (sender != NULL)
-		EVP_DigestUpdate(&ctx,sender,len);
-	EVP_DigestUpdate(&ctx,s->session->master_key,
-		s->session->master_key_length);
-	EVP_DigestUpdate(&ctx,ssl3_pad_1,npad);
-	EVP_DigestFinal_ex(&ctx,md_buf,&i);
+static int ssl3_handshake_mac(SSL *s, int md_nid, const char *sender, int len,
+                              uint8_t *p) {
+  unsigned int ret;
+  int npad, n;
+  unsigned int i;
+  uint8_t md_buf[EVP_MAX_MD_SIZE];
+  EVP_MD_CTX ctx, *d = NULL;
 
-	if (!EVP_DigestInit_ex(&ctx,EVP_MD_CTX_md(&ctx), NULL))
-		{
-		EVP_MD_CTX_cleanup(&ctx);
-		OPENSSL_PUT_ERROR(SSL, ssl3_generate_key_block, ERR_LIB_EVP);
-		return 0;
-		}
-	EVP_DigestUpdate(&ctx,s->session->master_key,
-		s->session->master_key_length);
-	EVP_DigestUpdate(&ctx,ssl3_pad_2,npad);
-	EVP_DigestUpdate(&ctx,md_buf,i);
-	EVP_DigestFinal_ex(&ctx,p,&ret);
+  if (s->s3->handshake_buffer &&
+      !ssl3_digest_cached_records(s, free_handshake_buffer)) {
+    return 0;
+  }
 
-	EVP_MD_CTX_cleanup(&ctx);
+  /* Search for digest of specified type in the handshake_dgst array. */
+  for (i = 0; i < SSL_MAX_DIGEST; i++) {
+    if (s->s3->handshake_dgst[i] &&
+        EVP_MD_CTX_type(s->s3->handshake_dgst[i]) == md_nid) {
+      d = s->s3->handshake_dgst[i];
+      break;
+    }
+  }
 
-	return((int)ret);
-	}
+  if (!d) {
+    OPENSSL_PUT_ERROR(SSL, ssl3_handshake_mac, SSL_R_NO_REQUIRED_DIGEST);
+    return 0;
+  }
 
-int n_ssl3_mac(SSL *ssl, unsigned char *md, int send)
-	{
-	SSL3_RECORD *rec;
-	unsigned char *mac_sec,*seq;
-	EVP_MD_CTX md_ctx;
-	const EVP_MD_CTX *hash;
-	unsigned char *p,rec_char;
-	size_t md_size, orig_len;
-	int npad;
-	int t;
+  EVP_MD_CTX_init(&ctx);
+  if (!EVP_MD_CTX_copy_ex(&ctx, d)) {
+    EVP_MD_CTX_cleanup(&ctx);
+    OPENSSL_PUT_ERROR(SSL, ssl3_generate_key_block, ERR_LIB_EVP);
+    return 0;
+  }
 
-	if (send)
-		{
-		rec= &(ssl->s3->wrec);
-		mac_sec= &(ssl->s3->write_mac_secret[0]);
-		seq= &(ssl->s3->write_sequence[0]);
-		hash=ssl->write_hash;
-		}
-	else
-		{
-		rec= &(ssl->s3->rrec);
-		mac_sec= &(ssl->s3->read_mac_secret[0]);
-		seq= &(ssl->s3->read_sequence[0]);
-		hash=ssl->read_hash;
-		}
+  n = EVP_MD_CTX_size(&ctx);
+  if (n < 0) {
+    return 0;
+  }
 
-	t=EVP_MD_CTX_size(hash);
-	if (t < 0 || t > 20)
-		return -1;
-	md_size=t;
-	npad=(48/md_size)*md_size;
+  npad = (48 / n) * n;
+  if (sender != NULL) {
+    EVP_DigestUpdate(&ctx, sender, len);
+  }
+  EVP_DigestUpdate(&ctx, s->session->master_key, s->session->master_key_length);
+  EVP_DigestUpdate(&ctx, ssl3_pad_1, npad);
+  EVP_DigestFinal_ex(&ctx, md_buf, &i);
 
-	/* kludge: ssl3_cbc_remove_padding passes padding length in rec->type */
-	orig_len = rec->length+md_size+((unsigned int)rec->type>>8);
-	rec->type &= 0xff;
+  if (!EVP_DigestInit_ex(&ctx, EVP_MD_CTX_md(&ctx), NULL)) {
+    EVP_MD_CTX_cleanup(&ctx);
+    OPENSSL_PUT_ERROR(SSL, ssl3_generate_key_block, ERR_LIB_EVP);
+    return 0;
+  }
+  EVP_DigestUpdate(&ctx, s->session->master_key, s->session->master_key_length);
+  EVP_DigestUpdate(&ctx, ssl3_pad_2, npad);
+  EVP_DigestUpdate(&ctx, md_buf, i);
+  EVP_DigestFinal_ex(&ctx, p, &ret);
 
-	if (!send &&
-	    EVP_CIPHER_CTX_mode(ssl->enc_read_ctx) == EVP_CIPH_CBC_MODE &&
-	    ssl3_cbc_record_digest_supported(hash))
-		{
-		/* This is a CBC-encrypted record. We must avoid leaking any
-		 * timing-side channel information about how many blocks of
-		 * data we are hashing because that gives an attacker a
-		 * timing-oracle. */
+  EVP_MD_CTX_cleanup(&ctx);
 
-		/* npad is, at most, 48 bytes and that's with MD5:
-		 *   16 + 48 + 8 (sequence bytes) + 1 + 2 = 75.
-		 *
-		 * With SHA-1 (the largest hash speced for SSLv3) the hash size
-		 * goes up 4, but npad goes down by 8, resulting in a smaller
-		 * total size. */
-		unsigned char header[75];
-		unsigned j = 0;
-		memcpy(header+j, mac_sec, md_size);
-		j += md_size;
-		memcpy(header+j, ssl3_pad_1, npad);
-		j += npad;
-		memcpy(header+j, seq, 8);
-		j += 8;
-		header[j++] = rec->type;
-		header[j++] = rec->length >> 8;
-		header[j++] = rec->length & 0xff;
+  return ret;
+}
 
-		if (!ssl3_cbc_digest_record(
-			hash,
-			md, &md_size,
-			header, rec->input,
-			rec->length + md_size, orig_len,
-			mac_sec, md_size,
-			1 /* is SSLv3 */))
-			{
-			return -1;
-			}
-		}
-	else
-		{
-		unsigned int md_size_u;
-		/* Chop the digest off the end :-) */
-		EVP_MD_CTX_init(&md_ctx);
+int n_ssl3_mac(SSL *ssl, uint8_t *md, int send) {
+  SSL3_RECORD *rec;
+  uint8_t *mac_sec, *seq;
+  EVP_MD_CTX md_ctx;
+  const EVP_MD_CTX *hash;
+  uint8_t *p, rec_char;
+  size_t md_size, orig_len;
+  int npad;
+  int t;
 
-		if (!EVP_MD_CTX_copy_ex(&md_ctx,hash))
-			{
-			EVP_MD_CTX_cleanup(&md_ctx);
-			return -1;
-			}
-		EVP_DigestUpdate(&md_ctx,mac_sec,md_size);
-		EVP_DigestUpdate(&md_ctx,ssl3_pad_1,npad);
-		EVP_DigestUpdate(&md_ctx,seq,8);
-		rec_char=rec->type;
-		EVP_DigestUpdate(&md_ctx,&rec_char,1);
-		p=md;
-		s2n(rec->length,p);
-		EVP_DigestUpdate(&md_ctx,md,2);
-		EVP_DigestUpdate(&md_ctx,rec->input,rec->length);
-		EVP_DigestFinal_ex( &md_ctx,md,NULL);
+  if (send) {
+    rec = &ssl->s3->wrec;
+    mac_sec = &ssl->s3->write_mac_secret[0];
+    seq = &ssl->s3->write_sequence[0];
+    hash = ssl->write_hash;
+  } else {
+    rec = &ssl->s3->rrec;
+    mac_sec = &ssl->s3->read_mac_secret[0];
+    seq = &ssl->s3->read_sequence[0];
+    hash = ssl->read_hash;
+  }
 
-		if (!EVP_MD_CTX_copy_ex(&md_ctx,hash))
-			{
-			EVP_MD_CTX_cleanup(&md_ctx);
-			return -1;
-			}
-		EVP_DigestUpdate(&md_ctx,mac_sec,md_size);
-		EVP_DigestUpdate(&md_ctx,ssl3_pad_2,npad);
-		EVP_DigestUpdate(&md_ctx,md,md_size);
-		EVP_DigestFinal_ex( &md_ctx,md,&md_size_u);
-		md_size = md_size_u;
+  t = EVP_MD_CTX_size(hash);
+  if (t < 0 || t > 20) {
+    return -1;
+  }
+  md_size = t;
+  npad = (48 / md_size) * md_size;
 
-		EVP_MD_CTX_cleanup(&md_ctx);
-	}
+  /* kludge: ssl3_cbc_remove_padding passes padding length in rec->type */
+  orig_len = rec->length + md_size + ((unsigned int)rec->type >> 8);
+  rec->type &= 0xff;
 
-	ssl3_record_sequence_update(seq);
-	return(md_size);
-	}
+  if (!send && EVP_CIPHER_CTX_mode(ssl->enc_read_ctx) == EVP_CIPH_CBC_MODE &&
+      ssl3_cbc_record_digest_supported(hash)) {
+    /* This is a CBC-encrypted record. We must avoid leaking any timing-side
+     * channel information about how many blocks of data we are hashing because
+     * that gives an attacker a timing-oracle. */
 
-void ssl3_record_sequence_update(unsigned char *seq)
-	{
-	int i;
+    /* npad is, at most, 48 bytes and that's with MD5:
+     *   16 + 48 + 8 (sequence bytes) + 1 + 2 = 75.
+     *
+     * With SHA-1 (the largest hash speced for SSLv3) the hash size goes up 4,
+     * but npad goes down by 8, resulting in a smaller total size. */
+    uint8_t header[75];
+    unsigned j = 0;
+    memcpy(header + j, mac_sec, md_size);
+    j += md_size;
+    memcpy(header + j, ssl3_pad_1, npad);
+    j += npad;
+    memcpy(header + j, seq, 8);
+    j += 8;
+    header[j++] = rec->type;
+    header[j++] = rec->length >> 8;
+    header[j++] = rec->length & 0xff;
 
-	for (i=7; i>=0; i--)
-		{
-		++seq[i];
-		if (seq[i] != 0) break; 
-		}
-	}
+    if (!ssl3_cbc_digest_record(hash, md, &md_size, header, rec->input,
+                                rec->length + md_size, orig_len, mac_sec,
+                                md_size, 1 /* is SSLv3 */)) {
+      return -1;
+    }
+  } else {
+    unsigned int md_size_u;
+    /* Chop the digest off the end :-) */
+    EVP_MD_CTX_init(&md_ctx);
 
-int ssl3_generate_master_secret(SSL *s, unsigned char *out, unsigned char *p,
-	     int len)
-	{
-	static const unsigned char *salt[3]={
-		(const unsigned char *)"A",
-		(const unsigned char *)"BB",
-		(const unsigned char *)"CCC",
-		};
-	unsigned char buf[EVP_MAX_MD_SIZE];
-	EVP_MD_CTX ctx;
-	int i,ret=0;
-	unsigned int n;
-#ifdef OPENSSL_SSL_TRACE_CRYPTO
-	unsigned char *tmpout = out;
-#endif
+    if (!EVP_MD_CTX_copy_ex(&md_ctx, hash)) {
+      EVP_MD_CTX_cleanup(&md_ctx);
+      return -1;
+    }
+    EVP_DigestUpdate(&md_ctx, mac_sec, md_size);
+    EVP_DigestUpdate(&md_ctx, ssl3_pad_1, npad);
+    EVP_DigestUpdate(&md_ctx, seq, 8);
+    rec_char = rec->type;
+    EVP_DigestUpdate(&md_ctx, &rec_char, 1);
+    p = md;
+    s2n(rec->length, p);
+    EVP_DigestUpdate(&md_ctx, md, 2);
+    EVP_DigestUpdate(&md_ctx, rec->input, rec->length);
+    EVP_DigestFinal_ex(&md_ctx, md, NULL);
 
-	EVP_MD_CTX_init(&ctx);
-	for (i=0; i<3; i++)
-		{
-		if (!EVP_DigestInit_ex(&ctx, EVP_sha1(), NULL))
-			{
-			ret = 0;
-			break;
-			}
+    if (!EVP_MD_CTX_copy_ex(&md_ctx, hash)) {
+      EVP_MD_CTX_cleanup(&md_ctx);
+      return -1;
+    }
+    EVP_DigestUpdate(&md_ctx, mac_sec, md_size);
+    EVP_DigestUpdate(&md_ctx, ssl3_pad_2, npad);
+    EVP_DigestUpdate(&md_ctx, md, md_size);
+    EVP_DigestFinal_ex(&md_ctx, md, &md_size_u);
+    md_size = md_size_u;
 
-		EVP_DigestUpdate(&ctx,salt[i],strlen((const char *)salt[i]));
-		EVP_DigestUpdate(&ctx,p,len);
-		EVP_DigestUpdate(&ctx,&(s->s3->client_random[0]),
-			SSL3_RANDOM_SIZE);
-		EVP_DigestUpdate(&ctx,&(s->s3->server_random[0]),
-			SSL3_RANDOM_SIZE);
-		EVP_DigestFinal_ex(&ctx,buf,&n);
+    EVP_MD_CTX_cleanup(&md_ctx);
+  }
 
-		if (!EVP_DigestInit_ex(&ctx, EVP_md5(), NULL))
-			{
-			ret = 0;
-			break;
-			}
+  ssl3_record_sequence_update(seq);
+  return md_size;
+}
 
-		EVP_DigestUpdate(&ctx,p,len);
-		EVP_DigestUpdate(&ctx,buf,n);
-		EVP_DigestFinal_ex(&ctx,out,&n);
-		out+=n;
-		ret+=n;
-		}
-	EVP_MD_CTX_cleanup(&ctx);
+void ssl3_record_sequence_update(uint8_t *seq) {
+  int i;
 
-#ifdef OPENSSL_SSL_TRACE_CRYPTO
-	if (s->msg_callback)
-		{
-		s->msg_callback(2, s->version, TLS1_RT_CRYPTO_PREMASTER,
-						p, len, s, s->msg_callback_arg);
-		s->msg_callback(2, s->version, TLS1_RT_CRYPTO_CLIENT_RANDOM,
-					s->s3->client_random, SSL3_RANDOM_SIZE,
-						s, s->msg_callback_arg);
-		s->msg_callback(2, s->version, TLS1_RT_CRYPTO_SERVER_RANDOM,
-					s->s3->server_random, SSL3_RANDOM_SIZE,
-					s, s->msg_callback_arg);
-		s->msg_callback(2, s->version, TLS1_RT_CRYPTO_MASTER,
-					tmpout, SSL3_MASTER_SECRET_SIZE,
-					s, s->msg_callback_arg);
-		}
-#endif
-	return(ret);
-	}
+  for (i = 7; i >= 0; i--) {
+    ++seq[i];
+    if (seq[i] != 0) {
+      break;
+    }
+  }
+}
 
-int ssl3_alert_code(int code)
-	{
-	switch (code)
-		{
-	case SSL_AD_CLOSE_NOTIFY:	return(SSL3_AD_CLOSE_NOTIFY);
-	case SSL_AD_UNEXPECTED_MESSAGE:	return(SSL3_AD_UNEXPECTED_MESSAGE);
-	case SSL_AD_BAD_RECORD_MAC:	return(SSL3_AD_BAD_RECORD_MAC);
-	case SSL_AD_DECRYPTION_FAILED:	return(SSL3_AD_BAD_RECORD_MAC);
-	case SSL_AD_RECORD_OVERFLOW:	return(SSL3_AD_BAD_RECORD_MAC);
-	case SSL_AD_DECOMPRESSION_FAILURE:return(SSL3_AD_DECOMPRESSION_FAILURE);
-	case SSL_AD_HANDSHAKE_FAILURE:	return(SSL3_AD_HANDSHAKE_FAILURE);
-	case SSL_AD_NO_CERTIFICATE:	return(SSL3_AD_NO_CERTIFICATE);
-	case SSL_AD_BAD_CERTIFICATE:	return(SSL3_AD_BAD_CERTIFICATE);
-	case SSL_AD_UNSUPPORTED_CERTIFICATE:return(SSL3_AD_UNSUPPORTED_CERTIFICATE);
-	case SSL_AD_CERTIFICATE_REVOKED:return(SSL3_AD_CERTIFICATE_REVOKED);
-	case SSL_AD_CERTIFICATE_EXPIRED:return(SSL3_AD_CERTIFICATE_EXPIRED);
-	case SSL_AD_CERTIFICATE_UNKNOWN:return(SSL3_AD_CERTIFICATE_UNKNOWN);
-	case SSL_AD_ILLEGAL_PARAMETER:	return(SSL3_AD_ILLEGAL_PARAMETER);
-	case SSL_AD_UNKNOWN_CA:		return(SSL3_AD_BAD_CERTIFICATE);
-	case SSL_AD_ACCESS_DENIED:	return(SSL3_AD_HANDSHAKE_FAILURE);
-	case SSL_AD_DECODE_ERROR:	return(SSL3_AD_HANDSHAKE_FAILURE);
-	case SSL_AD_DECRYPT_ERROR:	return(SSL3_AD_HANDSHAKE_FAILURE);
-	case SSL_AD_EXPORT_RESTRICTION:	return(SSL3_AD_HANDSHAKE_FAILURE);
-	case SSL_AD_PROTOCOL_VERSION:	return(SSL3_AD_HANDSHAKE_FAILURE);
-	case SSL_AD_INSUFFICIENT_SECURITY:return(SSL3_AD_HANDSHAKE_FAILURE);
-	case SSL_AD_INTERNAL_ERROR:	return(SSL3_AD_HANDSHAKE_FAILURE);
-	case SSL_AD_USER_CANCELLED:	return(SSL3_AD_HANDSHAKE_FAILURE);
-	case SSL_AD_NO_RENEGOTIATION:	return(-1); /* Don't send it :-) */
-	case SSL_AD_UNSUPPORTED_EXTENSION: return(SSL3_AD_HANDSHAKE_FAILURE);
-	case SSL_AD_CERTIFICATE_UNOBTAINABLE: return(SSL3_AD_HANDSHAKE_FAILURE);
-	case SSL_AD_UNRECOGNIZED_NAME:	return(SSL3_AD_HANDSHAKE_FAILURE);
-	case SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE: return(SSL3_AD_HANDSHAKE_FAILURE);
-	case SSL_AD_BAD_CERTIFICATE_HASH_VALUE: return(SSL3_AD_HANDSHAKE_FAILURE);
-	case SSL_AD_UNKNOWN_PSK_IDENTITY:return(TLS1_AD_UNKNOWN_PSK_IDENTITY);
-	case SSL_AD_INAPPROPRIATE_FALLBACK:return(SSL3_AD_INAPPROPRIATE_FALLBACK);
-	default:			return(-1);
-		}
-	}
+int ssl3_generate_master_secret(SSL *s, uint8_t *out, uint8_t *p, int len) {
+  uint8_t buf[EVP_MAX_MD_SIZE];
+  EVP_MD_CTX ctx;
+  int i, ret = 0;
+  unsigned int n;
 
+  EVP_MD_CTX_init(&ctx);
+  for (i = 0; i < 3; i++) {
+    if (!EVP_DigestInit_ex(&ctx, EVP_sha1(), NULL)) {
+      ret = 0;
+      break;
+    }
+
+    if (i == 0) {
+      EVP_DigestUpdate(&ctx, (const uint8_t*) "A", 1);
+    } else if (i == 1) {
+      EVP_DigestUpdate(&ctx, (const uint8_t*) "BB", 2);
+    } else {
+      EVP_DigestUpdate(&ctx, (const uint8_t*) "CCC", 3);
+    }
+    EVP_DigestUpdate(&ctx, p, len);
+    EVP_DigestUpdate(&ctx, &s->s3->client_random[0], SSL3_RANDOM_SIZE);
+    EVP_DigestUpdate(&ctx, &s->s3->server_random[0], SSL3_RANDOM_SIZE);
+    EVP_DigestFinal_ex(&ctx, buf, &n);
+
+    if (!EVP_DigestInit_ex(&ctx, EVP_md5(), NULL)) {
+      ret = 0;
+      break;
+    }
+
+    EVP_DigestUpdate(&ctx, p, len);
+    EVP_DigestUpdate(&ctx, buf, n);
+    EVP_DigestFinal_ex(&ctx, out, &n);
+    out += n;
+    ret += n;
+  }
+  EVP_MD_CTX_cleanup(&ctx);
+
+  return ret;
+}
+
+int ssl3_alert_code(int code) {
+  switch (code) {
+    case SSL_AD_CLOSE_NOTIFY:
+      return SSL3_AD_CLOSE_NOTIFY;
+
+    case SSL_AD_UNEXPECTED_MESSAGE:
+      return SSL3_AD_UNEXPECTED_MESSAGE;
+
+    case SSL_AD_BAD_RECORD_MAC:
+      return SSL3_AD_BAD_RECORD_MAC;
+
+    case SSL_AD_DECRYPTION_FAILED:
+      return SSL3_AD_BAD_RECORD_MAC;
+
+    case SSL_AD_RECORD_OVERFLOW:
+      return SSL3_AD_BAD_RECORD_MAC;
+
+    case SSL_AD_DECOMPRESSION_FAILURE:
+      return SSL3_AD_DECOMPRESSION_FAILURE;
+
+    case SSL_AD_HANDSHAKE_FAILURE:
+      return SSL3_AD_HANDSHAKE_FAILURE;
+
+    case SSL_AD_NO_CERTIFICATE:
+      return SSL3_AD_NO_CERTIFICATE;
+
+    case SSL_AD_BAD_CERTIFICATE:
+      return SSL3_AD_BAD_CERTIFICATE;
+
+    case SSL_AD_UNSUPPORTED_CERTIFICATE:
+      return SSL3_AD_UNSUPPORTED_CERTIFICATE;
+
+    case SSL_AD_CERTIFICATE_REVOKED:
+      return SSL3_AD_CERTIFICATE_REVOKED;
+
+    case SSL_AD_CERTIFICATE_EXPIRED:
+      return SSL3_AD_CERTIFICATE_EXPIRED;
+
+    case SSL_AD_CERTIFICATE_UNKNOWN:
+      return SSL3_AD_CERTIFICATE_UNKNOWN;
+
+    case SSL_AD_ILLEGAL_PARAMETER:
+      return SSL3_AD_ILLEGAL_PARAMETER;
+
+    case SSL_AD_UNKNOWN_CA:
+      return SSL3_AD_BAD_CERTIFICATE;
+
+    case SSL_AD_ACCESS_DENIED:
+      return SSL3_AD_HANDSHAKE_FAILURE;
+
+    case SSL_AD_DECODE_ERROR:
+      return SSL3_AD_HANDSHAKE_FAILURE;
+
+    case SSL_AD_DECRYPT_ERROR:
+      return SSL3_AD_HANDSHAKE_FAILURE;
+
+    case SSL_AD_EXPORT_RESTRICTION:
+      return SSL3_AD_HANDSHAKE_FAILURE;
+
+    case SSL_AD_PROTOCOL_VERSION:
+      return SSL3_AD_HANDSHAKE_FAILURE;
+
+    case SSL_AD_INSUFFICIENT_SECURITY:
+      return SSL3_AD_HANDSHAKE_FAILURE;
+
+    case SSL_AD_INTERNAL_ERROR:
+      return SSL3_AD_HANDSHAKE_FAILURE;
+
+    case SSL_AD_USER_CANCELLED:
+      return SSL3_AD_HANDSHAKE_FAILURE;
+
+    case SSL_AD_NO_RENEGOTIATION:
+      return -1; /* Don't send it. */
+
+    case SSL_AD_UNSUPPORTED_EXTENSION:
+      return SSL3_AD_HANDSHAKE_FAILURE;
+
+    case SSL_AD_CERTIFICATE_UNOBTAINABLE:
+      return SSL3_AD_HANDSHAKE_FAILURE;
+
+    case SSL_AD_UNRECOGNIZED_NAME:
+      return SSL3_AD_HANDSHAKE_FAILURE;
+
+    case SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE:
+      return SSL3_AD_HANDSHAKE_FAILURE;
+
+    case SSL_AD_BAD_CERTIFICATE_HASH_VALUE:
+      return SSL3_AD_HANDSHAKE_FAILURE;
+
+    case SSL_AD_UNKNOWN_PSK_IDENTITY:
+      return TLS1_AD_UNKNOWN_PSK_IDENTITY;
+
+    case SSL_AD_INAPPROPRIATE_FALLBACK:
+      return SSL3_AD_INAPPROPRIATE_FALLBACK;
+
+    default:
+      return -1;
+  }
+}
diff --git a/ssl/s3_lib.c b/ssl/s3_lib.c
index 1a97c40..dcdf4ee 100644
--- a/ssl/s3_lib.c
+++ b/ssl/s3_lib.c
@@ -157,1912 +157,1499 @@
 
 #include "ssl_locl.h"
 
-#define SSL3_NUM_CIPHERS	(sizeof(ssl3_ciphers)/sizeof(SSL_CIPHER))
+
+#define SSL3_NUM_CIPHERS (sizeof(ssl3_ciphers) / sizeof(SSL_CIPHER))
 
 /* FIXED_NONCE_LEN is a macro that results in the correct value to set the
  * fixed nonce length in SSL_CIPHER.algorithms2. It's the inverse of
  * SSL_CIPHER_AEAD_FIXED_NONCE_LEN. */
-#define FIXED_NONCE_LEN(x) ((x/2)<<24)
+#define FIXED_NONCE_LEN(x) ((x / 2) << 24)
 
 /* list of available SSLv3 ciphers (sorted by id) */
-const SSL_CIPHER ssl3_ciphers[]={
+const SSL_CIPHER ssl3_ciphers[] = {
+    /* The RSA ciphers */
+    /* Cipher 04 */
+    {
+     1, SSL3_TXT_RSA_RC4_128_MD5, SSL3_CK_RSA_RC4_128_MD5, SSL_kRSA, SSL_aRSA,
+     SSL_RC4, SSL_MD5, SSL_SSLV3, SSL_MEDIUM,
+     SSL_HANDSHAKE_MAC_DEFAULT | TLS1_PRF | SSL_CIPHER_ALGORITHM2_STATEFUL_AEAD,
+     128, 128,
+    },
 
-/* The RSA ciphers */
-/* Cipher 04 */
-	{
-	1,
-	SSL3_TXT_RSA_RC4_128_MD5,
-	SSL3_CK_RSA_RC4_128_MD5,
-	SSL_kRSA,
-	SSL_aRSA,
-	SSL_RC4,
-	SSL_MD5,
-	SSL_SSLV3,
-	SSL_MEDIUM,
-	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF|SSL_CIPHER_ALGORITHM2_STATEFUL_AEAD,
-	128,
-	128,
-	},
+    /* Cipher 05 */
+    {
+     1, SSL3_TXT_RSA_RC4_128_SHA, SSL3_CK_RSA_RC4_128_SHA, SSL_kRSA, SSL_aRSA,
+     SSL_RC4, SSL_SHA1, SSL_SSLV3, SSL_MEDIUM,
+     SSL_HANDSHAKE_MAC_DEFAULT | TLS1_PRF, 128, 128,
+    },
 
-/* Cipher 05 */
-	{
-	1,
-	SSL3_TXT_RSA_RC4_128_SHA,
-	SSL3_CK_RSA_RC4_128_SHA,
-	SSL_kRSA,
-	SSL_aRSA,
-	SSL_RC4,
-	SSL_SHA1,
-	SSL_SSLV3,
-	SSL_MEDIUM,
-	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
-	128,
-	128,
-	},
-
-/* Cipher 0A */
-	{
-	1,
-	SSL3_TXT_RSA_DES_192_CBC3_SHA,
-	SSL3_CK_RSA_DES_192_CBC3_SHA,
-	SSL_kRSA,
-	SSL_aRSA,
-	SSL_3DES,
-	SSL_SHA1,
-	SSL_SSLV3,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
-	112,
-	168,
-	},
-
-/* The Ephemeral DH ciphers */
-
-/* Cipher 18 */
-	{
-	1,
-	SSL3_TXT_ADH_RC4_128_MD5,
-	SSL3_CK_ADH_RC4_128_MD5,
-	SSL_kEDH,
-	SSL_aNULL,
-	SSL_RC4,
-	SSL_MD5,
-	SSL_SSLV3,
-	SSL_MEDIUM,
-	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
-	128,
-	128,
-	},
-
-/* New AES ciphersuites */
-/* Cipher 2F */
-	{
-	1,
-	TLS1_TXT_RSA_WITH_AES_128_SHA,
-	TLS1_CK_RSA_WITH_AES_128_SHA,
-	SSL_kRSA,
-	SSL_aRSA,
-	SSL_AES128,
-	SSL_SHA1,
-	SSL_TLSV1,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
-	128,
-	128,
-	},
-/* Cipher 33 */
-	{
-	1,
-	TLS1_TXT_DHE_RSA_WITH_AES_128_SHA,
-	TLS1_CK_DHE_RSA_WITH_AES_128_SHA,
-	SSL_kEDH,
-	SSL_aRSA,
-	SSL_AES128,
-	SSL_SHA1,
-	SSL_TLSV1,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
-	128,
-	128,
-	},
-/* Cipher 34 */
-	{
-	1,
-	TLS1_TXT_ADH_WITH_AES_128_SHA,
-	TLS1_CK_ADH_WITH_AES_128_SHA,
-	SSL_kEDH,
-	SSL_aNULL,
-	SSL_AES128,
-	SSL_SHA1,
-	SSL_TLSV1,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
-	128,
-	128,
-	},
-
-/* Cipher 35 */
-	{
-	1,
-	TLS1_TXT_RSA_WITH_AES_256_SHA,
-	TLS1_CK_RSA_WITH_AES_256_SHA,
-	SSL_kRSA,
-	SSL_aRSA,
-	SSL_AES256,
-	SSL_SHA1,
-	SSL_TLSV1,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
-	256,
-	256,
-	},
-
-/* Cipher 39 */
-	{
-	1,
-	TLS1_TXT_DHE_RSA_WITH_AES_256_SHA,
-	TLS1_CK_DHE_RSA_WITH_AES_256_SHA,
-	SSL_kEDH,
-	SSL_aRSA,
-	SSL_AES256,
-	SSL_SHA1,
-	SSL_TLSV1,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
-	256,
-	256,
-	},
-
-	/* Cipher 3A */
-	{
-	1,
-	TLS1_TXT_ADH_WITH_AES_256_SHA,
-	TLS1_CK_ADH_WITH_AES_256_SHA,
-	SSL_kEDH,
-	SSL_aNULL,
-	SSL_AES256,
-	SSL_SHA1,
-	SSL_TLSV1,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
-	256,
-	256,
-	},
-
-	/* TLS v1.2 ciphersuites */
-	/* Cipher 3C */
-	{
-	1,
-	TLS1_TXT_RSA_WITH_AES_128_SHA256,
-	TLS1_CK_RSA_WITH_AES_128_SHA256,
-	SSL_kRSA,
-	SSL_aRSA,
-	SSL_AES128,
-	SSL_SHA256,
-	SSL_TLSV1_2,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
-	128,
-	128,
-	},
-
-	/* Cipher 3D */
-	{
-	1,
-	TLS1_TXT_RSA_WITH_AES_256_SHA256,
-	TLS1_CK_RSA_WITH_AES_256_SHA256,
-	SSL_kRSA,
-	SSL_aRSA,
-	SSL_AES256,
-	SSL_SHA256,
-	SSL_TLSV1_2,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
-	256,
-	256,
-	},
+    /* Cipher 0A */
+    {
+     1, SSL3_TXT_RSA_DES_192_CBC3_SHA, SSL3_CK_RSA_DES_192_CBC3_SHA, SSL_kRSA,
+     SSL_aRSA, SSL_3DES, SSL_SHA1, SSL_SSLV3, SSL_HIGH | SSL_FIPS,
+     SSL_HANDSHAKE_MAC_DEFAULT | TLS1_PRF, 112, 168,
+    },
 
 
-	/* TLS v1.2 ciphersuites */
-	/* Cipher 67 */
-	{
-	1,
-	TLS1_TXT_DHE_RSA_WITH_AES_128_SHA256,
-	TLS1_CK_DHE_RSA_WITH_AES_128_SHA256,
-	SSL_kEDH,
-	SSL_aRSA,
-	SSL_AES128,
-	SSL_SHA256,
-	SSL_TLSV1_2,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
-	128,
-	128,
-	},
+    /* The Ephemeral DH ciphers */
 
-	/* Cipher 6B */
-	{
-	1,
-	TLS1_TXT_DHE_RSA_WITH_AES_256_SHA256,
-	TLS1_CK_DHE_RSA_WITH_AES_256_SHA256,
-	SSL_kEDH,
-	SSL_aRSA,
-	SSL_AES256,
-	SSL_SHA256,
-	SSL_TLSV1_2,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
-	256,
-	256,
-	},
-
-	/* Cipher 6C */
-	{
-	1,
-	TLS1_TXT_ADH_WITH_AES_128_SHA256,
-	TLS1_CK_ADH_WITH_AES_128_SHA256,
-	SSL_kEDH,
-	SSL_aNULL,
-	SSL_AES128,
-	SSL_SHA256,
-	SSL_TLSV1_2,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
-	128,
-	128,
-	},
-
-	/* Cipher 6D */
-	{
-	1,
-	TLS1_TXT_ADH_WITH_AES_256_SHA256,
-	TLS1_CK_ADH_WITH_AES_256_SHA256,
-	SSL_kEDH,
-	SSL_aNULL,
-	SSL_AES256,
-	SSL_SHA256,
-	SSL_TLSV1_2,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
-	256,
-	256,
-	},
+    /* Cipher 18 */
+    {
+     1, SSL3_TXT_ADH_RC4_128_MD5, SSL3_CK_ADH_RC4_128_MD5, SSL_kEDH, SSL_aNULL,
+     SSL_RC4, SSL_MD5, SSL_SSLV3, SSL_MEDIUM,
+     SSL_HANDSHAKE_MAC_DEFAULT | TLS1_PRF, 128, 128,
+    },
 
 
-	/* Cipher 8A */
-	{
-	1,
-	TLS1_TXT_PSK_WITH_RC4_128_SHA,
-	TLS1_CK_PSK_WITH_RC4_128_SHA,
-	SSL_kPSK,
-	SSL_aPSK,
-	SSL_RC4,
-	SSL_SHA1,
-	SSL_TLSV1,
-	SSL_MEDIUM,
-	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
-	128,
-	128,
-	},
+    /* New AES ciphersuites */
 
-	/* Cipher 8C */
-	{
-	1,
-	TLS1_TXT_PSK_WITH_AES_128_CBC_SHA,
-	TLS1_CK_PSK_WITH_AES_128_CBC_SHA,
-	SSL_kPSK,
-	SSL_aPSK,
-	SSL_AES128,
-	SSL_SHA1,
-	SSL_TLSV1,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
-	128,
-	128,
-	},
+    /* Cipher 2F */
+    {
+     1, TLS1_TXT_RSA_WITH_AES_128_SHA, TLS1_CK_RSA_WITH_AES_128_SHA, SSL_kRSA,
+     SSL_aRSA, SSL_AES128, SSL_SHA1, SSL_TLSV1, SSL_HIGH | SSL_FIPS,
+     SSL_HANDSHAKE_MAC_DEFAULT | TLS1_PRF, 128, 128,
+    },
 
-	/* Cipher 8D */
-	{
-	1,
-	TLS1_TXT_PSK_WITH_AES_256_CBC_SHA,
-	TLS1_CK_PSK_WITH_AES_256_CBC_SHA,
-	SSL_kPSK,
-	SSL_aPSK,
-	SSL_AES256,
-	SSL_SHA1,
-	SSL_TLSV1,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
-	256,
-	256,
-	},
+    /* Cipher 33 */
+    {
+     1, TLS1_TXT_DHE_RSA_WITH_AES_128_SHA, TLS1_CK_DHE_RSA_WITH_AES_128_SHA,
+     SSL_kEDH, SSL_aRSA, SSL_AES128, SSL_SHA1, SSL_TLSV1, SSL_HIGH | SSL_FIPS,
+     SSL_HANDSHAKE_MAC_DEFAULT | TLS1_PRF, 128, 128,
+    },
 
-	/* GCM ciphersuites from RFC5288 */
+    /* Cipher 34 */
+    {
+     1, TLS1_TXT_ADH_WITH_AES_128_SHA, TLS1_CK_ADH_WITH_AES_128_SHA, SSL_kEDH,
+     SSL_aNULL, SSL_AES128, SSL_SHA1, SSL_TLSV1, SSL_HIGH | SSL_FIPS,
+     SSL_HANDSHAKE_MAC_DEFAULT | TLS1_PRF, 128, 128,
+    },
 
-	/* Cipher 9C */
-	{
-	1,
-	TLS1_TXT_RSA_WITH_AES_128_GCM_SHA256,
-	TLS1_CK_RSA_WITH_AES_128_GCM_SHA256,
-	SSL_kRSA,
-	SSL_aRSA,
-	SSL_AES128GCM,
-	SSL_AEAD,
-	SSL_TLSV1_2,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256|SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(4)|SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
-	128,
-	128,
-	},
+    /* Cipher 35 */
+    {
+     1, TLS1_TXT_RSA_WITH_AES_256_SHA, TLS1_CK_RSA_WITH_AES_256_SHA, SSL_kRSA,
+     SSL_aRSA, SSL_AES256, SSL_SHA1, SSL_TLSV1, SSL_HIGH | SSL_FIPS,
+     SSL_HANDSHAKE_MAC_DEFAULT | TLS1_PRF, 256, 256,
+    },
 
-	/* Cipher 9D */
-	{
-	1,
-	TLS1_TXT_RSA_WITH_AES_256_GCM_SHA384,
-	TLS1_CK_RSA_WITH_AES_256_GCM_SHA384,
-	SSL_kRSA,
-	SSL_aRSA,
-	SSL_AES256GCM,
-	SSL_AEAD,
-	SSL_TLSV1_2,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_SHA384|TLS1_PRF_SHA384|SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(4)|
-		SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
-	256,
-	256,
-	},
+    /* Cipher 39 */
+    {
+     1, TLS1_TXT_DHE_RSA_WITH_AES_256_SHA, TLS1_CK_DHE_RSA_WITH_AES_256_SHA,
+     SSL_kEDH, SSL_aRSA, SSL_AES256, SSL_SHA1, SSL_TLSV1, SSL_HIGH | SSL_FIPS,
+     SSL_HANDSHAKE_MAC_DEFAULT | TLS1_PRF, 256, 256,
+    },
 
-	/* Cipher 9E */
-	{
-	1,
-	TLS1_TXT_DHE_RSA_WITH_AES_128_GCM_SHA256,
-	TLS1_CK_DHE_RSA_WITH_AES_128_GCM_SHA256,
-	SSL_kEDH,
-	SSL_aRSA,
-	SSL_AES128GCM,
-	SSL_AEAD,
-	SSL_TLSV1_2,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256|SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(4)|SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
-	128,
-	128,
-	},
-
-	/* Cipher 9F */
-	{
-	1,
-	TLS1_TXT_DHE_RSA_WITH_AES_256_GCM_SHA384,
-	TLS1_CK_DHE_RSA_WITH_AES_256_GCM_SHA384,
-	SSL_kEDH,
-	SSL_aRSA,
-	SSL_AES256GCM,
-	SSL_AEAD,
-	SSL_TLSV1_2,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_SHA384|TLS1_PRF_SHA384|SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(4)|
-		SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
-	256,
-	256,
-	},
-
-	/* Cipher A6 */
-	{
-	1,
-	TLS1_TXT_ADH_WITH_AES_128_GCM_SHA256,
-	TLS1_CK_ADH_WITH_AES_128_GCM_SHA256,
-	SSL_kEDH,
-	SSL_aNULL,
-	SSL_AES128GCM,
-	SSL_AEAD,
-	SSL_TLSV1_2,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256|SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(4)|SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
-	128,
-	128,
-	},
-
-	/* Cipher A7 */
-	{
-	1,
-	TLS1_TXT_ADH_WITH_AES_256_GCM_SHA384,
-	TLS1_CK_ADH_WITH_AES_256_GCM_SHA384,
-	SSL_kEDH,
-	SSL_aNULL,
-	SSL_AES256GCM,
-	SSL_AEAD,
-	SSL_TLSV1_2,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_SHA384|TLS1_PRF_SHA384|SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(4)|
-		SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
-	256,
-	256,
-	},
-
-	/* Cipher C007 */
-	{
-	1,
-	TLS1_TXT_ECDHE_ECDSA_WITH_RC4_128_SHA,
-	TLS1_CK_ECDHE_ECDSA_WITH_RC4_128_SHA,
-	SSL_kEECDH,
-	SSL_aECDSA,
-	SSL_RC4,
-	SSL_SHA1,
-	SSL_TLSV1,
-	SSL_MEDIUM,
-	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
-	128,
-	128,
-	},
-
-	/* Cipher C009 */
-	{
-	1,
-	TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
-	TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
-	SSL_kEECDH,
-	SSL_aECDSA,
-	SSL_AES128,
-	SSL_SHA1,
-	SSL_TLSV1,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
-	128,
-	128,
-	},
-
-	/* Cipher C00A */
-	{
-	1,
-	TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
-	TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
-	SSL_kEECDH,
-	SSL_aECDSA,
-	SSL_AES256,
-	SSL_SHA1,
-	SSL_TLSV1,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
-	256,
-	256,
-	},
-
-	/* Cipher C011 */
-	{
-	1,
-	TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA,
-	TLS1_CK_ECDHE_RSA_WITH_RC4_128_SHA,
-	SSL_kEECDH,
-	SSL_aRSA,
-	SSL_RC4,
-	SSL_SHA1,
-	SSL_TLSV1,
-	SSL_MEDIUM,
-	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
-	128,
-	128,
-	},
-
-	/* Cipher C013 */
-	{
-	1,
-	TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA,
-	TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA,
-	SSL_kEECDH,
-	SSL_aRSA,
-	SSL_AES128,
-	SSL_SHA1,
-	SSL_TLSV1,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
-	128,
-	128,
-	},
-
-	/* Cipher C014 */
-	{
-	1,
-	TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA,
-	TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA,
-	SSL_kEECDH,
-	SSL_aRSA,
-	SSL_AES256,
-	SSL_SHA1,
-	SSL_TLSV1,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
-	256,
-	256,
-	},
-
-	/* Cipher C016 */
-	{
-	1,
-	TLS1_TXT_ECDH_anon_WITH_RC4_128_SHA,
-	TLS1_CK_ECDH_anon_WITH_RC4_128_SHA,
-	SSL_kEECDH,
-	SSL_aNULL,
-	SSL_RC4,
-	SSL_SHA1,
-	SSL_TLSV1,
-	SSL_MEDIUM,
-	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
-	128,
-	128,
-	},
-
-	/* Cipher C018 */
-	{
-	1,
-	TLS1_TXT_ECDH_anon_WITH_AES_128_CBC_SHA,
-	TLS1_CK_ECDH_anon_WITH_AES_128_CBC_SHA,
-	SSL_kEECDH,
-	SSL_aNULL,
-	SSL_AES128,
-	SSL_SHA1,
-	SSL_TLSV1,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
-	128,
-	128,
-	},
-
-	/* Cipher C019 */
-	{
-	1,
-	TLS1_TXT_ECDH_anon_WITH_AES_256_CBC_SHA,
-	TLS1_CK_ECDH_anon_WITH_AES_256_CBC_SHA,
-	SSL_kEECDH,
-	SSL_aNULL,
-	SSL_AES256,
-	SSL_SHA1,
-	SSL_TLSV1,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF,
-	256,
-	256,
-	},
+    /* Cipher 3A */
+    {
+     1, TLS1_TXT_ADH_WITH_AES_256_SHA, TLS1_CK_ADH_WITH_AES_256_SHA, SSL_kEDH,
+     SSL_aNULL, SSL_AES256, SSL_SHA1, SSL_TLSV1, SSL_HIGH | SSL_FIPS,
+     SSL_HANDSHAKE_MAC_DEFAULT | TLS1_PRF, 256, 256,
+    },
 
 
-	/* HMAC based TLS v1.2 ciphersuites from RFC5289 */
+    /* TLS v1.2 ciphersuites */
 
-	/* Cipher C023 */
-	{
-	1,
-	TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_SHA256,
-	TLS1_CK_ECDHE_ECDSA_WITH_AES_128_SHA256,
-	SSL_kEECDH,
-	SSL_aECDSA,
-	SSL_AES128,
-	SSL_SHA256,
-	SSL_TLSV1_2,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256,
-	128,
-	128,
-	},
+    /* Cipher 3C */
+    {
+     1, TLS1_TXT_RSA_WITH_AES_128_SHA256, TLS1_CK_RSA_WITH_AES_128_SHA256,
+     SSL_kRSA, SSL_aRSA, SSL_AES128, SSL_SHA256, SSL_TLSV1_2,
+     SSL_HIGH | SSL_FIPS, SSL_HANDSHAKE_MAC_DEFAULT | TLS1_PRF, 128, 128,
+    },
 
-	/* Cipher C024 */
-	{
-	1,
-	TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_SHA384,
-	TLS1_CK_ECDHE_ECDSA_WITH_AES_256_SHA384,
-	SSL_kEECDH,
-	SSL_aECDSA,
-	SSL_AES256,
-	SSL_SHA384,
-	SSL_TLSV1_2,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_SHA384|TLS1_PRF_SHA384,
-	256,
-	256,
-	},
+    /* Cipher 3D */
+    {
+     1, TLS1_TXT_RSA_WITH_AES_256_SHA256, TLS1_CK_RSA_WITH_AES_256_SHA256,
+     SSL_kRSA, SSL_aRSA, SSL_AES256, SSL_SHA256, SSL_TLSV1_2,
+     SSL_HIGH | SSL_FIPS, SSL_HANDSHAKE_MAC_DEFAULT | TLS1_PRF, 256, 256,
+    },
 
-	/* Cipher C027 */
-	{
-	1,
-	TLS1_TXT_ECDHE_RSA_WITH_AES_128_SHA256,
-	TLS1_CK_ECDHE_RSA_WITH_AES_128_SHA256,
-	SSL_kEECDH,
-	SSL_aRSA,
-	SSL_AES128,
-	SSL_SHA256,
-	SSL_TLSV1_2,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256,
-	128,
-	128,
-	},
+    /* Cipher 67 */
+    {
+     1, TLS1_TXT_DHE_RSA_WITH_AES_128_SHA256,
+     TLS1_CK_DHE_RSA_WITH_AES_128_SHA256, SSL_kEDH, SSL_aRSA, SSL_AES128,
+     SSL_SHA256, SSL_TLSV1_2, SSL_HIGH | SSL_FIPS,
+     SSL_HANDSHAKE_MAC_DEFAULT | TLS1_PRF, 128, 128,
+    },
 
-	/* Cipher C028 */
-	{
-	1,
-	TLS1_TXT_ECDHE_RSA_WITH_AES_256_SHA384,
-	TLS1_CK_ECDHE_RSA_WITH_AES_256_SHA384,
-	SSL_kEECDH,
-	SSL_aRSA,
-	SSL_AES256,
-	SSL_SHA384,
-	SSL_TLSV1_2,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_SHA384|TLS1_PRF_SHA384,
-	256,
-	256,
-	},
+    /* Cipher 6B */
+    {
+     1, TLS1_TXT_DHE_RSA_WITH_AES_256_SHA256,
+     TLS1_CK_DHE_RSA_WITH_AES_256_SHA256, SSL_kEDH, SSL_aRSA, SSL_AES256,
+     SSL_SHA256, SSL_TLSV1_2, SSL_HIGH | SSL_FIPS,
+     SSL_HANDSHAKE_MAC_DEFAULT | TLS1_PRF, 256, 256,
+    },
 
-	/* GCM based TLS v1.2 ciphersuites from RFC5289 */
+    /* Cipher 6C */
+    {
+     1, TLS1_TXT_ADH_WITH_AES_128_SHA256, TLS1_CK_ADH_WITH_AES_128_SHA256,
+     SSL_kEDH, SSL_aNULL, SSL_AES128, SSL_SHA256, SSL_TLSV1_2,
+     SSL_HIGH | SSL_FIPS, SSL_HANDSHAKE_MAC_DEFAULT | TLS1_PRF, 128, 128,
+    },
 
-	/* Cipher C02B */
-	{
-	1,
-	TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
-	TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
-	SSL_kEECDH,
-	SSL_aECDSA,
-	SSL_AES128GCM,
-	SSL_AEAD,
-	SSL_TLSV1_2,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256|SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(4)|SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
-	128,
-	128,
-	},
+    /* Cipher 6D */
+    {
+     1, TLS1_TXT_ADH_WITH_AES_256_SHA256, TLS1_CK_ADH_WITH_AES_256_SHA256,
+     SSL_kEDH, SSL_aNULL, SSL_AES256, SSL_SHA256, SSL_TLSV1_2,
+     SSL_HIGH | SSL_FIPS, SSL_HANDSHAKE_MAC_DEFAULT | TLS1_PRF, 256, 256,
+    },
 
-	/* Cipher C02C */
-	{
-	1,
-	TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
-	TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
-	SSL_kEECDH,
-	SSL_aECDSA,
-	SSL_AES256GCM,
-	SSL_AEAD,
-	SSL_TLSV1_2,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_SHA384|TLS1_PRF_SHA384|SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(4)|
-		SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
-	256,
-	256,
-	},
+    /* Cipher 8A */
+    {
+     1, TLS1_TXT_PSK_WITH_RC4_128_SHA, TLS1_CK_PSK_WITH_RC4_128_SHA, SSL_kPSK,
+     SSL_aPSK, SSL_RC4, SSL_SHA1, SSL_TLSV1, SSL_MEDIUM,
+     SSL_HANDSHAKE_MAC_DEFAULT | TLS1_PRF, 128, 128,
+    },
 
-	/* Cipher C02F */
-	{
-	1,
-	TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
-	TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
-	SSL_kEECDH,
-	SSL_aRSA,
-	SSL_AES128GCM,
-	SSL_AEAD,
-	SSL_TLSV1_2,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256|SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(4)|SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
-	128,
-	128,
-	},
+    /* Cipher 8C */
+    {
+     1, TLS1_TXT_PSK_WITH_AES_128_CBC_SHA, TLS1_CK_PSK_WITH_AES_128_CBC_SHA,
+     SSL_kPSK, SSL_aPSK, SSL_AES128, SSL_SHA1, SSL_TLSV1, SSL_HIGH | SSL_FIPS,
+     SSL_HANDSHAKE_MAC_DEFAULT | TLS1_PRF, 128, 128,
+    },
 
-	/* Cipher C030 */
-	{
-	1,
-	TLS1_TXT_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
-	TLS1_CK_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
-	SSL_kEECDH,
-	SSL_aRSA,
-	SSL_AES256GCM,
-	SSL_AEAD,
-	SSL_TLSV1_2,
-	SSL_HIGH|SSL_FIPS,
-	SSL_HANDSHAKE_MAC_SHA384|TLS1_PRF_SHA384|SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(4)|
-		SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
-	256,
-	256,
-	},
+    /* Cipher 8D */
+    {
+     1, TLS1_TXT_PSK_WITH_AES_256_CBC_SHA, TLS1_CK_PSK_WITH_AES_256_CBC_SHA,
+     SSL_kPSK, SSL_aPSK, SSL_AES256, SSL_SHA1, SSL_TLSV1, SSL_HIGH | SSL_FIPS,
+     SSL_HANDSHAKE_MAC_DEFAULT | TLS1_PRF, 256, 256,
+    },
+
+
+    /* GCM ciphersuites from RFC5288 */
+
+    /* Cipher 9C */
+    {
+     1, TLS1_TXT_RSA_WITH_AES_128_GCM_SHA256,
+     TLS1_CK_RSA_WITH_AES_128_GCM_SHA256, SSL_kRSA, SSL_aRSA, SSL_AES128GCM,
+     SSL_AEAD, SSL_TLSV1_2, SSL_HIGH | SSL_FIPS,
+     SSL_HANDSHAKE_MAC_SHA256 | TLS1_PRF_SHA256 | SSL_CIPHER_ALGORITHM2_AEAD |
+         FIXED_NONCE_LEN(4) |
+         SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
+     128, 128,
+    },
+
+    /* Cipher 9D */
+    {
+     1, TLS1_TXT_RSA_WITH_AES_256_GCM_SHA384,
+     TLS1_CK_RSA_WITH_AES_256_GCM_SHA384, SSL_kRSA, SSL_aRSA, SSL_AES256GCM,
+     SSL_AEAD, SSL_TLSV1_2, SSL_HIGH | SSL_FIPS,
+     SSL_HANDSHAKE_MAC_SHA384 | TLS1_PRF_SHA384 | SSL_CIPHER_ALGORITHM2_AEAD |
+         FIXED_NONCE_LEN(4) |
+         SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
+     256, 256,
+    },
+
+    /* Cipher 9E */
+    {
+     1, TLS1_TXT_DHE_RSA_WITH_AES_128_GCM_SHA256,
+     TLS1_CK_DHE_RSA_WITH_AES_128_GCM_SHA256, SSL_kEDH, SSL_aRSA, SSL_AES128GCM,
+     SSL_AEAD, SSL_TLSV1_2, SSL_HIGH | SSL_FIPS,
+     SSL_HANDSHAKE_MAC_SHA256 | TLS1_PRF_SHA256 | SSL_CIPHER_ALGORITHM2_AEAD |
+         FIXED_NONCE_LEN(4) |
+         SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
+     128, 128,
+    },
+
+    /* Cipher 9F */
+    {
+     1, TLS1_TXT_DHE_RSA_WITH_AES_256_GCM_SHA384,
+     TLS1_CK_DHE_RSA_WITH_AES_256_GCM_SHA384, SSL_kEDH, SSL_aRSA, SSL_AES256GCM,
+     SSL_AEAD, SSL_TLSV1_2, SSL_HIGH | SSL_FIPS,
+     SSL_HANDSHAKE_MAC_SHA384 | TLS1_PRF_SHA384 | SSL_CIPHER_ALGORITHM2_AEAD |
+         FIXED_NONCE_LEN(4) |
+         SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
+     256, 256,
+    },
+
+    /* Cipher A6 */
+    {
+     1, TLS1_TXT_ADH_WITH_AES_128_GCM_SHA256,
+     TLS1_CK_ADH_WITH_AES_128_GCM_SHA256, SSL_kEDH, SSL_aNULL, SSL_AES128GCM,
+     SSL_AEAD, SSL_TLSV1_2, SSL_HIGH | SSL_FIPS,
+     SSL_HANDSHAKE_MAC_SHA256 | TLS1_PRF_SHA256 | SSL_CIPHER_ALGORITHM2_AEAD |
+         FIXED_NONCE_LEN(4) |
+         SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
+     128, 128,
+    },
+
+    /* Cipher A7 */
+    {
+     1, TLS1_TXT_ADH_WITH_AES_256_GCM_SHA384,
+     TLS1_CK_ADH_WITH_AES_256_GCM_SHA384, SSL_kEDH, SSL_aNULL, SSL_AES256GCM,
+     SSL_AEAD, SSL_TLSV1_2, SSL_HIGH | SSL_FIPS,
+     SSL_HANDSHAKE_MAC_SHA384 | TLS1_PRF_SHA384 | SSL_CIPHER_ALGORITHM2_AEAD |
+         FIXED_NONCE_LEN(4) |
+         SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
+     256, 256,
+    },
+
+    /* Cipher C007 */
+    {
+     1, TLS1_TXT_ECDHE_ECDSA_WITH_RC4_128_SHA,
+     TLS1_CK_ECDHE_ECDSA_WITH_RC4_128_SHA, SSL_kEECDH, SSL_aECDSA, SSL_RC4,
+     SSL_SHA1, SSL_TLSV1, SSL_MEDIUM, SSL_HANDSHAKE_MAC_DEFAULT | TLS1_PRF, 128,
+     128,
+    },
+
+    /* Cipher C009 */
+    {
+     1, TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
+     TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, SSL_kEECDH, SSL_aECDSA,
+     SSL_AES128, SSL_SHA1, SSL_TLSV1, SSL_HIGH | SSL_FIPS,
+     SSL_HANDSHAKE_MAC_DEFAULT | TLS1_PRF, 128, 128,
+    },
+
+    /* Cipher C00A */
+    {
+     1, TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
+     TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, SSL_kEECDH, SSL_aECDSA,
+     SSL_AES256, SSL_SHA1, SSL_TLSV1, SSL_HIGH | SSL_FIPS,
+     SSL_HANDSHAKE_MAC_DEFAULT | TLS1_PRF, 256, 256,
+    },
+
+    /* Cipher C011 */
+    {
+     1, TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA, TLS1_CK_ECDHE_RSA_WITH_RC4_128_SHA,
+     SSL_kEECDH, SSL_aRSA, SSL_RC4, SSL_SHA1, SSL_TLSV1, SSL_MEDIUM,
+     SSL_HANDSHAKE_MAC_DEFAULT | TLS1_PRF, 128, 128,
+    },
+
+    /* Cipher C013 */
+    {
+     1, TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA,
+     TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA, SSL_kEECDH, SSL_aRSA, SSL_AES128,
+     SSL_SHA1, SSL_TLSV1, SSL_HIGH | SSL_FIPS,
+     SSL_HANDSHAKE_MAC_DEFAULT | TLS1_PRF, 128, 128,
+    },
+
+    /* Cipher C014 */
+    {
+     1, TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA,
+     TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA, SSL_kEECDH, SSL_aRSA, SSL_AES256,
+     SSL_SHA1, SSL_TLSV1, SSL_HIGH | SSL_FIPS,
+     SSL_HANDSHAKE_MAC_DEFAULT | TLS1_PRF, 256, 256,
+    },
+
+    /* Cipher C016 */
+    {
+     1, TLS1_TXT_ECDH_anon_WITH_RC4_128_SHA, TLS1_CK_ECDH_anon_WITH_RC4_128_SHA,
+     SSL_kEECDH, SSL_aNULL, SSL_RC4, SSL_SHA1, SSL_TLSV1, SSL_MEDIUM,
+     SSL_HANDSHAKE_MAC_DEFAULT | TLS1_PRF, 128, 128,
+    },
+
+    /* Cipher C018 */
+    {
+     1, TLS1_TXT_ECDH_anon_WITH_AES_128_CBC_SHA,
+     TLS1_CK_ECDH_anon_WITH_AES_128_CBC_SHA, SSL_kEECDH, SSL_aNULL, SSL_AES128,
+     SSL_SHA1, SSL_TLSV1, SSL_HIGH | SSL_FIPS,
+     SSL_HANDSHAKE_MAC_DEFAULT | TLS1_PRF, 128, 128,
+    },
+
+    /* Cipher C019 */
+    {
+     1, TLS1_TXT_ECDH_anon_WITH_AES_256_CBC_SHA,
+     TLS1_CK_ECDH_anon_WITH_AES_256_CBC_SHA, SSL_kEECDH, SSL_aNULL, SSL_AES256,
+     SSL_SHA1, SSL_TLSV1, SSL_HIGH | SSL_FIPS,
+     SSL_HANDSHAKE_MAC_DEFAULT | TLS1_PRF, 256, 256,
+    },
+
+
+    /* HMAC based TLS v1.2 ciphersuites from RFC5289 */
+
+    /* Cipher C023 */
+    {
+     1, TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_SHA256,
+     TLS1_CK_ECDHE_ECDSA_WITH_AES_128_SHA256, SSL_kEECDH, SSL_aECDSA,
+     SSL_AES128, SSL_SHA256, SSL_TLSV1_2, SSL_HIGH | SSL_FIPS,
+     SSL_HANDSHAKE_MAC_SHA256 | TLS1_PRF_SHA256, 128, 128,
+    },
+
+    /* Cipher C024 */
+    {
+     1, TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_SHA384,
+     TLS1_CK_ECDHE_ECDSA_WITH_AES_256_SHA384, SSL_kEECDH, SSL_aECDSA,
+     SSL_AES256, SSL_SHA384, SSL_TLSV1_2, SSL_HIGH | SSL_FIPS,
+     SSL_HANDSHAKE_MAC_SHA384 | TLS1_PRF_SHA384, 256, 256,
+    },
+
+    /* Cipher C027 */
+    {
+     1, TLS1_TXT_ECDHE_RSA_WITH_AES_128_SHA256,
+     TLS1_CK_ECDHE_RSA_WITH_AES_128_SHA256, SSL_kEECDH, SSL_aRSA, SSL_AES128,
+     SSL_SHA256, SSL_TLSV1_2, SSL_HIGH | SSL_FIPS,
+     SSL_HANDSHAKE_MAC_SHA256 | TLS1_PRF_SHA256, 128, 128,
+    },
+
+    /* Cipher C028 */
+    {
+     1, TLS1_TXT_ECDHE_RSA_WITH_AES_256_SHA384,
+     TLS1_CK_ECDHE_RSA_WITH_AES_256_SHA384, SSL_kEECDH, SSL_aRSA, SSL_AES256,
+     SSL_SHA384, SSL_TLSV1_2, SSL_HIGH | SSL_FIPS,
+     SSL_HANDSHAKE_MAC_SHA384 | TLS1_PRF_SHA384, 256, 256,
+    },
+
+
+    /* GCM based TLS v1.2 ciphersuites from RFC5289 */
+
+    /* Cipher C02B */
+    {
+     1, TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
+     TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, SSL_kEECDH, SSL_aECDSA,
+     SSL_AES128GCM, SSL_AEAD, SSL_TLSV1_2, SSL_HIGH | SSL_FIPS,
+     SSL_HANDSHAKE_MAC_SHA256 | TLS1_PRF_SHA256 | SSL_CIPHER_ALGORITHM2_AEAD |
+         FIXED_NONCE_LEN(4) |
+         SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
+     128, 128,
+    },
+
+    /* Cipher C02C */
+    {
+     1, TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
+     TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, SSL_kEECDH, SSL_aECDSA,
+     SSL_AES256GCM, SSL_AEAD, SSL_TLSV1_2, SSL_HIGH | SSL_FIPS,
+     SSL_HANDSHAKE_MAC_SHA384 | TLS1_PRF_SHA384 | SSL_CIPHER_ALGORITHM2_AEAD |
+         FIXED_NONCE_LEN(4) |
+         SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
+     256, 256,
+    },
+
+    /* Cipher C02F */
+    {
+     1, TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
+     TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256, SSL_kEECDH, SSL_aRSA,
+     SSL_AES128GCM, SSL_AEAD, SSL_TLSV1_2, SSL_HIGH | SSL_FIPS,
+     SSL_HANDSHAKE_MAC_SHA256 | TLS1_PRF_SHA256 | SSL_CIPHER_ALGORITHM2_AEAD |
+         FIXED_NONCE_LEN(4) |
+         SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
+     128, 128,
+    },
+
+    /* Cipher C030 */
+    {
+     1, TLS1_TXT_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
+     TLS1_CK_ECDHE_RSA_WITH_AES_256_GCM_SHA384, SSL_kEECDH, SSL_aRSA,
+     SSL_AES256GCM, SSL_AEAD, SSL_TLSV1_2, SSL_HIGH | SSL_FIPS,
+     SSL_HANDSHAKE_MAC_SHA384 | TLS1_PRF_SHA384 | SSL_CIPHER_ALGORITHM2_AEAD |
+         FIXED_NONCE_LEN(4) |
+         SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
+     256, 256,
+    },
+
 
     /* ECDH PSK ciphersuites */
-	/* Cipher CAFE */
-	{
-	1,
-	TLS1_TXT_ECDHE_PSK_WITH_AES_128_GCM_SHA256,
-	TLS1_CK_ECDHE_PSK_WITH_AES_128_GCM_SHA256,
-	SSL_kEECDH,
-	SSL_aPSK,
-	SSL_AES128GCM,
-	SSL_AEAD,
-	SSL_TLSV1_2,
-	SSL_HIGH,
-	SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256|SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(4)|
-		SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
-	128,
-	128,
-	},
 
+    /* Cipher CAFE */
+    {
+     1, TLS1_TXT_ECDHE_PSK_WITH_AES_128_GCM_SHA256,
+     TLS1_CK_ECDHE_PSK_WITH_AES_128_GCM_SHA256, SSL_kEECDH, SSL_aPSK,
+     SSL_AES128GCM, SSL_AEAD, SSL_TLSV1_2, SSL_HIGH,
+     SSL_HANDSHAKE_MAC_SHA256 | TLS1_PRF_SHA256 | SSL_CIPHER_ALGORITHM2_AEAD |
+         FIXED_NONCE_LEN(4) |
+         SSL_CIPHER_ALGORITHM2_VARIABLE_NONCE_INCLUDED_IN_RECORD,
+     128, 128,
+    },
 
-	{
-	1,
-	TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305,
-	TLS1_CK_ECDHE_RSA_CHACHA20_POLY1305,
-	SSL_kEECDH,
-	SSL_aRSA,
-	SSL_CHACHA20POLY1305,
-	SSL_AEAD,
-	SSL_TLSV1_2,
-	SSL_HIGH,
-	SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256|SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(0),
-	256,
-	0,
-	},
+    {
+     1, TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305,
+     TLS1_CK_ECDHE_RSA_CHACHA20_POLY1305, SSL_kEECDH, SSL_aRSA,
+     SSL_CHACHA20POLY1305, SSL_AEAD, SSL_TLSV1_2, SSL_HIGH,
+     SSL_HANDSHAKE_MAC_SHA256 | TLS1_PRF_SHA256 | SSL_CIPHER_ALGORITHM2_AEAD |
+         FIXED_NONCE_LEN(0),
+     256, 0,
+    },
 
-	{
-	1,
-	TLS1_TXT_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
-	TLS1_CK_ECDHE_ECDSA_CHACHA20_POLY1305,
-	SSL_kEECDH,
-	SSL_aECDSA,
-	SSL_CHACHA20POLY1305,
-	SSL_AEAD,
-	SSL_TLSV1_2,
-	SSL_HIGH,
-	SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256|SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(0),
-	256,
-	0,
-	},
+    {
+     1, TLS1_TXT_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
+     TLS1_CK_ECDHE_ECDSA_CHACHA20_POLY1305, SSL_kEECDH, SSL_aECDSA,
+     SSL_CHACHA20POLY1305, SSL_AEAD, SSL_TLSV1_2, SSL_HIGH,
+     SSL_HANDSHAKE_MAC_SHA256 | TLS1_PRF_SHA256 | SSL_CIPHER_ALGORITHM2_AEAD |
+         FIXED_NONCE_LEN(0),
+     256, 0,
+    },
 
-	{
-	1,
-	TLS1_TXT_DHE_RSA_WITH_CHACHA20_POLY1305,
-	TLS1_CK_DHE_RSA_CHACHA20_POLY1305,
-	SSL_kEDH,
-	SSL_aRSA,
-	SSL_CHACHA20POLY1305,
-	SSL_AEAD,
-	SSL_TLSV1_2,
-	SSL_HIGH,
-	SSL_HANDSHAKE_MAC_SHA256|TLS1_PRF_SHA256|SSL_CIPHER_ALGORITHM2_AEAD|FIXED_NONCE_LEN(0),
-	256,
-	0,
-	},
-
-/* end of list */
-	};
+    {
+     1, TLS1_TXT_DHE_RSA_WITH_CHACHA20_POLY1305,
+     TLS1_CK_DHE_RSA_CHACHA20_POLY1305, SSL_kEDH, SSL_aRSA,
+     SSL_CHACHA20POLY1305, SSL_AEAD, SSL_TLSV1_2, SSL_HIGH,
+     SSL_HANDSHAKE_MAC_SHA256 | TLS1_PRF_SHA256 | SSL_CIPHER_ALGORITHM2_AEAD |
+         FIXED_NONCE_LEN(0),
+     256, 0,
+    },
+};
 
 const SSL3_ENC_METHOD SSLv3_enc_data = {
-	ssl3_enc,
-	n_ssl3_mac,
-	ssl3_setup_key_block,
-	ssl3_generate_master_secret,
-	ssl3_change_cipher_state,
-	ssl3_final_finish_mac,
-	MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH,
-	ssl3_cert_verify_mac,
-	SSL3_MD_CLIENT_FINISHED_CONST,4,
-	SSL3_MD_SERVER_FINISHED_CONST,4,
-	ssl3_alert_code,
-	(int (*)(SSL *, unsigned char *, size_t, const char *,
-		 size_t, const unsigned char *, size_t,
-		 int use_context))ssl_undefined_function,
-	0,
-	SSL3_HM_HEADER_LENGTH,
-	ssl3_set_handshake_header,
-	ssl3_handshake_write,
-	};
+    ssl3_enc,
+    n_ssl3_mac,
+    ssl3_setup_key_block,
+    ssl3_generate_master_secret,
+    ssl3_change_cipher_state,
+    ssl3_final_finish_mac,
+    MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH,
+    ssl3_cert_verify_mac,
+    SSL3_MD_CLIENT_FINISHED_CONST, 4,
+    SSL3_MD_SERVER_FINISHED_CONST, 4,
+    ssl3_alert_code,
+    (int (*)(SSL *, uint8_t *, size_t, const char *, size_t, const uint8_t *,
+             size_t, int use_context)) ssl_undefined_function,
+    0,
+    SSL3_HM_HEADER_LENGTH,
+    ssl3_set_handshake_header,
+    ssl3_handshake_write,
+};
 
-int ssl3_num_ciphers(void)
-	{
-	return(SSL3_NUM_CIPHERS);
-	}
+int ssl3_num_ciphers(void) { return SSL3_NUM_CIPHERS; }
 
-const SSL_CIPHER *ssl3_get_cipher(unsigned int u)
-	{
-	if (u < SSL3_NUM_CIPHERS)
-		return(&(ssl3_ciphers[SSL3_NUM_CIPHERS-1-u]));
-	else
-		return(NULL);
-	}
+const SSL_CIPHER *ssl3_get_cipher(unsigned int u) {
+  if (u >= SSL3_NUM_CIPHERS) {
+    return NULL;
+  }
 
-int ssl3_pending(const SSL *s)
-	{
-	if (s->rstate == SSL_ST_READ_BODY)
-		return 0;
-	
-	return (s->s3->rrec.type == SSL3_RT_APPLICATION_DATA) ? s->s3->rrec.length : 0;
-	}
+  return &ssl3_ciphers[SSL3_NUM_CIPHERS - 1 - u];
+}
 
-void ssl3_set_handshake_header(SSL *s, int htype, unsigned long len)
-	{
-	unsigned char *p = (unsigned char *)s->init_buf->data;
-	*(p++) = htype;
-	l2n3(len, p);
-	s->init_num = (int)len + SSL3_HM_HEADER_LENGTH;
-	s->init_off = 0;
+int ssl3_pending(const SSL *s) {
+  if (s->rstate == SSL_ST_READ_BODY) {
+    return 0;
+  }
 
-	/* Add the message to the handshake hash. */
-	ssl3_finish_mac(s, (uint8_t*) s->init_buf->data, s->init_num);
-	}
+  return (s->s3->rrec.type == SSL3_RT_APPLICATION_DATA) ? s->s3->rrec.length
+                                                        : 0;
+}
 
-int ssl3_handshake_write(SSL *s)
-	{
-	return ssl3_do_write(s, SSL3_RT_HANDSHAKE);
-	}
+void ssl3_set_handshake_header(SSL *s, int htype, unsigned long len) {
+  uint8_t *p = (uint8_t *)s->init_buf->data;
+  *(p++) = htype;
+  l2n3(len, p);
+  s->init_num = (int)len + SSL3_HM_HEADER_LENGTH;
+  s->init_off = 0;
 
-int ssl3_new(SSL *s)
-	{
-	SSL3_STATE *s3;
+  /* Add the message to the handshake hash. */
+  ssl3_finish_mac(s, (uint8_t *)s->init_buf->data, s->init_num);
+}
 
-	if ((s3=OPENSSL_malloc(sizeof *s3)) == NULL) goto err;
-	memset(s3,0,sizeof *s3);
-	memset(s3->rrec.seq_num,0,sizeof(s3->rrec.seq_num));
-	memset(s3->wrec.seq_num,0,sizeof(s3->wrec.seq_num));
+int ssl3_handshake_write(SSL *s) { return ssl3_do_write(s, SSL3_RT_HANDSHAKE); }
 
-	s->s3=s3;
+int ssl3_new(SSL *s) {
+  SSL3_STATE *s3;
 
-	s->tlsext_channel_id_enabled = s->ctx->tlsext_channel_id_enabled;
-	if (s->ctx->tlsext_channel_id_private)
-		s->tlsext_channel_id_private = EVP_PKEY_dup(s->ctx->tlsext_channel_id_private);
-	s->method->ssl_clear(s);
-	return(1);
+  s3 = OPENSSL_malloc(sizeof *s3);
+  if (s3 == NULL) {
+    goto err;
+  }
+  memset(s3, 0, sizeof *s3);
+  memset(s3->rrec.seq_num, 0, sizeof(s3->rrec.seq_num));
+  memset(s3->wrec.seq_num, 0, sizeof(s3->wrec.seq_num));
+
+  s->s3 = s3;
+
+  s->tlsext_channel_id_enabled = s->ctx->tlsext_channel_id_enabled;
+  if (s->ctx->tlsext_channel_id_private) {
+    s->tlsext_channel_id_private =
+        EVP_PKEY_dup(s->ctx->tlsext_channel_id_private);
+  }
+  s->method->ssl_clear(s);
+
+  return 1;
 err:
-	return(0);
-	}
+  return 0;
+}
 
-void ssl3_free(SSL *s)
-	{
-	if(s == NULL)
-	    return;
+void ssl3_free(SSL *s) {
+  if (s == NULL) {
+    return;
+  }
 
-	if (s->s3->sniff_buffer != NULL)
-		BUF_MEM_free(s->s3->sniff_buffer);
+  if (s->s3->sniff_buffer != NULL) {
+    BUF_MEM_free(s->s3->sniff_buffer);
+  }
+  ssl3_cleanup_key_block(s);
+  if (s->s3->rbuf.buf != NULL) {
+    ssl3_release_read_buffer(s);
+  }
+  if (s->s3->wbuf.buf != NULL) {
+    ssl3_release_write_buffer(s);
+  }
+  if (s->s3->tmp.dh != NULL) {
+    DH_free(s->s3->tmp.dh);
+  }
+  if (s->s3->tmp.ecdh != NULL) {
+    EC_KEY_free(s->s3->tmp.ecdh);
+  }
 
-	ssl3_cleanup_key_block(s);
-	if (s->s3->rbuf.buf != NULL)
-		ssl3_release_read_buffer(s);
-	if (s->s3->wbuf.buf != NULL)
-		ssl3_release_write_buffer(s);
-	if (s->s3->tmp.dh != NULL)
-		DH_free(s->s3->tmp.dh);
-	if (s->s3->tmp.ecdh != NULL)
-		EC_KEY_free(s->s3->tmp.ecdh);
+  if (s->s3->tmp.ca_names != NULL) {
+    sk_X509_NAME_pop_free(s->s3->tmp.ca_names, X509_NAME_free);
+  }
+  if (s->s3->tmp.certificate_types != NULL) {
+    OPENSSL_free(s->s3->tmp.certificate_types);
+  }
+  if (s->s3->tmp.peer_ecpointformatlist) {
+    OPENSSL_free(s->s3->tmp.peer_ecpointformatlist);
+  }
+  if (s->s3->tmp.peer_ellipticcurvelist) {
+    OPENSSL_free(s->s3->tmp.peer_ellipticcurvelist);
+  }
+  if (s->s3->tmp.peer_psk_identity_hint) {
+    OPENSSL_free(s->s3->tmp.peer_psk_identity_hint);
+  }
+  if (s->s3->handshake_buffer) {
+    BIO_free(s->s3->handshake_buffer);
+  }
+  if (s->s3->handshake_dgst) {
+    ssl3_free_digest_list(s);
+  }
+  if (s->s3->alpn_selected) {
+    OPENSSL_free(s->s3->alpn_selected);
+  }
 
-	if (s->s3->tmp.ca_names != NULL)
-		sk_X509_NAME_pop_free(s->s3->tmp.ca_names,X509_NAME_free);
-	if (s->s3->tmp.certificate_types != NULL)
-		OPENSSL_free(s->s3->tmp.certificate_types);
-	if (s->s3->tmp.peer_ecpointformatlist)
-		OPENSSL_free(s->s3->tmp.peer_ecpointformatlist);
-	if (s->s3->tmp.peer_ellipticcurvelist)
-		OPENSSL_free(s->s3->tmp.peer_ellipticcurvelist);
-	if (s->s3->tmp.peer_psk_identity_hint)
-		OPENSSL_free(s->s3->tmp.peer_psk_identity_hint);
-	if (s->s3->handshake_buffer) {
-		BIO_free(s->s3->handshake_buffer);
-	}
-	if (s->s3->handshake_dgst) ssl3_free_digest_list(s);
-	if (s->s3->alpn_selected)
-		OPENSSL_free(s->s3->alpn_selected);
+  OPENSSL_cleanse(s->s3, sizeof *s->s3);
+  OPENSSL_free(s->s3);
+  s->s3 = NULL;
+}
 
-	OPENSSL_cleanse(s->s3,sizeof *s->s3);
-	OPENSSL_free(s->s3);
-	s->s3=NULL;
-	}
+void ssl3_clear(SSL *s) {
+  uint8_t *rp, *wp;
+  size_t rlen, wlen;
+  int init_extra;
 
-void ssl3_clear(SSL *s)
-	{
-	unsigned char *rp,*wp;
-	size_t rlen, wlen;
-	int init_extra;
+  /* TODO(davidben): Can this just call ssl3_free + ssl3_new. rbuf, wbuf, and
+   * init_extra are preserved, but this may not serve anything more than saving
+   * a malloc. */
 
-	/* TODO(davidben): Can this just call ssl3_free +
-	 * ssl3_new. rbuf, wbuf, and init_extra are preserved, but
-	 * this may not serve anything more than saving a malloc. */
+  if (s->s3->sniff_buffer != NULL) {
+    BUF_MEM_free(s->s3->sniff_buffer);
+  }
+  s->s3->sniff_buffer = NULL;
 
-	if (s->s3->sniff_buffer != NULL)
-		BUF_MEM_free(s->s3->sniff_buffer);
-	s->s3->sniff_buffer = NULL;
+  ssl3_cleanup_key_block(s);
+  if (s->s3->tmp.ca_names != NULL) {
+    sk_X509_NAME_pop_free(s->s3->tmp.ca_names, X509_NAME_free);
+  }
+  s->s3->tmp.ca_names = NULL;
+  if (s->s3->tmp.certificate_types != NULL) {
+    OPENSSL_free(s->s3->tmp.certificate_types);
+  }
+  s->s3->tmp.certificate_types = NULL;
+  if (s->s3->tmp.peer_ecpointformatlist) {
+    OPENSSL_free(s->s3->tmp.peer_ecpointformatlist);
+  }
+  s->s3->tmp.peer_ecpointformatlist = NULL;
+  if (s->s3->tmp.peer_ellipticcurvelist) {
+    OPENSSL_free(s->s3->tmp.peer_ellipticcurvelist);
+  }
+  s->s3->tmp.peer_ellipticcurvelist = NULL;
+  if (s->s3->tmp.peer_psk_identity_hint) {
+    OPENSSL_free(s->s3->tmp.peer_psk_identity_hint);
+  }
+  s->s3->tmp.peer_psk_identity_hint = NULL;
 
-	ssl3_cleanup_key_block(s);
-	if (s->s3->tmp.ca_names != NULL)
-		sk_X509_NAME_pop_free(s->s3->tmp.ca_names,X509_NAME_free);
-	s->s3->tmp.ca_names = NULL;
-	if (s->s3->tmp.certificate_types != NULL)
-		OPENSSL_free(s->s3->tmp.certificate_types);
-	s->s3->tmp.certificate_types = NULL;
-	if (s->s3->tmp.peer_ecpointformatlist)
-		OPENSSL_free(s->s3->tmp.peer_ecpointformatlist);
-	s->s3->tmp.peer_ecpointformatlist = NULL;
-	if (s->s3->tmp.peer_ellipticcurvelist)
-		OPENSSL_free(s->s3->tmp.peer_ellipticcurvelist);
-	s->s3->tmp.peer_ellipticcurvelist = NULL;
-	if (s->s3->tmp.peer_psk_identity_hint)
-		OPENSSL_free(s->s3->tmp.peer_psk_identity_hint);
-	s->s3->tmp.peer_psk_identity_hint = NULL;
+  if (s->s3->tmp.dh != NULL) {
+    DH_free(s->s3->tmp.dh);
+    s->s3->tmp.dh = NULL;
+  }
+  if (s->s3->tmp.ecdh != NULL) {
+    EC_KEY_free(s->s3->tmp.ecdh);
+    s->s3->tmp.ecdh = NULL;
+  }
+  rp = s->s3->rbuf.buf;
+  wp = s->s3->wbuf.buf;
+  rlen = s->s3->rbuf.len;
+  wlen = s->s3->wbuf.len;
+  init_extra = s->s3->init_extra;
+  if (s->s3->handshake_buffer) {
+    BIO_free(s->s3->handshake_buffer);
+    s->s3->handshake_buffer = NULL;
+  }
+  if (s->s3->handshake_dgst) {
+    ssl3_free_digest_list(s);
+  }
 
-	if (s->s3->tmp.dh != NULL)
-		{
-		DH_free(s->s3->tmp.dh);
-		s->s3->tmp.dh = NULL;
-		}
-	if (s->s3->tmp.ecdh != NULL)
-		{
-		EC_KEY_free(s->s3->tmp.ecdh);
-		s->s3->tmp.ecdh = NULL;
-		}
-	rp = s->s3->rbuf.buf;
-	wp = s->s3->wbuf.buf;
-	rlen = s->s3->rbuf.len;
- 	wlen = s->s3->wbuf.len;
-	init_extra = s->s3->init_extra;
-	if (s->s3->handshake_buffer) {
-		BIO_free(s->s3->handshake_buffer);
-		s->s3->handshake_buffer = NULL;
-	}
-	if (s->s3->handshake_dgst) {
-		ssl3_free_digest_list(s);
-	}	
+  if (s->s3->alpn_selected) {
+    OPENSSL_free(s->s3->alpn_selected);
+    s->s3->alpn_selected = NULL;
+  }
+  memset(s->s3, 0, sizeof *s->s3);
+  s->s3->rbuf.buf = rp;
+  s->s3->wbuf.buf = wp;
+  s->s3->rbuf.len = rlen;
+  s->s3->wbuf.len = wlen;
+  s->s3->init_extra = init_extra;
 
-	if (s->s3->alpn_selected)
-		{
-		OPENSSL_free(s->s3->alpn_selected);
-		s->s3->alpn_selected = NULL;
-		}
-	memset(s->s3,0,sizeof *s->s3);
-	s->s3->rbuf.buf = rp;
-	s->s3->wbuf.buf = wp;
-	s->s3->rbuf.len = rlen;
- 	s->s3->wbuf.len = wlen;
-	s->s3->init_extra = init_extra;
+  ssl_free_wbio_buffer(s);
 
-	ssl_free_wbio_buffer(s);
+  s->packet_length = 0;
+  s->s3->renegotiate = 0;
+  s->s3->total_renegotiations = 0;
+  s->s3->num_renegotiations = 0;
+  s->s3->in_read_app_data = 0;
+  s->version = TLS1_2_VERSION;
 
-	s->packet_length=0;
-	s->s3->renegotiate=0;
-	s->s3->total_renegotiations=0;
-	s->s3->num_renegotiations=0;
-	s->s3->in_read_app_data=0;
-	s->version = TLS1_2_VERSION;
+  if (s->next_proto_negotiated) {
+    OPENSSL_free(s->next_proto_negotiated);
+    s->next_proto_negotiated = NULL;
+    s->next_proto_negotiated_len = 0;
+  }
 
-	if (s->next_proto_negotiated)
-		{
-		OPENSSL_free(s->next_proto_negotiated);
-		s->next_proto_negotiated = NULL;
-		s->next_proto_negotiated_len = 0;
-		}
+  s->s3->tlsext_channel_id_valid = 0;
+}
 
-	s->s3->tlsext_channel_id_valid = 0;
-	}
+static int ssl3_set_req_cert_type(CERT *c, const uint8_t *p, size_t len);
 
-static int ssl3_set_req_cert_type(CERT *c, const unsigned char *p, size_t len);
+long ssl3_ctrl(SSL *s, int cmd, long larg, void *parg) {
+  int ret = 0;
 
-long ssl3_ctrl(SSL *s, int cmd, long larg, void *parg)
-	{
-	int ret=0;
+  if (cmd == SSL_CTRL_SET_TMP_RSA || cmd == SSL_CTRL_SET_TMP_RSA_CB ||
+      cmd == SSL_CTRL_SET_TMP_DH || cmd == SSL_CTRL_SET_TMP_DH_CB) {
+    if (!ssl_cert_inst(&s->cert)) {
+      OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_MALLOC_FAILURE);
+      return 0;
+    }
+  }
 
-	if (cmd == SSL_CTRL_SET_TMP_RSA ||
-	    cmd == SSL_CTRL_SET_TMP_RSA_CB ||
-	    cmd == SSL_CTRL_SET_TMP_DH ||
-	    cmd == SSL_CTRL_SET_TMP_DH_CB)
-		{
-		if (!ssl_cert_inst(&s->cert))
-		    	{
-			OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_MALLOC_FAILURE);
-			return(0);
-			}
-		}
+  switch (cmd) {
+    case SSL_CTRL_GET_SESSION_REUSED:
+      ret = s->hit;
+      break;
 
-	switch (cmd)
-		{
-	case SSL_CTRL_GET_SESSION_REUSED:
-		ret=s->hit;
-		break;
-	case SSL_CTRL_GET_CLIENT_CERT_REQUEST:
-		break;
-	case SSL_CTRL_GET_NUM_RENEGOTIATIONS:
-		ret=s->s3->num_renegotiations;
-		break;
-	case SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS:
-		ret=s->s3->num_renegotiations;
-		s->s3->num_renegotiations=0;
-		break;
-	case SSL_CTRL_GET_TOTAL_RENEGOTIATIONS:
-		ret=s->s3->total_renegotiations;
-		break;
-	case SSL_CTRL_GET_FLAGS:
-		ret=(int)(s->s3->flags);
-		break;
-	case SSL_CTRL_NEED_TMP_RSA:
-		/* Temporary RSA keys are never used. */
-		ret = 0;
-		break;
-	case SSL_CTRL_SET_TMP_RSA:
-		/* Temporary RSA keys are never used. */
-		OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
-		break;
-	case SSL_CTRL_SET_TMP_RSA_CB:
-		{
-		OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
-		return(ret);
-		}
-		break;
-	case SSL_CTRL_SET_TMP_DH:
-		{
-			DH *dh = (DH *)parg;
-			if (dh == NULL)
-				{
-				OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_PASSED_NULL_PARAMETER);
-				return(ret);
-				}
-			if ((dh = DHparams_dup(dh)) == NULL)
-				{
-				OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_DH_LIB);
-				return(ret);
-				}
-			if (!(s->options & SSL_OP_SINGLE_DH_USE))
-				{
-				if (!DH_generate_key(dh))
-					{
-					DH_free(dh);
-					OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_DH_LIB);
-					return(ret);
-					}
-				}
-			if (s->cert->dh_tmp != NULL)
-				DH_free(s->cert->dh_tmp);
-			s->cert->dh_tmp = dh;
-			ret = 1;
-		}
-		break;
-	case SSL_CTRL_SET_TMP_DH_CB:
-		{
-		OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
-		return(ret);
-		}
-		break;
-	case SSL_CTRL_SET_TMP_ECDH:
-		{
-		EC_KEY *ecdh = NULL;
- 			
-		if (parg == NULL)
-			{
-			OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_PASSED_NULL_PARAMETER);
-			return(ret);
-			}
-		if (!EC_KEY_up_ref((EC_KEY *)parg))
-			{
-			OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_ECDH_LIB);
-			return(ret);
-			}
-		ecdh = (EC_KEY *)parg;
-		if (!(s->options & SSL_OP_SINGLE_ECDH_USE))
-			{
-			if (!EC_KEY_generate_key(ecdh))
-				{
-				EC_KEY_free(ecdh);
-				OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_ECDH_LIB);
-				return(ret);
-				}
-			}
-		if (s->cert->ecdh_tmp != NULL)
-			EC_KEY_free(s->cert->ecdh_tmp);
-		s->cert->ecdh_tmp = ecdh;
-		ret = 1;
-		}
-		break;
-	case SSL_CTRL_SET_TMP_ECDH_CB:
-		{
-		OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
-		return(ret);
-		}
-		break;
-	case SSL_CTRL_SET_TLSEXT_HOSTNAME:
- 		if (larg == TLSEXT_NAMETYPE_host_name)
-			{
-			if (s->tlsext_hostname != NULL) 
-				OPENSSL_free(s->tlsext_hostname);
-			s->tlsext_hostname = NULL;
+    case SSL_CTRL_GET_CLIENT_CERT_REQUEST:
+      break;
+
+    case SSL_CTRL_GET_NUM_RENEGOTIATIONS:
+      ret = s->s3->num_renegotiations;
+      break;
+
+    case SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS:
+      ret = s->s3->num_renegotiations;
+      s->s3->num_renegotiations = 0;
+      break;
+
+    case SSL_CTRL_GET_TOTAL_RENEGOTIATIONS:
+      ret = s->s3->total_renegotiations;
+      break;
+
+    case SSL_CTRL_GET_FLAGS:
+      ret = (int)(s->s3->flags);
+      break;
+
+    case SSL_CTRL_NEED_TMP_RSA:
+      /* Temporary RSA keys are never used. */
+      ret = 0;
+      break;
+
+    case SSL_CTRL_SET_TMP_RSA:
+      /* Temporary RSA keys are never used. */
+      OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
+      break;
+
+    case SSL_CTRL_SET_TMP_RSA_CB:
+      OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
+      return ret;
+
+    case SSL_CTRL_SET_TMP_DH: {
+      DH *dh = (DH *)parg;
+      if (dh == NULL) {
+        OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_PASSED_NULL_PARAMETER);
+        return ret;
+      }
+      dh = DHparams_dup(dh);
+      if (dh == NULL) {
+        OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_DH_LIB);
+        return ret;
+      }
+      if (!(s->options & SSL_OP_SINGLE_DH_USE) && !DH_generate_key(dh)) {
+        DH_free(dh);
+        OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_DH_LIB);
+        return ret;
+      }
+      if (s->cert->dh_tmp != NULL) {
+        DH_free(s->cert->dh_tmp);
+      }
+      s->cert->dh_tmp = dh;
+      ret = 1;
+      break;
+    }
+
+    case SSL_CTRL_SET_TMP_DH_CB:
+      OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
+      return ret;
+
+    case SSL_CTRL_SET_TMP_ECDH: {
+      EC_KEY *ecdh = NULL;
+
+      if (parg == NULL) {
+        OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_PASSED_NULL_PARAMETER);
+        return ret;
+      }
+      if (!EC_KEY_up_ref((EC_KEY *)parg)) {
+        OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_ECDH_LIB);
+        return ret;
+      }
+      ecdh = (EC_KEY *)parg;
+      if (!(s->options & SSL_OP_SINGLE_ECDH_USE) && !EC_KEY_generate_key(ecdh)) {
+        EC_KEY_free(ecdh);
+        OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_ECDH_LIB);
+        return ret;
+      }
+      if (s->cert->ecdh_tmp != NULL) {
+        EC_KEY_free(s->cert->ecdh_tmp);
+      }
+      s->cert->ecdh_tmp = ecdh;
+      ret = 1;
+      break;
+    }
+
+    case SSL_CTRL_SET_TMP_ECDH_CB:
+      OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
+      return ret;
+
+    case SSL_CTRL_SET_TLSEXT_HOSTNAME:
+      if (larg == TLSEXT_NAMETYPE_host_name) {
+        if (s->tlsext_hostname != NULL) {
+          OPENSSL_free(s->tlsext_hostname);
+        }
+        s->tlsext_hostname = NULL;
+
+        ret = 1;
+        if (parg == NULL) {
+          break;
+        }
+        if (strlen((char *)parg) > TLSEXT_MAXLEN_host_name) {
+          OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, SSL_R_SSL3_EXT_INVALID_SERVERNAME);
+          return 0;
+        }
+        s->tlsext_hostname = BUF_strdup((char *) parg);
+        if (s->tlsext_hostname == NULL) {
+          OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_INTERNAL_ERROR);
+          return 0;
+        }
+      } else {
+        OPENSSL_PUT_ERROR(SSL, ssl3_ctrl,
+                          SSL_R_SSL3_EXT_INVALID_SERVERNAME_TYPE);
+        return 0;
+      }
+      break;
+
+    case SSL_CTRL_SET_TLSEXT_DEBUG_ARG:
+      s->tlsext_debug_arg = parg;
+      ret = 1;
+      break;
+
+    case SSL_CTRL_CHAIN:
+      if (larg) {
+        return ssl_cert_set1_chain(s->cert, (STACK_OF(X509) *)parg);
+      } else {
+        return ssl_cert_set0_chain(s->cert, (STACK_OF(X509) *)parg);
+      }
+
+    case SSL_CTRL_CHAIN_CERT:
+      if (larg) {
+        return ssl_cert_add1_chain_cert(s->cert, (X509 *)parg);
+      } else {
+        return ssl_cert_add0_chain_cert(s->cert, (X509 *)parg);
+      }
+
+    case SSL_CTRL_GET_CHAIN_CERTS:
+      *(STACK_OF(X509) **)parg = s->cert->key->chain;
+      break;
+
+    case SSL_CTRL_SELECT_CURRENT_CERT:
+      return ssl_cert_select_current(s->cert, (X509 *)parg);
+
+    case SSL_CTRL_GET_CURVES: {
+      const uint16_t *clist = s->s3->tmp.peer_ellipticcurvelist;
+      size_t clistlen = s->s3->tmp.peer_ellipticcurvelist_length;
+      if (parg) {
+        size_t i;
+        int *cptr = parg;
+        int nid;
+        for (i = 0; i < clistlen; i++) {
+          nid = tls1_ec_curve_id2nid(clist[i]);
+          if (nid != OBJ_undef) {
+            cptr[i] = nid;
+          } else {
+            cptr[i] = TLSEXT_nid_unknown | clist[i];
+          }
+        }
+      }
+      return (int)clistlen;
+    }
+
+    case SSL_CTRL_SET_CURVES:
+      return tls1_set_curves(&s->tlsext_ellipticcurvelist,
+                             &s->tlsext_ellipticcurvelist_length, parg, larg);
+
+    case SSL_CTRL_SET_ECDH_AUTO:
+      s->cert->ecdh_tmp_auto = larg;
+      return 1;
+
+    case SSL_CTRL_SET_SIGALGS:
+      return tls1_set_sigalgs(s->cert, parg, larg, 0);
+
+    case SSL_CTRL_SET_CLIENT_SIGALGS:
+      return tls1_set_sigalgs(s->cert, parg, larg, 1);
+
+    case SSL_CTRL_GET_CLIENT_CERT_TYPES: {
+      const uint8_t **pctype = parg;
+      if (s->server || !s->s3->tmp.cert_req) {
+        return 0;
+      }
+      if (pctype) {
+        *pctype = s->s3->tmp.certificate_types;
+      }
+      return (int)s->s3->tmp.num_certificate_types;
+    }
+
+    case SSL_CTRL_SET_CLIENT_CERT_TYPES:
+      if (!s->server) {
+        return 0;
+      }
+      return ssl3_set_req_cert_type(s->cert, parg, larg);
+
+    case SSL_CTRL_BUILD_CERT_CHAIN:
+      return ssl_build_cert_chain(s->cert, s->ctx->cert_store, larg);
+
+    case SSL_CTRL_SET_VERIFY_CERT_STORE:
+      return ssl_cert_set_cert_store(s->cert, parg, 0, larg);
+
+    case SSL_CTRL_SET_CHAIN_CERT_STORE:
+      return ssl_cert_set_cert_store(s->cert, parg, 1, larg);
+
+    case SSL_CTRL_GET_SERVER_TMP_KEY:
+      if (s->server || !s->session || !s->session->sess_cert) {
+        return 0;
+      } else {
+        SESS_CERT *sc;
+        EVP_PKEY *ptmp;
+        int rv = 0;
+        sc = s->session->sess_cert;
+        if (!sc->peer_dh_tmp && !sc->peer_ecdh_tmp) {
+          return 0;
+        }
+        ptmp = EVP_PKEY_new();
+        if (!ptmp) {
+          return 0;
+        }
+        if (sc->peer_dh_tmp) {
+          rv = EVP_PKEY_set1_DH(ptmp, sc->peer_dh_tmp);
+        } else if (sc->peer_ecdh_tmp) {
+          rv = EVP_PKEY_set1_EC_KEY(ptmp, sc->peer_ecdh_tmp);
+        }
+        if (rv) {
+          *(EVP_PKEY **)parg = ptmp;
+          return 1;
+        }
+        EVP_PKEY_free(ptmp);
+        return 0;
+      }
+
+    case SSL_CTRL_GET_EC_POINT_FORMATS: {
+      const uint8_t **pformat = parg;
+      if (!s->s3->tmp.peer_ecpointformatlist) {
+        return 0;
+      }
+      *pformat = s->s3->tmp.peer_ecpointformatlist;
+      return (int)s->s3->tmp.peer_ecpointformatlist_length;
+    }
+
+    case SSL_CTRL_CHANNEL_ID:
+      s->tlsext_channel_id_enabled = 1;
+      ret = 1;
+      break;
+
+    case SSL_CTRL_SET_CHANNEL_ID:
+      s->tlsext_channel_id_enabled = 1;
+      if (EVP_PKEY_bits(parg) != 256) {
+        OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, SSL_R_CHANNEL_ID_NOT_P256);
+        break;
+      }
+      if (s->tlsext_channel_id_private) {
+        EVP_PKEY_free(s->tlsext_channel_id_private);
+      }
+      s->tlsext_channel_id_private = EVP_PKEY_dup((EVP_PKEY *)parg);
+      ret = 1;
+      break;
+
+    case SSL_CTRL_GET_CHANNEL_ID:
+      if (!s->s3->tlsext_channel_id_valid) {
+        break;
+      }
+      memcpy(parg, s->s3->tlsext_channel_id, larg < 64 ? larg : 64);
+      return 64;
+
+    case SSL_CTRL_FALLBACK_SCSV:
+      s->fallback_scsv = 1;
+      ret = 1;
+      break;
+
+    default:
+      break;
+  }
 
-			ret = 1;
-			if (parg == NULL) 
-				break;
-			if (strlen((char *)parg) > TLSEXT_MAXLEN_host_name)
-				{
-				OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, SSL_R_SSL3_EXT_INVALID_SERVERNAME);
-				return 0;
-				}
-			if ((s->tlsext_hostname = BUF_strdup((char *)parg)) == NULL)
-				{
-				OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, ERR_R_INTERNAL_ERROR);
-				return 0;
-				}
-			}
-		else
-			{
-			OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, SSL_R_SSL3_EXT_INVALID_SERVERNAME_TYPE);
-			return 0;
-			}
- 		break;
-	case SSL_CTRL_SET_TLSEXT_DEBUG_ARG:
-		s->tlsext_debug_arg=parg;
-		ret = 1;
-		break;
+  return ret;
+}
 
-	case SSL_CTRL_CHAIN:
-		if (larg)
-			return ssl_cert_set1_chain(s->cert,
-						(STACK_OF (X509) *)parg);
-		else
-			return ssl_cert_set0_chain(s->cert,
-						(STACK_OF (X509) *)parg);
+long ssl3_callback_ctrl(SSL *s, int cmd, void (*fp)(void)) {
+  int ret = 0;
 
-	case SSL_CTRL_CHAIN_CERT:
-		if (larg)
-			return ssl_cert_add1_chain_cert(s->cert, (X509 *)parg);
-		else
-			return ssl_cert_add0_chain_cert(s->cert, (X509 *)parg);
+  if ((cmd == SSL_CTRL_SET_TMP_RSA_CB || cmd == SSL_CTRL_SET_TMP_DH_CB) &&
+      !ssl_cert_inst(&s->cert)) {
+    OPENSSL_PUT_ERROR(SSL, ssl3_callback_ctrl, ERR_R_MALLOC_FAILURE);
+    return 0;
+  }
 
-	case SSL_CTRL_GET_CHAIN_CERTS:
-		*(STACK_OF(X509) **)parg = s->cert->key->chain;
-		break;
+  switch (cmd) {
+    case SSL_CTRL_SET_TMP_RSA_CB:
+      /* Ignore the callback; temporary RSA keys are never used. */
+      break;
 
-	case SSL_CTRL_SELECT_CURRENT_CERT:
-		return ssl_cert_select_current(s->cert, (X509 *)parg);
+    case SSL_CTRL_SET_TMP_DH_CB:
+      s->cert->dh_tmp_cb = (DH * (*)(SSL *, int, int))fp;
+      break;
 
-	case SSL_CTRL_GET_CURVES:
-		{
-		const uint16_t *clist = s->s3->tmp.peer_ellipticcurvelist;
-		size_t clistlen = s->s3->tmp.peer_ellipticcurvelist_length;
-		if (parg)
-			{
-			size_t i;
-			int *cptr = parg;
-			int nid;
-			for (i = 0; i < clistlen; i++)
-				{
-				nid = tls1_ec_curve_id2nid(clist[i]);
-				if (nid != OBJ_undef)
-					cptr[i] = nid;
-				else
-					cptr[i] = TLSEXT_nid_unknown | clist[i];
-				}
-			}
-		return (int)clistlen;
-		}
+    case SSL_CTRL_SET_TMP_ECDH_CB:
+      s->cert->ecdh_tmp_cb = (EC_KEY * (*)(SSL *, int, int))fp;
+      break;
 
-	case SSL_CTRL_SET_CURVES:
-		return tls1_set_curves(&s->tlsext_ellipticcurvelist,
-					&s->tlsext_ellipticcurvelist_length,
-								parg, larg);
+    case SSL_CTRL_SET_TLSEXT_DEBUG_CB:
+      s->tlsext_debug_cb =
+          (void (*)(SSL *, int, int, uint8_t *, int, void *))fp;
+      break;
 
-	case SSL_CTRL_SET_ECDH_AUTO:
-		s->cert->ecdh_tmp_auto = larg;
-		return 1;
-	case SSL_CTRL_SET_SIGALGS:
-		return tls1_set_sigalgs(s->cert, parg, larg, 0);
+    default:
+      break;
+  }
 
-	case SSL_CTRL_SET_CLIENT_SIGALGS:
-		return tls1_set_sigalgs(s->cert, parg, larg, 1);
+  return ret;
+}
 
-	case SSL_CTRL_GET_CLIENT_CERT_TYPES:
-		{
-		const unsigned char **pctype = parg;
-		if (s->server || !s->s3->tmp.cert_req)
-			return 0;
-		if (pctype)
-			*pctype = s->s3->tmp.certificate_types;
-		return (int)s->s3->tmp.num_certificate_types;
-		}
+long ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) {
+  CERT *cert;
 
-	case SSL_CTRL_SET_CLIENT_CERT_TYPES:
-		if (!s->server)
-			return 0;
-		return ssl3_set_req_cert_type(s->cert, parg, larg);
+  cert = ctx->cert;
 
-	case SSL_CTRL_BUILD_CERT_CHAIN:
-		return ssl_build_cert_chain(s->cert, s->ctx->cert_store, larg);
+  switch (cmd) {
+    case SSL_CTRL_NEED_TMP_RSA:
+      /* Temporary RSA keys are never used. */
+      return 0;
 
-	case SSL_CTRL_SET_VERIFY_CERT_STORE:
-		return ssl_cert_set_cert_store(s->cert, parg, 0, larg);
+    case SSL_CTRL_SET_TMP_RSA:
+      OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
+      return 0;
 
-	case SSL_CTRL_SET_CHAIN_CERT_STORE:
-		return ssl_cert_set_cert_store(s->cert, parg, 1, larg);
+    case SSL_CTRL_SET_TMP_RSA_CB:
+      OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
+      return 0;
 
-	case SSL_CTRL_GET_SERVER_TMP_KEY:
-		if (s->server || !s->session || !s->session->sess_cert)
-			return 0;
-		else
-			{
-			SESS_CERT *sc;
-			EVP_PKEY *ptmp;
-			int rv = 0;
-			sc = s->session->sess_cert;
-			if (!sc->peer_dh_tmp && !sc->peer_ecdh_tmp)
-				return 0;
-			ptmp = EVP_PKEY_new();
-			if (!ptmp)
-				return 0;
-			if (sc->peer_dh_tmp)
-				rv = EVP_PKEY_set1_DH(ptmp, sc->peer_dh_tmp);
-			else if (sc->peer_ecdh_tmp)
-				rv = EVP_PKEY_set1_EC_KEY(ptmp, sc->peer_ecdh_tmp);
-			if (rv)
-				{
-				*(EVP_PKEY **)parg = ptmp;
-				return 1;
-				}
-			EVP_PKEY_free(ptmp);
-			return 0;
-			}
-	case SSL_CTRL_GET_EC_POINT_FORMATS:
-		{
-		const uint8_t **pformat = parg;
-		if (!s->s3->tmp.peer_ecpointformatlist)
-			return 0;
-		*pformat = s->s3->tmp.peer_ecpointformatlist;
-		return (int)s->s3->tmp.peer_ecpointformatlist_length;
-		}
+    case SSL_CTRL_SET_TMP_DH: {
+      DH *new = NULL, *dh;
 
-	case SSL_CTRL_CHANNEL_ID:
-		s->tlsext_channel_id_enabled = 1;
-		ret = 1;
-		break;
+      dh = (DH *)parg;
+      new = DHparams_dup(dh);
+      if (new == NULL) {
+        OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, ERR_R_DH_LIB);
+        return 0;
+      }
+      if (!(ctx->options & SSL_OP_SINGLE_DH_USE) && !DH_generate_key(new)) {
+        OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, ERR_R_DH_LIB);
+        DH_free(new);
+        return 0;
+      }
+      if (cert->dh_tmp != NULL) {
+        DH_free(cert->dh_tmp);
+      }
+      cert->dh_tmp = new;
+      return 1;
+    }
 
-	case SSL_CTRL_SET_CHANNEL_ID:
-		s->tlsext_channel_id_enabled = 1;
-		if (EVP_PKEY_bits(parg) != 256)
-			{
-			OPENSSL_PUT_ERROR(SSL, ssl3_ctrl, SSL_R_CHANNEL_ID_NOT_P256);
-			break;
-			}
-		if (s->tlsext_channel_id_private)
-			EVP_PKEY_free(s->tlsext_channel_id_private);
-		s->tlsext_channel_id_private = EVP_PKEY_dup((EVP_PKEY*) parg);
-		ret = 1;
-		break;
+    case SSL_CTRL_SET_TMP_DH_CB:
+      OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
+      return 0;
 
-	case SSL_CTRL_GET_CHANNEL_ID:
-		if (!s->s3->tlsext_channel_id_valid)
-			break;
-		memcpy(parg, s->s3->tlsext_channel_id, larg < 64 ? larg : 64);
-		return 64;
+    case SSL_CTRL_SET_TMP_ECDH: {
+      EC_KEY *ecdh = NULL;
 
-	case SSL_CTRL_FALLBACK_SCSV:
-		s->fallback_scsv = 1;
-		ret = 1;
-		break;
+      if (parg == NULL) {
+        OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, ERR_R_ECDH_LIB);
+        return 0;
+      }
+      ecdh = EC_KEY_dup((EC_KEY *)parg);
+      if (ecdh == NULL) {
+        OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, ERR_R_EC_LIB);
+        return 0;
+      }
+      if (!(ctx->options & SSL_OP_SINGLE_ECDH_USE) &&
+          !EC_KEY_generate_key(ecdh)) {
+        EC_KEY_free(ecdh);
+        OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, ERR_R_ECDH_LIB);
+        return 0;
+      }
 
-	default:
-		break;
-		}
-	return(ret);
-	}
+      if (cert->ecdh_tmp != NULL) {
+        EC_KEY_free(cert->ecdh_tmp);
+      }
+      cert->ecdh_tmp = ecdh;
+      return 1;
+    }
 
-long ssl3_callback_ctrl(SSL *s, int cmd, void (*fp)(void))
-	{
-	int ret=0;
+    case SSL_CTRL_SET_TMP_ECDH_CB:
+      OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
+      return 0;
 
-	if (cmd == SSL_CTRL_SET_TMP_RSA_CB || cmd == SSL_CTRL_SET_TMP_DH_CB)
-		{
-		if (!ssl_cert_inst(&s->cert))
-			{
-			OPENSSL_PUT_ERROR(SSL, ssl3_callback_ctrl, ERR_R_MALLOC_FAILURE);
-			return(0);
-			}
-		}
+    case SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG:
+      ctx->tlsext_servername_arg = parg;
+      break;
 
-	switch (cmd)
-		{
-	case SSL_CTRL_SET_TMP_RSA_CB:
-		/* Ignore the callback; temporary RSA keys are never used. */
-		break;
-	case SSL_CTRL_SET_TMP_DH_CB:
-		{
-		s->cert->dh_tmp_cb = (DH *(*)(SSL *, int, int))fp;
-		}
-		break;
-	case SSL_CTRL_SET_TMP_ECDH_CB:
-		{
-		s->cert->ecdh_tmp_cb = (EC_KEY *(*)(SSL *, int, int))fp;
-		}
-		break;
-	case SSL_CTRL_SET_TLSEXT_DEBUG_CB:
-		s->tlsext_debug_cb=(void (*)(SSL *,int ,int,
-					unsigned char *, int, void *))fp;
-		break;
-	default:
-		break;
-		}
-	return(ret);
-	}
+    case SSL_CTRL_SET_TLSEXT_TICKET_KEYS:
+    case SSL_CTRL_GET_TLSEXT_TICKET_KEYS: {
+      uint8_t *keys = parg;
+      if (!keys) {
+        return 48;
+      }
+      if (larg != 48) {
+        OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, SSL_R_INVALID_TICKET_KEYS_LENGTH);
+        return 0;
+      }
+      if (cmd == SSL_CTRL_SET_TLSEXT_TICKET_KEYS) {
+        memcpy(ctx->tlsext_tick_key_name, keys, 16);
+        memcpy(ctx->tlsext_tick_hmac_key, keys + 16, 16);
+        memcpy(ctx->tlsext_tick_aes_key, keys + 32, 16);
+      } else {
+        memcpy(keys, ctx->tlsext_tick_key_name, 16);
+        memcpy(keys + 16, ctx->tlsext_tick_hmac_key, 16);
+        memcpy(keys + 32, ctx->tlsext_tick_aes_key, 16);
+      }
+      return 1;
+    }
 
-long ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg)
-	{
-	CERT *cert;
+    case SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG:
+      ctx->tlsext_status_arg = parg;
+      return 1;
+      break;
 
-	cert=ctx->cert;
+    case SSL_CTRL_SET_CURVES:
+      return tls1_set_curves(&ctx->tlsext_ellipticcurvelist,
+                             &ctx->tlsext_ellipticcurvelist_length, parg, larg);
 
-	switch (cmd)
-		{
-	case SSL_CTRL_NEED_TMP_RSA:
-		/* Temporary RSA keys are never used. */
-		return 0;
-	case SSL_CTRL_SET_TMP_RSA:
-		OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
-		return 0;
-	case SSL_CTRL_SET_TMP_RSA_CB:
-		{
-		OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
-		return(0);
-		}
-		break;
-	case SSL_CTRL_SET_TMP_DH:
-		{
-		DH *new=NULL,*dh;
+    case SSL_CTRL_SET_ECDH_AUTO:
+      ctx->cert->ecdh_tmp_auto = larg;
+      return 1;
 
-		dh=(DH *)parg;
-		if ((new=DHparams_dup(dh)) == NULL)
-			{
-			OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, ERR_R_DH_LIB);
-			return 0;
-			}
-		if (!(ctx->options & SSL_OP_SINGLE_DH_USE))
-			{
-			if (!DH_generate_key(new))
-				{
-				OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, ERR_R_DH_LIB);
-				DH_free(new);
-				return 0;
-				}
-			}
-		if (cert->dh_tmp != NULL)
-			DH_free(cert->dh_tmp);
-		cert->dh_tmp=new;
-		return 1;
-		}
-		/*break; */
-	case SSL_CTRL_SET_TMP_DH_CB:
-		{
-		OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
-		return(0);
-		}
-		break;
-	case SSL_CTRL_SET_TMP_ECDH:
-		{
-		EC_KEY *ecdh = NULL;
- 			
-		if (parg == NULL)
-			{
-			OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, ERR_R_ECDH_LIB);
-			return 0;
-			}
-		ecdh = EC_KEY_dup((EC_KEY *)parg);
-		if (ecdh == NULL)
-			{
-			OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, ERR_R_EC_LIB);
-			return 0;
-			}
-		if (!(ctx->options & SSL_OP_SINGLE_ECDH_USE))
-			{
-			if (!EC_KEY_generate_key(ecdh))
-				{
-				EC_KEY_free(ecdh);
-				OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, ERR_R_ECDH_LIB);
-				return 0;
-				}
-			}
+    case SSL_CTRL_SET_SIGALGS:
+      return tls1_set_sigalgs(ctx->cert, parg, larg, 0);
 
-		if (cert->ecdh_tmp != NULL)
-			{
-			EC_KEY_free(cert->ecdh_tmp);
-			}
-		cert->ecdh_tmp = ecdh;
-		return 1;
-		}
-		/* break; */
-	case SSL_CTRL_SET_TMP_ECDH_CB:
-		{
-		OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
-		return(0);
-		}
-		break;
-	case SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG:
-		ctx->tlsext_servername_arg=parg;
-		break;
-	case SSL_CTRL_SET_TLSEXT_TICKET_KEYS:
-	case SSL_CTRL_GET_TLSEXT_TICKET_KEYS:
-		{
-		unsigned char *keys = parg;
-		if (!keys)
-			return 48;
-		if (larg != 48)
-			{
-			OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, SSL_R_INVALID_TICKET_KEYS_LENGTH);
-			return 0;
-			}
-		if (cmd == SSL_CTRL_SET_TLSEXT_TICKET_KEYS)
-			{
-			memcpy(ctx->tlsext_tick_key_name, keys, 16);
-			memcpy(ctx->tlsext_tick_hmac_key, keys + 16, 16);
-			memcpy(ctx->tlsext_tick_aes_key, keys + 32, 16);
-			}
-		else
-			{
-			memcpy(keys, ctx->tlsext_tick_key_name, 16);
-			memcpy(keys + 16, ctx->tlsext_tick_hmac_key, 16);
-			memcpy(keys + 32, ctx->tlsext_tick_aes_key, 16);
-			}
-		return 1;
-		}
+    case SSL_CTRL_SET_CLIENT_SIGALGS:
+      return tls1_set_sigalgs(ctx->cert, parg, larg, 1);
 
-	case SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG:
-		ctx->tlsext_status_arg=parg;
-		return 1;
-		break;
+    case SSL_CTRL_SET_CLIENT_CERT_TYPES:
+      return ssl3_set_req_cert_type(ctx->cert, parg, larg);
 
-	case SSL_CTRL_SET_CURVES:
-		return tls1_set_curves(&ctx->tlsext_ellipticcurvelist,
-					&ctx->tlsext_ellipticcurvelist_length,
-								parg, larg);
+    case SSL_CTRL_BUILD_CERT_CHAIN:
+      return ssl_build_cert_chain(ctx->cert, ctx->cert_store, larg);
 
-	case SSL_CTRL_SET_ECDH_AUTO:
-		ctx->cert->ecdh_tmp_auto = larg;
-		return 1;
-	case SSL_CTRL_SET_SIGALGS:
-		return tls1_set_sigalgs(ctx->cert, parg, larg, 0);
+    case SSL_CTRL_SET_VERIFY_CERT_STORE:
+      return ssl_cert_set_cert_store(ctx->cert, parg, 0, larg);
 
-	case SSL_CTRL_SET_CLIENT_SIGALGS:
-		return tls1_set_sigalgs(ctx->cert, parg, larg, 1);
+    case SSL_CTRL_SET_CHAIN_CERT_STORE:
+      return ssl_cert_set_cert_store(ctx->cert, parg, 1, larg);
 
-	case SSL_CTRL_SET_CLIENT_CERT_TYPES:
-		return ssl3_set_req_cert_type(ctx->cert, parg, larg);
+    case SSL_CTRL_EXTRA_CHAIN_CERT:
+      if (ctx->extra_certs == NULL) {
+        ctx->extra_certs = sk_X509_new_null();
+        if (ctx->extra_certs == NULL) {
+          return 0;
+        }
+      }
+      sk_X509_push(ctx->extra_certs, (X509 *)parg);
+      break;
 
-	case SSL_CTRL_BUILD_CERT_CHAIN:
-		return ssl_build_cert_chain(ctx->cert, ctx->cert_store, larg);
+    case SSL_CTRL_GET_EXTRA_CHAIN_CERTS:
+      if (ctx->extra_certs == NULL && larg == 0) {
+        *(STACK_OF(X509) **)parg = ctx->cert->key->chain;
+      } else {
+        *(STACK_OF(X509) **)parg = ctx->extra_certs;
+      }
+      break;
 
-	case SSL_CTRL_SET_VERIFY_CERT_STORE:
-		return ssl_cert_set_cert_store(ctx->cert, parg, 0, larg);
+    case SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS:
+      if (ctx->extra_certs) {
+        sk_X509_pop_free(ctx->extra_certs, X509_free);
+        ctx->extra_certs = NULL;
+      }
+      break;
 
-	case SSL_CTRL_SET_CHAIN_CERT_STORE:
-		return ssl_cert_set_cert_store(ctx->cert, parg, 1, larg);
+    case SSL_CTRL_CHAIN:
+      if (larg) {
+        return ssl_cert_set1_chain(ctx->cert, (STACK_OF(X509) *)parg);
+      } else {
+        return ssl_cert_set0_chain(ctx->cert, (STACK_OF(X509) *)parg);
+      }
 
+    case SSL_CTRL_CHAIN_CERT:
+      if (larg) {
+        return ssl_cert_add1_chain_cert(ctx->cert, (X509 *)parg);
+      } else {
+        return ssl_cert_add0_chain_cert(ctx->cert, (X509 *)parg);
+      }
 
-	/* A Thawte special :-) */
-	case SSL_CTRL_EXTRA_CHAIN_CERT:
-		if (ctx->extra_certs == NULL)
-			{
-			if ((ctx->extra_certs=sk_X509_new_null()) == NULL)
-				return(0);
-			}
-		sk_X509_push(ctx->extra_certs,(X509 *)parg);
-		break;
+    case SSL_CTRL_GET_CHAIN_CERTS:
+      *(STACK_OF(X509) **)parg = ctx->cert->key->chain;
+      break;
 
-	case SSL_CTRL_GET_EXTRA_CHAIN_CERTS:
-		if (ctx->extra_certs == NULL && larg == 0)
-			*(STACK_OF(X509) **)parg =  ctx->cert->key->chain;
-		else
-			*(STACK_OF(X509) **)parg =  ctx->extra_certs;
-		break;
+    case SSL_CTRL_SELECT_CURRENT_CERT:
+      return ssl_cert_select_current(ctx->cert, (X509 *)parg);
 
-	case SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS:
-		if (ctx->extra_certs)
-			{
-			sk_X509_pop_free(ctx->extra_certs, X509_free);
-			ctx->extra_certs = NULL;
-			}
-		break;
+    case SSL_CTRL_CHANNEL_ID:
+      ctx->tlsext_channel_id_enabled = 1;
+      return 1;
 
-	case SSL_CTRL_CHAIN:
-		if (larg)
-			return ssl_cert_set1_chain(ctx->cert,
-						(STACK_OF (X509) *)parg);
-		else
-			return ssl_cert_set0_chain(ctx->cert,
-						(STACK_OF (X509) *)parg);
+    case SSL_CTRL_SET_CHANNEL_ID:
+      ctx->tlsext_channel_id_enabled = 1;
+      if (EVP_PKEY_bits(parg) != 256) {
+        OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, SSL_R_CHANNEL_ID_NOT_P256);
+        break;
+      }
+      if (ctx->tlsext_channel_id_private) {
+        EVP_PKEY_free(ctx->tlsext_channel_id_private);
+      }
+      ctx->tlsext_channel_id_private = EVP_PKEY_dup((EVP_PKEY *)parg);
+      break;
 
-	case SSL_CTRL_CHAIN_CERT:
-		if (larg)
-			return ssl_cert_add1_chain_cert(ctx->cert, (X509 *)parg);
-		else
-			return ssl_cert_add0_chain_cert(ctx->cert, (X509 *)parg);
+    default:
+      return 0;
+  }
 
-	case SSL_CTRL_GET_CHAIN_CERTS:
-		*(STACK_OF(X509) **)parg = ctx->cert->key->chain;
-		break;
+  return 1;
+}
 
-	case SSL_CTRL_SELECT_CURRENT_CERT:
-		return ssl_cert_select_current(ctx->cert, (X509 *)parg);
+long ssl3_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)(void)) {
+  CERT *cert;
 
-	case SSL_CTRL_CHANNEL_ID:
-		ctx->tlsext_channel_id_enabled=1;
-		return 1;
+  cert = ctx->cert;
 
-	case SSL_CTRL_SET_CHANNEL_ID:
-		ctx->tlsext_channel_id_enabled = 1;
-		if (EVP_PKEY_bits(parg) != 256)
-			{
-			OPENSSL_PUT_ERROR(SSL, ssl3_ctx_ctrl, SSL_R_CHANNEL_ID_NOT_P256);
-			break;
-			}
-		if (ctx->tlsext_channel_id_private)
-			EVP_PKEY_free(ctx->tlsext_channel_id_private);
-		ctx->tlsext_channel_id_private = EVP_PKEY_dup((EVP_PKEY*) parg);
-		break;
+  switch (cmd) {
+    case SSL_CTRL_SET_TMP_RSA_CB:
+      /* Ignore the callback; temporary RSA keys are never used. */
+      break;
 
-	default:
-		return(0);
-		}
-	return(1);
-	}
+    case SSL_CTRL_SET_TMP_DH_CB:
+      cert->dh_tmp_cb = (DH * (*)(SSL *, int, int))fp;
+      break;
 
-long ssl3_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)(void))
-	{
-	CERT *cert;
+    case SSL_CTRL_SET_TMP_ECDH_CB:
+      cert->ecdh_tmp_cb = (EC_KEY * (*)(SSL *, int, int))fp;
+      break;
 
-	cert=ctx->cert;
+    case SSL_CTRL_SET_TLSEXT_SERVERNAME_CB:
+      ctx->tlsext_servername_callback = (int (*)(SSL *, int *, void *))fp;
+      break;
 
-	switch (cmd)
-		{
-	case SSL_CTRL_SET_TMP_RSA_CB:
-		/* Ignore the callback; temporary RSA keys are never used. */
-		break;
-	case SSL_CTRL_SET_TMP_DH_CB:
-		{
-		cert->dh_tmp_cb = (DH *(*)(SSL *, int, int))fp;
-		}
-		break;
-	case SSL_CTRL_SET_TMP_ECDH_CB:
-		{
-		cert->ecdh_tmp_cb = (EC_KEY *(*)(SSL *, int, int))fp;
-		}
-		break;
-	case SSL_CTRL_SET_TLSEXT_SERVERNAME_CB:
-		ctx->tlsext_servername_callback=(int (*)(SSL *,int *,void *))fp;
-		break;
+    case SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB:
+      ctx->tlsext_status_cb = (int (*)(SSL *, void *))fp;
+      break;
 
-	case SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB:
-		ctx->tlsext_status_cb=(int (*)(SSL *,void *))fp;
-		break;
+    case SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB:
+      ctx->tlsext_ticket_key_cb = (int (
+          *)(SSL *, uint8_t *, uint8_t *, EVP_CIPHER_CTX *, HMAC_CTX *, int))fp;
+      break;
 
-	case SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB:
-		ctx->tlsext_ticket_key_cb=(int (*)(SSL *,unsigned char  *,
-						unsigned char *,
-						EVP_CIPHER_CTX *,
-						HMAC_CTX *, int))fp;
-		break;
+    default:
+      return 0;
+  }
 
-	default:
-		return(0);
-		}
-	return(1);
-	}
+  return 1;
+}
 
-/* ssl3_get_cipher_by_value returns the SSL_CIPHER with value |value| or NULL if
- * none exists.
+/* ssl3_get_cipher_by_value returns the SSL_CIPHER with value |value| or NULL
+ * if none exists.
  *
  * This function needs to check if the ciphers required are actually
  * available. */
-const SSL_CIPHER *ssl3_get_cipher_by_value(uint16_t value)
-	{
-	SSL_CIPHER c;
+const SSL_CIPHER *ssl3_get_cipher_by_value(uint16_t value) {
+  SSL_CIPHER c;
 
-	c.id = 0x03000000L|value;
-	return bsearch(&c, ssl3_ciphers, SSL3_NUM_CIPHERS, sizeof(SSL_CIPHER), ssl_cipher_id_cmp);
-	}
+  c.id = 0x03000000L | value;
+  return bsearch(&c, ssl3_ciphers, SSL3_NUM_CIPHERS, sizeof(SSL_CIPHER),
+                 ssl_cipher_id_cmp);
+}
 
 /* ssl3_get_cipher_by_value returns the cipher value of |c|. */
-uint16_t ssl3_get_cipher_value(const SSL_CIPHER *c)
-	{
-	unsigned long id = c->id;
-	/* All ciphers are SSLv3 now. */
-	assert((id & 0xff000000) == 0x03000000);
-	return id & 0xffff;
-	}
+uint16_t ssl3_get_cipher_value(const SSL_CIPHER *c) {
+  unsigned long id = c->id;
+  /* All ciphers are SSLv3 now. */
+  assert((id & 0xff000000) == 0x03000000);
+  return id & 0xffff;
+}
 
-struct ssl_cipher_preference_list_st* ssl_get_cipher_preferences(SSL *s)
-	{
-	if (s->cipher_list != NULL)
-		return(s->cipher_list);
+struct ssl_cipher_preference_list_st *ssl_get_cipher_preferences(SSL *s) {
+  if (s->cipher_list != NULL) {
+    return s->cipher_list;
+  }
 
-	if (s->version >= TLS1_1_VERSION)
-		{
-		if (s->ctx != NULL && s->ctx->cipher_list_tls11 != NULL)
-			return s->ctx->cipher_list_tls11;
-		}
+  if (s->version >= TLS1_1_VERSION && s->ctx != NULL &&
+      s->ctx->cipher_list_tls11 != NULL) {
+    return s->ctx->cipher_list_tls11;
+  }
 
-	if ((s->ctx != NULL) && (s->ctx->cipher_list != NULL))
-		return(s->ctx->cipher_list);
+  if (s->ctx != NULL && s->ctx->cipher_list != NULL) {
+    return s->ctx->cipher_list;
+  }
 
-	return NULL;
-	}
+  return NULL;
+}
 
-const SSL_CIPHER *ssl3_choose_cipher(SSL *s, STACK_OF(SSL_CIPHER) *clnt,
-	     struct ssl_cipher_preference_list_st *server_pref)
-	{
-	const SSL_CIPHER *c,*ret=NULL;
-	STACK_OF(SSL_CIPHER) *srvr = server_pref->ciphers, *prio, *allow;
-	size_t i;
-	int ok;
-	size_t cipher_index;
-	unsigned long alg_k,alg_a,mask_k,mask_a;
-	/* in_group_flags will either be NULL, or will point to an array of
-	 * bytes which indicate equal-preference groups in the |prio| stack.
-	 * See the comment about |in_group_flags| in the
-	 * |ssl_cipher_preference_list_st| struct. */
-	const unsigned char *in_group_flags;
-	/* group_min contains the minimal index so far found in a group, or -1
-	 * if no such value exists yet. */
-	int group_min = -1;
+const SSL_CIPHER *ssl3_choose_cipher(
+    SSL *s, STACK_OF(SSL_CIPHER) * clnt,
+    struct ssl_cipher_preference_list_st *server_pref) {
+  const SSL_CIPHER *c, *ret = NULL;
+  STACK_OF(SSL_CIPHER) *srvr = server_pref->ciphers, *prio, *allow;
+  size_t i;
+  int ok;
+  size_t cipher_index;
+  unsigned long alg_k, alg_a, mask_k, mask_a;
+  /* in_group_flags will either be NULL, or will point to an array of bytes
+   * which indicate equal-preference groups in the |prio| stack. See the
+   * comment about |in_group_flags| in the |ssl_cipher_preference_list_st|
+   * struct. */
+  const uint8_t *in_group_flags;
+  /* group_min contains the minimal index so far found in a group, or -1 if no
+   * such value exists yet. */
+  int group_min = -1;
 
-	if (s->options & SSL_OP_CIPHER_SERVER_PREFERENCE)
-		{
-		prio = srvr;
-		in_group_flags = server_pref->in_group_flags;
-		allow = clnt;
-		}
-	else
-		{
-		prio = clnt;
-		in_group_flags = NULL;
-		allow = srvr;
-		}
+  if (s->options & SSL_OP_CIPHER_SERVER_PREFERENCE) {
+    prio = srvr;
+    in_group_flags = server_pref->in_group_flags;
+    allow = clnt;
+  } else {
+    prio = clnt;
+    in_group_flags = NULL;
+    allow = srvr;
+  }
 
-	ssl_get_compatible_server_ciphers(s, &mask_k, &mask_a);
+  ssl_get_compatible_server_ciphers(s, &mask_k, &mask_a);
 
-	for (i=0; i<sk_SSL_CIPHER_num(prio); i++)
-		{
-		c=sk_SSL_CIPHER_value(prio,i);
+  for (i = 0; i < sk_SSL_CIPHER_num(prio); i++) {
+    c = sk_SSL_CIPHER_value(prio, i);
 
-		ok = 1;
+    ok = 1;
 
-		/* Skip TLS v1.2 only ciphersuites if not supported */
-		if ((c->algorithm_ssl & SSL_TLSV1_2) &&
-			!SSL_USE_TLS1_2_CIPHERS(s))
-			ok = 0;
+    /* Skip TLS v1.2 only ciphersuites if not supported */
+    if ((c->algorithm_ssl & SSL_TLSV1_2) && !SSL_USE_TLS1_2_CIPHERS(s)) {
+      ok = 0;
+    }
 
-		alg_k=c->algorithm_mkey;
-		alg_a=c->algorithm_auth;
+    alg_k = c->algorithm_mkey;
+    alg_a = c->algorithm_auth;
 
-		ok = ok && (alg_k & mask_k) && (alg_a & mask_a);
+    ok = ok && (alg_k & mask_k) && (alg_a & mask_a);
 
-		if (ok && sk_SSL_CIPHER_find(allow, &cipher_index, c))
-			{
-			if (in_group_flags != NULL && in_group_flags[i] == 1)
-				{
-				/* This element of |prio| is in a group. Update
-				 * the minimum index found so far and continue
-				 * looking. */
-				if (group_min == -1 || (size_t)group_min > cipher_index)
-					group_min = cipher_index;
-				}
-			else
-				{
-				if (group_min != -1 && (size_t)group_min < cipher_index)
-					cipher_index = group_min;
-				ret=sk_SSL_CIPHER_value(allow,cipher_index);
-				break;
-				}
-			}
+    if (ok && sk_SSL_CIPHER_find(allow, &cipher_index, c)) {
+      if (in_group_flags != NULL && in_group_flags[i] == 1) {
+        /* This element of |prio| is in a group. Update the minimum index found
+         * so far and continue looking. */
+        if (group_min == -1 || (size_t)group_min > cipher_index) {
+          group_min = cipher_index;
+        }
+      } else {
+        if (group_min != -1 && (size_t)group_min < cipher_index) {
+          cipher_index = group_min;
+        }
+        ret = sk_SSL_CIPHER_value(allow, cipher_index);
+        break;
+      }
+    }
 
-		if (in_group_flags != NULL &&
-		    in_group_flags[i] == 0 &&
-		    group_min != -1)
-			{
-			/* We are about to leave a group, but we found a match
-			 * in it, so that's our answer. */
-			ret=sk_SSL_CIPHER_value(allow,group_min);
-			break;
-			}
-		}
-	return(ret);
-	}
+    if (in_group_flags != NULL && in_group_flags[i] == 0 && group_min != -1) {
+      /* We are about to leave a group, but we found a match in it, so that's
+       * our answer. */
+      ret = sk_SSL_CIPHER_value(allow, group_min);
+      break;
+    }
+  }
 
-int ssl3_get_req_cert_type(SSL *s, unsigned char *p)
-	{
-	int ret=0;
-	const unsigned char *sig;
-	size_t i, siglen;
-	int have_rsa_sign = 0;
-	int have_ecdsa_sign = 0;
+  return ret;
+}
 
-	/* If we have custom certificate types set, use them */
-	if (s->cert->client_certificate_types)
-		{
-		memcpy(p, s->cert->client_certificate_types,
-			s->cert->num_client_certificate_types);
-		return (int)s->cert->num_client_certificate_types;
-		}
-	/* get configured sigalgs */
-	siglen = tls12_get_psigalgs(s, &sig);
-	for (i = 0; i < siglen; i+=2, sig+=2)
-		{
-		switch(sig[1])
-			{
-		case TLSEXT_signature_rsa:
-			have_rsa_sign = 1;
-			break;
+int ssl3_get_req_cert_type(SSL *s, uint8_t *p) {
+  int ret = 0;
+  const uint8_t *sig;
+  size_t i, siglen;
+  int have_rsa_sign = 0;
+  int have_ecdsa_sign = 0;
 
-		case TLSEXT_signature_ecdsa:
-			have_ecdsa_sign = 1;
-			break;
-			}
-		}
+  /* If we have custom certificate types set, use them */
+  if (s->cert->client_certificate_types) {
+    memcpy(p, s->cert->client_certificate_types,
+           s->cert->num_client_certificate_types);
+    return s->cert->num_client_certificate_types;
+  }
 
-	if (have_rsa_sign)
-		p[ret++]=SSL3_CT_RSA_SIGN;
+  /* get configured sigalgs */
+  siglen = tls12_get_psigalgs(s, &sig);
+  for (i = 0; i < siglen; i += 2, sig += 2) {
+    switch (sig[1]) {
+      case TLSEXT_signature_rsa:
+        have_rsa_sign = 1;
+        break;
 
-	/* ECDSA certs can be used with RSA cipher suites as well 
-	 * so we don't need to check for SSL_kECDH or SSL_kEECDH
-	 */
-	if (s->version >= TLS1_VERSION)
-		{
-		if (have_ecdsa_sign)
-			p[ret++]=TLS_CT_ECDSA_SIGN;
-		}
-	return(ret);
-	}
+      case TLSEXT_signature_ecdsa:
+        have_ecdsa_sign = 1;
+        break;
+    }
+  }
 
-static int ssl3_set_req_cert_type(CERT *c, const unsigned char *p, size_t len)
-	{
-	if (c->client_certificate_types)
-		{
-		OPENSSL_free(c->client_certificate_types);
-		c->client_certificate_types = NULL;
-		}
-	c->num_client_certificate_types = 0;
-	if (!p || !len)
-		return 1;
-	if (len > 0xff)
-		return 0;
-	c->client_certificate_types = BUF_memdup(p, len);
-	if (!c->client_certificate_types)
-		return 0;
-	c->num_client_certificate_types = len;
-	return 1;
-	}
+  if (have_rsa_sign) {
+    p[ret++] = SSL3_CT_RSA_SIGN;
+  }
 
-int ssl3_shutdown(SSL *s)
-	{
-	int ret;
+  /* ECDSA certs can be used with RSA cipher suites as well so we don't need to
+   * check for SSL_kECDH or SSL_kEECDH. */
+  if (s->version >= TLS1_VERSION && have_ecdsa_sign) {
+      p[ret++] = TLS_CT_ECDSA_SIGN;
+  }
 
-	/* Do nothing if configured not to send a close_notify. */
-	if (s->quiet_shutdown)
-		{
-		s->shutdown = SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN;
-		return 1;
-		}
+  return ret;
+}
 
-	if (!(s->shutdown & SSL_SENT_SHUTDOWN))
-		{
-		s->shutdown|=SSL_SENT_SHUTDOWN;
-#if 1
-		ssl3_send_alert(s,SSL3_AL_WARNING,SSL_AD_CLOSE_NOTIFY);
-#endif
-		/* our shutdown alert has been sent now, and if it still needs
-	 	 * to be written, s->s3->alert_dispatch will be true */
-	 	if (s->s3->alert_dispatch)
-	 		return(-1);	/* return WANT_WRITE */
-		}
-	else if (s->s3->alert_dispatch)
-		{
-		/* resend it if not sent */
-#if 1
-		ret=s->method->ssl_dispatch_alert(s);
-		if(ret == -1)
-			{
-			/* we only get to return -1 here the 2nd/Nth
-			 * invocation, we must  have already signalled
-			 * return 0 upon a previous invoation,
-			 * return WANT_WRITE */
-			return(ret);
-			}
-#endif
-		}
-	else if (!(s->shutdown & SSL_RECEIVED_SHUTDOWN))
-		{
-		/* If we are waiting for a close from our peer, we are closed */
-		s->method->ssl_read_bytes(s,0,NULL,0,0);
-		if(!(s->shutdown & SSL_RECEIVED_SHUTDOWN))
-			{
-			return(-1);	/* return WANT_READ */
-			}
-		}
+static int ssl3_set_req_cert_type(CERT *c, const uint8_t *p, size_t len) {
+  if (c->client_certificate_types) {
+    OPENSSL_free(c->client_certificate_types);
+    c->client_certificate_types = NULL;
+  }
 
-	if ((s->shutdown == (SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN)) &&
-		!s->s3->alert_dispatch)
-		return(1);
-	else
-		return(0);
-	}
+  c->num_client_certificate_types = 0;
+  if (!p || !len) {
+    return 1;
+  }
 
-int ssl3_write(SSL *s, const void *buf, int len)
-	{
-#if 0
-	if (s->shutdown & SSL_SEND_SHUTDOWN)
-		{
-		s->rwstate=SSL_NOTHING;
-		return(0);
-		}
-#endif
-	ERR_clear_system_error();
-	if (s->s3->renegotiate) ssl3_renegotiate_check(s);
+  if (len > 0xff) {
+    return 0;
+  }
 
-	return s->method->ssl_write_bytes(s, SSL3_RT_APPLICATION_DATA, buf,
-		len);
-	}
+  c->client_certificate_types = BUF_memdup(p, len);
+  if (!c->client_certificate_types) {
+    return 0;
+  }
 
-static int ssl3_read_internal(SSL *s, void *buf, int len, int peek)
-	{
-	int ret;
-	
-	ERR_clear_system_error();
-	if (s->s3->renegotiate) ssl3_renegotiate_check(s);
-	s->s3->in_read_app_data=1;
-	ret=s->method->ssl_read_bytes(s,SSL3_RT_APPLICATION_DATA,buf,len,peek);
-	if ((ret == -1) && (s->s3->in_read_app_data == 2))
-		{
-		/* ssl3_read_bytes decided to call s->handshake_func, which
-		 * called ssl3_read_bytes to read handshake data.
-		 * However, ssl3_read_bytes actually found application data
-		 * and thinks that application data makes sense here; so disable
-		 * handshake processing and try to read application data again. */
-		s->in_handshake++;
-		ret=s->method->ssl_read_bytes(s,SSL3_RT_APPLICATION_DATA,buf,len,peek);
-		s->in_handshake--;
-		}
-	else
-		s->s3->in_read_app_data=0;
+  c->num_client_certificate_types = len;
+  return 1;
+}
 
-	return(ret);
-	}
+int ssl3_shutdown(SSL *s) {
+  int ret;
 
-int ssl3_read(SSL *s, void *buf, int len)
-	{
-	return ssl3_read_internal(s, buf, len, 0);
-	}
+  /* Do nothing if configured not to send a close_notify. */
+  if (s->quiet_shutdown) {
+    s->shutdown = SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN;
+    return 1;
+  }
 
-int ssl3_peek(SSL *s, void *buf, int len)
-	{
-	return ssl3_read_internal(s, buf, len, 1);
-	}
+  if (!(s->shutdown & SSL_SENT_SHUTDOWN)) {
+    s->shutdown |= SSL_SENT_SHUTDOWN;
+    ssl3_send_alert(s, SSL3_AL_WARNING, SSL_AD_CLOSE_NOTIFY);
 
-int ssl3_renegotiate(SSL *s)
-	{
-	if (s->handshake_func == NULL)
-		return 1;
+    /* our shutdown alert has been sent now, and if it still needs to be
+     * written, s->s3->alert_dispatch will be true */
+    if (s->s3->alert_dispatch) {
+      return -1; /* return WANT_WRITE */
+    }
+  } else if (s->s3->alert_dispatch) {
+    /* resend it if not sent */
+    ret = s->method->ssl_dispatch_alert(s);
+    if (ret == -1) {
+      /* we only get to return -1 here the 2nd/Nth invocation, we must  have
+       * already signalled return 0 upon a previous invoation, return
+       * WANT_WRITE */
+      return ret;
+    }
+  } else if (!(s->shutdown & SSL_RECEIVED_SHUTDOWN)) {
+    /* If we are waiting for a close from our peer, we are closed */
+    s->method->ssl_read_bytes(s, 0, NULL, 0, 0);
+    if (!(s->shutdown & SSL_RECEIVED_SHUTDOWN)) {
+      return -1; /* return WANT_READ */
+    }
+  }
 
-	s->s3->renegotiate = 1;
-	return 1;
-	}
+  if (s->shutdown == (SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN) &&
+      !s->s3->alert_dispatch) {
+    return 1;
+  } else {
+    return 0;
+  }
+}
 
-int ssl3_renegotiate_check(SSL *s)
-	{
-	int ret=0;
+int ssl3_write(SSL *s, const void *buf, int len) {
+  ERR_clear_system_error();
+  if (s->s3->renegotiate) {
+    ssl3_renegotiate_check(s);
+  }
 
-	if (s->s3->renegotiate)
-		{
-		if (	(s->s3->rbuf.left == 0) &&
-			(s->s3->wbuf.left == 0) &&
-			!SSL_in_init(s))
-			{
-/*
-if we are the server, and we have sent a 'RENEGOTIATE' message, we
-need to go to SSL_ST_ACCEPT.
-*/
-			/* SSL_ST_ACCEPT */
-			s->state=SSL_ST_RENEGOTIATE;
-			s->s3->renegotiate=0;
-			s->s3->num_renegotiations++;
-			s->s3->total_renegotiations++;
-			ret=1;
-			}
-		}
-	return(ret);
-	}
-/* If we are using default SHA1+MD5 algorithms switch to new SHA256 PRF
- * and handshake macs if required.
- */
-long ssl_get_algorithm2(SSL *s)
-	{
-	static const unsigned long kMask = SSL_HANDSHAKE_MAC_DEFAULT|TLS1_PRF;
-	long alg2 = s->s3->tmp.new_cipher->algorithm2;
-	if (s->enc_method->enc_flags & SSL_ENC_FLAG_SHA256_PRF
-	    && (alg2 & kMask) == kMask)
-		return SSL_HANDSHAKE_MAC_SHA256 | TLS1_PRF_SHA256;
-	return alg2;
-	}
+  return s->method->ssl_write_bytes(s, SSL3_RT_APPLICATION_DATA, buf, len);
+}
 
+static int ssl3_read_internal(SSL *s, void *buf, int len, int peek) {
+  int ret;
+
+  ERR_clear_system_error();
+  if (s->s3->renegotiate) {
+    ssl3_renegotiate_check(s);
+  }
+  s->s3->in_read_app_data = 1;
+  ret = s->method->ssl_read_bytes(s, SSL3_RT_APPLICATION_DATA, buf, len, peek);
+  if (ret == -1 && s->s3->in_read_app_data == 2) {
+    /* ssl3_read_bytes decided to call s->handshake_func, which called
+     * ssl3_read_bytes to read handshake data. However, ssl3_read_bytes
+     * actually found application data and thinks that application data makes
+     * sense here; so disable handshake processing and try to read application
+     * data again. */
+    s->in_handshake++;
+    ret =
+        s->method->ssl_read_bytes(s, SSL3_RT_APPLICATION_DATA, buf, len, peek);
+    s->in_handshake--;
+  } else {
+    s->s3->in_read_app_data = 0;
+  }
+
+  return ret;
+}
+
+int ssl3_read(SSL *s, void *buf, int len) {
+  return ssl3_read_internal(s, buf, len, 0);
+}
+
+int ssl3_peek(SSL *s, void *buf, int len) {
+  return ssl3_read_internal(s, buf, len, 1);
+}
+
+int ssl3_renegotiate(SSL *s) {
+  if (s->handshake_func == NULL) {
+    return 1;
+  }
+
+  s->s3->renegotiate = 1;
+  return 1;
+}
+
+int ssl3_renegotiate_check(SSL *s) {
+  if (s->s3->renegotiate && s->s3->rbuf.left == 0 && s->s3->wbuf.left == 0 &&
+      !SSL_in_init(s)) {
+    /* if we are the server, and we have sent a 'RENEGOTIATE' message, we
+     * need to go to SSL_ST_ACCEPT. */
+    s->state = SSL_ST_RENEGOTIATE;
+    s->s3->renegotiate = 0;
+    s->s3->num_renegotiations++;
+    s->s3->total_renegotiations++;
+    return 1;
+  }
+
+  return 0;
+}
+
+/* If we are using default SHA1+MD5 algorithms switch to new SHA256 PRF and
+ * handshake macs if required. */
+long ssl_get_algorithm2(SSL *s) {
+  static const unsigned long kMask = SSL_HANDSHAKE_MAC_DEFAULT | TLS1_PRF;
+  long alg2 = s->s3->tmp.new_cipher->algorithm2;
+  if (s->enc_method->enc_flags & SSL_ENC_FLAG_SHA256_PRF &&
+      (alg2 & kMask) == kMask) {
+    return SSL_HANDSHAKE_MAC_SHA256 | TLS1_PRF_SHA256;
+  }
+  return alg2;
+}
