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.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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_; 
Note: See TracChangeset for help on using the changeset viewer.