Example #1
0
int sptlrpc_get_bulk_checksum(struct ptlrpc_bulk_desc *desc, __u8 alg,
			      void *buf, int buflen)
{
	struct cfs_crypto_hash_desc *hdesc;
	int hashsize;
	unsigned int bufsize;
	int i, err;

	LASSERT(alg > BULK_HASH_ALG_NULL && alg < BULK_HASH_ALG_MAX);
	LASSERT(buflen >= 4);

	hdesc = cfs_crypto_hash_init(cfs_hash_alg_id[alg], NULL, 0);
	if (IS_ERR(hdesc)) {
		CERROR("Unable to initialize checksum hash %s\n",
		       cfs_crypto_hash_name(cfs_hash_alg_id[alg]));
		return PTR_ERR(hdesc);
	}

	hashsize = cfs_crypto_hash_digestsize(cfs_hash_alg_id[alg]);

	for (i = 0; i < desc->bd_iov_count; i++) {
		cfs_crypto_hash_update_page(hdesc,
					    BD_GET_KIOV(desc, i).bv_page,
					    BD_GET_KIOV(desc, i).bv_offset &
					    ~PAGE_MASK,
					    BD_GET_KIOV(desc, i).bv_len);
	}

	if (hashsize > buflen) {
		unsigned char hashbuf[CFS_CRYPTO_HASH_DIGESTSIZE_MAX];

		bufsize = sizeof(hashbuf);
		LASSERTF(bufsize >= hashsize, "bufsize = %u < hashsize %u\n",
			 bufsize, hashsize);
		err = cfs_crypto_hash_final(hdesc, hashbuf, &bufsize);
		memcpy(buf, hashbuf, buflen);
	} else {
		bufsize = buflen;
		err = cfs_crypto_hash_final(hdesc, buf, &bufsize);
	}

	return err;
}
Example #2
0
int sptlrpc_get_bulk_checksum(struct ptlrpc_bulk_desc *desc, __u8 alg,
                              void *buf, int buflen)
{
    struct cfs_crypto_hash_desc	*hdesc;
    int				hashsize;
    char				hashbuf[64];
    unsigned int			bufsize;
    int				i, err;

    LASSERT(alg > BULK_HASH_ALG_NULL && alg < BULK_HASH_ALG_MAX);
    LASSERT(buflen >= 4);

    hdesc = cfs_crypto_hash_init(cfs_hash_alg_id[alg], NULL, 0);
    if (IS_ERR(hdesc)) {
        CERROR("Unable to initialize checksum hash %s\n",
               cfs_crypto_hash_name(cfs_hash_alg_id[alg]));
        return PTR_ERR(hdesc);
    }

    hashsize = cfs_crypto_hash_digestsize(cfs_hash_alg_id[alg]);

    for (i = 0; i < desc->bd_iov_count; i++) {
        cfs_crypto_hash_update_page(hdesc, desc->bd_iov[i].kiov_page,
                                    desc->bd_iov[i].kiov_offset & ~CFS_PAGE_MASK,
                                    desc->bd_iov[i].kiov_len);
    }
    if (hashsize > buflen) {
        bufsize = sizeof(hashbuf);
        err = cfs_crypto_hash_final(hdesc, (unsigned char *)hashbuf,
                                    &bufsize);
        memcpy(buf, hashbuf, buflen);
    } else {
        bufsize = buflen;
        err = cfs_crypto_hash_final(hdesc, (unsigned char *)buf,
                                    &bufsize);
    }

    if (err)
        cfs_crypto_hash_final(hdesc, NULL, NULL);
    return err;
}