"Fossies" - the Fresh Open Source Software Archive

Member "tin-2.6.2/libcanlock/src/base64.c" (23 Aug 2021, 4015 Bytes) of package /linux/misc/tin-2.6.2.tar.xz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "base64.c" see the Fossies "Dox" file reference documentation.

    1 /*
    2  * Copyright (c) 1995-2001 Kungliga Tekniska Hogskolan
    3  * (Royal Institute of Technology, Stockholm, Sweden).
    4  * All rights reserved.
    5  *
    6  * Redistribution and use in source and binary forms, with or without
    7  * modification, are permitted provided that the following conditions
    8  * are met:
    9  *
   10  * 1. Redistributions of source code must retain the above copyright
   11  *    notice, this list of conditions and the following disclaimer.
   12  *
   13  * 2. Redistributions in binary form must reproduce the above copyright
   14  *    notice, this list of conditions and the following disclaimer in the
   15  *    documentation and/or other materials provided with the distribution.
   16  *
   17  * 3. Neither the name of the Institute nor the names of its contributors
   18  *    may be used to endorse or promote products derived from this software
   19  *    without specific prior written permission.
   20  *
   21  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
   22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
   25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   31  * SUCH DAMAGE.
   32  */
   33 
   34 #ifdef HAVE_CONFIG_H
   35 /* #include <config.h> */
   36 /* RCSID("$Id: base64.c,v 1.5 2001/05/28 17:33:41 joda Exp $") */
   37 #endif
   38 #include <stdlib.h>
   39 #include <string.h>
   40 #include "base64.h"
   41 
   42 
   43 static char base64_chars[] = 
   44     "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
   45 
   46 
   47 size_t base64_encode(const void *data, int size, char **str)
   48 {
   49    char *s, *p;
   50    int i;
   51    int c;
   52    const unsigned char *q;
   53 
   54    if (size <= 0)
   55       return 0;
   56    p = s = (char *) malloc((size_t) (size * 4 / 3 + 4));
   57    if (p == NULL)
   58       return 0;
   59    q = (const unsigned char *) data;
   60    for (i = 0; i < size;)
   61    {
   62       c = q[i++];
   63       c *= 256;
   64       if (i < size)
   65           c += q[i];
   66       i++;
   67       c *= 256;
   68       if (i < size)
   69           c += q[i];
   70       i++;
   71       p[0] = base64_chars[(c & 0x00fc0000) >> 18];
   72       p[1] = base64_chars[(c & 0x0003f000) >> 12];
   73       p[2] = base64_chars[(c & 0x00000fc0) >> 6];
   74       p[3] = base64_chars[(c & 0x0000003f) >> 0];
   75       if (i > size)
   76          p[3] = '=';
   77       if (i > size + 1)
   78          p[2] = '=';
   79       p += 4;
   80     }
   81     *p = 0;
   82     *str = s;
   83     return strlen(s);
   84 }
   85 
   86 
   87 #if 0 /* not used */
   88 static int pos(char c)
   89 {
   90    char *p;
   91    for (p = base64_chars; *p; p++)
   92    {
   93       if (*p == c)
   94          return p - base64_chars;
   95    }
   96    return -1;
   97 }
   98 
   99 
  100 #define DECODE_ERROR 0xffffffff
  101 
  102 static unsigned int token_decode(const char *token)
  103 {
  104    int i;
  105    unsigned int val = 0;
  106    int marker = 0;
  107 
  108    if (strlen(token) < 4)
  109       return DECODE_ERROR;
  110    for (i = 0; i < 4; i++) {
  111       val *= 64;
  112       if (token[i] == '=')
  113          marker++;
  114       else if (marker > 0)
  115          return DECODE_ERROR;
  116       else
  117          val += pos(token[i]);
  118    }
  119    if (marker > 2)
  120       return DECODE_ERROR;
  121    return (marker << 24) | val;
  122 }
  123 
  124 
  125 size_t base64_decode(const char *str, void *data)
  126 {
  127    const char *p;
  128    unsigned char *q;
  129 
  130    q = data;
  131    for (p = str; *p && (*p == '=' || strchr(base64_chars, *p)); p += 4)
  132    {
  133       unsigned int val = token_decode(p);
  134       unsigned int marker = (val >> 24) & 0xff;
  135       if (val == DECODE_ERROR)
  136          return 0;
  137       *q++ = (val >> 16) & 0xff;
  138       if (marker < 2)
  139          *q++ = (val >> 8) & 0xff;
  140       if (marker < 1)
  141          *q++ = val & 0xff;
  142    }
  143    /* 'q' can never be smaller than data (without 'size_t' overflow) */
  144    return (size_t) (q - (unsigned char *) data);
  145 }
  146 #endif /* 0 */