Exemplo n.º 1
0
/*
 * 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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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);
}
Exemplo n.º 4
0
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);
}