亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ssl.c

?? 一個開源的VPN原碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
/* *  OpenVPN -- An application to securely tunnel IP networks *             over a single UDP port, with support for TLS-based *             session authentication and key exchange, *             packet encryption, packet authentication, and *             packet compression. * *  Copyright (C) 2002 James Yonan <jim@yonan.net> * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program (see the file COPYING included with this *  distribution); if not, write to the Free Software Foundation, Inc., *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA *//* * The routines in this file deal with dynamically negotiating * the data channel HMAC and cipher keys through a TLS session. * * Both the TLS session and the data channel are multiplexed * over the same UDP port. */#include "config.h"#if defined(USE_CRYPTO) && defined(USE_SSL)#include "syshead.h"#include "ssl.h"#include "error.h"#include "common.h"#include "socket.h"#include "thread.h"#include "misc.h"#include "fdmisc.h"#include "interval.h"#include "memdbg.h"#ifdef BIO_DEBUGstatic FILE *biofp;static bool biofp_toggle;static time_t biofp_last_open;static const int biofp_reopen_interval = 600;static voidclose_biofp(){  if (biofp)    {      ASSERT (!fclose (biofp));      biofp = NULL;    }}static voidopen_biofp(){  const time_t current = time (NULL);  const pid_t pid = getpid ();  if (biofp_last_open + biofp_reopen_interval < current)    close_biofp();  if (!biofp)    {      char fn[256];      snprintf(fn, sizeof(fn), "bio/%d-%d.log", pid, biofp_toggle);      biofp = fopen (fn, "w");      ASSERT (biofp);      biofp_last_open = time (NULL);      biofp_toggle ^= 1;    }}static voidbio_debug_data (const char *mode, BIO *bio, uint8_t *buf, int len, const char *desc){  if (len > 0)    {      open_biofp();      fprintf(biofp, "BIO_%s %s time=" time_format " bio=" ptr_format " len=%d data=%s\n",	      mode, desc, time (NULL), bio, len, format_hex (buf, len, 0));      fflush (biofp);    }}static voidbio_debug_oc (const char *mode, BIO *bio){  open_biofp();  fprintf(biofp, "BIO %s time=" time_format " bio=" ptr_format "\n",	  mode, time (NULL), bio);  fflush (biofp);}#endif/* * Max number of bytes we will add * for data structures common to both * data and control channel packets. * (opcode only).  */voidtls_adjust_frame_parameters(struct frame *frame){  frame->extra_frame += 1; /* space for opcode */}/* * Max number of bytes we will add * to control channel packet.  */static voidtls_init_control_channel_frame_parameters(const struct frame *data_channel_frame,					  struct frame *frame){  /*   * frame->extra_frame is already initialized with tls_auth buffer requirements,   * if --tls-auth is enabled.   */  /* set extra_frame */  tls_adjust_frame_parameters(frame);  reliable_ack_adjust_frame_parameters(frame, CONTROL_SEND_ACK_MAX);  frame->extra_frame += SID_SIZE;  frame->extra_frame += sizeof (packet_id_type);  /* finalize parameters based on data_channel_frame */  frame->mtu = MTU_EXTRA_SIZE (data_channel_frame) - frame->extra_frame;  frame->extra_buffer += frame->extra_frame;}voidinit_ssl_lib (){  SSL_library_init ();  SSL_load_error_strings ();  OpenSSL_add_all_algorithms ();  init_crypto_lib();  /*   * If you build the OpenSSL library and OpenVPN with   * CRYPTO_MDEBUG, you will get a listing of OpenSSL   * memory leaks on program termination.   */#ifdef CRYPTO_MDEBUG  CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);#endif}voidfree_ssl_lib (){#ifdef CRYPTO_MDEBUG  FILE* fp = fopen ("sdlog", "w");  ASSERT (fp);  CRYPTO_mem_leaks_fp (fp);  fclose (fp);#endif  EVP_cleanup ();  ERR_free_strings ();}/* * OpenSSL library calls back here if the private key * is protected by a password. */intpem_password_callback (char *buf, int size, int rwflag, void *u){#ifdef HAVE_GETPASS  static char passbuf[256];  if (!strlen (passbuf))    {      char *gp = getpass ("Enter PEM pass phrase:");      strncpynt (passbuf, gp, sizeof (passbuf));      memset (gp, 0, strlen (gp));    }  if (buf)    {      if (!strlen (passbuf))	msg (M_FATAL, "TLS Error: need PEM password for private key");      strncpynt (buf, passbuf, size);      CLEAR (passbuf);      return strlen (buf);    }#else  msg (M_FATAL, "Sorry but I can't read a password from the console because this operating system or C library doesn't support the getpass() function");#endif  return 0;}/* * OpenSSL callback to get a temporary RSA key, mostly * used for export ciphers. */static RSA *tmp_rsa_cb (SSL * s, int is_export, int keylength){  static RSA *rsa_tmp = NULL;  if (rsa_tmp == NULL)    {      msg (D_HANDSHAKE, "Generating temp (%d bit) RSA key", keylength);      rsa_tmp = RSA_generate_key (keylength, RSA_F4, NULL, NULL);    }  return (rsa_tmp);}/* make cp safe to be passed to system() */static voidsystem_safe_string (char *cp){  int c;  while (c = *cp)    {      if (isalnum (c)	  || c == '/'	  || c == '.' || c == '@' || c == '_' || c == '-' || c == '=')	;      else	*cp = '.';      ++cp;    }}/* * Our verify callback function -- check * that an incoming peer certificate is good. */static const char *verify_command;voidtls_set_verify_command (const char *cmd){  verify_command = cmd;}static intverify_callback (int preverify_ok, X509_STORE_CTX * ctx){  char txt[512];  X509_NAME_oneline (X509_get_subject_name (ctx->current_cert), txt,		     sizeof (txt));  txt[sizeof (txt) - 1] = '\0';  system_safe_string (txt);  if (!preverify_ok)    {      /* Remote site specified a certificate, but it's not correct */      msg (D_TLS_ERRORS, "VERIFY ERROR: depth=%d, error=%s: %s",	   ctx->error_depth, X509_verify_cert_error_string (ctx->error), txt);      return 0;			/* Reject connection */    }  if (verify_command)    {      char command[512];      struct buffer out;      int ret;      buf_set_write (&out, command, sizeof (command));      buf_printf (&out, "%s %d %s", verify_command, ctx->error_depth, txt);      msg (D_TLS_DEBUG, "executing verify command: %s", command);      ret = openvpn_system (command);      if (ret != -1 && WEXITSTATUS (ret) == 0)	{	  msg (D_HANDSHAKE, "VERIFY SCRIPT OK: depth=%d, %s",	       ctx->error_depth, txt);	  return 1;		/* Accept connection */	}      else	{	  if (ret == -1 || WEXITSTATUS (ret) == 127)	    msg (M_ERR, "Verify command failed to execute: %s", command);	  msg (D_HANDSHAKE, "VERIFY SCRIPT ERROR: depth=%d, %s",	       ctx->error_depth, txt);	  return 0;		/* Reject connection */	}    }  else    {      msg (D_HANDSHAKE, "VERIFY OK: depth=%d, %s", ctx->error_depth, txt);      return 1;			/* Accept connection */    }}/* * Print debugging information on SSL/TLS session negotiation. */static voidinfo_callback (INFO_CALLBACK_SSL_CONST SSL * s, int where, int ret){  if (where & SSL_CB_LOOP)    {      msg (D_HANDSHAKE_VERBOSE, "SSL state (%s): %s",	   where & SSL_ST_CONNECT ? "connect" :	   where & SSL_ST_ACCEPT ? "accept" :	   "undefined", SSL_state_string_long (s));    }  else if (where & SSL_CB_ALERT)    {      msg (D_HANDSHAKE_VERBOSE, "SSL alert (%s): %s: %s",	   where & SSL_CB_READ ? "read" : "write",	   SSL_alert_type_string_long (ret),	   SSL_alert_desc_string_long (ret));    }}/* * Initialize SSL context. * All files are in PEM format. */SSL_CTX *init_ssl (bool server,	  const char *ca_file,	  const char *dh_file,	  const char *cert_file,	  const char *priv_key_file,	  const char *cipher_list){  SSL_CTX *ctx;  DH *dh;  BIO *bio;  if (server)    {      ctx = SSL_CTX_new (TLSv1_server_method ());      if (ctx == NULL)	msg (M_SSLERR, "SSL_CTX_new TLSv1_server_method");      SSL_CTX_set_tmp_rsa_callback (ctx, tmp_rsa_cb);      /* Get Diffie Hellman Parameters */      if (!(bio = BIO_new_file (dh_file, "r")))	msg (M_SSLERR, "Cannot open %s for DH parameters", dh_file);      dh = PEM_read_bio_DHparams (bio, NULL, NULL, NULL);      BIO_free (bio);      if (!dh)	msg (M_SSLERR, "Cannot load DH parameters from %s", dh_file);      if (!SSL_CTX_set_tmp_dh (ctx, dh))	msg (M_SSLERR, "SSL_CTX_set_tmp_dh");      msg (D_TLS_DEBUG_LOW, "Diffie-Hellman initialized with %d bit key",	   8 * DH_size (dh));      DH_free (dh);    }  else				/* if client */    {      ctx = SSL_CTX_new (TLSv1_client_method ());      if (ctx == NULL)	msg (M_SSLERR, "SSL_CTX_new TLSv1_client_method");    }  /* Set SSL options */  SSL_CTX_set_session_cache_mode (ctx, SSL_SESS_CACHE_OFF);  SSL_CTX_set_options (ctx, SSL_OP_SINGLE_DH_USE);  /* Set callback for getting password from user to decrypt private key */  SSL_CTX_set_default_passwd_cb (ctx, pem_password_callback);#if 1  /* Load Certificate */  if (!SSL_CTX_use_certificate_file (ctx, cert_file, SSL_FILETYPE_PEM))    msg (M_SSLERR, "Cannot load certificate file %s", cert_file);#else  /* Load Certificate -- for some reason, this function sometimes     inexplicably fails during restarts with a PEM_R_NO_START_LINE     error. */  if (!SSL_CTX_use_certificate_chain_file (ctx, cert_file))    msg (M_SSLERR, "Cannot load certificate chain file %s", cert_file);#endif  /* Load Private Key */  if (!SSL_CTX_use_PrivateKey_file (ctx, priv_key_file, SSL_FILETYPE_PEM))    msg (M_SSLERR, "Cannot load private key file %s", priv_key_file);  warn_if_group_others_accessible (priv_key_file);  /* Check Private Key */  if (!SSL_CTX_check_private_key (ctx))    msg (M_SSLERR, "Private key does not match the certificate");  /* Load CA file for verifying peer supplied certificate */  if (!SSL_CTX_load_verify_locations (ctx, ca_file, NULL))    msg (M_SSLERR, "Cannot load CA certificate file %s (SSL_CTX_load_verify_locations)", ca_file);#if 1  /* Load names of CAs from file and use it as a client CA list */  {    STACK_OF(X509_NAME) *cert_names;    cert_names = SSL_load_client_CA_file (ca_file);    if (!cert_names)      msg (M_SSLERR, "Cannot load CA certificate file %s (SSL_load_client_CA_file)", ca_file);    SSL_CTX_set_client_CA_list (ctx, cert_names);  }#endif  /* Require peer certificate verification */  SSL_CTX_set_verify (ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,		      verify_callback);  /* Connection information callback */  SSL_CTX_set_info_callback (ctx, info_callback);  /* Allowable ciphers */  if (cipher_list)    {      if (!SSL_CTX_set_cipher_list (ctx, cipher_list))	msg (M_SSLERR, "Problem with cipher list: %s", cipher_list);    }  return ctx;}/* * Print a one line summary of SSL/TLS session handshake. */static voidprint_details (SSL * c_ssl, const char *prefix){  SSL_CIPHER *ciph;  X509 *cert;  char s1[256];  char s2[256];  s1[0] = s2[0] = 0;  ciph = SSL_get_current_cipher (c_ssl);  snprintf (s1, sizeof (s1), "%s %s, cipher %s %s",	    prefix,	    SSL_get_version (c_ssl),	    SSL_CIPHER_get_version (ciph), SSL_CIPHER_get_name (ciph));  cert = SSL_get_peer_certificate (c_ssl);  if (cert != NULL)    {      EVP_PKEY *pkey = X509_get_pubkey (cert);      if (pkey != NULL)	{	  if (pkey->type == EVP_PKEY_RSA && pkey->pkey.rsa != NULL	      && pkey->pkey.rsa->n != NULL)	    {	      snprintf (s2, sizeof (s2), ", %d bit RSA",			BN_num_bits (pkey->pkey.rsa->n));	    }	  else if (pkey->type == EVP_PKEY_DSA && pkey->pkey.dsa != NULL		   && pkey->pkey.dsa->p != NULL)	    {	      snprintf (s2, sizeof (s2), ", %d bit DSA",			BN_num_bits (pkey->pkey.dsa->p));	    }	  EVP_PKEY_free (pkey);	}      X509_free (cert);    }  /* The SSL API does not allow us to look at temporary RSA/DH keys,   * otherwise we should print their lengths too */  msg (D_HANDSHAKE, "%s%s", s1, s2);}/* * Show the TLS ciphers that are available for us to use * in the OpenSSL library. */voidshow_available_tls_ciphers (){  SSL_CTX *ctx;  SSL *ssl;  const char *cipher_name;  int priority = 0;  ctx = SSL_CTX_new (TLSv1_method ());  if (!ctx)    msg (M_SSLERR, "Cannot create SSL_CTX object");  ssl = SSL_new (ctx);  if (!ssl)    msg (M_SSLERR, "Cannot create SSL object");  printf ("Available TLS Ciphers,\n");  printf ("listed in order of preference:\n\n");  while (cipher_name = SSL_get_cipher_list (ssl, priority++))

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91黄色在线观看| 国产欧美一区二区精品久导航| 欧美日韩国产三级| 精品粉嫩超白一线天av| 亚洲视频在线观看三级| 麻豆中文一区二区| 欧美日韩和欧美的一区二区| 国产人成亚洲第一网站在线播放| 国产女人aaa级久久久级| 亚洲国产精品一区二区久久恐怖片| 久久成人久久鬼色| 成人欧美一区二区三区在线播放| 免费成人在线观看| 欧美韩国日本一区| 欧美伦理影视网| 成人激情综合网站| 日韩av一二三| 亚洲精品一区二区三区蜜桃下载| 91亚洲永久精品| 国产综合成人久久大片91| 国产精品伦一区二区三级视频| 欧美精品vⅰdeose4hd| 国内久久精品视频| 日本在线观看不卡视频| 亚洲精品乱码久久久久久| 久久你懂得1024| 欧美一区二区三区成人| 99久久精品情趣| 成人app在线观看| 成人免费看的视频| 国产成人欧美日韩在线电影| 久久66热偷产精品| 久久精品二区亚洲w码| 麻豆国产欧美一区二区三区| 免费一区二区视频| 日本不卡视频在线| 蜜桃久久久久久久| 麻豆久久久久久| 久久成人综合网| 国产一区二区三区在线观看精品| 六月丁香综合在线视频| 精品一二线国产| 精品一区二区三区视频| 国产精品白丝jk黑袜喷水| 粉嫩绯色av一区二区在线观看| 国产精品亚洲视频| 99re在线视频这里只有精品| 91麻豆自制传媒国产之光| 日韩综合在线视频| 亚洲一区二区五区| 一区二区三区四区中文字幕| 亚洲va韩国va欧美va精品| 欧美国产欧美亚州国产日韩mv天天看完整| 欧美视频一区二区| 91麻豆123| 91丨九色丨黑人外教| 福利一区二区在线| 国产精品99久久久久久久vr| 日韩成人dvd| 成人小视频免费在线观看| 一区二区三区高清在线| 亚洲综合免费观看高清完整版 | 国产综合色视频| 成人一道本在线| 91在线高清观看| 欧美日韩在线观看一区二区| 日韩欧美一区二区免费| 国产亚洲欧美色| 亚洲欧美一区二区三区孕妇| 亚洲成人自拍网| 国产毛片精品视频| 91久久人澡人人添人人爽欧美| 欧美精品粉嫩高潮一区二区| 久久青草欧美一区二区三区| 亚洲欧美另类久久久精品| 亚洲第一激情av| 国产成人av资源| 欧美日韩三级在线| 欧美高清在线一区二区| 亚洲国产精品久久一线不卡| 国内精品嫩模私拍在线| 在线视频一区二区三区| 久久久久久日产精品| 夜夜精品视频一区二区| 国产精品中文字幕日韩精品| 一本色道亚洲精品aⅴ| 日韩欧美高清一区| 亚洲视频在线观看一区| 久久精品噜噜噜成人88aⅴ| 99精品欧美一区二区蜜桃免费| 欧美麻豆精品久久久久久| 日本一区二区视频在线| 日产国产欧美视频一区精品| va亚洲va日韩不卡在线观看| 精品日韩99亚洲| 亚洲国产成人av| jlzzjlzz欧美大全| 欧美一区三区二区| 一个色妞综合视频在线观看| 丁香另类激情小说| 精品精品国产高清a毛片牛牛| 怡红院av一区二区三区| 国产福利一区二区三区视频在线 | 国产日产欧美一区二区视频| 天堂影院一区二区| 91美女蜜桃在线| 欧美激情一区二区在线| 精品一区二区三区免费播放| 欧美日韩久久不卡| 亚洲曰韩产成在线| 94色蜜桃网一区二区三区| 久久久久久久av麻豆果冻| 蜜桃av一区二区在线观看| 欧美日韩美女一区二区| 一区二区三区中文字幕电影| 成人免费的视频| 亚洲国产高清不卡| 国产成人精品亚洲777人妖| 精品久久人人做人人爰| 日韩高清在线不卡| 欧美精品少妇一区二区三区| 亚洲狼人国产精品| 成人av电影免费观看| 久久这里只有精品6| 韩国女主播成人在线观看| 日韩丝袜情趣美女图片| 免费人成在线不卡| 日韩一区二区三区视频| 日产国产欧美视频一区精品| 欧美日韩国产小视频在线观看| 亚洲综合在线观看视频| 欧美亚洲自拍偷拍| 亚洲国产wwwccc36天堂| 欧美日本一区二区三区四区| 五月婷婷激情综合| 911精品国产一区二区在线| 婷婷成人综合网| 欧美一级免费观看| 久久精品久久久精品美女| 精品国产区一区| 国产精品香蕉一区二区三区| 国产日韩欧美不卡在线| av在线不卡网| 亚洲午夜成aⅴ人片| 91精品欧美久久久久久动漫 | 色一情一乱一乱一91av| 亚洲免费观看高清完整版在线| 91浏览器入口在线观看| 一区二区三区高清在线| 欧美日韩亚洲另类| 日本美女视频一区二区| 精品少妇一区二区三区免费观看| 国产一区二区三区在线观看免费 | 国产自产高清不卡| 亚洲国产成人午夜在线一区| av一二三不卡影片| 亚洲一区自拍偷拍| 欧美一级二级在线观看| 国产精品99久久久久久似苏梦涵| 国产精品天干天干在观线 | 亚洲精品免费在线播放| 亚洲不卡av一区二区三区| 欧美激情一二三区| 久久精品人人做人人综合| 欧美精品18+| 51久久夜色精品国产麻豆| 欧美一区二区视频免费观看| 色噜噜久久综合| 91免费看`日韩一区二区| 成人一级视频在线观看| 国产成人h网站| 欧美日韩中字一区| 国产91丝袜在线观看| 国产精品不卡视频| 欧美三级日韩三级国产三级| 色偷偷久久人人79超碰人人澡| 亚洲国产成人av网| 国产午夜精品一区二区三区视频| 91视频观看免费| 美国欧美日韩国产在线播放| 国产拍欧美日韩视频二区| 欧美日韩国产另类一区| 高潮精品一区videoshd| 午夜精品福利视频网站| 中文一区在线播放| 日韩三级av在线播放| 99国产精品久久| 美女看a上一区| 亚洲精品欧美激情| 国产亚洲一区二区三区在线观看| 欧美综合色免费| 东方aⅴ免费观看久久av| 日韩激情在线观看| 日韩美女精品在线| 久久伊人蜜桃av一区二区| 欧美日韩一区三区| 91丨porny丨首页| 国产美女av一区二区三区| 日韩在线一区二区| 亚洲黄色片在线观看|