#include "des56.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define ENCRYPT    0
#define DECRYPT    1
 
 
void XORblock(char A[8], char B[8], char result[8])
{
    int i = 0;
    for(;i<8;i++)
        result[i] = A[i]^B[i];
}
void printhex(unsigned char block[8])
{
    int i=0;
    for(;i<8;i++)
        printf(" 0x%x ",block[i]);
    puts("");
}
void cbc_enc_three_blocks(char block1[8], char block2[8], char block3[8], char IV[8],keysched *ks)
{
    XORblock(block1, IV, block1);
    fencrypt(block1, 0, ks);
    XORblock(block2, block1, block2);
    fencrypt(block2, 0, ks);
    XORblock(block3, block2, block3);
    fencrypt(block3, 0, ks);
}
void cbc_dec_three_blocks(char block1[8], char block2[8], char block3[8], char IV[8],keysched *ks)
{
    char temp1[8];
    char temp2[8];
    char temp3[8];
    for(int i = 0; i < 8; i++)
    {
        temp1[i] = block1[i];
        temp2[i] = block2[i];
        temp3[i] = block3[i];
    }
    fencrypt(block1,1,ks);
    XORblock(block1, IV, block1);
    fencrypt(block2,1,ks);
    XORblock(block2, temp1, block2);
    fencrypt(block3,1,ks);
    XORblock(block3, temp2, block3);
}
int main()
{
    unsigned char key[8] = {1,2,3,4,5,6,7,8};  
    keysched *ks = malloc(sizeof(keysched));   
    fsetkey(key,ks);                           
    unsigned char* all_blocks = malloc(3*8*sizeof(char)); 
    bzero(all_blocks,8*3);                     
    all_blocks[0] = 'A';                       
    
    FILE* pt_f = fopen("plaintext.txt","wb");
    fwrite(all_blocks,8,3,pt_f); 
    fclose(pt_f);
    unsigned char IV[8] = {0};                  
    cbc_enc_three_blocks(all_blocks,all_blocks+8,all_blocks+16,IV,ks);   
    FILE* fp = fopen("encryption.des","wb");                             
    fwrite(all_blocks,8,3,fp); 
    fclose(fp);
    cbc_dec_three_blocks(all_blocks,all_blocks+8,all_blocks+16,IV,ks);   
    fp = fopen("decryption.txt","wb");                                   
    fwrite(all_blocks,8,3,fp); 
    fclose(fp);
}