2013-04-14 54 views
0

我有一个从服务器获取多个X.509证书的函数。我希望它在OpenSSL的X509 *结构中“返回”这些证书的数组。但由于我的界面返回错误代码,我想使用一个out参数。带有指向Out参数中对象的动态数组

如果我没有误导,这将需要我使用带3(!)*(例如X509 ***certs)的指针。我在这里是因为我个人觉得非常混乱。以下是我打算做,我想知道如果我是完全错误的轨道上(在我看来):

int get_certs(X509 ***certs) 
{ 
    X509 **local_certs; 
    int i; 
    local_certs = malloc(no_of_certs * sizeof(X509 *)); 
    // fetch certs 
    for(i=0; i < no_of_certs; ++i) 
    { 
     // load single cert into variable "cert" 
     local_certs[i] = cert 
    } 
    *certs = local_certs; 
} 

的调用会再看看大概是这个样子:

X509 **certs; 
get_certs(&certs); 

这是正确的方法吗?因为对我来说这个三重指针看起来很奇怪。

注意:我不知道会有多少证书,所以它必须是一个动态数组。

回答

0

只需应用左右读取规则... X509 ***certs意味着certs是指向指向X509的指针的指针。所以,如果你想返回一个X509**给来电者,来电者需要通过你一个X509***供你存储。

另外,我不确定你处理单个证书的逻辑是否正确。它应该看起来像这样(imo) - 注意for循环中的额外malloc。

int get_certs(X509 ***certs) 
{ 
    X509 **local_certs; 
    int i; 
    local_certs = malloc(no_of_certs * sizeof(X509 *)); 
    // fetch certs 
    for(i=0; i < no_of_certs; ++i) 
    { 
     X509* cert = malloc(sizeof(X509)); 
     // load single cert into variable "cert" 
     local_certs[i] = cert 
    } 
    *certs = local_certs; 
} 

另一种方法是从函数返回一个X509** ...

X509** get_certs(int no_of_certs) 
{ 
    X509 **local_certs; 
    int i; 
    local_certs = malloc(no_of_certs * sizeof(X509 *)); 
    // fetch certs 
    for(i=0; i < no_of_certs; ++i) 
    { 
     X509* cert = malloc(sizeof(X509)); 
     // load single cert into variable "cert" 
     local_certs[i] = cert 
    } 
    return local_certs; 
} 
+0

1.额外的malloc不是必需的,因为'cert'是由源正确分配的。 2.返回不是一个选项,必须是错误代码。 – javex

+0

不够公平......然后在我的回答的第一段中给出你的问题的答案,其余的是多余的。 –

0

我有错,我知道这感觉错误。这是第一个问题:如果以这种方式返回,我怎么知道那里有多少个证书?我不。但OpenSSL的已经解决了所谓的堆栈:

int get_certs(STACK_OF(X509) **certs) 
{ 
    STACK_OF(X509) *local_certs; 
    int i; 
    // load variable local_certs with content 
    // in my case that is a PKCS#7 data structure 
    *certs = local_certs; 
} 

我缩短了我的数据源,因为我已经知道,但它更加复杂。这看起来好多了,OpenSSL现在提供了一些功能,如sk_X509_pushsk_X509_num。这是一个很好的抽象,并解决了我的问题。