diff --git a/cryptlib.cpp b/cryptlib.cpp index bf4577a9..f65123ab 100644 --- a/cryptlib.cpp +++ b/cryptlib.cpp @@ -743,6 +743,12 @@ size_t BufferedTransformation::ChannelPutWord32(const std::string &channel, word return ChannelPut(channel, m_buf, 4, blocking); } +size_t BufferedTransformation::ChannelPutWord64(const std::string &channel, word64 value, ByteOrder order, bool blocking) +{ + PutWord(false, order, m_buf, value); + return ChannelPut(channel, m_buf, 8, blocking); +} + size_t BufferedTransformation::PutWord16(word16 value, ByteOrder order, bool blocking) { return ChannelPutWord16(DEFAULT_CHANNEL, value, order, blocking); @@ -753,6 +759,11 @@ size_t BufferedTransformation::PutWord32(word32 value, ByteOrder order, bool blo return ChannelPutWord32(DEFAULT_CHANNEL, value, order, blocking); } +size_t BufferedTransformation::PutWord64(word64 value, ByteOrder order, bool blocking) +{ + return ChannelPutWord64(DEFAULT_CHANNEL, value, order, blocking); +} + // Issue 340 #if CRYPTOPP_GCC_DIAGNOSTIC_AVAILABLE # pragma GCC diagnostic push @@ -765,7 +776,7 @@ size_t BufferedTransformation::PeekWord16(word16 &value, ByteOrder order) const byte buf[2] = {0, 0}; size_t len = Peek(buf, 2); - if (order) + if (order == BIG_ENDIAN_ORDER) value = (buf[0] << 8) | buf[1]; else value = (buf[1] << 8) | buf[0]; @@ -778,7 +789,7 @@ size_t BufferedTransformation::PeekWord32(word32 &value, ByteOrder order) const byte buf[4] = {0, 0, 0, 0}; size_t len = Peek(buf, 4); - if (order) + if (order == BIG_ENDIAN_ORDER) value = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf [3]; else value = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf [0]; @@ -786,6 +797,23 @@ size_t BufferedTransformation::PeekWord32(word32 &value, ByteOrder order) const return len; } +size_t BufferedTransformation::PeekWord64(word64 &value, ByteOrder order) const +{ + byte buf[8] = {0, 0, 0, 0, 0, 0, 0, 0}; + size_t len = Peek(buf, 8); + + if (order == BIG_ENDIAN_ORDER) + value = ((word64)buf[0] << 56) | ((word64)buf[1] << 48) | ((word64)buf[2] << 40) | + ((word64)buf[3] << 32) | ((word64)buf[4] << 24) | ((word64)buf[5] << 16) | + ((word64)buf[6] << 8) | (word64)buf[7]; + else + value = ((word64)buf[7] << 56) | ((word64)buf[6] << 48) | ((word64)buf[5] << 40) | + ((word64)buf[4] << 32) | ((word64)buf[3] << 24) | ((word64)buf[2] << 16) | + ((word64)buf[1] << 8) | (word64)buf[0]; + + return len; +} + // Issue 340 #if CRYPTOPP_GCC_DIAGNOSTIC_AVAILABLE # pragma GCC diagnostic pop @@ -801,6 +829,11 @@ size_t BufferedTransformation::GetWord32(word32 &value, ByteOrder order) return (size_t)Skip(PeekWord32(value, order)); } +size_t BufferedTransformation::GetWord64(word64 &value, ByteOrder order) +{ + return (size_t)Skip(PeekWord64(value, order)); +} + void BufferedTransformation::Attach(BufferedTransformation *newAttachment) { if (AttachedTransformation() && AttachedTransformation()->Attachable()) diff --git a/cryptlib.h b/cryptlib.h index 912640fe..375b46ab 100644 --- a/cryptlib.h +++ b/cryptlib.h @@ -1614,8 +1614,8 @@ public: /// \brief Input a byte for processing /// \param inByte the 8-bit byte (octet) to be processed. /// \param blocking specifies whether the object should block when processing input. - /// \return the number of bytes that remain in the block (i.e., bytes not processed). 0 indicates all - /// bytes were processed. + /// \return the number of bytes that remain in the block (i.e., bytes not processed). + /// 0 indicates all bytes were processed. /// \details Put(byte) calls Put(byte*, size_t). size_t Put(byte inByte, bool blocking=true) {return Put(&inByte, 1, blocking);} @@ -1624,8 +1624,8 @@ public: /// \param inString the byte buffer to process /// \param length the size of the string, in bytes /// \param blocking specifies whether the object should block when processing input - /// \return the number of bytes that remain in the block (i.e., bytes not processed). 0 indicates all - /// bytes were processed. + /// \return the number of bytes that remain in the block (i.e., bytes not processed). + /// 0 indicates all bytes were processed. /// \details Internally, Put() calls Put2(). size_t Put(const byte *inString, size_t length, bool blocking=true) {return Put2(inString, length, 0, blocking);} @@ -1634,18 +1634,26 @@ public: /// \param value the 16-bit value to be processed /// \param order the ByteOrder of the value to be processed. /// \param blocking specifies whether the object should block when processing input - /// \return the number of bytes that remain in the block (i.e., bytes not processed). 0 indicates all - /// bytes were processed. + /// \return the number of bytes that remain in the block (i.e., bytes not processed). + /// 0 indicates all bytes were processed. size_t PutWord16(word16 value, ByteOrder order=BIG_ENDIAN_ORDER, bool blocking=true); /// Input a 32-bit word for processing. /// \param value the 32-bit value to be processed. /// \param order the ByteOrder of the value to be processed. /// \param blocking specifies whether the object should block when processing input. - /// \return the number of bytes that remain in the block (i.e., bytes not processed). 0 indicates all - /// bytes were processed. + /// \return the number of bytes that remain in the block (i.e., bytes not processed). + /// 0 indicates all bytes were processed. size_t PutWord32(word32 value, ByteOrder order=BIG_ENDIAN_ORDER, bool blocking=true); + /// Input a 64-bit word for processing. + /// \param value the 64-bit value to be processed. + /// \param order the ByteOrder of the value to be processed. + /// \param blocking specifies whether the object should block when processing input. + /// \return the number of bytes that remain in the block (i.e., bytes not processed). + /// 0 indicates all bytes were processed. + size_t PutWord64(word64 value, ByteOrder order=BIG_ENDIAN_ORDER, bool blocking=true); + /// \brief Request space which can be written into by the caller /// \param size the requested size of the buffer /// \return byte pointer to the space to input data @@ -1856,7 +1864,7 @@ public: /// \param peekMax the number of bytes to Peek /// \return the number of bytes read during the call. /// \details Peek does not remove bytes from the object. Use the return value of - /// Get() to detect short reads. + /// Peek() to detect short reads. virtual size_t Peek(byte *outString, size_t peekMax) const; /// \brief Retrieve a 16-bit word @@ -1870,15 +1878,23 @@ public: /// \param value the 32-bit value to be retrieved /// \param order the ByteOrder of the value to be processed. /// \return the number of bytes consumed during the call. - /// \details Use the return value of GetWord16() to detect short reads. + /// \details Use the return value of GetWord32() to detect short reads. size_t GetWord32(word32 &value, ByteOrder order=BIG_ENDIAN_ORDER); + /// \brief Retrieve a 64-bit word + /// \param value the 64-bit value to be retrieved + /// \param order the ByteOrder of the value to be processed. + /// \return the number of bytes consumed during the call. + /// \details Use the return value of GetWord64() to detect short reads. + /// \since Crypto++ 8.3 + size_t GetWord64(word64 &value, ByteOrder order=BIG_ENDIAN_ORDER); + /// \brief Peek a 16-bit word /// \param value the 16-bit value to be retrieved /// \param order the ByteOrder of the value to be processed. /// \return the number of bytes consumed during the call. /// \details Peek does not consume bytes in the stream. Use the return value - /// of GetWord16() to detect short reads. + /// of PeekWord16() to detect short reads. size_t PeekWord16(word16 &value, ByteOrder order=BIG_ENDIAN_ORDER) const; /// \brief Peek a 32-bit word @@ -1886,9 +1902,18 @@ public: /// \param order the ByteOrder of the value to be processed. /// \return the number of bytes consumed during the call. /// \details Peek does not consume bytes in the stream. Use the return value - /// of GetWord16() to detect short reads. + /// of PeekWord32() to detect short reads. size_t PeekWord32(word32 &value, ByteOrder order=BIG_ENDIAN_ORDER) const; + /// \brief Peek a 64-bit word + /// \param value the 64-bit value to be retrieved + /// \param order the ByteOrder of the value to be processed. + /// \return the number of bytes consumed during the call. + /// \details Peek does not consume bytes in the stream. Use the return value + /// of PeekWord64() to detect short reads. + /// \since Crypto++ 8.3 + size_t PeekWord64(word64 &value, ByteOrder order=BIG_ENDIAN_ORDER) const; + /// move transferMax bytes of the buffered output to target as input /// \brief Transfer bytes from this object to another BufferedTransformation @@ -2144,6 +2169,15 @@ public: /// number of bytes that were not processed. size_t ChannelPutWord32(const std::string &channel, word32 value, ByteOrder order=BIG_ENDIAN_ORDER, bool blocking=true); + /// \brief Input a 64-bit word for processing on a channel. + /// \param channel the channel to process the data. + /// \param value the 64-bit value to be processed. + /// \param order the ByteOrder of the value to be processed. + /// \param blocking specifies whether the object should block when processing input. + /// \return 0 indicates all bytes were processed during the call. Non-0 indicates the + /// number of bytes that were not processed. + size_t ChannelPutWord64(const std::string &channel, word64 value, ByteOrder order=BIG_ENDIAN_ORDER, bool blocking=true); + /// \brief Signal the end of a message /// \param channel the channel to process the data. /// \param propagation the number of attached transformations the ChannelMessageEnd() signal should be passed