tls.c
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:6k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * tls.c
  3.  *****************************************************************************
  4.  * Copyright © 2004-2007 Rémi Denis-Courmont
  5.  * $Id: b3ca2fe680caa1909b25ed8d0011d4073f4f0b84 $
  6.  *
  7.  * Authors: Rémi Denis-Courmont <rem # videolan.org>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  22.  *****************************************************************************/
  23. /**
  24.  * @file
  25.  * libvlc interface to the Transport Layer Security (TLS) plugins.
  26.  */
  27. #ifdef HAVE_CONFIG_H
  28. # include "config.h"
  29. #endif
  30. #include <vlc_common.h>
  31. #include "libvlc.h"
  32. #include <vlc_tls.h>
  33. /**
  34.  * Allocates a whole server's TLS credentials.
  35.  *
  36.  * @param cert_path required (Unicode) path to an x509 certificate,
  37.  *                  if NULL, anonymous key exchange will be used.
  38.  * @param key_path (UTF-8) path to the PKCS private key for the certificate,
  39.  *                 if NULL; cert_path will be used.
  40.  *
  41.  * @return NULL on error.
  42.  */
  43. tls_server_t *
  44. tls_ServerCreate (vlc_object_t *obj, const char *cert_path,
  45.                   const char *key_path)
  46. {
  47.     tls_server_t *srv;
  48.     srv = (tls_server_t *)vlc_custom_create (obj, sizeof (*srv),
  49.                                              VLC_OBJECT_GENERIC,
  50.                                              "tls server");
  51.     if (srv == NULL)
  52.         return NULL;
  53.     var_Create (srv, "tls-x509-cert", VLC_VAR_STRING);
  54.     var_Create (srv, "tls-x509-key", VLC_VAR_STRING);
  55.     if (cert_path != NULL)
  56.     {
  57.         var_SetString (srv, "tls-x509-cert", cert_path);
  58.         if (key_path == NULL)
  59.             key_path = cert_path;
  60.         var_SetString (srv, "tls-x509-key", key_path);
  61.     }
  62.     srv->p_module = module_need (srv, "tls server", NULL, false );
  63.     if (srv->p_module == NULL)
  64.     {
  65.         msg_Err (srv, "TLS server plugin not available");
  66.         vlc_object_release (srv);
  67.         return NULL;
  68.     }
  69.     vlc_object_attach (srv, obj);
  70.     msg_Dbg (srv, "TLS server plugin initialized");
  71.     return srv;
  72. }
  73. /**
  74.  * Releases data allocated with tls_ServerCreate.
  75.  * @param srv TLS server object to be destroyed, or NULL
  76.  */
  77. void tls_ServerDelete (tls_server_t *srv)
  78. {
  79.     if (srv == NULL)
  80.         return;
  81.     module_unneed (srv, srv->p_module);
  82.     vlc_object_detach (srv);
  83.     vlc_object_release (srv);
  84. }
  85. /**
  86.  * Adds one or more certificate authorities from a file.
  87.  * @return -1 on error, 0 on success.
  88.  */
  89. int tls_ServerAddCA (tls_server_t *srv, const char *path)
  90. {
  91.     return srv->pf_add_CA (srv, path);
  92. }
  93. /**
  94.  * Adds one or more certificate revocation list from a file.
  95.  * @return -1 on error, 0 on success.
  96.  */
  97. int tls_ServerAddCRL (tls_server_t *srv, const char *path)
  98. {
  99.     return srv->pf_add_CRL (srv, path);
  100. }
  101. tls_session_t *tls_ServerSessionPrepare (tls_server_t *srv)
  102. {
  103.     tls_session_t *ses;
  104.     ses = srv->pf_open (srv);
  105.     if (ses == NULL)
  106.         return NULL;
  107.     vlc_object_attach (ses, srv);
  108.     return ses;
  109. }
  110. void tls_ServerSessionClose (tls_session_t *ses)
  111. {
  112.     tls_server_t *srv = (tls_server_t *)(ses->p_parent);
  113.     srv->pf_close (srv, ses);
  114. }
  115. int tls_ServerSessionHandshake (tls_session_t *ses, int fd)
  116. {
  117.     ses->pf_set_fd (ses, fd);
  118.     return 2;
  119. }
  120. int tls_SessionContinueHandshake (tls_session_t *ses)
  121. {
  122.     int val = ses->pf_handshake (ses);
  123.     if (val < 0)
  124.         tls_ServerSessionClose (ses);
  125.     return val;
  126. }
  127. /**
  128.  * Allocates a client's TLS credentials and shakes hands through the network.
  129.  * This is a blocking network operation.
  130.  *
  131.  * @param fd stream socket through which to establish the secure communication
  132.  * layer.
  133.  * @param psz_hostname Server Name Indication to pass to the server, or NULL.
  134.  *
  135.  * @return NULL on error.
  136.  **/
  137. tls_session_t *
  138. tls_ClientCreate (vlc_object_t *obj, int fd, const char *psz_hostname)
  139. {
  140.     tls_session_t *cl;
  141.     int val;
  142.     cl = (tls_session_t *)vlc_custom_create (obj, sizeof (*cl),
  143.                                              VLC_OBJECT_GENERIC,
  144.                                              "tls client");
  145.     if (cl == NULL)
  146.         return NULL;
  147.     var_Create (cl, "tls-server-name", VLC_VAR_STRING);
  148.     if (psz_hostname != NULL)
  149.     {
  150.         msg_Dbg (cl, "requested server name: %s", psz_hostname);
  151.         var_SetString (cl, "tls-server-name", psz_hostname);
  152.     }
  153.     else
  154.         msg_Dbg (cl, "requested anonymous server");
  155.     cl->p_module = module_need (cl, "tls client", NULL, false );
  156.     if (cl->p_module == NULL)
  157.     {
  158.         msg_Err (cl, "TLS client plugin not available");
  159.         vlc_object_release (cl);
  160.         return NULL;
  161.     }
  162.     cl->pf_set_fd (cl, fd);
  163.     do
  164.         val = cl->pf_handshake (cl);
  165.     while (val > 0);
  166.     if (val == 0)
  167.     {
  168.         msg_Dbg (cl, "TLS client session initialized");
  169.         vlc_object_attach (cl, obj);
  170.         return cl;
  171.     }
  172.     msg_Err (cl, "TLS client session handshake error");
  173.     module_unneed (cl, cl->p_module);
  174.     vlc_object_release (cl);
  175.     return NULL;
  176. }
  177. /**
  178.  * Releases data allocated with tls_ClientCreate.
  179.  * It is your job to close the underlying socket.
  180.  */
  181. void tls_ClientDelete (tls_session_t *cl)
  182. {
  183.     if (cl == NULL)
  184.         return;
  185.     module_unneed (cl, cl->p_module);
  186.     vlc_object_detach (cl);
  187.     vlc_object_release (cl);
  188. }