Changeset 5821


Ignore:
Timestamp:
Jul 15, 2018 2:09:23 PM (6 years ago)
Author:
riza
Message:

Close #484: Allow to use binary certificate in TLS transport.

Location:
pjproject/trunk
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjlib/include/pj/ssl_sock.h

    r5725 r5821  
    192192} pj_ssl_cert_info; 
    193193 
     194/** 
     195 * The SSL certificate buffer. 
     196 */ 
     197typedef pj_str_t pj_ssl_cert_buffer; 
    194198 
    195199/** 
     
    242246                                                pj_ssl_cert_t **p_cert); 
    243247 
     248 
     249/** 
     250 * Create credential from data buffer. The certificate expected is in  
     251 * PEM format. 
     252 * 
     253 * @param CA_file       The buffer of trusted CA list. 
     254 * @param cert_file     The buffer of certificate. 
     255 * @param privkey_file  The buffer of private key. 
     256 * @param privkey_pass  The password of private key, if any. 
     257 * @param p_cert        Pointer to credential instance to be created. 
     258 * 
     259 * @return              PJ_SUCCESS when successful. 
     260 */ 
     261PJ_DECL(pj_status_t) pj_ssl_cert_load_from_buffer(pj_pool_t *pool, 
     262                                        const pj_ssl_cert_buffer *CA_buf, 
     263                                        const pj_ssl_cert_buffer *cert_buf, 
     264                                        const pj_ssl_cert_buffer *privkey_buf, 
     265                                        const pj_str_t *privkey_pass, 
     266                                        pj_ssl_cert_t **p_cert); 
    244267 
    245268/** 
  • pjproject/trunk/pjlib/src/pj/ssl_sock_gtls.c

    r5730 r5821  
    190190}; 
    191191 
    192  
    193 /* Certificate/credential structure definition. */ 
    194 struct pj_ssl_cert_t { 
     192/* 
     193 * Certificate/credential structure definition. 
     194 */ 
     195struct pj_ssl_cert_t 
     196{ 
    195197    pj_str_t CA_file; 
    196198    pj_str_t CA_path; 
     
    198200    pj_str_t privkey_file; 
    199201    pj_str_t privkey_pass; 
     202 
     203    /* Certificate buffer. */ 
     204    pj_ssl_cert_buffer CA_buf; 
     205    pj_ssl_cert_buffer cert_buf; 
     206    pj_ssl_cert_buffer privkey_buf; 
    200207}; 
     208 
    201209 
    202210/* GnuTLS available ciphers */ 
     
    982990                goto out; 
    983991        } 
     992 
     993        if (cert->CA_buf.slen) { 
     994            gnutls_datum_t ca; 
     995            ca.data = (unsigned char*)cert->CA_buf.ptr; 
     996            ca.size = cert->CA_buf.slen; 
     997            ret = gnutls_certificate_set_x509_trust_mem(ssock->xcred, 
     998                                                        &ca, 
     999                                                        GNUTLS_X509_FMT_PEM); 
     1000            if (ret < 0) 
     1001                ret = gnutls_certificate_set_x509_trust_mem( 
     1002                                ssock->xcred, &ca, GNUTLS_X509_FMT_DER); 
     1003            if (ret < 0) 
     1004                goto out; 
     1005        } 
     1006 
     1007        if (cert->cert_buf.slen && cert->privkey_buf.slen) { 
     1008            gnutls_datum_t cert_buf; 
     1009            gnutls_datum_t privkey_buf; 
     1010 
     1011            cert_buf.data = (unsigned char*)cert->CA_buf.ptr; 
     1012            cert_buf.size = cert->CA_buf.slen; 
     1013            privkey_buf.data = (unsigned char*)cert->privkey_buf.ptr; 
     1014            privkey_buf.size = cert->privkey_buf.slen; 
     1015 
     1016            const char *prikey_pass = cert->privkey_pass.slen 
     1017                                    ? cert->privkey_pass.ptr 
     1018                                    : NULL; 
     1019            ret = gnutls_certificate_set_x509_key_mem2(ssock->xcred, 
     1020                                                       &cert_buf, 
     1021                                                       &privkey_buf, 
     1022                                                       GNUTLS_X509_FMT_PEM, 
     1023                                                       prikey_pass, 
     1024                                                       0); 
     1025            /* Load DER format */ 
     1026            /* 
     1027            if (ret != GNUTLS_E_SUCCESS) 
     1028                ret = gnutls_certificate_set_x509_key_mem2(ssock->xcred, 
     1029                                                           &cert_buf, 
     1030                                                           &privkey_buf, 
     1031                                                           GNUTLS_X509_FMT_DER, 
     1032                                                           prikey_pass, 
     1033                                                           0); 
     1034            */                                                            
     1035            if (ret < 0) 
     1036                goto out; 
     1037        } 
    9841038    } 
    9851039 
     
    20902144} 
    20912145 
     2146PJ_DEF(pj_status_t) pj_ssl_cert_load_from_buffer(pj_pool_t *pool, 
     2147                                        const pj_ssl_cert_buffer *CA_buf, 
     2148                                        const pj_ssl_cert_buffer *cert_buf, 
     2149                                        const pj_ssl_cert_buffer *privkey_buf, 
     2150                                        const pj_str_t *privkey_pass, 
     2151                                        pj_ssl_cert_t **p_cert) 
     2152{ 
     2153    pj_ssl_cert_t *cert; 
     2154 
     2155    PJ_ASSERT_RETURN(pool && CA_buf && cert_buf && privkey_buf, PJ_EINVAL); 
     2156 
     2157    cert = PJ_POOL_ZALLOC_T(pool, pj_ssl_cert_t); 
     2158    pj_strdup(pool, &cert->CA_buf, CA_buf); 
     2159    pj_strdup(pool, &cert->cert_buf, cert_buf); 
     2160    pj_strdup(pool, &cert->privkey_buf, privkey_buf); 
     2161    pj_strdup_with_null(pool, &cert->privkey_pass, privkey_pass); 
     2162 
     2163    *p_cert = cert; 
     2164 
     2165    return PJ_SUCCESS; 
     2166} 
     2167 
    20922168/* Store credentials. */ 
    20932169PJ_DEF(pj_status_t) pj_ssl_sock_set_certificate( pj_ssl_sock_t *ssock, 
     
    21062182    pj_strdup_with_null(pool, &cert_->privkey_file, &cert->privkey_file); 
    21072183    pj_strdup_with_null(pool, &cert_->privkey_pass, &cert->privkey_pass); 
     2184 
     2185    pj_strdup(pool, &cert_->CA_buf, &cert->CA_buf); 
     2186    pj_strdup(pool, &cert_->cert_buf, &cert->cert_buf); 
     2187    pj_strdup(pool, &cert_->privkey_buf, &cert->privkey_buf); 
    21082188 
    21092189    ssock->cert = cert_; 
  • pjproject/trunk/pjlib/src/pj/ssl_sock_ossl.c

    r5797 r5821  
    294294    pj_str_t privkey_file; 
    295295    pj_str_t privkey_pass; 
     296 
     297    /* Certificate buffer. */ 
     298    pj_ssl_cert_buffer CA_buf; 
     299    pj_ssl_cert_buffer cert_buf; 
     300    pj_ssl_cert_buffer privkey_buf; 
    296301}; 
    297302 
     
    964969#endif 
    965970        } 
     971 
     972        /* Load from buffer. */ 
     973        if (cert->cert_buf.slen) { 
     974            BIO *cbio; 
     975            X509 *xcert = NULL; 
     976             
     977            cbio = BIO_new_mem_buf((void*)cert->cert_buf.ptr, 
     978                                   cert->cert_buf.slen); 
     979            if (cbio != NULL) { 
     980                xcert = PEM_read_bio_X509(cbio, NULL, 0, NULL); 
     981                if (xcert != NULL) { 
     982                    rc = SSL_CTX_use_certificate(ctx, xcert); 
     983                    if (rc != 1) { 
     984                        status = GET_SSL_STATUS(ssock); 
     985                        PJ_LOG(1, (ssock->pool->obj_name, "Error loading " 
     986                                   "chain certificate from buffer")); 
     987                        X509_free(xcert); 
     988                        BIO_free(cbio); 
     989                        SSL_CTX_free(ctx); 
     990                        return status; 
     991                    } 
     992                    X509_free(xcert); 
     993                } 
     994                BIO_free(cbio); 
     995            }        
     996        } 
     997 
     998        if (cert->CA_buf.slen) { 
     999            BIO *cbio = BIO_new_mem_buf((void*)cert->CA_buf.ptr, 
     1000                                        cert->CA_buf.slen); 
     1001            X509_STORE *cts = SSL_CTX_get_cert_store(ctx); 
     1002 
     1003            if (cbio && cts) { 
     1004                STACK_OF(X509_INFO) *inf = PEM_X509_INFO_read_bio(cbio, NULL,  
     1005                                                                  NULL, NULL); 
     1006 
     1007                if (inf != NULL) { 
     1008                    int i = 0;               
     1009                    for (; i < sk_X509_INFO_num(inf); i++) { 
     1010                        X509_INFO *itmp = sk_X509_INFO_value(inf, i); 
     1011                        if (itmp->x509) { 
     1012                            X509_STORE_add_cert(cts, itmp->x509); 
     1013                        } 
     1014                    } 
     1015                } 
     1016                sk_X509_INFO_pop_free(inf, X509_INFO_free); 
     1017                BIO_free(cbio); 
     1018            } 
     1019        } 
     1020 
     1021        if (cert->privkey_buf.slen) { 
     1022            BIO *kbio;       
     1023            EVP_PKEY *pkey = NULL; 
     1024 
     1025            kbio = BIO_new_mem_buf((void*)cert->privkey_buf.ptr, 
     1026                                   cert->privkey_buf.slen); 
     1027            if (kbio != NULL) { 
     1028                pkey = PEM_read_bio_PrivateKey(kbio, NULL, 0, NULL); 
     1029                if (pkey) { 
     1030                    rc = SSL_CTX_use_PrivateKey(ctx, pkey); 
     1031                    if (rc != 1) { 
     1032                        status = GET_SSL_STATUS(ssock); 
     1033                        PJ_LOG(1, (ssock->pool->obj_name, "Error adding " 
     1034                                   "private key from buffer")); 
     1035                        EVP_PKEY_free(pkey); 
     1036                        BIO_free(kbio); 
     1037                        SSL_CTX_free(ctx); 
     1038                        return status; 
     1039                    } 
     1040                    EVP_PKEY_free(pkey); 
     1041                } 
     1042                if (ssock->is_server) { 
     1043                    dh = PEM_read_bio_DHparams(kbio, NULL, NULL, NULL); 
     1044                    if (dh != NULL) { 
     1045                        if (SSL_CTX_set_tmp_dh(ctx, dh)) { 
     1046                            options = SSL_OP_CIPHER_SERVER_PREFERENCE | 
     1047    #if !defined(OPENSSL_NO_ECDH) && OPENSSL_VERSION_NUMBER >= 0x10000000L 
     1048                                      SSL_OP_SINGLE_ECDH_USE | 
     1049    #endif 
     1050                                      SSL_OP_SINGLE_DH_USE; 
     1051                            options = SSL_CTX_set_options(ctx, options); 
     1052                            PJ_LOG(4,(ssock->pool->obj_name, "SSL DH " 
     1053                                     "initialized, PFS cipher-suites enabled")); 
     1054                        } 
     1055                        DH_free(dh); 
     1056                    } 
     1057                } 
     1058                BIO_free(kbio); 
     1059            }        
     1060        } 
    9661061    } 
    9671062 
     
    12331328                break; 
    12341329            } 
    1235         } 
     1330        }        
    12361331    } 
    12371332 
     
    25552650} 
    25562651 
     2652PJ_DEF(pj_status_t) pj_ssl_cert_load_from_buffer(pj_pool_t *pool, 
     2653                                        const pj_ssl_cert_buffer *CA_buf, 
     2654                                        const pj_ssl_cert_buffer *cert_buf, 
     2655                                        const pj_ssl_cert_buffer *privkey_buf, 
     2656                                        const pj_str_t *privkey_pass, 
     2657                                        pj_ssl_cert_t **p_cert) 
     2658{ 
     2659    pj_ssl_cert_t *cert; 
     2660 
     2661    PJ_ASSERT_RETURN(pool && CA_buf && cert_buf && privkey_buf, PJ_EINVAL); 
     2662 
     2663    cert = PJ_POOL_ZALLOC_T(pool, pj_ssl_cert_t); 
     2664    pj_strdup(pool, &cert->CA_buf, CA_buf); 
     2665    pj_strdup(pool, &cert->cert_buf, cert_buf); 
     2666    pj_strdup(pool, &cert->privkey_buf, privkey_buf); 
     2667    pj_strdup_with_null(pool, &cert->privkey_pass, privkey_pass); 
     2668 
     2669    *p_cert = cert; 
     2670 
     2671    return PJ_SUCCESS; 
     2672} 
    25572673 
    25582674/* Set SSL socket credentials. */ 
     
    25732689    pj_strdup_with_null(pool, &cert_->privkey_file, &cert->privkey_file); 
    25742690    pj_strdup_with_null(pool, &cert_->privkey_pass, &cert->privkey_pass); 
     2691 
     2692    pj_strdup(pool, &cert_->CA_buf, &cert->CA_buf); 
     2693    pj_strdup(pool, &cert_->cert_buf, &cert->cert_buf); 
     2694    pj_strdup(pool, &cert_->privkey_buf, &cert->privkey_buf); 
    25752695 
    25762696    ssock->cert = cert_; 
  • pjproject/trunk/pjlib/src/pjlib-test/ssl_sock.c

    r5381 r5821  
    2828#define CERT_PRIVKEY_PASS           "" 
    2929 
     30#define TEST_LOAD_FROM_FILES 1 
    3031 
    3132#if INCLUDE_SSLSOCK_TEST 
     
    493494} 
    494495 
     496#if (TEST_LOAD_FROM_FILE==0) 
     497static pj_status_t load_cert_to_buf(pj_pool_t *pool, const pj_str_t *file_name, 
     498                                    pj_ssl_cert_buffer *buf) 
     499{ 
     500    pj_status_t status; 
     501    pj_oshandle_t fd = 0; 
     502    pj_ssize_t size = (pj_ssize_t)pj_file_size(file_name->ptr); 
     503 
     504    status = pj_file_open(pool, file_name->ptr, PJ_O_RDONLY, &fd); 
     505    if (status != PJ_SUCCESS) 
     506        return status; 
     507 
     508    buf->ptr = (char*)pj_pool_zalloc(pool, size+1); 
     509    status = pj_file_read(fd, buf->ptr, &size); 
     510    buf->slen = size; 
     511 
     512    pj_file_close(fd); 
     513    fd = NULL; 
     514    return status; 
     515} 
     516#endif 
    495517 
    496518static int echo_test(pj_ssl_sock_proto srv_proto, pj_ssl_sock_proto cli_proto, 
     
    550572    /* Set server cert */ 
    551573    { 
    552         pj_str_t tmp1, tmp2, tmp3, tmp4; 
    553  
    554         status = pj_ssl_cert_load_from_files(pool,  
    555                                              pj_strset2(&tmp1, (char*)CERT_CA_FILE),  
    556                                              pj_strset2(&tmp2, (char*)CERT_FILE),  
    557                                              pj_strset2(&tmp3, (char*)CERT_PRIVKEY_FILE),  
    558                                              pj_strset2(&tmp4, (char*)CERT_PRIVKEY_PASS),  
     574        pj_str_t ca_file = pj_str(CERT_CA_FILE); 
     575        pj_str_t cert_file = pj_str(CERT_FILE); 
     576        pj_str_t privkey_file = pj_str(CERT_PRIVKEY_FILE); 
     577        pj_str_t privkey_pass = pj_str(CERT_PRIVKEY_PASS); 
     578 
     579#if (defined(TEST_LOAD_FROM_FILES) && TEST_LOAD_FROM_FILES==1) 
     580        status = pj_ssl_cert_load_from_files(pool, &ca_file, &cert_file,  
     581                                             &privkey_file, &privkey_pass, 
    559582                                             &cert); 
     583#else 
     584        pj_ssl_cert_buffer ca_buf, cert_buf, privkey_buf; 
     585 
     586        status = load_cert_to_buf(pool, &ca_file, &ca_buf); 
     587        if (status != PJ_SUCCESS) { 
     588            goto on_return; 
     589        } 
     590 
     591        status = load_cert_to_buf(pool, &cert_file, &cert_buf); 
     592        if (status != PJ_SUCCESS) { 
     593            goto on_return; 
     594        } 
     595 
     596        status = load_cert_to_buf(pool, &privkey_file, &privkey_buf); 
     597        if (status != PJ_SUCCESS) { 
     598            goto on_return; 
     599        } 
     600 
     601        status = pj_ssl_cert_load_from_buffer(pool, &ca_buf, &cert_buf, 
     602                                              &privkey_buf, &privkey_pass,  
     603                                              &cert); 
     604#endif 
    560605        if (status != PJ_SUCCESS) { 
    561606            goto on_return; 
     
    614659 
    615660        if (!client_provide_cert) { 
    616             pj_str_t tmp1, tmp2; 
    617  
    618             pj_strset2(&tmp1, (char*)CERT_CA_FILE); 
    619             pj_strset2(&tmp2, NULL); 
    620             status = pj_ssl_cert_load_from_files(pool,  
    621                                                  &tmp1, &tmp2, &tmp2, &tmp2, 
    622                                                  &cert); 
     661            pj_str_t ca_file = pj_str(CERT_CA_FILE); 
     662            pj_str_t null_str = pj_str(""); 
     663 
     664#if (defined(TEST_LOAD_FROM_FILES) && TEST_LOAD_FROM_FILES==1) 
     665            status = pj_ssl_cert_load_from_files(pool, &ca_file, &null_str,  
     666                                                 &null_str, &null_str, &cert); 
     667#else 
     668            pj_ssl_cert_buffer null_buf, ca_buf; 
     669 
     670            null_buf.slen = 0; 
     671 
     672            status = load_cert_to_buf(pool, &ca_file, &ca_buf); 
    623673            if (status != PJ_SUCCESS) { 
    624674                goto on_return; 
    625675            } 
     676 
     677            status = pj_ssl_cert_load_from_buffer(pool, &ca_buf, &null_buf, 
     678                                                  &null_buf, &null_str, &cert); 
     679#endif 
     680            if (status != PJ_SUCCESS) { 
     681                goto on_return; 
     682            } 
     683 
    626684        } 
    627685 
     
    825883    /* Set cert */ 
    826884    { 
    827         pj_str_t tmp1, tmp2, tmp3, tmp4; 
    828         status = pj_ssl_cert_load_from_files(pool,  
    829                                              pj_strset2(&tmp1, (char*)CERT_CA_FILE),  
    830                                              pj_strset2(&tmp2, (char*)CERT_FILE),  
    831                                              pj_strset2(&tmp3, (char*)CERT_PRIVKEY_FILE),  
    832                                              pj_strset2(&tmp4, (char*)CERT_PRIVKEY_PASS),  
     885        pj_str_t ca_file = pj_str(CERT_CA_FILE); 
     886        pj_str_t cert_file = pj_str(CERT_FILE); 
     887        pj_str_t privkey_file = pj_str(CERT_PRIVKEY_FILE); 
     888        pj_str_t privkey_pass = pj_str(CERT_PRIVKEY_PASS); 
     889 
     890#if (defined(TEST_LOAD_FROM_FILES) && TEST_LOAD_FROM_FILES==1) 
     891        status = pj_ssl_cert_load_from_files(pool, &ca_file, &cert_file,  
     892                                             &privkey_file, &privkey_pass, 
    833893                                             &cert); 
     894#else 
     895        pj_ssl_cert_buffer ca_buf, cert_buf, privkey_buf; 
     896 
     897        status = load_cert_to_buf(pool, &ca_file, &ca_buf); 
     898        if (status != PJ_SUCCESS) { 
     899            goto on_return; 
     900        } 
     901 
     902        status = load_cert_to_buf(pool, &cert_file, &cert_buf); 
     903        if (status != PJ_SUCCESS) { 
     904            goto on_return; 
     905        } 
     906 
     907        status = load_cert_to_buf(pool, &privkey_file, &privkey_buf); 
     908        if (status != PJ_SUCCESS) { 
     909            goto on_return; 
     910        } 
     911 
     912        status = pj_ssl_cert_load_from_buffer(pool, &ca_buf, &cert_buf, 
     913                                              &privkey_buf, &privkey_pass,  
     914                                              &cert); 
     915#endif 
    834916        if (status != PJ_SUCCESS) { 
    835917            goto on_return; 
     
    11321214    /* Set cert */ 
    11331215    { 
    1134         pj_str_t tmp1, tmp2, tmp3, tmp4; 
    1135  
    1136         status = pj_ssl_cert_load_from_files(pool,  
    1137                                              pj_strset2(&tmp1, (char*)CERT_CA_FILE),  
    1138                                              pj_strset2(&tmp2, (char*)CERT_FILE),  
    1139                                              pj_strset2(&tmp3, (char*)CERT_PRIVKEY_FILE),  
    1140                                              pj_strset2(&tmp4, (char*)CERT_PRIVKEY_PASS),  
     1216        pj_str_t ca_file = pj_str(CERT_CA_FILE); 
     1217        pj_str_t cert_file = pj_str(CERT_FILE); 
     1218        pj_str_t privkey_file = pj_str(CERT_PRIVKEY_FILE); 
     1219        pj_str_t privkey_pass = pj_str(CERT_PRIVKEY_PASS); 
     1220 
     1221#if (defined(TEST_LOAD_FROM_FILES) && TEST_LOAD_FROM_FILES==1) 
     1222        status = pj_ssl_cert_load_from_files(pool, &ca_file, &cert_file,  
     1223                                             &privkey_file, &privkey_pass, 
    11411224                                             &cert); 
     1225#else 
     1226        pj_ssl_cert_buffer ca_buf, cert_buf, privkey_buf; 
     1227 
     1228        status = load_cert_to_buf(pool, &ca_file, &ca_buf); 
     1229        if (status != PJ_SUCCESS) { 
     1230            goto on_return; 
     1231        } 
     1232 
     1233        status = load_cert_to_buf(pool, &cert_file, &cert_buf); 
     1234        if (status != PJ_SUCCESS) { 
     1235            goto on_return; 
     1236        } 
     1237 
     1238        status = load_cert_to_buf(pool, &privkey_file, &privkey_buf); 
     1239        if (status != PJ_SUCCESS) { 
     1240            goto on_return; 
     1241        } 
     1242 
     1243        status = pj_ssl_cert_load_from_buffer(pool, &ca_buf, &cert_buf, 
     1244                                              &privkey_buf, &privkey_pass,  
     1245                                              &cert); 
     1246#endif 
    11421247        if (status != PJ_SUCCESS) { 
    11431248            goto on_return; 
  • pjproject/trunk/pjsip/include/pjsip/sip_transport_tls.h

    r5649 r5821  
    101101     */ 
    102102    pj_str_t    privkey_file; 
     103 
     104    /** 
     105     * Certificate of Authority (CA) buffer. If ca_list_file, ca_list_path, 
     106     * cert_file or privkey_file are set, this setting will be ignored. 
     107     */ 
     108    pj_ssl_cert_buffer ca_buf; 
     109 
     110    /** 
     111     * Public endpoint certificate buffer, which will be used as client- 
     112     * side  certificate for outgoing TLS connection, and server-side 
     113     * certificate for incoming TLS connection. If ca_list_file, ca_list_path, 
     114     * cert_file or privkey_file are set, this setting will be ignored. 
     115     */ 
     116    pj_ssl_cert_buffer cert_buf; 
     117 
     118    /** 
     119     * Optional private key buffer of the endpoint certificate to be used.  
     120     * If ca_list_file, ca_list_path, cert_file or privkey_file are set,  
     121     * this setting will be ignored. 
     122     */ 
     123    pj_ssl_cert_buffer privkey_buf; 
    103124 
    104125    /** 
     
    340361    pj_strdup_with_null(pool, &dst->sigalgs, &src->sigalgs); 
    341362    pj_strdup_with_null(pool, &dst->entropy_path, &src->entropy_path); 
     363 
     364    pj_strdup(pool, &dst->ca_buf, &src->ca_buf); 
     365    pj_strdup(pool, &dst->cert_buf, &src->cert_buf); 
     366    pj_strdup(pool, &dst->privkey_buf, &src->privkey_buf); 
     367 
    342368    if (src->ciphers_num) { 
    343369        unsigned i; 
  • pjproject/trunk/pjsip/include/pjsua2/siptypes.hpp

    r5807 r5821  
    144144     */ 
    145145    string              password; 
     146 
     147    /** 
     148     * Certificate of Authority (CA) buffer. If CaListFile, certFile or 
     149     * privKeyFile are set, this setting will be ignored. 
     150     */ 
     151    string              CaBuf; 
     152 
     153    /** 
     154     * Public endpoint certificate buffer, which will be used as client- 
     155     * side  certificate for outgoing TLS connection, and server-side 
     156     * certificate for incoming TLS connection. If CaListFile, certFile or 
     157     * privKeyFile are set, this setting will be ignored. 
     158     */ 
     159    string              certBuf; 
     160 
     161    /** 
     162     * Optional private key buffer of the endpoint certificate to be used.  
     163     * If CaListFile, certFile or privKeyFile are set, this setting will  
     164     * be ignored. 
     165     */ 
     166    string              privKeyBuf; 
    146167 
    147168    /** 
  • pjproject/trunk/pjsip/src/pjsip/sip_transport_tls.c

    r5649 r5821  
    587587    if (listener->tls_setting.cert_file.slen || 
    588588        listener->tls_setting.ca_list_file.slen || 
    589         listener->tls_setting.ca_list_path.slen)  
     589        listener->tls_setting.ca_list_path.slen ||  
     590        listener->tls_setting.privkey_file.slen)  
    590591    { 
    591592        status = pj_ssl_cert_load_from_files2(pool, 
     
    598599        if (status != PJ_SUCCESS) 
    599600            goto on_error; 
     601    } else if (listener->tls_setting.ca_buf.slen || 
     602               listener->tls_setting.cert_buf.slen|| 
     603               listener->tls_setting.privkey_buf.slen) 
     604    { 
     605        status = pj_ssl_cert_load_from_buffer(pool, 
     606                        &listener->tls_setting.ca_buf, 
     607                        &listener->tls_setting.cert_buf, 
     608                        &listener->tls_setting.privkey_buf, 
     609                        &listener->tls_setting.password, 
     610                        &listener->cert); 
     611        if (status != PJ_SUCCESS) 
     612            goto on_error;     
    600613    } 
    601614 
  • pjproject/trunk/pjsip/src/pjsua2/siptypes.cpp

    r5807 r5821  
    164164    ts.privkey_file     = str2Pj(this->privKeyFile); 
    165165    ts.password         = str2Pj(this->password); 
     166    ts.ca_buf           = str2Pj(this->CaBuf); 
     167    ts.cert_buf         = str2Pj(this->certBuf); 
     168    ts.privkey_buf      = str2Pj(this->privKeyBuf); 
    166169    ts.method           = this->method; 
    167170    ts.ciphers_num      = (unsigned)this->ciphers.size(); 
     
    189192    this->privKeyFile   = pj2Str(prm.privkey_file); 
    190193    this->password      = pj2Str(prm.password); 
     194    this->CaBuf         = pj2Str(prm.ca_buf); 
     195    this->certBuf       = pj2Str(prm.cert_buf); 
     196    this->privKeyBuf    = pj2Str(prm.privkey_buf); 
    191197    this->method        = (pjsip_ssl_method)prm.method; 
    192198    this->proto         = prm.proto; 
     
    211217    NODE_READ_STRING  ( this_node, privKeyFile); 
    212218    NODE_READ_STRING  ( this_node, password); 
     219    NODE_READ_STRING  ( this_node, CaBuf); 
     220    NODE_READ_STRING  ( this_node, certBuf); 
     221    NODE_READ_STRING  ( this_node, privKeyBuf); 
    213222    NODE_READ_NUM_T   ( this_node, pjsip_ssl_method, method); 
    214223    readIntVector     ( this_node, "ciphers", ciphers); 
     
    230239    NODE_WRITE_STRING  ( this_node, privKeyFile); 
    231240    NODE_WRITE_STRING  ( this_node, password); 
     241    NODE_WRITE_STRING  ( this_node, CaBuf); 
     242    NODE_WRITE_STRING  ( this_node, certBuf); 
     243    NODE_WRITE_STRING  ( this_node, privKeyBuf); 
    232244    NODE_WRITE_NUM_T   ( this_node, pjsip_ssl_method, method); 
    233245    writeIntVector     ( this_node, "ciphers", ciphers); 
Note: See TracChangeset for help on using the changeset viewer.