98 lines
2.9 KiB
C
98 lines
2.9 KiB
C
|
/*
|
||
|
* linux/fs/nfsd/nfs4recover.c
|
||
|
*
|
||
|
* Copyright (c) 2004 The Regents of the University of Michigan.
|
||
|
* All rights reserved.
|
||
|
*
|
||
|
* Andy Adamson <andros@citi.umich.edu>
|
||
|
*
|
||
|
* Redistribution and use in source and binary forms, with or without
|
||
|
* modification, are permitted provided that the following conditions
|
||
|
* are met:
|
||
|
*
|
||
|
* 1. Redistributions of source code must retain the above copyright
|
||
|
* notice, this list of conditions and the following disclaimer.
|
||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||
|
* notice, this list of conditions and the following disclaimer in the
|
||
|
* documentation and/or other materials provided with the distribution.
|
||
|
* 3. Neither the name of the University nor the names of its
|
||
|
* contributors may be used to endorse or promote products derived
|
||
|
* from this software without specific prior written permission.
|
||
|
*
|
||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||
|
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||
|
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
|
||
|
#include <linux/sunrpc/svc.h>
|
||
|
#include <linux/nfsd/nfsd.h>
|
||
|
#include <linux/nfs4.h>
|
||
|
#include <linux/nfsd/state.h>
|
||
|
#include <linux/nfsd/xdr4.h>
|
||
|
#include <asm/uaccess.h>
|
||
|
#include <asm/scatterlist.h>
|
||
|
#include <linux/crypto.h>
|
||
|
|
||
|
|
||
|
#define NFSDDBG_FACILITY NFSDDBG_PROC
|
||
|
|
||
|
static void
|
||
|
md5_to_hex(char *out, char *md5)
|
||
|
{
|
||
|
int i;
|
||
|
|
||
|
for (i=0; i<16; i++) {
|
||
|
unsigned char c = md5[i];
|
||
|
|
||
|
*out++ = '0' + ((c&0xf0)>>4) + (c>=0xa0)*('a'-'9'-1);
|
||
|
*out++ = '0' + (c&0x0f) + ((c&0x0f)>=0x0a)*('a'-'9'-1);
|
||
|
}
|
||
|
*out = '\0';
|
||
|
}
|
||
|
|
||
|
int
|
||
|
nfs4_make_rec_clidname(char *dname, struct xdr_netobj *clname)
|
||
|
{
|
||
|
struct xdr_netobj cksum;
|
||
|
struct crypto_tfm *tfm;
|
||
|
struct scatterlist sg[1];
|
||
|
int status = nfserr_resource;
|
||
|
|
||
|
dprintk("NFSD: nfs4_make_rec_clidname for %.*s\n",
|
||
|
clname->len, clname->data);
|
||
|
tfm = crypto_alloc_tfm("md5", 0);
|
||
|
if (tfm == NULL)
|
||
|
goto out;
|
||
|
cksum.len = crypto_tfm_alg_digestsize(tfm);
|
||
|
cksum.data = kmalloc(cksum.len, GFP_KERNEL);
|
||
|
if (cksum.data == NULL)
|
||
|
goto out;
|
||
|
crypto_digest_init(tfm);
|
||
|
|
||
|
sg[0].page = virt_to_page(clname->data);
|
||
|
sg[0].offset = offset_in_page(clname->data);
|
||
|
sg[0].length = clname->len;
|
||
|
|
||
|
crypto_digest_update(tfm, sg, 1);
|
||
|
crypto_digest_final(tfm, cksum.data);
|
||
|
|
||
|
md5_to_hex(dname, cksum.data);
|
||
|
|
||
|
kfree(cksum.data);
|
||
|
status = nfs_ok;
|
||
|
out:
|
||
|
if (tfm)
|
||
|
crypto_free_tfm(tfm);
|
||
|
return status;
|
||
|
}
|