#include "feeCipherFile.h"
#include "falloc.h"
#include "feeFEEDExp.h"
#include "feeFEED.h"
#include "feeDebug.h"
#include "CipherFileFEED.h"
#include "CipherFileDES.h"
feeReturn createCipherFile(feePubKey sendPrivKey,
feePubKey recvPubKey,
cipherFileEncrType encrType,
const unsigned char *plainText,
unsigned plainTextLen,
int genSig, int doEnc64, unsigned userData, unsigned char **cipherFileData, unsigned *cipherFileDataLen) {
feeReturn frtn = FR_Success;
feeCipherFile cipherFile = NULL;
unsigned char *cipherData = NULL;
unsigned cipherDataLen;
switch(encrType) {
case CFE_RandDES:
frtn = createRandDES(sendPrivKey,
recvPubKey,
plainText,
plainTextLen,
genSig,
userData,
&cipherFile);
break;
case CFE_PublicDES:
frtn = createPubDES(sendPrivKey,
recvPubKey,
plainText,
plainTextLen,
genSig,
userData,
&cipherFile);
break;
case CFE_FEED:
frtn = createFEED(sendPrivKey,
recvPubKey,
plainText,
plainTextLen,
genSig,
userData,
&cipherFile);
break;
case CFE_FEEDExp:
frtn = createFEEDExp(sendPrivKey,
recvPubKey,
plainText,
plainTextLen,
genSig,
userData,
&cipherFile);
break;
default:
frtn = FR_Unimplemented;
break;
}
if(frtn) {
goto out;
}
frtn = feeCFileDataRepresentation(cipherFile,
(const unsigned char **)&cipherData,
&cipherDataLen);
if(frtn) {
goto out;
}
if(doEnc64) {
*cipherFileData = enc64(cipherData,
cipherDataLen,
cipherFileDataLen);
ffree(cipherData);
if(*cipherFileData == NULL) {
frtn = FR_Internal;
ffree(cipherData);
goto out;
}
}
else {
*cipherFileData = cipherData;
*cipherFileDataLen = cipherDataLen;
}
out:
if(cipherFile) {
feeCFileFree(cipherFile);
}
return frtn;
}
feeReturn parseCipherFile(feePubKey recvPrivKey,
feePubKey sendPubKey,
const unsigned char *cipherFileData,
unsigned cipherFileDataLen,
int doDec64, cipherFileEncrType *encrType, unsigned char **plainText, unsigned *plainTextLen, feeSigStatus *sigStatus, unsigned *userData) {
feeReturn frtn;
unsigned char *cipherData = NULL;
unsigned cipherDataLen;
int freeCipherData = 0;
feeCipherFile cipherFile = NULL;
*plainText = NULL;
*plainTextLen = 0;
if(recvPrivKey == NULL) { frtn = FR_BadPubKey;
goto out;
}
if(doDec64) {
cipherData = dec64(cipherFileData,
cipherFileDataLen,
&cipherDataLen);
if(cipherData == NULL) {
frtn = FR_BadEnc64;
goto out;
}
else {
freeCipherData = 1;
}
}
else {
cipherData = (unsigned char *)cipherFileData;
cipherDataLen = cipherFileDataLen;
}
frtn = feeCFileNewFromDataRep(cipherData,
cipherDataLen,
&cipherFile);
if(frtn) {
goto out;
}
*encrType = feeCFileEncrType(cipherFile);
*userData = feeCFileUserData(cipherFile);
frtn = decryptCipherFile(cipherFile,
recvPrivKey,
sendPubKey,
plainText,
plainTextLen,
sigStatus);
out:
if(cipherData && freeCipherData) {
ffree(cipherData);
}
if(cipherFile) {
feeCFileFree(cipherFile);
}
return frtn;
}
feeReturn decryptCipherFile(feeCipherFile cipherFile,
feePubKey recvPrivKey, feePubKey sendPubKey, unsigned char **plainText, unsigned *plainTextLen, feeSigStatus *sigStatus) {
cipherFileEncrType encrType = feeCFileEncrType(cipherFile);
feeReturn frtn;
*plainText = NULL;
*plainTextLen = 0;
switch(encrType) {
case CFE_RandDES:
frtn = decryptRandDES(cipherFile,
recvPrivKey,
sendPubKey,
plainText,
plainTextLen,
sigStatus);
break;
case CFE_PublicDES:
frtn = decryptPubDES(cipherFile,
recvPrivKey,
sendPubKey,
plainText,
plainTextLen,
sigStatus);
break;
case CFE_FEED:
frtn = decryptFEED(cipherFile,
recvPrivKey,
sendPubKey,
plainText,
plainTextLen,
sigStatus);
break;
case CFE_FEEDExp:
frtn = decryptFEEDExp(cipherFile,
recvPrivKey,
sendPubKey,
plainText,
plainTextLen,
sigStatus);
break;
default:
frtn = FR_Unimplemented;
break;
}
return frtn;
}