diff options
Diffstat (limited to 'crypto_buffer.c')
-rw-r--r-- | crypto_buffer.c | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/crypto_buffer.c b/crypto_buffer.c new file mode 100644 index 0000000..d17e805 --- /dev/null +++ b/crypto_buffer.c @@ -0,0 +1,82 @@ +#include <stdlib.h> +#include <string.h> + +#include "crypto_buffer.h" + + +#include <stdio.h> +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; +} |