Ignore:
Timestamp:
Jul 15, 2018 2:09:23 PM (2 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_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_; 
Note: See TracChangeset for help on using the changeset viewer.