1 /*
   2  * IDI,NTNU
   3  *
   4  * CDDL HEADER START
   5  *
   6  * The contents of this file are subject to the terms of the
   7  * Common Development and Distribution License (the "License").
   8  * You may not use this file except in compliance with the License.
   9  *
  10  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  11  * or http://opensource.org/licenses/CDDL-1.0.
  12  * See the License for the specific language governing permissions
  13  * and limitations under the License.
  14  *
  15  * When distributing Covered Code, include this CDDL HEADER in each
  16  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  17  * If applicable, add the following below this CDDL HEADER, with the
  18  * fields enclosed by brackets "[]" replaced with your own identifying
  19  * information: Portions Copyright [yyyy] [name of copyright owner]
  20  *
  21  * CDDL HEADER END
  22  *
  23  * Copyright (C) 2009, 2010, Jorn Amundsen <jorn.amundsen@ntnu.no>
  24  *
  25  * Tweaked Edon-R implementation for SUPERCOP, based on NIST API.
  26  *
  27  * $Id: edonr.h 517 2013-02-17 20:34:39Z joern $
  28  */
  29 /*
  30  * Portions copyright (c) 2013, Saso Kiselkov, All rights reserved
  31  */
  32 
  33 #ifndef __EDONR_H__
  34 #define __EDONR_H__
  35 
  36 #include <sys/types.h>
  37 
  38 /*
  39  * EdonR allows to call EdonRUpdate() consecutively only if the total length
  40  * of stored unprocessed data and the new supplied data is less than or equal
  41  * to the BLOCK_SIZE on which the compression functions operates.
  42  * Otherwise an assertion failure is invoked.
  43  */
  44 
  45 /* Specific algorithm definitions */
  46 #define EdonR224_DIGEST_SIZE    28
  47 #define EdonR224_BLOCK_SIZE     64
  48 #define EdonR256_DIGEST_SIZE    32
  49 #define EdonR256_BLOCK_SIZE     64
  50 #define EdonR384_DIGEST_SIZE    48
  51 #define EdonR384_BLOCK_SIZE     128
  52 #define EdonR512_DIGEST_SIZE    64
  53 #define EdonR512_BLOCK_SIZE     128
  54 
  55 #define EdonR256_BLOCK_BITSIZE  512
  56 #define EdonR512_BLOCK_BITSIZE  1024
  57 
  58 typedef struct {
  59         uint32_t DoublePipe[16];
  60         uint8_t LastPart[EdonR256_BLOCK_SIZE * 2];
  61 } EdonRData256;
  62 typedef struct {
  63         uint64_t DoublePipe[16];
  64         uint8_t LastPart[EdonR512_BLOCK_SIZE * 2];
  65 } EdonRData512;
  66 
  67 typedef struct {
  68         size_t hashbitlen;
  69 
  70         /* + algorithm specific parameters */
  71         int unprocessed_bits;
  72         uint64_t bits_processed;
  73         union {
  74                 EdonRData256 p256[1];
  75                 EdonRData512 p512[1];
  76         } pipe[1];
  77 } EdonRState;
  78 
  79 void EdonRInit(EdonRState *state, size_t hashbitlen);
  80 void EdonRUpdate(EdonRState *state, const uint8_t *data, size_t databitlen);
  81 void EdonRFinal(EdonRState *state, uint8_t *hashval);
  82 void EdonRHash(size_t hashbitlen, const uint8_t *data, size_t databitlen,
  83     uint8_t *hashval);
  84 
  85 #endif  /* __EDONR_H__ */