はじめに
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です。
以上。