changeset 20913:69489c064cb7

New function hash to calculate MD{2/4/5} and SHA{1,244,256,384,512} hash values. * bootstrap.conf: include needed GNULIB functions. * libinterp/dldfcn/hash.cc: new hash value calculating function. * libinterp/dldfcn/module-files: add hash.cc to build system. * scripts/deprecated/md5sum.m: new function perserving interface as md5sum.cc. * scripts/deprecated/module.mk: add md5sum.m to build system. * libinterp/corefcn/md5sum.cc: removed and replaced by m-file. * libinterp/corefcn/module.mk: removed md5sum.cc from build system. * liboctave/util/oct-md5.h: removed unneeded interface header. * liboctave/util/oct-md5.cc: removed unneeded interface code. * liboctave/util/module.mk: removed oct-md5.h and oct-md5.cc from build system. * NEWS: add hash to new functions for 4.2. * doc/interpreter/system.txi: replace md5sum with hash in the manual. * scripts/miscellaneous/warning_ids.m: removed orphaned entry.
author Kai T. Ohlhus <k.ohlhus@gmail.com>
date Wed, 16 Dec 2015 21:57:32 +0100
parents ece3bb10c712
children 3ecd9e6650b5
files NEWS bootstrap.conf doc/interpreter/system.txi libinterp/corefcn/md5sum.cc libinterp/corefcn/module.mk libinterp/dldfcn/hash.cc libinterp/dldfcn/module-files liboctave/util/module.mk liboctave/util/oct-md5.cc liboctave/util/oct-md5.h scripts/deprecated/md5sum.m scripts/deprecated/module.mk scripts/miscellaneous/warning_ids.m
diffstat 13 files changed, 392 insertions(+), 223 deletions(-) [+]
line wrap: on
line diff
--- a/NEWS	Wed Dec 16 12:20:53 2015 -0800
+++ b/NEWS	Wed Dec 16 21:57:32 2015 +0100
@@ -61,6 +61,7 @@
  ** Other new functions added in 4.2:
 
       deg2rad
+      hash
       im2double
       psi
       odeset
@@ -78,6 +79,7 @@
       ---------------------|------------------
       bitmax               | flintmax
       mahalanobis          | mahal in Octave-Forge statistics pkg
+      md5sum               | hash
       wavread              | audioread
       wavwrite             | audiowrite
 
--- a/bootstrap.conf	Wed Dec 16 12:20:53 2015 -0800
+++ b/bootstrap.conf	Wed Dec 16 21:57:32 2015 +0100
@@ -26,7 +26,12 @@
   closedir
   copysign
   copysignf
+  crypto/md2
+  crypto/md4
   crypto/md5
+  crypto/sha1
+  crypto/sha256
+  crypto/sha512
   dup2
   fclose
   fcntl
--- a/doc/interpreter/system.txi	Wed Dec 16 12:20:53 2015 -0800
+++ b/doc/interpreter/system.txi	Wed Dec 16 21:57:32 2015 +0100
@@ -541,30 +541,20 @@
 @node Hashing Functions
 @section Hashing Functions
 
-It is often necessary to find if two strings or files are
-identical.  This might be done by comparing them character by character
-and looking for differences.  However, this can be slow, and so comparing
-a hash of the string or file can be a rapid way of finding if the files
-differ.
+It is often necessary to find if two strings or files are identical.
+This might be done by comparing them character by character and looking
+for differences.  However, this can be slow, and so comparing a hash of
+the string or file can be a rapid way of finding if the files differ.
 
 Another use of the hashing function is to check for file integrity.  The
 user can check the hash of the file against a known value and find if
 the file they have is the same as the one that the original hash was
 produced with.
 
-Octave supplies the @code{md5sum} function to perform MD5 hashes on
-strings and files.  An example of the use of @code{md5sum} function might
-be
+Octave supplies the @code{hash} function to calculate hash values of
+strings and files, the latter in combination with the @code{fileread}
+function.  The @code{hash} function supports the most common used
+cryptographic hash functions, namely MD5 and SHA-1.
 
-@example
-@group
-if exist (file, "file")
-  hash = md5sum (file);
-else
-  # Treat the variable "file" as a string
-  hash = md5sum (file, true);
-endif
-@end group
-@end example
+@DOCSTRING(hash)
 
