Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;

}