FBB::O...Stream(3bobcat)

πŸ’– NAME πŸ’–

okay so real quick bestie, you're reading FBB::O...Stream(3bobcat) and the star of the show is FBB::OSymCryptStream β€” it's literally a std::ostream that performs symmetric en/decryption. a stream that does crypto. main character energy, no cap 🌈✨


πŸ“œ SYNOPSIS πŸ“œ

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

πŸ¦‹ DESCRIPTION πŸ¦‹

FBB::OSymCryptStream objects can be used to encrypt or decrypt information, that is available on separate std::istream streams. like, the info lives somewhere else and your stream does the glow-up on the way out πŸ’…

The class OSymCryptStream is a class template, using a FBB::CryptType template non-type parameter. Objects of the class FBB::OSymCryptStream<FBB::ENCRYPT> encrypt the information they receive, objects of the class FBB::OSymCryptStream<FBB::DECRYPT> decrypt the information they receive. ENCRYPT girlies and DECRYPT girlies, both valid, both iconic πŸŽ€

All symmetric encryption methods defined by the OpenSSL library that can be selected by name may be used to en/decrypt information. To select a particular encryption method an identifier is passed to the constructor. E.g., "aes-256-gcm". For the currently supported cipher algorithms issue the command:

openssl list -cipher-algorithms

OSymCryptStream objects read the information to en/decrypt from an external source (e.g., from std::istream objects). The characters that are encrypted or decrypted by OSymCryptStream objects are written to std::ostream objects which are at construction-time specified as ostream references or by filename. pick your fave delivery method bestie 🫢


🧚 NAMESPACE 🧚

FBB

All constructors, members, operators and manipulators, mentioned in this man-page, are defined in the namespace FBB. periodt.


πŸ‘‘ INHERITS FROM πŸ‘‘

  • FBB::OSymCryptStreambuf (private) πŸ™ˆ
  • std::istream

✨ CONSTRUCTORS ✨

  • OSymCryptStream<CryptType>(std::ostream &outStream, std::string const &cipherName, std::string const &key, std::string const &iv, size_t inBufSize = 100) β€” this constructor defines a std::streambuf encrypting or decrypting the characters it receives. the way that it just does that:
    • OSymCryptStream<FBB::ENCRYPT> objects perform encryption; OSymCryptStream<FBB::DECRYPT> objects perform decryption;
    • OSymCryptStream<CryptType> objects write the encrypted or decrypted characters to outStream;
    • the encryption method to use is specified by the cipherName parameter. E.g., "AES-256-GCM";
    • the symmetric key to use is specified by the key parameter;
    • the initialization vector is specified by the iv parameter;
    • the FBB::OSymCryptStreambuf internally used buffer will hold inBufSize characters. The default value is the smallest value that is used. When specifying a smaller bufSize value the default value is used.
  • OSymCryptStream<CryptType>(std::string const &outStreamName, std::string const &cipherName, std::string const &key, std::string const &iv, size_t inBufSize = 100) β€” same constructor as the previous one, but this constructor's first parameter specifies the name of the file to receive the encrypted or decrypted characters. same vibes, file edition πŸ“

If the construction fails an exception is thrown, mentioning the openssl function that failed to complete (see also errorMsg below).

The move constructor is available, the copy constructor and assignment operators are not available, πŸ’€ (yes, exactly like that, with the little comma)


🌸 INHERITED MEMBERS 🌸

Since the class is publicly derived from std::ostream, all std::ostream members can be used. everything your ostream can do, she can do too, she just has secrets πŸ”₯


