1/*
2 * Copyright 2016-present Facebook, Inc.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <folly/ssl/OpenSSLHash.h>
18
19#include <folly/io/IOBufQueue.h>
20#include <folly/portability/GTest.h>
21
22using namespace std;
23using namespace folly;
24using namespace folly::ssl;
25
26namespace {
27
28class OpenSSLHashTest : public testing::Test {};
29} // namespace
30
31TEST_F(OpenSSLHashTest, sha256) {
32 IOBuf buf;
33 buf.prependChain(IOBuf::wrapBuffer(ByteRange(StringPiece("foo"))));
34 buf.prependChain(IOBuf::wrapBuffer(ByteRange(StringPiece("bar"))));
35 EXPECT_EQ(3, buf.countChainElements());
36 EXPECT_EQ(6, buf.computeChainDataLength());
37
38 auto expected = vector<uint8_t>(32);
39 auto combined = ByteRange(StringPiece("foobar"));
40 SHA256(combined.data(), combined.size(), expected.data());
41
42 auto out = vector<uint8_t>(32);
43 OpenSSLHash::sha256(range(out), buf);
44 EXPECT_EQ(expected, out);
45}
46
47TEST_F(OpenSSLHashTest, sha256_hashcopy) {
48 std::array<uint8_t, 32> expected, actual;
49
50 OpenSSLHash::Digest digest;
51 digest.hash_init(EVP_sha256());
52 digest.hash_update(ByteRange(StringPiece("foobar")));
53
54 OpenSSLHash::Digest copy(digest);
55
56 digest.hash_final(range(expected));
57 copy.hash_final(range(actual));
58
59 EXPECT_EQ(expected, actual);
60}
61
62TEST_F(OpenSSLHashTest, sha256_hashcopy_intermediate) {
63 std::array<uint8_t, 32> expected, actual;
64
65 OpenSSLHash::Digest digest;
66 digest.hash_init(EVP_sha256());
67 digest.hash_update(ByteRange(StringPiece("foo")));
68
69 OpenSSLHash::Digest copy(digest);
70
71 digest.hash_update(ByteRange(StringPiece("bar")));
72 copy.hash_update(ByteRange(StringPiece("bar")));
73
74 digest.hash_final(range(expected));
75 copy.hash_final(range(actual));
76
77 EXPECT_EQ(expected, actual);
78}
79
80TEST_F(OpenSSLHashTest, hmac_sha256) {
81 auto key = ByteRange(StringPiece("qwerty"));
82
83 IOBuf buf;
84 buf.prependChain(IOBuf::wrapBuffer(ByteRange(StringPiece("foo"))));
85 buf.prependChain(IOBuf::wrapBuffer(ByteRange(StringPiece("bar"))));
86 EXPECT_EQ(3, buf.countChainElements());
87 EXPECT_EQ(6, buf.computeChainDataLength());
88
89 auto expected = vector<uint8_t>(32);
90 auto combined = ByteRange(StringPiece("foobar"));
91 HMAC(
92 EVP_sha256(),
93 key.data(),
94 int(key.size()),
95 combined.data(),
96 combined.size(),
97 expected.data(),
98 nullptr);
99
100 auto out = vector<uint8_t>(32);
101 OpenSSLHash::hmac_sha256(range(out), key, buf);
102 EXPECT_EQ(expected, out);
103}
104