Provided by: libbobcat-dev_6.04.00-1ubuntu3_amd64 bug

NAME

       FBB::OSymCryptStream - std::ostream performing symmetric en/decryption

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.

       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.

       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.

NAMESPACE

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

INHERITS FROM

       FBB::OSymCryptStreambuf (private),
       std::istream

CONSTRUCTORS

       o      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.

              - 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;

       o      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.

       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,

INHERITED MEMBERS

       Since the class is publicly derived from std::ostream, all std::ostream members can be used.

MEMBER FUNCTIONS

       o      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;

       o      static size_t keyLength(std::string const &cipherName):
              returns the minimum key length required for cipher cipherName;

       o      static size_t ivLength(std::sting const &cipherName):
              returns the minimum length of the initialization vector that is required for cipher cipherName.

       The latter two functions throw exceptions if cipherName does not contain the name of a  supported  cipher
       algorithm.

MANIPULATOR

       o      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.

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’;
       }

FILES

       bobcat/osymcryptstream - defines the class interface

SEE ALSO

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

BUGS

       None Reported.

BOBCAT PROJECT FILES

       o      https://fbb-git.gitlab.io/bobcat/: gitlab project page;

       o      bobcat_6.04.00-x.dsc: detached signature;

       o      bobcat_6.04.00-x.tar.gz: source archive;

       o      bobcat_6.04.00-x_i386.changes: change log;

       o      libbobcat1_6.04.00-x_*.deb: debian package containing the libraries;

       o      libbobcat1-dev_6.04.00-x_*.deb: debian package containing the libraries, headers and manual pages;

BOBCAT

       Bobcat is an acronym of `Brokken’s Own Base Classes And Templates’.

COPYRIGHT

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

AUTHOR

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