diff options
| -rw-r--r-- | sha3.h | 180 | 
1 files changed, 176 insertions, 4 deletions
| @@ -612,12 +612,14 @@ void tuplehash256_xof_squeeze(sha3_xof_t *xof, uint8_t *dst, const size_t len);   */  void tuplehash256_xof_once(const tuplehash_params_t params, uint8_t *dst, const size_t len); +// ParallelHash configuration parameters.  typedef struct {    const size_t block_len; // block size, in bytes    const uint8_t *custom; // customization string    const size_t custom_len; // length of customization string, in bytes  } parallelhash_params_t; +// ParallelHash context.  typedef struct {    sha3_xof_t root_xof, // root xof               curr_xof; // xof for current block (note: shake128, not cshake128) @@ -627,17 +629,187 @@ typedef struct {    _Bool squeezing; // current state  } parallelhash_t; +/** + * Initialize internal ParallelHash128 (NIST SP 800-185, section 6) + * context with configuration parameters `params`, then squeeze + * `dst_len` bytes of output from internal context into destination + * buffer `dst`. + * + * Note: This implementation of ParallelHash128 is sequential, not + * parallel. + * + * Note: This implementation of ParallelHash128 is sequential, not + * @param[in] params ParallelHash128 configuration parameters. + * @param[in] src Input data buffer. + * @param[in] src_len Input data buffer length, in bytes. + * @param[out] dst Destination buffer. + * @param[in] len Destination buffer length, in bytes. + */  void parallelhash128(const parallelhash_params_t params, const uint8_t *src, const size_t src_len, uint8_t *dst, const size_t dst_len); + +/** + * Initialize internal ParallelHash256 (NIST SP 800-185, section 6) + * context with configuration parameters `params`, then squeeze + * `dst_len` bytes of output from internal context into destination + * buffer `dst`. + * + * Note: This implementation of ParallelHash256 is sequential, not + * parallel. + * + * @param[in] params ParallelHash256 configuration parameters. + * @param[in] src Input data buffer. + * @param[in] src_len Input data buffer length, in bytes. + * @param[out] dst Destination buffer. + * @param[in] len Destination buffer length, in bytes. + */  void parallelhash256(const parallelhash_params_t params, const uint8_t *src, const size_t src_len, uint8_t *dst, const size_t dst_len); +/** + * Initialize ParallelHash128 XOF (ParallelHash eXtendable Output + * Function, as defined in section 6.3.1 of NIST SP 800-185) context + * with configuration parameters `params`. + * + * Note: ParallelHash128 and ParallelHash128 XOF produce different + * output, because ParallelHash128 encodes the fixed output size as part + * of the input while ParallelHash128 XOF does not.  See section 6.3.1 + * of NIST SP 800-185 for details. + * + * Note: This implementation of ParallelHash128 is sequential, not + * parallel. + * + * @param[out] xof ParallelHash128 XOF context. + * @param[in] params ParallelHash configuration parameters. + */  void parallelhash128_xof_init(parallelhash_t *hash, const parallelhash_params_t params); -void parallelhash128_xof_absorb(parallelhash_t *hash, const uint8_t *msg, const size_t msg_len); -void parallelhash128_xof_squeeze(parallelhash_t *hash, uint8_t *dst, const size_t dst_len); + +/** + * Absorb data in buffer `src` of length `len` bytes into + * ParallelHash128 XOF context.  Can be called iteratively to absorb + * input data in chunks. + * + * Note: This implementation of ParallelHash128 is sequential, not + * parallel. + * + * @param[in/out] hash ParallelHash128 XOF context. + * @param[in] src Input data buffer. + * @param[in] len Input data buffer length, in bytes. + */ +void parallelhash128_xof_absorb(parallelhash_t *hash, const uint8_t *src, const size_t len); + +/** + * Squeeze `len` bytes data into output buffer `dst` from ParallelHash128 + * XOF context `xof`.  Can be called iteratively to squeeze output data + * in chunks. + * + * Note: ParallelHash128 and ParallelHash128 XOF produce different + * output, because ParallelHash128 encodes the fixed output size as part + * of the input while ParallelHash128 XOF does not.  See section 6.3.1 + * of NIST SP 800-185 for details. + * + * Note: This implementation of ParallelHash128 is sequential, not + * parallel. + * + * @param[in/out] xof ParallelHash128 XOF context. + * @param[out] dst Destination buffer. + * @param[in] len Destination buffer length, in bytes. + */ +void parallelhash128_xof_squeeze(parallelhash_t *hash, uint8_t *dst, const size_t len); + +/** + * Initialize internal ParallelHash128 XOF (ParallelHash eXtendable + * Output Function, as defined in section 6.3.1 of NIST SP 800-185) + * context with configuration parameters `params`, absorb data in buffer + * `src` of length `src_len` bytes into context, thenqueeze `dst_len` + * bytes data into output buffer `dst`. + * + * Note: ParallelHash128 and ParallelHash128 XOF produce different + * output, because ParallelHash128 encodes the fixed output size as part + * of the input while ParallelHash128 XOF does not.  See section 6.3.1 + * of NIST SP 800-185 for details. + * + * Note: This implementation of ParallelHash128 is sequential, not + * parallel. + * + * @param[in] params ParallelHash configuration parameters. + * @param[in] src Input data buffer. + * @param[in] src_len Input data buffer length, in bytes. + * @param[out] dst Destination buffer. + * @param[in] dst_len Destination buffer length, in bytes. + */  void parallelhash128_xof_once(const parallelhash_params_t params, const uint8_t *src, const size_t src_len, uint8_t *dst, const size_t dst_len); +/** + * Initialize ParallelHash256 XOF (ParallelHash eXtendable Output + * Function, as defined in section 6.3.1 of NIST SP 800-185) context + * with configuration parameters `params`. + * + * Note: ParallelHash256 and ParallelHash256 XOF produce different + * output, because ParallelHash256 encodes the fixed output size as part + * of the input while ParallelHash256 XOF does not.  See section 6.3.1 + * of NIST SP 800-185 for details. + * + * Note: This implementation of ParallelHash256 is sequential, not + * parallel. + * + * @param[out] xof ParallelHash256 XOF context. + * @param[in] params ParallelHash configuration parameters. + */  void parallelhash256_xof_init(parallelhash_t *hash, const parallelhash_params_t params); -void parallelhash256_xof_absorb(parallelhash_t *hash, const uint8_t *msg, const size_t msg_len); -void parallelhash256_xof_squeeze(parallelhash_t *hash, uint8_t *dst, const size_t dst_len); + +/** + * Absorb data in buffer `src` of length `len` bytes into + * ParallelHash256 XOF context.  Can be called iteratively to absorb + * input data in chunks. + * + * Note: This implementation of ParallelHash256 is sequential, not + * parallel. + * + * @param[in/out] hash ParallelHash256 XOF context. + * @param[in] src Input data buffer. + * @param[in] len Input data buffer length, in bytes. + */ +void parallelhash256_xof_absorb(parallelhash_t *hash, const uint8_t *src, const size_t len); + +/** + * Squeeze `len` bytes data into output buffer `dst` from ParallelHash256 + * XOF context `xof`.  Can be called iteratively to squeeze output data + * in chunks. + * + * Note: ParallelHash256 and ParallelHash256 XOF produce different + * output, because ParallelHash256 encodes the fixed output size as part + * of the input while ParallelHash256 XOF does not.  See section 6.3.1 + * of NIST SP 800-185 for details. + * + * Note: This implementation of ParallelHash256 is sequential, not + * parallel. + * + * @param[in/out] xof ParallelHash256 XOF context. + * @param[out] dst Destination buffer. + * @param[in] len Destination buffer length, in bytes. + */ +void parallelhash256_xof_squeeze(parallelhash_t *hash, uint8_t *dst, const size_t len); + +/** + * Initialize internal ParallelHash256 XOF (ParallelHash eXtendable + * Output Function, as defined in section 6.3.1 of NIST SP 800-185) + * context with configuration parameters `params`, absorb data in buffer + * `src` of length `src_len` bytes into context, thenqueeze `dst_len` + * bytes data into output buffer `dst`. + * + * Note: ParallelHash256 and ParallelHash256 XOF produce different + * output, because ParallelHash256 encodes the fixed output size as part + * of the input while ParallelHash256 XOF does not.  See section 6.3.1 + * of NIST SP 800-185 for details. + * + * Note: This implementation of ParallelHash256 is sequential, not + * parallel. + * + * @param[in] params ParallelHash configuration parameters. + * @param[in] src Input data buffer. + * @param[in] src_len Input data buffer length, in bytes. + * @param[out] dst Destination buffer. + * @param[in] dst_len Destination buffer length, in bytes. + */  void parallelhash256_xof_once(const parallelhash_params_t params, const uint8_t *src, const size_t src_len, uint8_t *dst, const size_t dst_len);  #ifdef __cplusplus | 
