Selaa lähdekoodia

Add string(MD5) and string(SHA*) commands to compute hashes

Provide a CMake-language binding to these cryptographic hashes.  Add a
string() command API for MD5, SHA1, SHA224, SHA256, SHA384, and SHA512.
Brad King 14 vuotta sitten
vanhempi
sitoutus
2e9c26cf96

+ 32 - 0
Source/cmStringCommand.cxx

@@ -10,6 +10,8 @@
   See the License for more information.
   See the License for more information.
 ============================================================================*/
 ============================================================================*/
 #include "cmStringCommand.h"
 #include "cmStringCommand.h"
+#include "cmCryptoHash.h"
+
 #include <cmsys/RegularExpression.hxx>
 #include <cmsys/RegularExpression.hxx>
 #include <cmsys/SystemTools.hxx>
 #include <cmsys/SystemTools.hxx>
 
 
@@ -36,6 +38,15 @@ bool cmStringCommand
     {
     {
     return this->HandleReplaceCommand(args);
     return this->HandleReplaceCommand(args);
     }
     }
+  else if ( subCommand == "MD5" ||
+            subCommand == "SHA1" ||
+            subCommand == "SHA224" ||
+            subCommand == "SHA256" ||
+            subCommand == "SHA384" ||
+            subCommand == "SHA512" )
+    {
+    return this->HandleHashCommand(args);
+    }
   else if(subCommand == "TOLOWER")
   else if(subCommand == "TOLOWER")
     {
     {
     return this->HandleToUpperLowerCommand(args, false);
     return this->HandleToUpperLowerCommand(args, false);
@@ -82,6 +93,27 @@ bool cmStringCommand
   return false;
   return false;
 }
 }
 
 
+//----------------------------------------------------------------------------
+bool cmStringCommand::HandleHashCommand(std::vector<std::string> const& args)
+{
+  if(args.size() != 3)
+    {
+    cmOStringStream e;
+    e << args[0] << " requires an output variable and an input string";
+    this->SetError(e.str().c_str());
+    return false;
+    }
+
+  cmsys::auto_ptr<cmCryptoHash> hash(cmCryptoHash::New(args[0].c_str()));
+  if(hash.get())
+    {
+    std::string out = hash->HashString(args[2].c_str());
+    this->Makefile->AddDefinition(args[1].c_str(), out.c_str());
+    return true;
+    }
+  return false;
+}
+
 //----------------------------------------------------------------------------
 //----------------------------------------------------------------------------
 bool cmStringCommand::HandleToUpperLowerCommand(
 bool cmStringCommand::HandleToUpperLowerCommand(
   std::vector<std::string> const& args, bool toUpper)
   std::vector<std::string> const& args, bool toUpper)

+ 5 - 0
Source/cmStringCommand.h

@@ -76,6 +76,8 @@ public:
       "  string(REPLACE <match_string>\n"
       "  string(REPLACE <match_string>\n"
       "         <replace_string> <output variable>\n"
       "         <replace_string> <output variable>\n"
       "         <input> [<input>...])\n"
       "         <input> [<input>...])\n"
+      "  string(<MD5|SHA1|SHA224|SHA256|SHA384|SHA512>\n"
+      "         <output variable> <input>)\n"
       "  string(COMPARE EQUAL <string1> <string2> <output variable>)\n"
       "  string(COMPARE EQUAL <string1> <string2> <output variable>)\n"
       "  string(COMPARE NOTEQUAL <string1> <string2> <output variable>)\n"
       "  string(COMPARE NOTEQUAL <string1> <string2> <output variable>)\n"
       "  string(COMPARE LESS <string1> <string2> <output variable>)\n"
       "  string(COMPARE LESS <string1> <string2> <output variable>)\n"
@@ -103,6 +105,8 @@ public:
       "backslash through argument parsing.\n"
       "backslash through argument parsing.\n"
       "REPLACE will replace all occurrences of match_string in the input with "
       "REPLACE will replace all occurrences of match_string in the input with "
       "replace_string and store the result in the output.\n"
       "replace_string and store the result in the output.\n"
+      "MD5, SHA1, SHA224, SHA256, SHA384, and SHA512 "
+      "will compute a cryptographic hash of the input string.\n"
       "COMPARE EQUAL/NOTEQUAL/LESS/GREATER will compare the strings and "
       "COMPARE EQUAL/NOTEQUAL/LESS/GREATER will compare the strings and "
       "store true or false in the output variable.\n"
       "store true or false in the output variable.\n"
       "ASCII will convert all numbers into corresponding ASCII characters.\n"
       "ASCII will convert all numbers into corresponding ASCII characters.\n"
