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-exception 6 // 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 18 using namespace llvm; 19 20 namespace { 21 22 /// Tests an arbitrary set of bytes passed as \p Input. 23 void 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 31 using KV = std::pair<const char *, const char *>; 32 33 TEST(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, support::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 73 TEST(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>, support::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 } // namespace 96