blob: c81ff123f023700df3ca23163be25f036dab090c [file] [log] [blame]
[email protected]47f19be2011-04-25 23:54:071// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <string.h>
6#include <string>
7
8#include "base/basictypes.h"
[email protected]47f19be2011-04-25 23:54:079#include "base/memory/scoped_ptr.h"
10#include "base/md5.h"
11#include "testing/gtest/include/gtest/gtest.h"
12
[email protected]bd4d0162011-07-15 02:53:3713namespace base {
14
[email protected]47f19be2011-04-25 23:54:0715TEST(MD5, DigestToBase16) {
16 MD5Digest digest;
17
18 int data[] = {
19 0xd4, 0x1d, 0x8c, 0xd9,
20 0x8f, 0x00, 0xb2, 0x04,
21 0xe9, 0x80, 0x09, 0x98,
22 0xec, 0xf8, 0x42, 0x7e
23 };
24
[email protected]bd4d0162011-07-15 02:53:3725 for (int i = 0; i < 16; ++i)
[email protected]47f19be2011-04-25 23:54:0726 digest.a[i] = data[i] & 0xff;
[email protected]47f19be2011-04-25 23:54:0727
28 std::string actual = MD5DigestToBase16(digest);
29 std::string expected = "d41d8cd98f00b204e9800998ecf8427e";
30
31 EXPECT_EQ(expected, actual);
32}
33
34TEST(MD5, MD5SumEmtpyData) {
35 MD5Digest digest;
36 const char* data = "";
37
38 MD5Sum(data, strlen(data), &digest);
39
40 int expected[] = {
41 0xd4, 0x1d, 0x8c, 0xd9,
42 0x8f, 0x00, 0xb2, 0x04,
43 0xe9, 0x80, 0x09, 0x98,
44 0xec, 0xf8, 0x42, 0x7e
45 };
46
[email protected]bd4d0162011-07-15 02:53:3747 for (int i = 0; i < 16; ++i)
[email protected]47f19be2011-04-25 23:54:0748 EXPECT_EQ(expected[i], digest.a[i] & 0xFF);
[email protected]47f19be2011-04-25 23:54:0749}
50
51TEST(MD5, MD5SumOneByteData) {
52 MD5Digest digest;
53 const char* data = "a";
54
55 MD5Sum(data, strlen(data), &digest);
56
57 int expected[] = {
58 0x0c, 0xc1, 0x75, 0xb9,
59 0xc0, 0xf1, 0xb6, 0xa8,
60 0x31, 0xc3, 0x99, 0xe2,
61 0x69, 0x77, 0x26, 0x61
62 };
63
[email protected]bd4d0162011-07-15 02:53:3764 for (int i = 0; i < 16; ++i)
[email protected]47f19be2011-04-25 23:54:0765 EXPECT_EQ(expected[i], digest.a[i] & 0xFF);
[email protected]47f19be2011-04-25 23:54:0766}
67
68TEST(MD5, MD5SumLongData) {
[email protected]47f19be2011-04-25 23:54:0769 const int length = 10 * 1024 * 1024 + 1;
70 scoped_array<char> data(new char[length]);
71
[email protected]bd4d0162011-07-15 02:53:3772 for (int i = 0; i < length; ++i)
[email protected]47f19be2011-04-25 23:54:0773 data[i] = i & 0xFF;
[email protected]47f19be2011-04-25 23:54:0774
[email protected]bd4d0162011-07-15 02:53:3775 MD5Digest digest;
[email protected]47f19be2011-04-25 23:54:0776 MD5Sum(data.get(), length, &digest);
77
78 int expected[] = {
79 0x90, 0xbd, 0x6a, 0xd9,
80 0x0a, 0xce, 0xf5, 0xad,
81 0xaa, 0x92, 0x20, 0x3e,
82 0x21, 0xc7, 0xa1, 0x3e
83 };
84
[email protected]bd4d0162011-07-15 02:53:3785 for (int i = 0; i < 16; ++i)
[email protected]47f19be2011-04-25 23:54:0786 EXPECT_EQ(expected[i], digest.a[i] & 0xFF);
[email protected]47f19be2011-04-25 23:54:0787}
88
89TEST(MD5, ContextWithEmptyData) {
90 MD5Context ctx;
91 MD5Init(&ctx);
92
93 MD5Digest digest;
94 MD5Final(&digest, &ctx);
95
96 int expected[] = {
97 0xd4, 0x1d, 0x8c, 0xd9,
98 0x8f, 0x00, 0xb2, 0x04,
99 0xe9, 0x80, 0x09, 0x98,
100 0xec, 0xf8, 0x42, 0x7e
101 };
102
[email protected]bd4d0162011-07-15 02:53:37103 for (int i = 0; i < 16; ++i)
[email protected]47f19be2011-04-25 23:54:07104 EXPECT_EQ(expected[i], digest.a[i] & 0xFF);
[email protected]47f19be2011-04-25 23:54:07105}
106
107TEST(MD5, ContextWithLongData) {
108 MD5Context ctx;
109 MD5Init(&ctx);
110
111 const int length = 10 * 1024 * 1024 + 1;
112 scoped_array<char> data(new char[length]);
113
[email protected]bd4d0162011-07-15 02:53:37114 for (int i = 0; i < length; ++i)
[email protected]47f19be2011-04-25 23:54:07115 data[i] = i & 0xFF;
[email protected]47f19be2011-04-25 23:54:07116
117 int total = 0;
118 while (total < length) {
119 int len = 4097; // intentionally not 2^k.
[email protected]bd4d0162011-07-15 02:53:37120 if (len > length - total)
[email protected]47f19be2011-04-25 23:54:07121 len = length - total;
[email protected]47f19be2011-04-25 23:54:07122
123 MD5Update(&ctx, data.get() + total, len);
124 total += len;
125 }
126
127 EXPECT_EQ(length, total);
128
129 MD5Digest digest;
130 MD5Final(&digest, &ctx);
131
132 int expected[] = {
133 0x90, 0xbd, 0x6a, 0xd9,
134 0x0a, 0xce, 0xf5, 0xad,
135 0xaa, 0x92, 0x20, 0x3e,
136 0x21, 0xc7, 0xa1, 0x3e
137 };
138
[email protected]bd4d0162011-07-15 02:53:37139 for (int i = 0; i < 16; ++i)
[email protected]47f19be2011-04-25 23:54:07140 EXPECT_EQ(expected[i], digest.a[i] & 0xFF);
[email protected]47f19be2011-04-25 23:54:07141}
142
143// Example data from http://www.ietf.org/rfc/rfc1321.txt A.5 Test Suite
144TEST(MD5, MD5StringTestSuite1) {
145 std::string actual = MD5String("");
146 std::string expected = "d41d8cd98f00b204e9800998ecf8427e";
147 EXPECT_EQ(expected, actual);
148}
149
150TEST(MD5, MD5StringTestSuite2) {
151 std::string actual = MD5String("a");
152 std::string expected = "0cc175b9c0f1b6a831c399e269772661";
153 EXPECT_EQ(expected, actual);
154}
155
156TEST(MD5, MD5StringTestSuite3) {
157 std::string actual = MD5String("abc");
158 std::string expected = "900150983cd24fb0d6963f7d28e17f72";
159 EXPECT_EQ(expected, actual);
160}
161
162TEST(MD5, MD5StringTestSuite4) {
163 std::string actual = MD5String("message digest");
164 std::string expected = "f96b697d7cb7938d525a2f31aaf161d0";
165 EXPECT_EQ(expected, actual);
166}
167
168TEST(MD5, MD5StringTestSuite5) {
169 std::string actual = MD5String("abcdefghijklmnopqrstuvwxyz");
170 std::string expected = "c3fcd3d76192e4007dfb496cca67e13b";
171 EXPECT_EQ(expected, actual);
172}
173
174TEST(MD5, MD5StringTestSuite6) {
175 std::string actual = MD5String("ABCDEFGHIJKLMNOPQRSTUVWXYZ"
[email protected]bd4d0162011-07-15 02:53:37176 "abcdefghijklmnopqrstuvwxyz"
177 "0123456789");
[email protected]47f19be2011-04-25 23:54:07178 std::string expected = "d174ab98d277d9f5a5611c2c9f419d9f";
179 EXPECT_EQ(expected, actual);
180}
181
182TEST(MD5, MD5StringTestSuite7) {
183 std::string actual = MD5String("12345678901234567890"
[email protected]bd4d0162011-07-15 02:53:37184 "12345678901234567890"
185 "12345678901234567890"
186 "12345678901234567890");
[email protected]47f19be2011-04-25 23:54:07187 std::string expected = "57edf4a22be3c955ac49da2e2107b67a";
188 EXPECT_EQ(expected, actual);
189}
[email protected]bd4d0162011-07-15 02:53:37190
191} // namespace base