summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Readme.txt4
-rw-r--r--TestVectors/sha.txt21
-rw-r--r--cryptlib.h2
-rw-r--r--iterhash.cpp13
-rw-r--r--iterhash.h7
-rw-r--r--regtest.cpp1
-rw-r--r--sha.cpp20
-rw-r--r--sha.h9
-rw-r--r--usage.dat6
9 files changed, 71 insertions, 12 deletions
diff --git a/Readme.txt b/Readme.txt
index edf28041..e7fe597b 100644
--- a/Readme.txt
+++ b/Readme.txt
@@ -325,7 +325,7 @@ the mailing list.
- added support for using encoding parameters and key derivation parameters
with public key encryption (implemented by OAEP and DL/ECIES)
- added Camellia, SHACAL-2, Two-Track-MAC, Whirlpool, RIPEMD-320,
- RIPEMD-128, RIPEMD-256, Base-32 coding
+ RIPEMD-128, RIPEMD-256, Base-32 coding, FIPS variant of CFB mode
- added ThreadUserTimer for timing thread CPU usage
- added option for password-based key derivation functions
to iterate until a mimimum elapsed thread CPU time is reached
@@ -344,4 +344,6 @@ the mailing list.
- fixed inability to instantiate PanamaMAC
- fixed problems with inline documentation
+6.0 - added SHA-224
+
Written by Wei Dai
diff --git a/TestVectors/sha.txt b/TestVectors/sha.txt
index a558b659..7980daa4 100644
--- a/TestVectors/sha.txt
+++ b/TestVectors/sha.txt
@@ -11,6 +11,18 @@ Digest: 34AA973CD4C4DAA4F61EEB2BDBAD27316534016F
Test: Verify
AlgorithmType: MessageDigest
+Name: SHA-224
+Message: "abc"
+Digest: 23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7
+Test: Verify
+Message: "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
+Digest: 75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525
+Test: Verify
+Message: r15625 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+Digest: 20794655980c91d8bbb4c1ea97618a4bf03f42581948b2ee4ee7ad67
+Test: Verify
+
+AlgorithmType: MessageDigest
Name: SHA-256
Message: "abc"
Digest: ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
@@ -18,6 +30,9 @@ Test: Verify
Message: "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
Digest: 248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1
Test: Verify
+Message: r15625 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+Digest: cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0
+Test: Verify
AlgorithmType: MessageDigest
Name: SHA-384
@@ -27,6 +42,9 @@ Test: Verify
Message: "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"
Digest: 09330c33f71147e83d192fc782cd1b4753111b173b3b05d22fa08086e3b0f712fcc7c71a557e2db966c3e9fa91746039
Test: Verify
+Message: r15625 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+Digest: 9d0e1809716474cb086e834e310a4a1ced149e9c00f248527972cec5704c2a5b07b8b3dc38ecc4ebae97ddd87f3d8985
+Test: Verify
AlgorithmType: MessageDigest
Name: SHA-512
@@ -36,3 +54,6 @@ Test: Verify
Message: "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"
Digest: 8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909
Test: Verify
+Message: r15625 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+Digest: e718483d0ce769644e2e42c7bc15b4638e1f98b13b2044285632a803afa973ebde0ff244877ea60a4cb0432ce577c31beb009c5c2c49aa2e4eadb217ad8cc09b
+Test: Verify
diff --git a/cryptlib.h b/cryptlib.h
index 763b5de2..fb6f5448 100644
--- a/cryptlib.h
+++ b/cryptlib.h
@@ -144,7 +144,7 @@ public:
explicit InvalidArgument(const std::string &s) : Exception(INVALID_ARGUMENT, s) {}
};
-//! exception thrown by decryption filters when trying to decrypt an invalid ciphertext
+//! exception thrown when input data is received that doesn't conform to expected format
class CRYPTOPP_DLL InvalidDataFormat : public Exception
{
public:
diff --git a/iterhash.cpp b/iterhash.cpp
index 33dc9249..a863782a 100644
--- a/iterhash.cpp
+++ b/iterhash.cpp
@@ -6,15 +6,22 @@
NAMESPACE_BEGIN(CryptoPP)
+HashInputTooLong::HashInputTooLong(const std::string &alg)
+ : InvalidDataFormat("IteratedHashBase: input data exceeds maximum allowed by hash function " + alg)
+{
+}
+
template <class T, class BASE> void IteratedHashBase<T, BASE>::Update(const byte *input, unsigned int len)
{
- HashWordType tmp = m_countLo;
- if ((m_countLo = tmp + len) < tmp)
+ HashWordType oldCountLo = m_countLo, oldCountHi = m_countHi;
+ if ((m_countLo = oldCountLo + len) < oldCountLo)
m_countHi++; // carry from low to high
m_countHi += SafeRightShift<8*sizeof(HashWordType)>(len);
+ if (m_countHi < oldCountHi)
+ throw HashInputTooLong(AlgorithmName());
unsigned int blockSize = BlockSize();
- unsigned int num = ModPowerOf2(tmp, blockSize);
+ unsigned int num = ModPowerOf2(oldCountLo, blockSize);
if (num != 0) // process left over data
{
diff --git a/iterhash.h b/iterhash.h
index 7e825912..899a89f5 100644
--- a/iterhash.h
+++ b/iterhash.h
@@ -8,6 +8,13 @@
NAMESPACE_BEGIN(CryptoPP)
+//! exception thrown when trying to hash more data than is allowed by a hash function
+class CRYPTOPP_DLL HashInputTooLong : public InvalidDataFormat
+{
+public:
+ explicit HashInputTooLong(const std::string &alg);
+};
+
//! _
template <class T, class BASE>
class CRYPTOPP_NO_VTABLE IteratedHashBase : public BASE
diff --git a/regtest.cpp b/regtest.cpp
index f91bb670..7f140468 100644
--- a/regtest.cpp
+++ b/regtest.cpp
@@ -28,6 +28,7 @@ void RegisterFactories()
RegisterDefaultFactoryFor<SimpleKeyAgreementDomain, DH>();
RegisterDefaultFactoryFor<HashTransformation, SHA1>();
+ RegisterDefaultFactoryFor<HashTransformation, SHA224>();
RegisterDefaultFactoryFor<HashTransformation, SHA256>();
#ifdef WORD64_AVAILABLE
RegisterDefaultFactoryFor<HashTransformation, SHA384>();
diff --git a/sha.cpp b/sha.cpp
index a570fb79..7ce449aa 100644
--- a/sha.cpp
+++ b/sha.cpp
@@ -147,6 +147,11 @@ void SHA256::Transform(word32 *state, const word32 *data)
memset(T, 0, sizeof(T));
}
+#undef S0
+#undef S1
+#undef s0
+#undef s1
+
const word32 SHA256::K[64] = {
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
@@ -166,10 +171,17 @@ const word32 SHA256::K[64] = {
0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
};
-#undef S0
-#undef S1
-#undef s0
-#undef s1
+void SHA224::InitState(HashWordType *state)
+{
+ state[0] = 0xc1059ed8;
+ state[1] = 0x367cd507;
+ state[2] = 0x3070dd17;
+ state[3] = 0xf70e5939;
+ state[4] = 0xffc00b31;
+ state[5] = 0x68581511;
+ state[6] = 0x64f98fa7;
+ state[7] = 0xbefa4fa4;
+}
// *************************************************************
diff --git a/sha.h b/sha.h
index efe5350e..e0ac2eac 100644
--- a/sha.h
+++ b/sha.h
@@ -28,6 +28,15 @@ protected:
static const word32 K[64];
};
+//! implements the SHA-224 standard
+class SHA224 : public IteratedHashWithStaticTransform<word32, BigEndian, 64, 32, SHA224, 28>
+{
+public:
+ static void InitState(HashWordType *state);
+ static void Transform(word32 *digest, const word32 *data) {SHA256::Transform(digest, data);}
+ static const char *StaticAlgorithmName() {return "SHA-224";}
+};
+
#ifdef WORD64_AVAILABLE
//! implements the SHA-512 standard
diff --git a/usage.dat b/usage.dat
index 686ecc4f..8ea82e3f 100644
--- a/usage.dat
+++ b/usage.dat
@@ -68,11 +68,11 @@ Test Driver for Crypto++(R) Library, a C++ Class Library of Cryptographic Scheme
- To run Maurer's randomness test on a file
cryptest mt input
+- To run a test script (available in TestVectors subdirectory)
+ cryptest tv filename
+
- To run validation tests
cryptest v
- To run benchmarks
cryptest b [time for each benchmark in seconds]
-
-- To run test vector file (available in TestVectors subdirectory)
- cryptest tv filename