2016-04-05 25 views
1

は、ここでのOpenSSLウィキにEVP Message Digestsから取られた例です:EVP_DigestUpdateと「『CONSTのchar *』に 『* unsigned char型』から無効な変換」

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); 
} 

問題は、私はそれをコンパイルしようとすると、私が手であります次のエラー:strlenconst charを想定しているため

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メッセージに呼び出されると、エラーの原因は?これは文字列がconst charsの配列なのでですか?

この問題を解決するには、どうしたらよいですか?

+0

Lol ...私たちはOpenSSLのC++コンパイラサポートについて話していました。 [C++コンパイラでコンパイルするときのコンパイルエラー](https://mta.openssl.org/pipermail/openssl-dev/2016-March/006353.html)を参照してください。コンセンサスはC++コンパイラを「理由があるから」サポートしないことです。私が知る限り、技術的な理由はありません。 – jww

答えて

0

それが修正されました:

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); 
} 

あなたはstrlencharの配列ではなく、unsigned charまたはbyteを必要とすること正しかったです。

大きな問題はデザイン/エンジニアリングでした。バイト配列がC文字列のようにNULLで終了する保証はないので、明示的な長さパラメータが必要でした。実際、バイト配列にはいくつかのNULLが埋め込まれていることがあります。

関連する問題