/* mycipher_fp.c * EVP 関数による暗号化・復号のサンプル(FILE*版) */ #include #include "mycipher_fp.h" /* * ファイルを暗号化・復号する関数(FILE*版) * 返り値: * 0 失敗 * 1 成功 */ int kencdec_from_FP_to_FP( char *cipher_alg /* IN:暗号アルゴリズム。OpenSSL の指定に基づく。暗号名+"-"+鍵長+"-"+暗号モード */ , unsigned char *keyData /* IN:暗号鍵のオクテット列 */ , int keyLen /* IN:暗号鍵の長さ(オクテット長) */ , unsigned char *ivData /* IN:初期化ベクトルのオクテット列 */ , int ivLen /* IN:初期化ベクトルの長さ(オクテット長) */ , FILE *fpIn /* IN:入力ファイルポインタ */ , FILE *fpOut /* OUT:出力ファイルポインタ */ , int type /* IN:処理タイプ。1:暗号化、0:復号 */ ) { int result = 1; const EVP_CIPHER *evp_cipher = NULL; EVP_CIPHER_CTX ctx; unsigned char inBuf[ENCDEC_BUFF_SIZE]; unsigned char outBuf[ENCDEC_BUFF_SIZE]; int inLen = 0; int outLen=0; if (NULL == cipher_alg || NULL == fpIn || NULL == fpOut) { if(1)fprintf (stderr, "ERROR: kencdec_from_FP_to_FP: argument null.\n"); return 0; } OpenSSL_add_all_ciphers(); if (NULL == (evp_cipher = EVP_get_cipherbyname(cipher_alg))) { if(1)fprintf(stderr, "ERROR: kencdec_from_FP_to_FP: EVP_get_cipherbyname\n"); return 0; } EVP_CIPHER_CTX_init(&ctx); if (!EVP_CipherInit(&ctx, evp_cipher, keyData, ivData, type/*ENCRYPT:1,DECRYPT:0*/)) { if(1)fprintf(stderr, "ERROR: kencdec_from_FP_to_FP: EVP_CipherInit\n"); result = 0; goto _FINALLY_; } EVP_CIPHER_CTX_set_padding(&ctx, 1); while ((inLen = fread(inBuf, sizeof(unsigned char), ENCDEC_BUFF_SIZE, fpIn)) > 0) { outLen = 0; if (EVP_CipherUpdate(&ctx, outBuf, &outLen, inBuf, inLen)) { fwrite(outBuf, sizeof(unsigned char), outLen, fpOut); } else { if(1)fprintf(stderr, "ERROR: kencdec_from_FP_to_FP: EVP_CipherUpdate\n"); result = 0; goto _FINALLY_; } } outLen = 0; if (EVP_CipherFinal(&ctx, outBuf, &outLen)) { fwrite(outBuf, sizeof(unsigned char), outLen, fpOut); } else { if(1)fprintf(stderr, "ERROR: kencdec_from_FP_to_FP: EVP_CipherFinal\n"); result = 0; } _FINALLY_: EVP_CIPHER_CTX_cleanup(&ctx); return result; }