static feePubKey genPubKey(feePubKey privKey) { feePubKey pubKey; // generic key object feeReturn frtn; char *pubString; unsigned pubStringLen; frtn = feePubKeyCreateKeyString(privKey, &pubString, &pubStringLen); if(frtn) { printf("feePubKeyCreateKeyString: Can't get key string (%s)\n", feeReturnString(frtn)); exit(1); } pubKey = feePubKeyAlloc(); frtn = feePubKeyInitFromKeyString(pubKey, pubString, pubStringLen); if(frtn) { printf("feePubKeyInitFromKeyString: Can't create new key " "(%s)\n", feeReturnString(frtn)); feePubKeyFree(pubKey); exit(1); } ffree(pubString); return pubKey; }
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; }