GNU Octave  4.2.1
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
hash.cc
Go to the documentation of this file.
1 /*
2 
3 Copyright (C) 2007-2017 David Bateman
4 Copyright (C) 2016 Kai T. Ohlhus
5 
6 This file is part of Octave.
7 
8 Octave is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by the
10 Free Software Foundation; either version 3 of the License, or (at your
11 option) any later version.
12 
13 Octave is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
17 
18 You should have received a copy of the GNU General Public License
19 along with Octave; see the file COPYING. If not, see
20 <http://www.gnu.org/licenses/>.
21 
22 */
23 
24 /*
25 Implementation note (Dec, 2015): All supported cryptographic hash
26 functions are calling "low-level" inplementations of the GNULIB.
27 
28 The GNULIB, contains even more HMAC based algorithms, c.f.
29 https://www.gnu.org/software/gnulib/MODULES.html#module=crypto/hmac-md5
30 so a future project might be including these algorithms as well, adding
31 a third key input parameter. There is also a GNULIB "high-level"
32 interface to Libcrypt. It might be easier to use, but it introduces
33 a new build dependency, so better stick to the "low-level" functions
34 for now.
35 */
36 
37 #if defined (HAVE_CONFIG_H)
38 # include "config.h"
39 #endif
40 
41 #include <string>
42 
43 #include "lo-hash.h"
44 
45 #include "defun.h"
46 #include "error.h"
47 #include "ov.h"
48 #include "ovl.h"
49 
50 DEFUN (hash, args, ,
51  doc: /* -*- texinfo -*-
52 @deftypefn {} {} hash (@var{hfun}, @var{str})
53 Calculate the hash value of the string @var{str} using the hash function
54 @var{hfun}.
55 
56 The available hash functions are given in the table below.
57 
58 @table @samp
59 @item MD2
60 Message-Digest Algorithm 2 (RFC 1319).
61 
62 @item MD4
63 Message-Digest Algorithm 4 (RFC 1320).
64 
65 @item MD5
66 Message-Digest Algorithm 5 (RFC 1321).
67 
68 @item SHA1
69 Secure Hash Algorithm 1 (RFC 3174)
70 
71 @item SHA224
72 Secure Hash Algorithm 2 (224 Bits, RFC 3874)
73 
74 @item SHA256
75 Secure Hash Algorithm 2 (256 Bits, RFC 6234)
76 
77 @item SHA384
78 Secure Hash Algorithm 2 (384 Bits, RFC 6234)
79 
80 @item SHA512
81 Secure Hash Algorithm 2 (512 Bits, RFC 6234)
82 @end table
83 
84 To calculate for example the MD5 hash value of the string
85 @nospell{@qcode{"abc"}} the @code{hash} function is called as follows:
86 
87 @example
88 @group
89 hash ("md5", "abc")
90  @print{} ans = 900150983cd24fb0d6963f7d28e17f72
91 @end group
92 @end example
93 
94 For the same string, the SHA-1 hash value is calculated with:
95 
96 @example
97 @group
98 hash ("sha1", "abc")
99  @print{} ans = a9993e364706816aba3e25717850c26c9cd0d89d
100 @end group
101 @end example
102 
103 And to compute the hash value of a file, e.g., @code{file = "file.txt"},
104 call @code{hash} in combination with the @code{fileread}:
105 
106 @example
107 @group
108 hash ("md5", fileread (file));
109 @end group
110 @end example
111 
112 @end deftypefn */)
113 {
114  if (args.length () != 2)
115  print_usage ();
116 
117  std::string hash_type = args(0).string_value ();
118  std::string str = args(1).string_value ();
119 
120  return ovl (octave::crypto::hash (hash_type, str));
121 }
122 
123 /*
124 ## MD2 test suite (RFC 1319)
125 %!assert (hash ("md2", ""), "8350e5a3e24c153df2275c9f80692773")
126 %!assert (hash ("md2", "a"), "32ec01ec4a6dac72c0ab96fb34c0b5d1")
127 %!assert (hash ("md2", "abc"), "da853b0d3f88d99b30283a69e6ded6bb")
128 %!assert (hash ("md2", "message digest"), "ab4f496bfb2a530b219ff33031fe06b0")
129 %!assert (hash ("md2", "abcdefghijklmnopqrstuvwxyz"),
130 %! "4e8ddff3650292ab5a4108c3aa47940b");
131 %!assert (hash ("md2", ["ABCDEFGHIJKLMNOPQRSTUVWXYZ", ...
132 %! "abcdefghijklmnopqrstuvwxyz0123456789"]),
133 %! "da33def2a42df13975352846c30338cd");
134 %!assert (hash ("md2", ["123456789012345678901234567890123456789", ...
135 %! "01234567890123456789012345678901234567890"]),
136 %! "d5976f79d83d3a0dc9806c3c66f3efd8");
137 
138 ## MD4 test suite (RFC 1320)
139 %!assert (hash ("md4", ""), "31d6cfe0d16ae931b73c59d7e0c089c0")
140 %!assert (hash ("md4", "a"), "bde52cb31de33e46245e05fbdbd6fb24")
141 %!assert (hash ("md4", "abc"), "a448017aaf21d8525fc10ae87aa6729d")
142 %!assert (hash ("md4", "message digest"), "d9130a8164549fe818874806e1c7014b")
143 %!assert (hash ("md4", "abcdefghijklmnopqrstuvwxyz"),
144 %! "d79e1c308aa5bbcdeea8ed63df412da9");
145 %!assert (hash ("md4", ["ABCDEFGHIJKLMNOPQRSTUVWXYZ", ...
146 %! "abcdefghijklmnopqrstuvwxyz0123456789"]),
147 %! "043f8582f241db351ce627e153e7f0e4");
148 %!assert (hash ("md4", ["123456789012345678901234567890123456789", ...
149 %! "01234567890123456789012345678901234567890"]),
150 %! "e33b4ddc9c38f2199c3e7b164fcc0536");
151 
152 ## MD5 test suite (RFC 1321)
153 %!assert (hash ("md5", ""), "d41d8cd98f00b204e9800998ecf8427e")
154 %!assert (hash ("md5", "a"), "0cc175b9c0f1b6a831c399e269772661")
155 %!assert (hash ("md5", "abc"), "900150983cd24fb0d6963f7d28e17f72")
156 %!assert (hash ("md5", "message digest"), "f96b697d7cb7938d525a2f31aaf161d0")
157 %!assert (hash ("md5", "abcdefghijklmnopqrstuvwxyz"),
158 %! "c3fcd3d76192e4007dfb496cca67e13b");
159 %!assert (hash ("md5", ["ABCDEFGHIJKLMNOPQRSTUVWXYZ", ...
160 %! "abcdefghijklmnopqrstuvwxyz0123456789"]),
161 %! "d174ab98d277d9f5a5611c2c9f419d9f");
162 %!assert (hash ("md5", ["123456789012345678901234567890123456789", ...
163 %! "01234567890123456789012345678901234567890"]),
164 %! "57edf4a22be3c955ac49da2e2107b67a");
165 
166 ## SHA1 test suite (RFC 3174) and more
167 %!assert (hash ("sha1", ""), "da39a3ee5e6b4b0d3255bfef95601890afd80709")
168 %!assert (hash ("sha1", "a"), "86f7e437faa5a7fce15d1ddcb9eaeaea377667b8")
169 %!assert (hash ("sha1", "abc"), "a9993e364706816aba3e25717850c26c9cd0d89d")
170 %!assert (hash ("sha1", ["abcdbcdecdefdefgefghfghighijhi", ...
171 %! "jkijkljklmklmnlmnomnopnopq"]),
172 %! "84983e441c3bd26ebaae4aa1f95129e5e54670f1");
173 %!assert (hash ("sha1", ["01234567012345670123456701234567", ...
174 %! "01234567012345670123456701234567"]),
175 %! "e0c094e867ef46c350ef54a7f59dd60bed92ae83");
176 %!assert (hash ("sha1", "The quick brown fox jumps over the lazy dog"),
177 %! "2fd4e1c67a2d28fced849ee1bb76e7391b93eb12");
178 
179 ## SHA224 test suite (RFC 3874) and more
180 %!assert (hash ("sha224", ""),
181 %! "d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f");
182 %!assert (hash ("sha224", "a"),
183 %! "abd37534c7d9a2efb9465de931cd7055ffdb8879563ae98078d6d6d5");
184 %!assert (hash ("sha224", "abc"),
185 %! "23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7");
186 %!assert (hash ("sha224", ["abcdbcdecdefdefgefghfghighijh", ...
187 %! "ijkijkljklmklmnlmnomnopnopq"]),
188 %! "75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525");
189 
190 ## SHA256/384/512 tests (RFC 6234) and more
191 %!assert (hash ("sha256", ""),
192 %! "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855");
193 %!assert (hash ("sha384", ""),
194 %! ["38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc", ...
195 %! "7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b"]);
196 %!assert (hash ("sha512", ""),
197 %! ["cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a", ...
198 %! "921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47", ...
199 %! "417a81a538327af927da3e"]);
200 
201 ## Test special character behavior
202 %!assert <31689> (hash ("md2", "abc\0"), "5a636d615002a7874ac1c9e9a43361f7")
203 %!assert <31689> (hash ("md4", "abc\0"), "0ee5201897ecb206c4eaba1d2da5224d")
204 %!assert <31689> (hash ("md5", "abc\0"), "147a664a2ca9410911e61986d3f0d52a")
205 %!assert <31689> (hash ("sha1", "abc\0"), "686483805ac47ca14e03514f7481a7973b401762")
206 %!assert <31689> (hash ("sha224", "abc\0"),
207 %! "fbc8e47920e108bb1d0b631d18b36ae9b1549d28362aa15ebe960cfb");
208 %!assert <31689> (hash ("sha256", "abc\0"),
209 %! "dc1114cd074914bd872cc1f9a23ec910ea2203bc79779ab2e17da25782a624fc");
210 %!assert <31689> (hash ("sha384", "abc\0"),
211 %! ["eba81f2dfba4ec60d3f786c89d91b08e6c0b63d55986874378e385", ...
212 %! "e6fac587cce7a520ca9437290fe626cbf75c855e17"]);
213 %!assert <31689> (hash ("sha512", "abc\0"),
214 %! ["7ce05eda233e545a2d5c626862a5ddaafb09b9d8ec3bec08aa458b", ...
215 %! "7c9e7d939d84a57d5a20d8a9002983aabae2457b19c50ba326bf5b", ...
216 %! "081f75b41342f42c3383"]);
217 
218 ## Test equivalence to deprecated md5sum offering file hashing
219 %!test
220 %! tfile = tempname ();
221 %! fid = fopen (tfile, "wb");
222 %! fwrite (fid, "abc\0");
223 %! fclose (fid);
224 %! assert (hash ("md5", fileread (tfile)), "147a664a2ca9410911e61986d3f0d52a");
225 %! unlink (tfile);
226 
227 ## Test bad function calls
228 %!error hash ()
229 %!error hash ("")
230 %!error hash ("", "")
231 %!error hash ("", "", "")
232 %!error hash (1, "")
233 %!error hash ([1, 0; 0, 1], "")
234 %!error hash ("unknown", "")
235 %!error hash ("md5")
236 %!error hash ("sha1")
237 %!error hash ("sha512")
238 */
std::string hash(hash_fptr hash_fcn, const std::string &str, int result_buf_len)
Definition: lo-hash.cc:42
OCTINTERP_API void print_usage(void)
Definition: defun.cc:52
#define DEFUN(name, args_name, nargout_name, doc)
Definition: defun.h:46
return ovl(octave::crypto::hash(hash_type, str))
JNIEnv void * args
Definition: ov-java.cc:67
std::string str
Definition: hash.cc:118
OCTAVE_EXPORT octave_value_list Fhash(const octave_value_list &args, int) the SHA-1 hash value is calculated with nd group nd example nd deftypefn *std::string hash_type
Definition: hash.cc:117
If this string is the system will ring the terminal sometimes it is useful to be able to print the original representation of the string
Definition: utils.cc:854