【不透明型へのアクセス】OpenSSLの関数へのアクセス【storage size of ‘’ isn’t known】

はじめに

c言語でOpenSSLを使う機会があったのですが、
不透明型(OPAQUE型)でちょっと手こずったので、備忘録に残します。

ここについて言及している記事が少ないようなので、
お困りでしたらご活用ください。

不透明型(OPAQUE型)により構造体が不可視

C言語でOpenSSLを実装しようということで、
良い記事があったので、こちらを参考に動かしてみようと思いました。

以下、参考記事のURLとコードの一部引用です。

#include        <openssl/aes.h>
int main(int argc,char *argv[])
{
EVP_CIPHER_CTX  en;
char    *key,*data;
int     datasize;
int     i,c_len,f_len=0;
unsigned char   *ciphertext;
        if(argc<=2){
                fprintf(stderr,”aesencrypt key data\n”);
                return(-1);
        }
        key=argv[1];
        if(strlen(key)!=EVP_CIPHER_key_length(EVP_aes_128_ecb())){
                fprintf(stderr,”key length must be%d\n”,EVP_CIPHER_key_length(EVP_aes_128_ecb()));
                return(-1);
        }
        data=argv[2];
        datasize=strlen(data);
        EVP_CIPHER_CTX_init(&en);
        EVP_EncryptInit_ex(&en,EVP_aes_128_ecb(),NULL,(unsigned char *)key,NULL);
        c_len=datasize+EVP_MAX_BLOCK_LENGTH;
        ciphertext=calloc(c_len,sizeof(char));
        EVP_EncryptUpdate(&en,(unsigned char *)ciphertext,&c_len,(unsigned char *)data,datasize);
        EVP_EncryptFinal_ex(&en,(unsigned char *)(ciphertext+c_len),&f_len);
        for(i=0;i<c_len+f_len;i++){
                printf(“%02x”,ciphertext[i]);
        }
        putchar(‘\n’);
        free(ciphertext);
        EVP_CIPHER_CTX_cleanup(&en);
        return(0);
}

よし、コンパイルしよう!と思ったら、、、
コンパイルエラー、動かん。。

以下、エラー内容です。

g_decrypt.c:4:20: error: storage size of ‘de’ isn’t known

「de」のストレージサイズが不明、、、

調べてみると、
冒頭で述べた通り、不透明型(OPAQUE型)が要因らしいです。
どうやらOpenSSLがver1.1.0から、

公開のヘッダからデータ構造が削除のため、
EVP_CIPHER_CTX  en;がNGだそうです。

(ここで、参考にした記事が結構前のものだったことに気づく、、、)

なので、以下のようにすればOKです。

EVP_CIPHER_CTX  *en;
en = EVP_CIPHER_CTX_new();

あと、
enがアドレス型の変数になったので、
&en」となっている個所が「en」でOKです。

以上。

Follow me!

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です