Line data Source code
1 : /*
2 : * Unix SMB/Netbios implementation.
3 : *
4 : * Copyright (c) 2019 Andreas Schneider <asn@samba.org>
5 : *
6 : * This program is free software: you can redistribute it and/or modify
7 : * it under the terms of the GNU General Public License as published by
8 : * the Free Software Foundation, either version 3 of the License, or
9 : * (at your option) any later version.
10 : *
11 : * This program is distributed in the hope that it will be useful,
12 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : * GNU General Public License for more details.
15 : *
16 : * You should have received a copy of the GNU General Public License
17 : * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 : */
19 :
20 : #include "includes.h"
21 : #include "hash_inode.h"
22 :
23 : #include <gnutls/gnutls.h>
24 : #include <gnutls/crypto.h>
25 : #include "lib/crypto/gnutls_helpers.h"
26 :
27 36 : SMB_INO_T hash_inode(const SMB_STRUCT_STAT *sbuf, const char *sname)
28 36 : {
29 36 : gnutls_hash_hd_t hash_hnd = NULL;
30 36 : uint8_t digest[gnutls_hash_get_len(GNUTLS_DIG_SHA1)];
31 36 : char *upper_sname = NULL;
32 36 : SMB_INO_T result = 0;
33 : int rc;
34 :
35 36 : DBG_DEBUG("hash_inode called for %ju/%ju [%s]\n",
36 : (uintmax_t)sbuf->st_ex_dev,
37 : (uintmax_t)sbuf->st_ex_ino,
38 : sname);
39 :
40 36 : upper_sname = talloc_strdup_upper(talloc_tos(), sname);
41 36 : SMB_ASSERT(upper_sname != NULL);
42 :
43 18 : GNUTLS_FIPS140_SET_LAX_MODE();
44 :
45 36 : rc = gnutls_hash_init(&hash_hnd, GNUTLS_DIG_SHA1);
46 36 : if (rc < 0) {
47 0 : goto out;
48 : }
49 :
50 36 : rc = gnutls_hash(hash_hnd,
51 36 : &(sbuf->st_ex_dev),
52 : sizeof(sbuf->st_ex_dev));
53 36 : if (rc < 0) {
54 0 : gnutls_hash_deinit(hash_hnd, NULL);
55 0 : goto out;
56 : }
57 36 : rc = gnutls_hash(hash_hnd,
58 36 : &(sbuf->st_ex_ino),
59 : sizeof(sbuf->st_ex_ino));
60 36 : if (rc < 0) {
61 0 : gnutls_hash_deinit(hash_hnd, NULL);
62 0 : goto out;
63 : }
64 36 : rc = gnutls_hash(hash_hnd,
65 : upper_sname,
66 36 : talloc_get_size(upper_sname) - 1);
67 36 : if (rc < 0) {
68 0 : gnutls_hash_deinit(hash_hnd, NULL);
69 0 : goto out;
70 : }
71 :
72 36 : gnutls_hash_deinit(hash_hnd, digest);
73 :
74 36 : memcpy(&result, digest, sizeof(result));
75 36 : DBG_DEBUG("fruit_inode \"%s\": ino=%ju\n",
76 : sname, (uintmax_t)result);
77 :
78 36 : out:
79 18 : GNUTLS_FIPS140_SET_STRICT_MODE();
80 36 : TALLOC_FREE(upper_sname);
81 :
82 36 : DBG_DEBUG("hash_inode '%s': ino=%ju\n",
83 : sname,
84 : (uintmax_t)result);
85 :
86 36 : return result;
87 : }
|