summaryrefslogtreecommitdiff
path: root/openssl/ssl/t1_lib.c
diff options
context:
space:
mode:
authordavidben@chromium.org <davidben@chromium.org@4ff67af0-8c30-449e-8e8b-ad334ec8d88c>2014-05-01 23:35:34 +0000
committerdavidben@chromium.org <davidben@chromium.org@4ff67af0-8c30-449e-8e8b-ad334ec8d88c>2014-05-01 23:35:34 +0000
commit152164bc423807c6945662c94d724554a027eeca (patch)
tree229a1fcedb338566b8baf68a5e5f4cc1e88e7515 /openssl/ssl/t1_lib.c
parent176b84dd04aaadd8b6ec29d285ef7234c9fb1e85 (diff)
downloadopenssl-152164bc423807c6945662c94d724554a027eeca.tar.gz
Tidy up OpenSSL padding extension code.
Add (redundant because of SSL3_RT_MAX_PLAIN_LENGTH) length check, don't pad DTLS, and move the SSL23 special case closer to the SSL23 code. BUG=none Review URL: https://codereview.chromium.org/242453005 git-svn-id: http://src.chromium.org/svn/trunk/deps/third_party/openssl@267663 4ff67af0-8c30-449e-8e8b-ad334ec8d88c
Diffstat (limited to 'openssl/ssl/t1_lib.c')
-rw-r--r--openssl/ssl/t1_lib.c39
1 files changed, 20 insertions, 19 deletions
diff --git a/openssl/ssl/t1_lib.c b/openssl/ssl/t1_lib.c
index a53d56b..3fe6612 100644
--- a/openssl/ssl/t1_lib.c
+++ b/openssl/ssl/t1_lib.c
@@ -341,7 +341,10 @@ int tls12_get_req_sig_algs(SSL *s, unsigned char *p)
return (int)slen;
}
-unsigned char *ssl_add_clienthello_tlsext(SSL *s, unsigned char *buf, unsigned char *limit)
+/* header_len is the length of the ClientHello header written so far, used to
+ * compute padding. It does not include the record header. Pass 0 if no padding
+ * is to be done. */
+unsigned char *ssl_add_clienthello_tlsext(SSL *s, unsigned char *buf, unsigned char *limit, size_t header_len)
{
int extdatalen=0;
unsigned char *orig = buf;
@@ -664,27 +667,25 @@ unsigned char *ssl_add_clienthello_tlsext(SSL *s, unsigned char *buf, unsigned c
/* Add padding to workaround bugs in F5 terminators.
* See https://tools.ietf.org/html/draft-agl-tls-padding-02 */
- {
- int hlen = ret - (unsigned char *)s->init_buf->data;
- /* The code in s23_clnt.c to build ClientHello messages includes the
- * 5-byte record header in the buffer, while the code in s3_clnt.c does
- * not. */
- if (s->state == SSL23_ST_CW_CLNT_HELLO_A)
- hlen -= 5;
- if (hlen > 0xff && hlen < 0x200)
+ if (header_len > 0)
{
- hlen = 0x200 - hlen;
- if (hlen >= 4)
- hlen -= 4;
- else
- hlen = 0;
+ header_len += ret - orig;
+ if (header_len > 0xff && header_len < 0x200)
+ {
+ size_t padding_len = 0x200 - header_len;
+ if (padding_len >= 4)
+ padding_len -= 4;
+ else
+ padding_len = 0;
+ if (limit - ret - 4 - (long)padding_len < 0)
+ return NULL;
- s2n(TLSEXT_TYPE_padding, ret);
- s2n(hlen, ret);
- memset(ret, 0, hlen);
- ret += hlen;
+ s2n(TLSEXT_TYPE_padding, ret);
+ s2n(padding_len, ret);
+ memset(ret, 0, padding_len);
+ ret += padding_len;
+ }
}
- }
if ((extdatalen = ret-orig-2)== 0)