@@ -150,6 +154,7 @@ protected:
   bool RegexMatch(std::vector<std::string> const& args);
   bool RegexMatch(std::vector<std::string> const& args);
   bool RegexMatchAll(std::vector<std::string> const& args);
   bool RegexMatchAll(std::vector<std::string> const& args);
   bool RegexReplace(std::vector<std::string> const& args);
   bool RegexReplace(std::vector<std::string> const& args);
+  bool HandleHashCommand(std::vector<std::string> const& args);
   bool HandleToUpperLowerCommand(std::vector<std::string> const& args,
   bool HandleToUpperLowerCommand(std::vector<std::string> const& args,
                                  bool toUpper);
                                  bool toUpper);
   bool HandleCompareCommand(std::vector<std::string> const& args);
   bool HandleCompareCommand(std::vector<std::string> const& args);

+ 1 - 0
Tests/CMakeTests/String-MD5-BadArg1.cmake

@@ -0,0 +1 @@
+string(MD5)

+ 1 - 0
Tests/CMakeTests/String-MD5-BadArg2.cmake

@@ -0,0 +1 @@
+string(MD5 md5)

+ 1 - 0
Tests/CMakeTests/String-MD5-BadArg4.cmake

@@ -0,0 +1 @@
+string(MD5 md5 input extra_arg)

+ 2 - 0
Tests/CMakeTests/String-MD5-Works.cmake

@@ -0,0 +1,2 @@
+string(MD5 md5 "sample input string\n")
+message("${md5}")

+ 2 - 0
Tests/CMakeTests/String-SHA1-Works.cmake

@@ -0,0 +1,2 @@
+string(SHA1 sha1 "sample input string\n")
+message("${sha1}")

+ 2 - 0
Tests/CMakeTests/String-SHA224-Works.cmake

@@ -0,0 +1,2 @@
+string(SHA224 sha224 "sample input string\n")
+message("${sha224}")

+ 2 - 0
Tests/CMakeTests/String-SHA256-Works.cmake

@@ -0,0 +1,2 @@
+string(SHA256 sha256 "sample input string\n")
+message("${sha256}")

+ 2 - 0
Tests/CMakeTests/String-SHA384-Works.cmake

@@ -0,0 +1,2 @@
+string(SHA384 sha384 "sample input string\n")
+message("${sha384}")

+ 2 - 0
Tests/CMakeTests/String-SHA512-Works.cmake

@@ -0,0 +1,2 @@
+string(SHA512 sha512 "sample input string\n")
+message("${sha512}")

+ 32 - 0
Tests/CMakeTests/StringTest.cmake.in

@@ -1,3 +1,35 @@
+set(MD5-BadArg1-RESULT 1)
+set(MD5-BadArg1-STDERR "string MD5 requires an output variable")
+set(MD5-BadArg2-RESULT 1)
+set(MD5-BadArg2-STDERR "string MD5 requires an output variable and an input string")
+set(MD5-BadArg4-RESULT 1)
+set(MD5-BadArg4-STDERR "string MD5 requires an output variable and an input string")
+set(MD5-Works-RESULT 0)
+set(MD5-Works-STDERR "10d20ddb981a6202b84aa1ce1cb7fce3")
+set(SHA1-Works-RESULT 0)
+set(SHA1-Works-STDERR "83f093e04289b21a9415f408ad50be8b57ad2f34")
+set(SHA224-Works-RESULT 0)
+set(SHA224-Works-STDERR "e995a7789922c4ef9279d94e763c8375934180a51baa7147bc48edf7")
+set(SHA256-Works-RESULT 0)
+set(SHA256-Works-STDERR "d1c5915d8b71150726a1eef75a29ec6bea8fd1bef6b7299ef8048760b0402025")
+set(SHA384-Works-RESULT 0)
+set(SHA384-Works-STDERR "1de9560b4e030e02051ea408200ffc55d70c97ac64ebf822461a5c786f495c36df43259b14483bc8d364f0106f4971ee")
+set(SHA512-Works-RESULT 0)
+set(SHA512-Works-STDERR "3982a1b4e651768bec70ab1fb97045cb7a659f4ba7203d501c52ab2e803071f9d5fd272022df15f27727fc67f8cd022e710e29010b2a9c0b467c111e2f6abf51")
+
+include("@CMAKE_CURRENT_SOURCE_DIR@/CheckCMakeTest.cmake")
+check_cmake_test(String
+  MD5-BadArg1
+  MD5-BadArg2
+  MD5-BadArg4
+  MD5-Works
+  SHA1-Works
+  SHA224-Works
+  SHA256-Works
+  SHA384-Works
+  SHA512-Works
+  )
+
 # Execute each test listed in StringTestScript.cmake:
 # Execute each test listed in StringTestScript.cmake:
 #
 #
 set(scriptname "@CMAKE_CURRENT_SOURCE_DIR@/StringTestScript.cmake")
 set(scriptname "@CMAKE_CURRENT_SOURCE_DIR@/StringTestScript.cmake")