GNU Octave  4.4.1
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
hash.cc
Go to the documentation of this file.
1 /*
2 
3 Copyright (C) 2007-2018 David Bateman
4 Copyright (C) 2016-2018 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
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
12 
13 Octave is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License 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 <https://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 
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:54
#define DEFUN(name, args_name, nargout_name, doc)
Macro to define a builtin function.
Definition: defun.h:53
return ovl(octave::crypto::hash(hash_type, str))
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:888