19aa70198SArgyrios Kyrtzidis //===- llvm/unittest/Support/BLAKE3Test.cpp - BLAKE3 tests ----------------===//
29aa70198SArgyrios Kyrtzidis //
39aa70198SArgyrios Kyrtzidis // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
49aa70198SArgyrios Kyrtzidis // See https://llvm.org/LICENSE.txt for license information.
59aa70198SArgyrios Kyrtzidis // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
69aa70198SArgyrios Kyrtzidis //
79aa70198SArgyrios Kyrtzidis //===----------------------------------------------------------------------===//
89aa70198SArgyrios Kyrtzidis //
99aa70198SArgyrios Kyrtzidis // This file implements unit tests for the BLAKE3 functions.
109aa70198SArgyrios Kyrtzidis //
119aa70198SArgyrios Kyrtzidis //===----------------------------------------------------------------------===//
129aa70198SArgyrios Kyrtzidis
139aa70198SArgyrios Kyrtzidis #include "llvm/Support/BLAKE3.h"
149aa70198SArgyrios Kyrtzidis #include "llvm/ADT/StringExtras.h"
15330268baSArgyrios Kyrtzidis #include "llvm/Support/HashBuilder.h"
169aa70198SArgyrios Kyrtzidis #include "gtest/gtest.h"
179aa70198SArgyrios Kyrtzidis
189aa70198SArgyrios Kyrtzidis using namespace llvm;
199aa70198SArgyrios Kyrtzidis
209aa70198SArgyrios Kyrtzidis namespace {
219aa70198SArgyrios Kyrtzidis
229aa70198SArgyrios Kyrtzidis /// Tests an arbitrary set of bytes passed as \p Input.
TestBLAKE3Sum(ArrayRef<uint8_t> Input,StringRef Final)239aa70198SArgyrios Kyrtzidis void TestBLAKE3Sum(ArrayRef<uint8_t> Input, StringRef Final) {
249aa70198SArgyrios Kyrtzidis BLAKE3 Hash;
259aa70198SArgyrios Kyrtzidis Hash.update(Input);
269aa70198SArgyrios Kyrtzidis auto hash = Hash.final();
279aa70198SArgyrios Kyrtzidis auto hashStr = toHex(hash);
289aa70198SArgyrios Kyrtzidis EXPECT_EQ(hashStr, Final);
299aa70198SArgyrios Kyrtzidis }
309aa70198SArgyrios Kyrtzidis
319aa70198SArgyrios Kyrtzidis using KV = std::pair<const char *, const char *>;
329aa70198SArgyrios Kyrtzidis
TEST(BLAKE3Test,BLAKE3)339aa70198SArgyrios Kyrtzidis TEST(BLAKE3Test, BLAKE3) {
349aa70198SArgyrios Kyrtzidis std::array<KV, 5> testvectors{
359aa70198SArgyrios Kyrtzidis KV{"",
369aa70198SArgyrios Kyrtzidis "AF1349B9F5F9A1A6A0404DEA36DCC9499BCB25C9ADC112B7CC9A93CAE41F3262"},
379aa70198SArgyrios Kyrtzidis KV{"a",
389aa70198SArgyrios Kyrtzidis "17762FDDD969A453925D65717AC3EEA21320B66B54342FDE15128D6CAF21215F"},
399aa70198SArgyrios Kyrtzidis KV{"abc",
409aa70198SArgyrios Kyrtzidis "6437B3AC38465133FFB63B75273A8DB548C558465D79DB03FD359C6CD5BD9D85"},
419aa70198SArgyrios Kyrtzidis KV{"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
429aa70198SArgyrios Kyrtzidis "C19012CC2AAF0DC3D8E5C45A1B79114D2DF42ABB2A410BF54BE09E891AF06FF8"},
439aa70198SArgyrios Kyrtzidis KV{"abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklm"
449aa70198SArgyrios Kyrtzidis "nopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
459aa70198SArgyrios Kyrtzidis "553E1AA2A477CB3166E6AB38C12D59F6C5017F0885AAF079F217DA00CFCA363F"}};
469aa70198SArgyrios Kyrtzidis
479aa70198SArgyrios Kyrtzidis for (auto input_expected : testvectors) {
489aa70198SArgyrios Kyrtzidis auto str = std::get<0>(input_expected);
499aa70198SArgyrios Kyrtzidis auto expected = std::get<1>(input_expected);
509aa70198SArgyrios Kyrtzidis TestBLAKE3Sum({reinterpret_cast<const uint8_t *>(str), strlen(str)},
519aa70198SArgyrios Kyrtzidis expected);
529aa70198SArgyrios Kyrtzidis }
539aa70198SArgyrios Kyrtzidis
549aa70198SArgyrios Kyrtzidis std::string rep(1000, 'a');
559aa70198SArgyrios Kyrtzidis BLAKE3 Hash;
569aa70198SArgyrios Kyrtzidis for (int i = 0; i < 1000; ++i) {
579aa70198SArgyrios Kyrtzidis Hash.update({reinterpret_cast<const uint8_t *>(rep.data()), rep.size()});
589aa70198SArgyrios Kyrtzidis }
599aa70198SArgyrios Kyrtzidis auto hash = Hash.final();
609aa70198SArgyrios Kyrtzidis auto hashStr = toHex(hash);
619aa70198SArgyrios Kyrtzidis EXPECT_EQ(hashStr,
629aa70198SArgyrios Kyrtzidis "616F575A1B58D4C9797D4217B9730AE5E6EB319D76EDEF6549B46F4EFE31FF8B");
63330268baSArgyrios Kyrtzidis
64330268baSArgyrios Kyrtzidis // Using generic HashBuilder.
65*b05dbc4dSKazu Hirata HashBuilder<BLAKE3, llvm::endianness::native> HashBuilder;
66330268baSArgyrios Kyrtzidis HashBuilder.update(std::get<0>(testvectors[2]));
67330268baSArgyrios Kyrtzidis BLAKE3Result<> HBHash1 = HashBuilder.final();
68330268baSArgyrios Kyrtzidis BLAKE3Result<> HBHash2 = HashBuilder.result();
69330268baSArgyrios Kyrtzidis EXPECT_EQ(std::get<1>(testvectors[2]), toHex(HBHash1));
70330268baSArgyrios Kyrtzidis EXPECT_EQ(std::get<1>(testvectors[2]), toHex(HBHash2));
719aa70198SArgyrios Kyrtzidis }
729aa70198SArgyrios Kyrtzidis
TEST(BLAKE3Test,SmallerHashSize)739aa70198SArgyrios Kyrtzidis TEST(BLAKE3Test, SmallerHashSize) {
749aa70198SArgyrios Kyrtzidis const char *InputStr = "abc";
759aa70198SArgyrios Kyrtzidis ArrayRef<uint8_t> Input(reinterpret_cast<const uint8_t *>(InputStr),
769aa70198SArgyrios Kyrtzidis strlen(InputStr));
779aa70198SArgyrios Kyrtzidis BLAKE3 Hash;
789aa70198SArgyrios Kyrtzidis Hash.update(Input);
799aa70198SArgyrios Kyrtzidis auto hash1 = Hash.final<16>();
809aa70198SArgyrios Kyrtzidis auto hash2 = BLAKE3::hash<16>(Input);
819aa70198SArgyrios Kyrtzidis auto hashStr1 = toHex(hash1);
829aa70198SArgyrios Kyrtzidis auto hashStr2 = toHex(hash2);
839aa70198SArgyrios Kyrtzidis EXPECT_EQ(hashStr1, hashStr2);
849aa70198SArgyrios Kyrtzidis EXPECT_EQ(hashStr1, "6437B3AC38465133FFB63B75273A8DB5");
85330268baSArgyrios Kyrtzidis
86330268baSArgyrios Kyrtzidis // Using generic HashBuilder.
87*b05dbc4dSKazu Hirata HashBuilder<TruncatedBLAKE3<16>, llvm::endianness::native> HashBuilder;
88330268baSArgyrios Kyrtzidis HashBuilder.update(Input);
89330268baSArgyrios Kyrtzidis BLAKE3Result<16> hash3 = HashBuilder.final();
90330268baSArgyrios Kyrtzidis BLAKE3Result<16> hash4 = HashBuilder.result();
91330268baSArgyrios Kyrtzidis EXPECT_EQ(hashStr1, toHex(hash3));
92330268baSArgyrios Kyrtzidis EXPECT_EQ(hashStr1, toHex(hash4));
939aa70198SArgyrios Kyrtzidis }
949aa70198SArgyrios Kyrtzidis
959aa70198SArgyrios Kyrtzidis } // namespace
96