-@DOCSTRING(md5sum)
--- a/libinterp/corefcn/md5sum.cc	Wed Dec 16 12:20:53 2015 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,88 +0,0 @@
-/*
-
-Copyright (C) 2007-2015 David Bateman
-
-
-This file is part of Octave.
-
-Octave is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 3 of the License, or (at your
-option) any later version.
-
-Octave is distributed in the hope that it will be useful, but WITHOUT
-ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with Octave; see the file COPYING.  If not, see
-<http://www.gnu.org/licenses/>.
-
-*/
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <string>
-#include <vector>
-
-#include "defun.h"
-#include "file-stat.h"
-#include "file-ops.h"
-#include "load-path.h"
-#include "oct-env.h"
-#include "oct-md5.h"
-#include "utils.h"
-
-DEFUN (md5sum, args, ,
-       "-*- texinfo -*-\n\
-@deftypefn  {} {} md5sum (@var{file})\n\
-@deftypefnx {} {} md5sum (@var{str}, @var{opt})\n\
-Calculate the MD5 sum of the file @var{file}.\n\
-\n\
-If the second parameter @var{opt} exists and is true, then calculate the MD5\n\
-sum of the string @var{str}.\n\
-@end deftypefn")
-{
-  octave_value retval;
-  int nargin = args.length ();
-
-  if (nargin != 1 && nargin != 2)
-    print_usage ();
-
-  bool have_str = false;
-  std::string str = args(0).string_value ();
-
-  if (nargin == 2)
-    have_str = args(1).bool_value ();
-
-  if (have_str)
-    retval = oct_md5 (str);
-  else
-    {
-      std::string fname = file_ops::tilde_expand (str);
-
-      fname = find_data_file_in_load_path ("md5sum", fname);
-
-      retval = oct_md5_file (fname);
-    }
-
-  return retval;
-}
-
-/*
-%!assert (md5sum ("abc\0", true), "147a664a2ca9410911e61986d3f0d52a");
-
-%!test
-%! tfile = tempname ();
-%! fid = fopen (tfile, "wb");
-%! fwrite (fid, "abc\0");
-%! fclose (fid);
-%! assert (md5sum (tfile), "147a664a2ca9410911e61986d3f0d52a");
-%! unlink (tfile);
-
-%!error md5sum ();
-*/
-
--- a/libinterp/corefcn/module.mk	Wed Dec 16 12:20:53 2015 -0800
+++ b/libinterp/corefcn/module.mk	Wed Dec 16 21:57:32 2015 +0100
@@ -191,7 +191,6 @@
   libinterp/corefcn/mappers.cc \
   libinterp/corefcn/matrix_type.cc \
   libinterp/corefcn/max.cc \
-  libinterp/corefcn/md5sum.cc \
   libinterp/corefcn/mex.cc \
   libinterp/corefcn/mgorth.cc \
   libinterp/corefcn/nproc.cc \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libinterp/dldfcn/hash.cc	Wed Dec 16 21:57:32 2015 +0100
