📄 ssl_lib.c
字号:
} if ((s->rbio != NULL) && (s->rbio != rbio)) BIO_free_all(s->rbio); if ((s->wbio != NULL) && (s->wbio != wbio) && (s->rbio != s->wbio)) BIO_free_all(s->wbio); s->rbio=rbio; s->wbio=wbio; }BIO *SSL_get_rbio(const SSL *s) { return(s->rbio); }BIO *SSL_get_wbio(const SSL *s) { return(s->wbio); }int SSL_get_fd(const SSL *s) { return(SSL_get_rfd(s)); }int SSL_get_rfd(const SSL *s) { int ret= -1; BIO *b,*r; b=SSL_get_rbio(s); r=BIO_find_type(b,BIO_TYPE_DESCRIPTOR); if (r != NULL) BIO_get_fd(r,&ret); return(ret); }int SSL_get_wfd(const SSL *s) { int ret= -1; BIO *b,*r; b=SSL_get_wbio(s); r=BIO_find_type(b,BIO_TYPE_DESCRIPTOR); if (r != NULL) BIO_get_fd(r,&ret); return(ret); }#ifndef OPENSSL_NO_SOCKint SSL_set_fd(SSL *s,int fd) { int ret=0; BIO *bio=NULL; bio=BIO_new(BIO_s_socket()); if (bio == NULL) { SSLerr(SSL_F_SSL_SET_FD,ERR_R_BUF_LIB); goto err; } BIO_set_fd(bio,fd,BIO_NOCLOSE); SSL_set_bio(s,bio,bio); ret=1;err: return(ret); }int SSL_set_wfd(SSL *s,int fd) { int ret=0; BIO *bio=NULL; if ((s->rbio == NULL) || (BIO_method_type(s->rbio) != BIO_TYPE_SOCKET) || ((int)BIO_get_fd(s->rbio,NULL) != fd)) { bio=BIO_new(BIO_s_socket()); if (bio == NULL) { SSLerr(SSL_F_SSL_SET_WFD,ERR_R_BUF_LIB); goto err; } BIO_set_fd(bio,fd,BIO_NOCLOSE); SSL_set_bio(s,SSL_get_rbio(s),bio); } else SSL_set_bio(s,SSL_get_rbio(s),SSL_get_rbio(s)); ret=1;err: return(ret); }int SSL_set_rfd(SSL *s,int fd) { int ret=0; BIO *bio=NULL; if ((s->wbio == NULL) || (BIO_method_type(s->wbio) != BIO_TYPE_SOCKET) || ((int)BIO_get_fd(s->wbio,NULL) != fd)) { bio=BIO_new(BIO_s_socket()); if (bio == NULL) { SSLerr(SSL_F_SSL_SET_RFD,ERR_R_BUF_LIB); goto err; } BIO_set_fd(bio,fd,BIO_NOCLOSE); SSL_set_bio(s,bio,SSL_get_wbio(s)); } else SSL_set_bio(s,SSL_get_wbio(s),SSL_get_wbio(s)); ret=1;err: return(ret); }#endif/* return length of latest Finished message we sent, copy to 'buf' */size_t SSL_get_finished(const SSL *s, void *buf, size_t count) { size_t ret = 0; if (s->s3 != NULL) { ret = s->s3->tmp.finish_md_len; if (count > ret) count = ret; memcpy(buf, s->s3->tmp.finish_md, count); } return ret; }/* return length of latest Finished message we expected, copy to 'buf' */size_t SSL_get_peer_finished(const SSL *s, void *buf, size_t count) { size_t ret = 0; if (s->s3 != NULL) { ret = s->s3->tmp.peer_finish_md_len; if (count > ret) count = ret; memcpy(buf, s->s3->tmp.peer_finish_md, count); } return ret; }int SSL_get_verify_mode(const SSL *s) { return(s->verify_mode); }int SSL_get_verify_depth(const SSL *s) { return X509_VERIFY_PARAM_get_depth(s->param); }int (*SSL_get_verify_callback(const SSL *s))(int,X509_STORE_CTX *) { return(s->verify_callback); }int SSL_CTX_get_verify_mode(const SSL_CTX *ctx) { return(ctx->verify_mode); }int SSL_CTX_get_verify_depth(const SSL_CTX *ctx) { return X509_VERIFY_PARAM_get_depth(ctx->param); }int (*SSL_CTX_get_verify_callback(const SSL_CTX *ctx))(int,X509_STORE_CTX *) { return(ctx->default_verify_callback); }void SSL_set_verify(SSL *s,int mode, int (*callback)(int ok,X509_STORE_CTX *ctx)) { s->verify_mode=mode; if (callback != NULL) s->verify_callback=callback; }void SSL_set_verify_depth(SSL *s,int depth) { X509_VERIFY_PARAM_set_depth(s->param, depth); }void SSL_set_read_ahead(SSL *s,int yes) { s->read_ahead=yes; }int SSL_get_read_ahead(const SSL *s) { return(s->read_ahead); }int SSL_pending(const SSL *s) { /* SSL_pending cannot work properly if read-ahead is enabled * (SSL_[CTX_]ctrl(..., SSL_CTRL_SET_READ_AHEAD, 1, NULL)), * and it is impossible to fix since SSL_pending cannot report * errors that may be observed while scanning the new data. * (Note that SSL_pending() is often used as a boolean value, * so we'd better not return -1.) */ return(s->method->ssl_pending(s)); }X509 *SSL_get_peer_certificate(const SSL *s) { X509 *r; if ((s == NULL) || (s->session == NULL)) r=NULL; else r=s->session->peer; if (r == NULL) return(r); CRYPTO_add(&r->references,1,CRYPTO_LOCK_X509); return(r); }STACK_OF(X509) *SSL_get_peer_cert_chain(const SSL *s) { STACK_OF(X509) *r; if ((s == NULL) || (s->session == NULL) || (s->session->sess_cert == NULL)) r=NULL; else r=s->session->sess_cert->cert_chain; /* If we are a client, cert_chain includes the peer's own * certificate; if we are a server, it does not. */ return(r); }/* Now in theory, since the calling process own 't' it should be safe to * modify. We need to be able to read f without being hassled */void SSL_copy_session_id(SSL *t,const SSL *f) { CERT *tmp; /* Do we need to to SSL locking? */ SSL_set_session(t,SSL_get_session(f)); /* what if we are setup as SSLv2 but want to talk SSLv3 or * vice-versa */ if (t->method != f->method) { t->method->ssl_free(t); /* cleanup current */ t->method=f->method; /* change method */ t->method->ssl_new(t); /* setup new */ } tmp=t->cert; if (f->cert != NULL) { CRYPTO_add(&f->cert->references,1,CRYPTO_LOCK_SSL_CERT); t->cert=f->cert; } else t->cert=NULL; if (tmp != NULL) ssl_cert_free(tmp); SSL_set_session_id_context(t,f->sid_ctx,f->sid_ctx_length); }/* Fix this so it checks all the valid key/cert options */int SSL_CTX_check_private_key(const SSL_CTX *ctx) { if ( (ctx == NULL) || (ctx->cert == NULL) || (ctx->cert->key->x509 == NULL)) { SSLerr(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED); return(0); } if (ctx->cert->key->privatekey == NULL) { SSLerr(SSL_F_SSL_CTX_CHECK_PRIVATE_KEY,SSL_R_NO_PRIVATE_KEY_ASSIGNED); return(0); } return(X509_check_private_key(ctx->cert->key->x509, ctx->cert->key->privatekey)); }/* Fix this function so that it takes an optional type parameter */int SSL_check_private_key(const SSL *ssl) { if (ssl == NULL) { SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,ERR_R_PASSED_NULL_PARAMETER); return(0); } if (ssl->cert == NULL) { SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED); return 0; } if (ssl->cert->key->x509 == NULL) { SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,SSL_R_NO_CERTIFICATE_ASSIGNED); return(0); } if (ssl->cert->key->privatekey == NULL) { SSLerr(SSL_F_SSL_CHECK_PRIVATE_KEY,SSL_R_NO_PRIVATE_KEY_ASSIGNED); return(0); } return(X509_check_private_key(ssl->cert->key->x509, ssl->cert->key->privatekey)); }int SSL_accept(SSL *s) { if (s->handshake_func == 0) /* Not properly initialized yet */ SSL_set_accept_state(s); return(s->method->ssl_accept(s)); }int SSL_connect(SSL *s) { if (s->handshake_func == 0) /* Not properly initialized yet */ SSL_set_connect_state(s); return(s->method->ssl_connect(s)); }long SSL_get_default_timeout(const SSL *s) { return(s->method->get_timeout()); }int SSL_read(SSL *s,void *buf,int num) { if (s->handshake_func == 0) { SSLerr(SSL_F_SSL_READ, SSL_R_UNINITIALIZED); return -1; } if (s->shutdown & SSL_RECEIVED_SHUTDOWN) { s->rwstate=SSL_NOTHING; return(0); } return(s->method->ssl_read(s,buf,num)); }int SSL_peek(SSL *s,void *buf,int num) { if (s->handshake_func == 0) { SSLerr(SSL_F_SSL_PEEK, SSL_R_UNINITIALIZED); return -1; } if (s->shutdown & SSL_RECEIVED_SHUTDOWN) { return(0); } return(s->method->ssl_peek(s,buf,num)); }int SSL_write(SSL *s,const void *buf,int num) { if (s->handshake_func == 0) { SSLerr(SSL_F_SSL_WRITE, SSL_R_UNINITIALIZED); return -1; } if (s->shutdown & SSL_SENT_SHUTDOWN) { s->rwstate=SSL_NOTHING; SSLerr(SSL_F_SSL_WRITE,SSL_R_PROTOCOL_IS_SHUTDOWN); return(-1); } return(s->method->ssl_write(s,buf,num)); }int SSL_shutdown(SSL *s) { /* Note that this function behaves differently from what one might * expect. Return values are 0 for no success (yet), * 1 for success; but calling it once is usually not enough, * even if blocking I/O is used (see ssl3_shutdown). */ if (s->handshake_func == 0) { SSLerr(SSL_F_SSL_SHUTDOWN, SSL_R_UNINITIALIZED); return -1; } if ((s != NULL) && !SSL_in_init(s)) return(s->method->ssl_shutdown(s)); else return(1); }int SSL_renegotiate(SSL *s) { if (s->new_session == 0) { s->new_session=1; } return(s->method->ssl_renegotiate(s)); }int SSL_renegotiate_pending(SSL *s) { /* becomes true when negotiation is requested; * false again once a handshake has finished */ return (s->new_session != 0); }long SSL_ctrl(SSL *s,int cmd,long larg,void *parg) { long l; switch (cmd) { case SSL_CTRL_GET_READ_AHEAD: return(s->read_ahead); case SSL_CTRL_SET_READ_AHEAD: l=s->read_ahead; s->read_ahead=larg; return(l); case SSL_CTRL_SET_MSG_CALLBACK_ARG: s->msg_callback_arg = parg; return 1; case SSL_CTRL_OPTIONS: return(s->options|=larg); case SSL_CTRL_MODE: return(s->mode|=larg); case SSL_CTRL_GET_MAX_CERT_LIST: return(s->max_cert_list); case SSL_CTRL_SET_MAX_CERT_LIST: l=s->max_cert_list; s->max_cert_list=larg; return(l); case SSL_CTRL_SET_MTU: if (SSL_version(s) == DTLS1_VERSION) { s->d1->mtu = larg; return larg; } return 0; default: return(s->method->ssl_ctrl(s,cmd,larg,parg)); } }long SSL_callback_ctrl(SSL *s, int cmd, void (*fp)(void)) { switch(cmd) { case SSL_CTRL_SET_MSG_CALLBACK: s->msg_callback = (void (*)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg))(fp); return 1; default: return(s->method->ssl_callback_ctrl(s,cmd,fp)); } }struct lhash_st *SSL_CTX_sessions(SSL_CTX *ctx) { return ctx->sessions; }long SSL_CTX_ctrl(SSL_CTX *ctx,int cmd,long larg,void *parg) { long l; switch (cmd) { case SSL_CTRL_GET_READ_AHEAD: return(ctx->read_ahead); case SSL_CTRL_SET_READ_AHEAD: l=ctx->read_ahead; ctx->read_ahead=larg; return(l); case SSL_CTRL_SET_MSG_CALLBACK_ARG: ctx->msg_callback_arg = parg; return 1; case SSL_CTRL_GET_MAX_CERT_LIST: return(ctx->max_cert_list); case SSL_CTRL_SET_MAX_CERT_LIST: l=ctx->max_cert_list; ctx->max_cert_list=larg; return(l); case SSL_CTRL_SET_SESS_CACHE_SIZE: l=ctx->session_cache_size; ctx->session_cache_size=larg; return(l); case SSL_CTRL_GET_SESS_CACHE_SIZE: return(ctx->session_cache_size); case SSL_CTRL_SET_SESS_CACHE_MODE: l=ctx->session_cache_mode; ctx->session_cache_mode=larg; return(l); case SSL_CTRL_GET_SESS_CACHE_MODE: return(ctx->session_cache_mode); case SSL_CTRL_SESS_NUMBER: return(ctx->sessions->num_items); case SSL_CTRL_SESS_CONNECT:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -