123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- /*
- * cifra - embedded cryptography library
- * Written in 2014 by Joseph Birr-Pixton <jpixton@gmail.com>
- *
- * To the extent possible under law, the author(s) have dedicated all
- * copyright and related and neighboring rights to this software to the
- * public domain worldwide. This software is distributed without any
- * warranty.
- *
- * You should have received a copy of the CC0 Public Domain Dedication
- * along with this software. If not, see
- * <http://creativecommons.org/publicdomain/zero/1.0/>.
- */
- #ifndef CHASH_H
- #define CHASH_H
- #include <stddef.h>
- #include <stdint.h>
- /**
- * General hash function description
- * =================================
- * This allows us to make use of hash functions without depending
- * on a specific one. This is useful in implementing, for example,
- * :doc:`HMAC <hmac>`.
- */
- /* .. c:type:: cf_chash_init
- * Hashing initialisation function type.
- *
- * Functions of this type should initialise the context in preparation
- * for hashing a message with `cf_chash_update` functions.
- *
- * :rtype: void
- * :param ctx: hash function-specific context structure.
- */
- typedef void (*cf_chash_init)(void *ctx);
- /* .. c:type:: cf_chash_update
- * Hashing data processing function type.
- *
- * Functions of this type hash `count` bytes of data at `data`,
- * updating the contents of `ctx`.
- *
- * :rtype: void
- * :param ctx: hash function-specific context structure.
- * :param data: input data to hash.
- * :param count: number of bytes to hash.
- */
- typedef void (*cf_chash_update)(void *ctx, const void *data, size_t count);
- /* .. c:type:: cf_chash_digest
- * Hashing completion function type.
- *
- * Functions of this type complete a hashing operation,
- * writing :c:member:`cf_chash.hashsz` bytes to `hash`.
- *
- * This function does not change `ctx` -- any padding which needs doing
- * must be done seperately (in a copy of `ctx`, say).
- *
- * This means you can interlave `_update` and `_digest` calls to
- * learn `H(A)` and `H(A || B)` without hashing `A` twice.
- *
- * :rtype: void
- * :param ctx: hash function-specific context structure.
- * :param hash: location to write hash result.
- */
- typedef void (*cf_chash_digest)(const void *ctx, uint8_t *hash);
- /* .. c:type:: cf_chash
- * This type describes an incremental hash function in an abstract way.
- *
- * .. c:member:: cf_chash.hashsz
- * The hash function's output, in bytes.
- *
- * .. c:member:: cf_chash.blocksz
- * The hash function's internal block size, in bytes.
- *
- * .. c:member:: cf_chash.init
- * Context initialisation function.
- *
- * .. c:member:: cf_chash:update
- * Data processing function.
- *
- * .. c:member:: cf_chash:digest
- * Completion function.
- *
- */
- typedef struct
- {
- size_t hashsz;
- size_t blocksz;
- cf_chash_init init;
- cf_chash_update update;
- cf_chash_digest digest;
- } cf_chash;
- /* .. c:macro:: CF_CHASH_MAXCTX
- * The maximum size of a :c:type:`cf_chash_ctx`. This allows
- * use to put a structure in automatic storage that can
- * store working data for any supported hash function. */
- #define CF_CHASH_MAXCTX 360
- /* .. c:macro:: CF_CHASH_MAXBLK
- * Maximum hash function block size (in bytes). */
- #define CF_CHASH_MAXBLK 128
- /* .. c:macro:: CF_MAXHASH
- * Maximum hash function output (in bytes). */
- #define CF_MAXHASH 64
- /* .. c:type:: cf_chash_ctx
- * A type usable with any `cf_chash` as a context. */
- typedef union
- {
- uint8_t ctx[CF_CHASH_MAXCTX];
- uint16_t u16;
- uint32_t u32;
- uint64_t u64;
- } cf_chash_ctx;
- /* .. c:function:: $DECL
- * One shot hashing: `out = h(m)`.
- *
- * Using the hash function `h`, `nm` bytes at `m` are hashed and `h->hashsz` bytes
- * of result is written to the buffer `out`.
- *
- * :param h: hash function description.
- * :param m: message buffer.
- * :param nm: message length.
- * :param out: hash result buffer (written).
- */
- void cf_hash(const cf_chash *h, const void *m, size_t nm, uint8_t *out);
- #endif
|