Ignore:
Timestamp:
Jul 5, 2017 5:37:24 AM (7 years ago)
Author:
nanang
Message:

Re #2018: Added API pjmedia_transport_srtp_dtls_start_nego() to start DTLS-SRTP nego without SDP offer/answer.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip-apps/src/samples/streamutil.c

    r5618 r5621  
    8888 "                             AES_CM_128_HMAC_SHA1_32                  \n" 
    8989 "                        Use this option along with the TX & RX keys,  \n" 
    90  "                        formated of 60 hex digits (e.g: E148DA..)      \n" 
     90 "                        formated of 60 hex digits (e.g: E148DA..)     \n" 
    9191 "  --srtp-tx-key         SRTP key for transmiting                      \n" 
    9292 "  --srtp-rx-key         SRTP key for receiving                        \n" 
     93 "  --srtp-dtls-client    Use DTLS for SRTP keying, as DTLS client      \n" 
     94 "  --srtp-dtls-server    Use DTLS for SRTP keying, as DTLS server      \n" 
    9395#endif 
    9496 
     
    147149                                  const pj_str_t *srtp_tx_key, 
    148150                                  const pj_str_t *srtp_rx_key, 
     151                                  pj_bool_t is_dtls_client, 
     152                                  pj_bool_t is_dtls_server, 
    149153#endif 
    150154                                  pjmedia_stream **p_stream ) 
     
    287291    /* Check if SRTP enabled */ 
    288292    if (use_srtp) { 
    289         pjmedia_srtp_crypto tx_plc, rx_plc; 
    290  
    291293        status = pjmedia_transport_srtp_create(med_endpt, transport,  
    292294                                               NULL, &srtp_tp); 
     
    294296            return status; 
    295297 
    296         pj_bzero(&tx_plc, sizeof(pjmedia_srtp_crypto)); 
    297         pj_bzero(&rx_plc, sizeof(pjmedia_srtp_crypto)); 
    298  
    299         tx_plc.key = *srtp_tx_key; 
    300         tx_plc.name = *crypto_suite; 
    301         rx_plc.key = *srtp_rx_key; 
    302         rx_plc.name = *crypto_suite; 
    303          
    304         status = pjmedia_transport_srtp_start(srtp_tp, &tx_plc, &rx_plc); 
    305         if (status != PJ_SUCCESS) 
    306             return status; 
     298        if (is_dtls_client || is_dtls_server) { 
     299            char fp[128]; 
     300            pj_size_t fp_len = sizeof(fp); 
     301            pjmedia_srtp_dtls_nego_param dtls_param; 
     302             
     303            pjmedia_transport_srtp_dtls_get_fingerprint(srtp_tp, "SHA-256", fp, &fp_len); 
     304            PJ_LOG(3, (THIS_FILE, "Local cert fingerprint: %s", fp)); 
     305 
     306            pj_bzero(&dtls_param, sizeof(dtls_param)); 
     307            pj_sockaddr_cp(&dtls_param.rem_addr, rem_addr); 
     308            pj_sockaddr_cp(&dtls_param.rem_rtcp, rem_addr); 
     309            dtls_param.is_role_active = is_dtls_client; 
     310 
     311            status = pjmedia_transport_srtp_dtls_start_nego(srtp_tp, &dtls_param); 
     312            if (status != PJ_SUCCESS) 
     313                return status; 
     314        } else { 
     315            pjmedia_srtp_crypto tx_plc, rx_plc; 
     316 
     317            pj_bzero(&tx_plc, sizeof(pjmedia_srtp_crypto)); 
     318            pj_bzero(&rx_plc, sizeof(pjmedia_srtp_crypto)); 
     319 
     320            tx_plc.key = *srtp_tx_key; 
     321            tx_plc.name = *crypto_suite; 
     322            rx_plc.key = *srtp_rx_key; 
     323            rx_plc.name = *crypto_suite; 
     324         
     325            status = pjmedia_transport_srtp_start(srtp_tp, &tx_plc, &rx_plc); 
     326            if (status != PJ_SUCCESS) 
     327                return status; 
     328        } 
    307329 
    308330        transport = srtp_tp; 
     
    362384    pj_str_t  srtp_rx_key = {NULL, 0}; 
    363385    pj_str_t  srtp_crypto_suite = {NULL, 0}; 
     386    pj_bool_t is_dtls_client = PJ_FALSE; 
     387    pj_bool_t is_dtls_server = PJ_FALSE; 
    364388    int tmp_key_len; 
    365389#endif 
     
    392416        OPT_SRTP_TX_KEY = 'x', 
    393417        OPT_SRTP_RX_KEY = 'y', 
     418        OPT_SRTP_DTLS_CLIENT = 'd', 
     419        OPT_SRTP_DTLS_SERVER = 'D', 
    394420        OPT_HELP        = 'h', 
    395421    }; 
     
    409435        { "srtp-tx-key",    1, 0, OPT_SRTP_TX_KEY }, 
    410436        { "srtp-rx-key",    1, 0, OPT_SRTP_RX_KEY }, 
     437        { "srtp-dtls-client", 0, 0, OPT_SRTP_DTLS_CLIENT }, 
     438        { "srtp-dtls-server", 0, 0, OPT_SRTP_DTLS_SERVER }, 
    411439#endif 
    412440        { "help",           0, 0, OPT_HELP }, 
     
    510538            pj_strset(&srtp_rx_key, tmp_rx_key, tmp_key_len/2); 
    511539            break; 
     540        case OPT_SRTP_DTLS_CLIENT: 
     541            is_dtls_client = PJ_TRUE; 
     542            if (is_dtls_server) { 
     543                printf("Error: Cannot be as both DTLS server & client\n"); 
     544                return 1; 
     545            } 
     546            break; 
     547        case OPT_SRTP_DTLS_SERVER: 
     548            is_dtls_server = PJ_TRUE; 
     549            if (is_dtls_client) { 
     550                printf("Error: Cannot be as both DTLS server & client\n"); 
     551                return 1; 
     552            } 
     553            break; 
    512554#endif 
    513555 
     
    525567 
    526568    /* Verify arguments. */ 
    527     if (dir & PJMEDIA_DIR_ENCODING) { 
     569    if (dir & PJMEDIA_DIR_ENCODING || is_dtls_client || is_dtls_server) { 
    528570        if (remote_addr.sin_addr.s_addr == 0) { 
    529571            printf("Error: remote address must be set\n"); 
     
    540582    /* SRTP validation */ 
    541583    if (use_srtp) { 
    542         if (!srtp_tx_key.slen || !srtp_rx_key.slen) 
     584        if (!is_dtls_client && !is_dtls_server &&  
     585            (!srtp_tx_key.slen || !srtp_rx_key.slen)) 
    543586        { 
    544587            printf("Error: Key for each SRTP stream direction must be set\n"); 
     
    596639                           use_srtp, &srtp_crypto_suite,  
    597640                           &srtp_tx_key, &srtp_rx_key, 
     641                           is_dtls_client, is_dtls_server, 
    598642#endif 
    599643                           &stream); 
Note: See TracChangeset for help on using the changeset viewer.