📄 filters.cpp
字号:
HashVerificationFilter::HashVerificationFilter(HashTransformation &hm, BufferedTransformation *attachment, word32 flags, int truncatedDigestSize) : FilterWithBufferedInput(attachment) , m_hashModule(hm){ IsolatedInitialize(MakeParameters(Name::HashVerificationFilterFlags(), flags)(Name::TruncatedDigestSize(), truncatedDigestSize));}void HashVerificationFilter::InitializeDerivedAndReturnNewSizes(const NameValuePairs ¶meters, size_t &firstSize, size_t &blockSize, size_t &lastSize){ m_flags = parameters.GetValueWithDefault(Name::HashVerificationFilterFlags(), (word32)DEFAULT_FLAGS); int s = parameters.GetIntValueWithDefault(Name::TruncatedDigestSize(), -1); m_digestSize = s < 0 ? m_hashModule.DigestSize() : s; m_verified = false; firstSize = m_flags & HASH_AT_BEGIN ? m_digestSize : 0; blockSize = 1; lastSize = m_flags & HASH_AT_BEGIN ? 0 : m_digestSize;}void HashVerificationFilter::FirstPut(const byte *inString){ if (m_flags & HASH_AT_BEGIN) { m_expectedHash.New(m_digestSize); memcpy(m_expectedHash, inString, m_expectedHash.size()); if (m_flags & PUT_HASH) AttachedTransformation()->Put(inString, m_expectedHash.size()); }}void HashVerificationFilter::NextPutMultiple(const byte *inString, size_t length){ m_hashModule.Update(inString, length); if (m_flags & PUT_MESSAGE) AttachedTransformation()->Put(inString, length);}void HashVerificationFilter::LastPut(const byte *inString, size_t length){ if (m_flags & HASH_AT_BEGIN) { assert(length == 0); m_verified = m_hashModule.TruncatedVerify(m_expectedHash, m_digestSize); } else { m_verified = (length==m_digestSize && m_hashModule.TruncatedVerify(inString, length)); if (m_flags & PUT_HASH) AttachedTransformation()->Put(inString, length); } if (m_flags & PUT_RESULT) AttachedTransformation()->Put(m_verified); if ((m_flags & THROW_EXCEPTION) && !m_verified) throw HashVerificationFailed();}// *************************************************************AuthenticatedEncryptionFilter::AuthenticatedEncryptionFilter(AuthenticatedSymmetricCipher &c, BufferedTransformation *attachment, bool putAAD, int truncatedDigestSize, const std::string &macChannel, BlockPaddingScheme padding) : StreamTransformationFilter(c, attachment, padding, true) , m_hf(c, new OutputProxy(*this, false), putAAD, truncatedDigestSize, AAD_CHANNEL, macChannel){ assert(c.IsForwardTransformation());}void AuthenticatedEncryptionFilter::IsolatedInitialize(const NameValuePairs ¶meters){ m_hf.IsolatedInitialize(parameters); StreamTransformationFilter::IsolatedInitialize(parameters);}byte * AuthenticatedEncryptionFilter::ChannelCreatePutSpace(const std::string &channel, size_t &size){ if (channel.empty()) return StreamTransformationFilter::CreatePutSpace(size); if (channel == AAD_CHANNEL) return m_hf.CreatePutSpace(size); throw InvalidChannelName("AuthenticatedEncryptionFilter", channel);}size_t AuthenticatedEncryptionFilter::ChannelPut2(const std::string &channel, const byte *begin, size_t length, int messageEnd, bool blocking){ if (channel.empty()) return StreamTransformationFilter::Put2(begin, length, messageEnd, blocking); if (channel == AAD_CHANNEL) return m_hf.Put2(begin, length, 0, blocking); throw InvalidChannelName("AuthenticatedEncryptionFilter", channel);}void AuthenticatedEncryptionFilter::LastPut(const byte *inString, size_t length){ StreamTransformationFilter::LastPut(inString, length); m_hf.MessageEnd();}// *************************************************************AuthenticatedDecryptionFilter::AuthenticatedDecryptionFilter(AuthenticatedSymmetricCipher &c, BufferedTransformation *attachment, word32 flags, int truncatedDigestSize, BlockPaddingScheme padding) : FilterWithBufferedInput(attachment) , m_hashVerifier(c, new OutputProxy(*this, false)) , m_streamFilter(c, new OutputProxy(*this, false), padding, true){ assert(!c.IsForwardTransformation() || c.IsSelfInverting()); IsolatedInitialize(MakeParameters(Name::BlockPaddingScheme(), padding)(Name::AuthenticatedDecryptionFilterFlags(), flags)(Name::TruncatedDigestSize(), truncatedDigestSize));}void AuthenticatedDecryptionFilter::InitializeDerivedAndReturnNewSizes(const NameValuePairs ¶meters, size_t &firstSize, size_t &blockSize, size_t &lastSize){ word32 flags = parameters.GetValueWithDefault(Name::AuthenticatedDecryptionFilterFlags(), (word32)DEFAULT_FLAGS); m_hashVerifier.Initialize(CombinedNameValuePairs(parameters, MakeParameters(Name::HashVerificationFilterFlags(), flags))); m_streamFilter.Initialize(parameters); firstSize = m_hashVerifier.m_firstSize; blockSize = 1; lastSize = m_hashVerifier.m_lastSize;}byte * AuthenticatedDecryptionFilter::ChannelCreatePutSpace(const std::string &channel, size_t &size){ if (channel.empty()) return m_streamFilter.CreatePutSpace(size); if (channel == AAD_CHANNEL) return m_hashVerifier.CreatePutSpace(size); throw InvalidChannelName("AuthenticatedDecryptionFilter", channel);}size_t AuthenticatedDecryptionFilter::ChannelPut2(const std::string &channel, const byte *begin, size_t length, int messageEnd, bool blocking){ if (channel.empty()) { if (m_lastSize > 0) m_hashVerifier.ForceNextPut(); return FilterWithBufferedInput::Put2(begin, length, messageEnd, blocking); } if (channel == AAD_CHANNEL) return m_hashVerifier.Put2(begin, length, 0, blocking); throw InvalidChannelName("AuthenticatedDecryptionFilter", channel);}void AuthenticatedDecryptionFilter::FirstPut(const byte *inString){ m_hashVerifier.Put(inString, m_firstSize);}void AuthenticatedDecryptionFilter::NextPutMultiple(const byte *inString, size_t length){ m_streamFilter.Put(inString, length);}void AuthenticatedDecryptionFilter::LastPut(const byte *inString, size_t length){ m_streamFilter.MessageEnd(); m_hashVerifier.PutMessageEnd(inString, length);}// *************************************************************void SignerFilter::IsolatedInitialize(const NameValuePairs ¶meters){ m_putMessage = parameters.GetValueWithDefault(Name::PutMessage(), false); m_messageAccumulator.reset(m_signer.NewSignatureAccumulator(m_rng));}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;}SignatureVerificationFilter::SignatureVerificationFilter(const PK_Verifier &verifier, BufferedTransformation *attachment, word32 flags) : FilterWithBufferedInput(attachment) , m_verifier(verifier){ IsolatedInitialize(MakeParameters(Name::SignatureVerificationFilterFlags(), flags));}void SignatureVerificationFilter::InitializeDerivedAndReturnNewSizes(const NameValuePairs ¶meters, size_t &firstSize, size_t &blockSize, size_t &lastSize){ m_flags = parameters.GetValueWithDefault(Name::SignatureVerificationFilterFlags(), (word32)DEFAULT_FLAGS); m_messageAccumulator.reset(m_verifier.NewVerificationAccumulator()); size_t size = m_verifier.SignatureLength(); assert(size != 0); // TODO: handle recoverable signature scheme m_verified = false; firstSize = m_flags & SIGNATURE_AT_BEGIN ? size : 0; blockSize = 1; lastSize = m_flags & SIGNATURE_AT_BEGIN ? 0 : size;}void SignatureVerificationFilter::FirstPut(const byte *inString){ if (m_flags & SIGNATURE_AT_BEGIN) { if (m_verifier.SignatureUpfront()) m_verifier.InputSignature(*m_messageAccumulator, inString, m_verifier.SignatureLength()); else { m_signature.New(m_verifier.SignatureLength()); memcpy(m_signature, inString, m_signature.size()); } if (m_flags & PUT_SIGNATURE) AttachedTransformation()->Put(inString, m_signature.size()); } else { assert(!m_verifier.SignatureUpfront()); }}void SignatureVerificationFilter::NextPutMultiple(const byte *inString, size_t length){ m_messageAccumulator->Update(inString, length); if (m_flags & PUT_MESSAGE) AttachedTransformation()->Put(inString, length);}void SignatureVerificationFilter::LastPut(const byte *inString, size_t length){ if (m_flags & SIGNATURE_AT_BEGIN) { assert(length == 0); m_verifier.InputSignature(*m_messageAccumulator, m_signature, m_signature.size()); m_verified = m_verifier.VerifyAndRestart(*m_messageAccumulator); } else { m_verifier.InputSignature(*m_messageAccumulator, inString, length); m_verified = m_verifier.VerifyAndRestart(*m_messageAccumulator); if (m_flags & PUT_SIGNATURE) AttachedTransformation()->Put(inString, length); } if (m_flags & PUT_RESULT) AttachedTransformation()->Put(m_verified); if ((m_flags & THROW_EXCEPTION) && !m_verified) throw SignatureVerificationFailed();}// *************************************************************size_t Source::PumpAll2(bool blocking){ unsigned int messageCount = UINT_MAX; do { RETURN_IF_NONZERO(PumpMessages2(messageCount, blocking)); } while(messageCount == UINT_MAX); return 0;}bool Store::GetNextMessage(){ if (!m_messageEnd && !AnyRetrievable()) { m_messageEnd=true; return true; } else return false;}unsigned int Store::CopyMessagesTo(BufferedTransformation &target, unsigned int count, const std::string &channel) const{ if (m_messageEnd || count == 0) return 0; else { CopyTo(target, ULONG_MAX, channel); if (GetAutoSignalPropagation()) target.ChannelMessageEnd(channel, GetAutoSignalPropagation()-1); return 1; }}void StringStore::StoreInitialize(const NameValuePairs ¶meters){ ConstByteArrayParameter array; if (!parameters.GetValue(Name::InputBuffer(), array)) throw InvalidArgument("StringStore: missing InputBuffer argument"); m_store = array.begin(); m_length = array.size(); m_count = 0;}size_t StringStore::TransferTo2(BufferedTransformation &target, lword &transferBytes, const std::string &channel, bool blocking){ lword position = 0; size_t blockedBytes = CopyRangeTo2(target, position, transferBytes, channel, blocking); m_count += (size_t)position; transferBytes = position; return blockedBytes;}size_t StringStore::CopyRangeTo2(BufferedTransformation &target, lword &begin, lword end, const std::string &channel, bool blocking) const{ size_t i = UnsignedMin(m_length, m_count+begin); size_t len = UnsignedMin(m_length-i, end-begin); size_t blockedBytes = target.ChannelPut2(channel, m_store+i, len, 0, blocking); if (!blockedBytes) begin += len; return blockedBytes;}void RandomNumberStore::StoreInitialize(const NameValuePairs ¶meters){ parameters.GetRequiredParameter("RandomNumberStore", "RandomNumberGeneratorPointer", m_rng); int length; parameters.GetRequiredIntParameter("RandomNumberStore", "RandomNumberStoreSize", length); m_length = length;}size_t RandomNumberStore::TransferTo2(BufferedTransformation &target, lword &transferBytes, const std::string &channel, bool blocking){ if (!blocking) throw NotImplemented("RandomNumberStore: nonblocking transfer is not implemented by this object"); transferBytes = UnsignedMin(transferBytes, m_length - m_count); m_rng->GenerateIntoBufferedTransformation(target, channel, transferBytes); m_count += transferBytes; return 0;}size_t NullStore::CopyRangeTo2(BufferedTransformation &target, lword &begin, lword end, const std::string &channel, bool blocking) const{ static const byte nullBytes[128] = {0}; while (begin < end) { size_t len = (size_t)STDMIN(end-begin, lword(128)); size_t blockedBytes = target.ChannelPut2(channel, nullBytes, len, 0, blocking); if (blockedBytes) return blockedBytes; begin += len; } return 0;}size_t NullStore::TransferTo2(BufferedTransformation &target, lword &transferBytes, const std::string &channel, bool blocking){ lword begin = 0; size_t blockedBytes = NullStore::CopyRangeTo2(target, begin, transferBytes, channel, blocking); transferBytes = begin; m_size -= begin; return blockedBytes;}NAMESPACE_END#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -