access: srt: add support stream encryption
authorJustin Kim <justin.kim@collabora.com>
Sat, 25 Nov 2017 15:27:41 +0000 (00:27 +0900)
committerJean-Baptiste Kempf <jb@videolan.org>
Sun, 10 Dec 2017 01:42:04 +0000 (02:42 +0100)
For encrypted transmitting, `passphrase` and `key-length`
properties are added.

Signed-off-by: Justin Kim <justin.kim@collabora.com>
Signed-off-by: Jean-Baptiste Kempf <jb@videolan.org>
modules/access/srt.c

index 2de24d3..bf770a4 100644 (file)
 /* The default latency is 125
  * which uses srt library internally */
 #define SRT_DEFAULT_LATENCY 125
 /* The default latency is 125
  * which uses srt library internally */
 #define SRT_DEFAULT_LATENCY 125
+/* Crypto key length in bytes. */
+#define SRT_KEY_LENGTH_TEXT N_("Crypto key length in bytes")
+#define SRT_DEFAULT_KEY_LENGTH 16
+static const int srt_key_lengths[] = {
+    16, 24, 32,
+};
+
+static const char *const srt_key_length_names[] = {
+    N_("16 bytes"), N_("24 bytes"), N_("32 bytes"),
+};
 
 struct stream_sys_t
 {
 
 struct stream_sys_t
 {
@@ -164,6 +174,8 @@ static int Open(vlc_object_t *p_this)
     }, *res = NULL;
     int stat;
 
     }, *res = NULL;
     int stat;
 
+    char         *psz_passphrase = NULL;
+
     p_sys = vlc_obj_malloc( p_this, sizeof( *p_sys ) );
     if( unlikely( p_sys == NULL ) )
         return VLC_ENOMEM;
     p_sys = vlc_obj_malloc( p_this, sizeof( *p_sys ) );
     if( unlikely( p_sys == NULL ) )
         return VLC_ENOMEM;
@@ -182,6 +194,8 @@ static int Open(vlc_object_t *p_this)
     p_stream->pf_block = BlockSRT;
     p_stream->pf_control = Control;
 
     p_stream->pf_block = BlockSRT;
     p_stream->pf_control = Control;
 
+    psz_passphrase = var_InheritString( p_stream, "passphrase" );
+
     stat = vlc_getaddrinfo( parsed_url.psz_host, parsed_url.i_port, &hints, &res );
     if ( stat )
     {
     stat = vlc_getaddrinfo( parsed_url.psz_host, parsed_url.i_port, &hints, &res );
     if ( stat )
     {
@@ -209,6 +223,16 @@ static int Open(vlc_object_t *p_this)
     /* Set latency */
     srt_setsockopt( p_sys->sock, 0, SRTO_TSBPDDELAY, &p_sys->i_latency, sizeof( int ) );
 
     /* Set latency */
     srt_setsockopt( p_sys->sock, 0, SRTO_TSBPDDELAY, &p_sys->i_latency, sizeof( int ) );
 
+    if ( psz_passphrase != NULL && psz_passphrase[0] != '\0')
+    {
+        int i_key_length = var_InheritInteger( p_stream, "key-length" );
+
+        srt_setsockopt( p_sys->sock, 0, SRTO_PASSPHRASE,
+            psz_passphrase, strlen( psz_passphrase ) );
+        srt_setsockopt( p_sys->sock, 0, SRTO_PBKEYLEN,
+            &i_key_length, sizeof( int ) );
+    }
+
     p_sys->i_poll_id = srt_epoll_create();
     if ( p_sys->i_poll_id == -1 )
     {
     p_sys->i_poll_id = srt_epoll_create();
     if ( p_sys->i_poll_id == -1 )
     {
@@ -237,6 +261,7 @@ static int Open(vlc_object_t *p_this)
 
     vlc_UrlClean( &parsed_url );
     freeaddrinfo( res );
 
     vlc_UrlClean( &parsed_url );
     freeaddrinfo( res );
+    free (psz_passphrase);
 
     return VLC_SUCCESS;
 
 
     return VLC_SUCCESS;
 
@@ -263,6 +288,8 @@ failed:
     }
     srt_close( p_sys->sock );
 
     }
     srt_close( p_sys->sock );
 
+    free (psz_passphrase);
+
     return VLC_EGENERIC;
 }
 
     return VLC_EGENERIC;
 }
 
@@ -295,6 +322,10 @@ vlc_module_begin ()
     add_integer( "poll-timeout", SRT_DEFAULT_POLL_TIMEOUT,
             N_("Return poll wait after timeout milliseconds (-1 = infinite)"), NULL, true )
     add_integer( "latency", SRT_DEFAULT_LATENCY, N_("SRT latency (ms)"), NULL, true )
     add_integer( "poll-timeout", SRT_DEFAULT_POLL_TIMEOUT,
             N_("Return poll wait after timeout milliseconds (-1 = infinite)"), NULL, true )
     add_integer( "latency", SRT_DEFAULT_LATENCY, N_("SRT latency (ms)"), NULL, true )
+    add_password( "passphrase", "", N_("Password for stream encryption"), NULL, false )
+    add_integer( "key-length", SRT_DEFAULT_KEY_LENGTH,
+            SRT_KEY_LENGTH_TEXT, SRT_KEY_LENGTH_TEXT, false )
+        change_integer_list( srt_key_lengths, srt_key_length_names )
 
     set_capability( "access", 0 )
     add_shortcut( "srt" )
 
     set_capability( "access", 0 )
     add_shortcut( "srt" )