1//===- llvm/unittest/Support/MD5Test.cpp - MD5 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 MD5 functions.
10//
11//===----------------------------------------------------------------------===//
12
13#include "llvm/Support/MD5.h"
14#include "llvm/ADT/ArrayRef.h"
15#include "llvm/ADT/SmallString.h"
16#include "gtest/gtest.h"
17
18using namespace llvm;
19
20namespace {
21/// Tests an arbitrary set of bytes passed as \p Input.
22void TestMD5Sum(ArrayRef<uint8_t> Input, StringRef Final) {
23 MD5 Hash;
24 Hash.update(Data: Input);
25 MD5::MD5Result MD5Res;
26 Hash.final(Result&: MD5Res);
27 SmallString<32> Res;
28 MD5::stringifyResult(Result&: MD5Res, Str&: Res);
29 EXPECT_EQ(Res, Final);
30}
31
32void TestMD5Sum(StringRef Input, StringRef Final) {
33 MD5 Hash;
34 Hash.update(Str: Input);
35 MD5::MD5Result MD5Res;
36 Hash.final(Result&: MD5Res);
37 SmallString<32> Res;
38 MD5::stringifyResult(Result&: MD5Res, Str&: Res);
39 EXPECT_EQ(Res, Final);
40}
41
42TEST(MD5Test, MD5) {
43 TestMD5Sum(Input: ArrayRef((const uint8_t *)"", (size_t)0),
44 Final: "d41d8cd98f00b204e9800998ecf8427e");
45 TestMD5Sum(Input: ArrayRef((const uint8_t *)"a", (size_t)1),
46 Final: "0cc175b9c0f1b6a831c399e269772661");
47 TestMD5Sum(
48 Input: ArrayRef((const uint8_t *)"abcdefghijklmnopqrstuvwxyz", (size_t)26),
49 Final: "c3fcd3d76192e4007dfb496cca67e13b");
50 TestMD5Sum(Input: ArrayRef((const uint8_t *)"\0", (size_t)1),
51 Final: "93b885adfe0da089cdf634904fd59f71");
52 TestMD5Sum(Input: ArrayRef((const uint8_t *)"a\0", (size_t)2),
53 Final: "4144e195f46de78a3623da7364d04f11");
54 TestMD5Sum(
55 Input: ArrayRef((const uint8_t *)"abcdefghijklmnopqrstuvwxyz\0", (size_t)27),
56 Final: "81948d1f1554f58cd1a56ebb01f808cb");
57 TestMD5Sum(Input: "abcdefghijklmnopqrstuvwxyz", Final: "c3fcd3d76192e4007dfb496cca67e13b");
58}
59
60TEST(MD5HashTest, MD5) {
61 ArrayRef<uint8_t> Input((const uint8_t *)"abcdefghijklmnopqrstuvwxyz", 26);
62 std::array<uint8_t, 16> Vec = MD5::hash(Data: Input);
63 MD5::MD5Result MD5Res;
64 SmallString<32> Res;
65 memcpy(dest: MD5Res.data(), src: Vec.data(), n: Vec.size());
66 MD5::stringifyResult(Result&: MD5Res, Str&: Res);
67 EXPECT_EQ(Res, "c3fcd3d76192e4007dfb496cca67e13b");
68 EXPECT_EQ(0x3be167ca6c49fb7dULL, MD5Res.high());
69 EXPECT_EQ(0x00e49261d7d3fcc3ULL, MD5Res.low());
70}
71
72TEST(MD5Test, FinalAndResultHelpers) {
73 MD5 Hash;
74
75 Hash.update(Str: "abcd");
76
77 {
78 MD5 ReferenceHash;
79 ReferenceHash.update(Str: "abcd");
80 MD5::MD5Result ReferenceResult;
81 ReferenceHash.final(Result&: ReferenceResult);
82 EXPECT_EQ(Hash.result(), ReferenceResult);
83 }
84
85 Hash.update(Str: "xyz");
86
87 {
88 MD5 ReferenceHash;
89 ReferenceHash.update(Str: "abcd");
90 ReferenceHash.update(Str: "xyz");
91 MD5::MD5Result ReferenceResult;
92 ReferenceHash.final(Result&: ReferenceResult);
93 EXPECT_EQ(Hash.final(), ReferenceResult);
94 }
95}
96} // namespace
97

source code of llvm/unittests/Support/MD5Test.cpp