github.com/krum110487/go-htaccess@v0.0.0-20240316004156-60641c8e7598/tests/data/apache_2_4_58/include/apr_encode.h (about)

     1  /* Licensed to the Apache Software Foundation (ASF) under one or more
     2   * contributor license agreements.  See the NOTICE file distributed with
     3   * this work for additional information regarding copyright ownership.
     4   * The ASF licenses this file to You under the Apache License, Version 2.0
     5   * (the "License"); you may not use this file except in compliance with
     6   * the License.  You may obtain a copy of the License at
     7   *
     8   *     http://www.apache.org/licenses/LICENSE-2.0
     9   *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS,
    12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   * See the License for the specific language governing permissions and
    14   * limitations under the License.
    15   */
    16  
    17  /**
    18   * @file apr_encode.h
    19   * @brief APR-UTIL Encoding
    20   */
    21  #ifndef APR_ENCODE_H
    22  #define APR_ENCODE_H
    23  
    24  #include "apr.h"
    25  #include "apr_general.h"
    26  
    27  #ifdef __cplusplus
    28  extern "C" {
    29  #endif
    30  
    31  /**
    32   * @defgroup APR_Util_Encode Base64/Base64Url/Base32/Base32Hex/Base16 Encoding
    33   * @ingroup APR_Util
    34   * @{
    35   */
    36  
    37  /**
    38   * RFC4648 and RFC7515 compliant BASE64, BASE64URL, BASE32, BASE32HEX
    39   * and BASE16 encode/decode functions.
    40   *
    41   * The following encodings are supported:
    42   *
    43   * - Base 64 Encoding
    44   *
    45   *   o Use flag APR_ENCODE_NONE
    46   *   o https://tools.ietf.org/html/rfc4648#section-4
    47   *
    48   * - Base 64 Encoding with URL and Filename Safe Alphabet
    49   *
    50   *   o Use flag APR_ENCODE_URL
    51   *   o https://tools.ietf.org/html/rfc4648#section-5
    52   *
    53   * - Base 64 URL Encoding without Padding
    54   *
    55   *   o Use flag APR_ENCODE_BASE64URL
    56   *   o https://tools.ietf.org/html/rfc7515#appendix-C
    57   *
    58   * - Base 32 Encoding
    59   *
    60   *   o Use flag APR_ENCODE_NONE
    61   *   o https://tools.ietf.org/html/rfc4648#section-6
    62   *
    63   * - Base 32 Encoding with Extended Hex Alphabet
    64   *
    65   *   o Use flag APR_ENCODE_BASE32HEX
    66   *   o https://tools.ietf.org/html/rfc4648#section-7
    67   *
    68   * - Base 16 Encoding
    69   *
    70   *   o Use flags APR_ENCODE_NONE/APR_ENCODE_COLON
    71   *   o https://tools.ietf.org/html/rfc4648#section-8
    72   *
    73   * If a non valid character of any kind including whitespace is passed to any
    74   * of the decoder functions, APR_BADCH will be returned. In this case decoding
    75   * will still take place, but the results can not be trusted.
    76   *
    77   * If APR_ENCODE_RELAXED is passed to the decoder functions, decoding will be
    78   * attempted up until the first non valid character. If this results in an
    79   * invalid state in the decoder, such as but not limited to an odd number of
    80   * base16 characters, APR_BADCH will still be returned.
    81   *
    82   * If APR_ENCODE_RELAXED is not passed to a decoder function, the decoding will
    83   * be done in constant time regardless of whether the result returns APR_SUCCESS
    84   * or APR_BADCH.
    85   *
    86   * If the dest parameter is NULL, the maximum theoretical buffer size is
    87   * returned in the len field, including space for a terminating zero character
    88   * if the destination is a string. This value can be used to allocate buffers
    89   * of a suitable safe size.
    90   *
    91   * If the dest parameter is provided, the encoding or decoding will take place,
    92   * and the actual number of characters written is returned in the len field,
    93   * ignoring any terminating zero.
    94   *
    95   * Plain strings are not assumed '\0' terminated unless APR_ENCODE_STRING is
    96   * provided.
    97   *
    98   */
    99  
   100  /**
   101   * When passing a string to one of the encode functions, this value can be
   102   * passed to indicate a string-valued key, and have the length computed
   103   * automatically.
   104   */
   105  #define APR_ENCODE_STRING      (-1)
   106  
   107  /**
   108   * Generate RFC4648 base16/base32/base64.
   109   */
   110  #define APR_ENCODE_NONE 0
   111  
   112  /**
   113   * If relaxed, decode up until the first non base16/base32/base64 character.
   114   */
   115  #define APR_ENCODE_RELAXED 1
   116  
   117  /**
   118   * Omit the padding character (=) while encoding.
   119   */
   120  #define APR_ENCODE_NOPADDING 2
   121  
   122  /**
   123   * Generate RFC4648 Base 64 Encoding with URL and Filename Safe Alphabet
   124   */
   125  #define APR_ENCODE_URL 4
   126  
   127  /**
   128   * Generate RFC7515 BASE64URL
   129   */
   130  #define APR_ENCODE_BASE64URL (APR_ENCODE_NOPADDING | APR_ENCODE_URL)
   131  
   132  /**
   133   * Generate base32hex encoding instead of base32 encoding
   134   */
   135  #define APR_ENCODE_BASE32HEX 8
   136  
   137  /**
   138   * Generate base16 with colons between each token.
   139   */
   140  #define APR_ENCODE_COLON 16
   141  
   142  /**
   143   * Generate base16 with lower case characters.
   144   */
   145  #define APR_ENCODE_LOWER 32
   146  
   147  /**
   148   * Convert text data to base64.
   149   * @param dest The destination string, can be NULL to output in \c len the
   150   *  needed buffer length for encoding.
   151   * @param src The original string, can be NULL if \c dest is NULL and \c slen
   152   *  is positive or nul.
   153   * @param slen The length of the original string, or APR_ENCODE_STRING if
   154   *  the actual length should be computed based on NUL termination.
   155   * @param flags If APR_ENCODE_NONE, emit RFC4648 Base 64 Encoding. If
   156   *  APR_ENCODE_NOPADDING, omit the = padding character.	If APR_ENCODE_URL,
   157   *  use RFC4648 Base 64 Encoding with URL and Filename Safe Alphabet.
   158   *  If APR_ENCODE_BASE64URL, use RFC7515 base64url Encoding.
   159   * @param len If not NULL, outputs the length of the buffer needed for encoding
   160   *  (including the trailing NUL) if \c dest is NULL, or the actual length of
   161   *  the encoding (excluding the trailing NUL) if \c dest is not NULL.
   162   * @return APR_SUCCESS, or APR_EINVAL if \c slen is not APR_ENCODE_STRING and
   163   *  negative, or APR_NOTFOUND if \c dest is not NULL and \c src is NULL, or
   164   *  APR_ENOSPC if \c dest is NULL and the source length (based on \c slen or
   165   *  APR_ENCODE_STRING) is too big to encode.
   166   */
   167  APR_DECLARE(apr_status_t) apr_encode_base64(char *dest, const char *src,
   168          apr_ssize_t slen, int flags, apr_size_t * len);
   169  
   170  /**
   171   * Convert binary data to base64.
   172   * @param dest The destination string, can be NULL to output in \c len the
   173   *  needed buffer length for encoding.
   174   * @param src The original buffer, can be NULL if \c dest is NULL.
   175   * @param slen The length of the original buffer.
   176   * @param flags If APR_ENCODE_NONE, emit RFC4648 Base 64 Encoding. If
   177   *  APR_ENCODE_NOPADDING, omit the = padding character.	If APR_ENCODE_URL,
   178   *  use RFC4648 Base 64 Encoding with URL and Filename Safe Alphabet.
   179   *  If APR_ENCODE_BASE64URL, use RFC7515 base64url Encoding.
   180   * @param len If not NULL, outputs the length of the buffer needed for encoding
   181   *  (including the trailing NUL) if \c dest is NULL, or the actual length of
   182   *  the encoding (excluding the trailing NUL) if \c dest is not NULL.
   183   * @return APR_SUCCESS, or APR_EINVAL if \c slen is negative, or APR_NOTFOUND
   184   *  if \c dest is not NULL and \c src is NULL, or APR_ENOSPC if \c dest is NULL
   185   *  and the source length (based on \c slen or APR_ENCODE_STRING) is too big to
   186   *  encode.
   187   */
   188  APR_DECLARE(apr_status_t) apr_encode_base64_binary(char *dest, const unsigned char *src,
   189          apr_ssize_t slen, int flags, apr_size_t * len);
   190  
   191  /**
   192   * Convert text data to base64, and return the results from a pool.
   193   * @param p Pool to allocate from.
   194   * @param src The original string.
   195   * @param slen The length of the original string, or APR_ENCODE_STRING if
   196   *  the actual length should be computed based on NUL termination.
   197   * @param flags If APR_ENCODE_NONE, emit RFC4648 Base 64 Encoding. If
   198   *  APR_ENCODE_NOPADDING, omit the = padding character.	If APR_ENCODE_URL,
   199   *  use RFC4648 Base 64 Encoding with URL and Filename Safe Alphabet.
   200   *  If APR_ENCODE_BASE64URL, use RFC7515 base64url Encoding.
   201   * @param len If not NULL, outputs the length of the encoding (excluding the
   202   *  trailing NUL).
   203   * @return A NUL terminated string allocated from the pool on success,
   204   *  or NULL if src is NULL or allocation failed or the encoding is not
   205   *  possible (see apr_encode_base64 errors).
   206   */
   207  APR_DECLARE(const char *)apr_pencode_base64(apr_pool_t * p, const char *src,
   208          apr_ssize_t slen, int flags, apr_size_t * len)__attribute__((nonnull(1)));
   209  
   210  /**
   211   * Convert binary data to base64, and return the results from a pool.
   212   * @param p Pool to allocate from.
   213   * @param src The original buffer.
   214   * @param slen The length of the original buffer.
   215   * @param flags If APR_ENCODE_NONE, emit RFC4648 Base 64 Encoding. If
   216   *  APR_ENCODE_NOPADDING, omit the = padding character.	If APR_ENCODE_URL,
   217   *  use RFC4648 Base 64 Encoding with URL and Filename Safe Alphabet.
   218   *  If APR_ENCODE_BASE64URL, use RFC7515 base64url Encoding.
   219   * @param len If not NULL, outputs the length of the encoding (excluding the
   220   *  trailing NUL).
   221   * @return A NUL terminated string allocated from the pool on success,
   222   *  or NULL if src is NULL or allocation failed or the encoding is not
   223   *  possible (see apr_encode_base64_binary errors).
   224   */
   225  APR_DECLARE(const char *)apr_pencode_base64_binary(apr_pool_t * p, const unsigned char *src,
   226          apr_ssize_t slen, int flags, apr_size_t * len)__attribute__((nonnull(1)));
   227  
   228  /**
   229   * Convert base64 or base64url with or without padding to text data.
   230   * @param dest The destination string, can be NULL to output in \c len the
   231   *  needed buffer length for decoding.
   232   * @param src The base64 string, can be NULL if \c dest is NULL and \c slen
   233   *  is positive or nul.
   234   * @param slen The length of the base64 string, or APR_ENCODE_STRING if
   235   *  the actual length should be computed based on NUL termination.
   236   * @param flags If APR_ENCODE_NONE, attempt to decode the full base64 string,
   237   *  and return NULL if any bad character is detected. If APR_ENCODE_RELAXED,
   238   *  decode until the first non base64/base64url character.
   239   * @param len If not NULL, outputs the length of the buffer needed for decoding
   240   *  (including the trailing NUL) if \c dest is NULL, or the actual length of
   241   *  the decoding (excluding the trailing NUL) if \c dest is not NULL.
   242   * @return APR_SUCCESS, or APR_EINVAL if \c slen is not APR_ENCODE_STRING and
   243   *  negative, or APR_NOTFOUND if \c dest is not NULL and \c src is NULL, or
   244   *  APR_ENOSPC if \c dest is NULL and the source length (based on \c slen or
   245   *  APR_ENCODE_STRING) is too big to decode, or APR_EINCOMPLETE if the source
   246   *  length (based on \c slen or APR_ENCODE_STRING) is invalid for a base64
   247   *  encoding, or APR_BADCH if a non base64 character is present and
   248   *  APR_ENCODE_RELAXED is not specified.
   249   */
   250  APR_DECLARE(apr_status_t) apr_decode_base64(char *dest, const char *src,
   251          apr_ssize_t slen, int flags, apr_size_t * len);
   252  
   253  /**
   254   * Convert base64 or base64url with or without padding to binary data.
   255   * @param dest The destination string, can be NULL to output in \c len the
   256   *  needed buffer length for decoding.
   257   * @param src The base64 string, can be NULL if \c dest is NULL and \c slen
   258   *  is positive or nul.
   259   * @param slen The length of the base64 string, or APR_ENCODE_STRING if
   260   *  the actual length should be computed based on NUL termination.
   261   * @param flags If APR_ENCODE_NONE, attempt to decode the full base64 string,
   262   *  and return NULL if any bad character is detected. If APR_ENCODE_RELAXED,
   263   *  decode until the first non base64/base64url character.
   264   * @param len If not NULL, outputs the length of the buffer needed for decoding
   265   *  (including the trailing NUL) if \c dest is NULL, or the actual length of
   266   *  the decoding (excluding the trailing NUL) if \c dest is not NULL.
   267   * @return APR_SUCCESS, or APR_EINVAL if \c slen is not APR_ENCODE_STRING and
   268   *  negative, or APR_NOTFOUND if \c dest is not NULL and \c src is NULL, or
   269   *  APR_ENOSPC if \c dest is NULL and the source length (based on \c slen or
   270   *  APR_ENCODE_STRING) is too big to decode, or APR_EINCOMPLETE if the source
   271   *  length (based on \c slen or APR_ENCODE_STRING) is invalid for a base64
   272   *  encoding, or APR_BADCH if a non base64 character is present and
   273   *  APR_ENCODE_RELAXED is not specified.
   274   */
   275  APR_DECLARE(apr_status_t) apr_decode_base64_binary(unsigned char *dest,
   276          const char *src, apr_ssize_t slen, int flags, apr_size_t * len);
   277  
   278  /**
   279   * Convert base64 or base64url with or without padding to text data, and
   280   * return the results from a pool.
   281   * @param p Pool to allocate from.
   282   * @param src The base64 string to decode.
   283   * @param slen The length of the original string, or APR_ENCODE_STRING if
   284   *  the actual length should be computed based on NUL termination.
   285   * @param flags If APR_ENCODE_NONE, attempt to decode the full original buffer,
   286   *  and return NULL if any bad character is detected. If APR_ENCODE_RELAXED,
   287   *  decode until the first non base64/base64url character.
   288   * @param len If not NULL, outputs the length of the decoding (excluding the
   289   *  trailing NUL).
   290   * @return A NUL terminated string allocated from the pool on success,
   291   *  or NULL if src is NULL or allocation failed or the decoding is not
   292   *  possible (see apr_decode_base64_binary errors).
   293   */
   294  APR_DECLARE(const char *)apr_pdecode_base64(apr_pool_t * p, const char *src,
   295          apr_ssize_t slen, int flags, apr_size_t * len)
   296          __attribute__((nonnull(1)));
   297  
   298  /**
   299   * Convert base64 or base64url with or without padding to binary data, and
   300   * return the results from a pool.
   301   * @param p Pool to allocate from.
   302   * @param src The base64 string to decode.
   303   * @param slen The length of the original string, or APR_ENCODE_STRING if
   304   *  the actual length should be computed based on NUL termination.
   305   * @param flags If APR_ENCODE_NONE, attempt to decode the full original buffer,
   306   *  and return NULL if any bad character is detected. If APR_ENCODE_RELAXED,
   307   *  decode until the first non base64/base64url character.
   308   * @param len If not NULL, outputs the length of the decoding (excluding the
   309   *  trailing NUL).
   310   * @return A NUL terminated string allocated from the pool on success,
   311   *  or NULL if src is NULL or allocation failed or the decoding is not
   312   *  possible (see apr_decode_base64_binary errors).
   313   */
   314  APR_DECLARE(const unsigned char *)apr_pdecode_base64_binary(apr_pool_t * p,
   315          const char *src, apr_ssize_t slen, int flags, apr_size_t * len)
   316          __attribute__((nonnull(1)));
   317  
   318  /**
   319   * Convert text data to base32.
   320   * @param dest The destination string, can be NULL to output in \c len the
   321   *  needed buffer length for encoding.
   322   * @param src The original string, can be NULL if \c dest is NULL and \c slen
   323   *  is positive or nul.
   324   * @param slen The length of the original string, or APR_ENCODE_STRING if
   325   *  the actual length should be computed based on NUL termination.
   326   * @param flags If APR_ENCODE_NONE, emit RFC4648 Base 32 Encoding. If
   327   *  APR_ENCODE_NOPADDING, omit the = padding character.	If APR_ENCODE_BASE32HEX,
   328   *  use RFC4648 base32hex Encoding.
   329   * @param len If not NULL, outputs the length of the buffer needed for encoding
   330   *  (including the trailing NUL) if \c dest is NULL, or the actual length of
   331   *  the encoding (excluding the trailing NUL) if \c dest is not NULL.
   332   * @return APR_SUCCESS, or APR_EINVAL if \c slen is not APR_ENCODE_STRING and
   333   *  negative, or APR_NOTFOUND if \c dest is not NULL and \c src is NULL, or
   334   *  APR_ENOSPC if \c dest is NULL and the source length (based on \c slen or
   335   *  APR_ENCODE_STRING) is too big to encode.
   336   */
   337  APR_DECLARE(apr_status_t) apr_encode_base32(char *dest, const char *src,
   338          apr_ssize_t slen, int flags, apr_size_t * len);
   339  
   340  /**
   341   * Convert binary data to base32.
   342   * @param dest The destination string, can be NULL to output in \c len the
   343   *  needed buffer length for encoding.
   344   * @param src The original buffer, can be NULL if \c dest is NULL.
   345   * @param slen The length of the original buffer.
   346   * @param flags If APR_ENCODE_NONE, emit RFC4648 Base 32 Encoding. If
   347   *  APR_ENCODE_NOPADDING, omit the = padding character.	If APR_ENCODE_BASE32HEX,
   348   *  use RFC4648 base32hex Encoding.
   349   * @param len If not NULL, outputs the length of the buffer needed for encoding
   350   *  (including the trailing NUL) if \c dest is NULL, or the actual length of
   351   *  the encoding (excluding the trailing NUL) if \c dest is not NULL.
   352   * @return APR_SUCCESS, or APR_EINVAL if \c slen is negative, or APR_NOTFOUND
   353   *  if \c dest is not NULL and \c src is NULL, or APR_ENOSPC if \c dest is NULL
   354   *  and the source length (based on \c slen or APR_ENCODE_STRING) is too big to
   355   *  encode.
   356   */
   357  APR_DECLARE(apr_status_t) apr_encode_base32_binary(char *dest, const unsigned char *src,
   358          apr_ssize_t slen, int flags, apr_size_t * len);
   359  
   360  /**
   361   * Convert text data to base32, and return the results from a pool.
   362   * @param p Pool to allocate from.
   363   * @param src The original string.
   364   * @param slen The length of the original string, or APR_ENCODE_STRING if
   365   *  the actual length should be computed based on NUL termination.
   366   * @param flags If APR_ENCODE_NONE, emit RFC4648 Base 32 Encoding. If
   367   *  APR_ENCODE_NOPADDING, omit the = padding character.	If APR_ENCODE_BASE32HEX,
   368   *  use RFC4648 base32hex Encoding.
   369   * @param len If not NULL, outputs the length of the encoding (excluding the
   370   *  trailing NUL).
   371   * @return A NUL terminated string allocated from the pool on success,
   372   *  or NULL if src is NULL or allocation failed or the encoding is not
   373   *  possible (see apr_encode_base32 errors).
   374   */
   375  APR_DECLARE(const char *)apr_pencode_base32(apr_pool_t * p, const char *src,
   376          apr_ssize_t slen, int flags, apr_size_t * len)
   377          __attribute__((nonnull(1)));
   378  
   379  /**
   380   * Convert binary data to base32, and return the results from a pool.
   381   * @param p Pool to allocate from.
   382   * @param src The original buffer.
   383   * @param slen The length of the original buffer.
   384   * @param flags If APR_ENCODE_NONE, emit RFC4648 Base 32 Encoding. If
   385   *  APR_ENCODE_NOPADDING, omit the = padding character.	If APR_ENCODE_BASE32HEX,
   386   *  use RFC4648 base32hex Encoding.
   387   * @param len If not NULL, outputs the length of the encoding (excluding the
   388   *  trailing NUL).
   389   * @return A NUL terminated string allocated from the pool on success,
   390   *  or NULL if src is NULL or allocation failed or the encoding is not
   391   *  possible (see apr_encode_base32_binary errors).
   392   */
   393  APR_DECLARE(const char *)apr_pencode_base32_binary(apr_pool_t * p, const unsigned char *src,
   394          apr_ssize_t slen, int flags, apr_size_t * len)
   395          __attribute__((nonnull(1)));
   396  
   397  /**
   398   * Convert base32 or base32hex with or without padding to text data.
   399   * @param dest The destination string, can be NULL to output in \c len the
   400   *  needed buffer length for decoding.
   401   * @param src The base32 string, can be NULL if \c dest is NULL and \c slen
   402   *  is positive or nul.
   403   * @param slen The length of the base32 string, or APR_ENCODE_STRING if
   404   *  the actual length should be computed based on NUL termination.
   405   * @param flags If APR_ENCODE_NONE, parse RFC4648 Base 32 Encoding. If
   406   *  APR_ENCODE_BASE32HEX, use RFC4648 base32hex Encoding.
   407   * @param len If not NULL, outputs the length of the buffer needed for decoding
   408   *  (including the trailing NUL) if \c dest is NULL, or the actual length of
   409   *  the decoding (excluding the trailing NUL) if \c dest is not NULL.
   410   * @return APR_SUCCESS, or APR_EINVAL if \c slen is not APR_ENCODE_STRING and
   411   *  negative, or APR_NOTFOUND if \c dest is not NULL and \c src is NULL, or
   412   *  APR_ENOSPC if \c dest is NULL and the source length (based on \c slen or
   413   *  APR_ENCODE_STRING) is too big to decode, or APR_EINCOMPLETE if the source
   414   *  length (based on \c slen or APR_ENCODE_STRING) is invalid for a base32
   415   *  encoding, or APR_BADCH if a non base32 character is present and
   416   *  APR_ENCODE_RELAXED is not specified.
   417   */
   418  APR_DECLARE(apr_status_t) apr_decode_base32(char *dest, const char *src,
   419          apr_ssize_t slen, int flags, apr_size_t * len);
   420  
   421  /**
   422   * Convert base32 or base32hex with or without padding to binary data.
   423   * @param dest The destination string, can be NULL to output in \c len the
   424   *  needed buffer length for decoding.
   425   * @param src The base32 string, can be NULL if \c dest is NULL and \c slen
   426   *  is positive or nul.
   427   * @param slen The length of the base32 string, or APR_ENCODE_STRING if
   428   *  the actual length should be computed based on NUL termination.
   429   * @param flags If APR_ENCODE_NONE, parse RFC4648 Base 32 Encoding. If
   430   *  APR_ENCODE_BASE32HEX, use RFC4648 base32hex Encoding.
   431   * @param len If not NULL, outputs the length of the buffer needed for decoding
   432   *  (including the trailing NUL) if \c dest is NULL, or the actual length of
   433   *  the decoding (excluding the trailing NUL) if \c dest is not NULL.
   434   * @return APR_SUCCESS, or APR_EINVAL if \c slen is not APR_ENCODE_STRING and
   435   *  negative, or APR_NOTFOUND if \c dest is not NULL and \c src is NULL, or
   436   *  APR_ENOSPC if \c dest is NULL and the source length (based on \c slen or
   437   *  APR_ENCODE_STRING) is too big to decode, or APR_EINCOMPLETE if the source
   438   *  length (based on \c slen or APR_ENCODE_STRING) is invalid for a base32
   439   *  encoding, or APR_BADCH if a non base32 character is present and
   440   *  APR_ENCODE_RELAXED is not specified.
   441   */
   442  APR_DECLARE(apr_status_t) apr_decode_base32_binary(unsigned char *dest,
   443          const char *src, apr_ssize_t slen, int flags, apr_size_t * len);
   444  
   445  /**
   446   * Convert base32 or base32hex with or without padding to text data, and
   447   * return the results from a pool.
   448   * @param p Pool to allocate from.
   449   * @param src The base32 string to decode.
   450   * @param slen The length of the original string, or APR_ENCODE_STRING if
   451   *  the actual length should be computed based on NUL termination.
   452   * @param flags If APR_ENCODE_NONE, parse RFC4648 Base 32 Encoding. If
   453   *  APR_ENCODE_BASE32HEX, use RFC4648 base32hex Encoding.
   454   * @param len If not NULL, outputs the length of the encoding (excluding the
   455   *  trailing NUL).
   456   * @return A NUL terminated string allocated from the pool on success,
   457   *  or NULL if src is NULL or allocation failed or the decoding is not
   458   *  possible (see apr_decode_base32 errors).
   459   */
   460  APR_DECLARE(const char *)apr_pdecode_base32(apr_pool_t * p, const char *src,
   461          apr_ssize_t slen, int flags, apr_size_t * len)
   462          __attribute__((nonnull(1)));
   463  
   464  /**
   465   * Convert base32 or base32hex with or without padding to binary data, and
   466   * return the results from a pool.
   467   * @param p Pool to allocate from.
   468   * @param src The base32 string to decode.
   469   * @param slen The length of the original string, or APR_ENCODE_STRING if
   470   *  the actual length should be computed based on NUL termination.
   471   * @param flags If APR_ENCODE_NONE, parse RFC4648 Base 32 Encoding. If
   472   *  APR_ENCODE_BASE32HEX, use RFC4648 base32hex Encoding.
   473   * @param len If not NULL, outputs the length of the encoding (excluding the
   474   *  trailing NUL).
   475   * @return A NUL terminated string allocated from the pool on success,
   476   *  or NULL if src is NULL or allocation failed or the decoding is not
   477   *  possible (see apr_decode_base32_binary errors).
   478   */
   479  APR_DECLARE(const unsigned char *)apr_pdecode_base32_binary(apr_pool_t * p,
   480          const char *src, apr_ssize_t slen, int flags, apr_size_t * len)
   481          __attribute__((nonnull(1)));
   482  
   483  /**
   484   * Convert text data to base16 (hex).
   485   * @param dest The destination string, can be NULL to output in \c len the
   486   *  needed buffer length for encoding.
   487   * @param src The original string, can be NULL if \c dest is NULL and \c slen
   488   *  is positive or nul.
   489   * @param slen The length of the original string, or APR_ENCODE_STRING if
   490   *  the actual length should be computed based on NUL termination.
   491   * @param flags If APR_ENCODE_NONE, emit RFC4648 Base 16 Encoding. If
   492   *  APR_ENCODE_COLON, separate each token with a colon.
   493   * @param len If not NULL, outputs the length of the buffer needed for encoding
   494   *  (including the trailing NUL) if \c dest is NULL, or the actual length of
   495   *  the encoding (excluding the trailing NUL) if \c dest is not NULL.
   496   * @return APR_SUCCESS, or APR_EINVAL if \c slen is not APR_ENCODE_STRING and
   497   *  negative, or APR_NOTFOUND if \c dest is not NULL and \c src is NULL, or
   498   *  APR_ENOSPC if \c dest is NULL and the source length (based on \c slen or
   499   *  APR_ENCODE_STRING) is too big to encode.
   500   */
   501  APR_DECLARE(apr_status_t) apr_encode_base16(char *dest, const char *src,
   502          apr_ssize_t slen, int flags, apr_size_t * len);
   503  
   504  /**
   505   * Convert binary data to base16 (hex).
   506   * @param dest The destination string, can be NULL to output in \c len the
   507   *  needed buffer length for encoding.
   508   * @param src The original buffer, can be NULL if \c dest is NULL.
   509   * @param slen The length of the original buffer.
   510   * @param flags If APR_ENCODE_NONE, emit RFC4648 Base 16 Encoding. If
   511   *  APR_ENCODE_COLON, separate each token with a colon.
   512   * @param len If not NULL, outputs the length of the buffer needed for encoding
   513   *  (including the trailing NUL) if \c dest is NULL, or the actual length of
   514   *  the encoding (excluding the trailing NUL) if \c dest is not NULL.
   515   * @return APR_SUCCESS, or APR_EINVAL if \c slen is negative, or APR_NOTFOUND
   516   *  if \c dest is not NULL and \c src is NULL, or APR_ENOSPC if \c dest is NULL
   517   *  and the source length (based on \c slen or APR_ENCODE_STRING) is too big to
   518   *  encode.
   519   */
   520  APR_DECLARE(apr_status_t) apr_encode_base16_binary(char *dest,
   521          const unsigned char *src, apr_ssize_t slen, int flags,
   522          apr_size_t * len);
   523  
   524  /**
   525   * Convert text data to base16 (hex), and return the results from a
   526   * pool.
   527   * @param p Pool to allocate from.
   528   * @param src The original string.
   529   * @param slen The length of the original string, or APR_ENCODE_STRING if
   530   *  the actual length should be computed based on NUL termination.
   531   * @param flags If APR_ENCODE_NONE, emit RFC4648 Base 16 Encoding. If
   532   *  APR_ENCODE_COLON, separate each token with a colon.
   533   * @param len If not NULL, outputs the length of the encoding (excluding the
   534   *  trailing NUL).
   535   * @return A NUL terminated string allocated from the pool on success,
   536   *  or NULL if src is NULL or allocation failed or the encoding is not
   537   *  possible (see apr_encode_base16 errors).
   538   */
   539  APR_DECLARE(const char *)apr_pencode_base16(apr_pool_t * p, const char *src,
   540          apr_ssize_t slen, int flags, apr_size_t * len)
   541          __attribute__((nonnull(1)));
   542  
   543  /**
   544   * Convert binary data to base16 (hex), and return the results from a
   545   * pool.
   546   * @param p Pool to allocate from.
   547   * @param src The original buffer.
   548   * @param slen The length of the original buffer.
   549   * @param flags If APR_ENCODE_NONE, emit RFC4648 Base 16 Encoding. If
   550   *  APR_ENCODE_COLON, separate each token with a colon.
   551   * @param len If not NULL, outputs the length of the encoding (excluding the
   552   *  trailing NUL).
   553   * @return A NUL terminated string allocated from the pool on success,
   554   *  or NULL if src is NULL or allocation failed or the encoding is not
   555   *  possible (see apr_encode_base16_binary errors).
   556   */
   557  APR_DECLARE(const char *)apr_pencode_base16_binary(apr_pool_t * p,
   558          const unsigned char *src, apr_ssize_t slen,
   559          int flags, apr_size_t * len)__attribute__((nonnull(1)));
   560  
   561  /**
   562   * Convert base16 (hex) to text data.
   563   * @param dest The destination string, can be NULL to output in \c len the
   564   *  needed buffer length for decoding.
   565   * @param src The base16 string, can be NULL if \c dest is NULL and \c slen
   566   *  is positive or nul.
   567   * @param slen The length of the base16 string, or APR_ENCODE_STRING if
   568   *  the actual length should be computed based on NUL termination.
   569   * @param flags If APR_ENCODE_NONE, parse RFC4648 Base 16 Encoding. If
   570   *  APR_ENCODE_COLON, allow tokens to be separated with a colon.
   571   * @param len If not NULL, outputs the length of the buffer needed for decoding
   572   *  (including the trailing NUL) if \c dest is NULL, or the actual length of
   573   *  the decoding (excluding the trailing NUL) if \c dest is not NULL.
   574   * @return APR_SUCCESS, or APR_EINVAL if \c slen is not APR_ENCODE_STRING and
   575   *  negative, or APR_NOTFOUND if \c dest is not NULL and \c src is NULL, or
   576   *  APR_ENOSPC if \c dest is NULL and the source length (based on \c slen or
   577   *  APR_ENCODE_STRING) is too big to decode, or APR_EINCOMPLETE if the source
   578   *  length (based on \c slen or APR_ENCODE_STRING) is invalid for a base16
   579   *  encoding, or APR_BADCH if a non base16 character is present and
   580   *  APR_ENCODE_RELAXED is not specified.
   581   */
   582  APR_DECLARE(apr_status_t) apr_decode_base16(char *dest, const char *src,
   583          apr_ssize_t slen, int flags, apr_size_t * len);
   584  
   585  /**
   586   * Convert base16 (hex) to binary data.
   587   * @param dest The destination string, can be NULL to output in \c len the
   588   *  needed buffer length for decoding.
   589   * @param src The base16 string, can be NULL if \c dest is NULL and \c slen
   590   *  is positive or nul.
   591   * @param slen The length of the base16 string, or APR_ENCODE_STRING if
   592   *  the actual length should be computed based on NUL termination.
   593   * @param flags If APR_ENCODE_NONE, parse RFC4648 Base 16 Encoding. If
   594   *  APR_ENCODE_COLON, allow tokens to be separated with a colon.
   595   * @param len If not NULL, outputs the length of the buffer needed for decoding
   596   *  (including the trailing NUL) if \c dest is NULL, or the actual length of
   597   *  the decoding (excluding the trailing NUL) if \c dest is not NULL.
   598   * @return APR_SUCCESS, or APR_EINVAL if \c slen is not APR_ENCODE_STRING and
   599   *  negative, or APR_NOTFOUND if \c dest is not NULL and \c src is NULL, or
   600   *  APR_ENOSPC if \c dest is NULL and the source length (based on \c slen or
   601   *  APR_ENCODE_STRING) is too big to decode, or APR_EINCOMPLETE if the source
   602   *  length (based on \c slen or APR_ENCODE_STRING) is invalid for a base16
   603   *  encoding, or APR_BADCH if a non base16 character is present and
   604   *  APR_ENCODE_RELAXED is not specified.
   605   */
   606  APR_DECLARE(apr_status_t) apr_decode_base16_binary(unsigned char *dest,
   607          const char *src, apr_ssize_t slen, int flags, apr_size_t * len);
   608  
   609  /**
   610   * Convert base16 (hex) and return the results from a pool.
   611   * @param p Pool to allocate from.
   612   * @param src The base16 string to decode.
   613   * @param slen The length of the original string, or APR_ENCODE_STRING if
   614   *  the actual length should be computed based on NUL termination.
   615   * @param flags If APR_ENCODE_NONE, parse RFC4648 Base 16 Encoding. If
   616   *  APR_ENCODE_COLON, allow tokens to be separated with a colon.
   617   * @param len If not NULL, outputs the length of the encoding (excluding the
   618   *  trailing NUL).
   619   * @return A NUL terminated string allocated from the pool on success,
   620   *  or NULL if src is NULL or allocation failed or the decoding is not
   621   *  possible (see apr_decode_base16 errors).
   622   */
   623  APR_DECLARE(const char *)apr_pdecode_base16(apr_pool_t * p, const char *src,
   624          apr_ssize_t slen, int flags, apr_size_t * len)
   625          __attribute__((nonnull(1)));
   626  
   627  /**
   628   * Convert base16 (hex) to binary data, and return the results from a pool.
   629   * @param p Pool to allocate from.
   630   * @param src The base16 string to decode.
   631   * @param slen The length of the original string, or APR_ENCODE_STRING if
   632   *  the actual length should be computed based on NUL termination.
   633   * @param flags If APR_ENCODE_NONE, parse RFC4648 Base 16 Encoding. If
   634   *  APR_ENCODE_COLON, allow tokens to be separated with a colon.
   635   * @param len If not NULL, outputs the length of the encoding (excluding the
   636   *  trailing NUL).
   637   * @return A NUL terminated string allocated from the pool on success,
   638   *  or NULL if src is NULL or allocation failed or the decoding is not
   639   *  possible (see apr_decode_base16_binary errors).
   640   */
   641  APR_DECLARE(const unsigned char *)apr_pdecode_base16_binary(apr_pool_t * p,
   642          const char *src, apr_ssize_t slen, int flags, apr_size_t * len)
   643          __attribute__((nonnull(1)));
   644  
   645  /** @} */
   646  #ifdef __cplusplus
   647  }
   648  #endif
   649  
   650  #endif                          /* !APR_ENCODE_H */