diff options
| author | Vadim Dashevskiy <watcherhd@gmail.com> | 2012-05-15 10:38:20 +0000 | 
|---|---|---|
| committer | Vadim Dashevskiy <watcherhd@gmail.com> | 2012-05-15 10:38:20 +0000 | 
| commit | 48540940b6c28bb4378abfeb500ec45a625b37b6 (patch) | |
| tree | 2ef294c0763e802f91d868bdef4229b6868527de /plugins/CryptoPP/crypto/basecode.cpp | |
| parent | 5c350913f011e119127baeb32a6aedeb4f0d33bc (diff) | |
initial commit
git-svn-id: http://svn.miranda-ng.org/main/trunk@2 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'plugins/CryptoPP/crypto/basecode.cpp')
| -rw-r--r-- | plugins/CryptoPP/crypto/basecode.cpp | 238 | 
1 files changed, 238 insertions, 0 deletions
diff --git a/plugins/CryptoPP/crypto/basecode.cpp b/plugins/CryptoPP/crypto/basecode.cpp new file mode 100644 index 0000000000..ab94f81550 --- /dev/null +++ b/plugins/CryptoPP/crypto/basecode.cpp @@ -0,0 +1,238 @@ +// basecode.cpp - written and placed in the public domain by Wei Dai
 +
 +#include "pch.h"
 +
 +#ifndef CRYPTOPP_IMPORTS
 +
 +#include "basecode.h"
 +#include "fltrimpl.h"
 +#include <ctype.h>
 +
 +NAMESPACE_BEGIN(CryptoPP)
 +
 +void BaseN_Encoder::IsolatedInitialize(const NameValuePairs ¶meters)
 +{
 +	parameters.GetRequiredParameter("BaseN_Encoder", Name::EncodingLookupArray(), m_alphabet);
 +
 +	parameters.GetRequiredIntParameter("BaseN_Encoder", Name::Log2Base(), m_bitsPerChar);
 +	if (m_bitsPerChar <= 0 || m_bitsPerChar >= 8)
 +		throw InvalidArgument("BaseN_Encoder: Log2Base must be between 1 and 7 inclusive");
 +
 +	byte padding;
 +	bool pad;
 +	if (parameters.GetValue(Name::PaddingByte(), padding))
 +		pad = parameters.GetValueWithDefault(Name::Pad(), true);
 +	else
 +		pad = false;
 +	m_padding = pad ? padding : -1;
 +
 +	m_bytePos = m_bitPos = 0;
 +
 +	int i = 8;
 +	while (i%m_bitsPerChar != 0)
 +		i += 8;
 +	m_outputBlockSize = i/m_bitsPerChar;
 +
 +	m_outBuf.New(m_outputBlockSize);
 +}
 +
 +size_t BaseN_Encoder::Put2(const byte *begin, size_t length, int messageEnd, bool blocking)
 +{
 +	FILTER_BEGIN;
 +	while (m_inputPosition < length)
 +	{
 +		if (m_bytePos == 0)
 +			memset(m_outBuf, 0, m_outputBlockSize);
 +
 +		{
 +		unsigned int b = begin[m_inputPosition++], bitsLeftInSource = 8;
 +		while (true)
 +		{
 +			assert(m_bitPos < m_bitsPerChar);
 +			unsigned int bitsLeftInTarget = m_bitsPerChar-m_bitPos;
 +			m_outBuf[m_bytePos] |= b >> (8-bitsLeftInTarget);
 +			if (bitsLeftInSource >= bitsLeftInTarget)
 +			{
 +				m_bitPos = 0;
 +				++m_bytePos;
 +				bitsLeftInSource -= bitsLeftInTarget;
 +				if (bitsLeftInSource == 0)
 +					break;
 +				b <<= bitsLeftInTarget;
 +				b &= 0xff;
 +			}
 +			else
 +			{
 +				m_bitPos += bitsLeftInSource;
 +				break;
 +			}
 +		}
 +		}
 +
 +		assert(m_bytePos <= m_outputBlockSize);
 +		if (m_bytePos == m_outputBlockSize)
 +		{
 +			int i;
 +			for (i=0; i<m_bytePos; i++)
 +			{
 +				assert(m_outBuf[i] < (1 << m_bitsPerChar));
 +				m_outBuf[i] = m_alphabet[m_outBuf[i]];
 +			}
 +			FILTER_OUTPUT(1, m_outBuf, m_outputBlockSize, 0);
 +			
 +			m_bytePos = m_bitPos = 0;
 +		}
 +	}
 +	if (messageEnd)
 +	{
 +		if (m_bitPos > 0)
 +			++m_bytePos;
 +
 +		int i;
 +		for (i=0; i<m_bytePos; i++)
 +			m_outBuf[i] = m_alphabet[m_outBuf[i]];
 +
 +		if (m_padding != -1 && m_bytePos > 0)
 +		{
 +			memset(m_outBuf+m_bytePos, m_padding, m_outputBlockSize-m_bytePos);
 +			m_bytePos = m_outputBlockSize;
 +		}
 +		FILTER_OUTPUT(2, m_outBuf, m_bytePos, messageEnd);
 +		m_bytePos = m_bitPos = 0;
 +	}
 +	FILTER_END_NO_MESSAGE_END;
 +}
 +
 +void BaseN_Decoder::IsolatedInitialize(const NameValuePairs ¶meters)
 +{
 +	parameters.GetRequiredParameter("BaseN_Decoder", Name::DecodingLookupArray(), m_lookup);
 +
 +	parameters.GetRequiredIntParameter("BaseN_Decoder", Name::Log2Base(), m_bitsPerChar);
 +	if (m_bitsPerChar <= 0 || m_bitsPerChar >= 8)
 +		throw InvalidArgument("BaseN_Decoder: Log2Base must be between 1 and 7 inclusive");
 +
 +	m_bytePos = m_bitPos = 0;
 +
 +	int i = m_bitsPerChar;
 +	while (i%8 != 0)
 +		i += m_bitsPerChar;
 +	m_outputBlockSize = i/8;
 +
 +	m_outBuf.New(m_outputBlockSize);
 +}
 +
 +size_t BaseN_Decoder::Put2(const byte *begin, size_t length, int messageEnd, bool blocking)
 +{
 +	FILTER_BEGIN;
 +	while (m_inputPosition < length)
 +	{
 +		unsigned int value;
 +		value = m_lookup[begin[m_inputPosition++]];
 +		if (value >= 256)
 +			continue;
 +
 +		if (m_bytePos == 0 && m_bitPos == 0)
 +			memset(m_outBuf, 0, m_outputBlockSize);
 +
 +		{
 +			int newBitPos = m_bitPos + m_bitsPerChar;
 +			if (newBitPos <= 8)
 +				m_outBuf[m_bytePos] |= value << (8-newBitPos);
 +			else
 +			{
 +				m_outBuf[m_bytePos] |= value >> (newBitPos-8);
 +				m_outBuf[m_bytePos+1] |= value << (16-newBitPos);
 +			}
 +
 +			m_bitPos = newBitPos;
 +			while (m_bitPos >= 8)
 +			{
 +				m_bitPos -= 8;
 +				++m_bytePos;
 +			}
 +		}
 +
 +		if (m_bytePos == m_outputBlockSize)
 +		{
 +			FILTER_OUTPUT(1, m_outBuf, m_outputBlockSize, 0);
 +			m_bytePos = m_bitPos = 0;
 +		}
 +	}
 +	if (messageEnd)
 +	{
 +		FILTER_OUTPUT(2, m_outBuf, m_bytePos, messageEnd);
 +		m_bytePos = m_bitPos = 0;
 +	}
 +	FILTER_END_NO_MESSAGE_END;
 +}
 +
 +void BaseN_Decoder::InitializeDecodingLookupArray(int *lookup, const byte *alphabet, unsigned int base, bool caseInsensitive)
 +{
 +	std::fill(lookup, lookup+256, -1);
 +
 +	for (unsigned int i=0; i<base; i++)
 +	{
 +		if (caseInsensitive && isalpha(alphabet[i]))
 +		{
 +			assert(lookup[toupper(alphabet[i])] == -1);
 +			lookup[toupper(alphabet[i])] = i;
 +			assert(lookup[tolower(alphabet[i])] == -1);
 +			lookup[tolower(alphabet[i])] = i;
 +		}
 +		else
 +		{
 +			assert(lookup[alphabet[i]] == -1);
 +			lookup[alphabet[i]] = i;
 +		}
 +	}
 +}
 +
 +void Grouper::IsolatedInitialize(const NameValuePairs ¶meters)
 +{
 +	m_groupSize = parameters.GetIntValueWithDefault(Name::GroupSize(), 0);
 +	ConstByteArrayParameter separator, terminator;
 +	if (m_groupSize)
 +		parameters.GetRequiredParameter("Grouper", Name::Separator(), separator);
 +	else
 +		parameters.GetValue(Name::Separator(), separator);
 +	parameters.GetValue(Name::Terminator(), terminator);
 +
 +	m_separator.Assign(separator.begin(), separator.size());
 +	m_terminator.Assign(terminator.begin(), terminator.size());
 +	m_counter = 0;
 +}
 +
 +size_t Grouper::Put2(const byte *begin, size_t length, int messageEnd, bool blocking)
 +{
 +	FILTER_BEGIN;
 +	if (m_groupSize)
 +	{
 +		while (m_inputPosition < length)
 +		{
 +			if (m_counter == m_groupSize)
 +			{
 +				FILTER_OUTPUT(1, m_separator, m_separator.size(), 0);
 +				m_counter = 0;
 +			}
 +
 +			size_t len;
 +			FILTER_OUTPUT2(2, len = STDMIN(length-m_inputPosition, m_groupSize-m_counter),
 +				begin+m_inputPosition, len, 0);
 +			m_inputPosition += len;
 +			m_counter += len;
 +		}
 +	}
 +	else
 +		FILTER_OUTPUT(3, begin, length, 0);
 +
 +	if (messageEnd)
 +	{
 +		FILTER_OUTPUT(4, m_terminator, m_terminator.size(), messageEnd);
 +		m_counter = 0;
 +	}
 +	FILTER_END_NO_MESSAGE_END
 +}
 +
 +NAMESPACE_END
 +
 +#endif
  | 
