/*1* Copyright (C) 2021 - This file is part of libecc project2*3* Authors:4* Ryad BENADJILA <[email protected]>5* Arnaud EBALARD <[email protected]>6*7* This software is licensed under a dual BSD and GPL v2 license.8* See LICENSE file at the root folder of the project.9*/10#ifndef __MDC2_H__11#define __MDC2_H__1213/* Include libec for useful types and macros */14#include <libecc/libec.h>1516#define MDC2_STATE_SIZE 1617#define MDC2_BLOCK_SIZE 818#define MDC2_DIGEST_SIZE 1619#define MDC2_DIGEST_SIZE_BITS 1282021#define MDC2_HASH_MAGIC ((word_t)(0x8296527183648310ULL))22#define MDC2_HASH_CHECK_INITIALIZED(A, ret, err) \23MUST_HAVE((((void *)(A)) != NULL) && ((A)->magic == MDC2_HASH_MAGIC), ret, err)2425/* Padding types as described in the informative appendix of26* ISO-IEC-10118-2-199427*/28typedef enum {29ISOIEC10118_TYPE1 = 0,30ISOIEC10118_TYPE2 = 1,31} padding_type;3233typedef struct {34/* Number of bytes processed */35u64 mdc2_total;36/* Internal state */37u8 mdc2_state[MDC2_STATE_SIZE];38/* Internal buffer to handle updates in a block */39u8 mdc2_buffer[MDC2_BLOCK_SIZE];40/* Initialization magic value */41word_t magic;42/* Padding type, as per ISO-IEC-10118-2-1994 */43padding_type padding;44} mdc2_context;4546ATTRIBUTE_WARN_UNUSED_RET int mdc2_set_padding_type(mdc2_context *ctx,47padding_type p);4849/* Init hash function. Returns 0 on success, -1 on error. */50ATTRIBUTE_WARN_UNUSED_RET int mdc2_init(mdc2_context *ctx);5152ATTRIBUTE_WARN_UNUSED_RET int mdc2_update(mdc2_context *ctx, const u8 *input, u32 ilen);5354/* Finalize. Returns 0 on success, -1 on error.*/55ATTRIBUTE_WARN_UNUSED_RET int mdc2_final(mdc2_context *ctx, u8 output[MDC2_DIGEST_SIZE]);5657/*58* Scattered version performing init/update/finalize on a vector of buffers59* 'inputs' with the length of each buffer passed via 'ilens'. The function60* loops on pointers in 'inputs' until it finds a NULL pointer. The function61* returns 0 on success, -1 on error.62*/63ATTRIBUTE_WARN_UNUSED_RET int mdc2_scattered(const u8 **inputs, const u32 *ilens,64u8 output[MDC2_DIGEST_SIZE], padding_type p);6566/*67* Scattered version performing init/update/finalize on a vector of buffers68* 'inputs' with the length of each buffer passed via 'ilens'. The function69* loops on pointers in 'inputs' until it finds a NULL pointer. The function70* returns 0 on success, -1 on error.71*/72ATTRIBUTE_WARN_UNUSED_RET int mdc2_scattered_padding1(const u8 **inputs, const u32 *ilens,73u8 output[MDC2_DIGEST_SIZE]);7475/*76* Scattered version performing init/update/finalize on a vector of buffers77* 'inputs' with the length of each buffer passed via 'ilens'. The function78* loops on pointers in 'inputs' until it finds a NULL pointer. The function79* returns 0 on success, -1 on error.80*/81ATTRIBUTE_WARN_UNUSED_RET int mdc2_scattered_padding2(const u8 **inputs, const u32 *ilens,82u8 output[MDC2_DIGEST_SIZE]);83/*84* Single call version performing init/update/final on given input.85* Returns 0 on success, -1 on error.86*/87ATTRIBUTE_WARN_UNUSED_RET int mdc2(const u8 *input, u32 ilen, u8 output[MDC2_DIGEST_SIZE], padding_type p);8889/*90* Single call version performing init/update/final on given input.91* Returns 0 on success, -1 on error.92*/93ATTRIBUTE_WARN_UNUSED_RET int mdc2_padding1(const u8 *input, u32 ilen, u8 output[MDC2_DIGEST_SIZE]);9495/*96* Single call version performing init/update/final on given input.97* Returns 0 on success, -1 on error.98*/99ATTRIBUTE_WARN_UNUSED_RET int mdc2_padding2(const u8 *input, u32 ilen, u8 output[MDC2_DIGEST_SIZE]);100101#endif /* __MDC2_H__ */102103104