libsodium (1.0.19)

(root)/
include/
sodium/
utils.h
       1  
       2  #ifndef sodium_utils_H
       3  #define sodium_utils_H
       4  
       5  #include <stddef.h>
       6  
       7  #include "export.h"
       8  
       9  #ifdef __cplusplus
      10  extern "C" {
      11  #endif
      12  
      13  #ifndef SODIUM_C99
      14  # if defined(__cplusplus) || !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L
      15  #  define SODIUM_C99(X)
      16  # else
      17  #  define SODIUM_C99(X) X
      18  # endif
      19  #endif
      20  
      21  SODIUM_EXPORT
      22  void sodium_memzero(void * const pnt, const size_t len);
      23  
      24  SODIUM_EXPORT
      25  void sodium_stackzero(const size_t len);
      26  
      27  /*
      28   * WARNING: sodium_memcmp() must be used to verify if two secret keys
      29   * are equal, in constant time.
      30   * It returns 0 if the keys are equal, and -1 if they differ.
      31   * This function is not designed for lexicographical comparisons.
      32   */
      33  SODIUM_EXPORT
      34  int sodium_memcmp(const void * const b1_, const void * const b2_, size_t len)
      35              __attribute__ ((warn_unused_result));
      36  
      37  /*
      38   * sodium_compare() returns -1 if b1_ < b2_, 1 if b1_ > b2_ and 0 if b1_ == b2_
      39   * It is suitable for lexicographical comparisons, or to compare nonces
      40   * and counters stored in little-endian format.
      41   * However, it is slower than sodium_memcmp().
      42   */
      43  SODIUM_EXPORT
      44  int sodium_compare(const unsigned char *b1_, const unsigned char *b2_,
      45                     size_t len) __attribute__ ((warn_unused_result));
      46  
      47  SODIUM_EXPORT
      48  int sodium_is_zero(const unsigned char *n, const size_t nlen);
      49  
      50  SODIUM_EXPORT
      51  void sodium_increment(unsigned char *n, const size_t nlen);
      52  
      53  SODIUM_EXPORT
      54  void sodium_add(unsigned char *a, const unsigned char *b, const size_t len);
      55  
      56  SODIUM_EXPORT
      57  void sodium_sub(unsigned char *a, const unsigned char *b, const size_t len);
      58  
      59  SODIUM_EXPORT
      60  char *sodium_bin2hex(char * const hex, const size_t hex_maxlen,
      61                       const unsigned char * const bin, const size_t bin_len)
      62              __attribute__ ((nonnull(1)));
      63  
      64  SODIUM_EXPORT
      65  int sodium_hex2bin(unsigned char * const bin, const size_t bin_maxlen,
      66                     const char * const hex, const size_t hex_len,
      67                     const char * const ignore, size_t * const bin_len,
      68                     const char ** const hex_end)
      69              __attribute__ ((nonnull(1)));
      70  
      71  #define sodium_base64_VARIANT_ORIGINAL            1
      72  #define sodium_base64_VARIANT_ORIGINAL_NO_PADDING 3
      73  #define sodium_base64_VARIANT_URLSAFE             5
      74  #define sodium_base64_VARIANT_URLSAFE_NO_PADDING  7
      75  
      76  /*
      77   * Computes the required length to encode BIN_LEN bytes as a base64 string
      78   * using the given variant. The computed length includes a trailing \0.
      79   */
      80  #define sodium_base64_ENCODED_LEN(BIN_LEN, VARIANT) \
      81      (((BIN_LEN) / 3U) * 4U + \
      82      ((((BIN_LEN) - ((BIN_LEN) / 3U) * 3U) | (((BIN_LEN) - ((BIN_LEN) / 3U) * 3U) >> 1)) & 1U) * \
      83       (4U - (~((((VARIANT) & 2U) >> 1) - 1U) & (3U - ((BIN_LEN) - ((BIN_LEN) / 3U) * 3U)))) + 1U)
      84  
      85  SODIUM_EXPORT
      86  size_t sodium_base64_encoded_len(const size_t bin_len, const int variant);
      87  
      88  SODIUM_EXPORT
      89  char *sodium_bin2base64(char * const b64, const size_t b64_maxlen,
      90                          const unsigned char * const bin, const size_t bin_len,
      91                          const int variant) __attribute__ ((nonnull(1)));
      92  
      93  SODIUM_EXPORT
      94  int sodium_base642bin(unsigned char * const bin, const size_t bin_maxlen,
      95                        const char * const b64, const size_t b64_len,
      96                        const char * const ignore, size_t * const bin_len,
      97                        const char ** const b64_end, const int variant)
      98              __attribute__ ((nonnull(1)));
      99  
     100  SODIUM_EXPORT
     101  int sodium_mlock(void * const addr, const size_t len)
     102              __attribute__ ((nonnull));
     103  
     104  SODIUM_EXPORT
     105  int sodium_munlock(void * const addr, const size_t len)
     106              __attribute__ ((nonnull));
     107  
     108  /* WARNING: sodium_malloc() and sodium_allocarray() are not general-purpose
     109   * allocation functions.
     110   *
     111   * They return a pointer to a region filled with 0xd0 bytes, immediately
     112   * followed by a guard page.
     113   * As a result, accessing a single byte after the requested allocation size
     114   * will intentionally trigger a segmentation fault.
     115   *
     116   * A canary and an additional guard page placed before the beginning of the
     117   * region may also kill the process if a buffer underflow is detected.
     118   *
     119   * The memory layout is:
     120   * [unprotected region size (read only)][guard page (no access)][unprotected pages (read/write)][guard page (no access)]
     121   * With the layout of the unprotected pages being:
     122   * [optional padding][16-bytes canary][user region]
     123   *
     124   * However:
     125   * - These functions are significantly slower than standard functions
     126   * - Each allocation requires 3 or 4 additional pages
     127   * - The returned address will not be aligned if the allocation size is not
     128   *   a multiple of the required alignment. For this reason, these functions
     129   *   are designed to store data, such as secret keys and messages.
     130   *
     131   * sodium_malloc() can be used to allocate any libsodium data structure.
     132   *
     133   * The crypto_generichash_state structure is packed and its length is
     134   * either 357 or 361 bytes. For this reason, when using sodium_malloc() to
     135   * allocate a crypto_generichash_state structure, padding must be added in
     136   * order to ensure proper alignment. crypto_generichash_statebytes()
     137   * returns the rounded up structure size, and should be preferred to sizeof():
     138   * state = sodium_malloc(crypto_generichash_statebytes());
     139   */
     140  
     141  SODIUM_EXPORT
     142  void *sodium_malloc(const size_t size)
     143              __attribute__ ((malloc));
     144  
     145  SODIUM_EXPORT
     146  void *sodium_allocarray(size_t count, size_t size)
     147              __attribute__ ((malloc));
     148  
     149  SODIUM_EXPORT
     150  void sodium_free(void *ptr);
     151  
     152  SODIUM_EXPORT
     153  int sodium_mprotect_noaccess(void *ptr) __attribute__ ((nonnull));
     154  
     155  SODIUM_EXPORT
     156  int sodium_mprotect_readonly(void *ptr) __attribute__ ((nonnull));
     157  
     158  SODIUM_EXPORT
     159  int sodium_mprotect_readwrite(void *ptr) __attribute__ ((nonnull));
     160  
     161  SODIUM_EXPORT
     162  int sodium_pad(size_t *padded_buflen_p, unsigned char *buf,
     163                 size_t unpadded_buflen, size_t blocksize, size_t max_buflen)
     164              __attribute__ ((nonnull(2)));
     165  
     166  SODIUM_EXPORT
     167  int sodium_unpad(size_t *unpadded_buflen_p, const unsigned char *buf,
     168                   size_t padded_buflen, size_t blocksize)
     169              __attribute__ ((nonnull(2)));
     170  
     171  /* -------- */
     172  
     173  int _sodium_alloc_init(void);
     174  
     175  #ifdef __cplusplus
     176  }
     177  #endif
     178  
     179  #endif