/* * cifra - embedded cryptography library * Written in 2014 by Joseph Birr-Pixton * * 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 * . */ #ifndef BLOCKWISE_H #define BLOCKWISE_H #include #include /* Processing function for cf_blockwise_accumulate. */ typedef void (*cf_blockwise_in_fn)(void *ctx, const uint8_t *data); /* Processing function for cf_blockwise_xor. */ typedef void (*cf_blockwise_out_fn)(void *ctx, uint8_t *data); /* This function manages the common abstraction of accumulating input in * a buffer, and processing it when a full block is available. * * partial is the buffer (maintained by the caller) * on entry, npartial is the currently valid count of used bytes on * the front of partial. * on exit, npartial is updated to reflect the status of partial. * nblock is the blocksize to accumulate -- partial must be at least * this long! * input is the new data to process, of length nbytes. * process is the processing function, passed ctx and a pointer * to the data to process (always exactly nblock bytes long!) * which may not neccessarily be the same as partial. */ void cf_blockwise_accumulate(uint8_t *partial, size_t *npartial, size_t nblock, const void *input, size_t nbytes, cf_blockwise_in_fn process, void *ctx); /* This function manages the common abstraction of accumulating input in * a buffer, and processing it when a full block is available. * This version supports calling a different processing function for * the last block. * * partial is the buffer (maintained by the caller) * on entry, npartial is the currently valid count of used bytes on * the front of partial. * on exit, npartial is updated to reflect the status of partial. * nblock is the blocksize to accumulate -- partial must be at least * this long! * input is the new data to process, of length nbytes. * process is the processing function, passed ctx and a pointer * to the data to process (always exactly nblock bytes long!) * which may not neccessarily be the same as partial. * process_final is called last (but may not be called at all if * all input is buffered). */ void cf_blockwise_accumulate_final(uint8_t *partial, size_t *npartial, size_t nblock, const void *input, size_t nbytes, cf_blockwise_in_fn process, cf_blockwise_in_fn process_final, void *ctx); /* This function processes a single byte a number of times. It's useful * for padding, and more efficient than calling cf_blockwise_accumulate * a bunch of times. * * partial is the buffer (maintained by the caller) * on entry, npartial is the currently valid count of used bytes on * the front of partial. * on exit, npartial is updated to reflect the status of partial. * nblock is the blocksize to accumulate -- partial must be at least * this long! * process is the processing function, passed ctx and a pointer * to the data to process (always exactly nblock bytes long!) * which may not neccessarily be the same as partial. * byte is the byte to process, nbytes times. */ void cf_blockwise_acc_byte(uint8_t *partial, size_t *npartial, size_t nblock, uint8_t byte, size_t nbytes, cf_blockwise_in_fn process, void *ctx); /* This function attempts to process patterns of bytes common in * block cipher padding. * * This takes three bytes: * - a first byte, fbyte, * - a middle byte, mbyte, * - a last byte, lbyte. * * If nbytes is zero, nothing happens. * If nbytes is one, the byte fbyte ^ lbyte is processed. * If nbytes is two, the fbyte then lbyte are processed. * If nbytes is three or more, fbyte, then one or more mbytes, then fbyte * is processed. * * partial is the buffer (maintained by the caller) * on entry, npartial is the currently valid count of used bytes on * the front of partial. * on exit, npartial is updated to reflect the status of partial. * nblock is the blocksize to accumulate -- partial must be at least * this long! * process is the processing function, passed ctx and a pointer * to the data to process (always exactly nblock bytes long!) * which may not neccessarily be the same as partial. */ void cf_blockwise_acc_pad(uint8_t *partial, size_t *npartial, size_t nblock, uint8_t fbyte, uint8_t mbyte, uint8_t lbyte, size_t nbytes, cf_blockwise_in_fn process, void *ctx); #endif