@@ -0,0 +1,300 @@
+/*
+
+Copyright (C) 2007-2015 David Bateman
+Copyright (C) 2015 Kai T. Ohlhus
+
+This file is part of Octave.
+
+Octave is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 3 of the License, or (at your
+option) any later version.
+
+Octave is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with Octave; see the file COPYING.  If not, see
+<http://www.gnu.org/licenses/>.
+
+*/
+
+/*
+Implementation note (Dec, 2015): All supported cryptographic hash
+functions are calling "low-level" inplementations of the GNULIB.
+
+The GNULIB, contains even more HMAC based algorithms, c.f.
+https://www.gnu.org/software/gnulib/MODULES.html#module=crypto/hmac-md5
+so a future project might be including these algorithms as well, adding
+a third key input parameter.  There is also a GNULIB "high-level"
+interface to Libcrypt. It might be easier to use, but it introduces
+a new build dependency, so better stick to the "low-level" functions
+for now.
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <algorithm>
+#include <iomanip>
+#include <sstream>
+
+#include "defun-dld.h"
+#include "md2.h"
+#include "md4.h"
+#include "md5.h"
+#include "sha1.h"
+#include "sha256.h"
+#include "sha512.h"
+
+DEFUN_DLD (hash, args, ,
+           "-*- texinfo -*-\n\
+@deftypefn {} {} hash (@var{hfun},@var{str})\n\
+Calculate the hash value of the string @var{str} using the hash function\n\
+@var{hfun}.\n\
+\n\
+The available hash functions are given in the table below.\n\
+\n\
+@table @samp\n\
+@item MD2\n\
+Message-Digest Algorithm 2 (RFC 1319).\n\
+\n\
+@item MD4\n\
+Message-Digest Algorithm 4 (RFC 1320).\n\
+\n\
+@item MD5\n\
+Message-Digest Algorithm 5 (RFC 1321).\n\
+\n\
+@item SHA1\n\
+Secure Hash Algorithm 1 (RFC 3174)\n\
+\n\
+@item SHA224\n\
+Secure Hash Algorithm 2 (224 Bits, RFC 3874)\n\
+\n\
+@item SHA256\n\
+Secure Hash Algorithm 2 (256 Bits, RFC 6234)\n\
+\n\
+@item SHA384\n\
+Secure Hash Algorithm 2 (384 Bits, RFC 6234)\n\
+\n\
+@item SHA512\n\
+Secure Hash Algorithm 2 (512 Bits, RFC 6234)\n\
+@end table\n\
+\n\
+To calculate for example the MD5 hash value of the string @code{\"abc\"}\n\
+the @code{hash} function is called as follows:\n\
+\n\
+@example\n\
+@group\n\
+hash (\"md5\", \"abc\")\n\
+     @print{} ans = 900150983cd24fb0d6963f7d28e17f72\n\
+@end group\n\
+@end example\n\
+\n\
+For the same string, the SHA-1 hash value is calculated with:\n\
+\n\
+@example\n\
+@group\n\
+hash (\"sha1\", \"abc\")\n\
+     @print{} ans = a9993e364706816aba3e25717850c26c9cd0d89d\n\
+@end group\n\
+@end example\n\
+\n\
+And to compute the hash value of a file, e.g. @code{file = \"file.txt\"},\n\
+call @code{hash} in combination with the @code{fileread}:\n\
+\n\
+@example\n\
+@group\n\
+hash (\"md5\", fileread (file));\n\
+@end group\n\
+@end example\n\
+\n\
+@end deftypefn")
+{
+  if (args.length () != 2)
+    print_usage ();
+
+  std::string hfun = args(0).string_value ();
+  std::string str = args(1).string_value ();
+
+  // Determine hash function used
+  std::transform(hfun.begin(), hfun.end(), hfun.begin(), ::toupper);
+
+  // Buffer with maximum size for all hash function
+  char result_buffer[SHA512_DIGEST_SIZE];
+
+  int result_buffer_len = 0;
+  if (hfun == "MD2")
+    {
+      md2_buffer (str.data (), str.length (), result_buffer);
+      result_buffer_len = MD2_DIGEST_SIZE;
+    }
+  else if (hfun == "MD4")
+    {
+      md4_buffer (str.data (), str.length (), result_buffer);
+      result_buffer_len = MD4_DIGEST_SIZE;
+    }
+  else if (hfun == "MD5")
+    {
+      md5_buffer (str.data (), str.length (), result_buffer);
+      result_buffer_len = MD5_DIGEST_SIZE;
+    }
+  else if (hfun == "SHA1")
+    {
+      sha1_buffer (str.data (), str.length (), result_buffer);
+      result_buffer_len = SHA1_DIGEST_SIZE;
+    }
+  else if (hfun == "SHA224")
+    {
+      sha224_buffer (str.data (), str.length (), result_buffer);
+      result_buffer_len = SHA224_DIGEST_SIZE;
+    }
+  else if (hfun == "SHA256")
+    {
+      sha256_buffer (str.data (), str.length (), result_buffer);
+      result_buffer_len = SHA256_DIGEST_SIZE;
+    }
+  else if (hfun == "SHA384")
+    {
+      sha384_buffer (str.data (), str.length (), result_buffer);
+      result_buffer_len = SHA384_DIGEST_SIZE;
+    }
+  else if (hfun == "SHA512")
+    {
+      sha512_buffer (str.data (), str.length (), result_buffer);
+      result_buffer_len = SHA512_DIGEST_SIZE;
+    }
+  else
+    error ("hash function not supported");
+
+  // Everything went fine, return formatted hash string
+  std::ostringstream os;
+  for (int i = 0; i < result_buffer_len; i++)
+    {
+      // Assure hex representation of one byte is written
+      os << std::hex << std::setw (2) << std::setfill ('0')
+         << (static_cast<int> (result_buffer[i]) & 0xFF);
+    }
+
+  return ovl (os.str ());
+}
+
+/*
+## MD2 test suite (RFC 1319)
+%!assert (hash ("md2", ""), "8350e5a3e24c153df2275c9f80692773");
+%!assert (hash ("md2", "a"), "32ec01ec4a6dac72c0ab96fb34c0b5d1");
+%!assert (hash ("md2", "abc"), "da853b0d3f88d99b30283a69e6ded6bb");
+%!assert (hash ("md2", "message digest"), "ab4f496bfb2a530b219ff33031fe06b0");
+%!assert (hash ("md2", "abcdefghijklmnopqrstuvwxyz"),
+%!        "4e8ddff3650292ab5a4108c3aa47940b");
+%!assert (hash ("md2", ["ABCDEFGHIJKLMNOPQRSTUVWXYZ", ...
+%!              "abcdefghijklmnopqrstuvwxyz0123456789"]),
+%!        "da33def2a42df13975352846c30338cd");
+%!assert (hash ("md2", ["123456789012345678901234567890123456789", ...
+%!              "01234567890123456789012345678901234567890"]),
+%!        "d5976f79d83d3a0dc9806c3c66f3efd8");
+
+## MD4 test suite (RFC 1320)
+%!assert (hash ("md4", ""), "31d6cfe0d16ae931b73c59d7e0c089c0");
+%!assert (hash ("md4", "a"), "bde52cb31de33e46245e05fbdbd6fb24");
+%!assert (hash ("md4", "abc"), "a448017aaf21d8525fc10ae87aa6729d");
+%!assert (hash ("md4", "message digest"), "d9130a8164549fe818874806e1c7014b");
+%!assert (hash ("md4", "abcdefghijklmnopqrstuvwxyz"),
+%!        "d79e1c308aa5bbcdeea8ed63df412da9");
+%!assert (hash ("md4", ["ABCDEFGHIJKLMNOPQRSTUVWXYZ", ...
+%!              "abcdefghijklmnopqrstuvwxyz0123456789"]),
+%!        "043f8582f241db351ce627e153e7f0e4");
+%!assert (hash ("md4", ["123456789012345678901234567890123456789", ...
+%!              "01234567890123456789012345678901234567890"]),
+%!        "e33b4ddc9c38f2199c3e7b164fcc0536");
+
+## MD5 test suite (RFC 1321)
+%!assert (hash ("md5", ""), "d41d8cd98f00b204e9800998ecf8427e");
+%!assert (hash ("md5", "a"), "0cc175b9c0f1b6a831c399e269772661");
+%!assert (hash ("md5", "abc"), "900150983cd24fb0d6963f7d28e17f72");
+%!assert (hash ("md5", "message digest"), "f96b697d7cb7938d525a2f31aaf161d0");
+%!assert (hash ("md5", "abcdefghijklmnopqrstuvwxyz"),
+%!        "c3fcd3d76192e4007dfb496cca67e13b");
+%!assert (hash ("md5", ["ABCDEFGHIJKLMNOPQRSTUVWXYZ", ...
+%!              "abcdefghijklmnopqrstuvwxyz0123456789"]),
+%!        "d174ab98d277d9f5a5611c2c9f419d9f");
+%!assert (hash ("md5", ["123456789012345678901234567890123456789", ...
+%!              "01234567890123456789012345678901234567890"]),
+%!        "57edf4a22be3c955ac49da2e2107b67a");
+
+## SHA1 test suite (RFC 3174) and more
+%!assert (hash ("sha1", ""), "da39a3ee5e6b4b0d3255bfef95601890afd80709");
+%!assert (hash ("sha1", "a"), "86f7e437faa5a7fce15d1ddcb9eaeaea377667b8");
+%!assert (hash ("sha1", "abc"), "a9993e364706816aba3e25717850c26c9cd0d89d");
+%!assert (hash ("sha1", ["abcdbcdecdefdefgefghfghighijhi", ...
+%!              "jkijkljklmklmnlmnomnopnopq"]),
+%!        "84983e441c3bd26ebaae4aa1f95129e5e54670f1");
+%!assert (hash ("sha1", ["01234567012345670123456701234567", ...
+%!              "01234567012345670123456701234567"]),
+%!        "e0c094e867ef46c350ef54a7f59dd60bed92ae83");
+%!assert (hash ("sha1", "The quick brown fox jumps over the lazy dog"),
+%!        "2fd4e1c67a2d28fced849ee1bb76e7391b93eb12");
+
+## SHA224 test suite (RFC 3874) and more
+%!assert (hash ("sha224", ""),
+%!        "d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f");
+%!assert (hash ("sha224", "a"),
+%!        "abd37534c7d9a2efb9465de931cd7055ffdb8879563ae98078d6d6d5");
+%!assert (hash ("sha224", "abc"),
+%!        "23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7");
+%!assert (hash ("sha224", ["abcdbcdecdefdefgefghfghighijh", ...
+%!              "ijkijkljklmklmnlmnomnopnopq"]),
+%!        "75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525");
+
+## SHA256/384/512 tests (RFC 6234) and more
+%!assert (hash ("sha256", ""),
+%!        "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
+%!assert (hash ("sha384", ""),
+%!        ["38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc", ...
+%!         "7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b"]);
+%!assert (hash ("sha512", ""),
+%!        ["cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a", ...
+%!         "921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47", ...
+%!         "417a81a538327af927da3e"]);
+
+## Test special character behavior (bug #31689)
+%!assert (hash ("md2", "abc\0"), "5a636d615002a7874ac1c9e9a43361f7");
+%!assert (hash ("md4", "abc\0"), "0ee5201897ecb206c4eaba1d2da5224d");
+%!assert (hash ("md5", "abc\0"), "147a664a2ca9410911e61986d3f0d52a");
+%!assert (hash ("sha1", "abc\0"), "686483805ac47ca14e03514f7481a7973b401762");
+%!assert (hash ("sha224", "abc\0"),
+%!        "fbc8e47920e108bb1d0b631d18b36ae9b1549d28362aa15ebe960cfb");
+%!assert (hash ("sha256", "abc\0"),
+%!        "dc1114cd074914bd872cc1f9a23ec910ea2203bc79779ab2e17da25782a624fc");
+%!assert (hash ("sha384", "abc\0"),
+%!        ["eba81f2dfba4ec60d3f786c89d91b08e6c0b63d55986874378e385", ...
+%!         "e6fac587cce7a520ca9437290fe626cbf75c855e17"]);
+%!assert (hash ("sha512", "abc\0"),
+%!        ["7ce05eda233e545a2d5c626862a5ddaafb09b9d8ec3bec08aa458b", ...
+%!         "7c9e7d939d84a57d5a20d8a9002983aabae2457b19c50ba326bf5b", ...
+%!         "081f75b41342f42c3383"]);
+
+## Test equivalence to deprecated md5sum offering file hashing
+%!test
+%! tfile = tempname ();
+%! fid = fopen (tfile, "wb");
+%! fwrite (fid, "abc\0");
+%! fclose (fid);
+%! assert (hash ("md5", fileread (tfile)), "147a664a2ca9410911e61986d3f0d52a");
+%! unlink (tfile);
+
+## Test bad function calls
+%!error hash ();
+%!error hash ("");
+%!error hash ("", "");
+%!error hash ("", "", "");
+%!error hash (1, "");
+%!error hash ([1, 0; 0, 1], "");
+%!error hash ("unknown", "");
+%!error hash ("md5");
+%!error hash ("sha1");
+%!error hash ("sha512");
+*/
--- a/libinterp/dldfcn/module-files	Wed Dec 16 12:20:53 2015 -0800
+++ b/libinterp/dldfcn/module-files	Wed Dec 16 21:57:32 2015 +0100
@@ -16,6 +16,7 @@
 colamd.cc|$(SPARSE_XCPPFLAGS)|$(SPARSE_XLDFLAGS)|$(SPARSE_XLIBS)
 convhulln.cc|$(QHULL_CPPFLAGS)|$(QHULL_LDFLAGS)|$(QHULL_LIBS)
 dmperm.cc|$(SPARSE_XCPPFLAGS)|$(SPARSE_XLDFLAGS)|$(SPARSE_XLIBS)
