/*
 * Cryptographic API.
 *
 * HMAC: Keyed-Hashing for Message Authentication (RFC2104).
 * SHA-256 is used as an underlying hash function.
 *
 * Author : Igor Shcheglakov (i.shcheglako@samsung.com)
 * Date   : 15 Dec 2017
 *
 * Copyright (C) 2017 Samsung Electronics Co., Ltd.
 *
 */

#ifndef _FMP_HMAC_SHA256_H
#define _FMP_HMAC_SHA256_H

#include "sha256.h"

struct hmac_sha256_ctx {
	struct fmp_shash_desc inner_ctx;
	struct fmp_shash_desc outer_ctx;
};

typedef struct hmac_sha256_ctx HMAC_SHA256_CTX;

/* Initialize hashing context using a key of key_len bytes.
 *
 * Return zero on success and negative otherwise
 */
int hmac_sha256_init(struct hmac_sha256_ctx *ctx, const u8 *key, unsigned int key_len);

/*  Hash data_len bytes of data
 *
 * Return zero on success and negative otherwise
 */
int hmac_sha256_update(struct hmac_sha256_ctx *ctx, const u8 *data, unsigned int data_len);

/* Add final padding to a hash and write resulting HMAC to out.
 * There must be at least SHA256_DIGEST_LENGTH bytes of space in out
 *
 * Return zero on success and negative otherwise
 */
int hmac_sha256_final(struct hmac_sha256_ctx *ctx, u8 *out);

/* Hash data_len bytes of data using key of key_len bytes.
 * Write resulting HMAC to out. There must be at least SHA256_DIGEST_LENGTH
 * bytes of space in out
 *
 * Return zero on success and negative otherwise
 */
int hmac_sha256(const u8 *key, unsigned int key_len, const u8 *data, unsigned int data_len, u8 *out);

/* Cleanup allocated resources */
void hmac_sha256_ctx_cleanup(struct hmac_sha256_ctx *ctx);

#endif /* _FMP_HMAC_SHA256_H */