ssl_lib.c
来自「一个用于点对点传输加密的工具包源码」· C语言 代码 · 共 2,062 行 · 第 1/4 页
C
2,062 行
return ret; }int SSL_get_verify_mode(SSL *s) { return(s->verify_mode); }int SSL_get_verify_depth(SSL *s) { return(s->verify_depth); }int (*SSL_get_verify_callback(SSL *s))(int,X509_STORE_CTX *) { return(s->verify_callback); }int SSL_CTX_get_verify_mode(SSL_CTX *ctx) { return(ctx->verify_mode); }int SSL_CTX_get_verify_depth(SSL_CTX *ctx) { return(ctx->verify_depth); }int (*SSL_CTX_get_verify_callback(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) { s->verify_depth=depth; }void SSL_set_read_ahead(SSL *s,int yes) { s->read_ahead=yes; }int SSL_get_read_ahead(SSL *s) { return(s->read_ahead); }int SSL_pending(SSL *s) { return(s->method->ssl_pending(s)); }X509 *SSL_get_peer_certificate(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(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,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(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(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(SSL *s) { return(s->method->get_timeout()); }int SSL_read(SSL *s,char *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,char *buf,int num) { if (s->shutdown & SSL_RECEIVED_SHUTDOWN) { return(0); } return(s->method->ssl_peek(s,buf,num)); }int SSL_write(SSL *s,const char *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) { s->new_session=1; return(s->method->ssl_renegotiate(s)); }long SSL_ctrl(SSL *s,int cmd,long larg,char *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_OPTIONS: return(s->options|=larg); case SSL_CTRL_MODE: return(s->mode|=larg); default: return(s->method->ssl_ctrl(s,cmd,larg,parg)); } }long SSL_callback_ctrl(SSL *s, int cmd, void (*fp)()) { switch(cmd) { 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,char *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_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: return(ctx->stats.sess_connect); case SSL_CTRL_SESS_CONNECT_GOOD: return(ctx->stats.sess_connect_good); case SSL_CTRL_SESS_CONNECT_RENEGOTIATE: return(ctx->stats.sess_connect_renegotiate); case SSL_CTRL_SESS_ACCEPT: return(ctx->stats.sess_accept); case SSL_CTRL_SESS_ACCEPT_GOOD: return(ctx->stats.sess_accept_good); case SSL_CTRL_SESS_ACCEPT_RENEGOTIATE: return(ctx->stats.sess_accept_renegotiate); case SSL_CTRL_SESS_HIT: return(ctx->stats.sess_hit); case SSL_CTRL_SESS_CB_HIT: return(ctx->stats.sess_cb_hit); case SSL_CTRL_SESS_MISSES: return(ctx->stats.sess_miss); case SSL_CTRL_SESS_TIMEOUTS: return(ctx->stats.sess_timeout); case SSL_CTRL_SESS_CACHE_FULL: return(ctx->stats.sess_cache_full); case SSL_CTRL_OPTIONS: return(ctx->options|=larg); case SSL_CTRL_MODE: return(ctx->mode|=larg); default: return(ctx->method->ssl_ctx_ctrl(ctx,cmd,larg,parg)); } }long SSL_CTX_callback_ctrl(SSL_CTX *ctx, int cmd, void (*fp)()) { switch(cmd) { default: return(ctx->method->ssl_ctx_callback_ctrl(ctx,cmd,fp)); } }int ssl_cipher_id_cmp(const SSL_CIPHER *a, const SSL_CIPHER *b) { long l; l=a->id-b->id; if (l == 0L) return(0); else return((l > 0)?1:-1); }int ssl_cipher_ptr_id_cmp(const SSL_CIPHER * const *ap, const SSL_CIPHER * const *bp) { long l; l=(*ap)->id-(*bp)->id; if (l == 0L) return(0); else return((l > 0)?1:-1); }/** return a STACK of the ciphers available for the SSL and in order of * preference */STACK_OF(SSL_CIPHER) *SSL_get_ciphers(SSL *s) { if ((s != NULL) && (s->cipher_list != NULL)) { return(s->cipher_list); } else if ((s->ctx != NULL) && (s->ctx->cipher_list != NULL)) { return(s->ctx->cipher_list); } return(NULL); }/** return a STACK of the ciphers available for the SSL and in order of * algorithm id */STACK_OF(SSL_CIPHER) *ssl_get_ciphers_by_id(SSL *s) { if ((s != NULL) && (s->cipher_list_by_id != NULL)) { return(s->cipher_list_by_id); } else if ((s != NULL) && (s->ctx != NULL) && (s->ctx->cipher_list_by_id != NULL)) { return(s->ctx->cipher_list_by_id); } return(NULL); }/** The old interface to get the same thing as SSL_get_ciphers() */const char *SSL_get_cipher_list(SSL *s,int n) { SSL_CIPHER *c; STACK_OF(SSL_CIPHER) *sk; if (s == NULL) return(NULL); sk=SSL_get_ciphers(s); if ((sk == NULL) || (sk_SSL_CIPHER_num(sk) <= n)) return(NULL); c=sk_SSL_CIPHER_value(sk,n); if (c == NULL) return(NULL); return(c->name); }/** specify the ciphers to be used by default by the SSL_CTX */int SSL_CTX_set_cipher_list(SSL_CTX *ctx, const char *str) { STACK_OF(SSL_CIPHER) *sk; sk=ssl_create_cipher_list(ctx->method,&ctx->cipher_list, &ctx->cipher_list_by_id,str);/* XXXX */ return((sk == NULL)?0:1); }/** specify the ciphers to be used by the SSL */int SSL_set_cipher_list(SSL *s,const char *str) { STACK_OF(SSL_CIPHER) *sk; sk=ssl_create_cipher_list(s->ctx->method,&s->cipher_list, &s->cipher_list_by_id,str);/* XXXX */ return((sk == NULL)?0:1); }/* works well for SSLv2, not so good for SSLv3 */char *SSL_get_shared_ciphers(SSL *s,char *buf,int len) { char *p; const char *cp; STACK_OF(SSL_CIPHER) *sk; SSL_CIPHER *c; int i; if ((s->session == NULL) || (s->session->ciphers == NULL) || (len < 2)) return(NULL); p=buf; sk=s->session->ciphers; for (i=0; i<sk_SSL_CIPHER_num(sk); i++) { /* Decrement for either the ':' or a '\0' */ len--; c=sk_SSL_CIPHER_value(sk,i); for (cp=c->name; *cp; ) { if (len-- == 0) { *p='\0'; return(buf); } else *(p++)= *(cp++); } *(p++)=':'; } p[-1]='\0'; return(buf); }int ssl_cipher_list_to_bytes(SSL *s,STACK_OF(SSL_CIPHER) *sk,unsigned char *p) { int i,j=0; SSL_CIPHER *c; unsigned char *q; if (sk == NULL) return(0); q=p; for (i=0; i<sk_SSL_CIPHER_num(sk); i++) { c=sk_SSL_CIPHER_value(sk,i); j=ssl_put_cipher_by_char(s,c,p); p+=j; } return(p-q); }STACK_OF(SSL_CIPHER) *ssl_bytes_to_cipher_list(SSL *s,unsigned char *p,int num, STACK_OF(SSL_CIPHER) **skp) { SSL_CIPHER *c; STACK_OF(SSL_CIPHER) *sk; int i,n; n=ssl_put_cipher_by_char(s,NULL,NULL);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?