From cf0442bff13e37507bc37455f2823d0179f783aa Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Tue, 18 Jun 2019 16:56:43 +0200 Subject: [PATCH] s3:modules: Add hash_inode() function based on SHA1 This should use SHA1 as modern CPUs have SHA NI instruction support. Signed-off-by: Andreas Schneider Reviewed-by: Ralph Boehme --- source3/modules/hash_inode.c | 83 +++++++++++++++++++++++++++++++++++++++++++ source3/modules/hash_inode.h | 25 +++++++++++++ source3/modules/wscript_build | 4 +++ 3 files changed, 112 insertions(+) create mode 100644 source3/modules/hash_inode.c create mode 100644 source3/modules/hash_inode.h diff --git a/source3/modules/hash_inode.c b/source3/modules/hash_inode.c new file mode 100644 index 00000000000..d4752061e50 --- /dev/null +++ b/source3/modules/hash_inode.c @@ -0,0 +1,83 @@ +/* + * Unix SMB/Netbios implementation. + * + * Copyright (c) 2019 Andreas Schneider + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "includes.h" +#include "hash_inode.h" + +#include +#include + +SMB_INO_T hash_inode(const SMB_STRUCT_STAT *sbuf, const char *sname) +{ + gnutls_hash_hd_t hash_hnd = NULL; + uint8_t digest[gnutls_hash_get_len(GNUTLS_DIG_SHA1)]; + char *upper_sname = NULL; + SMB_INO_T result = 0; + int rc; + + DBG_DEBUG("hash_inode called for %ju/%ju [%s]\n", + (uintmax_t)sbuf->st_ex_dev, + (uintmax_t)sbuf->st_ex_ino, + sname); + + upper_sname = talloc_strdup_upper(talloc_tos(), sname); + SMB_ASSERT(upper_sname != NULL); + + rc = gnutls_hash_init(&hash_hnd, GNUTLS_DIG_SHA1); + if (rc < 0) { + goto out; + } + + rc = gnutls_hash(hash_hnd, + &(sbuf->st_ex_dev), + sizeof(sbuf->st_ex_dev)); + if (rc < 0) { + gnutls_hash_deinit(hash_hnd, NULL); + goto out; + } + rc = gnutls_hash(hash_hnd, + &(sbuf->st_ex_ino), + sizeof(sbuf->st_ex_ino)); + if (rc < 0) { + gnutls_hash_deinit(hash_hnd, NULL); + goto out; + } + rc = gnutls_hash(hash_hnd, + upper_sname, + talloc_get_size(upper_sname) - 1); + if (rc < 0) { + gnutls_hash_deinit(hash_hnd, NULL); + goto out; + } + + gnutls_hash_deinit(hash_hnd, digest); + + memcpy(&result, digest, sizeof(result)); + DBG_DEBUG("fruit_inode \"%s\": ino=%ju\n", + sname, (uintmax_t)result); + +out: + TALLOC_FREE(upper_sname); + + DBG_DEBUG("hash_inode '%s': ino=%ju\n", + sname, + (uintmax_t)result); + + return result; +} diff --git a/source3/modules/hash_inode.h b/source3/modules/hash_inode.h new file mode 100644 index 00000000000..e08fc48aa15 --- /dev/null +++ b/source3/modules/hash_inode.h @@ -0,0 +1,25 @@ +/* + * Unix SMB/Netbios implementation. + * + * Copyright (c) 2019 Andreas Schneider + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef _HASH_INODE_H +#define _HASH_INODE_H + +SMB_INO_T hash_inode(const SMB_STRUCT_STAT *sbuf, const char *sname); + +#endif /* _HASH_INODE_H */ diff --git a/source3/modules/wscript_build b/source3/modules/wscript_build index 35010bb0e3b..9d4153f7bb4 100644 --- a/source3/modules/wscript_build +++ b/source3/modules/wscript_build @@ -36,6 +36,10 @@ bld.SAMBA3_SUBSYSTEM('OFFLOAD_TOKEN', bld.SAMBA3_SUBSYSTEM('STRING_REPLACE', source='string_replace.c') +bld.SAMBA3_SUBSYSTEM('HASH_INODE', + source='hash_inode.c', + deps='gnutls') + # # This is always be static, see # source3/wscript: required_static_modules -- 2.11.4.GIT