base::MD5IntermediateFinal() generates digest non-destructively.

MD5Final() modifies the context, which prevents calculating an intermediate
digest while also continuing to build an overall context.

BUG=none

Review URL: https://codereview.chromium.org/211273009

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@260731 0039d316-1c4b-4281-b951-d872f2087c98


CrOS-Libchrome-Original-Commit: f087ed5e83981f238eaa356dd9d0d7171a78d9f7
diff --git a/base/md5.cc b/base/md5.cc
index 754994c..e77885e 100644
--- a/base/md5.cc
+++ b/base/md5.cc
@@ -260,6 +260,14 @@
         memset(ctx, 0, sizeof(*ctx));    /* In case it's sensitive */
 }
 
+void MD5IntermediateFinal(MD5Digest* digest, const MD5Context* context) {
+  /* MD5Final mutates the MD5Context*. Make a copy for generating the
+     intermediate value. */
+  MD5Context context_copy;
+  memcpy(&context_copy, context, sizeof(context_copy));
+  MD5Final(digest, &context_copy);
+}
+
 std::string MD5DigestToBase16(const MD5Digest& digest) {
   static char const zEncode[] = "0123456789abcdef";