static void fill_rand( int i_fd, size_t i_size ) { uint8_t p_buf[4096]; size_t i_written = 0; while( i_written < i_size ) { size_t i_tocopy = __MIN( i_size - i_written, 4096 ); vlc_rand_bytes(p_buf, i_tocopy); ssize_t i_ret = write( i_fd, p_buf, i_tocopy ); assert( i_ret > 0 ); i_written += i_ret; } assert( i_written == i_size ); }
/** rtsp must be locked */ static rtsp_session_t *RtspClientNew( rtsp_stream_t *rtsp ) { rtsp_session_t *s = malloc( sizeof( *s ) ); if( s == NULL ) return NULL; s->stream = rtsp; vlc_rand_bytes (&s->id, sizeof (s->id)); s->trackc = 0; s->trackv = NULL; TAB_APPEND( rtsp->sessionc, rtsp->sessionv, s ); return s; }
int vlc_mkstemp( char *_template ) // sunqueen modify { static const char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; static const int i_digits = sizeof(digits)/sizeof(*digits) - 1; /* */ assert( _template ); // sunqueen modify /* Check template validity */ const size_t i_length = strlen( _template ); // sunqueen modify char *psz_rand = &_template[i_length-6]; // sunqueen modify if( i_length < 6 || strcmp( psz_rand, "XXXXXX" ) ) { errno = EINVAL; return -1; } /* */ for( int i = 0; i < 256; i++ ) { /* Create a pseudo random file name */ uint8_t pi_rand[6]; vlc_rand_bytes( pi_rand, sizeof(pi_rand) ); for( int j = 0; j < 6; j++ ) psz_rand[j] = digits[pi_rand[j] % i_digits]; /* */ int fd = vlc_open( _template, O_CREAT | O_EXCL | O_RDWR, 0600 ); // sunqueen modify if( fd >= 0 ) return fd; if( errno != EEXIST ) return -1; } errno = EEXIST; return -1; }
/************************************************************************ * CryptSetup: Initialize encryption ************************************************************************/ static int CryptSetup( sout_access_out_t *p_access, char *key_file ) { sout_access_out_sys_t *p_sys = p_access->p_sys; uint8_t key[16]; char *keyfile = NULL; if( !p_sys->key_uri ) /*No key uri, assume no encryption wanted*/ { msg_Dbg( p_access, "No key uri, no encryption"); return VLC_SUCCESS; } if( key_file ) keyfile = strdup( key_file ); else keyfile = var_InheritString( p_access, SOUT_CFG_PREFIX "key-file" ); if( unlikely(keyfile == NULL) ) { msg_Err( p_access, "No key-file, no encryption" ); return VLC_EGENERIC; } vlc_gcrypt_init(); /*Setup encryption cipher*/ gcry_error_t err = gcry_cipher_open( &p_sys->aes_ctx, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_CBC, 0 ); if( err ) { msg_Err( p_access, "Openin AES Cipher failed: %s", gpg_strerror(err)); free( keyfile ); return VLC_EGENERIC; } int keyfd = vlc_open( keyfile, O_RDONLY | O_NONBLOCK ); if( unlikely( keyfd == -1 ) ) { msg_Err( p_access, "Unable to open keyfile %s: %s", keyfile, vlc_strerror_c(errno) ); free( keyfile ); gcry_cipher_close( p_sys->aes_ctx ); return VLC_EGENERIC; } free( keyfile ); ssize_t keylen = read( keyfd, key, 16 ); vlc_close( keyfd ); if( keylen < 16 ) { msg_Err( p_access, "No key at least 16 octects (you provided %zd), no encryption", keylen ); gcry_cipher_close( p_sys->aes_ctx ); return VLC_EGENERIC; } err = gcry_cipher_setkey( p_sys->aes_ctx, key, 16 ); if(err) { msg_Err(p_access, "Setting AES key failed: %s", gpg_strerror(err)); gcry_cipher_close( p_sys->aes_ctx ); return VLC_EGENERIC; } if( p_sys->b_generate_iv ) vlc_rand_bytes( p_sys->aes_ivs, sizeof(uint8_t)*16); return VLC_SUCCESS; }
/***************************************************************************** * Open: *****************************************************************************/ static int Open( vlc_object_t *p_this ) { ts_table_t *p_table = (ts_table_t *)p_this; ts_stream_t *p_ts_stream = p_table->p_ts_stream; ts_packetizer_sys_t *p_sys; vlc_value_t val; char *psz_network_name; mtime_t i_max_period; unsigned short subi[3]; vlc_rand_bytes( subi, sizeof(subi) ); p_sys = p_table->p_sys = malloc( sizeof(ts_packetizer_sys_t) ); memset( p_sys, 0, sizeof(ts_packetizer_sys_t) ); config_ChainParse( p_table, SOUT_CFG_PREFIX, ppsz_sout_options, p_table->p_cfg ); tstable_CommonOptions( p_table ); if ( p_table->i_rap_advance == -1 ) i_max_period = p_table->i_max_period; else i_max_period = p_table->i_period; switch ( p_ts_stream->params.i_conformance ) { default: case CONFORMANCE_NONE: case CONFORMANCE_ISO: case CONFORMANCE_HDMV: break; case CONFORMANCE_ATSC: msg_Warn( p_table, "NIT is not compatible with ATSC conformance" ); break; case CONFORMANCE_DVB: if ( i_max_period > INT64_C(10000000) ) msg_Warn( p_table, "NIT period shouldn't exceed 10 s in DVB systems" ); break; } var_Get( p_table, SOUT_CFG_PREFIX "version", &val ); if ( val.i_int != -1 ) p_sys->i_version = val.i_int % 32; else p_sys->i_version = nrand48(subi) % 32; var_Get( p_table, SOUT_CFG_PREFIX "network-name", &val ); psz_network_name = val.psz_string; p_sys->p_network_name = p_ts_stream->params.pf_charset( p_ts_stream->params.p_charset, psz_network_name, &p_sys->i_network_name_size ); if ( p_sys->i_network_name_size > 255 ) { msg_Warn( p_table, "network name is too large: %s", psz_network_name ); p_sys->i_network_name_size = 255; } UpdateTable( p_table ); p_table->b_defines_program = true; p_table->i_program = 0; p_table->i_peak_bitrate = T_STD_PEAK_RATE; p_table->i_priority = TSPACK_PRIORITY_SI; p_table->pf_send = Send; tstable_Force( p_table ); msg_Dbg( p_table, "setting up NIT network ID %u name \"%s\"", p_ts_stream->i_nid, psz_network_name ); free( psz_network_name ); return VLC_SUCCESS; }