void feeFEEDFree(feeFEED feed) { feedInst *finst = (feedInst*) feed; if(finst->cp) { freeCurveParams(finst->cp); } if(finst->initialRS) { ffree(finst->initialRS); } if(finst->cluePlus) { freeGiant(finst->cluePlus); } if(finst->clueMinus) { freeGiant(finst->clueMinus); } if(finst->sPlus) { freeGiant(finst->sPlus); } if(finst->sMinus) { freeGiant(finst->sMinus); } if(finst->r) { freeGiant(finst->r); } if(finst->feedExp) { feeFEEDExpFree(finst->feedExp); } if(finst->rsCtext) { ffree(finst->rsCtext); } if(finst->xp) { freeGiant(finst->xp); } if(finst->xm) { freeGiant(finst->xm); } if(finst->tmp1) { freeGiant(finst->tmp1); } if(finst->tmp2) { freeGiant(finst->tmp2); } ffree(finst); }
feeReturn decryptFEEDExp(feeCipherFile cipherFile, feePubKey recvPrivKey, feePubKey sendPubKey, // optional unsigned char **plainText, // RETURNED unsigned *plainTextLen, // RETURNED feeSigStatus *sigStatus) // RETURNED { feeReturn frtn = FR_Success; unsigned char *cipherText = NULL; unsigned cipherTextLen; feeFEEDExp feed = NULL; unsigned char *sigData = NULL; unsigned sigDataLen; unsigned char *sendPubKeyStr = NULL; unsigned sendPubKeyStrLen = 0; feePubKey parsedSendPubKey = NULL; if(feeCFileEncrType(cipherFile) != CFE_FEEDExp) { frtn = FR_Internal; goto out; } /* * Get ciphertext from cipherFile */ cipherText = feeCFileCipherText(cipherFile, &cipherTextLen); if(cipherText == NULL) { frtn = FR_BadCipherFile; goto out; } /* * FEEDExp decrypt */ feed = feeFEEDExpNewWithPubKey(recvPrivKey, NULL, NULL); if(feed == NULL) { frtn = FR_BadPubKey; goto out; } frtn = feeFEEDExpDecrypt(feed, cipherText, cipherTextLen, plainText, plainTextLen); if(frtn) { goto out; } sigData = feeCFileSigData(cipherFile, &sigDataLen); if(sigData) { feeReturn sigFrtn; if(sendPubKey == NULL) { /* * use embedded sender's public key */ sendPubKeyStr = feeCFileSendPubKeyData(cipherFile, &sendPubKeyStrLen); if(sendPubKeyStr == NULL) { frtn = FR_BadCipherFile; goto out; } parsedSendPubKey = feePubKeyAlloc(); frtn = feePubKeyInitFromKeyString(parsedSendPubKey, (char *)sendPubKeyStr, sendPubKeyStrLen); if(frtn) { frtn = FR_BadCipherFile; goto out; } sendPubKey = parsedSendPubKey; } sigFrtn = feePubKeyVerifySignature(sendPubKey, cipherText, cipherTextLen, sigData, sigDataLen); switch(sigFrtn) { case FR_Success: *sigStatus = SS_PresentValid; break; default: *sigStatus = SS_PresentInvalid; break; } } else { *sigStatus = SS_NotPresent; } out: if(cipherText) { ffree(cipherText); } if(feed) { feeFEEDExpFree(feed); } if(sigData) { ffree(sigData); } if(parsedSendPubKey) { feePubKeyFree(parsedSendPubKey); } if(sendPubKeyStr) { ffree(sendPubKeyStr); } return frtn; }
feeReturn createFEEDExp(feePubKey sendPrivKey, // for sig only feePubKey recvPubKey, const unsigned char *plainText, unsigned plainTextLen, int genSig, // 1 ==> generate signature unsigned userData, // for caller's convenience feeCipherFile *cipherFile) // RETURNED if successful { feeReturn frtn; feeFEEDExp feed = NULL; unsigned char *cipherText = NULL; unsigned cipherTextLen; unsigned char *sigData = NULL; unsigned sigDataLen = 0; feeCipherFile cfile = NULL; unsigned char *pubKeyString = NULL; // of sendPrivKey, for sig unsigned pubKeyStringLen = 0; if(recvPubKey == NULL) { return FR_BadPubKey; } /* * FEEDExp encrypt plaintext */ feed = feeFEEDExpNewWithPubKey(recvPubKey, NULL, NULL); if(feed == NULL) { frtn = FR_BadPubKey; goto out; } frtn = feeFEEDExpEncrypt(feed, plainText, plainTextLen, &cipherText, &cipherTextLen); if(frtn) { goto out; } if(genSig) { if(sendPrivKey == NULL) { frtn = FR_IllegalArg; goto out; } /* * We generate signature on ciphertext by convention. */ frtn = feePubKeyCreateSignature(sendPrivKey, cipherText, cipherTextLen, &sigData, &sigDataLen); if(frtn) { goto out; } /* * Sender's public key string */ frtn = feePubKeyCreateKeyString(sendPrivKey, (char **)&pubKeyString, &pubKeyStringLen); if(frtn) { /* * Huh? */ frtn = FR_BadPubKey; goto out; } } /* * Cons up a cipherfile */ cfile = feeCFileNewFromCipherText(CFE_FEEDExp, cipherText, cipherTextLen, pubKeyString, pubKeyStringLen, NULL, 0, sigData, sigDataLen, userData); if(cfile == NULL) { frtn = FR_Internal; goto out; } out: /* free alloc'd stuff */ if(cipherText) { ffree(cipherText); } if(feed) { feeFEEDExpFree(feed); } if(sigData) { ffree(sigData); } if(pubKeyString) { ffree(pubKeyString); } *cipherFile = cfile; return frtn; }