The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/contrib/openzfs/include/sys/skein.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * Interface declarations for Skein hashing.
    3  * Source code author: Doug Whiting, 2008.
    4  * This algorithm and source code is released to the public domain.
    5  *
    6  * The following compile-time switches may be defined to control some
    7  * tradeoffs between speed, code size, error checking, and security.
    8  *
    9  * The "default" note explains what happens when the switch is not defined.
   10  *
   11  *  SKEIN_DEBUG            -- make callouts from inside Skein code
   12  *                            to examine/display intermediate values.
   13  *                            [default: no callouts (no overhead)]
   14  *
   15  *  SKEIN_ERR_CHECK        -- how error checking is handled inside Skein
   16  *                            code. If not defined, most error checking
   17  *                            is disabled (for performance). Otherwise,
   18  *                            the switch value is interpreted as:
   19  *                                0: use assert()      to flag errors
   20  *                                1: return SKEIN_FAIL to flag errors
   21  */
   22 /* Copyright 2013 Doug Whiting. This code is released to the public domain. */
   23 #ifndef _SYS_SKEIN_H_
   24 #define _SYS_SKEIN_H_
   25 
   26 #ifdef  _KERNEL
   27 #include <sys/types.h>          /* get size_t definition */
   28 #else
   29 #include <stdint.h>
   30 #include <stdlib.h>
   31 #endif
   32 
   33 #ifdef  __cplusplus
   34 extern "C" {
   35 #endif
   36 
   37 enum {
   38         SKEIN_SUCCESS = 0,      /* return codes from Skein calls */
   39         SKEIN_FAIL = 1,
   40         SKEIN_BAD_HASHLEN = 2
   41 };
   42 
   43 #define SKEIN_MODIFIER_WORDS    (2)     /* number of modifier (tweak) words */
   44 
   45 #define SKEIN_256_STATE_WORDS   (4)
   46 #define SKEIN_512_STATE_WORDS   (8)
   47 #define SKEIN1024_STATE_WORDS   (16)
   48 #define SKEIN_MAX_STATE_WORDS   (16)
   49 
   50 #define SKEIN_256_STATE_BYTES   (8 * SKEIN_256_STATE_WORDS)
   51 #define SKEIN_512_STATE_BYTES   (8 * SKEIN_512_STATE_WORDS)
   52 #define SKEIN1024_STATE_BYTES   (8 * SKEIN1024_STATE_WORDS)
   53 
   54 #define SKEIN_256_STATE_BITS    (64 * SKEIN_256_STATE_WORDS)
   55 #define SKEIN_512_STATE_BITS    (64 * SKEIN_512_STATE_WORDS)
   56 #define SKEIN1024_STATE_BITS    (64 * SKEIN1024_STATE_WORDS)
   57 
   58 #define SKEIN_256_BLOCK_BYTES   (8 * SKEIN_256_STATE_WORDS)
   59 #define SKEIN_512_BLOCK_BYTES   (8 * SKEIN_512_STATE_WORDS)
   60 #define SKEIN1024_BLOCK_BYTES   (8 * SKEIN1024_STATE_WORDS)
   61 
   62 typedef struct {
   63         size_t hashBitLen;      /* size of hash result, in bits */
   64         size_t bCnt;            /* current byte count in buffer b[] */
   65         /* tweak words: T[0]=byte cnt, T[1]=flags */
   66         uint64_t T[SKEIN_MODIFIER_WORDS];
   67 } Skein_Ctxt_Hdr_t;
   68 
   69 typedef struct {                /*  256-bit Skein hash context structure */
   70         Skein_Ctxt_Hdr_t h;     /* common header context variables */
   71         uint64_t X[SKEIN_256_STATE_WORDS];      /* chaining variables */
   72         /* partial block buffer (8-byte aligned) */
   73         uint8_t b[SKEIN_256_BLOCK_BYTES];
   74 } Skein_256_Ctxt_t;
   75 
   76 typedef struct {                /*  512-bit Skein hash context structure */
   77         Skein_Ctxt_Hdr_t h;     /* common header context variables */
   78         uint64_t X[SKEIN_512_STATE_WORDS];      /* chaining variables */
   79         /* partial block buffer (8-byte aligned) */
   80         uint8_t b[SKEIN_512_BLOCK_BYTES];
   81 } Skein_512_Ctxt_t;
   82 
   83 typedef struct {                /* 1024-bit Skein hash context structure */
   84         Skein_Ctxt_Hdr_t h;     /* common header context variables */
   85         uint64_t X[SKEIN1024_STATE_WORDS];      /* chaining variables */
   86         /* partial block buffer (8-byte aligned) */
   87         uint8_t b[SKEIN1024_BLOCK_BYTES];
   88 } Skein1024_Ctxt_t;
   89 
   90 /*   Skein APIs for (incremental) "straight hashing" */
   91 int Skein_256_Init(Skein_256_Ctxt_t *ctx, size_t hashBitLen);
   92 int Skein_512_Init(Skein_512_Ctxt_t *ctx, size_t hashBitLen);
   93 int Skein1024_Init(Skein1024_Ctxt_t *ctx, size_t hashBitLen);
   94 
   95 int Skein_256_Update(Skein_256_Ctxt_t *ctx, const uint8_t *msg,
   96     size_t msgByteCnt);
   97 int Skein_512_Update(Skein_512_Ctxt_t *ctx, const uint8_t *msg,
   98     size_t msgByteCnt);
   99 int Skein1024_Update(Skein1024_Ctxt_t *ctx, const uint8_t *msg,
  100     size_t msgByteCnt);
  101 
  102 int Skein_256_Final(Skein_256_Ctxt_t *ctx, uint8_t *hashVal);
  103 int Skein_512_Final(Skein_512_Ctxt_t *ctx, uint8_t *hashVal);
  104 int Skein1024_Final(Skein1024_Ctxt_t *ctx, uint8_t *hashVal);
  105 
  106 /*
  107  * Skein APIs for "extended" initialization: MAC keys, tree hashing.
  108  * After an InitExt() call, just use Update/Final calls as with Init().
  109  *
  110  * Notes: Same parameters as _Init() calls, plus treeInfo/key/keyBytes.
  111  *          When keyBytes == 0 and treeInfo == SKEIN_SEQUENTIAL,
  112  *              the results of InitExt() are identical to calling Init().
  113  *          The function Init() may be called once to "precompute" the IV for
  114  *              a given hashBitLen value, then by saving a copy of the context
  115  *              the IV computation may be avoided in later calls.
  116  *          Similarly, the function InitExt() may be called once per MAC key
  117  *              to precompute the MAC IV, then a copy of the context saved and
  118  *              reused for each new MAC computation.
  119  */
  120 int Skein_256_InitExt(Skein_256_Ctxt_t *ctx, size_t hashBitLen,
  121     uint64_t treeInfo, const uint8_t *key, size_t keyBytes);
  122 int Skein_512_InitExt(Skein_512_Ctxt_t *ctx, size_t hashBitLen,
  123     uint64_t treeInfo, const uint8_t *key, size_t keyBytes);
  124 int Skein1024_InitExt(Skein1024_Ctxt_t *ctx, size_t hashBitLen,
  125     uint64_t treeInfo, const uint8_t *key, size_t keyBytes);
  126 
  127 /*
  128  * Skein APIs for MAC and tree hash:
  129  *      Final_Pad: pad, do final block, but no OUTPUT type
  130  *      Output:    do just the output stage
  131  */
  132 int Skein_256_Final_Pad(Skein_256_Ctxt_t *ctx, uint8_t *hashVal);
  133 int Skein_512_Final_Pad(Skein_512_Ctxt_t *ctx, uint8_t *hashVal);
  134 int Skein1024_Final_Pad(Skein1024_Ctxt_t *ctx, uint8_t *hashVal);
  135 
  136 #ifndef SKEIN_TREE_HASH
  137 #define SKEIN_TREE_HASH (1)
  138 #endif
  139 #if     SKEIN_TREE_HASH
  140 int Skein_256_Output(Skein_256_Ctxt_t *ctx, uint8_t *hashVal);
  141 int Skein_512_Output(Skein_512_Ctxt_t *ctx, uint8_t *hashVal);
  142 int Skein1024_Output(Skein1024_Ctxt_t *ctx, uint8_t *hashVal);
  143 #endif
  144 
  145 /*
  146  * When you initialize a Skein KCF hashing method you can pass this param
  147  * structure in cm_param to fine-tune the algorithm's defaults.
  148  */
  149 typedef struct skein_param {
  150         size_t  sp_digest_bitlen;               /* length of digest in bits */
  151 } skein_param_t;
  152 
  153 /* Module definitions */
  154 #ifdef  SKEIN_MODULE_IMPL
  155 #define CKM_SKEIN_256                           "CKM_SKEIN_256"
  156 #define CKM_SKEIN_512                           "CKM_SKEIN_512"
  157 #define CKM_SKEIN1024                           "CKM_SKEIN1024"
  158 #define CKM_SKEIN_256_MAC                       "CKM_SKEIN_256_MAC"
  159 #define CKM_SKEIN_512_MAC                       "CKM_SKEIN_512_MAC"
  160 #define CKM_SKEIN1024_MAC                       "CKM_SKEIN1024_MAC"
  161 
  162 typedef enum skein_mech_type {
  163         SKEIN_256_MECH_INFO_TYPE,
  164         SKEIN_512_MECH_INFO_TYPE,
  165         SKEIN1024_MECH_INFO_TYPE,
  166         SKEIN_256_MAC_MECH_INFO_TYPE,
  167         SKEIN_512_MAC_MECH_INFO_TYPE,
  168         SKEIN1024_MAC_MECH_INFO_TYPE
  169 } skein_mech_type_t;
  170 
  171 #define VALID_SKEIN_DIGEST_MECH(__mech)                         \
  172         ((int)(__mech) >= SKEIN_256_MECH_INFO_TYPE &&           \
  173         (__mech) <= SKEIN1024_MECH_INFO_TYPE)
  174 #define VALID_SKEIN_MAC_MECH(__mech)                            \
  175         ((int)(__mech) >= SKEIN_256_MAC_MECH_INFO_TYPE &&       \
  176         (__mech) <= SKEIN1024_MAC_MECH_INFO_TYPE)
  177 #endif  /* SKEIN_MODULE_IMPL */
  178 
  179 #ifdef  __cplusplus
  180 }
  181 #endif
  182 
  183 #endif  /* _SYS_SKEIN_H_ */

Cache object: 939a35d0504adbcac89eb5ce706ebd3d


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.