diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/libssl/src/ssl/s2_clnt.c | 1213 | ||||
| -rw-r--r-- | src/lib/libssl/src/ssl/s2_enc.c | 149 | ||||
| -rw-r--r-- | src/lib/libssl/src/ssl/s2_lib.c | 569 | ||||
| -rw-r--r-- | src/lib/libssl/src/ssl/s2_meth.c | 17 | ||||
| -rw-r--r-- | src/lib/libssl/src/ssl/s2_pkt.c | 742 | ||||
| -rw-r--r-- | src/lib/libssl/src/ssl/s2_srvr.c | 1264 |
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); | |||
| 121 | static int get_server_finished(SSL *s); | 121 | static int get_server_finished(SSL *s); |
| 122 | static int get_server_verify(SSL *s); | 122 | static int get_server_verify(SSL *s); |
| 123 | static int get_server_hello(SSL *s); | 123 | static int get_server_hello(SSL *s); |
| 124 | static int client_hello(SSL *s); | 124 | static int client_hello(SSL *s); |
| 125 | |||
| 125 | static int client_master_key(SSL *s); | 126 | static int client_master_key(SSL *s); |
| 126 | static int client_finished(SSL *s); | 127 | static int client_finished(SSL *s); |
| 127 | static int client_certificate(SSL *s); | 128 | static int client_certificate(SSL *s); |
| 128 | static int ssl_rsa_public_encrypt(SESS_CERT *sc, int len, unsigned char *from, | 129 | static int |
| 129 | unsigned char *to,int padding); | 130 | ssl_rsa_public_encrypt(SESS_CERT *sc, int len, unsigned char *from, |
| 131 | unsigned char *to, int padding); | ||
| 130 | #define BREAK break | 132 | #define BREAK break |
| 131 | 133 | ||
| 132 | static const SSL_METHOD *ssl2_get_client_method(int ver) | 134 | static 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 | ||
| 140 | IMPLEMENT_ssl2_meth_func(SSLv2_client_method, | 143 | IMPLEMENT_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) | 146 | int |
| 144 | 147 | ssl2_connect(SSL *s) | |
| 145 | int 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 | } | ||
| 323 | end: | 328 | end: |
| 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 | ||
| 332 | static int get_server_hello(SSL *s) | 337 | static int |
| 333 | { | 338 | get_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 | ||
| 545 | static int client_hello(SSL *s) | 534 | static int |
| 546 | { | 535 | client_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 | ||
| 613 | static int client_master_key(SSL *s) | 603 | static int |
| 614 | { | 604 | client_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 | ||
| 725 | static int client_finished(SSL *s) | 706 | /* SSL2_ST_SEND_CLIENT_MASTER_KEY_B */ |
| 726 | { | 707 | return (ssl2_do_write(s)); |
| 708 | } | ||
| 709 | |||
| 710 | static int | ||
| 711 | client_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 */ |
| 748 | static int client_certificate(SSL *s) | 732 | static int |
| 749 | { | 733 | client_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 | ||
| 899 | static int get_server_verify(SSL *s) | 870 | static int |
| 900 | { | 871 | get_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 | ||
| 951 | static int get_server_finished(SSL *s) | 917 | static int |
| 952 | { | 918 | get_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 */ |
| 1027 | int ssl2_set_certificate(SSL *s, int type, int len, const unsigned char *data) | 983 | int |
| 1028 | { | 984 | ssl2_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; |
| 1088 | err: | 1040 | err: |
| 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 | ||
| 1095 | static int ssl_rsa_public_encrypt(SESS_CERT *sc, int len, unsigned char *from, | 1047 | static int |
| 1096 | unsigned char *to, int padding) | 1048 | ssl_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); |
| 1117 | end: | 1068 | end: |
| 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 |
| 1124 | static void *dummy=&dummy; | 1075 | static 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 | ||
| 63 | int ssl2_enc_init(SSL *s, int client) | 63 | int |
| 64 | { | 64 | ssl2_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); |
| 113 | err: | 111 | err: |
| 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 */ |
| 121 | void ssl2_enc(SSL *s, int send) | 119 | void |
| 122 | { | 120 | ssl2_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 | ||
| 151 | void ssl2_mac(SSL *s, unsigned char *md, int send) | 148 | void |
| 152 | { | 149 | ssl2_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 |
| 190 | static void *dummy=&dummy; | 187 | static 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) */ |
| 124 | OPENSSL_GLOBAL const SSL_CIPHER ssl2_ciphers[]={ | 124 | OPENSSL_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 | ||
| 296 | long ssl2_default_timeout(void) | 296 | long |
| 297 | { | 297 | ssl2_default_timeout(void) |
| 298 | return(300); | 298 | { |
| 299 | } | 299 | return (300); |
| 300 | 300 | } | |
| 301 | int ssl2_num_ciphers(void) | 301 | |
| 302 | { | 302 | int |
| 303 | return(SSL2_NUM_CIPHERS); | 303 | ssl2_num_ciphers(void) |
| 304 | } | 304 | { |
| 305 | 305 | return (SSL2_NUM_CIPHERS); | |
| 306 | const SSL_CIPHER *ssl2_get_cipher(unsigned int u) | 306 | } |
| 307 | { | 307 | |
| 308 | const 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 | ||
| 314 | int ssl2_pending(const SSL *s) | 317 | int |
| 315 | { | 318 | ssl2_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 | ||
| 319 | int ssl2_new(SSL *s) | 323 | int |
| 320 | { | 324 | ssl2_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); |
| 340 | err: | 348 | err: |
| 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 | ||
| 350 | void ssl2_free(SSL *s) | 359 | void |
| 351 | { | 360 | ssl2_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 | ||
| 365 | void ssl2_clear(SSL *s) | 377 | void |
| 366 | { | 378 | ssl2_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 | ||
| 385 | long ssl2_ctrl(SSL *s, int cmd, long larg, void *parg) | 398 | long |
| 386 | { | 399 | ssl2_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 | |||
| 400 | long ssl2_callback_ctrl(SSL *s, int cmd, void (*fp)(void)) | ||
| 401 | { | ||
| 402 | return(0); | ||
| 403 | } | ||
| 404 | |||
| 405 | long ssl2_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) | ||
| 406 | { | ||
| 407 | return(0); | ||
| 408 | } | ||
| 409 | |||
| 410 | long ssl2_ctx_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)(void)) | ||
| 411 | { | ||
| 412 | return(0); | ||
| 413 | } | 409 | } |
| 410 | return (ret); | ||
| 411 | } | ||
| 412 | |||
| 413 | long | ||
| 414 | ssl2_callback_ctrl(SSL *s, int cmd, void (*fp)(void)) | ||
| 415 | { | ||
| 416 | return (0); | ||
| 417 | } | ||
| 418 | |||
| 419 | long | ||
| 420 | ssl2_ctx_ctrl(SSL_CTX *ctx, int cmd, long larg, void *parg) | ||
| 421 | { | ||
| 422 | return (0); | ||
| 423 | } | ||
| 424 | |||
| 425 | long | ||
| 426 | ssl2_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 */ |
| 417 | const SSL_CIPHER *ssl2_get_cipher_by_char(const unsigned char *p) | 433 | const 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 | ||
| 433 | int ssl2_put_cipher_by_char(const SSL_CIPHER *c, unsigned char *p) | 450 | int |
| 434 | { | 451 | ssl2_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 | ||
| 448 | int ssl2_generate_key_material(SSL *s) | 466 | int |
| 449 | { | 467 | ssl2_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 | ||
| 503 | void ssl2_return_error(SSL *s, int err) | 519 | void |
| 504 | { | 520 | ssl2_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 | ||
| 515 | void ssl2_write_error(SSL *s) | 531 | void |
| 516 | { | 532 | ssl2_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 | |||
| 545 | int ssl2_shutdown(SSL *s) | ||
| 546 | { | ||
| 547 | s->shutdown=(SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN); | ||
| 548 | return(1); | ||
| 549 | } | 558 | } |
| 559 | } | ||
| 560 | |||
| 561 | int | ||
| 562 | ssl2_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 |
| 553 | static void *dummy=&dummy; | 570 | static 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 | ||
| 64 | static const SSL_METHOD *ssl2_get_method(int ver); | 64 | static const SSL_METHOD *ssl2_get_method(int ver); |
| 65 | static const SSL_METHOD *ssl2_get_method(int ver) | 65 | static 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 | ||
| 73 | IMPLEMENT_ssl2_meth_func(SSLv2_method, | 74 | IMPLEMENT_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 |
| 81 | static void *dummy=&dummy; | 80 | static 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 | ||
| 117 | static int read_n(SSL *s,unsigned int n,unsigned int max,unsigned int extend); | 117 | static int read_n(SSL *s, unsigned int n, unsigned int max, unsigned int extend); |
| 118 | static int n_do_ssl_write(SSL *s, const unsigned char *buf, unsigned int len); | 118 | static int n_do_ssl_write(SSL *s, const unsigned char *buf, unsigned int len); |
| 119 | static int write_pending(SSL *s, const unsigned char *buf, unsigned int len); | 119 | static int write_pending(SSL *s, const unsigned char *buf, unsigned int len); |
| 120 | static int ssl_mt_error(int n); | 120 | static 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 | */ |
| 126 | static int ssl2_read_internal(SSL *s, void *buf, int len, int peek) | 126 | static int |
| 127 | { | 127 | ssl2_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 | ||
| 307 | int ssl2_read(SSL *s, void *buf, int len) | 292 | int |
| 308 | { | 293 | ssl2_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 | ||
| 312 | int ssl2_peek(SSL *s, void *buf, int len) | 298 | int |
| 313 | { | 299 | ssl2_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 | ||
| 317 | static int read_n(SSL *s, unsigned int n, unsigned int max, | 304 | static int |
| 318 | unsigned int extend) | 305 | read_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 | ||
| 416 | int ssl2_write(SSL *s, const void *_buf, int len) | 390 | int |
| 417 | { | 391 | ssl2_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 | ||
| 467 | static int write_pending(SSL *s, const unsigned char *buf, unsigned int len) | 438 | static int |
| 468 | { | 439 | write_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 | ||
| 514 | static int n_do_ssl_write(SSL *s, const unsigned char *buf, unsigned int len) | 480 | static int |
| 515 | { | 481 | n_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 | ||
| 655 | int ssl2_part_read(SSL *s, unsigned long f, int i) | 613 | int |
| 656 | { | 614 | ssl2_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 | ||
| 694 | int ssl2_do_write(SSL *s) | 648 | int |
| 695 | { | 649 | ssl2_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) | |
| 712 | static 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 | |||
| 666 | static int | ||
| 667 | ssl_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 |
| 739 | static void *dummy=&dummy; | 693 | static 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 @@ | |||
| 120 | static const SSL_METHOD *ssl2_get_server_method(int ver); | 120 | static const SSL_METHOD *ssl2_get_server_method(int ver); |
| 121 | static int get_client_master_key(SSL *s); | 121 | static int get_client_master_key(SSL *s); |
| 122 | static int get_client_hello(SSL *s); | 122 | static int get_client_hello(SSL *s); |
| 123 | static int server_hello(SSL *s); | 123 | static int server_hello(SSL *s); |
| 124 | |||
| 124 | static int get_client_finished(SSL *s); | 125 | static int get_client_finished(SSL *s); |
| 125 | static int server_verify(SSL *s); | 126 | static int server_verify(SSL *s); |
| 126 | static int server_finish(SSL *s); | 127 | static int server_finish(SSL *s); |
| 127 | static int request_certificate(SSL *s); | 128 | static int request_certificate(SSL *s); |
| 128 | static int ssl_rsa_private_decrypt(CERT *c, int len, unsigned char *from, | 129 | static int |
| 129 | unsigned char *to,int padding); | 130 | ssl_rsa_private_decrypt(CERT *c, int len, unsigned char *from, |
| 131 | unsigned char *to, int padding); | ||
| 130 | #define BREAK break | 132 | #define BREAK break |
| 131 | 133 | ||
| 132 | static const SSL_METHOD *ssl2_get_server_method(int ver) | 134 | static 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 | ||
| 140 | IMPLEMENT_ssl2_meth_func(SSLv2_server_method, | 143 | IMPLEMENT_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) | 146 | int |
| 144 | 147 | ssl2_accept(SSL *s) | |
| 145 | int 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 | } | ||
| 357 | end: | 363 | end: |
| 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 | ||
| 364 | static int get_client_master_key(SSL *s) | 370 | static int |
| 365 | { | 371 | get_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; | |
| 521 | static 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 | |||
| 514 | static int | ||
| 515 | get_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); | ||
| 692 | mem_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); | |
| 697 | static int server_hello(SSL *s) | 666 | return (1); |
| 698 | { | 667 | mem_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) | 672 | static int |
| 704 | { | 673 | server_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 | ||
| 811 | static int get_client_finished(SSL *s) | 781 | return (ssl2_do_write(s)); |
| 812 | { | 782 | } |
| 783 | |||
| 784 | static int | ||
| 785 | get_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 | ||
| 870 | static int server_verify(SSL *s) | 836 | static int |
| 871 | { | 837 | server_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 | ||
| 893 | static int server_finish(SSL *s) | 858 | static int |
| 894 | { | 859 | server_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 */ |
| 920 | static int request_certificate(SSL *s) | 884 | static int |
| 921 | { | 885 | request_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 | { | ||
| 1109 | msg_end: | 1056 | msg_end: |
| 1110 | ssl2_return_error(s,SSL2_PE_BAD_CERTIFICATE); | 1057 | ssl2_return_error(s, SSL2_PE_BAD_CERTIFICATE); |
| 1111 | } | 1058 | } |
| 1112 | end: | 1059 | end: |
| 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 | ||
| 1118 | static int ssl_rsa_private_decrypt(CERT *c, int len, unsigned char *from, | 1065 | static int |
| 1119 | unsigned char *to, int padding) | 1066 | ssl_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 |
| 1145 | static void *dummy=&dummy; | 1091 | static void *dummy = &dummy; |
| 1146 | # endif | 1092 | # endif |
| 1147 | 1093 | ||
| 1148 | #endif | 1094 | #endif |
