diff options
Diffstat (limited to 'src/lib/libssl/t1_reneg.c')
-rw-r--r-- | src/lib/libssl/t1_reneg.c | 278 |
1 files changed, 134 insertions, 144 deletions
diff --git a/src/lib/libssl/t1_reneg.c b/src/lib/libssl/t1_reneg.c index 9c2cc3c712..86e0e61ffb 100644 --- a/src/lib/libssl/t1_reneg.c +++ b/src/lib/libssl/t1_reneg.c | |||
@@ -113,180 +113,170 @@ | |||
113 | #include "ssl_locl.h" | 113 | #include "ssl_locl.h" |
114 | 114 | ||
115 | /* Add the client's renegotiation binding */ | 115 | /* Add the client's renegotiation binding */ |
116 | int ssl_add_clienthello_renegotiate_ext(SSL *s, unsigned char *p, int *len, | 116 | int |
117 | int maxlen) | 117 | ssl_add_clienthello_renegotiate_ext(SSL *s, unsigned char *p, int *len, |
118 | { | 118 | int maxlen) |
119 | if(p) | 119 | { |
120 | { | 120 | if (p) { |
121 | if((s->s3->previous_client_finished_len+1) > maxlen) | 121 | if ((s->s3->previous_client_finished_len + 1) > maxlen) { |
122 | { | 122 | SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_RENEGOTIATE_EXT, SSL_R_RENEGOTIATE_EXT_TOO_LONG); |
123 | SSLerr(SSL_F_SSL_ADD_CLIENTHELLO_RENEGOTIATE_EXT,SSL_R_RENEGOTIATE_EXT_TOO_LONG); | 123 | return 0; |
124 | return 0; | 124 | } |
125 | } | ||
126 | |||
127 | /* Length byte */ | ||
128 | *p = s->s3->previous_client_finished_len; | ||
129 | p++; | ||
130 | 125 | ||
131 | memcpy(p, s->s3->previous_client_finished, | 126 | /* Length byte */ |
132 | s->s3->previous_client_finished_len); | 127 | *p = s->s3->previous_client_finished_len; |
128 | p++; | ||
129 | |||
130 | memcpy(p, s->s3->previous_client_finished, | ||
131 | s->s3->previous_client_finished_len); | ||
133 | #ifdef OPENSSL_RI_DEBUG | 132 | #ifdef OPENSSL_RI_DEBUG |
134 | fprintf(stderr, "%s RI extension sent by client\n", | 133 | fprintf(stderr, "%s RI extension sent by client\n", |
135 | s->s3->previous_client_finished_len ? "Non-empty" : "Empty"); | 134 | s->s3->previous_client_finished_len ? "Non-empty" : "Empty"); |
136 | #endif | 135 | #endif |
137 | } | 136 | } |
138 | 137 | ||
139 | *len=s->s3->previous_client_finished_len + 1; | 138 | *len = s->s3->previous_client_finished_len + 1; |
140 | 139 | ||
141 | 140 | return 1; | |
142 | return 1; | 141 | } |
143 | } | ||
144 | 142 | ||
145 | /* Parse the client's renegotiation binding and abort if it's not | 143 | /* Parse the client's renegotiation binding and abort if it's not |
146 | right */ | 144 | right */ |
147 | int ssl_parse_clienthello_renegotiate_ext(SSL *s, unsigned char *d, int len, | 145 | int |
148 | int *al) | 146 | ssl_parse_clienthello_renegotiate_ext(SSL *s, unsigned char *d, int len, |
149 | { | 147 | int *al) |
150 | int ilen; | 148 | { |
149 | int ilen; | ||
150 | |||
151 | /* Parse the length byte */ | ||
152 | if (len < 1) { | ||
153 | SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_RENEGOTIATE_EXT, SSL_R_RENEGOTIATION_ENCODING_ERR); | ||
154 | *al = SSL_AD_ILLEGAL_PARAMETER; | ||
155 | return 0; | ||
156 | } | ||
157 | ilen = *d; | ||
158 | d++; | ||
151 | 159 | ||
152 | /* Parse the length byte */ | 160 | /* Consistency check */ |
153 | if(len < 1) | 161 | if ((ilen + 1) != len) { |
154 | { | 162 | SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_RENEGOTIATE_EXT, SSL_R_RENEGOTIATION_ENCODING_ERR); |
155 | SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_RENEGOTIATE_EXT,SSL_R_RENEGOTIATION_ENCODING_ERR); | 163 | *al = SSL_AD_ILLEGAL_PARAMETER; |
156 | *al=SSL_AD_ILLEGAL_PARAMETER; | 164 | return 0; |
157 | return 0; | 165 | } |
158 | } | ||
159 | ilen = *d; | ||
160 | d++; | ||
161 | 166 | ||
162 | /* Consistency check */ | 167 | /* Check that the extension matches */ |
163 | if((ilen+1) != len) | 168 | if (ilen != s->s3->previous_client_finished_len) { |
164 | { | 169 | SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_RENEGOTIATE_EXT, SSL_R_RENEGOTIATION_MISMATCH); |
165 | SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_RENEGOTIATE_EXT,SSL_R_RENEGOTIATION_ENCODING_ERR); | 170 | *al = SSL_AD_HANDSHAKE_FAILURE; |
166 | *al=SSL_AD_ILLEGAL_PARAMETER; | 171 | return 0; |
167 | return 0; | 172 | } |
168 | } | ||
169 | 173 | ||
170 | /* Check that the extension matches */ | 174 | if (memcmp(d, s->s3->previous_client_finished, |
171 | if(ilen != s->s3->previous_client_finished_len) | 175 | s->s3->previous_client_finished_len)) { |
172 | { | 176 | SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_RENEGOTIATE_EXT, SSL_R_RENEGOTIATION_MISMATCH); |
173 | SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_RENEGOTIATE_EXT,SSL_R_RENEGOTIATION_MISMATCH); | 177 | *al = SSL_AD_HANDSHAKE_FAILURE; |
174 | *al=SSL_AD_HANDSHAKE_FAILURE; | 178 | return 0; |
175 | return 0; | 179 | } |
176 | } | ||
177 | |||
178 | if(memcmp(d, s->s3->previous_client_finished, | ||
179 | s->s3->previous_client_finished_len)) | ||
180 | { | ||
181 | SSLerr(SSL_F_SSL_PARSE_CLIENTHELLO_RENEGOTIATE_EXT,SSL_R_RENEGOTIATION_MISMATCH); | ||
182 | *al=SSL_AD_HANDSHAKE_FAILURE; | ||
183 | return 0; | ||
184 | } | ||
185 | #ifdef OPENSSL_RI_DEBUG | 180 | #ifdef OPENSSL_RI_DEBUG |
186 | fprintf(stderr, "%s RI extension received by server\n", | 181 | fprintf(stderr, "%s RI extension received by server\n", |
187 | ilen ? "Non-empty" : "Empty"); | 182 | ilen ? "Non-empty" : "Empty"); |
188 | #endif | 183 | #endif |
189 | 184 | ||
190 | s->s3->send_connection_binding=1; | 185 | s->s3->send_connection_binding = 1; |
191 | 186 | ||
192 | return 1; | 187 | return 1; |
193 | } | 188 | } |
194 | 189 | ||
195 | /* Add the server's renegotiation binding */ | 190 | /* Add the server's renegotiation binding */ |
196 | int ssl_add_serverhello_renegotiate_ext(SSL *s, unsigned char *p, int *len, | 191 | int |
197 | int maxlen) | 192 | ssl_add_serverhello_renegotiate_ext(SSL *s, unsigned char *p, int *len, |
198 | { | 193 | int maxlen) |
199 | if(p) | 194 | { |
200 | { | 195 | if (p) { |
201 | if((s->s3->previous_client_finished_len + | 196 | if ((s->s3->previous_client_finished_len + |
202 | s->s3->previous_server_finished_len + 1) > maxlen) | 197 | s->s3->previous_server_finished_len + 1) > maxlen) { |
203 | { | 198 | SSLerr(SSL_F_SSL_ADD_SERVERHELLO_RENEGOTIATE_EXT, SSL_R_RENEGOTIATE_EXT_TOO_LONG); |
204 | SSLerr(SSL_F_SSL_ADD_SERVERHELLO_RENEGOTIATE_EXT,SSL_R_RENEGOTIATE_EXT_TOO_LONG); | 199 | return 0; |
205 | return 0; | 200 | } |
206 | } | ||
207 | |||
208 | /* Length byte */ | ||
209 | *p = s->s3->previous_client_finished_len + s->s3->previous_server_finished_len; | ||
210 | p++; | ||
211 | 201 | ||
212 | memcpy(p, s->s3->previous_client_finished, | 202 | /* Length byte */ |
213 | s->s3->previous_client_finished_len); | 203 | *p = s->s3->previous_client_finished_len + s->s3->previous_server_finished_len; |
214 | p += s->s3->previous_client_finished_len; | 204 | p++; |
215 | 205 | ||
216 | memcpy(p, s->s3->previous_server_finished, | 206 | memcpy(p, s->s3->previous_client_finished, |
217 | s->s3->previous_server_finished_len); | 207 | s->s3->previous_client_finished_len); |
208 | p += s->s3->previous_client_finished_len; | ||
209 | |||
210 | memcpy(p, s->s3->previous_server_finished, | ||
211 | s->s3->previous_server_finished_len); | ||
218 | #ifdef OPENSSL_RI_DEBUG | 212 | #ifdef OPENSSL_RI_DEBUG |
219 | fprintf(stderr, "%s RI extension sent by server\n", | 213 | fprintf(stderr, "%s RI extension sent by server\n", |
220 | s->s3->previous_client_finished_len ? "Non-empty" : "Empty"); | 214 | s->s3->previous_client_finished_len ? "Non-empty" : "Empty"); |
221 | #endif | 215 | #endif |
222 | } | 216 | } |
223 | 217 | ||
224 | *len=s->s3->previous_client_finished_len | 218 | *len = s->s3->previous_client_finished_len |
225 | + s->s3->previous_server_finished_len + 1; | 219 | + s->s3->previous_server_finished_len + 1; |
226 | 220 | ||
227 | return 1; | 221 | return 1; |
228 | } | 222 | } |
229 | 223 | ||
230 | /* Parse the server's renegotiation binding and abort if it's not | 224 | /* Parse the server's renegotiation binding and abort if it's not |
231 | right */ | 225 | right */ |
232 | int ssl_parse_serverhello_renegotiate_ext(SSL *s, unsigned char *d, int len, | 226 | int |
233 | int *al) | 227 | ssl_parse_serverhello_renegotiate_ext(SSL *s, unsigned char *d, int len, |
234 | { | 228 | int *al) |
235 | int expected_len=s->s3->previous_client_finished_len | 229 | { |
230 | int expected_len = s->s3->previous_client_finished_len | ||
236 | + s->s3->previous_server_finished_len; | 231 | + s->s3->previous_server_finished_len; |
237 | int ilen; | 232 | int ilen; |
233 | |||
234 | /* Check for logic errors */ | ||
235 | OPENSSL_assert(!expected_len || s->s3->previous_client_finished_len); | ||
236 | OPENSSL_assert(!expected_len || s->s3->previous_server_finished_len); | ||
237 | |||
238 | /* Parse the length byte */ | ||
239 | if (len < 1) { | ||
240 | SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT, SSL_R_RENEGOTIATION_ENCODING_ERR); | ||
241 | *al = SSL_AD_ILLEGAL_PARAMETER; | ||
242 | return 0; | ||
243 | } | ||
244 | ilen = *d; | ||
245 | d++; | ||
238 | 246 | ||
239 | /* Check for logic errors */ | 247 | /* Consistency check */ |
240 | OPENSSL_assert(!expected_len || s->s3->previous_client_finished_len); | 248 | if (ilen + 1 != len) { |
241 | OPENSSL_assert(!expected_len || s->s3->previous_server_finished_len); | 249 | SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT, SSL_R_RENEGOTIATION_ENCODING_ERR); |
242 | 250 | *al = SSL_AD_ILLEGAL_PARAMETER; | |
243 | /* Parse the length byte */ | 251 | return 0; |
244 | if(len < 1) | 252 | } |
245 | { | ||
246 | SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT,SSL_R_RENEGOTIATION_ENCODING_ERR); | ||
247 | *al=SSL_AD_ILLEGAL_PARAMETER; | ||
248 | return 0; | ||
249 | } | ||
250 | ilen = *d; | ||
251 | d++; | ||
252 | 253 | ||
253 | /* Consistency check */ | 254 | /* Check that the extension matches */ |
254 | if(ilen+1 != len) | 255 | if (ilen != expected_len) { |
255 | { | 256 | SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT, SSL_R_RENEGOTIATION_MISMATCH); |
256 | SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT,SSL_R_RENEGOTIATION_ENCODING_ERR); | 257 | *al = SSL_AD_HANDSHAKE_FAILURE; |
257 | *al=SSL_AD_ILLEGAL_PARAMETER; | 258 | return 0; |
258 | return 0; | 259 | } |
259 | } | ||
260 | |||
261 | /* Check that the extension matches */ | ||
262 | if(ilen != expected_len) | ||
263 | { | ||
264 | SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT,SSL_R_RENEGOTIATION_MISMATCH); | ||
265 | *al=SSL_AD_HANDSHAKE_FAILURE; | ||
266 | return 0; | ||
267 | } | ||
268 | 260 | ||
269 | if(memcmp(d, s->s3->previous_client_finished, | 261 | if (memcmp(d, s->s3->previous_client_finished, |
270 | s->s3->previous_client_finished_len)) | 262 | s->s3->previous_client_finished_len)) { |
271 | { | 263 | SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT, SSL_R_RENEGOTIATION_MISMATCH); |
272 | SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT,SSL_R_RENEGOTIATION_MISMATCH); | 264 | *al = SSL_AD_HANDSHAKE_FAILURE; |
273 | *al=SSL_AD_HANDSHAKE_FAILURE; | 265 | return 0; |
274 | return 0; | 266 | } |
275 | } | 267 | d += s->s3->previous_client_finished_len; |
276 | d += s->s3->previous_client_finished_len; | ||
277 | 268 | ||
278 | if(memcmp(d, s->s3->previous_server_finished, | 269 | if (memcmp(d, s->s3->previous_server_finished, |
279 | s->s3->previous_server_finished_len)) | 270 | s->s3->previous_server_finished_len)) { |
280 | { | 271 | SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT, SSL_R_RENEGOTIATION_MISMATCH); |
281 | SSLerr(SSL_F_SSL_PARSE_SERVERHELLO_RENEGOTIATE_EXT,SSL_R_RENEGOTIATION_MISMATCH); | 272 | *al = SSL_AD_ILLEGAL_PARAMETER; |
282 | *al=SSL_AD_ILLEGAL_PARAMETER; | 273 | return 0; |
283 | return 0; | 274 | } |
284 | } | ||
285 | #ifdef OPENSSL_RI_DEBUG | 275 | #ifdef OPENSSL_RI_DEBUG |
286 | fprintf(stderr, "%s RI extension received by client\n", | 276 | fprintf(stderr, "%s RI extension received by client\n", |
287 | ilen ? "Non-empty" : "Empty"); | 277 | ilen ? "Non-empty" : "Empty"); |
288 | #endif | 278 | #endif |
289 | s->s3->send_connection_binding=1; | 279 | s->s3->send_connection_binding = 1; |
290 | 280 | ||
291 | return 1; | 281 | return 1; |
292 | } | 282 | } |