0

我有一个从服务器获取多个X.509证书的功能。X509 *我希望它在 OpenSSL 的结构中“返回”这些证书的数组。但是由于我的界面返回错误代码,我想使用一个 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);

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

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

4

2 回答 2

0

只需应用左右阅读规则......X509 ***certs意味着 certs 是指向指向 X509 的指针的指针。因此,如果您想将 a 返回X509**给调用者,则调用者需要将 an 传递给您,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**另一种方法是从函数中返回 a ...

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;
}
于 2013-04-14T18:03:59.420 回答
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。这是一个很好的抽象,解决了我的问题。

于 2013-04-14T19:24:27.307 回答