brintos

brintos / linux-shallow public Read only

0
0
Text · 2.1 KiB · 1d1ee9f Raw
85 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3   Unix SMB/Netbios implementation.4   Version 1.9.5   SMB parameters and setup6   Copyright (C) Andrew Tridgell 1992-20007   Copyright (C) Luke Kenneth Casson Leighton 1996-20008   Modified by Jeremy Allison 1995.9   Copyright (C) Andrew Bartlett <abartlet@samba.org> 2002-200310   Modified by Steve French (sfrench@us.ibm.com) 2002-200311 12*/13 14#include <linux/module.h>15#include <linux/slab.h>16#include <linux/fips.h>17#include <linux/fs.h>18#include <linux/string.h>19#include <linux/kernel.h>20#include <linux/random.h>21#include "cifs_fs_sb.h"22#include "cifs_unicode.h"23#include "cifspdu.h"24#include "cifsglob.h"25#include "cifs_debug.h"26#include "cifsproto.h"27#include "../common/md4.h"28 29/* following came from the other byteorder.h to avoid include conflicts */30#define CVAL(buf,pos) (((unsigned char *)(buf))[pos])31#define SSVALX(buf,pos,val) (CVAL(buf,pos)=(val)&0xFF,CVAL(buf,pos+1)=(val)>>8)32#define SSVAL(buf,pos,val) SSVALX((buf),(pos),((__u16)(val)))33 34/* produce a md4 message digest from data of length n bytes */35static int36mdfour(unsigned char *md4_hash, unsigned char *link_str, int link_len)37{38	int rc;39	struct md4_ctx mctx;40 41	rc = cifs_md4_init(&mctx);42	if (rc) {43		cifs_dbg(VFS, "%s: Could not init MD4\n", __func__);44		goto mdfour_err;45	}46	rc = cifs_md4_update(&mctx, link_str, link_len);47	if (rc) {48		cifs_dbg(VFS, "%s: Could not update MD4\n", __func__);49		goto mdfour_err;50	}51	rc = cifs_md4_final(&mctx, md4_hash);52	if (rc)53		cifs_dbg(VFS, "%s: Could not finalize MD4\n", __func__);54 55 56mdfour_err:57	return rc;58}59 60/*61 * Creates the MD4 Hash of the users password in NT UNICODE.62 */63 64int65E_md4hash(const unsigned char *passwd, unsigned char *p16,66	const struct nls_table *codepage)67{68	int rc;69	int len;70	__le16 wpwd[129];71 72	/* Password cannot be longer than 128 characters */73	if (passwd) /* Password must be converted to NT unicode */74		len = cifs_strtoUTF16(wpwd, passwd, 128, codepage);75	else {76		len = 0;77		*wpwd = 0; /* Ensure string is null terminated */78	}79 80	rc = mdfour(p16, (unsigned char *) wpwd, len * sizeof(__le16));81	memzero_explicit(wpwd, sizeof(wpwd));82 83	return rc;84}85