mycipher_fp.c
最終更新:2009/10/10
001: /* mycipher_fp.c 002: * EVP 関数による暗号化・復号のサンプル(FILE*版) 003: */ 004: 005: #include <openssl/evp.h> 006: 007: #include "mycipher_fp.h" 008: 009: /* 010: * ファイルを暗号化・復号する関数(FILE*版) 011: * 返り値: 012: * 0 失敗 013: * 1 成功 014: */ 015: 016: int kencdec_from_FP_to_FP( 017: char *cipher_alg /* IN:暗号アルゴリズム。OpenSSL の指定に基づく。暗号名+"-"+鍵長+"-"+暗号モード */ 018: , unsigned char *keyData /* IN:暗号鍵のオクテット列 */ 019: , int keyLen /* IN:暗号鍵の長さ(オクテット長) */ 020: , unsigned char *ivData /* IN:初期化ベクトルのオクテット列 */ 021: , int ivLen /* IN:初期化ベクトルの長さ(オクテット長) */ 022: , FILE *fpIn /* IN:入力ファイルポインタ */ 023: , FILE *fpOut /* OUT:出力ファイルポインタ */ 024: , int type /* IN:処理タイプ。1:暗号化、0:復号 */ 025: ) { 026: int result = 1; 027: 028: const EVP_CIPHER *evp_cipher = NULL; 029: EVP_CIPHER_CTX ctx; 030: 031: unsigned char inBuf[ENCDEC_BUFF_SIZE]; 032: unsigned char outBuf[ENCDEC_BUFF_SIZE]; 033: 034: int inLen = 0; 035: int outLen=0; 036: 037: if (NULL == cipher_alg || NULL == fpIn || NULL == fpOut) { 038: if(1)fprintf (stderr, "ERROR: kencdec_from_FP_to_FP: argument null.\n"); 039: return 0; 040: } 041: 042: OpenSSL_add_all_ciphers(); 043: 044: if (NULL == (evp_cipher = EVP_get_cipherbyname(cipher_alg))) { 045: if(1)fprintf(stderr, "ERROR: kencdec_from_FP_to_FP: EVP_get_cipherbyname\n"); 046: return 0; 047: } 048: EVP_CIPHER_CTX_init(&ctx); 049: 050: if (!EVP_CipherInit(&ctx, evp_cipher, keyData, ivData, type/*ENCRYPT:1,DECRYPT:0*/)) { 051: if(1)fprintf(stderr, "ERROR: kencdec_from_FP_to_FP: EVP_CipherInit\n"); 052: result = 0; 053: goto _FINALLY_; 054: } 055: 056: EVP_CIPHER_CTX_set_padding(&ctx, 1); 057: 058: while ((inLen = fread(inBuf, sizeof(unsigned char), ENCDEC_BUFF_SIZE, fpIn)) > 0) { 059: outLen = 0; 060: if (EVP_CipherUpdate(&ctx, outBuf, &outLen, inBuf, inLen)) { 061: fwrite(outBuf, sizeof(unsigned char), outLen, fpOut); 062: } else { 063: if(1)fprintf(stderr, "ERROR: kencdec_from_FP_to_FP: EVP_CipherUpdate\n"); 064: result = 0; 065: goto _FINALLY_; 066: } 067: } 068: 069: outLen = 0; 070: if (EVP_CipherFinal(&ctx, outBuf, &outLen)) { 071: fwrite(outBuf, sizeof(unsigned char), outLen, fpOut); 072: } else { 073: if(1)fprintf(stderr, "ERROR: kencdec_from_FP_to_FP: EVP_CipherFinal\n"); 074: result = 0; 075: } 076: 077: _FINALLY_: 078: 079: EVP_CIPHER_CTX_cleanup(&ctx); 080: 081: return result; 082: 083: }
KAKU PROJECT (2009) |