FBB::DigestBuf(3bobcat)

πŸ’– FBB::DigestBuf β€” the manual page, but make it cute πŸ’–

okay so bestie, you know how FBB::DigestBuf lives in the 3bobcat section of the manual? Yeah. This is that page. It's literally Compute Message Digests and it's giving main character energy ✨


🌸 NAME 🌸

FBB::DigestBuf β€” computes message digests from information inserted into a std::ostream


✨ SYNOPSIS ✨

#include <bobcat/digestbuf>
Linking option: -lbobcat -lcrypto

πŸ¦‹ DESCRIPTION πŸ¦‹

FBB::DigestBuf objects are std::streambuf objects, and you can use them to initialize std::ostream objects with. Iconic behaviour, honestly.

The message digest of all the information you insert into such an std::ostream gets computed. Every single bit. No cap. πŸ’…

Every message digest that the OpenSSL library defines and that can be selected by name may be used in combination with DigestBuf objects. All of them. The whole roster.

The currently supported message digest algorithms are shown by:

openssl list -digest-commands

And the names of those digest algorithms can be used to select a digest algorithm for the class's constructor, which we're getting to below. πŸ‘‘


🌈 NAMESPACE 🌈

FBB

All constructors, members, operators and manipulators mentioned in this man-page are defined in the namespace FBB. So if you're wondering where they're at β€” it's FBB. Always was. 🫢


πŸŽ€ INHERITS FROM πŸŽ€

std::streambuf


πŸ’œ CONSTRUCTORS πŸ’œ

  • DigestBuf(char const *digestName, size_t bufsize = 1024) β€” this constructor initializes the streambuf, setting it up for the message digest algorithm specified with type. The message digest algorithms specified in the DESCRIPTION section may be used here. E.g., to use the sha256 algorithm specify "sha256".

The bufsize argument specifies the size of the internal buffer used by DigestBuf to store incoming characters temporarily. The provided default argument should be OK in all normal cases. Don't stress about it, fr fr.

The copy and move constructors and assignment operators are not available. Not on the menu. Not happening. 🚫

πŸ”₯ OVERLOADED OPERATOR πŸ”₯

  • std::ostream &operator<<(std::ostream &out, DigestBuf const &digestbuf) β€” the insertion operator is a free function defined in the namespace FBB. It inserts a hash value as a series of hexadecimally displayed values into the provided ostream. See the example below for an illustration, bestie, it's right there. ⭐

πŸ‘‘ MEMBER FUNCTIONS πŸ‘‘

All members of std::streambuf are available, as FBB::DigestBuf inherits from this class. Everything. The whole inheritance situation is slaying.

  • void eoi() β€” this member finishes the computation of the message digest computation. It is needed as the DigestBuf object has no external means for deciding whether all information to compute the digest for has yet been received or not. So like, it can't read your mind, okay?? 😭

The general approach to follow when computing a message digest is therefore:

  1. create a DigestBuf object
  2. use it to create a std::ostream object
  3. insert information into the ostream object
  4. call the DigestBuf object's eoi() member or insert the eoi manipulator into the ostream (see below)
  5. obtain/process the hash value from the DigestBuf object.
  • std::string const &hash() const β€” this member returns the hash value computed by the DigestBuf object. Its value is only defined after having called close(). The hash value is returned in a std::string object. This string's length() member contains the number of characters used by the hash value, and its data() member refers to the hash value's characters.
Note that a hash value's character value may be 0 (not to be confused with '0'). That's not the character zero, bestie, that's an actual zero byte. Different thing entirely. πŸ’€
  • void reset() β€” this member reinitializes the message digest computation. Once a message digest has been computed for, say a stream streamA, this member can be called, after which the digest for a stream streamB can be computed using the same DigestBuf object. Reuse, recycle, reduce. Sustainability queen. 🌱

🧚 MANIPULATOR 🧚

  • FBB::eoi β€” the eoi manipulator can be inserted into the ostream to complete the digest. It performs the same actions as the eoi member. If inserted into a plain std::ostream, nothing happens. Just vibes, no effect. πŸ™ˆ

⭐ EXAMPLE ⭐

#include <iostream>
#include <ostream>
#include <bobcat/digestbuf>

using namespace std;
using namespace FBB;

int main(int argc, char **argv)
try
{
    DigestBuf digestbuf(argc == 1 ? "sha256" : argv[1]);
    ostream out(&digestbuf);

    string hw("hello world\n");

    out << hw << eoi;
    cout << ">" << digestbuf << "<" << endl;

    digestbuf.reset();
    out.write(hw.c_str(), hw.length()) << eoi;
    cout << ">" << digestbuf << "<" << endl;
}
catch(exception const &err)
{
    cout << err.what() << endl;
    return 1;
}
See how it does the whole thing twice with reset() in between?? Yeah. That's the move. πŸŽ€

🌸 FILES 🌸

bobcat/digestbuf β€” defines the class interface


πŸ’– SEE ALSO πŸ’–

bobcat(7), hmacbuf(3bobcat), std::streambuf


πŸ¦‹ BUGS πŸ¦‹

None reported

(not a single one. flawless. periodt. πŸ’…βœ¨)


🌈 BOBCAT PROJECT FILES 🌈

Debian Bobcat project files:

  • libbobcat6 β€” debian package containing the shared library, changelog and copyright note;
  • libbobcat-dev β€” debian package containing the static library, headers, manual pages, and developer info;

πŸ’œ BOBCAT πŸ’œ

Bobcat is an acronym of Brokken's Own Base Classes And Templates. Cute acronym, honestly, big fan. πŸ‘‘


This is free software, distributed under the terms of the GNU General Public License (GPL).


πŸ’… AUTHOR πŸ’…

Frank B. Brokken (f.b.brokken@rug.nl).


okay that's the whole entire page bestie, we ate and left absolutely no crumbs πŸ“

libbobcat-dev_6.15.01 Β· 2005-2026 Β· FBB::DigestBuf(3bobcat) β€” mwah, love u, go compute some digests πŸ’–βœ¨πŸ¦‹

πŸ“¦ where this page comes from