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 createFEED(feePubKey sendPrivKey, // required 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; feeFEED feed = NULL; unsigned char *cipherText = NULL; unsigned cipherTextLen; unsigned char *sigData = NULL; unsigned sigDataLen = 0; feeCipherFile cfile = NULL; unsigned char *pubKeyString = NULL; // of sendPrivKey unsigned pubKeyStringLen = 0; if((sendPrivKey == NULL) || (recvPubKey == NULL)) { return FR_BadPubKey; } /* * FEED encrypt plaintext */ feed = feeFEEDNewWithPubKey(sendPrivKey, recvPubKey, FF_ENCRYPT, NULL, NULL); if(feed == NULL) { frtn = FR_BadPubKey; goto out; } frtn = feeFEEDEncrypt(feed, plainText, plainTextLen, &cipherText, &cipherTextLen); if(frtn) { goto out; } /* * Sender's public key string */ frtn = feePubKeyCreateKeyString(sendPrivKey, (char **)&pubKeyString, &pubKeyStringLen); if(frtn) { /* * Huh? */ frtn = FR_BadPubKey; goto out; } if(genSig) { /* * We generate signature on ciphertext by convention. */ frtn = feePubKeyCreateSignature(sendPrivKey, cipherText, cipherTextLen, &sigData, &sigDataLen); if(frtn) { goto out; } } /* * Cons up a cipherfile */ cfile = feeCFileNewFromCipherText(CFE_FEED, 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) { feeFEEDFree(feed); } if(pubKeyString) { ffree(pubKeyString); } if(sigData) { ffree(sigData); } *cipherFile = cfile; return frtn; }