+hash.cc|$(HASH_XCPPFLAGS)|$(HASH_LDFLAGS)|$(HASH_LIBS)
 fftw.cc|$(FFTW_XCPPFLAGS)|$(FFTW_XLDFLAGS)|$(FFTW_XLIBS)
 qr.cc|$(QRUPDATE_CPPFLAGS) $(SPARSE_XCPPFLAGS)|$(QRUPDATE_LDFLAGS) $(SPARSE_XLDFLAGS)|$(QRUPDATE_LIBS) $(SPARSE_XLIBS)
 symbfact.cc|$(SPARSE_XCPPFLAGS)|$(SPARSE_XLDFLAGS)|$(SPARSE_XLIBS)
--- a/liboctave/util/module.mk	Wed Dec 16 12:20:53 2015 -0800
+++ b/liboctave/util/module.mk	Wed Dec 16 21:57:32 2015 +0100
@@ -22,7 +22,6 @@
   liboctave/util/oct-glob.h \
   liboctave/util/oct-inttypes.h \
   liboctave/util/oct-locbuf.h \
-  liboctave/util/oct-md5.h \
   liboctave/util/oct-mutex.h \
   liboctave/util/oct-refcount.h \
   liboctave/util/oct-rl-edit.h \
@@ -59,7 +58,6 @@
   liboctave/util/oct-glob.cc \
   liboctave/util/oct-inttypes.cc \
   liboctave/util/oct-locbuf.cc \
