⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gnutls.c

📁 uclinux 下的vlc播放器源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
        {            p_session->i_datalen = p_session->i_idlen = 0;            vlc_mutex_unlock( &p_sys->cache_lock );            return 0;        }        p_session++;    }    vlc_mutex_unlock( &p_sys->cache_lock );    return -1;}/** * Initializes a server-side TLS session. */static tls_session_t *gnutls_ServerSessionPrepare( tls_server_t *p_server ){    tls_session_t *p_session;    tls_server_sys_t *p_server_sys;    gnutls_session session;    int i_val;    p_session = vlc_object_create( p_server, sizeof (struct tls_session_t) );    if( p_session == NULL )        return NULL;    p_session->p_sys = malloc( sizeof(struct tls_session_sys_t) );    if( p_session->p_sys == NULL )    {        vlc_object_destroy( p_session );        return NULL;    }    vlc_object_attach( p_session, p_server );    p_server_sys = (tls_server_sys_t *)p_server->p_sys;    p_session->sock.p_sys = p_session;    p_session->sock.pf_send = gnutls_Send;    p_session->sock.pf_recv = gnutls_Recv;    p_session->pf_handshake = gnutls_BeginHandshake;    p_session->pf_handshake2 = p_server_sys->pf_handshake2;    p_session->pf_close = gnutls_SessionClose;    ((tls_session_sys_t *)p_session->p_sys)->b_handshaked = VLC_FALSE;    ((tls_session_sys_t *)p_session->p_sys)->psz_hostname = NULL;    i_val = gnutls_init( &session, GNUTLS_SERVER );    if( i_val != 0 )    {        msg_Err( p_server, "cannot initialize TLS session: %s",                 gnutls_strerror( i_val ) );        goto error;    }    ((tls_session_sys_t *)p_session->p_sys)->session = session;    i_val = gnutls_set_default_priority( session );    if( i_val < 0 )    {        msg_Err( p_server, "cannot set ciphers priorities: %s",                 gnutls_strerror( i_val ) );        gnutls_deinit( session );        goto error;    }    i_val = gnutls_credentials_set( session, GNUTLS_CRD_CERTIFICATE,                                    p_server_sys->x509_cred );    if( i_val < 0 )    {        msg_Err( p_server, "cannot set TLS session credentials: %s",                 gnutls_strerror( i_val ) );        gnutls_deinit( session );        goto error;    }    if( p_session->pf_handshake2 == gnutls_HandshakeAndValidate )        gnutls_certificate_server_set_request( session, GNUTLS_CERT_REQUIRE );    gnutls_dh_set_prime_bits( session, get_Int( p_server, "gnutls-dh-bits" ) );    /* Session resumption support */    gnutls_db_set_cache_expiration( session, get_Int( p_server,                                    "gnutls-cache-expiration" ) );    gnutls_db_set_retrieve_function( session, cb_fetch );    gnutls_db_set_remove_function( session, cb_delete );    gnutls_db_set_store_function( session, cb_store );    gnutls_db_set_ptr( session, p_server );    return p_session;error:    free( p_session->p_sys );    vlc_object_detach( p_session );    vlc_object_destroy( p_session );    return NULL;}/** * Releases data allocated with tls_ServerCreate(). */static voidgnutls_ServerDelete( tls_server_t *p_server ){    tls_server_sys_t *p_sys;    p_sys = (tls_server_sys_t *)p_server->p_sys;    vlc_mutex_destroy( &p_sys->cache_lock );    free( p_sys->p_cache );    vlc_object_detach( p_server );    vlc_object_destroy( p_server );    /* all sessions depending on the server are now deinitialized */    gnutls_certificate_free_credentials( p_sys->x509_cred );    gnutls_dh_params_deinit( p_sys->dh_params );    free( p_sys );}/** * Adds one or more certificate authorities. * * @param psz_ca_path (Unicode) path to an x509 certificates list. * * @return -1 on error, 0 on success. *****************************************************************************/static intgnutls_ServerAddCA( tls_server_t *p_server, const char *psz_ca_path ){    tls_server_sys_t *p_sys;    char *psz_local_path;    int val;    p_sys = (tls_server_sys_t *)(p_server->p_sys);    psz_local_path = ToLocale( psz_ca_path );    val = gnutls_certificate_set_x509_trust_file( p_sys->x509_cred,                                                  psz_local_path,                                                  GNUTLS_X509_FMT_PEM );    LocaleFree( psz_local_path );    if( val < 0 )    {        msg_Err( p_server, "cannot add trusted CA (%s): %s", psz_ca_path,                 gnutls_strerror( val ) );        return VLC_EGENERIC;    }    msg_Dbg( p_server, " %d trusted CA added (%s)", val, psz_ca_path );    /* enables peer's certificate verification */    p_sys->pf_handshake2 = gnutls_HandshakeAndValidate;    return VLC_SUCCESS;}/** * Adds a certificates revocation list to be sent to TLS clients. * * @param psz_crl_path (Unicode) path of the CRL file. * * @return -1 on error, 0 on success. */static intgnutls_ServerAddCRL( tls_server_t *p_server, const char *psz_crl_path ){    int val;    char *psz_local_path = ToLocale( psz_crl_path );    val = gnutls_certificate_set_x509_crl_file( ((tls_server_sys_t *)                                                (p_server->p_sys))->x509_cred,                                                psz_local_path,                                                GNUTLS_X509_FMT_PEM );    LocaleFree( psz_crl_path );    if( val < 0 )    {        msg_Err( p_server, "cannot add CRL (%s): %s", psz_crl_path,                 gnutls_strerror( val ) );        return VLC_EGENERIC;    }    msg_Dbg( p_server, "%d CRL added (%s)", val, psz_crl_path );    return VLC_SUCCESS;}/** * Allocates a whole server's TLS credentials. * * @return NULL on error. */static tls_server_t *gnutls_ServerCreate( tls_t *p_tls, const char *psz_cert_path,                     const char *psz_key_path ){    tls_server_t *p_server;    tls_server_sys_t *p_sys;    char *psz_local_key, *psz_local_cert;    int val;    msg_Dbg( p_tls, "creating TLS server" );    p_sys = (tls_server_sys_t *)malloc( sizeof(struct tls_server_sys_t) );    if( p_sys == NULL )        return NULL;    p_sys->i_cache_size = get_Int( p_tls, "gnutls-cache-size" );    p_sys->p_cache = (struct saved_session_t *)calloc( p_sys->i_cache_size,                                           sizeof( struct saved_session_t ) );    if( p_sys->p_cache == NULL )    {        free( p_sys );        return NULL;    }    p_sys->p_store = p_sys->p_cache;    p_server = vlc_object_create( p_tls, sizeof(struct tls_server_t) );    if( p_server == NULL )    {        free( p_sys->p_cache );        free( p_sys );        return NULL;    }    vlc_object_attach( p_server, p_tls );    p_server->p_sys = p_sys;    p_server->pf_delete = gnutls_ServerDelete;    p_server->pf_add_CA = gnutls_ServerAddCA;    p_server->pf_add_CRL = gnutls_ServerAddCRL;    p_server->pf_session_prepare = gnutls_ServerSessionPrepare;    /* No certificate validation by default */    p_sys->pf_handshake2 = gnutls_ContinueHandshake;    vlc_mutex_init( p_server, &p_sys->cache_lock );    /* Sets server's credentials */    val = gnutls_certificate_allocate_credentials( &p_sys->x509_cred );    if( val != 0 )    {        msg_Err( p_server, "cannot allocate X509 credentials: %s",                 gnutls_strerror( val ) );        goto error;    }    psz_local_cert = ToLocale( psz_cert_path );    psz_local_key = ToLocale( psz_key_path );    val = gnutls_certificate_set_x509_key_file( p_sys->x509_cred,                                                psz_local_cert, psz_local_key,                                                GNUTLS_X509_FMT_PEM );    LocaleFree( psz_cert_path );    LocaleFree( psz_key_path );    if( val < 0 )    {        msg_Err( p_server, "cannot set certificate chain or private key: %s",                 gnutls_strerror( val ) );        gnutls_certificate_free_credentials( p_sys->x509_cred );        goto error;    }    /* FIXME:     * - regenerate these regularly     * - support other ciper suites     */    val = gnutls_dh_params_init( &p_sys->dh_params );    if( val >= 0 )    {        msg_Dbg( p_server, "computing Diffie Hellman ciphers parameters" );        val = gnutls_dh_params_generate2( p_sys->dh_params,                                          get_Int( p_tls, "gnutls-dh-bits" ) );    }    if( val < 0 )    {        msg_Err( p_server, "cannot initialize DH cipher suites: %s",                 gnutls_strerror( val ) );        gnutls_certificate_free_credentials( p_sys->x509_cred );        goto error;    }    msg_Dbg( p_server, "ciphers parameters computed" );    gnutls_certificate_set_dh_params( p_sys->x509_cred, p_sys->dh_params);    return p_server;error:    vlc_mutex_destroy( &p_sys->cache_lock );    vlc_object_detach( p_server );    vlc_object_destroy( p_server );    free( p_sys );    return NULL;}#ifdef LIBVLC_USE_PTHREADGCRY_THREAD_OPTION_PTHREAD_IMPL;# define gcry_threads_vlc gcry_threads_pthread#else/** * gcrypt thread option VLC implementation */# define NEED_THREAD_CONTEXT 1static vlc_object_t *__p_gcry_data;static int gcry_vlc_mutex_init( void **p_sys ){    int i_val;    vlc_mutex_t *p_lock = (vlc_mutex_t *)malloc( sizeof( vlc_mutex_t ) );    if( p_lock == NULL)        return ENOMEM;    i_val = vlc_mutex_init( __p_gcry_data, p_lock );    if( i_val )        free( p_lock );    else        *p_sys = p_lock;    return i_val;}static int gcry_vlc_mutex_destroy( void **p_sys ){    int i_val;    vlc_mutex_t *p_lock = (vlc_mutex_t *)*p_sys;    i_val = vlc_mutex_destroy( p_lock );    free( p_lock );    return i_val;}static int gcry_vlc_mutex_lock( void **p_sys ){    return vlc_mutex_lock( (vlc_mutex_t *)*p_sys );}static int gcry_vlc_mutex_unlock( void **lock ){    return vlc_mutex_unlock( (vlc_mutex_t *)*lock );}static struct gcry_thread_cbs gcry_threads_vlc ={    GCRY_THREAD_OPTION_USER,    NULL,    gcry_vlc_mutex_init,    gcry_vlc_mutex_destroy,    gcry_vlc_mutex_lock,    gcry_vlc_mutex_unlock};#endif/***************************************************************************** * Module initialization *****************************************************************************/static intOpen( vlc_object_t *p_this ){    tls_t *p_tls = (tls_t *)p_this;    vlc_value_t lock, count;    var_Create( p_this->p_libvlc, "gnutls_mutex", VLC_VAR_MUTEX );    var_Get( p_this->p_libvlc, "gnutls_mutex", &lock );    vlc_mutex_lock( lock.p_address );    /* Initialize GnuTLS only once */    var_Create( p_this->p_libvlc, "gnutls_count", VLC_VAR_INTEGER );    var_Get( p_this->p_libvlc, "gnutls_count", &count);    if( count.i_int == 0)    {#ifdef NEED_THREAD_CONTEXT        __p_gcry_data = VLC_OBJECT( p_this->p_vlc );#endif        gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_vlc);        if( gnutls_global_init( ) )        {            msg_Warn( p_this, "cannot initialize GnuTLS" );            vlc_mutex_unlock( lock.p_address );            return VLC_EGENERIC;        }        const char *psz_version = gnutls_check_version( "1.2.9" );        if( psz_version == NULL )        {            gnutls_global_deinit( );            vlc_mutex_unlock( lock.p_address );            msg_Err( p_this, "unsupported GnuTLS version" );            return VLC_EGENERIC;        }        msg_Dbg( p_this, "GnuTLS v%s initialized", psz_version );    }    count.i_int++;    var_Set( p_this->p_libvlc, "gnutls_count", count);    vlc_mutex_unlock( lock.p_address );    p_tls->pf_server_create = gnutls_ServerCreate;    p_tls->pf_client_create = gnutls_ClientCreate;    return VLC_SUCCESS;}/***************************************************************************** * Module deinitialization *****************************************************************************/static voidClose( vlc_object_t *p_this ){    /*tls_t *p_tls = (tls_t *)p_this;    tls_sys_t *p_sys = (tls_sys_t *)(p_this->p_sys);*/    vlc_value_t lock, count;    var_Create( p_this->p_libvlc, "gnutls_mutex", VLC_VAR_MUTEX );    var_Get( p_this->p_libvlc, "gnutls_mutex", &lock );    vlc_mutex_lock( lock.p_address );    var_Create( p_this->p_libvlc, "gnutls_count", VLC_VAR_INTEGER );    var_Get( p_this->p_libvlc, "gnutls_count", &count);    count.i_int--;    var_Set( p_this->p_libvlc, "gnutls_count", count);    if( count.i_int == 0 )    {        gnutls_global_deinit( );        msg_Dbg( p_this, "GnuTLS deinitialized" );    }    vlc_mutex_unlock( lock.p_address );}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -