s3:rpc_client: Implement dcerpc_lsa_open_policy_fallback()
[Samba.git] / source3 / modules / hash_inode.c
bloba9144621901892d3cb7414706582bc21bf866455
1 /*
2 * Unix SMB/Netbios implementation.
4 * Copyright (c) 2019 Andreas Schneider <asn@samba.org>
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.
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.
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/>.
20 #include "includes.h"
21 #include "hash_inode.h"
23 #include <gnutls/gnutls.h>
24 #include <gnutls/crypto.h>
25 #include "lib/crypto/gnutls_helpers.h"
27 SMB_INO_T hash_inode(const SMB_STRUCT_STAT *sbuf, const char *sname)
29 gnutls_hash_hd_t hash_hnd = NULL;
30 uint8_t digest[gnutls_hash_get_len(GNUTLS_DIG_SHA1)];
31 char *upper_sname = NULL;
32 SMB_INO_T result = 0;
33 int rc;
35 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);
40 upper_sname = talloc_strdup_upper(talloc_tos(), sname);
41 SMB_ASSERT(upper_sname != NULL);
43 GNUTLS_FIPS140_SET_LAX_MODE();
45 rc = gnutls_hash_init(&hash_hnd, GNUTLS_DIG_SHA1);
46 if (rc < 0) {
47 goto out;
50 rc = gnutls_hash(hash_hnd,
51 &(sbuf->st_ex_dev),
52 sizeof(sbuf->st_ex_dev));
53 if (rc < 0) {
54 gnutls_hash_deinit(hash_hnd, NULL);
55 goto out;
57 rc = gnutls_hash(hash_hnd,
58 &(sbuf->st_ex_ino),
59 sizeof(sbuf->st_ex_ino));
60 if (rc < 0) {
61 gnutls_hash_deinit(hash_hnd, NULL);
62 goto out;
64 rc = gnutls_hash(hash_hnd,
65 upper_sname,
66 talloc_get_size(upper_sname) - 1);
67 if (rc < 0) {
68 gnutls_hash_deinit(hash_hnd, NULL);
69 goto out;
72 gnutls_hash_deinit(hash_hnd, digest);
74 memcpy(&result, digest, sizeof(result));
75 DBG_DEBUG("fruit_inode \"%s\": ino=%ju\n",
76 sname, (uintmax_t)result);
78 out:
79 GNUTLS_FIPS140_SET_STRICT_MODE();
80 TALLOC_FREE(upper_sname);
82 DBG_DEBUG("hash_inode '%s': ino=%ju\n",
83 sname,
84 (uintmax_t)result);
86 return result;