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 7684 : SMB_INO_T hash_inode(const SMB_STRUCT_STAT *sbuf, const char *sname) 28 7684 : { 29 7684 : gnutls_hash_hd_t hash_hnd = NULL; 30 7684 : uint8_t digest[gnutls_hash_get_len(GNUTLS_DIG_SHA1)]; 31 7684 : char *upper_sname = NULL; 32 7684 : SMB_INO_T result = 0; 33 : int rc; 34 : 35 7684 : 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 7684 : upper_sname = talloc_strdup_upper(talloc_tos(), sname); 41 7684 : SMB_ASSERT(upper_sname != NULL); 42 : 43 7684 : GNUTLS_FIPS140_SET_LAX_MODE(); 44 : 45 7684 : rc = gnutls_hash_init(&hash_hnd, GNUTLS_DIG_SHA1); 46 7684 : if (rc < 0) { 47 0 : goto out; 48 : } 49 : 50 7684 : rc = gnutls_hash(hash_hnd, 51 7684 : &(sbuf->st_ex_dev), 52 : sizeof(sbuf->st_ex_dev)); 53 7684 : if (rc < 0) { 54 0 : gnutls_hash_deinit(hash_hnd, NULL); 55 0 : goto out; 56 : } 57 7684 : rc = gnutls_hash(hash_hnd, 58 7684 : &(sbuf->st_ex_ino), 59 : sizeof(sbuf->st_ex_ino)); 60 7684 : if (rc < 0) { 61 0 : gnutls_hash_deinit(hash_hnd, NULL); 62 0 : goto out; 63 : } 64 7684 : rc = gnutls_hash(hash_hnd, 65 : upper_sname, 66 7684 : talloc_get_size(upper_sname) - 1); 67 7684 : if (rc < 0) { 68 0 : gnutls_hash_deinit(hash_hnd, NULL); 69 0 : goto out; 70 : } 71 : 72 7684 : gnutls_hash_deinit(hash_hnd, digest); 73 : 74 7684 : memcpy(&result, digest, sizeof(result)); 75 7684 : DBG_DEBUG("fruit_inode \"%s\": ino=%ju\n", 76 : sname, (uintmax_t)result); 77 : 78 7684 : out: 79 7684 : GNUTLS_FIPS140_SET_STRICT_MODE(); 80 7684 : TALLOC_FREE(upper_sname); 81 : 82 7684 : DBG_DEBUG("hash_inode '%s': ino=%ju\n", 83 : sname, 84 : (uintmax_t)result); 85 : 86 7684 : return result; 87 : }