Changeset 1721


Ignore:
Timestamp:
Jan 21, 2008 3:28:16 AM (17 years ago)
Author:
nanang
Message:

Ticket #452:
bugs fixed in transport_srtp.c:

  • default crypto-suites in pjmedia_srtp_setting_default without crypto 'NULL'
  • problem in bypass SRTP mechanism
File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/branches/users/nanang/pjmedia/src/pjmedia/transport_srtp.c

    r1713 r1721  
    261261    opt->close_member_tp = PJ_TRUE; 
    262262    opt->use = PJMEDIA_SRTP_OPTIONAL; 
    263     opt->crypto_count = sizeof(crypto_suites)/sizeof(crypto_suites[0]); 
     263 
     264    /* Copy default crypto-suites, but skip crypto 'NULL' */ 
     265    opt->crypto_count = sizeof(crypto_suites)/sizeof(crypto_suites[0]) - 1; 
    264266    for (i=0; i<opt->crypto_count; ++i) 
    265         opt->crypto[i].name = pj_str(crypto_suites[i].name); 
     267        opt->crypto[i].name = pj_str(crypto_suites[i+1].name); 
    266268} 
    267269 
     
    328330            srtp->setting.crypto[i].name = pj_str(crypto_suites[cs_idx].name); 
    329331            /* cut key length */ 
    330             tmp_key.slen = crypto_suites[cs_idx].cipher_key_len; 
     332            if (tmp_key.slen) 
     333                tmp_key.slen = crypto_suites[cs_idx].cipher_key_len; 
    331334            pj_strdup(pool, &srtp->setting.crypto[i].key, &tmp_key); 
    332335        } 
     
    872875    enum { MAXLEN = 512 }; 
    873876    char buffer[MAXLEN]; 
    874     int buffer_len = MAXLEN; 
     877    int buffer_len; 
    875878    pj_status_t status; 
    876879    pjmedia_sdp_attr *attr; 
     
    880883    PJ_ASSERT_RETURN(tp && pool && sdp_local, PJ_EINVAL); 
    881884 
    882     pj_bzero(&srtp->rx_policy, sizeof(srtp->rx_policy)); 
     885    pj_bzero(&srtp->rx_policy, sizeof(srtp->tx_policy)); 
    883886    pj_bzero(&srtp->tx_policy, sizeof(srtp->rx_policy)); 
    884887 
     
    889892    if (pj_stricmp(&m_loc->desc.transport, &ID_RTP_AVP)  != 0 &&  
    890893        pj_stricmp(&m_loc->desc.transport, &ID_RTP_SAVP) != 0) 
    891         goto PROPAGATE_MEDIA_CREATE; 
     894        goto BYPASS_SRTP; 
    892895 
    893896    /* If the media is inactive, do nothing. */ 
     
    895898        (m_rem && pjmedia_sdp_media_find_attr(m_rem, &ID_INACTIVE, NULL))) 
    896899    { 
    897         goto PROPAGATE_MEDIA_CREATE; 
     900        goto BYPASS_SRTP; 
    898901    } 
    899902 
     
    905908    if (srtp->offerer_side) { 
    906909        if (srtp->setting.use == PJMEDIA_SRTP_DISABLED) { 
    907             goto PROPAGATE_MEDIA_CREATE; 
     910            goto BYPASS_SRTP; 
    908911        } else if (srtp->setting.use == PJMEDIA_SRTP_OPTIONAL) { 
    909912            m_loc->desc.transport = ID_RTP_AVP; 
     
    931934        for (i=0; i<srtp->setting.crypto_count; ++i) { 
    932935            /* Offer crypto-suites based on setting. */ 
     936            buffer_len = MAXLEN; 
    933937            status = generate_crypto_attr_value(pool, buffer, &buffer_len, 
    934938                                                &srtp->setting.crypto[i], 
     
    958962                continue; 
    959963 
     964            /* SRTP is disabled but there is crypto attr in remote media */ 
    960965            if (srtp->setting.use == PJMEDIA_SRTP_DISABLED) { 
    961966                DEACTIVATE_MEDIA(pool, m_loc); 
     
    10021007        if (srtp->setting.use == PJMEDIA_SRTP_DISABLED) { 
    10031008            /* At this point, it is ensured remote has no crypto attr */ 
    1004             goto PROPAGATE_MEDIA_CREATE; 
     1009            goto BYPASS_SRTP; 
    10051010        } else if (srtp->setting.use == PJMEDIA_SRTP_OPTIONAL) { 
    1006             if (!has_crypto_attr) 
    1007                 goto PROPAGATE_MEDIA_CREATE;; 
     1011            /* bypass SRTP when no crypto-attr but remote uses RTP/AVP */ 
     1012            if (!has_crypto_attr &&  
     1013                pj_stricmp(&m_rem->desc.transport, &ID_RTP_AVP) == 0) 
     1014                goto BYPASS_SRTP; 
     1015            /* bypass SRTP when nothing match but remote uses RTP/AVP */ 
     1016            if (!has_match &&  
     1017                pj_stricmp(&m_rem->desc.transport, &ID_RTP_AVP) == 0) 
     1018                goto BYPASS_SRTP; 
    10081019        } else if (srtp->setting.use == PJMEDIA_SRTP_MANDATORY) { 
    10091020            if (!has_crypto_attr) { 
     
    10231034         * and rem_tag contains matched offer tag. 
    10241035         */ 
     1036        buffer_len = MAXLEN; 
    10251037        status = generate_crypto_attr_value(pool, buffer, &buffer_len, 
    10261038                                            &srtp->tx_policy, 
     
    10401052         */ 
    10411053    } 
     1054    goto PROPAGATE_MEDIA_CREATE; 
     1055 
     1056BYPASS_SRTP: 
     1057    srtp->bypass_srtp = PJ_TRUE; 
    10421058 
    10431059PROPAGATE_MEDIA_CREATE: 
     
    10621078    PJ_ASSERT_RETURN(tp && pool && sdp_local && sdp_remote, PJ_EINVAL); 
    10631079 
     1080    if (srtp->bypass_srtp) 
     1081        goto BYPASS_SRTP; 
     1082 
    10641083    m_rem = sdp_remote->media[media_index]; 
    10651084    m_loc = sdp_local->media[media_index]; 
    1066  
    1067     /* bypass if media transport is not RTP/AVP or RTP/SAVP */ 
    1068     if (pj_stricmp(&m_loc->desc.transport, &ID_RTP_AVP)  != 0 &&  
    1069         pj_stricmp(&m_loc->desc.transport, &ID_RTP_SAVP) != 0)  
    1070     { 
    1071         srtp->bypass_srtp = PJ_TRUE; 
    1072         goto PROPAGATE_MEDIA_START; 
    1073     } 
    1074  
    1075     /* If the media is inactive, do nothing. */ 
    1076     if (pjmedia_sdp_media_find_attr(m_loc, &ID_INACTIVE, NULL) ||  
    1077         (m_rem && pjmedia_sdp_media_find_attr(m_rem, &ID_INACTIVE, NULL))) 
    1078     { 
    1079         srtp->bypass_srtp = PJ_TRUE; 
    1080         goto PROPAGATE_MEDIA_START; 
    1081     } 
    10821085 
    10831086    /* For answerer side, this function will just have to start SRTP */ 
     
    10921095                return PJMEDIA_SRTP_ESDPINCRYPTO; 
    10931096            } 
    1094             srtp->bypass_srtp = PJ_TRUE; 
    1095             goto PROPAGATE_MEDIA_START; 
     1097            goto BYPASS_SRTP; 
    10961098        } else if (srtp->setting.use == PJMEDIA_SRTP_OPTIONAL) { 
    10971099            if (pj_stricmp(&m_rem->desc.transport, &m_loc->desc.transport)) { 
     
    11511153        if (srtp->setting.use == PJMEDIA_SRTP_DISABLED) { 
    11521154            /* should never reach here */ 
    1153             srtp->bypass_srtp = PJ_TRUE; 
    1154             goto PROPAGATE_MEDIA_START; 
     1155            goto BYPASS_SRTP; 
    11551156        } else if (srtp->setting.use == PJMEDIA_SRTP_OPTIONAL) { 
    1156             if (!has_crypto_attr) { 
    1157                 srtp->bypass_srtp = PJ_TRUE; 
    1158                 goto PROPAGATE_MEDIA_START; 
    1159             } 
     1157            if (!has_crypto_attr) 
     1158                goto BYPASS_SRTP; 
    11601159        } else if (srtp->setting.use == PJMEDIA_SRTP_MANDATORY) { 
    11611160            if (!has_crypto_attr) { 
     
    11751174        return status; 
    11761175 
     1176    goto PROPAGATE_MEDIA_START; 
     1177 
     1178BYPASS_SRTP: 
     1179    srtp->bypass_srtp = PJ_TRUE; 
     1180 
    11771181PROPAGATE_MEDIA_START: 
    11781182    return pjmedia_transport_media_start(srtp->real_tp, pool,  
     
    11861190    pj_status_t status; 
    11871191 
    1188     if (srtp->setting.close_member_tp) { 
    1189         status = pjmedia_transport_media_stop(srtp->real_tp); 
    1190         if (status != PJ_SUCCESS) 
    1191             PJ_LOG(4, (THIS_FILE, "Failed deinit session.")); 
    1192     } 
     1192    status = pjmedia_transport_media_stop(srtp->real_tp); 
     1193    if (status != PJ_SUCCESS) 
     1194        PJ_LOG(4, (THIS_FILE, "SRTP failed stop underlying media transport.")); 
    11931195 
    11941196    return pjmedia_transport_srtp_stop(tp); 
Note: See TracChangeset for help on using the changeset viewer.