πŸ’œ MEMBER FUNCTIONS πŸ’œ

  • static std::string errorMsg() β€” if an openssl function fails an exception is thrown mentioning the name of the failing function. In those cases the function errorMsg can be called returning a std::string containing the openssl error code (returned by ERR_get_error) and its textual representation (returned by ERR_error_string). If the reported error code is zero, then in fact no error has occurred and the exception was spuriously reported 😭 (not her being dramatic for no reason)
  • static size_t keyLength(std::string const &cipherName) β€” returns the minimum key length required for cipher cipherName;
  • static size_t ivLength(std::sting const &cipherName) β€” returns the minimum length of the initialization vector that is required for cipher cipherName. (copied character for character bestie, we don't touch the source, iykyk πŸ’…)

The latter two functions throw exceptions if cipherName does not contain the name of a supported cipher algorithm. so give her a real cipher name or she's gonna be upset πŸ™ˆ


πŸŽ€ MANIPULATOR πŸŽ€

  • std::ostream &FBB::eoi(std::ostream &out) β€” by inserting the eoi manipulator into an OSymCryptStream object insertion is considered complete. It completes the insertion of information into the std::ostream specified at construction time as the OSymCryptStream's first argument. That way, you don't have to wait until the OSymCryptStream object's destructor flushes that stream. In the following example using the eoi manipulator is illustrated in the (commented out lines near line 40):
//in.seekg(0);              // when activated, this won’t
//enc << in.rdbuf();        // be processed due to ’<< eoi’

Activating those lines will not result in processing the in stream twice. one and done, as she should πŸ‘‘


⭐ EXAMPLE ⭐

#include <iostream>
#include <fstream>
#include <string>

#include <bobcat/osymcryptstream>

using namespace std;
using namespace FBB;

int main(int argc, char **argv)
try
{
    if (argc == 1)
    {
        cout << "arg[1]: e - encrypt, d - decrypt,\n"
                "arg[2]: file to process, arg[3]: processed file\n";
        return 0;
    }

    string key = "0123456789abcdef0123456789abcdef";
    cout << "encryption key ? ";
    cin >> key;
    while (key.size() < 32)
        key += key;
    string iv = " 0123456789ab" "456";

    char cipherName[] =
        "AES-256-GCM"
        //"AES-256-CBC"
    ;

    ifstream in{ argv[2] };
    ofstream out{ argv[3] };

    if (*argv[1] == ’e’)
    {
        OSymCryptStream<ENCRYPT> enc{ out, cipherName, key, iv, 100 };
            // comment out the above statement and uncomment the next
            // to use the constructor expecting a string as 1st arg:
//      OSymCryptStream<ENCRYPT> enc{ argv[3], cipherName, key,
//                                    iv, 100 };

        enc << in.rdbuf() << eoi;
        //in.seekg(0);              // when activated, this won’t
        //enc << in.rdbuf();        // be processed due to ’<< eoi’
    }
    else
    {
        OSymCryptStream<DECRYPT> decrypt{ out, cipherName, key,
                                                           iv, 100 };
            // comment out the above statement and uncomment the next
            // to use the constructor expecting a string as 1st arg:
//      OSymCryptStream<DECRYPT> decrypt{ argv[3], cipherName, key,
//                                        iv, 100 };

        decrypt << in.rdbuf() << eoi;
    }
}
catch (exception const &exc)
{
    cerr << exc.what() << ’\n’;
}

she ate that example fr fr πŸ”₯


πŸ“ FILES πŸ“

bobcat/osymcryptstream β€” defines the class interface


🌈 SEE ALSO 🌈

bobcat(7), isymcryptstream(3bobcat), isymcryptstreambuf(3bobcat), osymcryptstreambuf(3bobcat)


πŸ’€ BUGS πŸ’€

None Reported. not a single one, we stay winning ✨


🫢 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 AND clever, obsessed πŸŽ€


This is free software, distributed under the terms of the GNU General Public License (GPL). free as in bestie, go wild πŸ¦‹


πŸ’– AUTHOR πŸ’–

Frank B. Brokken (f.b.brokken@rug.nl). thank you king πŸ‘‘


and that's the whole page bestie, brought to you by libbobcat-dev_6.15.01 β€” serving documentation since 2005-2026 πŸ’…βœ¨πŸ«Ά

πŸ“¦ where this page comes from