You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by su...@apache.org on 2004/03/31 15:49:00 UTC

cvs commit: ws-axis/c/src/soap HexCoder.h HexCoder.cpp apr_base64.h apr_base64.c

susantha    2004/03/31 05:49:00

  Added:       c/src/soap HexCoder.h HexCoder.cpp apr_base64.h apr_base64.c
  Log:
  base64Binary and hexBinary encode/decode functionality
  
  Revision  Changes    Path
  1.1                  ws-axis/c/src/soap/HexCoder.h
  
  Index: HexCoder.h
  ===================================================================
  #if !defined(_HEXCODER_H____INCLUDED_)
  #define _HEXCODER_H____INCLUDED_
  
  int Hex_Encode(char * coded_dst, const unsigned char *plain_src, int len_plain_src);
  int Hex_Decode(unsigned char * plain_dst, const char *coded_src);
  
  #endif
  
  
  
  1.1                  ws-axis/c/src/soap/HexCoder.cpp
  
  Index: HexCoder.cpp
  ===================================================================
  #include "HexCoder.h"
  
  const static char s_HexToNumTable[128]=
  {
  	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  //00  - 15
  	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  //16  - 31
  	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  //32  - 47
  	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0,  //48  - 63
  	0,10,11,12,13,14,15, 0, 0, 0, 0, 0, 0, 0, 0, 0,  //64  - 79
  	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  //80  - 95
  	0,10,11,12,13,14,15, 0, 0, 0, 0, 0, 0, 0, 0, 0,  //96  - 111
  	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  //112 - 127
  };
  	
  const static char s_NumToHexTable[16] =
  {
  	'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
  };
  
  int Hex_Encode(char * coded_dst, const unsigned char *plain_src, int len_plain_src)
  {
  	const unsigned char *cur = plain_src;
  	const unsigned char *end = cur + len_plain_src;
  	while(cur < end)
  	{
  		*coded_dst = s_NumToHexTable[(*cur) >> 4];
  		coded_dst++;
  		*coded_dst = s_NumToHexTable[(*cur)& 0x0f];
  		coded_dst++;
  		cur++;
  	}
  	return 0;
  }
  
  int Hex_Decode(unsigned char * plain_dst, const char *coded_src)
  {
  	unsigned char* curr = plain_dst;
  	while (*coded_src != '\0')
  	{
  		*curr = (s_HexToNumTable[*coded_src] << 4) | s_HexToNumTable[*(coded_src+1)];
  		curr++;
  		coded_src+=2;
  	}
  	return (int)(curr-plain_dst);
  }
  
  
  
  1.1                  ws-axis/c/src/soap/apr_base64.h
  
  Index: apr_base64.h
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2000-2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * The apr_vsnprintf/apr_snprintf functions are based on, and used with the
   * permission of, the  SIO stdio-replacement strx_* functions by Panos
   * Tsirigotis <pa...@alumni.cs.colorado.edu> for xinetd.
   */
  
  /**
   * @file apr_base64.h
   * @brief APR-UTIL Base64 Encoding
   */
  #ifndef APR_BASE64_H
  #define APR_BASE64_H
  
  //#include "apu.h"
  //#include "apr_general.h"
  
  #define APU_DECLARE(x) x
  
  #ifdef __cplusplus
  extern "C" {
  #endif
  
  /**
   * @defgroup APR_Util_Base64 Base64 Encoding
   * @ingroup APR_Util
   * @{
   */
  
  /* Simple BASE64 encode/decode functions.
   * 
   * As we might encode binary strings, hence we require the length of
   * the incoming plain source. And return the length of what we decoded.
   *
   * The decoding function takes any non valid char (i.e. whitespace, \0
   * or anything non A-Z,0-9 etc as terminal.
   * 
   * plain strings/binary sequences are not assumed '\0' terminated. Encoded
   * strings are neither. But probably should.
   *
   */
  
  /**
   * Given the length of an un-encrypted string, get the length of the 
   * encrypted string.
   * @param len the length of an unencrypted string.
   * @return the length of the string after it is encrypted
   */ 
  APU_DECLARE(int) apr_base64_encode_len(int len);
  
  /**
   * Encode a text string using base64encoding.
   * @param coded_dst The destination string for the encoded string.
   * @param plain_src The original string in plain text
   * @param len_plain_src The length of the plain text string
   * @return the length of the encoded string
   */ 
  APU_DECLARE(int) apr_base64_encode(char * coded_dst, const char *plain_src, 
                                   int len_plain_src);
  
  /**
   * Encode an EBCDIC string using base64encoding.
   * @param coded_dst The destination string for the encoded string.
   * @param plain_src The original string in plain text
   * @param len_plain_src The length of the plain text string
   * @return the length of the encoded string
   */ 
  APU_DECLARE(int) apr_base64_encode_binary(char * coded_dst, 
                                          const unsigned char *plain_src,
                                          int len_plain_src);
  
  /**
   * Determine the length of a plain text string given the encoded version
   * @param coded_src The encoded string
   * @return the length of the plain text string
   */ 
  APU_DECLARE(int) apr_base64_decode_len(const char * coded_src);
  
  /**
   * Decode a string to plain text
   * @param plain_dst The destination string for the plain text
   * @param coded_src The encoded string 
   * @return the length of the plain text string
   */ 
  APU_DECLARE(int) apr_base64_decode(char * plain_dst, const char *coded_src);
  
  /**
   * Decode an EBCDIC string to plain text
   * @param plain_dst The destination string for the plain text
   * @param coded_src The encoded string 
   * @return the length of the plain text string
   */ 
  APU_DECLARE(int) apr_base64_decode_binary(unsigned char * plain_dst, 
                                          const char *coded_src);
  
  /** @} */
  #ifdef __cplusplus
  }
  #endif
  
  #endif	/* !APR_BASE64_H */
  
  
  
  1.1                  ws-axis/c/src/soap/apr_base64.c
  
  Index: apr_base64.c
  ===================================================================
  /* ====================================================================
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2000-2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution,
   *    if any, must include the following acknowledgment:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgment may appear in the software itself,
   *    if and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "Apache" and "Apache Software Foundation" must
   *    not be used to endorse or promote products derived from this
   *    software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache",
   *    nor may "Apache" appear in their name, without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   * Portions of this software are based upon public domain software
   * originally written at the National Center for Supercomputing Applications,
   * University of Illinois, Urbana-Champaign.
   */
  
  /* base64 encoder/decoder. Originally part of main/util.c
   * but moved here so that support/ab and apr_sha1.c could
   * use it. This meant removing the apr_palloc()s and adding
   * ugly 'len' functions, which is quite a nasty cost.
   */
  
  #include "apr_base64.h"
  #if APR_CHARSET_EBCDIC
  #include "apr_xlate.h"
  #endif				/* APR_CHARSET_EBCDIC */
  
  /* aaaack but it's fast and const should make it shared text page. */
  static const unsigned char pr2six[256] =
  {
  #if !APR_CHARSET_EBCDIC
      /* ASCII table */
      64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
      64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
      64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63,
      52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64,
      64,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
      15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64,
      64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
      41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64,
      64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
      64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
      64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
      64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
      64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
      64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
      64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
      64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
  #else /*APR_CHARSET_EBCDIC*/
      /* EBCDIC table */
      64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
      64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
      64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
      64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
      64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64,
      64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
      64, 63, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
      64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
      64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 64, 64, 64, 64, 64, 64,
      64, 35, 36, 37, 38, 39, 40, 41, 42, 43, 64, 64, 64, 64, 64, 64,
      64, 64, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64, 64,
      64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
      64,  0,  1,  2,  3,  4,  5,  6,  7,  8, 64, 64, 64, 64, 64, 64,
      64,  9, 10, 11, 12, 13, 14, 15, 16, 17, 64, 64, 64, 64, 64, 64,
      64, 64, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64, 64,
      52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64
  #endif /*APR_CHARSET_EBCDIC*/
  };
  
  #if APR_CHARSET_EBCDIC
  static apr_xlate_t *xlate_to_ebcdic;
  static unsigned char os_toascii[256];
  
  APU_DECLARE(apr_status_t) apr_base64init_ebcdic(apr_xlate_t *to_ascii,
                                               apr_xlate_t *to_ebcdic)
  {
      int i;
      apr_size_t inbytes_left, outbytes_left;
      apr_status_t rv;
      int onoff;
      
      /* Only single-byte conversion is supported.
       */
      rv = apr_xlate_get_sb(to_ascii, &onoff);
      if (rv) {
          return rv;
      }
      if (!onoff) { /* If conversion is not single-byte-only */
          return APR_EINVAL;
      }
      rv = apr_xlate_get_sb(to_ebcdic, &onoff);
      if (rv) {
          return rv;
      }
      if (!onoff) { /* If conversion is not single-byte-only */
          return APR_EINVAL;
      }
      xlate_to_ebcdic = to_ebcdic;
      for (i = 0; i < sizeof(os_toascii); i++) {
          os_toascii[i] = i;
      }
      inbytes_left = outbytes_left = sizeof(os_toascii);
      apr_xlate_conv_buffer(to_ascii, os_toascii, &inbytes_left,
                            os_toascii, &outbytes_left);
  
      return APR_SUCCESS;
  }
  #endif /*APR_CHARSET_EBCDIC*/
  
  APU_DECLARE(int) apr_base64_decode_len(const char *bufcoded)
  {
      int nbytesdecoded;
      register const unsigned char *bufin;
      register int nprbytes;
  
      bufin = (const unsigned char *) bufcoded;
      while (pr2six[*(bufin++)] <= 63);
  
      nprbytes = (bufin - (const unsigned char *) bufcoded) - 1;
      nbytesdecoded = ((nprbytes + 3) / 4) * 3;
  
      return nbytesdecoded + 1;
  }
  
  APU_DECLARE(int) apr_base64_decode(char *bufplain, const char *bufcoded)
  {
  #if APR_CHARSET_EBCDIC
      apr_size_t inbytes_left, outbytes_left;
  #endif				/* APR_CHARSET_EBCDIC */
      int len;
      
      len = apr_base64_decode_binary((unsigned char *) bufplain, bufcoded);
  #if APR_CHARSET_EBCDIC
      inbytes_left = outbytes_left = len;
      apr_xlate_conv_buffer(xlate_to_ebcdic, bufplain, &inbytes_left,
                            bufplain, &outbytes_left);
  #endif				/* APR_CHARSET_EBCDIC */
      bufplain[len] = '\0';
      return len;
  }
  
  /* This is the same as apr_base64_decode() except on EBCDIC machines, where
   * the conversion of the output to ebcdic is left out.
   */
  APU_DECLARE(int) apr_base64_decode_binary(unsigned char *bufplain,
  				   const char *bufcoded)
  {
      int nbytesdecoded;
      register const unsigned char *bufin;
      register unsigned char *bufout;
      register int nprbytes;
  
      bufin = (const unsigned char *) bufcoded;
      while (pr2six[*(bufin++)] <= 63);
      nprbytes = (bufin - (const unsigned char *) bufcoded) - 1;
      nbytesdecoded = ((nprbytes + 3) / 4) * 3;
  
      bufout = (unsigned char *) bufplain;
      bufin = (const unsigned char *) bufcoded;
  
      while (nprbytes > 4) {
  	*(bufout++) =
  	    (unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);
  	*(bufout++) =
  	    (unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);
  	*(bufout++) =
  	    (unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]);
  	bufin += 4;
  	nprbytes -= 4;
      }
  
      /* Note: (nprbytes == 1) would be an error, so just ingore that case */
      if (nprbytes > 1) {
  	*(bufout++) =
  	    (unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);
      }
      if (nprbytes > 2) {
  	*(bufout++) =
  	    (unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);
      }
      if (nprbytes > 3) {
  	*(bufout++) =
  	    (unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]);
      }
  
      nbytesdecoded -= (4 - nprbytes) & 3;
      return nbytesdecoded;
  }
  
  static const char basis_64[] =
      "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  
  APU_DECLARE(int) apr_base64_encode_len(int len)
  {
      return ((len + 2) / 3 * 4) + 1;
  }
  
  APU_DECLARE(int) apr_base64_encode(char *encoded, const char *string, int len)
  {
  #if !APR_CHARSET_EBCDIC
      return apr_base64_encode_binary(encoded, (const unsigned char *) string, len);
  #else /* APR_CHARSET_EBCDIC */
      int i;
      char *p;
  
      p = encoded;
      for (i = 0; i < len - 2; i += 3) {
  	*p++ = basis_64[(os_toascii[string[i]] >> 2) & 0x3F];
  	*p++ = basis_64[((os_toascii[string[i]] & 0x3) << 4) |
  	                ((int) (os_toascii[string[i + 1]] & 0xF0) >> 4)];
  	*p++ = basis_64[((os_toascii[string[i + 1]] & 0xF) << 2) |
  	                ((int) (os_toascii[string[i + 2]] & 0xC0) >> 6)];
  	*p++ = basis_64[os_toascii[string[i + 2]] & 0x3F];
      }
      if (i < len) {
  	*p++ = basis_64[(os_toascii[string[i]] >> 2) & 0x3F];
  	if (i == (len - 1)) {
  	    *p++ = basis_64[((os_toascii[string[i]] & 0x3) << 4)];
  	    *p++ = '=';
  	}
  	else {
  	    *p++ = basis_64[((os_toascii[string[i]] & 0x3) << 4) |
  	                    ((int) (os_toascii[string[i + 1]] & 0xF0) >> 4)];
  	    *p++ = basis_64[((os_toascii[string[i + 1]] & 0xF) << 2)];
  	}
  	*p++ = '=';
      }
  
      *p++ = '\0';
      return p - encoded;
  #endif				/* APR_CHARSET_EBCDIC */
  }
  
  /* This is the same as apr_base64_encode() except on EBCDIC machines, where
   * the conversion of the input to ascii is left out.
   */
  APU_DECLARE(int) apr_base64_encode_binary(char *encoded,
                                        const unsigned char *string, int len)
  {
      int i;
      char *p;
  
      p = encoded;
      for (i = 0; i < len - 2; i += 3) {
  	*p++ = basis_64[(string[i] >> 2) & 0x3F];
  	*p++ = basis_64[((string[i] & 0x3) << 4) |
  	                ((int) (string[i + 1] & 0xF0) >> 4)];
  	*p++ = basis_64[((string[i + 1] & 0xF) << 2) |
  	                ((int) (string[i + 2] & 0xC0) >> 6)];
  	*p++ = basis_64[string[i + 2] & 0x3F];
      }
      if (i < len) {
  	*p++ = basis_64[(string[i] >> 2) & 0x3F];
  	if (i == (len - 1)) {
  	    *p++ = basis_64[((string[i] & 0x3) << 4)];
  	    *p++ = '=';
  	}
  	else {
  	    *p++ = basis_64[((string[i] & 0x3) << 4) |
  	                    ((int) (string[i + 1] & 0xF0) >> 4)];
  	    *p++ = basis_64[((string[i + 1] & 0xF) << 2)];
  	}
  	*p++ = '=';
      }
  
      *p++ = '\0';
      return p - encoded;
  }