#include #include #include "crypto_buffer.h" #include int crypto_buffer_init(crypto_buffer *s, int fd, operation op, u32 blocks, int type, u8 *key, u32 key_len) { int ret; int size; if(blocks<3) return -1; /* magic + info + data */ s->fd = fd; s->op = op; if(type & BLOWFISH){ size = BF_BLOCK_SIZE; ret = blowfish_setkey((struct blowfish_ctx*)&s->ctx, key, key_len, 0); if(type & DECRYPT){ s->cipher = blowfish_decrypt; } else { s->cipher = blowfish_encrypt; } } else if(type & TWOFISH){ size = TF_BLOCK_SIZE; ret = twofish_setkey((struct twofish_ctx*)&s->ctx, key, key_len, 0); if(type & DECRYPT) { s->cipher = twofish_decrypt; } else {s->cipher = twofish_encrypt; } } else if(type & AES){ size = AES_BLOCK_SIZE; ret = aes_setkey((struct aes_ctx*)&s->ctx, key, key_len, 0); if(type & DECRYPT) { s->cipher = aes_decrypt; } else {s->cipher = aes_encrypt; } } else if(type & DES){ size = DES_BLOCK_SIZE; ret = des_setkey((struct des_ctx*)&s->ctx, key, key_len, 0); if(type & DECRYPT) { s->cipher = des_decrypt; } else {s->cipher = des_encrypt; } } else if(type & DES3_EDE){ size = DES3_EDE_BLOCK_SIZE; ret = des3_ede_setkey((struct des3_ede_ctx*)&s->ctx, key, key_len, 0); if(type & DECRYPT) { s->cipher = des3_ede_decrypt; } else {s->cipher = des3_ede_encrypt; } } else return -1; if(ret!=0) return -1; if((U32_MAX / size) < blocks) return -1; s->block_size = size; s->e_len = size * blocks; /* TODO check overflow */ s->data_st.bytes = s->data_st.strlen = 0; /* clear buffer */ s->c_buffer = malloc(size); if(s->c_buffer==NULL) return -1; s->c_ptr = s->c_buffer; s->c_end = s->c_buffer + size; /* encrypte buffer */ s->e_buffer = malloc(s->e_len); if(s->e_buffer==NULL) return -1; memset(s->e_buffer,0x5a,size); /* for write operation */ s->e_data = (struct info*)(s->e_buffer + size); s->e_end = s->e_buffer + s->e_len; if(type & DECRYPT){ s->e_ptr = s->e_buffer; } else{ s->e_ptr = s->e_buffer + (size << 1); s->e_len -= (size << 1); } /* fprintf(stderr,"e_buffer : %x\n",s->e_buffer); fprintf(stderr,"e_data : %x\n",s->e_data); fprintf(stderr,"e_ptr : %x\n",s->e_ptr); fprintf(stderr,"e_end : %x\n",s->e_end); fprintf(stderr,"length : %d\n",s->e_len); */ return ret; }