/*
 * Header file for multi buffer SHA context
 *
 * This file is provided under a dual BSD/GPLv2 license.  When using or
 * redistributing this file, you may do so under either license.
 *
 * GPL LICENSE SUMMARY
 *
 *  Copyright(c) 2014 Intel Corporation.
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of version 2 of the GNU General Public License as
 *  published by the Free Software Foundation.
 *
 *  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.
 *
 *  Contact Information:
 *	Tim Chen <tim.c.chen@linux.intel.com>
 *
 *  BSD LICENSE
 *
 *  Copyright(c) 2014 Intel Corporation.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions
 *  are met:
 *
 *    * Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 *    * 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.
 *    * Neither the name of Intel Corporation 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 BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 *  "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 COPYRIGHT
 *  OWNER 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.
 */

#ifndef _SHA_MB_CTX_INTERNAL_H
#define _SHA_MB_CTX_INTERNAL_H

#include "sha1_mb_mgr.h"

#define HASH_UPDATE          0x00
#define HASH_FIRST           0x01
#define HASH_LAST            0x02
#define HASH_ENTIRE          0x03
#define HASH_DONE	     0x04
#define HASH_FINAL	     0x08

#define HASH_CTX_STS_IDLE       0x00
#define HASH_CTX_STS_PROCESSING 0x01
#define HASH_CTX_STS_LAST       0x02
#define HASH_CTX_STS_COMPLETE   0x04

enum hash_ctx_error {
	HASH_CTX_ERROR_NONE               =  0,
	HASH_CTX_ERROR_INVALID_FLAGS      = -1,
	HASH_CTX_ERROR_ALREADY_PROCESSING = -2,
	HASH_CTX_ERROR_ALREADY_COMPLETED  = -3,

#ifdef HASH_CTX_DEBUG
	HASH_CTX_ERROR_DEBUG_DIGEST_MISMATCH = -4,
#endif
};


#define hash_ctx_user_data(ctx)  ((ctx)->user_data)
#define hash_ctx_digest(ctx)     ((ctx)->job.result_digest)
#define hash_ctx_processing(ctx) ((ctx)->status & HASH_CTX_STS_PROCESSING)
#define hash_ctx_complete(ctx)   ((ctx)->status == HASH_CTX_STS_COMPLETE)
#define hash_ctx_status(ctx)     ((ctx)->status)
#define hash_ctx_error(ctx)      ((ctx)->error)
#define hash_ctx_init(ctx) \
	do { \
		(ctx)->error = HASH_CTX_ERROR_NONE; \
		(ctx)->status = HASH_CTX_STS_COMPLETE; \
	} while (0)


/* Hash Constants and Typedefs */
#define SHA1_DIGEST_LENGTH          5
#define SHA1_LOG2_BLOCK_SIZE        6

#define SHA1_PADLENGTHFIELD_SIZE    8

#ifdef SHA_MB_DEBUG
#define assert(expr) \
do { \
	if (unlikely(!(expr))) { \
		printk(KERN_ERR "Assertion failed! %s,%s,%s,line=%d\n", \
		#expr, __FILE__, __func__, __LINE__); \
	} \
} while (0)
#else
#define assert(expr) do {} while (0)
#endif

struct sha1_ctx_mgr {
	struct sha1_mb_mgr mgr;
};

/* typedef struct sha1_ctx_mgr sha1_ctx_mgr; */

struct sha1_hash_ctx {
	/* Must be at struct offset 0 */
	struct job_sha1       job;
	/* status flag */
	int status;
	/* error flag */
	int error;

	uint32_t	total_length;
	const void	*incoming_buffer;
	uint32_t	incoming_buffer_length;
	uint8_t		partial_block_buffer[SHA1_BLOCK_SIZE * 2];
	uint32_t	partial_block_buffer_length;
	void		*user_data;
};

#endif
