Need some help here, can't figure what's wrong.
here is the error:
LNK2005 "int_cded encryptData(char *,int)" (?encryptData@@YAHPADH@Z) already defined in main.obj
LNK2005 "int_cded decrypttData(char *,int)" (?decryptData@@YAHPADH@Z) already defined in main.obj
Header.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#define CRYPTO_ORDER "ABCDE\0"
#include <windows.h>
#include <stdio.h>
#include <io.h>
#define _CRT_SECURE_NO_WARNINGS
#define CRYPTO_ORDER "ABCDE\0"
#define var_Index -4
#define var_HopCnt -8
#define var_RoundNum -12
#define var_DataLength -16
#define FALL_2017 201708
#define SPRING_2018 201801
#define SUMMER_2018 201806
#define FALL_2018 201808
#define CURRENT_SEMESTER FALL_2018
int sha256(char* fileName, char* dataBuffer, DWORD dataLength, unsigned char sha256sum[32]);
void encryptData_01(char* data, int length);
void decryptData_01(char* data, int length);
void encryptData_02(char* data, int length);
void decryptData_02(char* data, int length);
int encryptData_03(char* data, int length);
int decryptData_03(char* data, int length);
int encryptData_Final(char* data, int length);
int decryptData_Final(char* data, int length);
extern unsigned char gkey[65537];
extern unsigned char* gptrKey;
extern char gPassword[256];
extern unsigned char gPasswordHash[32];
extern unsigned char* gptrPasswordHash;
extern char gCRYPTO_ORDER[8];
extern unsigned char gdebug1, gdebug2;
extern FILE* gfptrIn;
extern FILE* gfptrOut;
extern FILE* gfptrKey;
extern char gInFileName[256];
extern char gOutFileName[256];
extern char gKeyFileName[256];
extern int gOp; extern int gNumRounds1;
extern unsigned char gEncodeTable[256];
extern unsigned char gDecodeTable[256];
EncryptData_Initial.cpp
#include "Header.h"
int encryptData(char* data, int dataLength)
{
int resulti = 0;
unsigned char gdebug1 = 0; unsigned char gdebug2 = 0;
__asm {
mov esi, gptrPasswordHash
xor eax, eax
mov al, byte ptr[esi]
shl ax, 8
xor ecx, ecx
mov cl, byte ptr[esi + 1]
add ax, cx
xor ebx, ebx
xor ecx, ecx
mov ecx, dataLength
cmp ecx, 0
sub ecx, 1
jbe lbl_EXIT_ZERO_LENGTH
mov edi, data
mov esi, gptrKey
lbl_LOOP :
mov dl, byte ptr[edi + ebx]
xor dl, byte ptr[esi + eax]
mov byte ptr[edi + ebx], dl
add ebx, 1
cmp ebx, ecx
ja lbl_EXIT_END
jmp lbl_LOOP
lbl_EXIT_ZERO_LENGTH :
sub ebx, 1
jmp lbl_EXIT
lbl_EXIT_END :
xor ebx, ebx
lbl_EXIT :
mov resulti, ebx
}
return resulti;
}
decryptData_Initial.cpp
#include "Header.h"
int decryptData(char* data, int dataLength)
{
int resulti = 0;
unsigned char gdebug1 = 0; unsigned char gdebug2 = 0;
__asm {
mov esi, gptrPasswordHash
xor eax, eax
mov al, byte ptr[esi]
shl ax, 8
xor ecx, ecx
mov cl, byte ptr[esi + 1]
add ax, cx
xor ebx, ebx
xor ecx, ecx
mov ecx, dataLength
cmp ecx, 0
sub ecx, 1
jbe lbl_EXIT_ZERO_LENGTH
mov edi, data
mov esi, gptrKey
lbl_LOOP :
mov dl, byte ptr[edi + ebx]
xor dl, byte ptr[esi + eax]
mov byte ptr[edi + ebx], dl
add ebx, 1
cmp ebx, ecx
ja lbl_EXIT_END
jmp lbl_LOOP
lbl_EXIT_ZERO_LENGTH :
sub ebx, 1
jmp lbl_EXIT
lbl_EXIT_END :
xor ebx, ebx
lbl_EXIT :
mov resulti, ebx
}
return resulti;
}
main.cpp
#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#include <stdio.h>
#include <io.h>
#include <string.h>
#include "Header.h"
#include "EncryptData_Initial.cpp"
#include "DecryptData_Initial.cpp"
int encryptFile(FILE* fptrIn, FILE* fptrOut)
{
char* buffer;
unsigned int filesize;
filesize = _filelength(_fileno(fptrIn)); if (filesize > 0x1000000) {
fprintf(stderr, "Error - Input file too large.\n\n");
return -1;
}
buffer = (char*)malloc(filesize);
if (buffer == NULL)
{
fprintf(stderr, "Error - Could not allocate %d bytes of memory on the heap.\n\n", filesize);
return -1;
}
fread(buffer, 1, filesize, fptrIn); encryptData(buffer, filesize);
fwrite(buffer, 1, filesize, fptrOut);
free(buffer);
return 0;
}
int decryptFile(FILE* fptrIn, FILE* fptrOut)
{
char* buffer;
unsigned int filesize;
filesize = _filelength(_fileno(fptrIn));
if (filesize > 0x1000000)
{
fprintf(stderr, "Error - Input file too large.\n\n");
return -1;
}
buffer = (char*)malloc(filesize);
if (buffer == NULL)
{
fprintf(stderr, "Error - Could not allocate %d bytes of memory on the heap.\n\n", filesize);
return -1;
}
fread(buffer, 1, filesize, fptrIn);
decryptData(buffer, filesize);
fwrite(buffer, 1, filesize, fptrOut);
free(buffer);
return 0;
}
FILE* openInputFile(char* filename)
{
FILE* fptr;
fptr = fopen("AfterDebugging.jpg", "rb");
if (fptr == NULL)
{
fprintf(stderr, "\n\nError - Could not open input file %s!\n\n", filename);
exit(-1);
}
return fptr;
}
FILE* openOutputFile(char* filename)
{
FILE* fptr;
fptr = fopen("AfterDebugging.jpg", "wb+");
if (fptr == NULL)
{
fprintf(stderr, "\n\nError - Could not open output file %s!\n\n", filename);
exit(-1);
}
return fptr;
}
void usage(char* argv[]) {
printf("\n\nUsage:\n\n");
printf("%s -<e=encrypt or d=decrypt> -i <message_filename> -k <keyfile> -p <password> [-r <#rounds>]\n\n", argv[0]);
printf("-e :encrypt the specified file\n");
printf("-d :decrypt the specified file\n");
printf("-i filename :the name of the file to encrypt or decrypt\n");
printf("-p password :the password to be used for encryption [default='password']\n");
printf("-r <#rounds> :number of encryption rounds (1 - 3) [default = 1]\n");
printf("-o filename :name of the output file [default='encrypted.txt' or 'decrypted.txt'\n\n");
exit(0);
}
void parseCommandLine(int argc, char* argv[]) {
int cnt;
char ch;
bool i_flag, o_flag, k_flag, p_flag, err_flag;
i_flag = k_flag = false;
err_flag = p_flag = o_flag = false;
cnt = 1;
while (cnt < argc) {
ch = *argv[cnt];
if (ch != '-') {
fprintf(stderr, "All options must be preceeded by a dash '-'\n\n");
usage(argv);
}
ch = *(argv[cnt] + 1);
if (0) {
}
else if (ch == 'e' || ch == 'E') {
if (gOp != 0) {
fprintf(stderr, "Error! Already specified encrypt or decrypt.\n\n");
usage(argv);
}
gOp = 1;
}
else if (ch == 'd' || ch == 'D') {
if (gOp != 0) {
fprintf(stderr, "Error! Already specified encrypt or decrypt.\n\n");
usage(argv);
}
gOp = 2;
}
else if (ch == 'i' || ch == 'I') {
if (i_flag == true) {
fprintf(stderr, "Error! Already specifed an input file.\n\n");
usage(argv);
}
i_flag = true;
cnt++;
if (cnt >= argc) {
fprintf(stderr, "Error! Must specify a filename after '-i'\n\n");
usage(argv);
}
strncpy(gInFileName, argv[cnt], 256);
}
else if (ch == 'o' || ch == 'O') {
if (o_flag == true) {
fprintf(stderr, "Error! Already specifed an output file.\n\n");
usage(argv);
}
o_flag = true;
cnt++;
if (cnt >= argc) {
fprintf(stderr, "Error! Must specify a filename after '-o'\n\n");
usage(argv);
}
strncpy(gOutFileName, argv[cnt], 256);
}
else if (ch == 'k' || ch == 'K') {
if (k_flag == true) {
fprintf(stderr, "Error! Already specifed a key file.\n\n");
usage(argv);
}
k_flag = true;
cnt++;
if (cnt >= argc) {
fprintf(stderr, "Error! Must specify a file name after '-k'\n\n");
usage(argv);
}
strncpy(gKeyFileName, argv[cnt], 256);
}
else if (ch == 'p' || ch == 'P') {
if (p_flag == true) {
fprintf(stderr, "Error! Already specifed a password.\n\n");
usage(argv);
}
p_flag = true;
cnt++;
if (cnt >= argc) {
fprintf(stderr, "Error! Must enter a password after '-p'\n\n");
usage(argv);
}
strncpy(gPassword, argv[cnt], 256);
}
else if (ch == 'r' || ch == 'R') {
int x;
cnt++;
if (cnt >= argc) {
fprintf(stderr, "Error! Must enter number between 1 and 3 after '-r'\n\n");
usage(argv);
}
x = atoi(argv[cnt]);
if (x < 1 || x > 3) {
fprintf(stderr, "Warnning! Entered bad value for number of rounds. Setting it to one.\n\n");
x = 1;
}
int gNumRounds = x;
} else {
fprintf(stderr, "Error! Illegal option in argument. %s\n\n", argv[cnt]);
usage(argv);
}
cnt++;
}
if (gOp == 0) {
fprintf(stderr, "Error! Encypt or Decrypt must sprecifed.\n\n");
err_flag = true;
}
if (i_flag == false) {
fprintf(stderr, "Error! No input file specified.\n\n");
err_flag = true;
}
if (k_flag == false) {
fprintf(stderr, "Error! No key file specified. \n\n");
err_flag = true;
}
if (p_flag == false) {
fprintf(stderr, "Warning! Using default 'password'.\n\n");
}
if (o_flag == false && err_flag == false) {
strcpy(gOutFileName, gInFileName);
if (gOp == 1) {
strcat(gOutFileName, ".enc");
}
if (gOp == 2) {
strcat(gOutFileName, ".dec");
}
}
if (err_flag) {
usage(argv);
}
return;
}
unsigned char gkey[65537];
unsigned char* gptrKey = gkey;
char gPassword[256] = "SECRET";
unsigned char gPasswordHash[32];
unsigned char* gptrPasswordHash = gPasswordHash;
char gCRYPTO_ORDER[8];
FILE* gfptrIn = NULL;
FILE* gfptrOut = NULL;
FILE* gfptrKey = NULL;
char gInFileName[256];
char gOutFileName[256];
char gKeyFileName[256];
int gOp = 0; int gNumRounds = 1;
unsigned char gEncodeTable[256];
unsigned char gDecodeTable[256];
int main(int argc, char* argv[])
{
int length, resulti;
parseCommandLine(argc, argv);
gfptrIn = openInputFile(gInFileName);
gfptrKey = openInputFile(gKeyFileName);
gfptrOut = openOutputFile(gOutFileName);
length = (size_t)strlen(gPassword);
resulti = sha256(NULL, gPassword, length, gPasswordHash);
if (resulti != 0)
{
fprintf(stderr, "Error! Password not hashed correctly.\n\n");
exit(-1);
}
length = fread(gkey, 1, 65537, gfptrKey);
if (length != 65537)
{
fprintf(stderr, "Error! Length of key file is not at least 65537.\n\n");
exit(-1);
}
fclose(gfptrKey);
gfptrKey = NULL;
if (gOp == 1)
{
encryptFile(gfptrIn, gfptrOut);
}
else
{
decryptFile(gfptrIn, gfptrOut);
}
fclose(gfptrIn);
fclose(gfptrOut);
return 0;
}
What I have tried:
I tried to find many ways to figure out what is the problem such as changing the name of global variables, but I'm not sure why the error says two different files already defined in main.obj.