/* * Sets up the WriteToDisk given the base of a filname. * Creates a WriteOut Object. * * e.g. if you want to create a files named myexperiment.yaml and myexperiment.mov * pass in the string "myexperiment" * */ WriteOut* SetUpWriteToDisk(const char* dirfilename, const char* outfilename, CvMemStorage* Mem){ /** Create new instance of WriteOut object **/ WriteOut* DataWriter = CreateDataWriter(); /** Create Filenames **/ char* YAMLDataFileName = CreateFileName(dirfilename, outfilename, ".yaml"); /** Open YAML Data File for writing**/ DataWriter->fs=cvOpenFileStorage(YAMLDataFileName,Mem,CV_STORAGE_WRITE); if (DataWriter->fs==0) { printf("DataWriter->fs is zero! Could you have specified the wrong directory?\n"); --(DataWriter->error); } /** If there were errors, return immediately **/ if (DataWriter->error < 0) return DataWriter; /** Write the header for the YAML data file **/ cvWriteComment(DataWriter->fs, "Remote Control Worm Experiment Data Log\nMade by OpticalMindControl software\[email protected]\n",0); cvWriteString(DataWriter->fs, "gitHash", build_git_sha,0); cvWriteString(DataWriter->fs, "gitBuildTime",build_git_time,0); /** Write Out Current Time**/ struct tm *local; time_t t; t = time(NULL); local = localtime(&t); cvWriteString(DataWriter->fs, "ExperimentTime",asctime(local),0); DataWriter->filename=YAMLDataFileName; return DataWriter; }
static bool InternalSaveDict(const ff::Dict &dict, bool chain, bool nameHashOnly, ff::IData **data) { assertRetVal(data, false); *data = nullptr; ff::ComPtr<ff::IDataVector> dataVector; ff::ComPtr<ff::IDataWriter> writer; assertRetVal(CreateDataWriter(&dataVector, &writer), false); ff::Vector<ff::String> names = dict.GetAllNames(chain, false, nameHashOnly); DWORD count = (DWORD)names.Size(); DWORD version = nameHashOnly ? 1 : 0; ff::StringCache emptyCache; assertRetVal(ff::SaveData(writer, version), false); assertRetVal(ff::SaveData(writer, count), false); for (const ff::String &name: names) { if (nameHashOnly) { ff::hash_t hash = emptyCache.GetHash(name); assertRetVal(ff::SaveData(writer, hash), false); } else { assertRetVal(ff::SaveData(writer, name), false); } ff::Value *value = dict.GetValue(name, chain); assertRetVal(InternalSaveValue(value, writer, nameHashOnly), false); } *data = dataVector.Detach(); return true; }
bool FileVEILOperationsImpl::EncryptSignFile(const tscrypto::tsCryptoString &sFilename, const tscrypto::tsCryptoString &sEncryptedFilename, const tscrypto::tsCryptoString &lpszTempFile, std::shared_ptr<ICmsHeader> Header, CompressionType comp, TS_ALG_ID algorithm, TS_ALG_ID hashAlgorithm, bool SignHeader, bool bindData, CMSFileFormatIds DataFormat, bool randomIvec, SymmetricPaddingType paddingType, int blockSize) { TSDECLARE_FUNCTIONExt(true); std::shared_ptr<IDataReader> inputFile; std::shared_ptr<IDataWriter> outputFile; std::shared_ptr<IDataIOBase> ioBase; tscrypto::tsCryptoData buff; tscrypto::tsCryptoString sTempFile; if (lpszTempFile.size() > 0) { sTempFile = lpszTempFile; } else { sTempFile = sEncryptedFilename; sTempFile += ".tmp"; } LOG(DebugInfo3, "Encrypting file '" << sFilename << "'"); // // Now create the output file. // if (!(outputFile = std::dynamic_pointer_cast<IDataWriter>(CreateDataWriter(sTempFile.c_str())))) { LogError("Error occurred while creating temporary file '%s'.", sTempFile.c_str()); return TSRETURN_ERROR(("FAILED"), false); } if (!(inputFile = std::dynamic_pointer_cast<IDataReader>(CreateFileReader(sFilename.c_str())))) { outputFile->Close(); xp_DeleteFile(sTempFile); LogError("Error occurred trying to open input file '%s'.", sFilename.c_str()); return TSRETURN_ERROR(("Bad File"), false); } if (!EncryptSignStream(inputFile, outputFile, Header, comp, algorithm, hashAlgorithm, SignHeader, bindData, DataFormat, randomIvec, paddingType, blockSize)) { inputFile->Close(); outputFile->Close(); xp_DeleteFile(sTempFile); return TSRETURN_ERROR(("Returns ~~"), false); } inputFile->Close(); outputFile->Close(); if (lpszTempFile.size() == 0) { xp_DeleteFile(sEncryptedFilename); // Copy the temp file to the destination file // According to Jeffrey Richter, "...MoveFile() does not support // the moving/renaming of streams." // (http://www.microsoft.com/msj/1198/ntfs/ntfs.aspx) //if(!MoveFile(sTempFile, sEncryptedFilename)) if (!xp_RenameFile(sTempFile, sEncryptedFilename)) { tscrypto::tsCryptoString msg; switch (errno) { case EACCES: msg = "The destination file already exists"; break; case ENOENT: msg = "The source file does not exist"; break; case EINVAL: if ((xp_GetFileAttributes(sEncryptedFilename.c_str()) & XP_FILE_ATTRIBUTE_DIRECTORY) != 0) msg = "There is a directory called " + sEncryptedFilename + " already."; else msg = "The file name contains invalid characters"; break; default: msg = "An unknown error has occurred while creating the encrypted file."; break; } // Process any inserts in lpMsgBuf. // ... // Check to see if this was a file permissions error DWORD dwAttributes = ::xp_GetFileAttributes(sEncryptedFilename.c_str()); if (dwAttributes & XP_FILE_ATTRIBUTE_READONLY) LogError("The specified output file cannot be accessed because it has Read Only permissions."); //else if(dwAttributes & FILE_ATTRIBUTE_SYSTEM) // SetErrorMessage("The specified output file cannot be accessed because it is used exclusively by the Operating System."); //else if(dwAttributes & FILE_ATTRIBUTE_HIDDEN) // SetErrorMessage("The specified output file cannot be accessed because it has the Hidden file attribute set."); else LogError(msg.c_str()); secureDeleteEntireFile(sTempFile.c_str(), 3); return TSRETURN_ERROR(("FAILED"), false); } xp_DeleteFile(sTempFile); //CKMUtility::secureDelete((CKMString)sTempFile); } return TSRETURN(("OK"), true); }
bool FileVEILOperationsImpl::DecryptVerify(std::shared_ptr<ICmsHeader> header, const tscrypto::tsCryptoString &sFilename, const tscrypto::tsCryptoString &sDecryptedFilename, const tscrypto::tsCryptoString &lpszTempFile, const tscrypto::tsCryptoString &sTempFile, bool headerIncluded) { TSDECLARE_FUNCTIONExt(true); std::shared_ptr<IDataReader> reader; std::shared_ptr<IDataWriter> writer; tscrypto::tsCryptoString outputFilename; // Get output filename if (sDecryptedFilename.size() > 0) { outputFilename = sDecryptedFilename; } else { outputFilename = header->GetDataName(); if (outputFilename.size() == 0) { LogError("Unable to retrieve the original file name from the encrypted file."); return TSRETURN_ERROR(("false"), false); } } std::shared_ptr<IDataIOBase> ioBase; if (!(reader = std::dynamic_pointer_cast<IDataReader>(CreateFileReader(sFilename)))) { xp_DeleteFile(sTempFile); LogError("Error occured trying to open input file '%s'.", sFilename.c_str()); return TSRETURN_ERROR(("Bad File"), false); } ioBase.reset(); if (!(writer = std::dynamic_pointer_cast<IDataWriter>(CreateDataWriter(sTempFile)))) { reader->Close(); xp_DeleteFile(sTempFile); LogError("Error occured trying to open input file '%s'.", sFilename.c_str()); return TSRETURN_ERROR(("Bad File"), false); } ioBase.reset(); std::shared_ptr<ICryptoHelper> helper; if (!m_session && header->NeedsSession()) { if (!!m_sessionCallback) { if (!m_sessionCallback->GetSessionForHeader(false, std::dynamic_pointer_cast<ICmsHeaderBase>(header), 0, m_session)) { LogError("No session."); reader->Close(); xp_DeleteFile(sTempFile); return TSRETURN_ERROR(("Returns ~~"), false); } } } if (!m_session) { LogError("Unable to retrieve the cryptographic helper object from the CKM Runtime."); reader->Close(); xp_DeleteFile(sTempFile); return TSRETURN_ERROR(("Returns ~~"), false); } else { if (!(helper = CreateCryptoHelper(m_session))) { LogError("Unable to retrieve the cryptographic helper object from the CKM Runtime."); reader->Close(); xp_DeleteFile(sTempFile); return TSRETURN_ERROR(("Returns ~~"), false); } } helper->SetOperationStatusCallback(m_status); helper->SetTaskInformation(m_currentTask, m_taskCount); if (!!m_keyGenCallback) helper->SetKeyGenCallback(m_keyGenCallback); std::shared_ptr<ICmsHeaderBase> headerBase; // TODO: Issue with new code for disconnected streams. = header; if (!(helper->DecryptStream(headerBase, reader, writer, headerIncluded))) { LogError("Unable to decrypt the data."); return TSRETURN_ERROR(("Unable to decrypt the data."), false); } reader->Close(); writer->Close(); reader.reset(); writer.reset(); if (lpszTempFile.size() == 0) { xp_DeleteFile(sDecryptedFilename); // Copy the temp file to the destination file // According to Jeffrey Richter, "...MoveFile() does not support // the moving/renaming of streams." // (http://www.microsoft.com/msj/1198/ntfs/ntfs.aspx) //if(!MoveFile(sTempFile, sEncryptedFilename)) if (!xp_RenameFile(sTempFile, sDecryptedFilename)) { tscrypto::tsCryptoString msg; switch (errno) { case EACCES: msg = "The destination file already exists"; break; case ENOENT: msg = "The source file does not exist"; break; case EINVAL: if ((xp_GetFileAttributes(sDecryptedFilename.c_str()) & XP_FILE_ATTRIBUTE_DIRECTORY) != 0) msg = "There is a directory called " + sDecryptedFilename + " already."; else msg = "The file name contains invalid characters"; break; default: msg = "An unknown error has occurred while creating the decrypted file."; break; } // Process any inserts in lpMsgBuf. // ... // Check to see if this was a file permissions error DWORD dwAttributes = ::xp_GetFileAttributes(sDecryptedFilename.c_str()); if (dwAttributes & XP_FILE_ATTRIBUTE_READONLY) LogError("The specified output file cannot be accessed because it has Read Only permissions."); //else if(dwAttributes & FILE_ATTRIBUTE_SYSTEM) // SetErrorMessage("The specified output file cannot be accessed because it is used exclusively by the Operating System."); //else if(dwAttributes & FILE_ATTRIBUTE_HIDDEN) // SetErrorMessage("The specified output file cannot be accessed because it has the Hidden file attribute set."); else LogError(msg.c_str()); secureDeleteEntireFile(sTempFile.c_str(), 3); return TSRETURN_ERROR(("FAILED"), false); } xp_DeleteFile(sTempFile); //CKMUtility::secureDelete((CKMString)sTempFile); } return TSRETURN(("OK"), true); }