Does Cryptopp support variable digest sizes for BLAKE2?

23 views
Skip to first unread message

Tom

unread,
Feb 23, 2019, 7:42:17 PM2/23/19
to Crypto++ Users
std::string hash(std::string input)
{
CryptoPP::byte const* pbData = (CryptoPP::byte*)input.data();
unsigned int nDataLen = input.length();
CryptoPP::byte abDigest[CryptoPP::BLAKE2b::DIGESTSIZE];

CryptoPP::BLAKE2b().CalculateDigest(abDigest, pbData, nDataLen);

return std::string((char*)abDigest, CryptoPP::BLAKE2b::DIGESTSIZE);
}

this the function I'm using, is it possible to specify a nondefault digest size?

Jeffrey Walton

unread,
Feb 23, 2019, 8:16:43 PM2/23/19
to Crypto++ Users


On Saturday, February 23, 2019 at 7:42:17 PM UTC-5, Tom wrote:

this the function I'm using, is it possible to specify a nondefault digest size?

Yes, use something like:

$ cat test.cxx
#include <iostream>
#include <string>

#include "cryptlib.h"
#include "filters.h"
#include "files.h"
#include "blake2.h"
#include "hex.h"

int main(int argc, char* argv[])
{
    using namespace CryptoPP;

    byte password[] ="password";
    size_t plen = strlen((const char*)password);

        byte digest[16];
        BLAKE2b(16).CalculateTruncatedDigest(digest, 16, password, plen);

        std::cout << "Digest: ";
    StringSource(digest, 16, true, new HexEncoder(new FileSink(std::cout)));
    std::cout << std::endl;

    return 0;
}

$ ./test.exe
Digest: 9609A5E50D59AAD1A6909EE98C6D1FA2


Jeff

Tom

unread,
Feb 24, 2019, 1:36:46 PM2/24/19
to Crypto++ Users
Thanks, but I seem to be producing incorrect results.

The expected result for a BLAKE2b-384 digest of "1234567890" is 5a5f07b659b97436674e047c1f68d2513aea801e8722aeba5af5a3bf4fd20032b1e0182078389a1b76bae77f1d536950

and the program below is producing a digest of F54AEB1C4848FB988266C7E347C15F6CB4B2D896FC7A7127074C956508192ED8C7644AC492999532207986D10EF43652

std::string hash(std::string input)
{
   CryptoPP::byte const* pbData = (CryptoPP::byte*)input.data();
  unsigned int nDataLen = input.length();
CryptoPP::byte abDigest[48];

        CryptoPP::BLAKE2b(48).CalculateTruncatedDigest(abDigest, 48, pbData, nDataLen);

        return std::string((char*)abDigest, 48);
}

std::string to_hex(const std::string& input)
{
  CryptoPP::byte const* pbData = (CryptoPP::byte*)input.data();
  unsigned int nDataLen = input.length();

        std::string output;

        CryptoPP::HexEncoder hex(new CryptoPP::StringSink(output));
    hex.Put(pbData, nDataLen);
     hex.MessageEnd();

        return output;
}

int main(int argc, char* argv[])
{
      std::string text = "1234567890";

        std::cout << to_hex(hash(text)) std::endl;

        return 0;
}

Also changing the digest length for other lengths seems to produce just the first `x` bytes of a larger hash i.e. for the string "1234567890"

I.e. the following:

BLAKE2b_384:    F54AEB1C4848FB988266C7E347C15F6CB4B2D896FC7A7127074C956508192ED8C7644AC492999532207986D10EF43652
BLAKE2b_320:    F54AEB1C4848FB988266C7E347C15F6CB4B2D896FC7A7127074C956508192ED8C7644AC492999532
BLAKE2b_256:    F54AEB1C4848FB988266C7E347C15F6CB4B2D896FC7A7127074C956508192ED8
BLAKE2b_224:    F54AEB1C4848FB988266C7E347C15F6CB4B2D896FC7A7127074C9565
BLAKE2b_192:    F54AEB1C4848FB988266C7E347C15F6CB4B2D896FC7A7127
BLAKE2b_128:    F54AEB1C4848FB988266C7E347C15F6C
BLAKE2b_64:      F54AEB1C4848FB98

Tom

unread,
Feb 24, 2019, 1:38:40 PM2/24/19
to Crypto++ Users


On Sunday, February 24, 2019 at 1:36:46 PM UTC-5, Tom wrote:
BLAKE2b_384:    F54AEB1C4848FB988266C7E347C15F6CB4B2D896FC7A7127074C956508192ED8C7644AC492999532207986D10EF43652
BLAKE2b_320:    F54AEB1C4848FB988266C7E347C15F6CB4B2D896FC7A7127074C956508192ED8C7644AC492999532
BLAKE2b_256:    F54AEB1C4848FB988266C7E347C15F6CB4B2D896FC7A7127074C956508192ED8
BLAKE2b_224:    F54AEB1C4848FB988266C7E347C15F6CB4B2D896FC7A7127074C9565
BLAKE2b_192:    F54AEB1C4848FB988266C7E347C15F6CB4B2D896FC7A7127
BLAKE2b_128:    F54AEB1C4848FB988266C7E347C15F6C
BLAKE2b_64:      F54AEB1C4848FB98


Changing the digest length should produce different results
Reply all
Reply to author
Forward
0 new messages