-  liboctave/util/oct-md5.cc \
   liboctave/util/oct-mutex.cc \
   liboctave/util/oct-shlib.cc \
   liboctave/util/pathsearch.cc \
--- a/liboctave/util/oct-md5.cc	Wed Dec 16 12:20:53 2015 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,85 +0,0 @@
-/*
-
-Copyright (C) 2007-2015 David Bateman
-
-This file is part of Octave.
-
-Octave is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 3 of the License, or (at your
-option) any later version.
-
-Octave is distributed in the hope that it will be useful, but WITHOUT
-ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with Octave; see the file COPYING.  If not, see
-<http://www.gnu.org/licenses/>.
-
-*/
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <cstdio>
-
-#include <string>
-#include <vector>
-
-#include "lo-error.h"
-#include "oct-md5.h"
-#include "md5.h"
-
-static std::string
-oct_md5_result_to_str (const unsigned char *buf)
-{
-  char tmp[33];
-
-  sprintf (tmp,
-           "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
-           buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7],
-           buf[8],  buf[9], buf[10], buf[11], buf[12], buf[13], buf[14],
-           buf[15]);
-
-  return std::string (tmp, 32);
-}
-
-std::string
-oct_md5 (const std::string str)
-{
-  unsigned char buf[16];
-
-  md5_buffer (str.data (), str.length (), buf);
-
-  return oct_md5_result_to_str (buf);
-}
-
-std::string
-oct_md5_file (const std::string file)
-{
-  std::string retval;
-
-  FILE *ifile = gnulib::fopen (file.c_str (), "rb");
-
-  if (ifile)
-    {
-      unsigned char buf[16];
-
-      int errflag = md5_stream (ifile, buf);
-
-      gnulib::fclose (ifile);
-
-      if (! errflag)
-        retval = oct_md5_result_to_str (buf);
-      else
-        (*current_liboctave_error_handler) ("internal error in md5_stream");
-    }
-  else
-    (*current_liboctave_error_handler) ("unable to open file '%s' for reading",
-                                        file.c_str ());
-
-  return retval;
-}
--- a/liboctave/util/oct-md5.h	Wed Dec 16 12:20:53 2015 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-/*
-
-Copyright (C) 2007-2015 David Bateman
-
-This file is part of Octave.
-
-Octave is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the
-Free Software Foundation; either version 3 of the License, or (at your
-option) any later version.
-
-Octave is distributed in the hope that it will be useful, but WITHOUT
-ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-for more details.
-
-You should have received a copy of the GNU General Public License
-along with Octave; see the file COPYING.  If not, see
-<http://www.gnu.org/licenses/>.
-
-*/
-
-extern OCTAVE_API std::string oct_md5 (const std::string str);
-
-extern OCTAVE_API std::string oct_md5_file (const std::string file);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/deprecated/md5sum.m	Wed Dec 16 21:57:32 2015 +0100
@@ -0,0 +1,74 @@
+## Copyright (C) 2007-2015 David Bateman
+##
+## This file is part of Octave.
+##
+## Octave is free software; you can redistribute it and/or modify it
+## under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 3 of the License, or (at
+## your option) any later version.
+##
+## Octave is distributed in the hope that it will be useful, but
+## WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+## General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with Octave; see the file COPYING.  If not, see
+## <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @deftypefn  {} {} md5sum (@var{file})
+## @deftypefnx {} {} md5sum (@var{str}, @var{opt})
+##
+## @code{md5sum} is deprecated and will be removed in Octave version 4.6.
+## For equivalent functionality replace calls like @code{md5sum (@var{file})}
+## with:
+##
+## @example
+## hash (\"md5\", fileread (@var{file}))
+## @end example
+##
+## And calls like @code{md5sum (@var{str}, true)} with:
+##
+## @example
+## hash (\"md5\", fileread (@var{str}))
+## @end example
+##
+## Calculate the MD5 sum of the file @var{file}.
+## 
+## If the second parameter @var{opt} exists and is true, then calculate the MD5
+## sum of the string @var{str}.
+##
+## @seealso{hash,fileread}
+## @end deftypefn
+
+function r = md5sum (str, opt)
+
+  persistent warned = false;
+  if (! warned)
+    warned = true;
+    warning ("Octave:deprecated-function",
+             "md5sum is obsolete and will be removed from a future version of Octave, please use hash instead");
+  endif
+
+  if (nargin == 1)
+    r = hash ("md5", fileread (str));
+  elseif ((nargin == 2) && isbool (opt) && isscalar (opt) && (opt == true))
+    r = hash ("md5", str);
+  else
+    print_usage ();
+  endif
+
+endfunction
+
+%!assert (md5sum ("abc\0", true), "147a664a2ca9410911e61986d3f0d52a");
+
+%!test
+%! tfile = tempname ();
+%! fid = fopen (tfile, "wb");
+%! fwrite (fid, "abc\0");
+%! fclose (fid);
+%! assert (md5sum (tfile), "147a664a2ca9410911e61986d3f0d52a");
+%! unlink (tfile);
+
+%!error md5sum ();
--- a/scripts/deprecated/module.mk	Wed Dec 16 12:20:53 2015 -0800
+++ b/scripts/deprecated/module.mk	Wed Dec 16 21:57:32 2015 +0100
@@ -14,6 +14,7 @@
   scripts/deprecated/loadaudio.m \
   scripts/deprecated/luinc.m \
   scripts/deprecated/mahalanobis.m \
+  scripts/deprecated/md5sum.m \
   scripts/deprecated/mouse_wheel_zoom.m \
   scripts/deprecated/nfields.m \
   scripts/deprecated/octave_tmp_file_name.m \
--- a/scripts/miscellaneous/warning_ids.m	Wed Dec 16 12:20:53 2015 -0800
+++ b/scripts/miscellaneous/warning_ids.m	Wed Dec 16 21:57:32 2015 +0100
@@ -174,9 +174,6 @@
 ## @item Octave:logical-conversion
 ## By default, the @code{Octave:logical-conversion} warning is enabled.
 ##
-## @item Octave:md5sum-file-in-path
-## By default, the @code{Octave:md5sum-file-in-path} warning is enabled.
-##
 ## @item Octave:missing-glyph
 ## By default, the @code{Octave:missing-glyph} warning is enabled.
 ##