EVP_DigestUpdate 和 "invalid conversion from ‘unsigned char*’ to ‘const char*’"
EVP_DigestUpdate and "invalid conversion from ‘unsigned char*’ to ‘const char*’"
以下是从 OpenSSL wiki 上的 EVP Message Digests 获取的示例:
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 char
或 byte
。
更大的问题是 design/engineering。需要一个明确的长度参数,因为不能保证字节数组像 C 字符串一样以 NULL 结尾。事实上,字节数组中可能嵌入了一些 NULL。
以下是从 OpenSSL wiki 上的 EVP Message Digests 获取的示例:
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 char
或 byte
。
更大的问题是 design/engineering。需要一个明确的长度参数,因为不能保证字节数组像 C 字符串一样以 NULL 结尾。事实上,字节数组中可能嵌入了一些 NULL。