Skip to content
Snippets Groups Projects
base64.c 3.32 KiB
Newer Older
  • Learn to ignore specific revisions
  • Daniel Stenberg's avatar
    Daniel Stenberg committed
    /*****************************************************************************
     *                                  _   _ ____  _     
     *  Project                     ___| | | |  _ \| |    
     *                             / __| | | | |_) | |    
     *                            | (__| |_| |  _ <| |___ 
     *                             \___|\___/|_| \_\_____|
     *
     *  The contents of this file are subject to the Mozilla Public License
     *  Version 1.0 (the "License"); you may not use this file except in
     *  compliance with the License. You may obtain a copy of the License at
     *  http://www.mozilla.org/MPL/
     *
     *  Software distributed under the License is distributed on an "AS IS"
     *  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
     *  License for the specific language governing rights and limitations
     *  under the License.
     *
     *  The Original Code is Curl.
     *
     *  The Initial Developer of the Original Code is Daniel Stenberg.
     *
     *  Portions created by the Initial Developer are Copyright (C) 1998.
     *  All Rights Reserved.
     *
     * ------------------------------------------------------------
     * Main author:
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
     * - Daniel Stenberg <daniel@haxx.se>
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
     *
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
     * 	http://curl.haxx.se
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
     *
     * $Source$
     * $Revision$
     * $Date$
     * $Author$
     * $State$
     * $Locker$
     *
     * ------------------------------------------------------------
     ****************************************************************************/
    
    #include <stdio.h>
    
    /* ---- Base64 Encoding --- */
    static char table64[]=
      "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
      
    
    /*
     * base64Encode()
     *
     * Returns the length of the newly created base64 string. The third argument
     * is a pointer to an allocated area holding the base64 data. If something
     * went wrong, -1 is returned.
     *
     * Modifed my version to resemble the krb4 one. The krb4 sources then won't
     * need its own.
     *
     */
    int base64Encode(char *indata, int insize, char **outptr)
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
    {
      unsigned char ibuf[3];
      unsigned char obuf[4];
      int i;
      int inputparts;
    
      char *output;
      char *base64data;
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
    
    
      if(0 == insize)
        insize = strlen(indata);
    
      base64data = output = (char*)malloc(insize*4/3+4);
      if(NULL == output)
        return -1;
    
      while(insize > 0) {
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
        for (i = inputparts = 0; i < 3; i++) { 
    
          if(*indata) {
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
            inputparts++;
    
            ibuf[i] = *indata;
            indata++;
            insize--;
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
          }
          else
            ibuf[i] = 0;
        }
                           
        obuf [0] = (ibuf [0] & 0xFC) >> 2;
        obuf [1] = ((ibuf [0] & 0x03) << 4) | ((ibuf [1] & 0xF0) >> 4);
        obuf [2] = ((ibuf [1] & 0x0F) << 2) | ((ibuf [2] & 0xC0) >> 6);
        obuf [3] = ibuf [2] & 0x3F;
    
        switch(inputparts) {
        case 1: /* only one byte read */
          sprintf(output, "%c%c==", 
                  table64[obuf[0]],
                  table64[obuf[1]]);
          break;
        case 2: /* two bytes read */
          sprintf(output, "%c%c%c=", 
                  table64[obuf[0]],
                  table64[obuf[1]],
                  table64[obuf[2]]);
          break;
        default:
          sprintf(output, "%c%c%c%c", 
                  table64[obuf[0]],
                  table64[obuf[1]],
                  table64[obuf[2]],
                  table64[obuf[3]] );
          break;
        }
        output += 4;
      }
      *output=0;
    
      *outptr = base64data; /* make it return the actual data memory */
    
      return strlen(base64data); /* return the length of the new data */
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
    }
    /* ---- End of Base64 Encoding ---- */