unsigned int Grouper::Put2(const byte *begin, unsigned int length, int messageEnd, bool blocking) { if (m_groupSize) { FILTER_BEGIN; while (m_inputPosition < length) { if (m_counter == m_groupSize) { FILTER_OUTPUT(1, m_seperator, m_seperator.size(), 0); m_counter = 0; } unsigned int len; FILTER_OUTPUT2(2, len = STDMIN(length-m_inputPosition, m_groupSize-m_counter), begin+m_inputPosition, len, 0); m_inputPosition += len; m_counter += len; } if (messageEnd) FILTER_OUTPUT(3, m_terminator, m_terminator.size(), messageEnd); FILTER_END_NO_MESSAGE_END } else return Output(0, begin, length, messageEnd, blocking);
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 }
unsigned int BaseN_Encoder::Put2(const byte *begin, unsigned int length, int messageEnd, bool blocking) { FILTER_BEGIN; while (m_inputPosition < length) { if (m_bytePos == 0) memset(m_outBuf, 0, m_outputBlockSize); m_outBuf[m_bytePos] |= begin[m_inputPosition] >> (8-m_bitsPerChar+m_bitPos); m_outBuf[m_bytePos+1] |= ((begin[m_inputPosition] << (m_bitsPerChar-m_bitPos)) & 0xff) >> (8-m_bitsPerChar); ++m_inputPosition; m_bitPos += 8; while (m_bitPos >= m_bitsPerChar) { m_bitPos -= m_bitsPerChar; ++m_bytePos; } 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; }
size_t SignerFilter::Put2(const byte *inString, size_t length, int messageEnd, bool blocking) { FILTER_BEGIN; m_messageAccumulator->Update(inString, length); if (m_putMessage) FILTER_OUTPUT(1, inString, length, 0); if (messageEnd) { m_buf.New(m_signer.SignatureLength()); m_signer.Sign(m_rng, m_messageAccumulator.release(), m_buf); FILTER_OUTPUT(2, m_buf, m_buf.size(), messageEnd); m_messageAccumulator.reset(m_signer.NewSignatureAccumulator(m_rng)); } FILTER_END_NO_MESSAGE_END; }
size_t Put2(const byte *inString, size_t length, int messageEnd, bool blocking) { FILTER_BEGIN; m_ciphertextQueue.Put(inString, length); if (messageEnd) { { size_t ciphertextLength; if (!SafeConvert(m_ciphertextQueue.CurrentSize(), ciphertextLength)) throw InvalidArgument("PK_DefaultDecryptionFilter: ciphertext too long"); size_t maxPlaintextLength = m_decryptor.MaxPlaintextLength(ciphertextLength); SecByteBlock ciphertext(ciphertextLength); m_ciphertextQueue.Get(ciphertext, ciphertextLength); m_plaintext.resize(maxPlaintextLength); m_result = m_decryptor.Decrypt(m_rng, ciphertext, ciphertextLength, m_plaintext, m_parameters); if (!m_result.isValidCoding) throw InvalidCiphertext(m_decryptor.AlgorithmName() + ": invalid ciphertext"); } FILTER_OUTPUT(1, m_plaintext, m_result.messageLength, messageEnd); } FILTER_END_NO_MESSAGE_END; }
unsigned int HashFilter::Put2(const byte *inString, unsigned int length, int messageEnd, bool blocking) { FILTER_BEGIN; m_hashModule.Update(inString, length); if (m_putMessage) FILTER_OUTPUT(1, inString, length, 0); if (messageEnd) { { unsigned int size, digestSize = m_hashModule.DigestSize(); m_space = HelpCreatePutSpace(*AttachedTransformation(), NULL_CHANNEL, digestSize, digestSize, size = digestSize); m_hashModule.Final(m_space); } FILTER_OUTPUT(2, m_space, m_hashModule.DigestSize(), messageEnd); } FILTER_END_NO_MESSAGE_END; }
unsigned int BaseN_Decoder::Put2(const byte *begin, unsigned int 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; }
unsigned int MeterFilter::Put2(const byte *begin, unsigned int length, int messageEnd, bool blocking) { FILTER_BEGIN; m_currentMessageBytes += length; m_totalBytes += length; if (messageEnd) { m_currentMessageBytes = 0; m_currentSeriesMessages++; m_totalMessages++; } FILTER_OUTPUT(1, begin, length, messageEnd); FILTER_END; }
unsigned int Put2(const byte *inString, unsigned int length, int messageEnd, bool blocking) { FILTER_BEGIN; m_plaintextQueue.Put(inString, length); if (messageEnd) { { unsigned int plaintextLength = m_plaintextQueue.CurrentSize(); unsigned int ciphertextLength = m_encryptor.CiphertextLength(plaintextLength); SecByteBlock plaintext(plaintextLength); m_plaintextQueue.Get(plaintext, plaintextLength); m_ciphertext.resize(ciphertextLength); m_encryptor.Encrypt(m_rng, plaintext, plaintextLength, m_ciphertext, m_parameters); } FILTER_OUTPUT(1, m_ciphertext, m_ciphertext.size(), messageEnd); } FILTER_END_NO_MESSAGE_END; }
unsigned int Put2(const byte *inString, unsigned int length, int messageEnd, bool blocking) { FILTER_BEGIN; m_ciphertextQueue.Put(inString, length); if (messageEnd) { { unsigned int ciphertextLength = m_ciphertextQueue.CurrentSize(); unsigned int maxPlaintextLength = m_decryptor.MaxPlaintextLength(ciphertextLength); SecByteBlock ciphertext(ciphertextLength); m_ciphertextQueue.Get(ciphertext, ciphertextLength); m_plaintext.resize(maxPlaintextLength); m_result = m_decryptor.Decrypt(m_rng, ciphertext, ciphertextLength, m_plaintext, m_parameters); if (!m_result.isValidCoding) throw InvalidCiphertext(m_decryptor.AlgorithmName() + ": invalid ciphertext"); } FILTER_OUTPUT(1, m_plaintext, m_result.messageLength, messageEnd); } FILTER_END_NO_MESSAGE_END; }
size_t Put2(const byte *inString, size_t length, int messageEnd, bool blocking) { FILTER_BEGIN; m_plaintextQueue.Put(inString, length); if (messageEnd) { { size_t plaintextLength; if (!SafeConvert(m_plaintextQueue.CurrentSize(), plaintextLength)) throw InvalidArgument("PK_DefaultEncryptionFilter: plaintext too long"); size_t ciphertextLength = m_encryptor.CiphertextLength(plaintextLength); SecByteBlock plaintext(plaintextLength); m_plaintextQueue.Get(plaintext, plaintextLength); m_ciphertext.resize(ciphertextLength); m_encryptor.Encrypt(m_rng, plaintext, plaintextLength, m_ciphertext, m_parameters); } FILTER_OUTPUT(1, m_ciphertext, m_ciphertext.size(), messageEnd); } FILTER_END_NO_MESSAGE_END; }
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_bitsPerChar-m_bitPos >= 0); unsigned int bitsLeftInTarget = (unsigned int)(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; }