summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/libssl/src/ssl/s2_clnt.c1213
-rw-r--r--src/lib/libssl/src/ssl/s2_enc.c149
-rw-r--r--src/lib/libssl/src/ssl/s2_lib.c569
-rw-r--r--src/lib/libssl/src/ssl/s2_meth.c17
-rw-r--r--src/lib/libssl/src/ssl/s2_pkt.c742
-rw-r--r--src/lib/libssl/src/ssl/s2_srvr.c1264
6 files changed, 1909 insertions, 2045 deletions
diff --git a/src/lib/libssl/src/ssl/s2_clnt.c b/src/lib/libssl/src/ssl/s2_clnt.c
index 15fbef9c77..a1cfab6f2d 100644
--- a/src/lib/libssl/src/ssl/s2_clnt.c
+++ b/src/lib/libssl/src/ssl/s2_clnt.c
@@ -121,152 +121,156 @@ static const SSL_METHOD *ssl2_get_client_method(int ver);
121static int get_server_finished(SSL *s); 121static int get_server_finished(SSL *s);
122static int get_server_verify(SSL *s); 122static int get_server_verify(SSL *s);
123static int get_server_hello(SSL *s); 123static int get_server_hello(SSL *s);
124static int client_hello(SSL *s); 124static int client_hello(SSL *s);
125
125static int client_master_key(SSL *s); 126static int client_master_key(SSL *s);
126static int client_finished(SSL *s); 127static int client_finished(SSL *s);
127static int client_certificate(SSL *s); 128static int client_certificate(SSL *s);
128static int ssl_rsa_public_encrypt(SESS_CERT *sc, int len, unsigned char *from, 129static int
129 unsigned char *to,int padding); 130ssl_rsa_public_encrypt(SESS_CERT *sc, int len, unsigned char *from,
131unsigned char *to, int padding);
130#define BREAK break 132#define BREAK break
131 133
132static const SSL_METHOD *ssl2_get_client_method(int ver) 134static const SSL_METHOD
133 { 135*ssl2_get_client_method(int ver)
136{
134 if (ver == SSL2_VERSION) 137 if (ver == SSL2_VERSION)
135 return(SSLv2_client_method()); 138 return (SSLv2_client_method());
136 else 139 else
137 return(NULL); 140 return (NULL);
138 } 141}
139 142
140IMPLEMENT_ssl2_meth_func(SSLv2_client_method, 143IMPLEMENT_ssl2_meth_func(SSLv2_client_method,
141 ssl_undefined_function, 144 ssl_undefined_function, ssl2_connect, ssl2_get_client_method)
142 ssl2_connect, 145
143 ssl2_get_client_method) 146int
144 147ssl2_connect(SSL *s)
145int ssl2_connect(SSL *s) 148{
146 { 149 unsigned long l = (unsigned long)time(NULL);
147 unsigned long l=(unsigned long)time(NULL); 150 BUF_MEM *buf = NULL;
148 BUF_MEM *buf=NULL; 151 int ret = -1;
149 int ret= -1; 152 void (*cb)(const SSL *ssl, int type, int val) = NULL;
150 void (*cb)(const SSL *ssl,int type,int val)=NULL; 153 int new_state, state;
151 int new_state,state; 154
152 155 RAND_add(&l, sizeof(l), 0);
153 RAND_add(&l,sizeof(l),0);
154 ERR_clear_error(); 156 ERR_clear_error();
155 errno = 0; 157 errno = 0;
156 158
157 if (s->info_callback != NULL) 159 if (s->info_callback != NULL)
158 cb=s->info_callback; 160 cb = s->info_callback;
159 else if (s->ctx->info_callback != NULL) 161 else if (s->ctx->info_callback != NULL)
160 cb=s->ctx->info_callback; 162 cb = s->ctx->info_callback;
161 163
162 /* init things to blank */ 164 /* init things to blank */
163 s->in_handshake++; 165 s->in_handshake++;
164 if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s); 166 if (!SSL_in_init(s) || SSL_in_before(s))
167 SSL_clear(s);
165 168
166 for (;;) 169 for (;;) {
167 { 170 state = s->state;
168 state=s->state;
169 171
170 switch (s->state) 172 switch (s->state) {
171 {
172 case SSL_ST_BEFORE: 173 case SSL_ST_BEFORE:
173 case SSL_ST_CONNECT: 174 case SSL_ST_CONNECT:
174 case SSL_ST_BEFORE|SSL_ST_CONNECT: 175 case SSL_ST_BEFORE|SSL_ST_CONNECT:
175 case SSL_ST_OK|SSL_ST_CONNECT: 176 case SSL_ST_OK|SSL_ST_CONNECT:
176 177
177 s->server=0; 178 s->server = 0;
178 if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1); 179 if (cb != NULL)
180 cb(s, SSL_CB_HANDSHAKE_START, 1);
179 181
180 s->version=SSL2_VERSION; 182 s->version = SSL2_VERSION;
181 s->type=SSL_ST_CONNECT; 183 s->type = SSL_ST_CONNECT;
182 184
183 buf=s->init_buf; 185 buf = s->init_buf;
184 if ((buf == NULL) && ((buf=BUF_MEM_new()) == NULL)) 186 if ((buf == NULL) && ((buf = BUF_MEM_new()) == NULL)) {
185 { 187 ret = -1;
186 ret= -1;
187 goto end; 188 goto end;
188 } 189 }
189 if (!BUF_MEM_grow(buf, 190 if (!BUF_MEM_grow(buf,
190 SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER)) 191 SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER)) {
191 {
192 if (buf == s->init_buf) 192 if (buf == s->init_buf)
193 buf=NULL; 193 buf = NULL;
194 ret= -1; 194 ret = -1;
195 goto end; 195 goto end;
196 } 196 }
197 s->init_buf=buf; 197 s->init_buf = buf;
198 buf=NULL; 198 buf = NULL;
199 s->init_num=0; 199 s->init_num = 0;
200 s->state=SSL2_ST_SEND_CLIENT_HELLO_A; 200 s->state = SSL2_ST_SEND_CLIENT_HELLO_A;
201 s->ctx->stats.sess_connect++; 201 s->ctx->stats.sess_connect++;
202 s->handshake_func=ssl2_connect; 202 s->handshake_func = ssl2_connect;
203 BREAK; 203 BREAK;
204 204
205 case SSL2_ST_SEND_CLIENT_HELLO_A: 205 case SSL2_ST_SEND_CLIENT_HELLO_A:
206 case SSL2_ST_SEND_CLIENT_HELLO_B: 206 case SSL2_ST_SEND_CLIENT_HELLO_B:
207 s->shutdown=0; 207 s->shutdown = 0;
208 ret=client_hello(s); 208 ret = client_hello(s);
209 if (ret <= 0) goto end; 209 if (ret <= 0)
210 s->init_num=0; 210 goto end;
211 s->state=SSL2_ST_GET_SERVER_HELLO_A; 211 s->init_num = 0;
212 s->state = SSL2_ST_GET_SERVER_HELLO_A;
212 BREAK; 213 BREAK;
213 214
214 case SSL2_ST_GET_SERVER_HELLO_A: 215 case SSL2_ST_GET_SERVER_HELLO_A:
215 case SSL2_ST_GET_SERVER_HELLO_B: 216 case SSL2_ST_GET_SERVER_HELLO_B:
216 ret=get_server_hello(s); 217 ret = get_server_hello(s);
217 if (ret <= 0) goto end; 218 if (ret <= 0)
218 s->init_num=0; 219 goto end;
220 s->init_num = 0;
219 if (!s->hit) /* new session */ 221 if (!s->hit) /* new session */
220 { 222 {
221 s->state=SSL2_ST_SEND_CLIENT_MASTER_KEY_A; 223 s->state = SSL2_ST_SEND_CLIENT_MASTER_KEY_A;
222 BREAK; 224 BREAK;
223 } 225
224 else 226 } else {
225 { 227 s->state = SSL2_ST_CLIENT_START_ENCRYPTION;
226 s->state=SSL2_ST_CLIENT_START_ENCRYPTION;
227 break; 228 break;
228 } 229 }
229 230
230 case SSL2_ST_SEND_CLIENT_MASTER_KEY_A: 231 case SSL2_ST_SEND_CLIENT_MASTER_KEY_A:
231 case SSL2_ST_SEND_CLIENT_MASTER_KEY_B: 232 case SSL2_ST_SEND_CLIENT_MASTER_KEY_B:
232 ret=client_master_key(s); 233 ret = client_master_key(s);
233 if (ret <= 0) goto end; 234 if (ret <= 0)
234 s->init_num=0; 235 goto end;
235 s->state=SSL2_ST_CLIENT_START_ENCRYPTION; 236 s->init_num = 0;
237 s->state = SSL2_ST_CLIENT_START_ENCRYPTION;
236 break; 238 break;
237 239
238 case SSL2_ST_CLIENT_START_ENCRYPTION: 240 case SSL2_ST_CLIENT_START_ENCRYPTION:
239 /* Ok, we now have all the stuff needed to 241 /* Ok, we now have all the stuff needed to
240 * start encrypting, so lets fire it up :-) */ 242 * start encrypting, so lets fire it up :-) */
241 if (!ssl2_enc_init(s,1)) 243 if (!ssl2_enc_init(s, 1)) {
242 { 244 ret = -1;
243 ret= -1;
244 goto end; 245 goto end;
245 } 246 }
246 s->s2->clear_text=0; 247 s->s2->clear_text = 0;
247 s->state=SSL2_ST_SEND_CLIENT_FINISHED_A; 248 s->state = SSL2_ST_SEND_CLIENT_FINISHED_A;
248 break; 249 break;
249 250
250 case SSL2_ST_SEND_CLIENT_FINISHED_A: 251 case SSL2_ST_SEND_CLIENT_FINISHED_A:
251 case SSL2_ST_SEND_CLIENT_FINISHED_B: 252 case SSL2_ST_SEND_CLIENT_FINISHED_B:
252 ret=client_finished(s); 253 ret = client_finished(s);
253 if (ret <= 0) goto end; 254 if (ret <= 0)
254 s->init_num=0; 255 goto end;
255 s->state=SSL2_ST_GET_SERVER_VERIFY_A; 256 s->init_num = 0;
257 s->state = SSL2_ST_GET_SERVER_VERIFY_A;
256 break; 258 break;
257 259
258 case SSL2_ST_GET_SERVER_VERIFY_A: 260 case SSL2_ST_GET_SERVER_VERIFY_A:
259 case SSL2_ST_GET_SERVER_VERIFY_B: 261 case SSL2_ST_GET_SERVER_VERIFY_B:
260 ret=get_server_verify(s); 262 ret = get_server_verify(s);
261 if (ret <= 0) goto end; 263 if (ret <= 0)
262 s->init_num=0; 264 goto end;
263 s->state=SSL2_ST_GET_SERVER_FINISHED_A; 265 s->init_num = 0;
266 s->state = SSL2_ST_GET_SERVER_FINISHED_A;
264 break; 267 break;
265 268
266 case SSL2_ST_GET_SERVER_FINISHED_A: 269 case SSL2_ST_GET_SERVER_FINISHED_A:
267 case SSL2_ST_GET_SERVER_FINISHED_B: 270 case SSL2_ST_GET_SERVER_FINISHED_B:
268 ret=get_server_finished(s); 271 ret = get_server_finished(s);
269 if (ret <= 0) goto end; 272 if (ret <= 0)
273 goto end;
270 break; 274 break;
271 275
272 case SSL2_ST_SEND_CLIENT_CERTIFICATE_A: 276 case SSL2_ST_SEND_CLIENT_CERTIFICATE_A:
@@ -274,20 +278,20 @@ int ssl2_connect(SSL *s)
274 case SSL2_ST_SEND_CLIENT_CERTIFICATE_C: 278 case SSL2_ST_SEND_CLIENT_CERTIFICATE_C:
275 case SSL2_ST_SEND_CLIENT_CERTIFICATE_D: 279 case SSL2_ST_SEND_CLIENT_CERTIFICATE_D:
276 case SSL2_ST_X509_GET_CLIENT_CERTIFICATE: 280 case SSL2_ST_X509_GET_CLIENT_CERTIFICATE:
277 ret=client_certificate(s); 281 ret = client_certificate(s);
278 if (ret <= 0) goto end; 282 if (ret <= 0)
279 s->init_num=0; 283 goto end;
280 s->state=SSL2_ST_GET_SERVER_FINISHED_A; 284 s->init_num = 0;
285 s->state = SSL2_ST_GET_SERVER_FINISHED_A;
281 break; 286 break;
282 287
283 case SSL_ST_OK: 288 case SSL_ST_OK:
284 if (s->init_buf != NULL) 289 if (s->init_buf != NULL) {
285 {
286 BUF_MEM_free(s->init_buf); 290 BUF_MEM_free(s->init_buf);
287 s->init_buf=NULL; 291 s->init_buf = NULL;
288 } 292 }
289 s->init_num=0; 293 s->init_num = 0;
290 /* ERR_clear_error();*/ 294 /* ERR_clear_error();*/
291 295
292 /* If we want to cache session-ids in the client 296 /* If we want to cache session-ids in the client
293 * and we successfully add the session-id to the 297 * and we successfully add the session-id to the
@@ -295,133 +299,129 @@ int ssl2_connect(SSL *s)
295 * 26/11/96 - eay - only add if not a re-used session. 299 * 26/11/96 - eay - only add if not a re-used session.
296 */ 300 */
297 301
298 ssl_update_cache(s,SSL_SESS_CACHE_CLIENT); 302 ssl_update_cache(s, SSL_SESS_CACHE_CLIENT);
299 if (s->hit) s->ctx->stats.sess_hit++; 303 if (s->hit)
304 s->ctx->stats.sess_hit++;
300 305
301 ret=1; 306 ret = 1;
302 /* s->server=0; */ 307 /* s->server=0; */
303 s->ctx->stats.sess_connect_good++; 308 s->ctx->stats.sess_connect_good++;
304 309
305 if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_DONE,1); 310 if (cb != NULL)
311 cb(s, SSL_CB_HANDSHAKE_DONE, 1);
306 312
307 goto end; 313 goto end;
308 /* break; */ 314 /* break; */
309 default: 315 default:
310 SSLerr(SSL_F_SSL2_CONNECT,SSL_R_UNKNOWN_STATE); 316 SSLerr(SSL_F_SSL2_CONNECT, SSL_R_UNKNOWN_STATE);
311 return(-1); 317 return (-1);
312 /* break; */ 318 /* break; */
313 } 319 }
314 320
315 if ((cb != NULL) && (s->state != state)) 321 if ((cb != NULL) && (s->state != state)) {
316 { 322 new_state = s->state;
317 new_state=s->state; 323 s->state = state;
318 s->state=state; 324 cb(s, SSL_CB_CONNECT_LOOP, 1);
319 cb(s,SSL_CB_CONNECT_LOOP,1); 325 s->state = new_state;
320 s->state=new_state;
321 }
322 } 326 }
327 }
323end: 328end:
324 s->in_handshake--; 329 s->in_handshake--;
325 if (buf != NULL) 330 if (buf != NULL)
326 BUF_MEM_free(buf); 331 BUF_MEM_free(buf);
327 if (cb != NULL) 332 if (cb != NULL)
328 cb(s,SSL_CB_CONNECT_EXIT,ret); 333 cb(s, SSL_CB_CONNECT_EXIT, ret);
329 return(ret); 334 return (ret);
330 } 335}
331 336
332static int get_server_hello(SSL *s) 337static int
333 { 338get_server_hello(SSL *s)
339{
334 unsigned char *buf; 340 unsigned char *buf;
335 unsigned char *p; 341 unsigned char *p;
336 int i,j; 342 int i, j;
337 unsigned long len; 343 unsigned long len;
338 STACK_OF(SSL_CIPHER) *sk=NULL,*cl, *prio, *allow; 344 STACK_OF(SSL_CIPHER) *sk = NULL, *cl, *prio, *allow;
339 345
340 buf=(unsigned char *)s->init_buf->data; 346 buf = (unsigned char *)s->init_buf->data;
341 p=buf; 347 p = buf;
342 if (s->state == SSL2_ST_GET_SERVER_HELLO_A) 348 if (s->state == SSL2_ST_GET_SERVER_HELLO_A) {
343 { 349 i = ssl2_read(s,(char *)&(buf[s->init_num]), 11 - s->init_num);
344 i=ssl2_read(s,(char *)&(buf[s->init_num]),11-s->init_num); 350 if (i < (11 - s->init_num))
345 if (i < (11-s->init_num)) 351 return (ssl2_part_read(s, SSL_F_GET_SERVER_HELLO, i));
346 return(ssl2_part_read(s,SSL_F_GET_SERVER_HELLO,i));
347 s->init_num = 11; 352 s->init_num = 11;
348 353
349 if (*(p++) != SSL2_MT_SERVER_HELLO) 354 if (*(p++) != SSL2_MT_SERVER_HELLO) {
350 { 355 if (p[-1] != SSL2_MT_ERROR) {
351 if (p[-1] != SSL2_MT_ERROR) 356 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
352 {
353 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
354 SSLerr(SSL_F_GET_SERVER_HELLO, 357 SSLerr(SSL_F_GET_SERVER_HELLO,
355 SSL_R_READ_WRONG_PACKET_TYPE); 358 SSL_R_READ_WRONG_PACKET_TYPE);
356 } 359 } else
357 else
358 SSLerr(SSL_F_GET_SERVER_HELLO, 360 SSLerr(SSL_F_GET_SERVER_HELLO,
359 SSL_R_PEER_ERROR); 361 SSL_R_PEER_ERROR);
360 return(-1); 362 return (-1);
361 } 363 }
362#if 0 364#if 0
363 s->hit=(*(p++))?1:0; 365 s->hit = (*(p++)) ? 1 : 0;
364 /* Some [PPC?] compilers fail to increment p in above 366 /* Some [PPC?] compilers fail to increment p in above
365 statement, e.g. one provided with Rhapsody 5.5, but 367 statement, e.g. one provided with Rhapsody 5.5, but
366 most recent example XL C 11.1 for AIX, even without 368 most recent example XL C 11.1 for AIX, even without
367 optimization flag... */ 369 optimization flag... */
368#else 370#else
369 s->hit=(*p)?1:0; p++; 371 s->hit = (*p) ? 1 : 0;
372 p++;
370#endif 373#endif
371 s->s2->tmp.cert_type= *(p++); 374 s->s2->tmp.cert_type= *(p++);
372 n2s(p,i); 375 n2s(p, i);
373 if (i < s->version) s->version=i; 376 if (i < s->version)
374 n2s(p,i); s->s2->tmp.cert_length=i; 377 s->version = i;
375 n2s(p,i); s->s2->tmp.csl=i; 378 n2s(p, i);
376 n2s(p,i); s->s2->tmp.conn_id_length=i; 379 s->s2->tmp.cert_length = i;
377 s->state=SSL2_ST_GET_SERVER_HELLO_B; 380 n2s(p, i);
378 } 381 s->s2->tmp.csl = i;
382 n2s(p, i);
383 s->s2->tmp.conn_id_length = i;
384 s->state = SSL2_ST_GET_SERVER_HELLO_B;
385 }
379 386
380 /* SSL2_ST_GET_SERVER_HELLO_B */ 387 /* SSL2_ST_GET_SERVER_HELLO_B */
381 len = 11 + (unsigned long)s->s2->tmp.cert_length + (unsigned long)s->s2->tmp.csl + (unsigned long)s->s2->tmp.conn_id_length; 388 len = 11 + (unsigned long)s->s2->tmp.cert_length + (unsigned long)s->s2->tmp.csl + (unsigned long)s->s2->tmp.conn_id_length;
382 if (len > SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER) 389 if (len > SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER) {
383 { 390 SSLerr(SSL_F_GET_SERVER_HELLO, SSL_R_MESSAGE_TOO_LONG);
384 SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_MESSAGE_TOO_LONG);
385 return -1; 391 return -1;
386 } 392 }
387 j = (int)len - s->init_num; 393 j = (int)len - s->init_num;
388 i = ssl2_read(s,(char *)&(buf[s->init_num]),j); 394 i = ssl2_read(s,(char *)&(buf[s->init_num]), j);
389 if (i != j) return(ssl2_part_read(s,SSL_F_GET_SERVER_HELLO,i)); 395 if (i != j)
396 return (ssl2_part_read(s, SSL_F_GET_SERVER_HELLO, i));
390 if (s->msg_callback) 397 if (s->msg_callback)
391 s->msg_callback(0, s->version, 0, buf, (size_t)len, s, s->msg_callback_arg); /* SERVER-HELLO */ 398 s->msg_callback(0, s->version, 0, buf, (size_t)len, s, s->msg_callback_arg); /* SERVER-HELLO */
392 399
393 /* things are looking good */ 400 /* things are looking good */
394 401
395 p = buf + 11; 402 p = buf + 11;
396 if (s->hit) 403 if (s->hit) {
397 { 404 if (s->s2->tmp.cert_length != 0) {
398 if (s->s2->tmp.cert_length != 0) 405 SSLerr(SSL_F_GET_SERVER_HELLO, SSL_R_REUSE_CERT_LENGTH_NOT_ZERO);
399 { 406 return (-1);
400 SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_REUSE_CERT_LENGTH_NOT_ZERO); 407 }
401 return(-1); 408 if (s->s2->tmp.cert_type != 0) {
402 }
403 if (s->s2->tmp.cert_type != 0)
404 {
405 if (!(s->options & 409 if (!(s->options &
406 SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG)) 410 SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG)) {
407 { 411 SSLerr(SSL_F_GET_SERVER_HELLO, SSL_R_REUSE_CERT_TYPE_NOT_ZERO);
408 SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_REUSE_CERT_TYPE_NOT_ZERO); 412 return (-1);
409 return(-1);
410 }
411 }
412 if (s->s2->tmp.csl != 0)
413 {
414 SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_REUSE_CIPHER_LIST_NOT_ZERO);
415 return(-1);
416 } 413 }
417 } 414 }
418 else 415 if (s->s2->tmp.csl != 0) {
419 { 416 SSLerr(SSL_F_GET_SERVER_HELLO, SSL_R_REUSE_CIPHER_LIST_NOT_ZERO);
417 return (-1);
418 }
419 } else {
420#ifdef undef 420#ifdef undef
421 /* very bad */ 421 /* very bad */
422 memset(s->session->session_id,0, 422 memset(s->session->session_id, 0,
423 SSL_MAX_SSL_SESSION_ID_LENGTH_IN_BYTES); 423 SSL_MAX_SSL_SESSION_ID_LENGTH_IN_BYTES);
424 s->session->session_id_length=0; 424 s->session->session_id_length = 0;
425 */ 425 */
426#endif 426#endif
427 427
@@ -429,372 +429,351 @@ static int get_server_hello(SSL *s)
429 * client session but others are already reusing it. 429 * client session but others are already reusing it.
430 * If this was a new 'blank' session ID, the session-id 430 * If this was a new 'blank' session ID, the session-id
431 * length will still be 0 */ 431 * length will still be 0 */
432 if (s->session->session_id_length > 0) 432 if (s->session->session_id_length > 0) {
433 { 433 if (!ssl_get_new_session(s, 0)) {
434 if (!ssl_get_new_session(s,0)) 434 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
435 { 435 return (-1);
436 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
437 return(-1);
438 }
439 } 436 }
437 }
440 438
441 if (ssl2_set_certificate(s,s->s2->tmp.cert_type, 439 if (ssl2_set_certificate(s, s->s2->tmp.cert_type,
442 s->s2->tmp.cert_length,p) <= 0) 440 s->s2->tmp.cert_length, p) <= 0) {
443 { 441 ssl2_return_error(s, SSL2_PE_BAD_CERTIFICATE);
444 ssl2_return_error(s,SSL2_PE_BAD_CERTIFICATE); 442 return (-1);
445 return(-1); 443 }
446 } 444 p += s->s2->tmp.cert_length;
447 p+=s->s2->tmp.cert_length;
448 445
449 if (s->s2->tmp.csl == 0) 446 if (s->s2->tmp.csl == 0) {
450 { 447 ssl2_return_error(s, SSL2_PE_NO_CIPHER);
451 ssl2_return_error(s,SSL2_PE_NO_CIPHER); 448 SSLerr(SSL_F_GET_SERVER_HELLO, SSL_R_NO_CIPHER_LIST);
452 SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_NO_CIPHER_LIST); 449 return (-1);
453 return(-1); 450 }
454 }
455 451
456 /* We have just received a list of ciphers back from the 452 /* We have just received a list of ciphers back from the
457 * server. We need to get the ones that match, then select 453 * server. We need to get the ones that match, then select
458 * the one we want the most :-). */ 454 * the one we want the most :-). */
459 455
460 /* load the ciphers */ 456 /* load the ciphers */
461 sk=ssl_bytes_to_cipher_list(s,p,s->s2->tmp.csl, 457 sk = ssl_bytes_to_cipher_list(s, p, s->s2->tmp.csl,
462 &s->session->ciphers); 458 &s->session->ciphers);
463 p+=s->s2->tmp.csl; 459 p += s->s2->tmp.csl;
464 if (sk == NULL) 460 if (sk == NULL) {
465 { 461 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
466 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR); 462 SSLerr(SSL_F_GET_SERVER_HELLO, ERR_R_MALLOC_FAILURE);
467 SSLerr(SSL_F_GET_SERVER_HELLO,ERR_R_MALLOC_FAILURE); 463 return (-1);
468 return(-1); 464 }
469 }
470 465
471 (void)sk_SSL_CIPHER_set_cmp_func(sk,ssl_cipher_ptr_id_cmp); 466 (void)sk_SSL_CIPHER_set_cmp_func(sk, ssl_cipher_ptr_id_cmp);
472 467
473 /* get the array of ciphers we will accept */ 468 /* get the array of ciphers we will accept */
474 cl=SSL_get_ciphers(s); 469 cl = SSL_get_ciphers(s);
475 (void)sk_SSL_CIPHER_set_cmp_func(cl,ssl_cipher_ptr_id_cmp); 470 (void)sk_SSL_CIPHER_set_cmp_func(cl, ssl_cipher_ptr_id_cmp);
476 471
477 /* 472 /*
478 * If server preference flag set, choose the first 473 * If server preference flag set, choose the first
479 * (highest priority) cipher the server sends, otherwise 474 * (highest priority) cipher the server sends, otherwise
480 * client preference has priority. 475 * client preference has priority.
481 */ 476 */
482 if (s->options & SSL_OP_CIPHER_SERVER_PREFERENCE) 477 if (s->options & SSL_OP_CIPHER_SERVER_PREFERENCE) {
483 { 478 prio = sk;
484 prio = sk; 479 allow = cl;
485 allow = cl; 480 } else {
486 } 481 prio = cl;
487 else 482 allow = sk;
488 { 483 }
489 prio = cl;
490 allow = sk;
491 }
492 /* In theory we could have ciphers sent back that we 484 /* In theory we could have ciphers sent back that we
493 * don't want to use but that does not matter since we 485 * don't want to use but that does not matter since we
494 * will check against the list we originally sent and 486 * will check against the list we originally sent and
495 * for performance reasons we should not bother to match 487 * for performance reasons we should not bother to match
496 * the two lists up just to check. */ 488 * the two lists up just to check. */
497 for (i=0; i<sk_SSL_CIPHER_num(prio); i++) 489 for (i = 0; i < sk_SSL_CIPHER_num(prio); i++) {
498 {
499 if (sk_SSL_CIPHER_find(allow, 490 if (sk_SSL_CIPHER_find(allow,
500 sk_SSL_CIPHER_value(prio,i)) >= 0) 491 sk_SSL_CIPHER_value(prio, i)) >= 0)
501 break; 492 break;
502 } 493 }
503 494
504 if (i >= sk_SSL_CIPHER_num(prio)) 495 if (i >= sk_SSL_CIPHER_num(prio)) {
505 { 496 ssl2_return_error(s, SSL2_PE_NO_CIPHER);
506 ssl2_return_error(s,SSL2_PE_NO_CIPHER); 497 SSLerr(SSL_F_GET_SERVER_HELLO, SSL_R_NO_CIPHER_MATCH);
507 SSLerr(SSL_F_GET_SERVER_HELLO,SSL_R_NO_CIPHER_MATCH); 498 return (-1);
508 return(-1); 499 }
509 } 500 s->session->cipher = sk_SSL_CIPHER_value(prio, i);
510 s->session->cipher=sk_SSL_CIPHER_value(prio,i);
511 501
512 502
513 if (s->session->peer != NULL) /* can't happen*/ 503 if (s->session->peer != NULL) /* can't happen*/
514 { 504 {
515 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR); 505 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
516 SSLerr(SSL_F_GET_SERVER_HELLO, ERR_R_INTERNAL_ERROR); 506 SSLerr(SSL_F_GET_SERVER_HELLO, ERR_R_INTERNAL_ERROR);
517 return(-1); 507 return (-1);
518 } 508 }
519 509
520 s->session->peer = s->session->sess_cert->peer_key->x509; 510 s->session->peer = s->session->sess_cert->peer_key->x509;
521 /* peer_key->x509 has been set by ssl2_set_certificate. */ 511 /* peer_key->x509 has been set by ssl2_set_certificate. */
522 CRYPTO_add(&s->session->peer->references, 1, CRYPTO_LOCK_X509); 512 CRYPTO_add(&s->session->peer->references, 1, CRYPTO_LOCK_X509);
523 } 513 }
524 514
525 if (s->session->sess_cert == NULL 515 if (s->session->sess_cert == NULL
526 || s->session->peer != s->session->sess_cert->peer_key->x509) 516 || s->session->peer != s->session->sess_cert->peer_key->x509)
527 /* can't happen */ 517 /* can't happen */
528 { 518 {
529 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR); 519 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
530 SSLerr(SSL_F_GET_SERVER_HELLO, ERR_R_INTERNAL_ERROR); 520 SSLerr(SSL_F_GET_SERVER_HELLO, ERR_R_INTERNAL_ERROR);
531 return(-1); 521 return (-1);
532 } 522 }
533 523
534 s->s2->conn_id_length=s->s2->tmp.conn_id_length; 524 s->s2->conn_id_length = s->s2->tmp.conn_id_length;
535 if (s->s2->conn_id_length > sizeof s->s2->conn_id) 525 if (s->s2->conn_id_length > sizeof s->s2->conn_id) {
536 {
537 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR); 526 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
538 SSLerr(SSL_F_GET_SERVER_HELLO, SSL_R_SSL2_CONNECTION_ID_TOO_LONG); 527 SSLerr(SSL_F_GET_SERVER_HELLO, SSL_R_SSL2_CONNECTION_ID_TOO_LONG);
539 return -1; 528 return -1;
540 }
541 memcpy(s->s2->conn_id,p,s->s2->tmp.conn_id_length);
542 return(1);
543 } 529 }
530 memcpy(s->s2->conn_id, p, s->s2->tmp.conn_id_length);
531 return (1);
532}
544 533
545static int client_hello(SSL *s) 534static int
546 { 535client_hello(SSL *s)
536{
547 unsigned char *buf; 537 unsigned char *buf;
548 unsigned char *p,*d; 538 unsigned char *p, *d;
549/* CIPHER **cipher;*/ 539/* CIPHER **cipher;*/
550 int i,n,j; 540 int i, n, j;
551 541
552 buf=(unsigned char *)s->init_buf->data; 542 buf = (unsigned char *)s->init_buf->data;
553 if (s->state == SSL2_ST_SEND_CLIENT_HELLO_A) 543 if (s->state == SSL2_ST_SEND_CLIENT_HELLO_A) {
554 {
555 if ((s->session == NULL) || 544 if ((s->session == NULL) ||
556 (s->session->ssl_version != s->version)) 545 (s->session->ssl_version != s->version)) {
557 { 546 if (!ssl_get_new_session(s, 0)) {
558 if (!ssl_get_new_session(s,0)) 547 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
559 { 548 return (-1);
560 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
561 return(-1);
562 }
563 } 549 }
550 }
564 /* else use the pre-loaded session */ 551 /* else use the pre-loaded session */
565 552
566 p=buf; /* header */ 553 p = buf;
567 d=p+9; /* data section */ 554 /* header */
568 *(p++)=SSL2_MT_CLIENT_HELLO; /* type */ 555 d = p + 9;
569 s2n(SSL2_VERSION,p); /* version */ 556 /* data section */
570 n=j=0; 557 *(p++) = SSL2_MT_CLIENT_HELLO;
571 558 /* type */
572 n=ssl_cipher_list_to_bytes(s,SSL_get_ciphers(s),d,0); 559 s2n(SSL2_VERSION, p);
573 d+=n; 560 /* version */
574 561 n = j=0;
575 if (n == 0) 562
576 { 563 n = ssl_cipher_list_to_bytes(s, SSL_get_ciphers(s), d, 0);
577 SSLerr(SSL_F_CLIENT_HELLO,SSL_R_NO_CIPHERS_AVAILABLE); 564 d += n;
578 return(-1); 565
579 } 566 if (n == 0) {
567 SSLerr(SSL_F_CLIENT_HELLO, SSL_R_NO_CIPHERS_AVAILABLE);
568 return (-1);
569 }
580 570
581 s2n(n,p); /* cipher spec num bytes */ 571 s2n(n, p);
572 /* cipher spec num bytes */
582 573
583 if ((s->session->session_id_length > 0) && 574 if ((s->session->session_id_length > 0) &&
584 (s->session->session_id_length <= 575 (s->session->session_id_length <=
585 SSL2_MAX_SSL_SESSION_ID_LENGTH)) 576 SSL2_MAX_SSL_SESSION_ID_LENGTH)) {
586 { 577 i = s->session->session_id_length;
587 i=s->session->session_id_length; 578 s2n(i, p);
588 s2n(i,p); /* session id length */ 579 /* session id length */
589 memcpy(d,s->session->session_id,(unsigned int)i); 580 memcpy(d, s->session->session_id,(unsigned int)i);
590 d+=i; 581 d += i;
591 } 582 } else {
592 else 583 s2n(0, p);
593 { 584 }
594 s2n(0,p);
595 }
596 585
597 s->s2->challenge_length=SSL2_CHALLENGE_LENGTH; 586 s->s2->challenge_length = SSL2_CHALLENGE_LENGTH;
598 s2n(SSL2_CHALLENGE_LENGTH,p); /* challenge length */ 587 s2n(SSL2_CHALLENGE_LENGTH, p);
588 /* challenge length */
599 /*challenge id data*/ 589 /*challenge id data*/
600 if (RAND_pseudo_bytes(s->s2->challenge,SSL2_CHALLENGE_LENGTH) <= 0) 590 if (RAND_pseudo_bytes(s->s2->challenge, SSL2_CHALLENGE_LENGTH) <= 0)
601 return -1; 591 return -1;
602 memcpy(d,s->s2->challenge,SSL2_CHALLENGE_LENGTH); 592 memcpy(d, s->s2->challenge, SSL2_CHALLENGE_LENGTH);
603 d+=SSL2_CHALLENGE_LENGTH; 593 d += SSL2_CHALLENGE_LENGTH;
604 594
605 s->state=SSL2_ST_SEND_CLIENT_HELLO_B; 595 s->state = SSL2_ST_SEND_CLIENT_HELLO_B;
606 s->init_num=d-buf; 596 s->init_num = d - buf;
607 s->init_off=0; 597 s->init_off = 0;
608 }
609 /* SSL2_ST_SEND_CLIENT_HELLO_B */
610 return(ssl2_do_write(s));
611 } 598 }
599 /* SSL2_ST_SEND_CLIENT_HELLO_B */
600 return (ssl2_do_write(s));
601}
612 602
613static int client_master_key(SSL *s) 603static int
614 { 604client_master_key(SSL *s)
605{
615 unsigned char *buf; 606 unsigned char *buf;
616 unsigned char *p,*d; 607 unsigned char *p, *d;
617 int clear,enc,karg,i; 608 int clear, enc, karg, i;
618 SSL_SESSION *sess; 609 SSL_SESSION *sess;
619 const EVP_CIPHER *c; 610 const EVP_CIPHER *c;
620 const EVP_MD *md; 611 const EVP_MD *md;
621 612
622 buf=(unsigned char *)s->init_buf->data; 613 buf = (unsigned char *)s->init_buf->data;
623 if (s->state == SSL2_ST_SEND_CLIENT_MASTER_KEY_A) 614 if (s->state == SSL2_ST_SEND_CLIENT_MASTER_KEY_A) {
624 {
625 615
626 if (!ssl_cipher_get_evp(s->session,&c,&md,NULL,NULL,NULL)) 616 if (!ssl_cipher_get_evp(s->session, &c, &md, NULL, NULL, NULL)) {
627 { 617 ssl2_return_error(s, SSL2_PE_NO_CIPHER);
628 ssl2_return_error(s,SSL2_PE_NO_CIPHER); 618 SSLerr(SSL_F_CLIENT_MASTER_KEY, SSL_R_PROBLEMS_MAPPING_CIPHER_FUNCTIONS);
629 SSLerr(SSL_F_CLIENT_MASTER_KEY,SSL_R_PROBLEMS_MAPPING_CIPHER_FUNCTIONS); 619 return (-1);
630 return(-1); 620 }
631 } 621 sess = s->session;
632 sess=s->session; 622 p = buf;
633 p=buf; 623 d = p + 10;
634 d=p+10;
635 *(p++)=SSL2_MT_CLIENT_MASTER_KEY;/* type */ 624 *(p++)=SSL2_MT_CLIENT_MASTER_KEY;/* type */
636 625
637 i=ssl_put_cipher_by_char(s,sess->cipher,p); 626 i = ssl_put_cipher_by_char(s, sess->cipher, p);
638 p+=i; 627 p += i;
639 628
640 /* make key_arg data */ 629 /* make key_arg data */
641 i=EVP_CIPHER_iv_length(c); 630 i = EVP_CIPHER_iv_length(c);
642 sess->key_arg_length=i; 631 sess->key_arg_length = i;
643 if (i > SSL_MAX_KEY_ARG_LENGTH) 632 if (i > SSL_MAX_KEY_ARG_LENGTH) {
644 {
645 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR); 633 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
646 SSLerr(SSL_F_CLIENT_MASTER_KEY, ERR_R_INTERNAL_ERROR); 634 SSLerr(SSL_F_CLIENT_MASTER_KEY, ERR_R_INTERNAL_ERROR);
647 return -1; 635 return -1;
648 } 636 }
649 if (i > 0) 637 if (i > 0)
650 if (RAND_pseudo_bytes(sess->key_arg,i) <= 0) 638 if (RAND_pseudo_bytes(sess->key_arg, i) <= 0)
651 return -1; 639 return -1;
652 640
653 /* make a master key */ 641 /* make a master key */
654 i=EVP_CIPHER_key_length(c); 642 i = EVP_CIPHER_key_length(c);
655 sess->master_key_length=i; 643 sess->master_key_length = i;
656 if (i > 0) 644 if (i > 0) {
657 { 645 if (i > (int)sizeof(sess->master_key)) {
658 if (i > (int)sizeof(sess->master_key))
659 {
660 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR); 646 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
661 SSLerr(SSL_F_CLIENT_MASTER_KEY, ERR_R_INTERNAL_ERROR); 647 SSLerr(SSL_F_CLIENT_MASTER_KEY, ERR_R_INTERNAL_ERROR);
662 return -1; 648 return -1;
663 }
664 if (RAND_bytes(sess->master_key,i) <= 0)
665 {
666 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
667 return(-1);
668 }
669 } 649 }
650 if (RAND_bytes(sess->master_key, i) <= 0) {
651 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
652 return (-1);
653 }
654 }
670 655
671 if (sess->cipher->algorithm2 & SSL2_CF_8_BYTE_ENC) 656 if (sess->cipher->algorithm2 & SSL2_CF_8_BYTE_ENC)
672 enc=8; 657 enc = 8;
673 else if (SSL_C_IS_EXPORT(sess->cipher)) 658 else if (SSL_C_IS_EXPORT(sess->cipher))
674 enc=5; 659 enc = 5;
675 else 660 else
676 enc=i; 661 enc = i;
677 662
678 if ((int)i < enc) 663 if ((int)i < enc) {
679 { 664 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
680 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR); 665 SSLerr(SSL_F_CLIENT_MASTER_KEY, SSL_R_CIPHER_TABLE_SRC_ERROR);
681 SSLerr(SSL_F_CLIENT_MASTER_KEY,SSL_R_CIPHER_TABLE_SRC_ERROR); 666 return (-1);
682 return(-1); 667 }
683 } 668 clear = i - enc;
684 clear=i-enc; 669 s2n(clear, p);
685 s2n(clear,p); 670 memcpy(d, sess->master_key,(unsigned int)clear);
686 memcpy(d,sess->master_key,(unsigned int)clear); 671 d += clear;
687 d+=clear; 672
688 673 enc = ssl_rsa_public_encrypt(sess->sess_cert, enc,
689 enc=ssl_rsa_public_encrypt(sess->sess_cert,enc, 674 &(sess->master_key[clear]), d,
690 &(sess->master_key[clear]),d, 675 (s->s2->ssl2_rollback) ? RSA_SSLV23_PADDING :
691 (s->s2->ssl2_rollback)?RSA_SSLV23_PADDING:RSA_PKCS1_PADDING); 676 RSA_PKCS1_PADDING);
692 if (enc <= 0) 677 if (enc <= 0) {
693 { 678 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
694 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR); 679 SSLerr(SSL_F_CLIENT_MASTER_KEY, SSL_R_PUBLIC_KEY_ENCRYPT_ERROR);
695 SSLerr(SSL_F_CLIENT_MASTER_KEY,SSL_R_PUBLIC_KEY_ENCRYPT_ERROR); 680 return (-1);
696 return(-1); 681 }
697 }
698#ifdef PKCS1_CHECK 682#ifdef PKCS1_CHECK
699 if (s->options & SSL_OP_PKCS1_CHECK_1) d[1]++; 683 if (s->options & SSL_OP_PKCS1_CHECK_1)
684 d[1]++;
700 if (s->options & SSL_OP_PKCS1_CHECK_2) 685 if (s->options & SSL_OP_PKCS1_CHECK_2)
701 sess->master_key[clear]++; 686 sess->master_key[clear]++;
702#endif 687#endif
703 s2n(enc,p); 688 s2n(enc, p);
704 d+=enc; 689 d += enc;
705 karg=sess->key_arg_length; 690 karg = sess->key_arg_length;
691
706 s2n(karg,p); /* key arg size */ 692 s2n(karg,p); /* key arg size */
707 if (karg > (int)sizeof(sess->key_arg)) 693 if (karg > (int)sizeof(sess->key_arg)) {
708 { 694 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
709 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
710 SSLerr(SSL_F_CLIENT_MASTER_KEY, ERR_R_INTERNAL_ERROR); 695 SSLerr(SSL_F_CLIENT_MASTER_KEY, ERR_R_INTERNAL_ERROR);
711 return -1; 696 return -1;
712 }
713 memcpy(d,sess->key_arg,(unsigned int)karg);
714 d+=karg;
715
716 s->state=SSL2_ST_SEND_CLIENT_MASTER_KEY_B;
717 s->init_num=d-buf;
718 s->init_off=0;
719 } 697 }
698 memcpy(d, sess->key_arg,(unsigned int)karg);
699 d += karg;
720 700
721 /* SSL2_ST_SEND_CLIENT_MASTER_KEY_B */ 701 s->state = SSL2_ST_SEND_CLIENT_MASTER_KEY_B;
722 return(ssl2_do_write(s)); 702 s->init_num = d - buf;
703 s->init_off = 0;
723 } 704 }
724 705
725static int client_finished(SSL *s) 706 /* SSL2_ST_SEND_CLIENT_MASTER_KEY_B */
726 { 707 return (ssl2_do_write(s));
708}
709
710static int
711client_finished(SSL *s)
712{
727 unsigned char *p; 713 unsigned char *p;
728 714
729 if (s->state == SSL2_ST_SEND_CLIENT_FINISHED_A) 715 if (s->state == SSL2_ST_SEND_CLIENT_FINISHED_A) {
730 { 716 p = (unsigned char *)s->init_buf->data;
731 p=(unsigned char *)s->init_buf->data; 717 *(p++) = SSL2_MT_CLIENT_FINISHED;
732 *(p++)=SSL2_MT_CLIENT_FINISHED; 718 if (s->s2->conn_id_length > sizeof s->s2->conn_id) {
733 if (s->s2->conn_id_length > sizeof s->s2->conn_id)
734 {
735 SSLerr(SSL_F_CLIENT_FINISHED, ERR_R_INTERNAL_ERROR); 719 SSLerr(SSL_F_CLIENT_FINISHED, ERR_R_INTERNAL_ERROR);
736 return -1; 720 return -1;
737 }
738 memcpy(p,s->s2->conn_id,(unsigned int)s->s2->conn_id_length);
739
740 s->state=SSL2_ST_SEND_CLIENT_FINISHED_B;
741 s->init_num=s->s2->conn_id_length+1;
742 s->init_off=0;
743 } 721 }
744 return(ssl2_do_write(s)); 722 memcpy(p, s->s2->conn_id,(unsigned int)s->s2->conn_id_length);
723
724 s->state = SSL2_ST_SEND_CLIENT_FINISHED_B;
725 s->init_num = s->s2->conn_id_length + 1;
726 s->init_off = 0;
745 } 727 }
728 return (ssl2_do_write(s));
729}
746 730
747/* read the data and then respond */ 731/* read the data and then respond */
748static int client_certificate(SSL *s) 732static int
749 { 733client_certificate(SSL *s)
734{
750 unsigned char *buf; 735 unsigned char *buf;
751 unsigned char *p,*d; 736 unsigned char *p, *d;
752 int i; 737 int i;
753 unsigned int n; 738 unsigned int n;
754 int cert_ch_len; 739 int cert_ch_len;
755 unsigned char *cert_ch; 740 unsigned char *cert_ch;
756 741
757 buf=(unsigned char *)s->init_buf->data; 742 buf = (unsigned char *)s->init_buf->data;
758 743
759 /* We have a cert associated with the SSL, so attach it to 744 /* We have a cert associated with the SSL, so attach it to
760 * the session if it does not have one */ 745 * the session if it does not have one */
761 746
762 if (s->state == SSL2_ST_SEND_CLIENT_CERTIFICATE_A) 747 if (s->state == SSL2_ST_SEND_CLIENT_CERTIFICATE_A) {
763 { 748 i = ssl2_read(s,(char *)&(buf[s->init_num]),
764 i=ssl2_read(s,(char *)&(buf[s->init_num]), 749 SSL2_MAX_CERT_CHALLENGE_LENGTH + 2 - s->init_num);
765 SSL2_MAX_CERT_CHALLENGE_LENGTH+2-s->init_num); 750 if (i < (SSL2_MIN_CERT_CHALLENGE_LENGTH + 2 - s->init_num))
766 if (i<(SSL2_MIN_CERT_CHALLENGE_LENGTH+2-s->init_num)) 751 return (ssl2_part_read(s, SSL_F_CLIENT_CERTIFICATE, i));
767 return(ssl2_part_read(s,SSL_F_CLIENT_CERTIFICATE,i));
768 s->init_num += i; 752 s->init_num += i;
769 if (s->msg_callback) 753 if (s->msg_callback)
770 s->msg_callback(0, s->version, 0, buf, (size_t)s->init_num, s, s->msg_callback_arg); /* REQUEST-CERTIFICATE */ 754 s->msg_callback(0, s->version, 0, buf, (size_t)s->init_num, s, s->msg_callback_arg); /* REQUEST-CERTIFICATE */
771 755
772 /* type=buf[0]; */ 756 /* type=buf[0]; */
773 /* type eq x509 */ 757 /* type eq x509 */
774 if (buf[1] != SSL2_AT_MD5_WITH_RSA_ENCRYPTION) 758 if (buf[1] != SSL2_AT_MD5_WITH_RSA_ENCRYPTION) {
775 { 759 ssl2_return_error(s, SSL2_PE_UNSUPPORTED_CERTIFICATE_TYPE);
776 ssl2_return_error(s,SSL2_PE_UNSUPPORTED_CERTIFICATE_TYPE); 760 SSLerr(SSL_F_CLIENT_CERTIFICATE, SSL_R_BAD_AUTHENTICATION_TYPE);
777 SSLerr(SSL_F_CLIENT_CERTIFICATE,SSL_R_BAD_AUTHENTICATION_TYPE); 761 return (-1);
778 return(-1);
779 }
780
781 if ((s->cert == NULL) ||
782 (s->cert->key->x509 == NULL) ||
783 (s->cert->key->privatekey == NULL))
784 {
785 s->state=SSL2_ST_X509_GET_CLIENT_CERTIFICATE;
786 }
787 else
788 s->state=SSL2_ST_SEND_CLIENT_CERTIFICATE_C;
789 } 762 }
790 763
764 if ((s->cert == NULL) || (s->cert->key->x509 == NULL) ||
765 (s->cert->key->privatekey == NULL)) {
766 s->state = SSL2_ST_X509_GET_CLIENT_CERTIFICATE;
767 } else
768 s->state = SSL2_ST_SEND_CLIENT_CERTIFICATE_C;
769 }
770
791 cert_ch = buf + 2; 771 cert_ch = buf + 2;
792 cert_ch_len = s->init_num - 2; 772 cert_ch_len = s->init_num - 2;
793 773
794 if (s->state == SSL2_ST_X509_GET_CLIENT_CERTIFICATE) 774 if (s->state == SSL2_ST_X509_GET_CLIENT_CERTIFICATE) {
795 { 775 X509 *x509 = NULL;
796 X509 *x509=NULL; 776 EVP_PKEY *pkey = NULL;
797 EVP_PKEY *pkey=NULL;
798 777
799 /* If we get an error we need to 778 /* If we get an error we need to
800 * ssl->rwstate=SSL_X509_LOOKUP; 779 * ssl->rwstate=SSL_X509_LOOKUP;
@@ -802,326 +781,298 @@ static int client_certificate(SSL *s)
802 * We should then be retried when things are ok and we 781 * We should then be retried when things are ok and we
803 * can get a cert or not */ 782 * can get a cert or not */
804 783
805 i=0; 784 i = 0;
806 if (s->ctx->client_cert_cb != NULL) 785 if (s->ctx->client_cert_cb != NULL) {
807 { 786 i = s->ctx->client_cert_cb(s, &(x509), &(pkey));
808 i=s->ctx->client_cert_cb(s,&(x509),&(pkey)); 787 }
809 }
810 788
811 if (i < 0) 789 if (i < 0) {
812 { 790 s->rwstate = SSL_X509_LOOKUP;
813 s->rwstate=SSL_X509_LOOKUP; 791 return (-1);
814 return(-1); 792 }
815 } 793 s->rwstate = SSL_NOTHING;
816 s->rwstate=SSL_NOTHING;
817 794
818 if ((i == 1) && (pkey != NULL) && (x509 != NULL)) 795 if ((i == 1) && (pkey != NULL) && (x509 != NULL)) {
819 { 796 s->state = SSL2_ST_SEND_CLIENT_CERTIFICATE_C;
820 s->state=SSL2_ST_SEND_CLIENT_CERTIFICATE_C; 797 if (!SSL_use_certificate(s, x509) ||
821 if ( !SSL_use_certificate(s,x509) || 798 !SSL_use_PrivateKey(s, pkey)) {
822 !SSL_use_PrivateKey(s,pkey)) 799 i = 0;
823 { 800 }
824 i=0;
825 }
826 X509_free(x509); 801 X509_free(x509);
827 EVP_PKEY_free(pkey); 802 EVP_PKEY_free(pkey);
828 } 803 } else if (i == 1) {
829 else if (i == 1) 804 if (x509 != NULL)
830 { 805 X509_free(x509);
831 if (x509 != NULL) X509_free(x509); 806 if (pkey != NULL)
832 if (pkey != NULL) EVP_PKEY_free(pkey); 807 EVP_PKEY_free(pkey);
833 SSLerr(SSL_F_CLIENT_CERTIFICATE,SSL_R_BAD_DATA_RETURNED_BY_CALLBACK); 808 SSLerr(SSL_F_CLIENT_CERTIFICATE, SSL_R_BAD_DATA_RETURNED_BY_CALLBACK);
834 i=0; 809 i = 0;
835 } 810 }
836 811
837 if (i == 0) 812 if (i == 0) {
838 {
839 /* We have no client certificate to respond with 813 /* We have no client certificate to respond with
840 * so send the correct error message back */ 814 * so send the correct error message back */
841 s->state=SSL2_ST_SEND_CLIENT_CERTIFICATE_B; 815 s->state = SSL2_ST_SEND_CLIENT_CERTIFICATE_B;
842 p=buf; 816 p = buf;
843 *(p++)=SSL2_MT_ERROR; 817 *(p++) = SSL2_MT_ERROR;
844 s2n(SSL2_PE_NO_CERTIFICATE,p); 818 s2n(SSL2_PE_NO_CERTIFICATE, p);
845 s->init_off=0; 819 s->init_off = 0;
846 s->init_num=3; 820 s->init_num = 3;
847 /* Write is done at the end */ 821 /* Write is done at the end */
848 }
849 } 822 }
823 }
850 824
851 if (s->state == SSL2_ST_SEND_CLIENT_CERTIFICATE_B) 825 if (s->state == SSL2_ST_SEND_CLIENT_CERTIFICATE_B) {
852 { 826 return (ssl2_do_write(s));
853 return(ssl2_do_write(s)); 827 }
854 }
855 828
856 if (s->state == SSL2_ST_SEND_CLIENT_CERTIFICATE_C) 829 if (s->state == SSL2_ST_SEND_CLIENT_CERTIFICATE_C) {
857 {
858 EVP_MD_CTX ctx; 830 EVP_MD_CTX ctx;
859 831
860 /* ok, now we calculate the checksum 832 /* ok, now we calculate the checksum
861 * do it first so we can reuse buf :-) */ 833 * do it first so we can reuse buf :-) */
862 p=buf; 834 p = buf;
863 EVP_MD_CTX_init(&ctx); 835 EVP_MD_CTX_init(&ctx);
864 EVP_SignInit_ex(&ctx,s->ctx->rsa_md5, NULL); 836 EVP_SignInit_ex(&ctx, s->ctx->rsa_md5, NULL);
865 EVP_SignUpdate(&ctx,s->s2->key_material, 837 EVP_SignUpdate(&ctx, s->s2->key_material,
866 s->s2->key_material_length); 838 s->s2->key_material_length);
867 EVP_SignUpdate(&ctx,cert_ch,(unsigned int)cert_ch_len); 839 EVP_SignUpdate(&ctx, cert_ch,(unsigned int)cert_ch_len);
868 i=i2d_X509(s->session->sess_cert->peer_key->x509,&p); 840 i = i2d_X509(s->session->sess_cert->peer_key->x509, &p);
869 /* Don't update the signature if it fails - FIXME: probably should handle this better */ 841 /* Don't update the signature if it fails - FIXME: probably should handle this better */
870 if(i > 0) 842 if (i > 0)
871 EVP_SignUpdate(&ctx,buf,(unsigned int)i); 843 EVP_SignUpdate(&ctx, buf,(unsigned int)i);
872 844
873 p=buf; 845 p = buf;
874 d=p+6; 846 d = p + 6;
875 *(p++)=SSL2_MT_CLIENT_CERTIFICATE; 847 *(p++) = SSL2_MT_CLIENT_CERTIFICATE;
876 *(p++)=SSL2_CT_X509_CERTIFICATE; 848 *(p++) = SSL2_CT_X509_CERTIFICATE;
877 n=i2d_X509(s->cert->key->x509,&d); 849 n = i2d_X509(s->cert->key->x509, &d);
878 s2n(n,p); 850 s2n(n, p);
879 851
880 if (!EVP_SignFinal(&ctx,d,&n,s->cert->key->privatekey)) 852 if (!EVP_SignFinal(&ctx, d, &n, s->cert->key->privatekey)) {
881 {
882 /* this is not good. If things have failed it 853 /* this is not good. If things have failed it
883 * means there so something wrong with the key. 854 * means there so something wrong with the key.
884 * We will continue with a 0 length signature 855 * We will continue with a 0 length signature
885 */ 856 */
886 } 857 }
887 EVP_MD_CTX_cleanup(&ctx); 858 EVP_MD_CTX_cleanup(&ctx);
888 s2n(n,p); 859 s2n(n, p);
889 d+=n; 860 d += n;
890 861
891 s->state=SSL2_ST_SEND_CLIENT_CERTIFICATE_D; 862 s->state = SSL2_ST_SEND_CLIENT_CERTIFICATE_D;
892 s->init_num=d-buf; 863 s->init_num = d - buf;
893 s->init_off=0; 864 s->init_off = 0;
894 }
895 /* if (s->state == SSL2_ST_SEND_CLIENT_CERTIFICATE_D) */
896 return(ssl2_do_write(s));
897 } 865 }
866 /* if (s->state == SSL2_ST_SEND_CLIENT_CERTIFICATE_D) */
867 return (ssl2_do_write(s));
868}
898 869
899static int get_server_verify(SSL *s) 870static int
900 { 871get_server_verify(SSL *s)
872{
901 unsigned char *p; 873 unsigned char *p;
902 int i, n, len; 874 int i, n, len;
903 875
904 p=(unsigned char *)s->init_buf->data; 876 p = (unsigned char *)s->init_buf->data;
905 if (s->state == SSL2_ST_GET_SERVER_VERIFY_A) 877 if (s->state == SSL2_ST_GET_SERVER_VERIFY_A) {
906 { 878 i = ssl2_read(s,(char *)&(p[s->init_num]), 1 - s->init_num);
907 i=ssl2_read(s,(char *)&(p[s->init_num]),1-s->init_num); 879 if (i < (1 - s->init_num))
908 if (i < (1-s->init_num)) 880 return (ssl2_part_read(s, SSL_F_GET_SERVER_VERIFY, i));
909 return(ssl2_part_read(s,SSL_F_GET_SERVER_VERIFY,i));
910 s->init_num += i; 881 s->init_num += i;
911 882
912 s->state= SSL2_ST_GET_SERVER_VERIFY_B; 883 s->state = SSL2_ST_GET_SERVER_VERIFY_B;
913 if (*p != SSL2_MT_SERVER_VERIFY) 884 if (*p != SSL2_MT_SERVER_VERIFY) {
914 { 885 if (p[0] != SSL2_MT_ERROR) {
915 if (p[0] != SSL2_MT_ERROR) 886 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
916 {
917 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
918 SSLerr(SSL_F_GET_SERVER_VERIFY, 887 SSLerr(SSL_F_GET_SERVER_VERIFY,
919 SSL_R_READ_WRONG_PACKET_TYPE); 888 SSL_R_READ_WRONG_PACKET_TYPE);
920 } 889 } else {
921 else 890 SSLerr(SSL_F_GET_SERVER_VERIFY, SSL_R_PEER_ERROR);
922 {
923 SSLerr(SSL_F_GET_SERVER_VERIFY,SSL_R_PEER_ERROR);
924 /* try to read the error message */ 891 /* try to read the error message */
925 i=ssl2_read(s,(char *)&(p[s->init_num]),3-s->init_num); 892 i = ssl2_read(s,(char *)&(p[s->init_num]), 3 - s->init_num);
926 return ssl2_part_read(s,SSL_F_GET_SERVER_VERIFY,i); 893 return ssl2_part_read(s, SSL_F_GET_SERVER_VERIFY, i);
927 }
928 return(-1);
929 } 894 }
895 return (-1);
930 } 896 }
931 897 }
932 p=(unsigned char *)s->init_buf->data; 898
899 p = (unsigned char *)s->init_buf->data;
933 len = 1 + s->s2->challenge_length; 900 len = 1 + s->s2->challenge_length;
934 n = len - s->init_num; 901 n = len - s->init_num;
935 i = ssl2_read(s,(char *)&(p[s->init_num]),n); 902 i = ssl2_read(s,(char *)&(p[s->init_num]), n);
936 if (i < n) 903 if (i < n)
937 return(ssl2_part_read(s,SSL_F_GET_SERVER_VERIFY,i)); 904 return (ssl2_part_read(s, SSL_F_GET_SERVER_VERIFY, i));
938 if (s->msg_callback) 905 if (s->msg_callback)
939 s->msg_callback(0, s->version, 0, p, len, s, s->msg_callback_arg); /* SERVER-VERIFY */ 906 s->msg_callback(0, s->version, 0, p, len, s, s->msg_callback_arg); /* SERVER-VERIFY */
940 p += 1; 907 p += 1;
941 908
942 if (CRYPTO_memcmp(p,s->s2->challenge,s->s2->challenge_length) != 0) 909 if (CRYPTO_memcmp(p, s->s2->challenge, s->s2->challenge_length) != 0) {
943 { 910 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
944 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR); 911 SSLerr(SSL_F_GET_SERVER_VERIFY, SSL_R_CHALLENGE_IS_DIFFERENT);
945 SSLerr(SSL_F_GET_SERVER_VERIFY,SSL_R_CHALLENGE_IS_DIFFERENT); 912 return (-1);
946 return(-1);
947 }
948 return(1);
949 } 913 }
914 return (1);
915}
950 916
951static int get_server_finished(SSL *s) 917static int
952 { 918get_server_finished(SSL *s)
919{
953 unsigned char *buf; 920 unsigned char *buf;
954 unsigned char *p; 921 unsigned char *p;
955 int i, n, len; 922 int i, n, len;
956 923
957 buf=(unsigned char *)s->init_buf->data; 924 buf = (unsigned char *)s->init_buf->data;
958 p=buf; 925 p = buf;
959 if (s->state == SSL2_ST_GET_SERVER_FINISHED_A) 926 if (s->state == SSL2_ST_GET_SERVER_FINISHED_A) {
960 { 927 i = ssl2_read(s,(char *)&(buf[s->init_num]), 1 - s->init_num);
961 i=ssl2_read(s,(char *)&(buf[s->init_num]),1-s->init_num); 928 if (i < (1 - s->init_num))
962 if (i < (1-s->init_num)) 929 return (ssl2_part_read(s, SSL_F_GET_SERVER_FINISHED, i));
963 return(ssl2_part_read(s,SSL_F_GET_SERVER_FINISHED,i));
964 s->init_num += i; 930 s->init_num += i;
965 931
966 if (*p == SSL2_MT_REQUEST_CERTIFICATE) 932 if (*p == SSL2_MT_REQUEST_CERTIFICATE) {
967 { 933 s->state = SSL2_ST_SEND_CLIENT_CERTIFICATE_A;
968 s->state=SSL2_ST_SEND_CLIENT_CERTIFICATE_A; 934 return (1);
969 return(1); 935 } else if (*p != SSL2_MT_SERVER_FINISHED) {
970 } 936 if (p[0] != SSL2_MT_ERROR) {
971 else if (*p != SSL2_MT_SERVER_FINISHED) 937 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
972 { 938 SSLerr(SSL_F_GET_SERVER_FINISHED, SSL_R_READ_WRONG_PACKET_TYPE);
973 if (p[0] != SSL2_MT_ERROR) 939 } else {
974 { 940 SSLerr(SSL_F_GET_SERVER_FINISHED, SSL_R_PEER_ERROR);
975 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
976 SSLerr(SSL_F_GET_SERVER_FINISHED,SSL_R_READ_WRONG_PACKET_TYPE);
977 }
978 else
979 {
980 SSLerr(SSL_F_GET_SERVER_FINISHED,SSL_R_PEER_ERROR);
981 /* try to read the error message */ 941 /* try to read the error message */
982 i=ssl2_read(s,(char *)&(p[s->init_num]),3-s->init_num); 942 i = ssl2_read(s,(char *)&(p[s->init_num]), 3 - s->init_num);
983 return ssl2_part_read(s,SSL_F_GET_SERVER_VERIFY,i); 943 return ssl2_part_read(s, SSL_F_GET_SERVER_VERIFY, i);
984 }
985 return(-1);
986 } 944 }
987 s->state=SSL2_ST_GET_SERVER_FINISHED_B; 945 return (-1);
988 } 946 }
947 s->state = SSL2_ST_GET_SERVER_FINISHED_B;
948 }
989 949
990 len = 1 + SSL2_SSL_SESSION_ID_LENGTH; 950 len = 1 + SSL2_SSL_SESSION_ID_LENGTH;
991 n = len - s->init_num; 951 n = len - s->init_num;
992 i = ssl2_read(s,(char *)&(buf[s->init_num]), n); 952 i = ssl2_read(s,(char *)&(buf[s->init_num]), n);
993 if (i < n) /* XXX could be shorter than SSL2_SSL_SESSION_ID_LENGTH, that's the maximum */ 953 if (i < n) /* XXX could be shorter than SSL2_SSL_SESSION_ID_LENGTH, that's the maximum */
994 return(ssl2_part_read(s,SSL_F_GET_SERVER_FINISHED,i)); 954 return (ssl2_part_read(s, SSL_F_GET_SERVER_FINISHED, i));
995 s->init_num += i; 955 s->init_num += i;
996 if (s->msg_callback) 956 if (s->msg_callback)
997 s->msg_callback(0, s->version, 0, buf, (size_t)s->init_num, s, s->msg_callback_arg); /* SERVER-FINISHED */ 957 s->msg_callback(0, s->version, 0, buf, (size_t)s->init_num, s, s->msg_callback_arg); /* SERVER-FINISHED */
998 958
999 if (!s->hit) /* new session */ 959 if (!s->hit) /* new session */
1000 { 960 {
1001 /* new session-id */ 961 /* new session-id */
1002 /* Make sure we were not trying to re-use an old SSL_SESSION 962 /* Make sure we were not trying to re-use an old SSL_SESSION
1003 * or bad things can happen */ 963 * or bad things can happen */
1004 /* ZZZZZZZZZZZZZ */ 964 /* ZZZZZZZZZZZZZ */
1005 s->session->session_id_length=SSL2_SSL_SESSION_ID_LENGTH; 965 s->session->session_id_length = SSL2_SSL_SESSION_ID_LENGTH;
1006 memcpy(s->session->session_id,p+1,SSL2_SSL_SESSION_ID_LENGTH); 966 memcpy(s->session->session_id, p + 1, SSL2_SSL_SESSION_ID_LENGTH);
1007 } 967 } else {
1008 else 968 if (!(s->options & SSL_OP_MICROSOFT_SESS_ID_BUG)) {
1009 {
1010 if (!(s->options & SSL_OP_MICROSOFT_SESS_ID_BUG))
1011 {
1012 if ((s->session->session_id_length > sizeof s->session->session_id) 969 if ((s->session->session_id_length > sizeof s->session->session_id)
1013 || (0 != memcmp(buf + 1, s->session->session_id, 970 || (0 != memcmp(buf + 1, s->session->session_id,
1014 (unsigned int)s->session->session_id_length))) 971 (unsigned int)s->session->session_id_length))) {
1015 { 972 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
1016 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR); 973 SSLerr(SSL_F_GET_SERVER_FINISHED, SSL_R_SSL_SESSION_ID_IS_DIFFERENT);
1017 SSLerr(SSL_F_GET_SERVER_FINISHED,SSL_R_SSL_SESSION_ID_IS_DIFFERENT); 974 return (-1);
1018 return(-1);
1019 }
1020 } 975 }
1021 } 976 }
1022 s->state = SSL_ST_OK;
1023 return(1);
1024 } 977 }
978 s->state = SSL_ST_OK;
979 return (1);
980}
1025 981
1026/* loads in the certificate from the server */ 982/* loads in the certificate from the server */
1027int ssl2_set_certificate(SSL *s, int type, int len, const unsigned char *data) 983int
1028 { 984ssl2_set_certificate(SSL *s, int type, int len, const unsigned char *data)
1029 STACK_OF(X509) *sk=NULL; 985{
1030 EVP_PKEY *pkey=NULL; 986 STACK_OF(X509) *sk = NULL;
1031 SESS_CERT *sc=NULL; 987 EVP_PKEY *pkey = NULL;
988 SESS_CERT *sc = NULL;
1032 int i; 989 int i;
1033 X509 *x509=NULL; 990 X509 *x509 = NULL;
1034 int ret=0; 991 int ret = 0;
1035 992
1036 x509=d2i_X509(NULL,&data,(long)len); 993 x509 = d2i_X509(NULL, &data,(long)len);
1037 if (x509 == NULL) 994 if (x509 == NULL) {
1038 { 995 SSLerr(SSL_F_SSL2_SET_CERTIFICATE, ERR_R_X509_LIB);
1039 SSLerr(SSL_F_SSL2_SET_CERTIFICATE,ERR_R_X509_LIB);
1040 goto err; 996 goto err;
1041 } 997 }
1042 998
1043 if ((sk=sk_X509_new_null()) == NULL || !sk_X509_push(sk,x509)) 999 if ((sk = sk_X509_new_null()) == NULL || !sk_X509_push(sk, x509)) {
1044 { 1000 SSLerr(SSL_F_SSL2_SET_CERTIFICATE, ERR_R_MALLOC_FAILURE);
1045 SSLerr(SSL_F_SSL2_SET_CERTIFICATE,ERR_R_MALLOC_FAILURE);
1046 goto err; 1001 goto err;
1047 } 1002 }
1048 1003
1049 i=ssl_verify_cert_chain(s,sk); 1004 i = ssl_verify_cert_chain(s, sk);
1050 1005
1051 if ((s->verify_mode != SSL_VERIFY_NONE) && (i <= 0)) 1006 if ((s->verify_mode != SSL_VERIFY_NONE) && (i <= 0)) {
1052 { 1007 SSLerr(SSL_F_SSL2_SET_CERTIFICATE, SSL_R_CERTIFICATE_VERIFY_FAILED);
1053 SSLerr(SSL_F_SSL2_SET_CERTIFICATE,SSL_R_CERTIFICATE_VERIFY_FAILED);
1054 goto err; 1008 goto err;
1055 } 1009 }
1056 ERR_clear_error(); /* but we keep s->verify_result */ 1010 ERR_clear_error(); /* but we keep s->verify_result */
1057 s->session->verify_result = s->verify_result; 1011 s->session->verify_result = s->verify_result;
1058 1012
1059 /* server's cert for this session */ 1013 /* server's cert for this session */
1060 sc=ssl_sess_cert_new(); 1014 sc = ssl_sess_cert_new();
1061 if (sc == NULL) 1015 if (sc == NULL) {
1062 { 1016 ret = -1;
1063 ret= -1;
1064 goto err; 1017 goto err;
1065 } 1018 }
1066 if (s->session->sess_cert) ssl_sess_cert_free(s->session->sess_cert); 1019 if (s->session->sess_cert)
1067 s->session->sess_cert=sc; 1020 ssl_sess_cert_free(s->session->sess_cert);
1021 s->session->sess_cert = sc;
1068 1022
1069 sc->peer_pkeys[SSL_PKEY_RSA_ENC].x509=x509; 1023 sc->peer_pkeys[SSL_PKEY_RSA_ENC].x509 = x509;
1070 sc->peer_key= &(sc->peer_pkeys[SSL_PKEY_RSA_ENC]); 1024 sc->peer_key = &(sc->peer_pkeys[SSL_PKEY_RSA_ENC]);
1071 1025
1072 pkey=X509_get_pubkey(x509); 1026 pkey = X509_get_pubkey(x509);
1073 x509=NULL; 1027 x509 = NULL;
1074 if (pkey == NULL) 1028 if (pkey == NULL) {
1075 { 1029 SSLerr(SSL_F_SSL2_SET_CERTIFICATE, SSL_R_UNABLE_TO_EXTRACT_PUBLIC_KEY);
1076 SSLerr(SSL_F_SSL2_SET_CERTIFICATE,SSL_R_UNABLE_TO_EXTRACT_PUBLIC_KEY);
1077 goto err; 1030 goto err;
1078 } 1031 }
1079 if (pkey->type != EVP_PKEY_RSA) 1032 if (pkey->type != EVP_PKEY_RSA) {
1080 { 1033 SSLerr(SSL_F_SSL2_SET_CERTIFICATE, SSL_R_PUBLIC_KEY_NOT_RSA);
1081 SSLerr(SSL_F_SSL2_SET_CERTIFICATE,SSL_R_PUBLIC_KEY_NOT_RSA);
1082 goto err; 1034 goto err;
1083 } 1035 }
1084 1036
1085 if (!ssl_set_peer_cert_type(sc,SSL2_CT_X509_CERTIFICATE)) 1037 if (!ssl_set_peer_cert_type(sc, SSL2_CT_X509_CERTIFICATE))
1086 goto err; 1038 goto err;
1087 ret=1; 1039 ret = 1;
1088err: 1040err:
1089 sk_X509_free(sk); 1041 sk_X509_free(sk);
1090 X509_free(x509); 1042 X509_free(x509);
1091 EVP_PKEY_free(pkey); 1043 EVP_PKEY_free(pkey);
1092 return(ret); 1044 return (ret);
1093 } 1045}
1094 1046
1095static int ssl_rsa_public_encrypt(SESS_CERT *sc, int len, unsigned char *from, 1047static int
1096 unsigned char *to, int padding) 1048ssl_rsa_public_encrypt(SESS_CERT *sc, int len, unsigned char *from,
1097 { 1049 unsigned char *to, int padding)
1098 EVP_PKEY *pkey=NULL; 1050{
1099 int i= -1; 1051 EVP_PKEY *pkey = NULL;
1052 int i = -1;
1100 1053
1101 if ((sc == NULL) || (sc->peer_key->x509 == NULL) || 1054 if ((sc == NULL) || (sc->peer_key->x509 == NULL) ||
1102 ((pkey=X509_get_pubkey(sc->peer_key->x509)) == NULL)) 1055 ((pkey = X509_get_pubkey(sc->peer_key->x509)) == NULL)) {
1103 { 1056 SSLerr(SSL_F_SSL_RSA_PUBLIC_ENCRYPT, SSL_R_NO_PUBLICKEY);
1104 SSLerr(SSL_F_SSL_RSA_PUBLIC_ENCRYPT,SSL_R_NO_PUBLICKEY); 1057 return (-1);
1105 return(-1); 1058 }
1106 } 1059 if (pkey->type != EVP_PKEY_RSA) {
1107 if (pkey->type != EVP_PKEY_RSA) 1060 SSLerr(SSL_F_SSL_RSA_PUBLIC_ENCRYPT, SSL_R_PUBLIC_KEY_IS_NOT_RSA);
1108 {
1109 SSLerr(SSL_F_SSL_RSA_PUBLIC_ENCRYPT,SSL_R_PUBLIC_KEY_IS_NOT_RSA);
1110 goto end; 1061 goto end;
1111 } 1062 }
1112 1063
1113 /* we have the public key */ 1064 /* we have the public key */
1114 i=RSA_public_encrypt(len,from,to,pkey->pkey.rsa,padding); 1065 i = RSA_public_encrypt(len, from, to, pkey->pkey.rsa, padding);
1115 if (i < 0) 1066 if (i < 0)
1116 SSLerr(SSL_F_SSL_RSA_PUBLIC_ENCRYPT,ERR_R_RSA_LIB); 1067 SSLerr(SSL_F_SSL_RSA_PUBLIC_ENCRYPT, ERR_R_RSA_LIB);
1117end: 1068end:
1118 EVP_PKEY_free(pkey); 1069 EVP_PKEY_free(pkey);
1119 return(i); 1070 return (i);
1120 } 1071}
1121#else /* !OPENSSL_NO_SSL2 */ 1072#else /* !OPENSSL_NO_SSL2 */
1122 1073
1123# if PEDANTIC 1074# if PEDANTIC
1124static void *dummy=&dummy; 1075static void *dummy = &dummy;
1125# endif 1076# endif
1126 1077
1127#endif 1078#endif
diff --git a/src/lib/libssl/src/ssl/s2_enc.c b/src/lib/libssl/src/ssl/s2_enc.c
index ff3395f459..8d2273f9ef 100644
--- a/src/lib/libssl/src/ssl/s2_enc.c
+++ b/src/lib/libssl/src/ssl/s2_enc.c
@@ -60,134 +60,131 @@
60#ifndef OPENSSL_NO_SSL2 60#ifndef OPENSSL_NO_SSL2
61#include <stdio.h> 61#include <stdio.h>
62 62
63int ssl2_enc_init(SSL *s, int client) 63int
64 { 64ssl2_enc_init(SSL *s, int client)
65{
65 /* Max number of bytes needed */ 66 /* Max number of bytes needed */
66 EVP_CIPHER_CTX *rs,*ws; 67 EVP_CIPHER_CTX *rs, *ws;
67 const EVP_CIPHER *c; 68 const EVP_CIPHER *c;
68 const EVP_MD *md; 69 const EVP_MD *md;
69 int num; 70 int num;
70 71
71 if (!ssl_cipher_get_evp(s->session,&c,&md,NULL,NULL,NULL)) 72 if (!ssl_cipher_get_evp(s->session, &c, &md, NULL, NULL, NULL)) {
72 { 73 ssl2_return_error(s, SSL2_PE_NO_CIPHER);
73 ssl2_return_error(s,SSL2_PE_NO_CIPHER); 74 SSLerr(SSL_F_SSL2_ENC_INIT, SSL_R_PROBLEMS_MAPPING_CIPHER_FUNCTIONS);
74 SSLerr(SSL_F_SSL2_ENC_INIT,SSL_R_PROBLEMS_MAPPING_CIPHER_FUNCTIONS); 75 return (0);
75 return(0); 76 }
76 } 77 ssl_replace_hash(&s->read_hash, md);
77 ssl_replace_hash(&s->read_hash,md); 78 ssl_replace_hash(&s->write_hash, md);
78 ssl_replace_hash(&s->write_hash,md); 79
79 80 if ((s->enc_read_ctx == NULL) && ((s->enc_read_ctx =
80 if ((s->enc_read_ctx == NULL) && 81 (EVP_CIPHER_CTX *)OPENSSL_malloc(sizeof(EVP_CIPHER_CTX))) == NULL))
81 ((s->enc_read_ctx=(EVP_CIPHER_CTX *)
82 OPENSSL_malloc(sizeof(EVP_CIPHER_CTX))) == NULL))
83 goto err; 82 goto err;
84 83
85 /* make sure it's intialized in case the malloc for enc_write_ctx fails 84 /* make sure it's intialized in case the malloc for enc_write_ctx fails
86 * and we exit with an error */ 85 * and we exit with an error */
87 rs= s->enc_read_ctx; 86 rs = s->enc_read_ctx;
88 EVP_CIPHER_CTX_init(rs); 87 EVP_CIPHER_CTX_init(rs);
89 88
90 if ((s->enc_write_ctx == NULL) && 89 if ((s->enc_write_ctx == NULL) && ((s->enc_write_ctx =
91 ((s->enc_write_ctx=(EVP_CIPHER_CTX *) 90 (EVP_CIPHER_CTX *)OPENSSL_malloc(sizeof(EVP_CIPHER_CTX))) == NULL))
92 OPENSSL_malloc(sizeof(EVP_CIPHER_CTX))) == NULL))
93 goto err; 91 goto err;
94 92
95 ws= s->enc_write_ctx; 93 ws = s->enc_write_ctx;
96 EVP_CIPHER_CTX_init(ws); 94 EVP_CIPHER_CTX_init(ws);
97 95
98 num=c->key_len; 96 num = c->key_len;
99 s->s2->key_material_length=num*2; 97 s->s2->key_material_length = num*2;
100 OPENSSL_assert(s->s2->key_material_length <= sizeof s->s2->key_material); 98 OPENSSL_assert(s->s2->key_material_length <= sizeof s->s2->key_material);
101 99
102 if (ssl2_generate_key_material(s) <= 0) 100 if (ssl2_generate_key_material(s) <= 0)
103 return 0; 101 return 0;
104 102
105 OPENSSL_assert(c->iv_len <= (int)sizeof(s->session->key_arg)); 103 OPENSSL_assert(c->iv_len <= (int)sizeof(s->session->key_arg));
106 EVP_EncryptInit_ex(ws,c,NULL,&(s->s2->key_material[(client)?num:0]), 104 EVP_EncryptInit_ex(ws, c, NULL, &(s->s2->key_material[(client) ? num : 0]),
107 s->session->key_arg); 105 s->session->key_arg);
108 EVP_DecryptInit_ex(rs,c,NULL,&(s->s2->key_material[(client)?0:num]), 106 EVP_DecryptInit_ex(rs, c, NULL, &(s->s2->key_material[(client) ? 0 : num]),
109 s->session->key_arg); 107 s->session->key_arg);
110 s->s2->read_key= &(s->s2->key_material[(client)?0:num]); 108 s->s2->read_key = &(s->s2->key_material[(client) ? 0 : num]);
111 s->s2->write_key= &(s->s2->key_material[(client)?num:0]); 109 s->s2->write_key = &(s->s2->key_material[(client) ? num : 0]);
112 return(1); 110 return (1);
113err: 111err:
114 SSLerr(SSL_F_SSL2_ENC_INIT,ERR_R_MALLOC_FAILURE); 112 SSLerr(SSL_F_SSL2_ENC_INIT, ERR_R_MALLOC_FAILURE);
115 return(0); 113 return (0);
116 } 114}
117 115
118/* read/writes from s->s2->mac_data using length for encrypt and 116/* read/writes from s->s2->mac_data using length for encrypt and
119 * decrypt. It sets s->s2->padding and s->[rw]length 117 * decrypt. It sets s->s2->padding and s->[rw]length
120 * if we are encrypting */ 118 * if we are encrypting */
121void ssl2_enc(SSL *s, int send) 119void
122 { 120ssl2_enc(SSL *s, int send)
121{
123 EVP_CIPHER_CTX *ds; 122 EVP_CIPHER_CTX *ds;
124 unsigned long l; 123 unsigned long l;
125 int bs; 124 int bs;
126 125
127 if (send) 126 if (send) {
128 { 127 ds = s->enc_write_ctx;
129 ds=s->enc_write_ctx; 128 l = s->s2->wlength;
130 l=s->s2->wlength; 129 } else {
131 } 130 ds = s->enc_read_ctx;
132 else 131 l = s->s2->rlength;
133 { 132 }
134 ds=s->enc_read_ctx;
135 l=s->s2->rlength;
136 }
137 133
138 /* check for NULL cipher */ 134 /* check for NULL cipher */
139 if (ds == NULL) return; 135 if (ds == NULL)
136 return;
140 137
141 138
142 bs=ds->cipher->block_size; 139 bs = ds->cipher->block_size;
143 /* This should be using (bs-1) and bs instead of 7 and 8, but 140 /* This should be using (bs-1) and bs instead of 7 and 8, but
144 * what the hell. */ 141 * what the hell. */
145 if (bs == 8) 142 if (bs == 8)
146 l=(l+7)/8*8; 143 l = (l + 7) / 8 * 8;
147 144
148 EVP_Cipher(ds,s->s2->mac_data,s->s2->mac_data,l); 145 EVP_Cipher(ds, s->s2->mac_data, s->s2->mac_data, l);
149 } 146}
150 147
151void ssl2_mac(SSL *s, unsigned char *md, int send) 148void
152 { 149ssl2_mac(SSL *s, unsigned char *md, int send)
150{
153 EVP_MD_CTX c; 151 EVP_MD_CTX c;
154 unsigned char sequence[4],*p,*sec,*act; 152 unsigned char sequence[4], *p, *sec, *act;
155 unsigned long seq; 153 unsigned long seq;
156 unsigned int len; 154 unsigned int len;
157 155
158 if (send) 156 if (send) {
159 { 157 seq = s->s2->write_sequence;
160 seq=s->s2->write_sequence; 158 sec = s->s2->write_key;
161 sec=s->s2->write_key; 159 len = s->s2->wact_data_length;
162 len=s->s2->wact_data_length; 160 act = s->s2->wact_data;
163 act=s->s2->wact_data; 161 } else {
164 } 162 seq = s->s2->read_sequence;
165 else 163 sec = s->s2->read_key;
166 { 164 len = s->s2->ract_data_length;
167 seq=s->s2->read_sequence; 165 act = s->s2->ract_data;
168 sec=s->s2->read_key; 166 }
169 len=s->s2->ract_data_length; 167
170 act=s->s2->ract_data; 168 p = &(sequence[0]);
171 } 169 l2n(seq, p);
172
173 p= &(sequence[0]);
174 l2n(seq,p);
175 170
176 /* There has to be a MAC algorithm. */ 171 /* There has to be a MAC algorithm. */
177 EVP_MD_CTX_init(&c); 172 EVP_MD_CTX_init(&c);
178 EVP_MD_CTX_copy(&c, s->read_hash); 173 EVP_MD_CTX_copy(&c, s->read_hash);
179 EVP_DigestUpdate(&c,sec, 174 EVP_DigestUpdate(&c, sec,
180 EVP_CIPHER_CTX_key_length(s->enc_read_ctx)); 175 EVP_CIPHER_CTX_key_length(s->enc_read_ctx));
181 EVP_DigestUpdate(&c,act,len); 176 EVP_DigestUpdate(&c, act, len);
177
182 /* the above line also does the pad data */ 178 /* the above line also does the pad data */
183 EVP_DigestUpdate(&c,sequence,4); 179 EVP_DigestUpdate(&c, sequence, 4);
184 EVP_DigestFinal_ex(&c,md,NULL); 180
181 EVP_DigestFinal_ex(&c, md, NULL);
185 EVP_MD_CTX_cleanup(&c); 182 EVP_MD_CTX_cleanup(&c);
186 } 183}
187#else /* !OPENSSL_NO_SSL2 */ 184#else /* !OPENSSL_NO_SSL2 */
188 185
189# if PEDANTIC 186# if PEDANTIC
190static void *dummy=&dummy; 187static void *dummy = &dummy;
191# endif 188# endif
192 189
193#endif 190#endif
diff --git a/src/lib/libssl/src/ssl/s2_lib.c b/src/lib/libssl/src/ssl/s2_lib.c
index 9914604109..d3764ebbe9 100644
--- a/src/lib/libssl/src/ssl/s2_lib.c
+++ b/src/lib/libssl/src/ssl/s2_lib.c
@@ -121,336 +121,355 @@ const char ssl2_version_str[]="SSLv2" OPENSSL_VERSION_PTEXT;
121#define SSL2_NUM_CIPHERS (sizeof(ssl2_ciphers)/sizeof(SSL_CIPHER)) 121#define SSL2_NUM_CIPHERS (sizeof(ssl2_ciphers)/sizeof(SSL_CIPHER))
122 122
123/* list of available SSLv2 ciphers (sorted by id) */ 123/* list of available SSLv2 ciphers (sorted by id) */
124OPENSSL_GLOBAL const SSL_CIPHER ssl2_ciphers[]={ 124OPENSSL_GLOBAL const SSL_CIPHER ssl2_ciphers[] = {
125#if 0 125#if 0
126/* NULL_WITH_MD5 v3 */ 126/* NULL_WITH_MD5 v3 */
127 { 127 {
128 1, 128 1,
129 SSL2_TXT_NULL_WITH_MD5, 129 SSL2_TXT_NULL_WITH_MD5,
130 SSL2_CK_NULL_WITH_MD5, 130 SSL2_CK_NULL_WITH_MD5,
131 SSL_kRSA, 131 SSL_kRSA,
132 SSL_aRSA, 132 SSL_aRSA,
133 SSL_eNULL, 133 SSL_eNULL,
134 SSL_MD5, 134 SSL_MD5,
135 SSL_SSLV2, 135 SSL_SSLV2,
136 SSL_EXPORT|SSL_EXP40|SSL_STRONG_NONE, 136 SSL_EXPORT|SSL_EXP40|SSL_STRONG_NONE,
137 0, 137 0,
138 0, 138 0,
139 0, 139 0,
140 }, 140 },
141#endif 141#endif
142 142
143/* RC4_128_WITH_MD5 */ 143/* RC4_128_WITH_MD5 */
144 { 144 {
145 1, 145 1,
146 SSL2_TXT_RC4_128_WITH_MD5, 146 SSL2_TXT_RC4_128_WITH_MD5,
147 SSL2_CK_RC4_128_WITH_MD5, 147 SSL2_CK_RC4_128_WITH_MD5,
148 SSL_kRSA, 148 SSL_kRSA,
149 SSL_aRSA, 149 SSL_aRSA,
150 SSL_RC4, 150 SSL_RC4,
151 SSL_MD5, 151 SSL_MD5,
152 SSL_SSLV2, 152 SSL_SSLV2,
153 SSL_NOT_EXP|SSL_MEDIUM, 153 SSL_NOT_EXP|SSL_MEDIUM,
154 0, 154 0,
155 128, 155 128,
156 128, 156 128,
157 }, 157 },
158 158
159/* RC4_128_EXPORT40_WITH_MD5 */ 159/* RC4_128_EXPORT40_WITH_MD5 */
160 { 160 {
161 1, 161 1,
162 SSL2_TXT_RC4_128_EXPORT40_WITH_MD5, 162 SSL2_TXT_RC4_128_EXPORT40_WITH_MD5,
163 SSL2_CK_RC4_128_EXPORT40_WITH_MD5, 163 SSL2_CK_RC4_128_EXPORT40_WITH_MD5,
164 SSL_kRSA, 164 SSL_kRSA,
165 SSL_aRSA, 165 SSL_aRSA,
166 SSL_RC4, 166 SSL_RC4,
167 SSL_MD5, 167 SSL_MD5,
168 SSL_SSLV2, 168 SSL_SSLV2,
169 SSL_EXPORT|SSL_EXP40, 169 SSL_EXPORT|SSL_EXP40,
170 SSL2_CF_5_BYTE_ENC, 170 SSL2_CF_5_BYTE_ENC,
171 40, 171 40,
172 128, 172 128,
173 }, 173 },
174 174
175/* RC2_128_CBC_WITH_MD5 */ 175/* RC2_128_CBC_WITH_MD5 */
176 { 176 {
177 1, 177 1,
178 SSL2_TXT_RC2_128_CBC_WITH_MD5, 178 SSL2_TXT_RC2_128_CBC_WITH_MD5,
179 SSL2_CK_RC2_128_CBC_WITH_MD5, 179 SSL2_CK_RC2_128_CBC_WITH_MD5,
180 SSL_kRSA, 180 SSL_kRSA,
181 SSL_aRSA, 181 SSL_aRSA,
182 SSL_RC2, 182 SSL_RC2,
183 SSL_MD5, 183 SSL_MD5,
184 SSL_SSLV2, 184 SSL_SSLV2,
185 SSL_NOT_EXP|SSL_MEDIUM, 185 SSL_NOT_EXP|SSL_MEDIUM,
186 0, 186 0,
187 128, 187 128,
188 128, 188 128,
189 }, 189 },
190 190
191/* RC2_128_CBC_EXPORT40_WITH_MD5 */ 191/* RC2_128_CBC_EXPORT40_WITH_MD5 */
192 { 192 {
193 1, 193 1,
194 SSL2_TXT_RC2_128_CBC_EXPORT40_WITH_MD5, 194 SSL2_TXT_RC2_128_CBC_EXPORT40_WITH_MD5,
195 SSL2_CK_RC2_128_CBC_EXPORT40_WITH_MD5, 195 SSL2_CK_RC2_128_CBC_EXPORT40_WITH_MD5,
196 SSL_kRSA, 196 SSL_kRSA,
197 SSL_aRSA, 197 SSL_aRSA,
198 SSL_RC2, 198 SSL_RC2,
199 SSL_MD5, 199 SSL_MD5,
200 SSL_SSLV2, 200 SSL_SSLV2,
201 SSL_EXPORT|SSL_EXP40, 201 SSL_EXPORT|SSL_EXP40,
202 SSL2_CF_5_BYTE_ENC, 202 SSL2_CF_5_BYTE_ENC,
203 40, 203 40,
204 128, 204 128,
205 }, 205 },
206 206
207#ifndef OPENSSL_NO_IDEA 207#ifndef OPENSSL_NO_IDEA
208/* IDEA_128_CBC_WITH_MD5 */ 208/* IDEA_128_CBC_WITH_MD5 */
209 { 209 {
210 1, 210 1,
211 SSL2_TXT_IDEA_128_CBC_WITH_MD5, 211 SSL2_TXT_IDEA_128_CBC_WITH_MD5,
212 SSL2_CK_IDEA_128_CBC_WITH_MD5, 212 SSL2_CK_IDEA_128_CBC_WITH_MD5,
213 SSL_kRSA, 213 SSL_kRSA,
214 SSL_aRSA, 214 SSL_aRSA,
215 SSL_IDEA, 215 SSL_IDEA,
216 SSL_MD5, 216 SSL_MD5,
217 SSL_SSLV2, 217 SSL_SSLV2,
218 SSL_NOT_EXP|SSL_MEDIUM, 218 SSL_NOT_EXP|SSL_MEDIUM,
219 0, 219 0,
220 128, 220 128,
221 128, 221 128,
222 }, 222 },
223#endif 223#endif
224 224
225/* DES_64_CBC_WITH_MD5 */ 225/* DES_64_CBC_WITH_MD5 */
226 { 226 {
227 1, 227 1,
228 SSL2_TXT_DES_64_CBC_WITH_MD5, 228 SSL2_TXT_DES_64_CBC_WITH_MD5,
229 SSL2_CK_DES_64_CBC_WITH_MD5, 229 SSL2_CK_DES_64_CBC_WITH_MD5,
230 SSL_kRSA, 230 SSL_kRSA,
231 SSL_aRSA, 231 SSL_aRSA,
232 SSL_DES, 232 SSL_DES,
233 SSL_MD5, 233 SSL_MD5,
234 SSL_SSLV2, 234 SSL_SSLV2,
235 SSL_NOT_EXP|SSL_LOW, 235 SSL_NOT_EXP|SSL_LOW,
236 0, 236 0,
237 56, 237 56,
238 56, 238 56,
239 }, 239 },
240 240
241/* DES_192_EDE3_CBC_WITH_MD5 */ 241/* DES_192_EDE3_CBC_WITH_MD5 */
242 { 242 {
243 1, 243 1,
244 SSL2_TXT_DES_192_EDE3_CBC_WITH_MD5, 244 SSL2_TXT_DES_192_EDE3_CBC_WITH_MD5,
245 SSL2_CK_DES_192_EDE3_CBC_WITH_MD5, 245 SSL2_CK_DES_192_EDE3_CBC_WITH_MD5,
246 SSL_kRSA, 246 SSL_kRSA,
247 SSL_aRSA, 247 SSL_aRSA,
248 SSL_3DES, 248 SSL_3DES,
249 SSL_MD5, 249 SSL_MD5,
250 SSL_SSLV2, 250 SSL_SSLV2,
251 SSL_NOT_EXP|SSL_HIGH, 251 SSL_NOT_EXP|SSL_HIGH,
252 0, 252 0,
253 168, 253 168,
254 168, 254 168,
255 }, 255 },
256 256
257#if 0 257#if 0
258/* RC4_64_WITH_MD5 */ 258/* RC4_64_WITH_MD5 */
259 { 259 {
260 1, 260 1,
261 SSL2_TXT_RC4_64_WITH_MD5, 261 SSL2_TXT_RC4_64_WITH_MD5,
262 SSL2_CK_RC4_64_WITH_MD5, 262 SSL2_CK_RC4_64_WITH_MD5,
263 SSL_kRSA, 263 SSL_kRSA,
264 SSL_aRSA, 264 SSL_aRSA,
265 SSL_RC4, 265 SSL_RC4,
266 SSL_MD5, 266 SSL_MD5,
267 SSL_SSLV2, 267 SSL_SSLV2,
268 SSL_NOT_EXP|SSL_LOW, 268 SSL_NOT_EXP|SSL_LOW,
269 SSL2_CF_8_BYTE_ENC, 269 SSL2_CF_8_BYTE_ENC,
270 64, 270 64,
271 64, 271 64,
272 }, 272 },
273#endif 273#endif
274 274
275#if 0 275#if 0
276/* NULL SSLeay (testing) */ 276/* NULL SSLeay (testing) */
277 { 277 {
278 0, 278 0,
279 SSL2_TXT_NULL, 279 SSL2_TXT_NULL,
280 SSL2_CK_NULL, 280 SSL2_CK_NULL,
281 0, 281 0,
282 0, 282 0,
283 0, 283 0,
284 0, 284 0,
285 SSL_SSLV2, 285 SSL_SSLV2,
286 SSL_STRONG_NONE, 286 SSL_STRONG_NONE,
287 0, 287 0,
288 0, 288 0,
289 0, 289 0,
290 }, 290 },
291#endif 291#endif
292 292
293/* end of list :-) */ 293/* end of list :-) */
294 }; 294};
295 295
296long ssl2_default_timeout(void) 296long
297 { 297ssl2_default_timeout(void)
298 return(300); 298{
299 } 299 return (300);
300 300}
301int ssl2_num_ciphers(void) 301
302 { 302int
303 return(SSL2_NUM_CIPHERS); 303ssl2_num_ciphers(void)
304 } 304{
305 305 return (SSL2_NUM_CIPHERS);
306const SSL_CIPHER *ssl2_get_cipher(unsigned int u) 306}
307 { 307
308const SSL_CIPHER
309*ssl2_get_cipher(unsigned int u)
310{
308 if (u < SSL2_NUM_CIPHERS) 311 if (u < SSL2_NUM_CIPHERS)
309 return(&(ssl2_ciphers[SSL2_NUM_CIPHERS-1-u])); 312 return (&(ssl2_ciphers[SSL2_NUM_CIPHERS - 1 - u]));
310 else 313 else
311 return(NULL); 314 return (NULL);
312 } 315}
313 316
314int ssl2_pending(const SSL *s) 317int
315 { 318ssl2_pending(const SSL *s)
319{
316 return SSL_in_init(s) ? 0 : s->s2->ract_data_length; 320 return SSL_in_init(s) ? 0 : s->s2->ract_data_length;
317 } 321}
318 322
319int ssl2_new(SSL *s) 323int
320 { 324ssl2_new(SSL *s)
325{
321 SSL2_STATE *s2; 326 SSL2_STATE *s2;
322 327
323 if ((s2=OPENSSL_malloc(sizeof *s2)) == NULL) goto err; 328 if ((s2 = OPENSSL_malloc(sizeof *s2)) == NULL)
324 memset(s2,0,sizeof *s2); 329 goto err;
330 memset(s2, 0, sizeof *s2);
325 331
326#if SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER + 3 > SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER + 2 332#if SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER + 3 > SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER + 2
327# error "assertion failed" 333# error "assertion failed"
328#endif 334#endif
329 335
330 if ((s2->rbuf=OPENSSL_malloc( 336 if ((s2->rbuf = OPENSSL_malloc(
331 SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER+2)) == NULL) goto err; 337 SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER + 2)) == NULL)
338 goto err;
332 /* wbuf needs one byte more because when using two-byte headers, 339 /* wbuf needs one byte more because when using two-byte headers,
333 * we leave the first byte unused in do_ssl_write (s2_pkt.c) */ 340 * we leave the first byte unused in do_ssl_write (s2_pkt.c) */
334 if ((s2->wbuf=OPENSSL_malloc( 341 if ((s2->wbuf = OPENSSL_malloc(
335 SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER+3)) == NULL) goto err; 342 SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER + 3)) == NULL)
336 s->s2=s2; 343 goto err;
344 s->s2 = s2;
337 345
338 ssl2_clear(s); 346 ssl2_clear(s);
339 return(1); 347 return (1);
340err: 348err:
341 if (s2 != NULL) 349 if (s2 != NULL) {
342 { 350 if (s2->wbuf != NULL)
343 if (s2->wbuf != NULL) OPENSSL_free(s2->wbuf); 351 OPENSSL_free(s2->wbuf);
344 if (s2->rbuf != NULL) OPENSSL_free(s2->rbuf); 352 if (s2->rbuf != NULL)
353 OPENSSL_free(s2->rbuf);
345 OPENSSL_free(s2); 354 OPENSSL_free(s2);
346 }
347 return(0);
348 } 355 }
356 return (0);
357}
349 358
350void ssl2_free(SSL *s) 359void
351 { 360ssl2_free(SSL *s)
361{
352 SSL2_STATE *s2; 362 SSL2_STATE *s2;
353 363
354 if(s == NULL) 364 if (s == NULL)
355 return; 365 return;
356 366
357 s2=s->s2; 367 s2 = s->s2;
358 if (s2->rbuf != NULL) OPENSSL_free(s2->rbuf); 368 if (s2->rbuf != NULL)
359 if (s2->wbuf != NULL) OPENSSL_free(s2->wbuf); 369 OPENSSL_free(s2->rbuf);
360 OPENSSL_cleanse(s2,sizeof *s2); 370 if (s2->wbuf != NULL)
371 OPENSSL_free(s2->wbuf);
372 OPENSSL_cleanse(s2, sizeof *s2);
361 OPENSSL_free(s2); 373 OPENSSL_free(s2);
362 s->s2=NULL; 374 s->s2 = NULL;
363 } 375}
364 376
365void ssl2_clear(SSL *s) 377void
366 { 378ssl2_clear(SSL *s)
379{
367 SSL2_STATE *s2; 380 SSL2_STATE *s2;
368 unsigned char *rbuf,*wbuf; 381 unsigned char *rbuf, *wbuf;
369 382
370 s2=s->s2; 383 s2 = s->s2;
371 384
372 rbuf=s2->rbuf; 385 rbuf = s2->rbuf;
373 wbuf=s2->wbuf; 386 wbuf = s2->wbuf;
374 387
375 memset(s2,0,sizeof *s2); 388 memset(s2, 0, sizeof *s2);
376 389
377 s2->rbuf=rbuf; 390 s2->rbuf = rbuf;
378 s2->wbuf=wbuf; 391 s2->wbuf = wbuf;
379 s2->clear_text=1; 392 s2->clear_text = 1;
380 s->packet=s2->rbuf; 393 s->packet = s2->rbuf;
381 s->version=SSL2_VERSION; 394 s->version = SSL2_VERSION;
382 s->packet_length=0; 395 s->packet_length = 0;
383 } 396}
384 397
385long ssl2_ctrl(SSL *s, int cmd, long larg, void *parg) 398long
386 { 399ssl2_ctrl(SSL *s, int cmd, long larg, void *parg)
387 int ret=0; 400{
401 int ret = 0;
388 402
389 switch(cmd) 403 switch (cmd) {
390 {
391 case SSL_CTRL_GET_SESSION_REUSED: 404 case SSL_CTRL_GET_SESSION_REUSED:
392 ret=s->hit; 405 ret = s->hit;
393 break; 406 break;
394 default: 407 default:
395 break; 408 break;
396 }
397 return(ret);
398 }
399
400long ssl2_callback_ctrl(SSL *s, int cmd, void (*fp)(void))
401 {
402 return(0);
403 }
404
405long ssl2_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg)
406 {
407 return(0);
408 }
409
410long ssl2_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)(void))
411 {
412 return(0);
413 } 409 }
410 return (ret);
411}
412
413long
414ssl2_callback_ctrl(SSL *s, int cmd, void (*fp)(void))
415{
416 return (0);
417}
418
419long
420ssl2_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg)
421{
422 return (0);
423}
424
425long
426ssl2_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)(void))
427{
428 return (0);
429}
414 430
415/* This function needs to check if the ciphers required are actually 431/* This function needs to check if the ciphers required are actually
416 * available */ 432 * available */
417const SSL_CIPHER *ssl2_get_cipher_by_char(const unsigned char *p) 433const SSL_CIPHER
418 { 434*ssl2_get_cipher_by_char(const unsigned char *p)
435{
419 SSL_CIPHER c; 436 SSL_CIPHER c;
420 const SSL_CIPHER *cp; 437 const SSL_CIPHER *cp;
421 unsigned long id; 438 unsigned long id;
422 439
423 id=0x02000000L|((unsigned long)p[0]<<16L)| 440 id = 0x02000000L|((unsigned long)p[0]<<16L)|
424 ((unsigned long)p[1]<<8L)|(unsigned long)p[2]; 441 ((unsigned long)p[1]<<8L)|(unsigned long)p[2];
425 c.id=id; 442 c.id = id;
426 cp = OBJ_bsearch_ssl_cipher_id(&c, ssl2_ciphers, SSL2_NUM_CIPHERS); 443 cp = OBJ_bsearch_ssl_cipher_id(&c, ssl2_ciphers, SSL2_NUM_CIPHERS);
427 if ((cp == NULL) || (cp->valid == 0)) 444 if ((cp == NULL) || (cp->valid == 0))
428 return NULL; 445 return NULL;
429 else 446 else
430 return cp; 447 return cp;
431 } 448}
432 449
433int ssl2_put_cipher_by_char(const SSL_CIPHER *c, unsigned char *p) 450int
434 { 451ssl2_put_cipher_by_char(const SSL_CIPHER *c, unsigned char *p)
452{
435 long l; 453 long l;
436 454
437 if (p != NULL) 455 if (p != NULL) {
438 { 456 l = c->id;
439 l=c->id; 457 if ((l & 0xff000000) != 0x02000000)
440 if ((l & 0xff000000) != 0x02000000) return(0); 458 return (0);
441 p[0]=((unsigned char)(l>>16L))&0xFF; 459 p[0] = ((unsigned char)(l >> 16L))&0xFF;
442 p[1]=((unsigned char)(l>> 8L))&0xFF; 460 p[1] = ((unsigned char)(l >> 8L))&0xFF;
443 p[2]=((unsigned char)(l ))&0xFF; 461 p[2] = ((unsigned char)(l ))&0xFF;
444 }
445 return(3);
446 } 462 }
463 return (3);
464}
447 465
448int ssl2_generate_key_material(SSL *s) 466int
449 { 467ssl2_generate_key_material(SSL *s)
468{
450 unsigned int i; 469 unsigned int i;
451 EVP_MD_CTX ctx; 470 EVP_MD_CTX ctx;
452 unsigned char *km; 471 unsigned char *km;
453 unsigned char c='0'; 472 unsigned char c = '0';
454 const EVP_MD *md5; 473 const EVP_MD *md5;
455 int md_size; 474 int md_size;
456 475
@@ -461,96 +480,94 @@ int ssl2_generate_key_material(SSL *s)
461 see SSLv2 docu */ 480 see SSLv2 docu */
462#endif 481#endif
463 EVP_MD_CTX_init(&ctx); 482 EVP_MD_CTX_init(&ctx);
464 km=s->s2->key_material; 483 km = s->s2->key_material;
465 484
466 if (s->session->master_key_length < 0 || 485 if (s->session->master_key_length < 0 ||
467 s->session->master_key_length > (int)sizeof(s->session->master_key)) 486 s->session->master_key_length > (int)sizeof(s->session->master_key)) {
468 { 487 SSLerr(SSL_F_SSL2_GENERATE_KEY_MATERIAL, ERR_R_INTERNAL_ERROR);
469 SSLerr(SSL_F_SSL2_GENERATE_KEY_MATERIAL, ERR_R_INTERNAL_ERROR); 488 return 0;
470 return 0; 489 }
471 }
472 md_size = EVP_MD_size(md5); 490 md_size = EVP_MD_size(md5);
473 if (md_size < 0) 491 if (md_size < 0)
474 return 0; 492 return 0;
475 for (i=0; i<s->s2->key_material_length; i += md_size) 493 for (i = 0; i < s->s2->key_material_length; i += md_size) {
476 {
477 if (((km - s->s2->key_material) + md_size) > 494 if (((km - s->s2->key_material) + md_size) >
478 (int)sizeof(s->s2->key_material)) 495 (int)sizeof(s->s2->key_material)) {
479 {
480 /* EVP_DigestFinal_ex() below would write beyond buffer */ 496 /* EVP_DigestFinal_ex() below would write beyond buffer */
481 SSLerr(SSL_F_SSL2_GENERATE_KEY_MATERIAL, ERR_R_INTERNAL_ERROR); 497 SSLerr(SSL_F_SSL2_GENERATE_KEY_MATERIAL, ERR_R_INTERNAL_ERROR);
482 return 0; 498 return 0;
483 } 499 }
484 500
485 EVP_DigestInit_ex(&ctx, md5, NULL); 501 EVP_DigestInit_ex(&ctx, md5, NULL);
486 502
487 OPENSSL_assert(s->session->master_key_length >= 0 503 OPENSSL_assert(s->session->master_key_length >= 0 &&
488 && s->session->master_key_length 504 s->session->master_key_length <
489 < (int)sizeof(s->session->master_key)); 505 (int)sizeof(s->session->master_key));
490 EVP_DigestUpdate(&ctx,s->session->master_key,s->session->master_key_length); 506 EVP_DigestUpdate(&ctx, s->session->master_key, s->session->master_key_length);
491 EVP_DigestUpdate(&ctx,&c,1); 507 EVP_DigestUpdate(&ctx, &c, 1);
492 c++; 508 c++;
493 EVP_DigestUpdate(&ctx,s->s2->challenge,s->s2->challenge_length); 509 EVP_DigestUpdate(&ctx, s->s2->challenge, s->s2->challenge_length);
494 EVP_DigestUpdate(&ctx,s->s2->conn_id,s->s2->conn_id_length); 510 EVP_DigestUpdate(&ctx, s->s2->conn_id, s->s2->conn_id_length);
495 EVP_DigestFinal_ex(&ctx,km,NULL); 511 EVP_DigestFinal_ex(&ctx, km, NULL);
496 km += md_size; 512 km += md_size;
497 } 513 }
498 514
499 EVP_MD_CTX_cleanup(&ctx); 515 EVP_MD_CTX_cleanup(&ctx);
500 return 1; 516 return 1;
501 } 517}
502 518
503void ssl2_return_error(SSL *s, int err) 519void
504 { 520ssl2_return_error(SSL *s, int err)
505 if (!s->error) 521{
506 { 522 if (!s->error) {
507 s->error=3; 523 s->error = 3;
508 s->error_code=err; 524 s->error_code = err;
509 525
510 ssl2_write_error(s); 526 ssl2_write_error(s);
511 }
512 } 527 }
528}
513 529
514 530
515void ssl2_write_error(SSL *s) 531void
516 { 532ssl2_write_error(SSL *s)
533{
517 unsigned char buf[3]; 534 unsigned char buf[3];
518 int i,error; 535 int i, error;
519 536
520 buf[0]=SSL2_MT_ERROR; 537 buf[0] = SSL2_MT_ERROR;
521 buf[1]=(s->error_code>>8)&0xff; 538 buf[1] = (s->error_code >> 8)&0xff;
522 buf[2]=(s->error_code)&0xff; 539 buf[2] = (s->error_code)&0xff;
523 540
524/* state=s->rwstate;*/ 541/* state=s->rwstate;*/
525 542
526 error=s->error; /* number of bytes left to write */ 543 error=s->error; /* number of bytes left to write */
527 s->error=0; 544 s->error = 0;
528 OPENSSL_assert(error >= 0 && error <= (int)sizeof(buf)); 545 OPENSSL_assert(error >= 0 && error <= (int)sizeof(buf));
529 i=ssl2_write(s,&(buf[3-error]),error); 546 i = ssl2_write(s, &(buf[3 - error]), error);
530 547
531/* if (i == error) s->rwstate=state; */ 548/* if (i == error) s->rwstate=state; */
532 549
533 if (i < 0) 550 if (i < 0)
534 s->error=error; 551 s->error = error;
535 else 552 else {
536 { 553 s->error = error - i;
537 s->error=error-i;
538 554
539 if (s->error == 0) 555 if (s->error == 0)
540 if (s->msg_callback) 556 if (s->msg_callback)
541 s->msg_callback(1, s->version, 0, buf, 3, s, s->msg_callback_arg); /* ERROR */ 557 s->msg_callback(1, s->version, 0, buf, 3, s, s->msg_callback_arg); /* ERROR */
542 }
543 }
544
545int ssl2_shutdown(SSL *s)
546 {
547 s->shutdown=(SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN);
548 return(1);
549 } 558 }
559}
560
561int
562ssl2_shutdown(SSL *s)
563{
564 s->shutdown = (SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN);
565 return (1);
566}
550#else /* !OPENSSL_NO_SSL2 */ 567#else /* !OPENSSL_NO_SSL2 */
551 568
552# if PEDANTIC 569# if PEDANTIC
553static void *dummy=&dummy; 570static void *dummy = &dummy;
554# endif 571# endif
555 572
556#endif 573#endif
diff --git a/src/lib/libssl/src/ssl/s2_meth.c b/src/lib/libssl/src/ssl/s2_meth.c
index f0e8ca593d..ca08fc6e22 100644
--- a/src/lib/libssl/src/ssl/s2_meth.c
+++ b/src/lib/libssl/src/ssl/s2_meth.c
@@ -62,23 +62,22 @@
62#include <openssl/objects.h> 62#include <openssl/objects.h>
63 63
64static const SSL_METHOD *ssl2_get_method(int ver); 64static const SSL_METHOD *ssl2_get_method(int ver);
65static const SSL_METHOD *ssl2_get_method(int ver) 65static const SSL_METHOD
66 { 66*ssl2_get_method(int ver)
67{
67 if (ver == SSL2_VERSION) 68 if (ver == SSL2_VERSION)
68 return(SSLv2_method()); 69 return (SSLv2_method());
69 else 70 else
70 return(NULL); 71 return (NULL);
71 } 72}
72 73
73IMPLEMENT_ssl2_meth_func(SSLv2_method, 74IMPLEMENT_ssl2_meth_func(SSLv2_method,
74 ssl2_accept, 75 ssl2_accept, ssl2_connect, ssl2_get_method)
75 ssl2_connect,
76 ssl2_get_method)
77 76
78#else /* !OPENSSL_NO_SSL2 */ 77#else /* !OPENSSL_NO_SSL2 */
79 78
80# if PEDANTIC 79# if PEDANTIC
81static void *dummy=&dummy; 80static void *dummy = &dummy;
82# endif 81# endif
83 82
84#endif 83#endif
diff --git a/src/lib/libssl/src/ssl/s2_pkt.c b/src/lib/libssl/src/ssl/s2_pkt.c
index 7efad40153..3a92c81d65 100644
--- a/src/lib/libssl/src/ssl/s2_pkt.c
+++ b/src/lib/libssl/src/ssl/s2_pkt.c
@@ -114,7 +114,7 @@
114#include <stdio.h> 114#include <stdio.h>
115#include <errno.h> 115#include <errno.h>
116 116
117static int read_n(SSL *s,unsigned int n,unsigned int max,unsigned int extend); 117static int read_n(SSL *s, unsigned int n, unsigned int max, unsigned int extend);
118static int n_do_ssl_write(SSL *s, const unsigned char *buf, unsigned int len); 118static int n_do_ssl_write(SSL *s, const unsigned char *buf, unsigned int len);
119static int write_pending(SSL *s, const unsigned char *buf, unsigned int len); 119static int write_pending(SSL *s, const unsigned char *buf, unsigned int len);
120static int ssl_mt_error(int n); 120static int ssl_mt_error(int n);
@@ -123,158 +123,145 @@ static int ssl_mt_error(int n);
123/* SSL 2.0 imlementation for SSL_read/SSL_peek - 123/* SSL 2.0 imlementation for SSL_read/SSL_peek -
124 * This routine will return 0 to len bytes, decrypted etc if required. 124 * This routine will return 0 to len bytes, decrypted etc if required.
125 */ 125 */
126static int ssl2_read_internal(SSL *s, void *buf, int len, int peek) 126static int
127 { 127ssl2_read_internal(SSL *s, void *buf, int len, int peek)
128{
128 int n; 129 int n;
129 unsigned char mac[MAX_MAC_SIZE]; 130 unsigned char mac[MAX_MAC_SIZE];
130 unsigned char *p; 131 unsigned char *p;
131 int i; 132 int i;
132 int mac_size; 133 int mac_size;
133 134
134 ssl2_read_again: 135 ssl2_read_again:
135 if (SSL_in_init(s) && !s->in_handshake) 136 if (SSL_in_init(s) && !s->in_handshake) {
136 { 137 n = s->handshake_func(s);
137 n=s->handshake_func(s); 138 if (n < 0)
138 if (n < 0) return(n); 139 return (n);
139 if (n == 0) 140 if (n == 0) {
140 { 141 SSLerr(SSL_F_SSL2_READ_INTERNAL, SSL_R_SSL_HANDSHAKE_FAILURE);
141 SSLerr(SSL_F_SSL2_READ_INTERNAL,SSL_R_SSL_HANDSHAKE_FAILURE); 142 return (-1);
142 return(-1);
143 }
144 } 143 }
144 }
145 145
146 errno = 0; 146 errno = 0;
147 s->rwstate=SSL_NOTHING; 147 s->rwstate = SSL_NOTHING;
148 if (len <= 0) return(len); 148 if (len <= 0)
149 return (len);
149 150
150 if (s->s2->ract_data_length != 0) /* read from buffer */ 151 if (s->s2->ract_data_length != 0) /* read from buffer */
151 { 152 {
152 if (len > s->s2->ract_data_length) 153 if (len > s->s2->ract_data_length)
153 n=s->s2->ract_data_length; 154 n = s->s2->ract_data_length;
154 else 155 else
155 n=len; 156 n = len;
156 157
157 memcpy(buf,s->s2->ract_data,(unsigned int)n); 158 memcpy(buf, s->s2->ract_data,(unsigned int)n);
158 if (!peek) 159 if (!peek) {
159 { 160 s->s2->ract_data_length -= n;
160 s->s2->ract_data_length-=n; 161 s->s2->ract_data += n;
161 s->s2->ract_data+=n;
162 if (s->s2->ract_data_length == 0) 162 if (s->s2->ract_data_length == 0)
163 s->rstate=SSL_ST_READ_HEADER; 163 s->rstate = SSL_ST_READ_HEADER;
164 }
165
166 return(n);
167 } 164 }
168 165
166 return (n);
167 }
168
169 /* s->s2->ract_data_length == 0 169 /* s->s2->ract_data_length == 0
170 * 170 *
171 * Fill the buffer, then goto ssl2_read_again. 171 * Fill the buffer, then goto ssl2_read_again.
172 */ 172 */
173 173
174 if (s->rstate == SSL_ST_READ_HEADER) 174 if (s->rstate == SSL_ST_READ_HEADER) {
175 { 175 if (s->first_packet) {
176 if (s->first_packet) 176 n = read_n(s, 5, SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER + 2, 0);
177 {
178 n=read_n(s,5,SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER+2,0);
179 if (n <= 0) return(n); /* error or non-blocking */ 177 if (n <= 0) return(n); /* error or non-blocking */
180 s->first_packet=0; 178 s->first_packet = 0;
181 p=s->packet; 179 p = s->packet;
182 if (!((p[0] & 0x80) && ( 180 if (!((p[0] & 0x80) && (
183 (p[2] == SSL2_MT_CLIENT_HELLO) || 181 (p[2] == SSL2_MT_CLIENT_HELLO) ||
184 (p[2] == SSL2_MT_SERVER_HELLO)))) 182 (p[2] == SSL2_MT_SERVER_HELLO)))) {
185 { 183 SSLerr(SSL_F_SSL2_READ_INTERNAL, SSL_R_NON_SSLV2_INITIAL_PACKET);
186 SSLerr(SSL_F_SSL2_READ_INTERNAL,SSL_R_NON_SSLV2_INITIAL_PACKET); 184 return (-1);
187 return(-1);
188 }
189 }
190 else
191 {
192 n=read_n(s,2,SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER+2,0);
193 if (n <= 0) return(n); /* error or non-blocking */
194 } 185 }
186 } else {
187 n = read_n(s, 2, SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER + 2, 0);
188 if (n <= 0)
189 return(n); /* error or non-blocking */
190 }
195 /* part read stuff */ 191 /* part read stuff */
196 192
197 s->rstate=SSL_ST_READ_BODY; 193 s->rstate = SSL_ST_READ_BODY;
198 p=s->packet; 194 p = s->packet;
199 /* Do header */ 195 /* Do header */
200 /*s->s2->padding=0;*/ 196 /*s->s2->padding=0;*/
201 s->s2->escape=0; 197 s->s2->escape = 0;
202 s->s2->rlength=(((unsigned int)p[0])<<8)|((unsigned int)p[1]); 198 s->s2->rlength = (((unsigned int)p[0]) << 8)|((unsigned int)p[1]);
203 if ((p[0] & TWO_BYTE_BIT)) /* Two byte header? */ 199 if ((p[0] & TWO_BYTE_BIT)) /* Two byte header? */
204 { 200 {
205 s->s2->three_byte_header=0; 201 s->s2->three_byte_header = 0;
206 s->s2->rlength&=TWO_BYTE_MASK; 202 s->s2->rlength&=TWO_BYTE_MASK;
207 } 203
208 else 204 } else {
209 { 205 s->s2->three_byte_header = 1;
210 s->s2->three_byte_header=1;
211 s->s2->rlength&=THREE_BYTE_MASK; 206 s->s2->rlength&=THREE_BYTE_MASK;
212 207
213 /* security >s2->escape */ 208 /* security >s2->escape */
214 s->s2->escape=((p[0] & SEC_ESC_BIT))?1:0; 209 s->s2->escape = ((p[0] & SEC_ESC_BIT)) ? 1 : 0;
215 }
216 } 210 }
211 }
217 212
218 if (s->rstate == SSL_ST_READ_BODY) 213 if (s->rstate == SSL_ST_READ_BODY) {
219 { 214 n = s->s2->rlength + 2 + s->s2->three_byte_header;
220 n=s->s2->rlength+2+s->s2->three_byte_header; 215 if (n > (int)s->packet_length) {
221 if (n > (int)s->packet_length) 216 n -= s->packet_length;
222 { 217 i = read_n(s, (unsigned int)n, (unsigned int)n, 1);
223 n-=s->packet_length; 218 if (i <= 0)
224 i=read_n(s,(unsigned int)n,(unsigned int)n,1); 219 return(i); /* ERROR */
225 if (i <= 0) return(i); /* ERROR */ 220 }
226 }
227 221
228 p= &(s->packet[2]); 222 p = &(s->packet[2]);
229 s->rstate=SSL_ST_READ_HEADER; 223 s->rstate = SSL_ST_READ_HEADER;
230 if (s->s2->three_byte_header) 224 if (s->s2->three_byte_header)
231 s->s2->padding= *(p++); 225 s->s2->padding= *(p++);
232 else s->s2->padding=0; 226 else s->s2->padding = 0;
233 227
234 /* Data portion */ 228 /* Data portion */
235 if (s->s2->clear_text) 229 if (s->s2->clear_text) {
236 {
237 mac_size = 0; 230 mac_size = 0;
238 s->s2->mac_data=p; 231 s->s2->mac_data = p;
239 s->s2->ract_data=p; 232 s->s2->ract_data = p;
240 if (s->s2->padding) 233 if (s->s2->padding) {
241 { 234 SSLerr(SSL_F_SSL2_READ_INTERNAL, SSL_R_ILLEGAL_PADDING);
242 SSLerr(SSL_F_SSL2_READ_INTERNAL,SSL_R_ILLEGAL_PADDING); 235 return (-1);
243 return(-1);
244 }
245 } 236 }
246 else 237 } else {
247 { 238 mac_size = EVP_MD_CTX_size(s->read_hash);
248 mac_size=EVP_MD_CTX_size(s->read_hash);
249 if (mac_size < 0) 239 if (mac_size < 0)
250 return -1; 240 return -1;
251 OPENSSL_assert(mac_size <= MAX_MAC_SIZE); 241 OPENSSL_assert(mac_size <= MAX_MAC_SIZE);
252 s->s2->mac_data=p; 242 s->s2->mac_data = p;
253 s->s2->ract_data= &p[mac_size]; 243 s->s2->ract_data = &p[mac_size];
254 if (s->s2->padding + mac_size > s->s2->rlength) 244 if (s->s2->padding + mac_size > s->s2->rlength) {
255 { 245 SSLerr(SSL_F_SSL2_READ_INTERNAL, SSL_R_ILLEGAL_PADDING);
256 SSLerr(SSL_F_SSL2_READ_INTERNAL,SSL_R_ILLEGAL_PADDING); 246 return (-1);
257 return(-1);
258 }
259 } 247 }
248 }
260 249
261 s->s2->ract_data_length=s->s2->rlength; 250 s->s2->ract_data_length = s->s2->rlength;
262 /* added a check for length > max_size in case 251 /* added a check for length > max_size in case
263 * encryption was not turned on yet due to an error */ 252 * encryption was not turned on yet due to an error */
264 if ((!s->s2->clear_text) && 253 if ((!s->s2->clear_text) &&
265 (s->s2->rlength >= (unsigned int)mac_size)) 254 (s->s2->rlength >= (unsigned int)mac_size)) {
266 { 255 ssl2_enc(s, 0);
267 ssl2_enc(s,0); 256 s->s2->ract_data_length -= mac_size;
268 s->s2->ract_data_length-=mac_size; 257 ssl2_mac(s, mac, 0);
269 ssl2_mac(s,mac,0); 258 s->s2->ract_data_length -= s->s2->padding;
270 s->s2->ract_data_length-=s->s2->padding; 259 if ((CRYPTO_memcmp(mac, s->s2->mac_data, mac_size) != 0) ||
271 if ( (CRYPTO_memcmp(mac,s->s2->mac_data,mac_size) != 0) || 260 (s->s2->rlength % EVP_CIPHER_CTX_block_size(s->enc_read_ctx) != 0)) {
272 (s->s2->rlength%EVP_CIPHER_CTX_block_size(s->enc_read_ctx) != 0)) 261 SSLerr(SSL_F_SSL2_READ_INTERNAL, SSL_R_BAD_MAC_DECODE);
273 { 262 return (-1);
274 SSLerr(SSL_F_SSL2_READ_INTERNAL,SSL_R_BAD_MAC_DECODE);
275 return(-1);
276 }
277 } 263 }
264 }
278 INC32(s->s2->read_sequence); /* expect next number */ 265 INC32(s->s2->read_sequence); /* expect next number */
279 /* s->s2->ract_data is now available for processing */ 266 /* s->s2->ract_data is now available for processing */
280 267
@@ -291,181 +278,166 @@ static int ssl2_read_internal(SSL *s, void *buf, int len, int peek)
291 * renegotiation can confuse things even more.] */ 278 * renegotiation can confuse things even more.] */
292 279
293 goto ssl2_read_again; /* This should really be 280 goto ssl2_read_again; /* This should really be
294 * "return ssl2_read(s,buf,len)", 281 * "return ssl2_read(s, buf, len)",
295 * but that would allow for 282 * but that would allow for
296 * denial-of-service attacks if a 283 * denial - of - service attacks if a
297 * C compiler is used that does not 284 * C compiler is used that does not
298 * recognize end-recursion. */ 285 * recognize end-recursion. */
299 } 286 } else {
300 else 287 SSLerr(SSL_F_SSL2_READ_INTERNAL, SSL_R_BAD_STATE);
301 { 288 return (-1);
302 SSLerr(SSL_F_SSL2_READ_INTERNAL,SSL_R_BAD_STATE);
303 return(-1);
304 }
305 } 289 }
290}
306 291
307int ssl2_read(SSL *s, void *buf, int len) 292int
308 { 293ssl2_read(SSL *s, void *buf, int len)
294{
309 return ssl2_read_internal(s, buf, len, 0); 295 return ssl2_read_internal(s, buf, len, 0);
310 } 296}
311 297
312int ssl2_peek(SSL *s, void *buf, int len) 298int
313 { 299ssl2_peek(SSL *s, void *buf, int len)
300{
314 return ssl2_read_internal(s, buf, len, 1); 301 return ssl2_read_internal(s, buf, len, 1);
315 } 302}
316 303
317static int read_n(SSL *s, unsigned int n, unsigned int max, 304static int
318 unsigned int extend) 305read_n(SSL *s, unsigned int n, unsigned int max, unsigned int extend)
319 { 306{
320 int i,off,newb; 307 int i, off, newb;
321 308
322 /* if there is stuff still in the buffer from a previous read, 309 /* if there is stuff still in the buffer from a previous read,
323 * and there is more than we want, take some. */ 310 * and there is more than we want, take some. */
324 if (s->s2->rbuf_left >= (int)n) 311 if (s->s2->rbuf_left >= (int)n) {
325 {
326 if (extend) 312 if (extend)
327 s->packet_length+=n; 313 s->packet_length += n;
328 else 314 else {
329 { 315 s->packet = &(s->s2->rbuf[s->s2->rbuf_offs]);
330 s->packet= &(s->s2->rbuf[s->s2->rbuf_offs]); 316 s->packet_length = n;
331 s->packet_length=n;
332 }
333 s->s2->rbuf_left-=n;
334 s->s2->rbuf_offs+=n;
335 return(n);
336 } 317 }
318 s->s2->rbuf_left -= n;
319 s->s2->rbuf_offs += n;
320 return (n);
321 }
322
323 if (!s->read_ahead)
324 max = n;
325 if (max > (unsigned int)(SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER + 2))
326 max = SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER + 2;
337 327
338 if (!s->read_ahead) max=n;
339 if (max > (unsigned int)(SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER+2))
340 max=SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER+2;
341
342 328
343 /* Else we want more than we have. 329 /* Else we want more than we have.
344 * First, if there is some left or we want to extend */ 330 * First, if there is some left or we want to extend */
345 off=0; 331 off = 0;
346 if ((s->s2->rbuf_left != 0) || ((s->packet_length != 0) && extend)) 332 if ((s->s2->rbuf_left != 0) || ((s->packet_length != 0) && extend)) {
347 { 333 newb = s->s2->rbuf_left;
348 newb=s->s2->rbuf_left; 334 if (extend) {
349 if (extend) 335 off = s->packet_length;
350 {
351 off=s->packet_length;
352 if (s->packet != s->s2->rbuf) 336 if (s->packet != s->s2->rbuf)
353 memcpy(s->s2->rbuf,s->packet, 337 memcpy(s->s2->rbuf, s->packet,
354 (unsigned int)newb+off); 338 (unsigned int)newb + off);
355 } 339 } else if (s->s2->rbuf_offs != 0) {
356 else if (s->s2->rbuf_offs != 0) 340 memcpy(s->s2->rbuf, &(s->s2->rbuf[s->s2->rbuf_offs]),
357 { 341 (unsigned int)newb);
358 memcpy(s->s2->rbuf,&(s->s2->rbuf[s->s2->rbuf_offs]), 342 s->s2->rbuf_offs = 0;
359 (unsigned int)newb);
360 s->s2->rbuf_offs=0;
361 }
362 s->s2->rbuf_left=0;
363 } 343 }
364 else 344 s->s2->rbuf_left = 0;
365 newb=0; 345 } else
346 newb = 0;
366 347
367 /* off is the offset to start writing too. 348 /* off is the offset to start writing too.
368 * r->s2->rbuf_offs is the 'unread data', now 0. 349 * r->s2->rbuf_offs is the 'unread data', now 0.
369 * newb is the number of new bytes so far 350 * newb is the number of new bytes so far
370 */ 351 */
371 s->packet=s->s2->rbuf; 352 s->packet = s->s2->rbuf;
372 while (newb < (int)n) 353 while (newb < (int)n) {
373 {
374 errno = 0; 354 errno = 0;
375 if (s->rbio != NULL) 355 if (s->rbio != NULL) {
376 { 356 s->rwstate = SSL_READING;
377 s->rwstate=SSL_READING; 357 i = BIO_read(s->rbio,(char *)&(s->s2->rbuf[off + newb]),
378 i=BIO_read(s->rbio,(char *)&(s->s2->rbuf[off+newb]), 358 max - newb);
379 max-newb); 359 } else {
380 } 360 SSLerr(SSL_F_READ_N, SSL_R_READ_BIO_NOT_SET);
381 else 361 i = -1;
382 { 362 }
383 SSLerr(SSL_F_READ_N,SSL_R_READ_BIO_NOT_SET);
384 i= -1;
385 }
386#ifdef PKT_DEBUG 363#ifdef PKT_DEBUG
387 if (s->debug & 0x01) sleep(1); 364 if (s->debug & 0x01)
365 sleep(1);
388#endif 366#endif
389 if (i <= 0) 367 if (i <= 0) {
390 { 368 s->s2->rbuf_left += newb;
391 s->s2->rbuf_left+=newb; 369 return (i);
392 return(i);
393 }
394 newb+=i;
395 } 370 }
371 newb += i;
372 }
396 373
397 /* record unread data */ 374 /* record unread data */
398 if (newb > (int)n) 375 if (newb > (int)n) {
399 { 376 s->s2->rbuf_offs = n + off;
400 s->s2->rbuf_offs=n+off; 377 s->s2->rbuf_left = newb - n;
401 s->s2->rbuf_left=newb-n; 378 } else {
402 } 379 s->s2->rbuf_offs = 0;
403 else 380 s->s2->rbuf_left = 0;
404 { 381 }
405 s->s2->rbuf_offs=0;
406 s->s2->rbuf_left=0;
407 }
408 if (extend) 382 if (extend)
409 s->packet_length+=n; 383 s->packet_length += n;
410 else 384 else
411 s->packet_length=n; 385 s->packet_length = n;
412 s->rwstate=SSL_NOTHING; 386 s->rwstate = SSL_NOTHING;
413 return(n); 387 return (n);
414 } 388}
415 389
416int ssl2_write(SSL *s, const void *_buf, int len) 390int
417 { 391ssl2_write(SSL *s, const void *_buf, int len)
418 const unsigned char *buf=_buf; 392{
419 unsigned int n,tot; 393 const unsigned char *buf = _buf;
394 unsigned int n, tot;
420 int i; 395 int i;
421 396
422 if (SSL_in_init(s) && !s->in_handshake) 397 if (SSL_in_init(s) && !s->in_handshake) {
423 { 398 i = s->handshake_func(s);
424 i=s->handshake_func(s); 399 if (i < 0)
425 if (i < 0) return(i); 400 return (i);
426 if (i == 0) 401 if (i == 0) {
427 { 402 SSLerr(SSL_F_SSL2_WRITE, SSL_R_SSL_HANDSHAKE_FAILURE);
428 SSLerr(SSL_F_SSL2_WRITE,SSL_R_SSL_HANDSHAKE_FAILURE); 403 return (-1);
429 return(-1);
430 }
431 } 404 }
405 }
432 406
433 if (s->error) 407 if (s->error) {
434 {
435 ssl2_write_error(s); 408 ssl2_write_error(s);
436 if (s->error) 409 if (s->error)
437 return(-1); 410 return (-1);
438 } 411 }
439 412
440 errno = 0; 413 errno = 0;
441 s->rwstate=SSL_NOTHING; 414 s->rwstate = SSL_NOTHING;
442 if (len <= 0) return(len); 415 if (len <= 0)
443 416 return (len);
444 tot=s->s2->wnum; 417
445 s->s2->wnum=0; 418 tot = s->s2->wnum;
446 419 s->s2->wnum = 0;
447 n=(len-tot); 420
448 for (;;) 421 n = (len - tot);
449 { 422 for (;;) {
450 i=n_do_ssl_write(s,&(buf[tot]),n); 423 i = n_do_ssl_write(s, &(buf[tot]), n);
451 if (i <= 0) 424 if (i <= 0) {
452 { 425 s->s2->wnum = tot;
453 s->s2->wnum=tot; 426 return (i);
454 return(i); 427 }
455 }
456 if ((i == (int)n) || 428 if ((i == (int)n) ||
457 (s->mode & SSL_MODE_ENABLE_PARTIAL_WRITE)) 429 (s->mode & SSL_MODE_ENABLE_PARTIAL_WRITE)) {
458 { 430 return (tot + i);
459 return(tot+i);
460 }
461
462 n-=i;
463 tot+=i;
464 } 431 }
432
433 n -= i;
434 tot += i;
465 } 435 }
436}
466 437
467static int write_pending(SSL *s, const unsigned char *buf, unsigned int len) 438static int
468 { 439write_pending(SSL *s, const unsigned char *buf, unsigned int len)
440{
469 int i; 441 int i;
470 442
471 /* s->s2->wpend_len != 0 MUST be true. */ 443 /* s->s2->wpend_len != 0 MUST be true. */
@@ -473,122 +445,110 @@ static int write_pending(SSL *s, const unsigned char *buf, unsigned int len)
473 /* check that they have given us the same buffer to 445 /* check that they have given us the same buffer to
474 * write */ 446 * write */
475 if ((s->s2->wpend_tot > (int)len) || 447 if ((s->s2->wpend_tot > (int)len) ||
476 ((s->s2->wpend_buf != buf) && 448 ((s->s2->wpend_buf != buf) &&
477 !(s->mode & SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER))) 449 !(s->mode & SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER))) {
478 { 450 SSLerr(SSL_F_WRITE_PENDING, SSL_R_BAD_WRITE_RETRY);
479 SSLerr(SSL_F_WRITE_PENDING,SSL_R_BAD_WRITE_RETRY); 451 return (-1);
480 return(-1); 452 }
481 }
482 453
483 for (;;) 454 for (;;) {
484 {
485 errno = 0; 455 errno = 0;
486 if (s->wbio != NULL) 456 if (s->wbio != NULL) {
487 { 457 s->rwstate = SSL_WRITING;
488 s->rwstate=SSL_WRITING; 458 i = BIO_write(s->wbio,
489 i=BIO_write(s->wbio, 459 (char *)&(s->s2->write_ptr[s->s2->wpend_off]),
490 (char *)&(s->s2->write_ptr[s->s2->wpend_off]), 460 (unsigned int)s->s2->wpend_len);
491 (unsigned int)s->s2->wpend_len); 461 } else {
492 } 462 SSLerr(SSL_F_WRITE_PENDING, SSL_R_WRITE_BIO_NOT_SET);
493 else 463 i = -1;
494 { 464 }
495 SSLerr(SSL_F_WRITE_PENDING,SSL_R_WRITE_BIO_NOT_SET);
496 i= -1;
497 }
498#ifdef PKT_DEBUG 465#ifdef PKT_DEBUG
499 if (s->debug & 0x01) sleep(1); 466 if (s->debug & 0x01)
467 sleep(1);
500#endif 468#endif
501 if (i == s->s2->wpend_len) 469 if (i == s->s2->wpend_len) {
502 { 470 s->s2->wpend_len = 0;
503 s->s2->wpend_len=0; 471 s->rwstate = SSL_NOTHING;
504 s->rwstate=SSL_NOTHING; 472 return (s->s2->wpend_ret);
505 return(s->s2->wpend_ret); 473 } else if (i <= 0)
506 } 474 return (i);
507 else if (i <= 0) 475 s->s2->wpend_off += i;
508 return(i); 476 s->s2->wpend_len -= i;
509 s->s2->wpend_off+=i;
510 s->s2->wpend_len-=i;
511 }
512 } 477 }
478}
513 479
514static int n_do_ssl_write(SSL *s, const unsigned char *buf, unsigned int len) 480static int
515 { 481n_do_ssl_write(SSL *s, const unsigned char *buf, unsigned int len)
516 unsigned int j,k,olen,p,bs; 482{
483 unsigned int j, k, olen, p, bs;
517 int mac_size; 484 int mac_size;
518 register unsigned char *pp; 485 register unsigned char *pp;
519 486
520 olen=len; 487 olen = len;
521 488
522 /* first check if there is data from an encryption waiting to 489 /* first check if there is data from an encryption waiting to
523 * be sent - it must be sent because the other end is waiting. 490 * be sent - it must be sent because the other end is waiting.
524 * This will happen with non-blocking IO. We print it and then 491 * This will happen with non-blocking IO. We print it and then
525 * return. 492 * return.
526 */ 493 */
527 if (s->s2->wpend_len != 0) return(write_pending(s,buf,len)); 494 if (s->s2->wpend_len != 0)
495 return (write_pending(s, buf, len));
528 496
529 /* set mac_size to mac size */ 497 /* set mac_size to mac size */
530 if (s->s2->clear_text) 498 if (s->s2->clear_text)
531 mac_size=0; 499 mac_size = 0;
532 else 500 else {
533 { 501 mac_size = EVP_MD_CTX_size(s->write_hash);
534 mac_size=EVP_MD_CTX_size(s->write_hash);
535 if (mac_size < 0) 502 if (mac_size < 0)
536 return -1; 503 return -1;
537 } 504 }
538 505
539 /* lets set the pad p */ 506 /* lets set the pad p */
540 if (s->s2->clear_text) 507 if (s->s2->clear_text) {
541 {
542 if (len > SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER) 508 if (len > SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER)
543 len=SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER; 509 len = SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER;
544 p=0; 510 p = 0;
545 s->s2->three_byte_header=0; 511 s->s2->three_byte_header = 0;
546 /* len=len; */ 512 /* len=len; */
547 } 513 } else {
548 else 514 bs = EVP_CIPHER_CTX_block_size(s->enc_read_ctx);
549 { 515 j = len + mac_size;
550 bs=EVP_CIPHER_CTX_block_size(s->enc_read_ctx);
551 j=len+mac_size;
552 /* Two-byte headers allow for a larger record length than 516 /* Two-byte headers allow for a larger record length than
553 * three-byte headers, but we can't use them if we need 517 * three-byte headers, but we can't use them if we need
554 * padding or if we have to set the escape bit. */ 518 * padding or if we have to set the escape bit. */
555 if ((j > SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER) && 519 if ((j > SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER) &&
556 (!s->s2->escape)) 520 (!s->s2->escape)) {
557 {
558 if (j > SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER) 521 if (j > SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER)
559 j=SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER; 522 j = SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER;
560 /* set k to the max number of bytes with 2 523 /* set k to the max number of bytes with 2
561 * byte header */ 524 * byte header */
562 k=j-(j%bs); 525 k = j - (j % bs);
563 /* how many data bytes? */ 526 /* how many data bytes? */
564 len=k-mac_size; 527 len = k - mac_size;
565 s->s2->three_byte_header=0; 528
566 p=0; 529 s->s2->three_byte_header = 0;
567 } 530 p = 0;
568 else if ((bs <= 1) && (!s->s2->escape)) 531 } else if ((bs <= 1) && (!s->s2->escape)) {
569 {
570 /* j <= SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER, thus 532 /* j <= SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER, thus
571 * j < SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER */ 533 * j < SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER */
572 s->s2->three_byte_header=0; 534 s->s2->three_byte_header = 0;
573 p=0; 535 p = 0;
574 } 536 }
575 else /* we may have to use a 3 byte header */ 537 else /* we may have to use a 3 byte header */
576 { 538 {
577 /* If s->s2->escape is not set, then 539 /* If s->s2->escape is not set, then
578 * j <= SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER, and thus 540 * j <= SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER, and thus
579 * j < SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER. */ 541 * j < SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER. */
580 p=(j%bs); 542 p = (j % bs);
581 p=(p == 0)?0:(bs-p); 543 p = (p == 0) ? 0 : (bs - p);
582 if (s->s2->escape) 544 if (s->s2->escape) {
583 { 545 s->s2->three_byte_header = 1;
584 s->s2->three_byte_header=1;
585 if (j > SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER) 546 if (j > SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER)
586 j=SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER; 547 j = SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER;
587 } 548 } else
588 else 549 s->s2->three_byte_header = (p == 0) ? 0 : 1;
589 s->s2->three_byte_header=(p == 0)?0:1;
590 }
591 } 550 }
551 }
592 552
593 /* Now 553 /* Now
594 * j <= SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER 554 * j <= SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER
@@ -601,142 +561,136 @@ static int n_do_ssl_write(SSL *s, const unsigned char *buf, unsigned int len)
601 * p is the number of padding bytes 561 * p is the number of padding bytes
602 * (if it is a two-byte header, then p == 0) */ 562 * (if it is a two-byte header, then p == 0) */
603 563
604 s->s2->wlength=len; 564 s->s2->wlength = len;
605 s->s2->padding=p; 565 s->s2->padding = p;
606 s->s2->mac_data= &(s->s2->wbuf[3]); 566 s->s2->mac_data = &(s->s2->wbuf[3]);
607 s->s2->wact_data= &(s->s2->wbuf[3+mac_size]); 567 s->s2->wact_data = &(s->s2->wbuf[3 + mac_size]);
608 /* we copy the data into s->s2->wbuf */ 568 /* we copy the data into s->s2->wbuf */
609 memcpy(s->s2->wact_data,buf,len); 569 memcpy(s->s2->wact_data, buf, len);
610 if (p) 570 if (p)
611 memset(&(s->s2->wact_data[len]),0,p); /* arbitrary padding */ 571 memset(&(s->s2->wact_data[len]), 0, p); /* arbitrary padding */
612 572
613 if (!s->s2->clear_text) 573 if (!s->s2->clear_text) {
614 { 574 s->s2->wact_data_length = len + p;
615 s->s2->wact_data_length=len+p; 575 ssl2_mac(s, s->s2->mac_data, 1);
616 ssl2_mac(s,s->s2->mac_data,1); 576 s->s2->wlength += p + mac_size;
617 s->s2->wlength+=p+mac_size; 577 ssl2_enc(s, 1);
618 ssl2_enc(s,1); 578 }
619 }
620 579
621 /* package up the header */ 580 /* package up the header */
622 s->s2->wpend_len=s->s2->wlength; 581 s->s2->wpend_len = s->s2->wlength;
623 if (s->s2->three_byte_header) /* 3 byte header */ 582 if (s->s2->three_byte_header) /* 3 byte header */
624 { 583 {
625 pp=s->s2->mac_data; 584 pp = s->s2->mac_data;
626 pp-=3; 585 pp -= 3;
627 pp[0]=(s->s2->wlength>>8)&(THREE_BYTE_MASK>>8); 586 pp[0] = (s->s2->wlength >> 8) & (THREE_BYTE_MASK >> 8);
628 if (s->s2->escape) pp[0]|=SEC_ESC_BIT; 587 if (s->s2->escape)
629 pp[1]=s->s2->wlength&0xff; 588 pp[0]|=SEC_ESC_BIT;
630 pp[2]=s->s2->padding; 589 pp[1] = s->s2->wlength&0xff;
631 s->s2->wpend_len+=3; 590 pp[2] = s->s2->padding;
632 } 591 s->s2->wpend_len += 3;
633 else 592 } else {
634 { 593 pp = s->s2->mac_data;
635 pp=s->s2->mac_data; 594 pp -= 2;
636 pp-=2; 595 pp[0] = ((s->s2->wlength >> 8) & (TWO_BYTE_MASK >> 8)) | TWO_BYTE_BIT;
637 pp[0]=((s->s2->wlength>>8)&(TWO_BYTE_MASK>>8))|TWO_BYTE_BIT; 596 pp[1] = s->s2->wlength&0xff;
638 pp[1]=s->s2->wlength&0xff; 597 s->s2->wpend_len += 2;
639 s->s2->wpend_len+=2; 598 }
640 } 599 s->s2->write_ptr = pp;
641 s->s2->write_ptr=pp; 600
642
643 INC32(s->s2->write_sequence); /* expect next number */ 601 INC32(s->s2->write_sequence); /* expect next number */
644 602
645 /* lets try to actually write the data */ 603 /* lets try to actually write the data */
646 s->s2->wpend_tot=olen; 604 s->s2->wpend_tot = olen;
647 s->s2->wpend_buf=buf; 605 s->s2->wpend_buf = buf;
648 606
649 s->s2->wpend_ret=len; 607 s->s2->wpend_ret = len;
650 608
651 s->s2->wpend_off=0; 609 s->s2->wpend_off = 0;
652 return(write_pending(s,buf,olen)); 610 return (write_pending(s, buf, olen));
653 } 611}
654 612
655int ssl2_part_read(SSL *s, unsigned long f, int i) 613int
656 { 614ssl2_part_read(SSL *s, unsigned long f, int i)
615{
657 unsigned char *p; 616 unsigned char *p;
658 int j; 617 int j;
659 618
660 if (i < 0) 619 if (i < 0) {
661 {
662 /* ssl2_return_error(s); */ 620 /* ssl2_return_error(s); */
663 /* for non-blocking io, 621 /* for non-blocking io,
664 * this is not necessarily fatal */ 622 * this is not necessarily fatal */
665 return(i); 623 return (i);
666 } 624 } else {
667 else 625 s->init_num += i;
668 {
669 s->init_num+=i;
670 626
671 /* Check for error. While there are recoverable errors, 627 /* Check for error. While there are recoverable errors,
672 * this function is not called when those must be expected; 628 * this function is not called when those must be expected;
673 * any error detected here is fatal. */ 629 * any error detected here is fatal. */
674 if (s->init_num >= 3) 630 if (s->init_num >= 3) {
675 { 631 p = (unsigned char *)s->init_buf->data;
676 p=(unsigned char *)s->init_buf->data; 632 if (p[0] == SSL2_MT_ERROR) {
677 if (p[0] == SSL2_MT_ERROR) 633 j = (p[1]<<8)|p[2];
678 { 634 SSLerr((int)f, ssl_mt_error(j));
679 j=(p[1]<<8)|p[2];
680 SSLerr((int)f,ssl_mt_error(j));
681 s->init_num -= 3; 635 s->init_num -= 3;
682 if (s->init_num > 0) 636 if (s->init_num > 0)
683 memmove(p, p+3, s->init_num); 637 memmove(p, p + 3, s->init_num);
684 }
685 } 638 }
639 }
686 640
687 /* If it's not an error message, we have some error anyway -- 641 /* If it's not an error message, we have some error anyway --
688 * the message was shorter than expected. This too is treated 642 * the message was shorter than expected. This too is treated
689 * as fatal (at least if SSL_get_error is asked for its opinion). */ 643 * as fatal (at least if SSL_get_error is asked for its opinion). */
690 return(0); 644 return (0);
691 }
692 } 645 }
646}
693 647
694int ssl2_do_write(SSL *s) 648int
695 { 649ssl2_do_write(SSL *s)
650{
696 int ret; 651 int ret;
697 652
698 ret=ssl2_write(s,&s->init_buf->data[s->init_off],s->init_num); 653 ret = ssl2_write(s, &s->init_buf->data[s->init_off], s->init_num);
699 if (ret == s->init_num) 654 if (ret == s->init_num) {
700 {
701 if (s->msg_callback) 655 if (s->msg_callback)
702 s->msg_callback(1, s->version, 0, s->init_buf->data, (size_t)(s->init_off + s->init_num), s, s->msg_callback_arg); 656 s->msg_callback(1, s->version, 0, s->init_buf->data, (size_t)(s->init_off + s->init_num), s, s->msg_callback_arg);
703 return(1); 657 return (1);
704 }
705 if (ret < 0)
706 return(-1);
707 s->init_off+=ret;
708 s->init_num-=ret;
709 return(0);
710 } 658 }
711 659 if (ret < 0)
712static int ssl_mt_error(int n) 660 return (-1);
713 { 661 s->init_off += ret;
662 s->init_num -= ret;
663 return (0);
664}
665
666static int
667ssl_mt_error(int n)
668{
714 int ret; 669 int ret;
715 670
716 switch (n) 671 switch (n) {
717 {
718 case SSL2_PE_NO_CIPHER: 672 case SSL2_PE_NO_CIPHER:
719 ret=SSL_R_PEER_ERROR_NO_CIPHER; 673 ret = SSL_R_PEER_ERROR_NO_CIPHER;
720 break; 674 break;
721 case SSL2_PE_NO_CERTIFICATE: 675 case SSL2_PE_NO_CERTIFICATE:
722 ret=SSL_R_PEER_ERROR_NO_CERTIFICATE; 676 ret = SSL_R_PEER_ERROR_NO_CERTIFICATE;
723 break; 677 break;
724 case SSL2_PE_BAD_CERTIFICATE: 678 case SSL2_PE_BAD_CERTIFICATE:
725 ret=SSL_R_PEER_ERROR_CERTIFICATE; 679 ret = SSL_R_PEER_ERROR_CERTIFICATE;
726 break; 680 break;
727 case SSL2_PE_UNSUPPORTED_CERTIFICATE_TYPE: 681 case SSL2_PE_UNSUPPORTED_CERTIFICATE_TYPE:
728 ret=SSL_R_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE; 682 ret = SSL_R_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE;
729 break; 683 break;
730 default: 684 default:
731 ret=SSL_R_UNKNOWN_REMOTE_ERROR_TYPE; 685 ret = SSL_R_UNKNOWN_REMOTE_ERROR_TYPE;
732 break; 686 break;
733 }
734 return(ret);
735 } 687 }
688 return (ret);
689}
736#else /* !OPENSSL_NO_SSL2 */ 690#else /* !OPENSSL_NO_SSL2 */
737 691
738# if PEDANTIC 692# if PEDANTIC
739static void *dummy=&dummy; 693static void *dummy = &dummy;
740# endif 694# endif
741 695
742#endif 696#endif
diff --git a/src/lib/libssl/src/ssl/s2_srvr.c b/src/lib/libssl/src/ssl/s2_srvr.c
index cac405db7c..aa63fe85ba 100644
--- a/src/lib/libssl/src/ssl/s2_srvr.c
+++ b/src/lib/libssl/src/ssl/s2_srvr.c
@@ -120,174 +120,181 @@
120static const SSL_METHOD *ssl2_get_server_method(int ver); 120static const SSL_METHOD *ssl2_get_server_method(int ver);
121static int get_client_master_key(SSL *s); 121static int get_client_master_key(SSL *s);
122static int get_client_hello(SSL *s); 122static int get_client_hello(SSL *s);
123static int server_hello(SSL *s); 123static int server_hello(SSL *s);
124
124static int get_client_finished(SSL *s); 125static int get_client_finished(SSL *s);
125static int server_verify(SSL *s); 126static int server_verify(SSL *s);
126static int server_finish(SSL *s); 127static int server_finish(SSL *s);
127static int request_certificate(SSL *s); 128static int request_certificate(SSL *s);
128static int ssl_rsa_private_decrypt(CERT *c, int len, unsigned char *from, 129static int
129 unsigned char *to,int padding); 130ssl_rsa_private_decrypt(CERT *c, int len, unsigned char *from,
131unsigned char *to, int padding);
130#define BREAK break 132#define BREAK break
131 133
132static const SSL_METHOD *ssl2_get_server_method(int ver) 134static const SSL_METHOD
133 { 135*ssl2_get_server_method(int ver)
136{
134 if (ver == SSL2_VERSION) 137 if (ver == SSL2_VERSION)
135 return(SSLv2_server_method()); 138 return (SSLv2_server_method());
136 else 139 else
137 return(NULL); 140 return (NULL);
138 } 141}
139 142
140IMPLEMENT_ssl2_meth_func(SSLv2_server_method, 143IMPLEMENT_ssl2_meth_func(SSLv2_server_method,
141 ssl2_accept, 144 ssl2_accept, ssl_undefined_function, ssl2_get_server_method)
142 ssl_undefined_function, 145
143 ssl2_get_server_method) 146int
144 147ssl2_accept(SSL *s)
145int ssl2_accept(SSL *s) 148{
146 { 149 unsigned long l = (unsigned long)time(NULL);
147 unsigned long l=(unsigned long)time(NULL); 150 BUF_MEM *buf = NULL;
148 BUF_MEM *buf=NULL; 151 int ret = -1;
149 int ret= -1;
150 long num1; 152 long num1;
151 void (*cb)(const SSL *ssl,int type,int val)=NULL; 153 void (*cb)(const SSL *ssl, int type, int val) = NULL;
152 int new_state,state; 154 int new_state, state;
153 155
154 RAND_add(&l,sizeof(l),0); 156 RAND_add(&l, sizeof(l), 0);
155 ERR_clear_error(); 157 ERR_clear_error();
156 errno = 0; 158 errno = 0;
157 159
158 if (s->info_callback != NULL) 160 if (s->info_callback != NULL)
159 cb=s->info_callback; 161 cb = s->info_callback;
160 else if (s->ctx->info_callback != NULL) 162 else if (s->ctx->info_callback != NULL)
161 cb=s->ctx->info_callback; 163 cb = s->ctx->info_callback;
162 164
163 /* init things to blank */ 165 /* init things to blank */
164 s->in_handshake++; 166 s->in_handshake++;
165 if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s); 167 if (!SSL_in_init(s) || SSL_in_before(s))
168 SSL_clear(s);
166 169
167 if (s->cert == NULL) 170 if (s->cert == NULL) {
168 { 171 SSLerr(SSL_F_SSL2_ACCEPT, SSL_R_NO_CERTIFICATE_SET);
169 SSLerr(SSL_F_SSL2_ACCEPT,SSL_R_NO_CERTIFICATE_SET); 172 return (-1);
170 return(-1); 173 }
171 }
172 174
173 errno = 0; 175 errno = 0;
174 for (;;) 176 for (;;) {
175 { 177 state = s->state;
176 state=s->state;
177 178
178 switch (s->state) 179 switch (s->state) {
179 {
180 case SSL_ST_BEFORE: 180 case SSL_ST_BEFORE:
181 case SSL_ST_ACCEPT: 181 case SSL_ST_ACCEPT:
182 case SSL_ST_BEFORE|SSL_ST_ACCEPT: 182 case SSL_ST_BEFORE|SSL_ST_ACCEPT:
183 case SSL_ST_OK|SSL_ST_ACCEPT: 183 case SSL_ST_OK|SSL_ST_ACCEPT:
184 184
185 s->server=1; 185 s->server = 1;
186 if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1); 186 if (cb != NULL)
187 cb(s, SSL_CB_HANDSHAKE_START, 1);
187 188
188 s->version=SSL2_VERSION; 189 s->version = SSL2_VERSION;
189 s->type=SSL_ST_ACCEPT; 190 s->type = SSL_ST_ACCEPT;
190 191
191 buf=s->init_buf; 192 buf = s->init_buf;
192 if ((buf == NULL) && ((buf=BUF_MEM_new()) == NULL)) 193 if ((buf == NULL) && ((buf = BUF_MEM_new()) == NULL)) {
193 { ret= -1; goto end; } 194 ret = -1;
194 if (!BUF_MEM_grow(buf,(int) 195 goto end;
195 SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER)) 196 }
196 { ret= -1; goto end; } 197 if (!BUF_MEM_grow(buf,
197 s->init_buf=buf; 198 (int)SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER)) {
198 s->init_num=0; 199 ret = -1;
200 goto end;
201 }
202 s->init_buf = buf;
203 s->init_num = 0;
199 s->ctx->stats.sess_accept++; 204 s->ctx->stats.sess_accept++;
200 s->handshake_func=ssl2_accept; 205 s->handshake_func = ssl2_accept;
201 s->state=SSL2_ST_GET_CLIENT_HELLO_A; 206 s->state = SSL2_ST_GET_CLIENT_HELLO_A;
202 BREAK; 207 BREAK;
203 208
204 case SSL2_ST_GET_CLIENT_HELLO_A: 209 case SSL2_ST_GET_CLIENT_HELLO_A:
205 case SSL2_ST_GET_CLIENT_HELLO_B: 210 case SSL2_ST_GET_CLIENT_HELLO_B:
206 case SSL2_ST_GET_CLIENT_HELLO_C: 211 case SSL2_ST_GET_CLIENT_HELLO_C:
207 s->shutdown=0; 212 s->shutdown = 0;
208 ret=get_client_hello(s); 213 ret = get_client_hello(s);
209 if (ret <= 0) goto end; 214 if (ret <= 0)
210 s->init_num=0; 215 goto end;
211 s->state=SSL2_ST_SEND_SERVER_HELLO_A; 216 s->init_num = 0;
217 s->state = SSL2_ST_SEND_SERVER_HELLO_A;
212 BREAK; 218 BREAK;
213 219
214 case SSL2_ST_SEND_SERVER_HELLO_A: 220 case SSL2_ST_SEND_SERVER_HELLO_A:
215 case SSL2_ST_SEND_SERVER_HELLO_B: 221 case SSL2_ST_SEND_SERVER_HELLO_B:
216 ret=server_hello(s); 222 ret = server_hello(s);
217 if (ret <= 0) goto end; 223 if (ret <= 0)
218 s->init_num=0; 224 goto end;
219 if (!s->hit) 225 s->init_num = 0;
220 { 226 if (!s->hit) {
221 s->state=SSL2_ST_GET_CLIENT_MASTER_KEY_A; 227 s->state = SSL2_ST_GET_CLIENT_MASTER_KEY_A;
222 BREAK; 228 BREAK;
223 } 229 } else {
224 else 230 s->state = SSL2_ST_SERVER_START_ENCRYPTION;
225 {
226 s->state=SSL2_ST_SERVER_START_ENCRYPTION;
227 BREAK; 231 BREAK;
228 } 232 }
229 case SSL2_ST_GET_CLIENT_MASTER_KEY_A: 233 case SSL2_ST_GET_CLIENT_MASTER_KEY_A:
230 case SSL2_ST_GET_CLIENT_MASTER_KEY_B: 234 case SSL2_ST_GET_CLIENT_MASTER_KEY_B:
231 ret=get_client_master_key(s); 235 ret = get_client_master_key(s);
232 if (ret <= 0) goto end; 236 if (ret <= 0)
233 s->init_num=0; 237 goto end;
234 s->state=SSL2_ST_SERVER_START_ENCRYPTION; 238 s->init_num = 0;
239 s->state = SSL2_ST_SERVER_START_ENCRYPTION;
235 BREAK; 240 BREAK;
236 241
237 case SSL2_ST_SERVER_START_ENCRYPTION: 242 case SSL2_ST_SERVER_START_ENCRYPTION:
238 /* Ok we how have sent all the stuff needed to 243 /* Ok we how have sent all the stuff needed to
239 * start encrypting, the next packet back will 244 * start encrypting, the next packet back will
240 * be encrypted. */ 245 * be encrypted. */
241 if (!ssl2_enc_init(s,0)) 246 if (!ssl2_enc_init(s, 0)) {
242 { ret= -1; goto end; } 247 ret = -1;
243 s->s2->clear_text=0; 248 goto end;
244 s->state=SSL2_ST_SEND_SERVER_VERIFY_A; 249 }
250 s->s2->clear_text = 0;
251 s->state = SSL2_ST_SEND_SERVER_VERIFY_A;
245 BREAK; 252 BREAK;
246 253
247 case SSL2_ST_SEND_SERVER_VERIFY_A: 254 case SSL2_ST_SEND_SERVER_VERIFY_A:
248 case SSL2_ST_SEND_SERVER_VERIFY_B: 255 case SSL2_ST_SEND_SERVER_VERIFY_B:
249 ret=server_verify(s); 256 ret = server_verify(s);
250 if (ret <= 0) goto end; 257 if (ret <= 0)
251 s->init_num=0; 258 goto end;
252 if (s->hit) 259 s->init_num = 0;
253 { 260 if (s->hit) {
254 /* If we are in here, we have been 261 /* If we are in here, we have been
255 * buffering the output, so we need to 262 * buffering the output, so we need to
256 * flush it and remove buffering from 263 * flush it and remove buffering from
257 * future traffic */ 264 * future traffic */
258 s->state=SSL2_ST_SEND_SERVER_VERIFY_C; 265 s->state = SSL2_ST_SEND_SERVER_VERIFY_C;
259 BREAK; 266 BREAK;
260 } 267 } else {
261 else 268 s->state = SSL2_ST_GET_CLIENT_FINISHED_A;
262 {
263 s->state=SSL2_ST_GET_CLIENT_FINISHED_A;
264 break; 269 break;
265 } 270 }
266 271
267 case SSL2_ST_SEND_SERVER_VERIFY_C: 272 case SSL2_ST_SEND_SERVER_VERIFY_C:
268 /* get the number of bytes to write */ 273 /* get the number of bytes to write */
269 num1=BIO_ctrl(s->wbio,BIO_CTRL_INFO,0,NULL); 274 num1 = BIO_ctrl(s->wbio, BIO_CTRL_INFO, 0, NULL);
270 if (num1 > 0) 275 if (num1 > 0) {
271 { 276 s->rwstate = SSL_WRITING;
272 s->rwstate=SSL_WRITING; 277 num1 = BIO_flush(s->wbio);
273 num1=BIO_flush(s->wbio); 278 if (num1 <= 0) {
274 if (num1 <= 0) { ret= -1; goto end; } 279 ret = -1;
275 s->rwstate=SSL_NOTHING; 280 goto end;
276 } 281 }
282 s->rwstate = SSL_NOTHING;
283 }
277 284
278 /* flushed and now remove buffering */ 285 /* flushed and now remove buffering */
279 s->wbio=BIO_pop(s->wbio); 286 s->wbio = BIO_pop(s->wbio);
280 287
281 s->state=SSL2_ST_GET_CLIENT_FINISHED_A; 288 s->state = SSL2_ST_GET_CLIENT_FINISHED_A;
282 BREAK; 289 BREAK;
283 290
284 case SSL2_ST_GET_CLIENT_FINISHED_A: 291 case SSL2_ST_GET_CLIENT_FINISHED_A:
285 case SSL2_ST_GET_CLIENT_FINISHED_B: 292 case SSL2_ST_GET_CLIENT_FINISHED_B:
286 ret=get_client_finished(s); 293 ret = get_client_finished(s);
287 if (ret <= 0) 294 if (ret <= 0)
288 goto end; 295 goto end;
289 s->init_num=0; 296 s->init_num = 0;
290 s->state=SSL2_ST_SEND_REQUEST_CERTIFICATE_A; 297 s->state = SSL2_ST_SEND_REQUEST_CERTIFICATE_A;
291 BREAK; 298 BREAK;
292 299
293 case SSL2_ST_SEND_REQUEST_CERTIFICATE_A: 300 case SSL2_ST_SEND_REQUEST_CERTIFICATE_A:
@@ -298,229 +305,216 @@ int ssl2_accept(SSL *s)
298 * don't want to, or we already have one, and 305 * don't want to, or we already have one, and
299 * we only want to do it once. */ 306 * we only want to do it once. */
300 if (!(s->verify_mode & SSL_VERIFY_PEER) || 307 if (!(s->verify_mode & SSL_VERIFY_PEER) ||
301 ((s->session->peer != NULL) && 308 ((s->session->peer != NULL) &&
302 (s->verify_mode & SSL_VERIFY_CLIENT_ONCE))) 309 (s->verify_mode & SSL_VERIFY_CLIENT_ONCE))) {
303 { 310 s->state = SSL2_ST_SEND_SERVER_FINISHED_A;
304 s->state=SSL2_ST_SEND_SERVER_FINISHED_A;
305 break; 311 break;
306 } 312 } else {
307 else 313 ret = request_certificate(s);
308 { 314 if (ret <= 0)
309 ret=request_certificate(s); 315 goto end;
310 if (ret <= 0) goto end; 316 s->init_num = 0;
311 s->init_num=0; 317 s->state = SSL2_ST_SEND_SERVER_FINISHED_A;
312 s->state=SSL2_ST_SEND_SERVER_FINISHED_A; 318 }
313 }
314 BREAK; 319 BREAK;
315 320
316 case SSL2_ST_SEND_SERVER_FINISHED_A: 321 case SSL2_ST_SEND_SERVER_FINISHED_A:
317 case SSL2_ST_SEND_SERVER_FINISHED_B: 322 case SSL2_ST_SEND_SERVER_FINISHED_B:
318 ret=server_finish(s); 323 ret = server_finish(s);
319 if (ret <= 0) goto end; 324 if (ret <= 0)
320 s->init_num=0; 325 goto end;
321 s->state=SSL_ST_OK; 326 s->init_num = 0;
327 s->state = SSL_ST_OK;
322 break; 328 break;
323 329
324 case SSL_ST_OK: 330 case SSL_ST_OK:
325 BUF_MEM_free(s->init_buf); 331 BUF_MEM_free(s->init_buf);
326 ssl_free_wbio_buffer(s); 332 ssl_free_wbio_buffer(s);
327 s->init_buf=NULL; 333 s->init_buf = NULL;
328 s->init_num=0; 334 s->init_num = 0;
329 /* ERR_clear_error();*/ 335 /* ERR_clear_error();*/
330 336
331 ssl_update_cache(s,SSL_SESS_CACHE_SERVER); 337 ssl_update_cache(s, SSL_SESS_CACHE_SERVER);
332 338
333 s->ctx->stats.sess_accept_good++; 339 s->ctx->stats.sess_accept_good++;
334 /* s->server=1; */ 340 /* s->server=1; */
335 ret=1; 341 ret = 1;
336 342
337 if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_DONE,1); 343 if (cb != NULL)
344 cb(s, SSL_CB_HANDSHAKE_DONE, 1);
338 345
339 goto end; 346 goto end;
340 /* BREAK; */ 347 /* BREAK; */
341 348
342 default: 349 default:
343 SSLerr(SSL_F_SSL2_ACCEPT,SSL_R_UNKNOWN_STATE); 350 SSLerr(SSL_F_SSL2_ACCEPT, SSL_R_UNKNOWN_STATE);
344 ret= -1; 351 ret = -1;
345 goto end; 352 goto end;
346 /* BREAK; */ 353 /* BREAK; */
347 }
348
349 if ((cb != NULL) && (s->state != state))
350 {
351 new_state=s->state;
352 s->state=state;
353 cb(s,SSL_CB_ACCEPT_LOOP,1);
354 s->state=new_state;
355 }
356 } 354 }
355
356 if ((cb != NULL) && (s->state != state)) {
357 new_state = s->state;
358 s->state = state;
359 cb(s, SSL_CB_ACCEPT_LOOP, 1);
360 s->state = new_state;
361 }
362 }
357end: 363end:
358 s->in_handshake--; 364 s->in_handshake--;
359 if (cb != NULL) 365 if (cb != NULL)
360 cb(s,SSL_CB_ACCEPT_EXIT,ret); 366 cb(s, SSL_CB_ACCEPT_EXIT, ret);
361 return(ret); 367 return (ret);
362 } 368}
363 369
364static int get_client_master_key(SSL *s) 370static int
365 { 371get_client_master_key(SSL *s)
366 int is_export,i,n,keya,ek; 372{
373 int is_export, i, n, keya, ek;
367 unsigned long len; 374 unsigned long len;
368 unsigned char *p; 375 unsigned char *p;
369 const SSL_CIPHER *cp; 376 const SSL_CIPHER *cp;
370 const EVP_CIPHER *c; 377 const EVP_CIPHER *c;
371 const EVP_MD *md; 378 const EVP_MD *md;
372 379
373 p=(unsigned char *)s->init_buf->data; 380 p = (unsigned char *)s->init_buf->data;
374 if (s->state == SSL2_ST_GET_CLIENT_MASTER_KEY_A) 381 if (s->state == SSL2_ST_GET_CLIENT_MASTER_KEY_A) {
375 { 382 i = ssl2_read(s,(char *)&(p[s->init_num]), 10 - s->init_num);
376 i=ssl2_read(s,(char *)&(p[s->init_num]),10-s->init_num);
377 383
378 if (i < (10-s->init_num)) 384 if (i < (10 - s->init_num))
379 return(ssl2_part_read(s,SSL_F_GET_CLIENT_MASTER_KEY,i)); 385 return (ssl2_part_read(s, SSL_F_GET_CLIENT_MASTER_KEY, i));
380 s->init_num = 10; 386 s->init_num = 10;
381 387
382 if (*(p++) != SSL2_MT_CLIENT_MASTER_KEY) 388 if (*(p++) != SSL2_MT_CLIENT_MASTER_KEY) {
383 { 389 if (p[-1] != SSL2_MT_ERROR) {
384 if (p[-1] != SSL2_MT_ERROR) 390 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
385 { 391 SSLerr(SSL_F_GET_CLIENT_MASTER_KEY, SSL_R_READ_WRONG_PACKET_TYPE);
386 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR); 392 } else
387 SSLerr(SSL_F_GET_CLIENT_MASTER_KEY,SSL_R_READ_WRONG_PACKET_TYPE);
388 }
389 else
390 SSLerr(SSL_F_GET_CLIENT_MASTER_KEY, SSL_R_PEER_ERROR); 393 SSLerr(SSL_F_GET_CLIENT_MASTER_KEY, SSL_R_PEER_ERROR);
391 return(-1); 394 return (-1);
392 } 395 }
393 396
394 cp=ssl2_get_cipher_by_char(p); 397 cp = ssl2_get_cipher_by_char(p);
395 if (cp == NULL) 398 if (cp == NULL) {
396 { 399 ssl2_return_error(s, SSL2_PE_NO_CIPHER);
397 ssl2_return_error(s,SSL2_PE_NO_CIPHER);
398 SSLerr(SSL_F_GET_CLIENT_MASTER_KEY, SSL_R_NO_CIPHER_MATCH); 400 SSLerr(SSL_F_GET_CLIENT_MASTER_KEY, SSL_R_NO_CIPHER_MATCH);
399 return(-1); 401 return (-1);
400 } 402 }
401 s->session->cipher= cp; 403 s->session->cipher = cp;
402 404
403 p+=3; 405 p += 3;
404 n2s(p,i); s->s2->tmp.clear=i; 406 n2s(p, i);
405 n2s(p,i); s->s2->tmp.enc=i; 407 s->s2->tmp.clear = i;
406 n2s(p,i); 408 n2s(p, i);
407 if(i > SSL_MAX_KEY_ARG_LENGTH) 409 s->s2->tmp.enc = i;
408 { 410 n2s(p, i);
409 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR); 411 if (i > SSL_MAX_KEY_ARG_LENGTH) {
412 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
410 SSLerr(SSL_F_GET_CLIENT_MASTER_KEY, SSL_R_KEY_ARG_TOO_LONG); 413 SSLerr(SSL_F_GET_CLIENT_MASTER_KEY, SSL_R_KEY_ARG_TOO_LONG);
411 return -1; 414 return -1;
412 }
413 s->session->key_arg_length=i;
414 s->state=SSL2_ST_GET_CLIENT_MASTER_KEY_B;
415 } 415 }
416 s->session->key_arg_length = i;
417 s->state = SSL2_ST_GET_CLIENT_MASTER_KEY_B;
418 }
416 419
417 /* SSL2_ST_GET_CLIENT_MASTER_KEY_B */ 420 /* SSL2_ST_GET_CLIENT_MASTER_KEY_B */
418 p=(unsigned char *)s->init_buf->data; 421 p = (unsigned char *)s->init_buf->data;
419 if (s->init_buf->length < SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER) 422 if (s->init_buf->length < SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER) {
420 { 423 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
421 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
422 SSLerr(SSL_F_GET_CLIENT_MASTER_KEY, ERR_R_INTERNAL_ERROR); 424 SSLerr(SSL_F_GET_CLIENT_MASTER_KEY, ERR_R_INTERNAL_ERROR);
423 return -1; 425 return -1;
424 } 426 }
425 keya=s->session->key_arg_length; 427 keya = s->session->key_arg_length;
426 len = 10 + (unsigned long)s->s2->tmp.clear + (unsigned long)s->s2->tmp.enc + (unsigned long)keya; 428 len = 10 + (unsigned long)s->s2->tmp.clear + (unsigned long)s->s2->tmp.enc + (unsigned long)keya;
427 if (len > SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER) 429 if (len > SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER) {
428 { 430 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
429 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR); 431 SSLerr(SSL_F_GET_CLIENT_MASTER_KEY, SSL_R_MESSAGE_TOO_LONG);
430 SSLerr(SSL_F_GET_CLIENT_MASTER_KEY,SSL_R_MESSAGE_TOO_LONG);
431 return -1; 432 return -1;
432 } 433 }
433 n = (int)len - s->init_num; 434 n = (int)len - s->init_num;
434 i = ssl2_read(s,(char *)&(p[s->init_num]),n); 435 i = ssl2_read(s,(char *)&(p[s->init_num]), n);
435 if (i != n) return(ssl2_part_read(s,SSL_F_GET_CLIENT_MASTER_KEY,i)); 436 if (i != n)
437 return (ssl2_part_read(s, SSL_F_GET_CLIENT_MASTER_KEY, i));
436 if (s->msg_callback) 438 if (s->msg_callback)
437 s->msg_callback(0, s->version, 0, p, (size_t)len, s, s->msg_callback_arg); /* CLIENT-MASTER-KEY */ 439 s->msg_callback(0, s->version, 0, p, (size_t)len, s, s->msg_callback_arg); /* CLIENT-MASTER-KEY */
438 p += 10; 440 p += 10;
439 441
440 memcpy(s->session->key_arg,&(p[s->s2->tmp.clear+s->s2->tmp.enc]), 442 memcpy(s->session->key_arg, &(p[s->s2->tmp.clear + s->s2->tmp.enc]),
441 (unsigned int)keya); 443 (unsigned int)keya);
442 444
443 if (s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL) 445 if (s->cert->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL) {
444 { 446 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
445 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR); 447 SSLerr(SSL_F_GET_CLIENT_MASTER_KEY, SSL_R_NO_PRIVATEKEY);
446 SSLerr(SSL_F_GET_CLIENT_MASTER_KEY,SSL_R_NO_PRIVATEKEY); 448 return (-1);
447 return(-1); 449 }
448 } 450 i = ssl_rsa_private_decrypt(s->cert, s->s2->tmp.enc,
449 i=ssl_rsa_private_decrypt(s->cert,s->s2->tmp.enc, 451 &(p[s->s2->tmp.clear]), &(p[s->s2->tmp.clear]),
450 &(p[s->s2->tmp.clear]),&(p[s->s2->tmp.clear]), 452 (s->s2->ssl2_rollback) ? RSA_SSLV23_PADDING : RSA_PKCS1_PADDING);
451 (s->s2->ssl2_rollback)?RSA_SSLV23_PADDING:RSA_PKCS1_PADDING);
452 453
453 is_export=SSL_C_IS_EXPORT(s->session->cipher); 454 is_export = SSL_C_IS_EXPORT(s->session->cipher);
454
455 if (!ssl_cipher_get_evp(s->session,&c,&md,NULL,NULL,NULL))
456 {
457 ssl2_return_error(s,SSL2_PE_NO_CIPHER);
458 SSLerr(SSL_F_GET_CLIENT_MASTER_KEY,SSL_R_PROBLEMS_MAPPING_CIPHER_FUNCTIONS);
459 return(0);
460 }
461 455
462 if (s->session->cipher->algorithm2 & SSL2_CF_8_BYTE_ENC) 456 if (!ssl_cipher_get_evp(s->session, &c, &md, NULL, NULL, NULL)) {
463 { 457 ssl2_return_error(s, SSL2_PE_NO_CIPHER);
464 is_export=1; 458 SSLerr(SSL_F_GET_CLIENT_MASTER_KEY, SSL_R_PROBLEMS_MAPPING_CIPHER_FUNCTIONS);
465 ek=8; 459 return (0);
466 } 460 }
467 else 461
468 ek=5; 462 if (s->session->cipher->algorithm2 & SSL2_CF_8_BYTE_ENC) {
463 is_export = 1;
464 ek = 8;
465 } else
466 ek = 5;
469 467
470 /* bad decrypt */ 468 /* bad decrypt */
471#if 1 469#if 1
472 /* If a bad decrypt, continue with protocol but with a 470 /* If a bad decrypt, continue with protocol but with a
473 * random master secret (Bleichenbacher attack) */ 471 * random master secret (Bleichenbacher attack) */
474 if ((i < 0) || 472 if ((i < 0) || ((!is_export && (i != EVP_CIPHER_key_length(c))) ||
475 ((!is_export && (i != EVP_CIPHER_key_length(c))) 473 (is_export && ((i != ek) || (s->s2->tmp.clear + (unsigned int)i !=
476 || (is_export && ((i != ek) || (s->s2->tmp.clear+(unsigned int)i != 474 (unsigned int)EVP_CIPHER_key_length(c)))))) {
477 (unsigned int)EVP_CIPHER_key_length(c))))))
478 {
479 ERR_clear_error(); 475 ERR_clear_error();
480 if (is_export) 476 if (is_export)
481 i=ek; 477 i = ek;
482 else 478 else
483 i=EVP_CIPHER_key_length(c); 479 i = EVP_CIPHER_key_length(c);
484 if (RAND_pseudo_bytes(p,i) <= 0) 480 if (RAND_pseudo_bytes(p, i) <= 0)
485 return 0; 481 return 0;
486 } 482 }
487#else 483#else
488 if (i < 0) 484 if (i < 0) {
489 { 485 error = 1;
490 error=1; 486 SSLerr(SSL_F_GET_CLIENT_MASTER_KEY, SSL_R_BAD_RSA_DECRYPT);
491 SSLerr(SSL_F_GET_CLIENT_MASTER_KEY,SSL_R_BAD_RSA_DECRYPT); 487 }
492 }
493 /* incorrect number of key bytes for non export cipher */ 488 /* incorrect number of key bytes for non export cipher */
494 else if ((!is_export && (i != EVP_CIPHER_key_length(c))) 489 else if ((!is_export && (i != EVP_CIPHER_key_length(c))) ||
495 || (is_export && ((i != ek) || (s->s2->tmp.clear+i != 490 (is_export && ((i != ek) || (s->s2->tmp.clear + i !=
496 EVP_CIPHER_key_length(c))))) 491 EVP_CIPHER_key_length(c))))) {
497 { 492 error = 1;
498 error=1; 493 SSLerr(SSL_F_GET_CLIENT_MASTER_KEY, SSL_R_WRONG_NUMBER_OF_KEY_BITS);
499 SSLerr(SSL_F_GET_CLIENT_MASTER_KEY,SSL_R_WRONG_NUMBER_OF_KEY_BITS); 494 }
500 } 495 if (error) {
501 if (error) 496 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
502 { 497 return (-1);
503 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR); 498 }
504 return(-1);
505 }
506#endif 499#endif
507 500
508 if (is_export) i+=s->s2->tmp.clear; 501 if (is_export)
502 i += s->s2->tmp.clear;
509 503
510 if (i > SSL_MAX_MASTER_KEY_LENGTH) 504 if (i > SSL_MAX_MASTER_KEY_LENGTH) {
511 { 505 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
512 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
513 SSLerr(SSL_F_GET_CLIENT_MASTER_KEY, ERR_R_INTERNAL_ERROR); 506 SSLerr(SSL_F_GET_CLIENT_MASTER_KEY, ERR_R_INTERNAL_ERROR);
514 return -1; 507 return -1;
515 }
516 s->session->master_key_length=i;
517 memcpy(s->session->master_key,p,(unsigned int)i);
518 return(1);
519 } 508 }
520 509 s->session->master_key_length = i;
521static int get_client_hello(SSL *s) 510 memcpy(s->session->master_key, p,(unsigned int)i);
522 { 511 return (1);
523 int i,n; 512}
513
514static int
515get_client_hello(SSL *s)
516{
517 int i, n;
524 unsigned long len; 518 unsigned long len;
525 unsigned char *p; 519 unsigned char *p;
526 STACK_OF(SSL_CIPHER) *cs; /* a stack of SSL_CIPHERS */ 520 STACK_OF(SSL_CIPHER) *cs; /* a stack of SSL_CIPHERS */
@@ -530,58 +524,56 @@ static int get_client_hello(SSL *s)
530 524
531 /* This is a bit of a hack to check for the correct packet 525 /* This is a bit of a hack to check for the correct packet
532 * type the first time round. */ 526 * type the first time round. */
533 if (s->state == SSL2_ST_GET_CLIENT_HELLO_A) 527 if (s->state == SSL2_ST_GET_CLIENT_HELLO_A) {
534 { 528 s->first_packet = 1;
535 s->first_packet=1; 529 s->state = SSL2_ST_GET_CLIENT_HELLO_B;
536 s->state=SSL2_ST_GET_CLIENT_HELLO_B; 530 }
537 }
538 531
539 p=(unsigned char *)s->init_buf->data; 532 p = (unsigned char *)s->init_buf->data;
540 if (s->state == SSL2_ST_GET_CLIENT_HELLO_B) 533 if (s->state == SSL2_ST_GET_CLIENT_HELLO_B) {
541 { 534 i = ssl2_read(s,(char *)&(p[s->init_num]), 9 - s->init_num);
542 i=ssl2_read(s,(char *)&(p[s->init_num]),9-s->init_num); 535 if (i < (9 - s->init_num))
543 if (i < (9-s->init_num)) 536 return (ssl2_part_read(s, SSL_F_GET_CLIENT_HELLO, i));
544 return(ssl2_part_read(s,SSL_F_GET_CLIENT_HELLO,i));
545 s->init_num = 9; 537 s->init_num = 9;
546 538
547 if (*(p++) != SSL2_MT_CLIENT_HELLO) 539 if (*(p++) != SSL2_MT_CLIENT_HELLO) {
548 { 540 if (p[-1] != SSL2_MT_ERROR) {
549 if (p[-1] != SSL2_MT_ERROR) 541 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
550 { 542 SSLerr(SSL_F_GET_CLIENT_HELLO, SSL_R_READ_WRONG_PACKET_TYPE);
551 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR); 543 } else
552 SSLerr(SSL_F_GET_CLIENT_HELLO,SSL_R_READ_WRONG_PACKET_TYPE); 544 SSLerr(SSL_F_GET_CLIENT_HELLO, SSL_R_PEER_ERROR);
553 } 545 return (-1);
554 else 546 }
555 SSLerr(SSL_F_GET_CLIENT_HELLO,SSL_R_PEER_ERROR); 547 n2s(p, i);
556 return(-1); 548 if (i < s->version)
557 } 549 s->version = i;
558 n2s(p,i); 550 n2s(p, i);
559 if (i < s->version) s->version=i; 551 s->s2->tmp.cipher_spec_length = i;
560 n2s(p,i); s->s2->tmp.cipher_spec_length=i; 552 n2s(p, i);
561 n2s(p,i); s->s2->tmp.session_id_length=i; 553 s->s2->tmp.session_id_length = i;
562 n2s(p,i); s->s2->challenge_length=i; 554 n2s(p, i);
563 if ( (i < SSL2_MIN_CHALLENGE_LENGTH) || 555 s->s2->challenge_length = i;
564 (i > SSL2_MAX_CHALLENGE_LENGTH)) 556 if ((i < SSL2_MIN_CHALLENGE_LENGTH) ||
565 { 557 (i > SSL2_MAX_CHALLENGE_LENGTH)) {
566 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR); 558 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
567 SSLerr(SSL_F_GET_CLIENT_HELLO,SSL_R_INVALID_CHALLENGE_LENGTH); 559 SSLerr(SSL_F_GET_CLIENT_HELLO, SSL_R_INVALID_CHALLENGE_LENGTH);
568 return(-1); 560 return (-1);
569 }
570 s->state=SSL2_ST_GET_CLIENT_HELLO_C;
571 } 561 }
562 s->state = SSL2_ST_GET_CLIENT_HELLO_C;
563 }
572 564
573 /* SSL2_ST_GET_CLIENT_HELLO_C */ 565 /* SSL2_ST_GET_CLIENT_HELLO_C */
574 p=(unsigned char *)s->init_buf->data; 566 p = (unsigned char *)s->init_buf->data;
575 len = 9 + (unsigned long)s->s2->tmp.cipher_spec_length + (unsigned long)s->s2->challenge_length + (unsigned long)s->s2->tmp.session_id_length; 567 len = 9 + (unsigned long)s->s2->tmp.cipher_spec_length + (unsigned long)s->s2->challenge_length + (unsigned long)s->s2->tmp.session_id_length;
576 if (len > SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER) 568 if (len > SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER) {
577 { 569 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
578 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR); 570 SSLerr(SSL_F_GET_CLIENT_HELLO, SSL_R_MESSAGE_TOO_LONG);
579 SSLerr(SSL_F_GET_CLIENT_HELLO,SSL_R_MESSAGE_TOO_LONG);
580 return -1; 571 return -1;
581 } 572 }
582 n = (int)len - s->init_num; 573 n = (int)len - s->init_num;
583 i = ssl2_read(s,(char *)&(p[s->init_num]),n); 574 i = ssl2_read(s,(char *)&(p[s->init_num]), n);
584 if (i != n) return(ssl2_part_read(s,SSL_F_GET_CLIENT_HELLO,i)); 575 if (i != n)
576 return (ssl2_part_read(s, SSL_F_GET_CLIENT_HELLO, i));
585 if (s->msg_callback) 577 if (s->msg_callback)
586 s->msg_callback(0, s->version, 0, p, (size_t)len, s, s->msg_callback_arg); /* CLIENT-HELLO */ 578 s->msg_callback(0, s->version, 0, p, (size_t)len, s, s->msg_callback_arg); /* CLIENT-HELLO */
587 p += 9; 579 p += 9;
@@ -589,138 +581,120 @@ static int get_client_hello(SSL *s)
589 /* get session-id before cipher stuff so we can get out session 581 /* get session-id before cipher stuff so we can get out session
590 * structure if it is cached */ 582 * structure if it is cached */
591 /* session-id */ 583 /* session-id */
592 if ((s->s2->tmp.session_id_length != 0) && 584 if ((s->s2->tmp.session_id_length != 0) &&
593 (s->s2->tmp.session_id_length != SSL2_SSL_SESSION_ID_LENGTH)) 585 (s->s2->tmp.session_id_length != SSL2_SSL_SESSION_ID_LENGTH)) {
594 { 586 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
595 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR); 587 SSLerr(SSL_F_GET_CLIENT_HELLO, SSL_R_BAD_SSL_SESSION_ID_LENGTH);
596 SSLerr(SSL_F_GET_CLIENT_HELLO,SSL_R_BAD_SSL_SESSION_ID_LENGTH); 588 return (-1);
597 return(-1); 589 }
598 }
599 590
600 if (s->s2->tmp.session_id_length == 0) 591 if (s->s2->tmp.session_id_length == 0) {
601 { 592 if (!ssl_get_new_session(s, 1)) {
602 if (!ssl_get_new_session(s,1)) 593 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
603 { 594 return (-1);
604 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
605 return(-1);
606 }
607 } 595 }
608 else 596 } else {
609 { 597 i = ssl_get_prev_session(s, &(p[s->s2->tmp.cipher_spec_length]),
610 i=ssl_get_prev_session(s,&(p[s->s2->tmp.cipher_spec_length]), 598 s->s2->tmp.session_id_length, NULL);
611 s->s2->tmp.session_id_length, NULL);
612 if (i == 1) 599 if (i == 1)
613 { /* previous session */ 600 { /* previous session */
614 s->hit=1; 601 s->hit = 1;
602 } else if (i == -1) {
603 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
604 return (-1);
605 } else {
606 if (s->cert == NULL) {
607 ssl2_return_error(s, SSL2_PE_NO_CERTIFICATE);
608 SSLerr(SSL_F_GET_CLIENT_HELLO, SSL_R_NO_CERTIFICATE_SET);
609 return (-1);
615 } 610 }
616 else if (i == -1)
617 {
618 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
619 return(-1);
620 }
621 else
622 {
623 if (s->cert == NULL)
624 {
625 ssl2_return_error(s,SSL2_PE_NO_CERTIFICATE);
626 SSLerr(SSL_F_GET_CLIENT_HELLO,SSL_R_NO_CERTIFICATE_SET);
627 return(-1);
628 }
629 611
630 if (!ssl_get_new_session(s,1)) 612 if (!ssl_get_new_session(s, 1)) {
631 { 613 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
632 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR); 614 return (-1);
633 return(-1);
634 }
635 } 615 }
636 } 616 }
617 }
637 618
638 if (!s->hit) 619 if (!s->hit) {
639 { 620 cs = ssl_bytes_to_cipher_list(s, p,
640 cs=ssl_bytes_to_cipher_list(s,p,s->s2->tmp.cipher_spec_length, 621 s->s2->tmp.cipher_spec_length, &s->session->ciphers);
641 &s->session->ciphers); 622 if (cs == NULL)
642 if (cs == NULL) goto mem_err; 623 goto mem_err;
643 624
644 cl=SSL_get_ciphers(s); 625 cl = SSL_get_ciphers(s);
645 626
646 if (s->options & SSL_OP_CIPHER_SERVER_PREFERENCE) 627 if (s->options & SSL_OP_CIPHER_SERVER_PREFERENCE) {
647 { 628 prio = sk_SSL_CIPHER_dup(cl);
648 prio=sk_SSL_CIPHER_dup(cl); 629 if (prio == NULL)
649 if (prio == NULL) goto mem_err; 630 goto mem_err;
650 allow = cs; 631 allow = cs;
651 } 632 } else {
652 else 633 prio = cs;
653 { 634 allow = cl;
654 prio = cs; 635 }
655 allow = cl; 636 for (z = 0; z < sk_SSL_CIPHER_num(prio); z++) {
656 } 637 if (sk_SSL_CIPHER_find(allow, sk_SSL_CIPHER_value(prio, z)) < 0) {
657 for (z=0; z<sk_SSL_CIPHER_num(prio); z++) 638 (void)sk_SSL_CIPHER_delete(prio, z);
658 {
659 if (sk_SSL_CIPHER_find(allow,sk_SSL_CIPHER_value(prio,z)) < 0)
660 {
661 (void)sk_SSL_CIPHER_delete(prio,z);
662 z--; 639 z--;
663 }
664 } 640 }
665 if (s->options & SSL_OP_CIPHER_SERVER_PREFERENCE) 641 }
666 { 642 if (s->options & SSL_OP_CIPHER_SERVER_PREFERENCE) {
667 sk_SSL_CIPHER_free(s->session->ciphers); 643 sk_SSL_CIPHER_free(s->session->ciphers);
668 s->session->ciphers = prio; 644 s->session->ciphers = prio;
669 } 645 }
670 /* s->session->ciphers should now have a list of 646 /* s->session->ciphers should now have a list of
671 * ciphers that are on both the client and server. 647 * ciphers that are on both the client and server.
672 * This list is ordered by the order the client sent 648 * This list is ordered by the order the client sent
673 * the ciphers or in the order of the server's preference 649 * the ciphers or in the order of the server's preference
674 * if SSL_OP_CIPHER_SERVER_PREFERENCE was set. 650 * if SSL_OP_CIPHER_SERVER_PREFERENCE was set.
675 */ 651 */
676 } 652 }
677 p+=s->s2->tmp.cipher_spec_length; 653 p += s->s2->tmp.cipher_spec_length;
678 /* done cipher selection */ 654 /* done cipher selection */
679 655
680 /* session id extracted already */ 656 /* session id extracted already */
681 p+=s->s2->tmp.session_id_length; 657 p += s->s2->tmp.session_id_length;
682 658
683 /* challenge */ 659 /* challenge */
684 if (s->s2->challenge_length > sizeof s->s2->challenge) 660 if (s->s2->challenge_length > sizeof s->s2->challenge) {
685 { 661 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
686 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
687 SSLerr(SSL_F_GET_CLIENT_HELLO, ERR_R_INTERNAL_ERROR); 662 SSLerr(SSL_F_GET_CLIENT_HELLO, ERR_R_INTERNAL_ERROR);
688 return -1; 663 return -1;
689 }
690 memcpy(s->s2->challenge,p,(unsigned int)s->s2->challenge_length);
691 return(1);
692mem_err:
693 SSLerr(SSL_F_GET_CLIENT_HELLO,ERR_R_MALLOC_FAILURE);
694 return(0);
695 } 664 }
696 665 memcpy(s->s2->challenge, p, (unsigned int)s->s2->challenge_length);
697static int server_hello(SSL *s) 666 return (1);
698 { 667mem_err:
699 unsigned char *p,*d; 668 SSLerr(SSL_F_GET_CLIENT_HELLO, ERR_R_MALLOC_FAILURE);
700 int n,hit; 669 return (0);
701 670}
702 p=(unsigned char *)s->init_buf->data; 671
703 if (s->state == SSL2_ST_SEND_SERVER_HELLO_A) 672static int
704 { 673server_hello(SSL *s)
705 d=p+11; 674{
706 *(p++)=SSL2_MT_SERVER_HELLO; /* type */ 675 unsigned char *p, *d;
707 hit=s->hit; 676 int n, hit;
708 *(p++)=(unsigned char)hit; 677
678 p = (unsigned char *)s->init_buf->data;
679 if (s->state == SSL2_ST_SEND_SERVER_HELLO_A) {
680 d = p + 11;
681 *(p++) = SSL2_MT_SERVER_HELLO;
682 /* type */
683 hit = s->hit;
684 *(p++) = (unsigned char)hit;
709#if 1 685#if 1
710 if (!hit) 686 if (!hit) {
711 {
712 if (s->session->sess_cert != NULL) 687 if (s->session->sess_cert != NULL)
713 /* This can't really happen because get_client_hello 688 /* This can't really happen because get_client_hello
714 * has called ssl_get_new_session, which does not set 689 * has called ssl_get_new_session, which does not set
715 * sess_cert. */ 690 * sess_cert. */
716 ssl_sess_cert_free(s->session->sess_cert); 691 ssl_sess_cert_free(s->session->sess_cert);
717 s->session->sess_cert = ssl_sess_cert_new(); 692 s->session->sess_cert = ssl_sess_cert_new();
718 if (s->session->sess_cert == NULL) 693 if (s->session->sess_cert == NULL) {
719 {
720 SSLerr(SSL_F_SERVER_HELLO, ERR_R_MALLOC_FAILURE); 694 SSLerr(SSL_F_SERVER_HELLO, ERR_R_MALLOC_FAILURE);
721 return(-1); 695 return (-1);
722 }
723 } 696 }
697 }
724 /* If 'hit' is set, then s->sess_cert may be non-NULL or NULL, 698 /* If 'hit' is set, then s->sess_cert may be non-NULL or NULL,
725 * depending on whether it survived in the internal cache 699 * depending on whether it survived in the internal cache
726 * or was retrieved from an external cache. 700 * or was retrieved from an external cache.
@@ -730,419 +704,391 @@ static int server_hello(SSL *s)
730 704
731#else /* That's what used to be done when cert_st and sess_cert_st were 705#else /* That's what used to be done when cert_st and sess_cert_st were
732 * the same. */ 706 * the same. */
733 if (!hit) 707 if (!hit) { /* else add cert to session */
734 { /* else add cert to session */ 708 CRYPTO_add(&s->cert->references, 1, CRYPTO_LOCK_SSL_CERT);
735 CRYPTO_add(&s->cert->references,1,CRYPTO_LOCK_SSL_CERT);
736 if (s->session->sess_cert != NULL) 709 if (s->session->sess_cert != NULL)
737 ssl_cert_free(s->session->sess_cert); 710 ssl_cert_free(s->session->sess_cert);
738 s->session->sess_cert=s->cert; 711 s->session->sess_cert = s->cert;
739 } 712
740 else /* We have a session id-cache hit, if the 713 } else /* We have a session id - cache hit, if the
741 * session-id has no certificate listed against 714 * session - id has no certificate listed against
742 * the 'cert' structure, grab the 'old' one 715 * the 'cert' structure, grab the 'old' one
743 * listed against the SSL connection */ 716 * listed against the SSL connection */
744 { 717 {
745 if (s->session->sess_cert == NULL) 718 if (s->session->sess_cert == NULL) {
746 { 719 CRYPTO_add(&s->cert->references, 1,
747 CRYPTO_add(&s->cert->references,1, 720 CRYPTO_LOCK_SSL_CERT);
748 CRYPTO_LOCK_SSL_CERT); 721 s->session->sess_cert = s->cert;
749 s->session->sess_cert=s->cert;
750 }
751 } 722 }
723 }
752#endif 724#endif
753 725
754 if (s->cert == NULL) 726 if (s->cert == NULL) {
755 { 727 ssl2_return_error(s, SSL2_PE_NO_CERTIFICATE);
756 ssl2_return_error(s,SSL2_PE_NO_CERTIFICATE); 728 SSLerr(SSL_F_SERVER_HELLO, SSL_R_NO_CERTIFICATE_SPECIFIED);
757 SSLerr(SSL_F_SERVER_HELLO,SSL_R_NO_CERTIFICATE_SPECIFIED); 729 return (-1);
758 return(-1); 730 }
759 }
760 731
761 if (hit) 732 if (hit) {
762 { 733 *(p++) = 0;
763 *(p++)=0; /* no certificate type */ 734 /* no certificate type */
764 s2n(s->version,p); /* version */ 735 s2n(s->version,p); /* version */
765 s2n(0,p); /* cert len */ 736 s2n(0, p);
766 s2n(0,p); /* ciphers len */ 737 /* cert len */
767 } 738 s2n(0, p);
768 else 739 /* ciphers len */
769 { 740 } else {
770 /* EAY EAY */ 741 /* EAY EAY */
771 /* put certificate type */ 742 /* put certificate type */
772 *(p++)=SSL2_CT_X509_CERTIFICATE; 743 *(p++) = SSL2_CT_X509_CERTIFICATE;
773 s2n(s->version,p); /* version */ 744 s2n(s->version,p); /* version */
774 n=i2d_X509(s->cert->pkeys[SSL_PKEY_RSA_ENC].x509,NULL); 745 n = i2d_X509(s->cert->pkeys[SSL_PKEY_RSA_ENC].x509, NULL);
775 s2n(n,p); /* certificate length */ 746 s2n(n, p);
776 i2d_X509(s->cert->pkeys[SSL_PKEY_RSA_ENC].x509,&d); 747 /* certificate length */
777 n=0; 748 i2d_X509(s->cert->pkeys[SSL_PKEY_RSA_ENC].x509, &d);
778 749 n = 0;
750
779 /* lets send out the ciphers we like in the 751 /* lets send out the ciphers we like in the
780 * prefered order */ 752 * prefered order */
781 n=ssl_cipher_list_to_bytes(s,s->session->ciphers,d,0); 753 n = ssl_cipher_list_to_bytes(s, s->session->ciphers, d, 0);
782 d+=n; 754 d += n;
783 s2n(n,p); /* add cipher length */ 755 s2n(n, p);
784 } 756 /* add cipher length */
757 }
785 758
786 /* make and send conn_id */ 759 /* make and send conn_id */
787 s2n(SSL2_CONNECTION_ID_LENGTH,p); /* add conn_id length */ 760 s2n(SSL2_CONNECTION_ID_LENGTH,p); /* add conn_id length */
788 s->s2->conn_id_length=SSL2_CONNECTION_ID_LENGTH; 761 s->s2->conn_id_length = SSL2_CONNECTION_ID_LENGTH;
789 if (RAND_pseudo_bytes(s->s2->conn_id,(int)s->s2->conn_id_length) <= 0) 762 if (RAND_pseudo_bytes(s->s2->conn_id,(int)s->s2->conn_id_length) <= 0)
790 return -1; 763 return -1;
791 memcpy(d,s->s2->conn_id,SSL2_CONNECTION_ID_LENGTH); 764 memcpy(d, s->s2->conn_id, SSL2_CONNECTION_ID_LENGTH);
792 d+=SSL2_CONNECTION_ID_LENGTH; 765 d += SSL2_CONNECTION_ID_LENGTH;
793 766
794 s->state=SSL2_ST_SEND_SERVER_HELLO_B; 767 s->state = SSL2_ST_SEND_SERVER_HELLO_B;
795 s->init_num=d-(unsigned char *)s->init_buf->data; 768 s->init_num = d - (unsigned char *)s->init_buf->data;
796 s->init_off=0; 769 s->init_off = 0;
797 } 770 }
798 /* SSL2_ST_SEND_SERVER_HELLO_B */ 771 /* SSL2_ST_SEND_SERVER_HELLO_B */
799 /* If we are using TCP/IP, the performance is bad if we do 2 772 /* If we are using TCP/IP, the performance is bad if we do 2
800 * writes without a read between them. This occurs when 773 * writes without a read between them. This occurs when
801 * Session-id reuse is used, so I will put in a buffering module 774 * Session-id reuse is used, so I will put in a buffering module
802 */ 775 */
803 if (s->hit) 776 if (s->hit) {
804 { 777 if (!ssl_init_wbio_buffer(s, 1))
805 if (!ssl_init_wbio_buffer(s,1)) return(-1); 778 return (-1);
806 }
807
808 return(ssl2_do_write(s));
809 } 779 }
810 780
811static int get_client_finished(SSL *s) 781 return (ssl2_do_write(s));
812 { 782}
783
784static int
785get_client_finished(SSL *s)
786{
813 unsigned char *p; 787 unsigned char *p;
814 int i, n; 788 int i, n;
815 unsigned long len; 789 unsigned long len;
816 790
817 p=(unsigned char *)s->init_buf->data; 791 p = (unsigned char *)s->init_buf->data;
818 if (s->state == SSL2_ST_GET_CLIENT_FINISHED_A) 792 if (s->state == SSL2_ST_GET_CLIENT_FINISHED_A) {
819 { 793 i = ssl2_read(s,(char *)&(p[s->init_num]), 1 - s->init_num);
820 i=ssl2_read(s,(char *)&(p[s->init_num]),1-s->init_num); 794 if (i < 1 - s->init_num)
821 if (i < 1-s->init_num) 795 return (ssl2_part_read(s, SSL_F_GET_CLIENT_FINISHED, i));
822 return(ssl2_part_read(s,SSL_F_GET_CLIENT_FINISHED,i));
823 s->init_num += i; 796 s->init_num += i;
824 797
825 if (*p != SSL2_MT_CLIENT_FINISHED) 798 if (*p != SSL2_MT_CLIENT_FINISHED) {
826 { 799 if (*p != SSL2_MT_ERROR) {
827 if (*p != SSL2_MT_ERROR) 800 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
828 { 801 SSLerr(SSL_F_GET_CLIENT_FINISHED, SSL_R_READ_WRONG_PACKET_TYPE);
829 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR); 802 } else {
830 SSLerr(SSL_F_GET_CLIENT_FINISHED,SSL_R_READ_WRONG_PACKET_TYPE); 803 SSLerr(SSL_F_GET_CLIENT_FINISHED, SSL_R_PEER_ERROR);
831 }
832 else
833 {
834 SSLerr(SSL_F_GET_CLIENT_FINISHED,SSL_R_PEER_ERROR);
835 /* try to read the error message */ 804 /* try to read the error message */
836 i=ssl2_read(s,(char *)&(p[s->init_num]),3-s->init_num); 805 i = ssl2_read(s,(char *)&(p[s->init_num]), 3 - s->init_num);
837 return ssl2_part_read(s,SSL_F_GET_SERVER_VERIFY,i); 806 return ssl2_part_read(s, SSL_F_GET_SERVER_VERIFY, i);
838 }
839 return(-1);
840 } 807 }
841 s->state=SSL2_ST_GET_CLIENT_FINISHED_B; 808 return (-1);
842 } 809 }
810 s->state = SSL2_ST_GET_CLIENT_FINISHED_B;
811 }
843 812
844 /* SSL2_ST_GET_CLIENT_FINISHED_B */ 813 /* SSL2_ST_GET_CLIENT_FINISHED_B */
845 if (s->s2->conn_id_length > sizeof s->s2->conn_id) 814 if (s->s2->conn_id_length > sizeof s->s2->conn_id) {
846 { 815 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
847 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
848 SSLerr(SSL_F_GET_CLIENT_FINISHED, ERR_R_INTERNAL_ERROR); 816 SSLerr(SSL_F_GET_CLIENT_FINISHED, ERR_R_INTERNAL_ERROR);
849 return -1; 817 return -1;
850 } 818 }
851 len = 1 + (unsigned long)s->s2->conn_id_length; 819 len = 1 + (unsigned long)s->s2->conn_id_length;
852 n = (int)len - s->init_num; 820 n = (int)len - s->init_num;
853 i = ssl2_read(s,(char *)&(p[s->init_num]),n); 821 i = ssl2_read(s,(char *)&(p[s->init_num]), n);
854 if (i < n) 822 if (i < n) {
855 { 823 return (ssl2_part_read(s, SSL_F_GET_CLIENT_FINISHED, i));
856 return(ssl2_part_read(s,SSL_F_GET_CLIENT_FINISHED,i)); 824 }
857 }
858 if (s->msg_callback) 825 if (s->msg_callback)
859 s->msg_callback(0, s->version, 0, p, len, s, s->msg_callback_arg); /* CLIENT-FINISHED */ 826 s->msg_callback(0, s->version, 0, p, len, s, s->msg_callback_arg); /* CLIENT-FINISHED */
860 p += 1; 827 p += 1;
861 if (memcmp(p,s->s2->conn_id,s->s2->conn_id_length) != 0) 828 if (memcmp(p, s->s2->conn_id, s->s2->conn_id_length) != 0) {
862 { 829 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
863 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR); 830 SSLerr(SSL_F_GET_CLIENT_FINISHED, SSL_R_CONNECTION_ID_IS_DIFFERENT);
864 SSLerr(SSL_F_GET_CLIENT_FINISHED,SSL_R_CONNECTION_ID_IS_DIFFERENT); 831 return (-1);
865 return(-1);
866 }
867 return(1);
868 } 832 }
833 return (1);
834}
869 835
870static int server_verify(SSL *s) 836static int
871 { 837server_verify(SSL *s)
838{
872 unsigned char *p; 839 unsigned char *p;
873 840
874 if (s->state == SSL2_ST_SEND_SERVER_VERIFY_A) 841 if (s->state == SSL2_ST_SEND_SERVER_VERIFY_A) {
875 { 842 p = (unsigned char *)s->init_buf->data;
876 p=(unsigned char *)s->init_buf->data; 843 *(p++) = SSL2_MT_SERVER_VERIFY;
877 *(p++)=SSL2_MT_SERVER_VERIFY; 844 if (s->s2->challenge_length > sizeof s->s2->challenge) {
878 if (s->s2->challenge_length > sizeof s->s2->challenge)
879 {
880 SSLerr(SSL_F_SERVER_VERIFY, ERR_R_INTERNAL_ERROR); 845 SSLerr(SSL_F_SERVER_VERIFY, ERR_R_INTERNAL_ERROR);
881 return -1; 846 return -1;
882 } 847 }
883 memcpy(p,s->s2->challenge,(unsigned int)s->s2->challenge_length); 848 memcpy(p, s->s2->challenge,(unsigned int)s->s2->challenge_length);
884 /* p+=s->s2->challenge_length; */ 849 /* p+=s->s2->challenge_length; */
885 850
886 s->state=SSL2_ST_SEND_SERVER_VERIFY_B; 851 s->state = SSL2_ST_SEND_SERVER_VERIFY_B;
887 s->init_num=s->s2->challenge_length+1; 852 s->init_num = s->s2->challenge_length + 1;
888 s->init_off=0; 853 s->init_off = 0;
889 }
890 return(ssl2_do_write(s));
891 } 854 }
855 return (ssl2_do_write(s));
856}
892 857
893static int server_finish(SSL *s) 858static int
894 { 859server_finish(SSL *s)
860{
895 unsigned char *p; 861 unsigned char *p;
896 862
897 if (s->state == SSL2_ST_SEND_SERVER_FINISHED_A) 863 if (s->state == SSL2_ST_SEND_SERVER_FINISHED_A) {
898 { 864 p = (unsigned char *)s->init_buf->data;
899 p=(unsigned char *)s->init_buf->data; 865 *(p++) = SSL2_MT_SERVER_FINISHED;
900 *(p++)=SSL2_MT_SERVER_FINISHED;
901 866
902 if (s->session->session_id_length > sizeof s->session->session_id) 867 if (s->session->session_id_length > sizeof s->session->session_id) {
903 {
904 SSLerr(SSL_F_SERVER_FINISH, ERR_R_INTERNAL_ERROR); 868 SSLerr(SSL_F_SERVER_FINISH, ERR_R_INTERNAL_ERROR);
905 return -1; 869 return -1;
906 } 870 }
907 memcpy(p,s->session->session_id, (unsigned int)s->session->session_id_length); 871 memcpy(p, s->session->session_id, (unsigned int)s->session->session_id_length);
908 /* p+=s->session->session_id_length; */ 872 /* p+=s->session->session_id_length; */
909 873
910 s->state=SSL2_ST_SEND_SERVER_FINISHED_B; 874 s->state = SSL2_ST_SEND_SERVER_FINISHED_B;
911 s->init_num=s->session->session_id_length+1; 875 s->init_num = s->session->session_id_length + 1;
912 s->init_off=0; 876 s->init_off = 0;
913 } 877 }
914 878
915 /* SSL2_ST_SEND_SERVER_FINISHED_B */ 879 /* SSL2_ST_SEND_SERVER_FINISHED_B */
916 return(ssl2_do_write(s)); 880 return (ssl2_do_write(s));
917 } 881}
918 882
919/* send the request and check the response */ 883/* send the request and check the response */
920static int request_certificate(SSL *s) 884static int
921 { 885request_certificate(SSL *s)
886{
922 const unsigned char *cp; 887 const unsigned char *cp;
923 unsigned char *p,*p2,*buf2; 888 unsigned char *p, *p2, *buf2;
924 unsigned char *ccd; 889 unsigned char *ccd;
925 int i,j,ctype,ret= -1; 890 int i, j, ctype, ret = -1;
926 unsigned long len; 891 unsigned long len;
927 X509 *x509=NULL; 892 X509 *x509 = NULL;
928 STACK_OF(X509) *sk=NULL; 893 STACK_OF(X509) *sk = NULL;
929 894
930 ccd=s->s2->tmp.ccl; 895 ccd = s->s2->tmp.ccl;
931 if (s->state == SSL2_ST_SEND_REQUEST_CERTIFICATE_A) 896 if (s->state == SSL2_ST_SEND_REQUEST_CERTIFICATE_A) {
932 { 897 p = (unsigned char *)s->init_buf->data;
933 p=(unsigned char *)s->init_buf->data; 898 *(p++) = SSL2_MT_REQUEST_CERTIFICATE;
934 *(p++)=SSL2_MT_REQUEST_CERTIFICATE; 899 *(p++) = SSL2_AT_MD5_WITH_RSA_ENCRYPTION;
935 *(p++)=SSL2_AT_MD5_WITH_RSA_ENCRYPTION; 900 if (RAND_pseudo_bytes(ccd, SSL2_MIN_CERT_CHALLENGE_LENGTH) <= 0)
936 if (RAND_pseudo_bytes(ccd,SSL2_MIN_CERT_CHALLENGE_LENGTH) <= 0)
937 return -1; 901 return -1;
938 memcpy(p,ccd,SSL2_MIN_CERT_CHALLENGE_LENGTH); 902 memcpy(p, ccd, SSL2_MIN_CERT_CHALLENGE_LENGTH);
939 903
940 s->state=SSL2_ST_SEND_REQUEST_CERTIFICATE_B; 904 s->state = SSL2_ST_SEND_REQUEST_CERTIFICATE_B;
941 s->init_num=SSL2_MIN_CERT_CHALLENGE_LENGTH+2; 905 s->init_num = SSL2_MIN_CERT_CHALLENGE_LENGTH + 2;
942 s->init_off=0; 906 s->init_off = 0;
943 } 907 }
944 908
945 if (s->state == SSL2_ST_SEND_REQUEST_CERTIFICATE_B) 909 if (s->state == SSL2_ST_SEND_REQUEST_CERTIFICATE_B) {
946 { 910 i = ssl2_do_write(s);
947 i=ssl2_do_write(s); 911 if (i <= 0) {
948 if (i <= 0) 912 ret = i;
949 {
950 ret=i;
951 goto end; 913 goto end;
952 }
953
954 s->init_num=0;
955 s->state=SSL2_ST_SEND_REQUEST_CERTIFICATE_C;
956 } 914 }
957 915
958 if (s->state == SSL2_ST_SEND_REQUEST_CERTIFICATE_C) 916 s->init_num = 0;
959 { 917 s->state = SSL2_ST_SEND_REQUEST_CERTIFICATE_C;
960 p=(unsigned char *)s->init_buf->data; 918 }
961 i=ssl2_read(s,(char *)&(p[s->init_num]),6-s->init_num); /* try to read 6 octets ... */ 919
962 if (i < 3-s->init_num) /* ... but don't call ssl2_part_read now if we got at least 3 920 if (s->state == SSL2_ST_SEND_REQUEST_CERTIFICATE_C) {
921 p = (unsigned char *)s->init_buf->data;
922 i = ssl2_read(s, (char *)&(p[s->init_num]), 6 - s->init_num); /* try to read 6 octets ... */
923 if (i < 3 - s->init_num) /* ... but don't call ssl2_part_read now if we got at least 3
963 * (probably NO-CERTIFICATE-ERROR) */ 924 * (probably NO-CERTIFICATE-ERROR) */
964 { 925 {
965 ret=ssl2_part_read(s,SSL_F_REQUEST_CERTIFICATE,i); 926 ret = ssl2_part_read(s, SSL_F_REQUEST_CERTIFICATE, i);
966 goto end; 927 goto end;
967 } 928 }
968 s->init_num += i; 929 s->init_num += i;
969 930
970 if ((s->init_num >= 3) && (p[0] == SSL2_MT_ERROR)) 931 if ((s->init_num >= 3) && (p[0] == SSL2_MT_ERROR)) {
971 { 932 n2s(p, i);
972 n2s(p,i); 933 if (i != SSL2_PE_NO_CERTIFICATE) {
973 if (i != SSL2_PE_NO_CERTIFICATE)
974 {
975 /* not the error message we expected -- let ssl2_part_read handle it */ 934 /* not the error message we expected -- let ssl2_part_read handle it */
976 s->init_num -= 3; 935 s->init_num -= 3;
977 ret = ssl2_part_read(s,SSL_F_REQUEST_CERTIFICATE, 3); 936 ret = ssl2_part_read(s, SSL_F_REQUEST_CERTIFICATE, 3);
978 goto end; 937 goto end;
979 } 938 }
980 939
981 if (s->msg_callback) 940 if (s->msg_callback)
982 s->msg_callback(0, s->version, 0, p, 3, s, s->msg_callback_arg); /* ERROR */ 941 s->msg_callback(0, s->version, 0, p, 3, s, s->msg_callback_arg); /* ERROR */
983 942
984 /* this is the one place where we can recover from an SSL 2.0 error */ 943 /* this is the one place where we can recover from an SSL 2.0 error */
985 944
986 if (s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT) 945 if (s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT) {
987 { 946 ssl2_return_error(s, SSL2_PE_BAD_CERTIFICATE);
988 ssl2_return_error(s,SSL2_PE_BAD_CERTIFICATE); 947 SSLerr(SSL_F_REQUEST_CERTIFICATE, SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE);
989 SSLerr(SSL_F_REQUEST_CERTIFICATE,SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE);
990 goto end; 948 goto end;
991 }
992 ret=1;
993 goto end;
994 } 949 }
995 if ((*(p++) != SSL2_MT_CLIENT_CERTIFICATE) || (s->init_num < 6)) 950 ret = 1;
996 {
997 ssl2_return_error(s,SSL2_PE_UNDEFINED_ERROR);
998 SSLerr(SSL_F_REQUEST_CERTIFICATE,SSL_R_SHORT_READ);
999 goto end; 951 goto end;
1000 } 952 }
1001 if (s->init_num != 6) 953 if ((*(p++) != SSL2_MT_CLIENT_CERTIFICATE) || (s->init_num < 6)) {
1002 { 954 ssl2_return_error(s, SSL2_PE_UNDEFINED_ERROR);
955 SSLerr(SSL_F_REQUEST_CERTIFICATE, SSL_R_SHORT_READ);
956 goto end;
957 }
958 if (s->init_num != 6) {
1003 SSLerr(SSL_F_REQUEST_CERTIFICATE, ERR_R_INTERNAL_ERROR); 959 SSLerr(SSL_F_REQUEST_CERTIFICATE, ERR_R_INTERNAL_ERROR);
1004 goto end; 960 goto end;
1005 } 961 }
1006 962
1007 /* ok we have a response */ 963 /* ok we have a response */
1008 /* certificate type, there is only one right now. */ 964 /* certificate type, there is only one right now. */
1009 ctype= *(p++); 965 ctype= *(p++);
1010 if (ctype != SSL2_AT_MD5_WITH_RSA_ENCRYPTION) 966 if (ctype != SSL2_AT_MD5_WITH_RSA_ENCRYPTION) {
1011 { 967 ssl2_return_error(s, SSL2_PE_UNSUPPORTED_CERTIFICATE_TYPE);
1012 ssl2_return_error(s,SSL2_PE_UNSUPPORTED_CERTIFICATE_TYPE); 968 SSLerr(SSL_F_REQUEST_CERTIFICATE, SSL_R_BAD_RESPONSE_ARGUMENT);
1013 SSLerr(SSL_F_REQUEST_CERTIFICATE,SSL_R_BAD_RESPONSE_ARGUMENT);
1014 goto end; 969 goto end;
1015 }
1016 n2s(p,i); s->s2->tmp.clen=i;
1017 n2s(p,i); s->s2->tmp.rlen=i;
1018 s->state=SSL2_ST_SEND_REQUEST_CERTIFICATE_D;
1019 } 970 }
971 n2s(p, i);
972 s->s2->tmp.clen = i;
973 n2s(p, i);
974 s->s2->tmp.rlen = i;
975 s->state = SSL2_ST_SEND_REQUEST_CERTIFICATE_D;
976 }
1020 977
1021 /* SSL2_ST_SEND_REQUEST_CERTIFICATE_D */ 978 /* SSL2_ST_SEND_REQUEST_CERTIFICATE_D */
1022 p=(unsigned char *)s->init_buf->data; 979 p = (unsigned char *)s->init_buf->data;
1023 len = 6 + (unsigned long)s->s2->tmp.clen + (unsigned long)s->s2->tmp.rlen; 980 len = 6 + (unsigned long)s->s2->tmp.clen + (unsigned long)s->s2->tmp.rlen;
1024 if (len > SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER) 981 if (len > SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER) {
1025 { 982 SSLerr(SSL_F_REQUEST_CERTIFICATE, SSL_R_MESSAGE_TOO_LONG);
1026 SSLerr(SSL_F_REQUEST_CERTIFICATE,SSL_R_MESSAGE_TOO_LONG);
1027 goto end; 983 goto end;
1028 } 984 }
1029 j = (int)len - s->init_num; 985 j = (int)len - s->init_num;
1030 i = ssl2_read(s,(char *)&(p[s->init_num]),j); 986 i = ssl2_read(s,(char *)&(p[s->init_num]), j);
1031 if (i < j) 987 if (i < j) {
1032 { 988 ret = ssl2_part_read(s, SSL_F_REQUEST_CERTIFICATE, i);
1033 ret=ssl2_part_read(s,SSL_F_REQUEST_CERTIFICATE,i);
1034 goto end; 989 goto end;
1035 } 990 }
1036 if (s->msg_callback) 991 if (s->msg_callback)
1037 s->msg_callback(0, s->version, 0, p, len, s, s->msg_callback_arg); /* CLIENT-CERTIFICATE */ 992 s->msg_callback(0, s->version, 0, p, len, s, s->msg_callback_arg); /* CLIENT-CERTIFICATE */
1038 p += 6; 993 p += 6;
1039 994
1040 cp = p; 995 cp = p;
1041 x509=(X509 *)d2i_X509(NULL,&cp,(long)s->s2->tmp.clen); 996 x509 = (X509 *)d2i_X509(NULL, &cp,(long)s->s2->tmp.clen);
1042 if (x509 == NULL) 997 if (x509 == NULL) {
1043 { 998 SSLerr(SSL_F_REQUEST_CERTIFICATE, ERR_R_X509_LIB);
1044 SSLerr(SSL_F_REQUEST_CERTIFICATE,ERR_R_X509_LIB);
1045 goto msg_end; 999 goto msg_end;
1046 } 1000 }
1047 1001
1048 if (((sk=sk_X509_new_null()) == NULL) || (!sk_X509_push(sk,x509))) 1002 if (((sk = sk_X509_new_null()) == NULL) || (!sk_X509_push(sk, x509))) {
1049 { 1003 SSLerr(SSL_F_REQUEST_CERTIFICATE, ERR_R_MALLOC_FAILURE);
1050 SSLerr(SSL_F_REQUEST_CERTIFICATE,ERR_R_MALLOC_FAILURE);
1051 goto msg_end; 1004 goto msg_end;
1052 } 1005 }
1053 1006
1054 i=ssl_verify_cert_chain(s,sk); 1007 i = ssl_verify_cert_chain(s, sk);
1055 1008
1056 if (i > 0) /* we like the packet, now check the chksum */ 1009 if (i > 0) /* we like the packet, now check the chksum */
1057 { 1010 {
1058 EVP_MD_CTX ctx; 1011 EVP_MD_CTX ctx;
1059 EVP_PKEY *pkey=NULL; 1012 EVP_PKEY *pkey = NULL;
1060 1013
1061 EVP_MD_CTX_init(&ctx); 1014 EVP_MD_CTX_init(&ctx);
1062 if (!EVP_VerifyInit_ex(&ctx,s->ctx->rsa_md5, NULL) 1015 if (!EVP_VerifyInit_ex(&ctx, s->ctx->rsa_md5, NULL) ||
1063 || !EVP_VerifyUpdate(&ctx,s->s2->key_material, 1016 !EVP_VerifyUpdate(&ctx, s->s2->key_material,
1064 s->s2->key_material_length) 1017 s->s2->key_material_length) ||
1065 || !EVP_VerifyUpdate(&ctx,ccd, 1018 !EVP_VerifyUpdate(&ctx, ccd,
1066 SSL2_MIN_CERT_CHALLENGE_LENGTH)) 1019 SSL2_MIN_CERT_CHALLENGE_LENGTH))
1067 goto msg_end; 1020 goto msg_end;
1068 1021
1069 i=i2d_X509(s->cert->pkeys[SSL_PKEY_RSA_ENC].x509,NULL); 1022 i = i2d_X509(s->cert->pkeys[SSL_PKEY_RSA_ENC].x509, NULL);
1070 buf2=OPENSSL_malloc((unsigned int)i); 1023 buf2 = OPENSSL_malloc((unsigned int)i);
1071 if (buf2 == NULL) 1024 if (buf2 == NULL) {
1072 { 1025 SSLerr(SSL_F_REQUEST_CERTIFICATE, ERR_R_MALLOC_FAILURE);
1073 SSLerr(SSL_F_REQUEST_CERTIFICATE,ERR_R_MALLOC_FAILURE);
1074 goto msg_end; 1026 goto msg_end;
1075 } 1027 }
1076 p2=buf2; 1028 p2 = buf2;
1077 i=i2d_X509(s->cert->pkeys[SSL_PKEY_RSA_ENC].x509,&p2); 1029 i = i2d_X509(s->cert->pkeys[SSL_PKEY_RSA_ENC].x509, &p2);
1078 if (!EVP_VerifyUpdate(&ctx,buf2,(unsigned int)i)) 1030 if (!EVP_VerifyUpdate(&ctx, buf2,(unsigned int)i)) {
1079 {
1080 OPENSSL_free(buf2); 1031 OPENSSL_free(buf2);
1081 goto msg_end; 1032 goto msg_end;
1082 } 1033 }
1083 OPENSSL_free(buf2); 1034 OPENSSL_free(buf2);
1084 1035
1085 pkey=X509_get_pubkey(x509); 1036 pkey = X509_get_pubkey(x509);
1086 if (pkey == NULL) goto end; 1037 if (pkey == NULL)
1087 i=EVP_VerifyFinal(&ctx,cp,s->s2->tmp.rlen,pkey); 1038 goto end;
1039 i = EVP_VerifyFinal(&ctx, cp, s->s2->tmp.rlen, pkey);
1088 EVP_PKEY_free(pkey); 1040 EVP_PKEY_free(pkey);
1089 EVP_MD_CTX_cleanup(&ctx); 1041 EVP_MD_CTX_cleanup(&ctx);
1090 1042
1091 if (i > 0) 1043 if (i > 0) {
1092 {
1093 if (s->session->peer != NULL) 1044 if (s->session->peer != NULL)
1094 X509_free(s->session->peer); 1045 X509_free(s->session->peer);
1095 s->session->peer=x509; 1046 s->session->peer = x509;
1096 CRYPTO_add(&x509->references,1,CRYPTO_LOCK_X509); 1047 CRYPTO_add(&x509->references, 1, CRYPTO_LOCK_X509);
1097 s->session->verify_result = s->verify_result; 1048 s->session->verify_result = s->verify_result;
1098 ret=1; 1049 ret = 1;
1099 goto end; 1050 goto end;
1100 } 1051 } else {
1101 else 1052 SSLerr(SSL_F_REQUEST_CERTIFICATE, SSL_R_BAD_CHECKSUM);
1102 {
1103 SSLerr(SSL_F_REQUEST_CERTIFICATE,SSL_R_BAD_CHECKSUM);
1104 goto msg_end; 1053 goto msg_end;
1105 }
1106 } 1054 }
1107 else 1055 } else {
1108 {
1109msg_end: 1056msg_end:
1110 ssl2_return_error(s,SSL2_PE_BAD_CERTIFICATE); 1057 ssl2_return_error(s, SSL2_PE_BAD_CERTIFICATE);
1111 } 1058 }
1112end: 1059end:
1113 sk_X509_free(sk); 1060 sk_X509_free(sk);
1114 X509_free(x509); 1061 X509_free(x509);
1115 return(ret); 1062 return (ret);
1116 } 1063}
1117 1064
1118static int ssl_rsa_private_decrypt(CERT *c, int len, unsigned char *from, 1065static int
1119 unsigned char *to, int padding) 1066ssl_rsa_private_decrypt(CERT *c, int len, unsigned char *from,
1120 { 1067 unsigned char *to, int padding)
1068{
1121 RSA *rsa; 1069 RSA *rsa;
1122 int i; 1070 int i;
1123 1071
1124 if ((c == NULL) || (c->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL)) 1072 if ((c == NULL) || (c->pkeys[SSL_PKEY_RSA_ENC].privatekey == NULL)) {
1125 { 1073 SSLerr(SSL_F_SSL_RSA_PRIVATE_DECRYPT, SSL_R_NO_PRIVATEKEY);
1126 SSLerr(SSL_F_SSL_RSA_PRIVATE_DECRYPT,SSL_R_NO_PRIVATEKEY); 1074 return (-1);
1127 return(-1); 1075 }
1128 } 1076 if (c->pkeys[SSL_PKEY_RSA_ENC].privatekey->type != EVP_PKEY_RSA) {
1129 if (c->pkeys[SSL_PKEY_RSA_ENC].privatekey->type != EVP_PKEY_RSA) 1077 SSLerr(SSL_F_SSL_RSA_PRIVATE_DECRYPT, SSL_R_PUBLIC_KEY_IS_NOT_RSA);
1130 { 1078 return (-1);
1131 SSLerr(SSL_F_SSL_RSA_PRIVATE_DECRYPT,SSL_R_PUBLIC_KEY_IS_NOT_RSA); 1079 }
1132 return(-1); 1080 rsa = c->pkeys[SSL_PKEY_RSA_ENC].privatekey->pkey.rsa;
1133 }
1134 rsa=c->pkeys[SSL_PKEY_RSA_ENC].privatekey->pkey.rsa;
1135 1081
1136 /* we have the public key */ 1082 /* we have the public key */
1137 i=RSA_private_decrypt(len,from,to,rsa,padding); 1083 i = RSA_private_decrypt(len, from, to, rsa, padding);
1138 if (i < 0) 1084 if (i < 0)
1139 SSLerr(SSL_F_SSL_RSA_PRIVATE_DECRYPT,ERR_R_RSA_LIB); 1085 SSLerr(SSL_F_SSL_RSA_PRIVATE_DECRYPT, ERR_R_RSA_LIB);
1140 return(i); 1086 return (i);
1141 } 1087}
1142#else /* !OPENSSL_NO_SSL2 */ 1088#else /* !OPENSSL_NO_SSL2 */
1143 1089
1144# if PEDANTIC 1090# if PEDANTIC
1145static void *dummy=&dummy; 1091static void *dummy = &dummy;
1146# endif 1092# endif
1147 1093
1148#endif 1094#endif