"Fossies" - the Fresh Open Source Software Archive

Member "tin-2.4.1/libcanlock/src/base64.c" (28 Aug 2013, 3712 Bytes) of package /linux/misc/tin-2.4.1.tar.gz:


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 Hšgskolan
    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 static char base64_chars[] = 
   43     "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
   44 
   45 static int 
   46 pos(char c)
   47 {
   48     char *p;
   49     for (p = base64_chars; *p; p++) {
   50         if (*p == c)
   51             return p - base64_chars;
   52     }
   53     return -1;
   54 }
   55 
   56 size_t
   57 base64_encode(const void *data, int size, char **str)
   58 {
   59     char *s, *p;
   60     int i;
   61     int c;
   62     const unsigned char *q;
   63 
   64     p = s = (char *) malloc(size * 4 / 3 + 4);
   65     if (p == NULL)
   66         return -1;
   67     q = (const unsigned char *) data;
   68     for (i = 0; i < size;) {
   69         c = q[i++];
   70         c *= 256;
   71         if (i < size)
   72             c += q[i];
   73         i++;
   74         c *= 256;
   75         if (i < size)
   76             c += q[i];
   77         i++;
   78         p[0] = base64_chars[(c & 0x00fc0000) >> 18];
   79         p[1] = base64_chars[(c & 0x0003f000) >> 12];
   80         p[2] = base64_chars[(c & 0x00000fc0) >> 6];
   81         p[3] = base64_chars[(c & 0x0000003f) >> 0];
   82         if (i > size)
   83             p[3] = '=';
   84         if (i > size + 1)
   85             p[2] = '=';
   86         p += 4;
   87     }
   88     *p = 0;
   89     *str = s;
   90     return strlen(s);
   91 }
   92 
   93 #define DECODE_ERROR 0xffffffff
   94 
   95 static unsigned int
   96 token_decode(const char *token)
   97 {
   98     int i;
   99     unsigned int val = 0;
  100     int marker = 0;
  101     if (strlen(token) < 4)
  102         return DECODE_ERROR;
  103     for (i = 0; i < 4; i++) {
  104         val *= 64;
  105         if (token[i] == '=')
  106             marker++;
  107         else if (marker > 0)
  108             return DECODE_ERROR;
  109         else
  110             val += pos(token[i]);
  111     }
  112     if (marker > 2)
  113         return DECODE_ERROR;
  114     return (marker << 24) | val;
  115 }
  116 
  117 size_t
  118 base64_decode(const char *str, void *data)
  119 {
  120     const char *p;
  121     unsigned char *q;
  122 
  123     q = data;
  124     for (p = str; *p && (*p == '=' || strchr(base64_chars, *p)); p += 4) {
  125         unsigned int val = token_decode(p);
  126         unsigned int marker = (val >> 24) & 0xff;
  127         if (val == DECODE_ERROR)
  128             return -1;
  129         *q++ = (val >> 16) & 0xff;
  130         if (marker < 2)
  131             *q++ = (val >> 8) & 0xff;
  132         if (marker < 1)
  133             *q++ = val & 0xff;
  134     }
  135     return q - (unsigned char *) data;
  136 }