blob: 2e1fc5bb5ec70e61fed29869220b3f54da85f1e9 [file] [log] [blame]
// Copyright 2014 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Author: jcrowell@google.com (Jeffrey Crowell)
#include "pagespeed/kernel/base/sha1_signature.h"
#include "testing/base/public/gunit.h"
#include "pagespeed/kernel/base/string.h"
namespace net_instaweb {
namespace {
class Sha1SignatureTest : public ::testing::Test {};
TEST_F(Sha1SignatureTest, CorrectSignatureSize) {
// This test verifies that Sha1Signature outputs signatures of the proper
// size.
// SHA1 is 160 bit, which is 27 6-bit chars (there are 2 additional bits for
// padding).
GoogleString key(5000, 'A');
GoogleString data(5000, 'Z');
const int kMaxSignatureSize =
SHA1Signature::ComputeSizeFromNumberOfBytes(SHA1Signature::kSHA1NumBytes);
for (int i = 0; i <= kMaxSignatureSize; ++i) {
SHA1Signature signature(i);
EXPECT_EQ(i, signature.Sign("myKey", "myData").size());
// Large key and data.
EXPECT_EQ(i, signature.Sign(key, data).size());
}
}
TEST_F(Sha1SignatureTest, SignaturesDiffer) {
#if ENABLE_URL_SIGNATURES
SHA1Signature signature;
// Basic sanity tests.
// Different data under different keys.
EXPECT_NE(signature.Sign("key1", "data1"), signature.Sign("key2", "data2"));
// Same data under different keys.
EXPECT_NE(signature.Sign("key1", "data2"), signature.Sign("key2", "data2"));
// Same keys signing different data.
EXPECT_NE(signature.Sign("key1", "data1"), signature.Sign("key1", "data2"));
// Same keys signing the same data.
EXPECT_EQ(signature.Sign("key1", "data1"), signature.Sign("key1", "data1"));
// Compare against known signature.
SHA1Signature signature_length_10(10);
EXPECT_EQ("ijqEvNDQBl", signature_length_10.Sign("hello", "world"));
// Compare against Python's implementation
// python -c 'import base64, hmac;from hashlib import
// sha1;key="key";data="data";hashed=hmac.new(key,data,sha1);print
// base64.urlsafe_b64encode(hashed.digest()).rstrip("\n")[0:25]'
SHA1Signature signature_length_25(25);
EXPECT_EQ("EEFSxb_coHvGM-69RhmfAlXJ9",
signature_length_25.Sign("key", "data"));
EXPECT_EQ("RrTsWGEXFU2s1J1mTl1j_ciO-",
signature_length_25.Sign("foo", "bar"));
#endif
}
} // namespace
} // namespace net_instaweb