96 lines · cpp
1//===- llvm/unittest/Support/BLAKE3Test.cpp - BLAKE3 tests ----------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file implements unit tests for the BLAKE3 functions.10//11//===----------------------------------------------------------------------===//12 13#include "llvm/Support/BLAKE3.h"14#include "llvm/ADT/StringExtras.h"15#include "llvm/Support/HashBuilder.h"16#include "gtest/gtest.h"17 18using namespace llvm;19 20namespace {21 22/// Tests an arbitrary set of bytes passed as \p Input.23void TestBLAKE3Sum(ArrayRef<uint8_t> Input, StringRef Final) {24 BLAKE3 Hash;25 Hash.update(Input);26 auto hash = Hash.final();27 auto hashStr = toHex(hash);28 EXPECT_EQ(hashStr, Final);29}30 31using KV = std::pair<const char *, const char *>;32 33TEST(BLAKE3Test, BLAKE3) {34 std::array<KV, 5> testvectors{35 KV{"",36 "AF1349B9F5F9A1A6A0404DEA36DCC9499BCB25C9ADC112B7CC9A93CAE41F3262"},37 KV{"a",38 "17762FDDD969A453925D65717AC3EEA21320B66B54342FDE15128D6CAF21215F"},39 KV{"abc",40 "6437B3AC38465133FFB63B75273A8DB548C558465D79DB03FD359C6CD5BD9D85"},41 KV{"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",42 "C19012CC2AAF0DC3D8E5C45A1B79114D2DF42ABB2A410BF54BE09E891AF06FF8"},43 KV{"abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklm"44 "nopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",45 "553E1AA2A477CB3166E6AB38C12D59F6C5017F0885AAF079F217DA00CFCA363F"}};46 47 for (auto input_expected : testvectors) {48 auto str = std::get<0>(input_expected);49 auto expected = std::get<1>(input_expected);50 TestBLAKE3Sum({reinterpret_cast<const uint8_t *>(str), strlen(str)},51 expected);52 }53 54 std::string rep(1000, 'a');55 BLAKE3 Hash;56 for (int i = 0; i < 1000; ++i) {57 Hash.update({reinterpret_cast<const uint8_t *>(rep.data()), rep.size()});58 }59 auto hash = Hash.final();60 auto hashStr = toHex(hash);61 EXPECT_EQ(hashStr,62 "616F575A1B58D4C9797D4217B9730AE5E6EB319D76EDEF6549B46F4EFE31FF8B");63 64 // Using generic HashBuilder.65 HashBuilder<BLAKE3, llvm::endianness::native> HashBuilder;66 HashBuilder.update(std::get<0>(testvectors[2]));67 BLAKE3Result<> HBHash1 = HashBuilder.final();68 BLAKE3Result<> HBHash2 = HashBuilder.result();69 EXPECT_EQ(std::get<1>(testvectors[2]), toHex(HBHash1));70 EXPECT_EQ(std::get<1>(testvectors[2]), toHex(HBHash2));71}72 73TEST(BLAKE3Test, SmallerHashSize) {74 const char *InputStr = "abc";75 ArrayRef<uint8_t> Input(reinterpret_cast<const uint8_t *>(InputStr),76 strlen(InputStr));77 BLAKE3 Hash;78 Hash.update(Input);79 auto hash1 = Hash.final<16>();80 auto hash2 = BLAKE3::hash<16>(Input);81 auto hashStr1 = toHex(hash1);82 auto hashStr2 = toHex(hash2);83 EXPECT_EQ(hashStr1, hashStr2);84 EXPECT_EQ(hashStr1, "6437B3AC38465133FFB63B75273A8DB5");85 86 // Using generic HashBuilder.87 HashBuilder<TruncatedBLAKE3<16>, llvm::endianness::native> HashBuilder;88 HashBuilder.update(Input);89 BLAKE3Result<16> hash3 = HashBuilder.final();90 BLAKE3Result<16> hash4 = HashBuilder.result();91 EXPECT_EQ(hashStr1, toHex(hash3));92 EXPECT_EQ(hashStr1, toHex(hash4));93}94 95} // namespace96