繁体   English   中英

EVP_DigestUpdate和“从'unsigned char *'到'const char *'的无效转换”

[英]EVP_DigestUpdate and “invalid conversion from ‘unsigned char*’ to ‘const char*’”

以下是OpenSSL wiki上EVP消息摘要的示例:

void digest_message(unsigned char *message, unsigned char **digest, unsigned int *digest_len)
{
    EVP_MD_CTX *mdctx;

    if((mdctx = EVP_MD_CTX_create()) == NULL)
        handleErrors();

    if(1 != EVP_DigestInit_ex(mdctx, EVP_sha256(), NULL))
        handleErrors();

    if(1 != EVP_DigestUpdate(mdctx, message, strlen(message)))
        handleErrors();

    if((*digest = (unsigned char *)OPENSSL_malloc(EVP_MD_size(EVP_sha256()))) == NULL)
        handleErrors();

    if(1 != EVP_DigestFinal_ex(mdctx, *digest, digest_len))
        handleErrors();

    EVP_MD_CTX_destroy(mdctx);
}

问题是当我尝试编译它时,我收到以下错误:

evp_test.cpp:18:60: error: invalid conversion from ‘unsigned char*’ to ‘const char*’ [-fpermissive]
 if(1 != EVP_DigestUpdate(mdctx, message, strlen(message)))

In file included from /usr/include/c++/5/cstring:42:0

因此strlen被调用消息会导致错误,因为strlen需要一个const char 这是因为字符串是const chars数组吗?

我应该采取哪些不同的方式解决问题?

它已被修复:

void digest_message(const unsigned char *message, size_t message_len,
                    unsigned char **digest, unsigned int *digest_len)
{
    EVP_MD_CTX *mdctx;

    if((mdctx = EVP_MD_CTX_create()) == NULL)
        handleErrors();

    if(1 != EVP_DigestInit_ex(mdctx, EVP_sha256(), NULL))
        handleErrors();

    if(1 != EVP_DigestUpdate(mdctx, message, message_len))
        handleErrors();

    if((*digest = (unsigned char *)OPENSSL_malloc(EVP_MD_size(EVP_sha256()))) == NULL)
        handleErrors();

    if(1 != EVP_DigestFinal_ex(mdctx, *digest, digest_len))
        handleErrors();

    EVP_MD_CTX_destroy(mdctx);
}

你是对的, strlen需要一个char数组,而不是unsigned charbyte

更大的问题是设计/工程。 需要显式长度参数,因为不能保证字节数组像C字符串一样以NULL结尾。 实际上,字节数组中可能嵌入了一些NULL。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM