X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/80e2389990082500d76eb566d4946be3e786c3ef..d8f41ccd20de16f8ebe2ccc84d47bf1cb2b26bbb:/Security/libsecurity_cryptkit/lib/feeCipherFile.c?ds=sidebyside diff --git a/Security/libsecurity_cryptkit/lib/feeCipherFile.c b/Security/libsecurity_cryptkit/lib/feeCipherFile.c new file mode 100644 index 00000000..9c79156d --- /dev/null +++ b/Security/libsecurity_cryptkit/lib/feeCipherFile.c @@ -0,0 +1,280 @@ +/* Copyright (c) 1998,2011,2014 Apple Inc. All Rights Reserved. + * + * NOTICE: USE OF THE MATERIALS ACCOMPANYING THIS NOTICE IS SUBJECT + * TO THE TERMS OF THE SIGNED "FAST ELLIPTIC ENCRYPTION (FEE) REFERENCE + * SOURCE CODE EVALUATION AGREEMENT" BETWEEN APPLE, INC. AND THE + * ORIGINAL LICENSEE THAT OBTAINED THESE MATERIALS FROM APPLE, + * INC. ANY USE OF THESE MATERIALS NOT PERMITTED BY SUCH AGREEMENT WILL + * EXPOSE YOU TO LIABILITY. + *************************************************************************** + * + * feeCipherFile.c - general cipherfile support + * + * Revision History + * ---------------- + * 05 Feb 97 at Apple + * Added CFE_FEED and CFE_FEEDExp types. + * 24 Oct 96 at NeXT + * Created. + */ + +#include "feeCipherFile.h" +#include "falloc.h" +#include "feeFEEDExp.h" +#include "feeFEED.h" +#include "feeDebug.h" +#include "CipherFileFEED.h" +#include "CipherFileDES.h" + + +/* + * Create a cipherfile of specified cipherFileEncrType. + */ +feeReturn createCipherFile(feePubKey sendPrivKey, + feePubKey recvPubKey, + cipherFileEncrType encrType, + const unsigned char *plainText, + unsigned plainTextLen, + int genSig, // 1 ==> generate signature + int doEnc64, // 1 ==> perform enc64 + unsigned userData, // for caller's convenience + unsigned char **cipherFileData, // RETURNED + unsigned *cipherFileDataLen) // RETURNED +{ + feeReturn frtn = FR_Success; + feeCipherFile cipherFile = NULL; + unsigned char *cipherData = NULL; + unsigned cipherDataLen; + + /* + * Dispatch to encrType-specific code. + */ + 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; + } + + /* + * Common logic for all encrTypes + */ + + /* + * Get the cipherfile's raw data + */ + frtn = feeCFileDataRepresentation(cipherFile, + (const unsigned char **)&cipherData, + &cipherDataLen); + if(frtn) { + goto out; + } + + /* + * Optionally encode in 64-char ASCII + */ + 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: + /* free stuff */ + if(cipherFile) { + feeCFileFree(cipherFile); + } + return frtn; +} + +/* + * Parse a cipherfile. + * + * sendPubKey only needed for cipherFileEncrType CFE_RandDES if signature + * is present. If sendPubKey is present, it will be used for signature + * validation rather than the embedded sender's public key. + */ +feeReturn parseCipherFile(feePubKey recvPrivKey, + feePubKey sendPubKey, + const unsigned char *cipherFileData, + unsigned cipherFileDataLen, + int doDec64, // 1 ==> perform dec64 + cipherFileEncrType *encrType, // RETURNED + unsigned char **plainText, // RETURNED + unsigned *plainTextLen, // RETURNED + feeSigStatus *sigStatus, // RETURNED + unsigned *userData) // RETURNED +{ + feeReturn frtn; + unsigned char *cipherData = NULL; + unsigned cipherDataLen; + int freeCipherData = 0; + feeCipherFile cipherFile = NULL; + + *plainText = NULL; + *plainTextLen = 0; + + if(recvPrivKey == NULL) { // always required + frtn = FR_BadPubKey; + goto out; + } + + /* + * First, optional dec64() + */ + 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; + } + + /* + * Cons up a feeCipherFile object. + */ + frtn = feeCFileNewFromDataRep(cipherData, + cipherDataLen, + &cipherFile); + if(frtn) { + goto out; + } + *encrType = feeCFileEncrType(cipherFile); + *userData = feeCFileUserData(cipherFile); + frtn = decryptCipherFile(cipherFile, + recvPrivKey, + sendPubKey, + plainText, + plainTextLen, + sigStatus); + +out: + /* free stuff */ + + if(cipherData && freeCipherData) { + ffree(cipherData); + } + if(cipherFile) { + feeCFileFree(cipherFile); + } + return frtn; +} + +/* + * Decrypt a feeCipherFile obtained via feeCFileNewFromDataRep(). + * recvPrivKey is required in all cases. If sendPubKey is present, + * sendPubKey - rather than the embedded sender's public key - will be + * used for signature validation. + */ +feeReturn decryptCipherFile(feeCipherFile cipherFile, + feePubKey recvPrivKey, // required + feePubKey sendPubKey, // optional, for signature + unsigned char **plainText, // malloc'd & RETURNED + unsigned *plainTextLen, // RETURNED + feeSigStatus *sigStatus) // RETURNED +{ + cipherFileEncrType encrType = feeCFileEncrType(cipherFile); + feeReturn frtn; + + *plainText = NULL; + *plainTextLen = 0; + + /* + * Dispatch to encrType-specific code. + */ + 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; +}