/*
* RELIC is an Efficient LIbrary for Cryptography
* Copyright (c) 2009 RELIC Authors
*
* This file is part of RELIC. RELIC is legal property of its developers,
* whose names are not listed here. Please refer to the COPYRIGHT file
* for contact information.
*
* RELIC is free software; you can redistribute it and/or modify it under the
* terms of the version 2.1 (or later) of the GNU Lesser General Public License
* as published by the Free Software Foundation; or version 2.0 of the Apache
* License as published by the Apache Software Foundation. See the LICENSE files
* for more details.
*
* RELIC is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
* A PARTICULAR PURPOSE. See the LICENSE files for more details.
*
* You should have received a copy of the GNU Lesser General Public or the
* Apache License along with RELIC. If not, see
* or .
*/
/**
* @defgroup util Misc utilities
*/
/**
* @file
*
* Interface of misc utilitles.
*
* @ingroup util
*/
#ifndef RLC_UTIL_H
#define RLC_UTIL_H
#include "relic_arch.h"
#include "relic_types.h"
#include "relic_label.h"
/*============================================================================*/
/* Macro definitions */
/*============================================================================*/
/**
* Returns the minimum between two numbers.
*
* @param[in] A - the first number.
* @param[in] B - the second number.
*/
#define RLC_MIN(A, B) ((A) < (B) ? (A) : (B))
/**
* Returns the maximum between two numbers.
*
* @param[in] A - the first number.
* @param[in] B - the second number.
*/
#define RLC_MAX(A, B) ((A) > (B) ? (A) : (B))
/**
* Splits a bit count in a digit count and an updated bit count.
*
* @param[out] B - the resulting bit count.
* @param[out] D - the resulting digit count.
* @param[out] V - the bit count.
*/
#define RLC_RIP(B, D, V) \
D = (V) >> (RLC_DIG_LOG); B = (V) - ((D) * (1 << RLC_DIG_LOG));
/**
* Computes the ceiling function of an integer division.
*
* @param[in] A - the dividend.
* @param[in] B - the divisor.
*/
#define RLC_CEIL(A, B) (((A) - 1) / (B) + 1)
/**
* Returns a bit mask to isolate the lowest part of a digit.
*
* @param[in] B - the number of bits to isolate.
*/
#define RLC_MASK(B) \
((-(dig_t)((B) >= WSIZE)) | (((dig_t)1 << ((B) % WSIZE)) - 1))
/**
* Returns a bit mask to isolate the lowest half of a digit.
*/
#define RLC_LMASK (RLC_MASK(RLC_DIG >> 1))
/**
* Returns a bit mask to isolate the highest half of a digit.
*/
#define RLC_HMASK (RLC_LMASK << (RLC_DIG >> 1))
/**
* Bit mask used to return an entire digit.
*/
#define RLC_DMASK (RLC_HMASK | RLC_LMASK)
/**
* Returns the lowest half of a digit.
*
* @param[in] D - the digit.
*/
#define RLC_LOW(D) (D & RLC_LMASK)
/**
* Returns the highest half of a digit.
*
* @param[in] D - the digit.
*/
#define RLC_HIGH(D) (D >> (RLC_DIG >> 1))
/**
* Selects between two values based on the value of a given flag.
*
* @param[in] A - the first argument.
* @param[in] B - the second argument.
* @param[in] C - the selection flag.
*/
#define RLC_SEL(A, B, C) ((-(C) & ((A) ^ (B))) ^ (A))
/**
* Swaps two values.
*
* @param[in] A - the first argument.
* @param[in] B - the second argument.
*/
#define RLC_SWAP(A, B) ((A) ^= (B), (B) ^= (A), (A) ^= (B))
/**
* Returns the given character in upper case.
*
* @param[in] C - the character.
*/
#define RLC_UPP(C) ((C) - 0x20 * (((C) >= 'a') && ((C) <= 'z')))
/**
* Indirection to help some compilers expand symbols.
*/
#define RLC_ECHO(A) A
/**
* Concatenates two tokens.
*/
/** @{ */
#define RLC_CAT(A, B) _RLC_CAT(A, B)
#define _RLC_CAT(A, B) A ## B
/** @} */
/**
* Selects a basic or advanced version of a function by checking if an
* additional argument was passed.
*/
/** @{ */
#define RLC_OPT(...) _OPT(__VA_ARGS__, _imp, _basic, _error)
#define _OPT(...) RLC_ECHO(__OPT(__VA_ARGS__))
#define __OPT(_1, _2, N, ...) N
/** @} */
/**
* Selects a real or dummy printing function depending on library flags.
*
* @param[in] F - the format string.
*/
#ifndef QUIET
#define util_print(F, ...) util_printf(RLC_STR(F), ##__VA_ARGS__)
#else
#define util_print(F, ...) /* empty */
#endif
/**
* Prints a standard label.
*
* @param[in] L - the label of the banner.
* @param[in] I - if the banner is inside an hierarchy.
*/
#define util_banner(L, I) \
if (!I) { \
util_print("\n-- " L "\n"); \
} else { \
util_print("\n** " L "\n\n"); \
} \
/*============================================================================*/
/* Function prototypes */
/*============================================================================*/
/**
* Toggle endianess of a digit.
*/
uint32_t util_conv_endian(uint32_t i);
/**
* Convert a digit to big-endian.
*/
uint32_t util_conv_big(uint32_t i);
/**
* Convert a digit to little-endian.
*/
uint32_t util_conv_little(uint32_t i);
/**
* Converts a small digit to a character.
*/
char util_conv_char(dig_t i);
/**
* Returns the highest bit set on a digit.
*
* @param[in] a - the digit.
* @return the position of the highest bit set.
*/
int util_bits_dig(dig_t a);
/**
* Compares two buffers in constant time.
*
* @param[in] a - the first buffer.
* @param[in] b - the second buffer.
* @param[in] n - the length in bytes of the buffers.
* @return RLC_EQ if they are equal and RLC_NE otherwise.
*/
int util_cmp_const(const void *a, const void *b, int n);
/**
* Formats and prints data following a printf-like syntax.
*
* @param[in] format - the format.
* @param[in] ... - the list of arguments matching the format.
*/
void util_printf(const char *format, ...);
/**
* Prints a digit.
*
* @param[in] a - the digit to print.
* @param[in] pad - the flag to indicate if the digit must be padded
* with zeroes.
*/
void util_print_dig(dig_t a, int pad);
#endif /* !RLC_UTIL_H */