4

我有一个看起来像这样的程序:

EVP_PKEY *generate_RSA_key_and_uuid(unsigned char uuid[16])
{
    EVP_PKEY        *key_p;
    key_p = EVP_PKEY_new();
    return key_p;  
}

int build_and_save_csr(int dn_entries, X509_REQ *req_p, EVP_PKEY *priv_key_p, char *passphrase)
{   
    priv_key_p = generate_RSA_key_and_uuid(uuid);
}

int makecsr(X509_REQ *req_p, EVP_PKEY *priv_key_p, char *passphrase)
{

    if (build_and_save_csr(2, req_p, priv_key_p, passphrase) != 0) {
        fprintf(stderr, "Could not create csr file / private key...\n");
        exit(1);
    }

    return 0;
}

int main(int argc, char *argv[])
{

    EVP_PKEY        *priv_key_p;
    X509_REQ        *req_p;

    makecsr(req_p, priv_key_p, passphrase);
    return 0;
}

运行后,*priv_key_p应该包含从*generate_RSA_key_and_uuid.

在 gdb 中,我可以看到末尾generate_RSA_and_uuid包含key_p正确的值,但在priv_key_p = generate_RSA_key_and_uuid(uuid);执行后priv_key_p为空。

有人知道如何正确地将值分配给指针吗?

4

2 回答 2

7

您需要一个额外的间接级别,否则您只是在修改指针的本地副本而没有返回任何内容:

int build_and_save_csr(int dn_entries, X509_REQ *req_p, EVP_PKEY **priv_key_p, char *passphrase)
{   
    *priv_key_p = generate_RSA_key_and_uuid(uuid);
}

int makecsr(X509_REQ *req_p, EVP_PKEY **priv_key_p, char *passphrase)
{
    if (build_and_save_csr(2, req_p, priv_key_p, passphrase) != 0) {
        fprintf(stderr, "Could not create csr file / private key...\n");
        exit(1);
    }
    return 0;
}

int main(int argc, char *argv[])
{
    EVP_PKEY        *priv_key_p;
    X509_REQ        *req_p;

    makecsr(req_p, &priv_key_p, passphrase);
    return 0;
}

或者,您可以使用函数结果(就像您已经在 中所做的那样generate_RSA_key_and_uuid())返回指针(可能在错误时返回 NULL) - 这消除了对额外间接级别的需要。

于 2013-10-10T13:00:36.310 回答
4

那是因为您需要将指针传递给指针。

int makecsr(X509_REQ *req_p, EVP_PKEY *priv_key_p, char *passphrase)

应该:

int makecsr(X509_REQ *req_p, EVP_PKEY **priv_key_p, char *passphrase)

您将通过以下方式调用它:

makecsr(req_p, &priv_key_p, passphrase);

你还必须改变:

int build_and_save_csr(int dn_entries, X509_REQ *req_p, EVP_PKEY *priv_key_p, char *passphrase)

至:

int build_and_save_csr(int dn_entries, X509_REQ *req_p, EVP_PKEY **priv_key_p, char *passphrase)

并做:

*priv_key_p = generate_RSA_key_and_uuid(uuid);

那是为了修复,现在解释:

在这个函数中:

int build_and_save_csr(int dn_entries, X509_REQ *req_p, EVP_PKEY *priv_key_p, char *passphrase)
{   
    priv_key_p = generate_RSA_key_and_uuid(uuid);
}

prev_key_p最初指向,嗯,某处。然后你说它现在应该指向generate_RSA_key_and_uuid.

问题是 的新值priv_key_p只对函数局部build_and_save_csr。即使它的名称相同,它也不是同一个变量。

这可以通过添加另一个间接级别来解决。

它实际上与此相同的问题:

void inc(int a) {
  a += 1;
}

这没有效果,而正确的功能是:

void inc(int *a) {
  *a += 1;
}

在您的情况下,您的类型不是intbut EVP_PKEY *

于 2013-10-10T13:00:59.047 回答