gsasl-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

CVS gsasl/lib/src


From: gsasl-commit
Subject: CVS gsasl/lib/src
Date: Sat, 27 Nov 2004 04:28:35 +0100

Update of /home/cvs/gsasl/lib/src
In directory dopio:/tmp/cvs-serv4784

Modified Files:
        obsolete.c gsasl.h.in gsasl-compat.h base64.c 
Log Message:
Use gnulib for base64 support.


--- /home/cvs/gsasl/lib/src/obsolete.c  2004/11/18 13:49:07     1.17
+++ /home/cvs/gsasl/lib/src/obsolete.c  2004/11/27 03:28:34     1.18
@@ -1541,4 +1541,336 @@
 {
   return ctx ? ctx->cbs_service : NULL;
 }
+
+/*
+ * Copyright (c) 1996-1999 by Internet Software Consortium.
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
+ * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
+ * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
+ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+ * SOFTWARE.
+ */
+
+/*
+ * Portions Copyright (c) 1995 by International Business Machines, Inc.
+ *
+ * International Business Machines, Inc. (hereinafter called IBM) grants
+ * permission under its copyrights to use, copy, modify, and distribute this
+ * Software with or without fee, provided that the above copyright notice and
+ * all paragraphs of this notice appear in all copies, and that the name of IBM
+ * not be used in connection with the marketing of any product incorporating
+ * the Software or modifications thereof, without specific, written prior
+ * permission.
+ *
+ * To the extent it has a right to do so, IBM grants an immunity from suit
+ * under its patents, if any, for the use, sale or manufacture of products to
+ * the extent that such products are used for performing Domain Name System
+ * dynamic updates in TCP/IP networks by means of the Software.  No immunity is
+ * granted for any product per se or for any other function of any product.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE.  IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL,
+ * DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING
+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN
+ * IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ */
+
+#include <ctype.h>
+#include <stdio.h>
+
+#define Assert(Cond) if (!(Cond)) abort()
+
+static const char Base64[] =
+  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+static const char Pad64 = '=';
+
+/* (From RFC1521 and draft-ietf-dnssec-secext-03.txt)
+   The following encoding technique is taken from RFC 1521 by Borenstein
+   and Freed.  It is reproduced here in a slightly edited form for
+   convenience.
+
+   A 65-character subset of US-ASCII is used, enabling 6 bits to be
+   represented per printable character. (The extra 65th character, "=",
+   is used to signify a special processing function.)
+
+   The encoding process represents 24-bit groups of input bits as output
+   strings of 4 encoded characters. Proceeding from left to right, a
+   24-bit input group is formed by concatenating 3 8-bit input groups.
+   These 24 bits are then treated as 4 concatenated 6-bit groups, each
+   of which is translated into a single digit in the base64 alphabet.
+
+   Each 6-bit group is used as an index into an array of 64 printable
+   characters. The character referenced by the index is placed in the
+   output string.
+
+   Table 1: The Base64 Alphabet
+
+   Value Encoding  Value Encoding  Value Encoding  Value Encoding
+   0 A            17 R            34 i            51 z
+   1 B            18 S            35 j            52 0
+   2 C            19 T            36 k            53 1
+   3 D            20 U            37 l            54 2
+   4 E            21 V            38 m            55 3
+   5 F            22 W            39 n            56 4
+   6 G            23 X            40 o            57 5
+   7 H            24 Y            41 p            58 6
+   8 I            25 Z            42 q            59 7
+   9 J            26 a            43 r            60 8
+   10 K            27 b            44 s            61 9
+   11 L            28 c            45 t            62 +
+   12 M            29 d            46 u            63 /
+   13 N            30 e            47 v
+   14 O            31 f            48 w         (pad) =
+   15 P            32 g            49 x
+   16 Q            33 h            50 y
+
+   Special processing is performed if fewer than 24 bits are available
+   at the end of the data being encoded.  A full encoding quantum is
+   always completed at the end of a quantity.  When fewer than 24 input
+   bits are available in an input group, zero bits are added (on the
+   right) to form an integral number of 6-bit groups.  Padding at the
+   end of the data is performed using the '=' character.
+
+   Since all base64 input is an integral number of octets, only the
+   -------------------------------------------------
+   following cases can arise:
+
+   (1) the final quantum of encoding input is an integral
+   multiple of 24 bits; here, the final unit of encoded
+   output will be an integral multiple of 4 characters
+   with no "=" padding,
+   (2) the final quantum of encoding input is exactly 8 bits;
+   here, the final unit of encoded output will be two
+   characters followed by two "=" padding characters, or
+   (3) the final quantum of encoding input is exactly 16 bits;
+   here, the final unit of encoded output will be three
+   characters followed by one "=" padding character.
+*/
+
+/**
+ * gsasl_base64_encode:
+ * @src: input byte array
+ * @srclength: size of input byte array
+ * @target: output byte array
+ * @targsize: size of output byte array
+ *
+ * Encode data as base64.  Converts characters, three at a time,
+ * starting at src into four base64 characters in the target area
+ * until the entire input buffer is encoded.
+ *
+ * Return value: Returns the number of data bytes stored at the
+ * target, or -1 on error.
+ **/
+int
+gsasl_base64_encode (char const *src,
+                    size_t srclength, char *target, size_t targsize)
+{
+  size_t datalength = 0;
+  unsigned char input[3];
+  unsigned char output[4];
+  size_t i;
+
+  while (2 < srclength)
+    {
+      input[0] = *src++;
+      input[1] = *src++;
+      input[2] = *src++;
+      srclength -= 3;
+
+      output[0] = input[0] >> 2;
+      output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4);
+      output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6);
+      output[3] = input[2] & 0x3f;
+      Assert (output[0] < 64);
+      Assert (output[1] < 64);
+      Assert (output[2] < 64);
+      Assert (output[3] < 64);
+
+      if (datalength + 4 > targsize)
+       return (-1);
+      target[datalength++] = Base64[output[0]];
+      target[datalength++] = Base64[output[1]];
+      target[datalength++] = Base64[output[2]];
+      target[datalength++] = Base64[output[3]];
+    }
+
+  /* Now we worry about padding. */
+  if (0 != srclength)
+    {
+      /* Get what's left. */
+      input[0] = input[1] = input[2] = '\0';
+      for (i = 0; i < srclength; i++)
+       input[i] = *src++;
+
+      output[0] = input[0] >> 2;
+      output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4);
+      output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6);
+      Assert (output[0] < 64);
+      Assert (output[1] < 64);
+      Assert (output[2] < 64);
+
+      if (datalength + 4 > targsize)
+       return (-1);
+      target[datalength++] = Base64[output[0]];
+      target[datalength++] = Base64[output[1]];
+      if (srclength == 1)
+       target[datalength++] = Pad64;
+      else
+       target[datalength++] = Base64[output[2]];
+      target[datalength++] = Pad64;
+    }
+  if (datalength >= targsize)
+    return (-1);
+  target[datalength] = '\0';   /* Returned value doesn't count \0. */
+  return (datalength);
+}
+
+/**
+ * gsasl_base64_decode:
+ * @src: input byte array
+ * @target: output byte array
+ * @targsize: size of output byte array
+ *
+ * Decode Base64 data.  Skips all whitespace anywhere.  Converts
+ * characters, four at a time, starting at (or after) src from Base64
+ * numbers into three 8 bit bytes in the target area.
+ *
+ * Return value: Returns the number of data bytes stored at the
+ * target, or -1 on error.
+ **/
+int
+gsasl_base64_decode (char const *src, char *target, size_t targsize)
+{
+  int tarindex, state, ch;
+  char *pos;
+
+  state = 0;
+  tarindex = 0;
+
+  while ((ch = *src++) != '\0')
+    {
+      if (isspace (ch))                /* Skip whitespace anywhere. */
+       continue;
+
+      if (ch == Pad64)
+       break;
+
+      pos = strchr (Base64, ch);
+      if (pos == 0)            /* A non-base64 character. */
+       return (-1);
+
+      switch (state)
+       {
+       case 0:
+         if (target)
+           {
+             if ((size_t) tarindex >= targsize)
+               return (-1);
+             target[tarindex] = (pos - Base64) << 2;
+           }
+         state = 1;
+         break;
+       case 1:
+         if (target)
+           {
+             if ((size_t) tarindex + 1 >= targsize)
+               return (-1);
+             target[tarindex] |= (pos - Base64) >> 4;
+             target[tarindex + 1] = ((pos - Base64) & 0x0f) << 4;
+           }
+         tarindex++;
+         state = 2;
+         break;
+       case 2:
+         if (target)
+           {
+             if ((size_t) tarindex + 1 >= targsize)
+               return (-1);
+             target[tarindex] |= (pos - Base64) >> 2;
+             target[tarindex + 1] = ((pos - Base64) & 0x03) << 6;
+           }
+         tarindex++;
+         state = 3;
+         break;
+       case 3:
+         if (target)
+           {
+             if ((size_t) tarindex >= targsize)
+               return (-1);
+             target[tarindex] |= (pos - Base64);
+           }
+         tarindex++;
+         state = 0;
+         break;
+       default:
+         abort ();
+       }
+    }
+
+  /*
+   * We are done decoding Base-64 chars.  Let's see if we ended
+   * on a byte boundary, and/or with erroneous trailing characters.
+   */
+
+  if (ch == Pad64)
+    {                          /* We got a pad char. */
+      ch = *src++;             /* Skip it, get next. */
+      switch (state)
+       {
+       case 0:         /* Invalid = in first position */
+       case 1:         /* Invalid = in second position */
+         return (-1);
+
+       case 2:         /* Valid, means one byte of info */
+         /* Skip any number of spaces. */
+         for ((void) NULL; ch != '\0'; ch = *src++)
+           if (!isspace (ch))
+             break;
+         /* Make sure there is another trailing = sign. */
+         if (ch != Pad64)
+           return (-1);
+         ch = *src++;          /* Skip the = */
+         /* Fall through to "single trailing =" case. */
+         /* FALLTHROUGH */
+
+       case 3:         /* Valid, means two bytes of info */
+         /*
+          * We know this char is an =.  Is there anything but
+          * whitespace after it?
+          */
+         for ((void) NULL; ch != '\0'; ch = *src++)
+           if (!isspace (ch))
+             return (-1);
+
+         /*
+          * Now make sure for cases 2 and 3 that the "extra"
+          * bits that slopped past the last full byte were
+          * zeros.  If we don't check them, they become a
+          * subliminal channel.
+          */
+         if (target && target[tarindex] != 0)
+           return (-1);
+       }
+    }
+  else
+    {
+      /*
+       * We ended by seeing the end of the string.  Make sure we
+       * have no partial bytes lying around.
+       */
+      if (state != 0)
+       return (-1);
+    }
+
+  return (tarindex);
+}
 #endif
--- /home/cvs/gsasl/lib/src/gsasl.h.in  2004/11/19 02:58:33     1.48
+++ /home/cvs/gsasl/lib/src/gsasl.h.in  2004/11/27 03:28:34     1.49
@@ -232,10 +232,10 @@
   extern char *gsasl_stringprep_trace (const char *in, int *stringprep_rc);
 
   /* Utilities: base64.c, md5pwd.c, crypto.c */
-  extern int gsasl_base64_encode (char const *src, size_t srclength,
-                                 char *target, size_t targsize);
-  extern int gsasl_base64_decode (char const *src,
-                                 char *target, size_t targsize);
+  extern int gsasl_base64_to (const char *in, size_t inlen,
+                             char **out, size_t *outlen);
+  extern int gsasl_base64_from (const char *in, size_t inlen,
+                               char **out, size_t * outlen);
   extern int gsasl_md5pwd_get_password (const char *filename,
                                        const char *username,
                                        char *key, size_t * keylen);
--- /home/cvs/gsasl/lib/src/gsasl-compat.h      2004/11/18 13:56:35     1.15
+++ /home/cvs/gsasl/lib/src/gsasl-compat.h      2004/11/27 03:28:34     1.16
@@ -119,6 +119,13 @@
                                                   const char *mechlist)
   __attribute__ ((deprecated));
 
+extern int gsasl_base64_encode (char const *src, size_t srclength,
+                               char *target, size_t targsize)
+  __attribute__ ((deprecated));
+extern int gsasl_base64_decode (char const *src,
+                               char *target, size_t targsize)
+  __attribute__ ((deprecated));
+
 /* Callback prototypes */
 typedef int (*Gsasl_client_callback_anonymous) (Gsasl_session * sctx,
                                                char *out, size_t * outlen);
--- /home/cvs/gsasl/lib/src/base64.c    2004/04/15 21:19:17     1.1
+++ /home/cvs/gsasl/lib/src/base64.c    2004/11/27 03:28:34     1.2
@@ -1,337 +1,79 @@
-#include "gsasl.h"
-
-/* This file is copied from GNU libc - libc/resolv/base64.c */
-
-/*
- * Copyright (c) 1996-1999 by Internet Software Consortium.
+/* base64.c --- Base64 encoding/decoding functions.
+ * Copyright (C) 2002, 2003, 2004  Simon Josefsson
  *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
+ * This file is part of GNU SASL Library.
  *
- * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
- * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
- * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
- * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
- * SOFTWARE.
- */
-
-/*
- * Portions Copyright (c) 1995 by International Business Machines, Inc.
+ * GNU SASL Library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
  *
- * International Business Machines, Inc. (hereinafter called IBM) grants
- * permission under its copyrights to use, copy, modify, and distribute this
- * Software with or without fee, provided that the above copyright notice and
- * all paragraphs of this notice appear in all copies, and that the name of IBM
- * not be used in connection with the marketing of any product incorporating
- * the Software or modifications thereof, without specific, written prior
- * permission.
+ * GNU SASL Library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
  *
- * To the extent it has a right to do so, IBM grants an immunity from suit
- * under its patents, if any, for the use, sale or manufacture of products to
- * the extent that such products are used for performing Domain Name System
- * dynamic updates in TCP/IP networks by means of the Software.  No immunity is
- * granted for any product per se or for any other function of any product.
+ * You should have received a copy of the GNU Lesser General Public License
+ * License along with GNU SASL Library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- * THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
- * PARTICULAR PURPOSE.  IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL,
- * DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING
- * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN
- * IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES.
  */
 
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#define Assert(Cond) if (!(Cond)) abort()
-
-static const char Base64[] =
-  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-static const char Pad64 = '=';
-
-/* (From RFC1521 and draft-ietf-dnssec-secext-03.txt)
-   The following encoding technique is taken from RFC 1521 by Borenstein
-   and Freed.  It is reproduced here in a slightly edited form for
-   convenience.
-
-   A 65-character subset of US-ASCII is used, enabling 6 bits to be
-   represented per printable character. (The extra 65th character, "=",
-   is used to signify a special processing function.)
+#include "internal.h"
 
-   The encoding process represents 24-bit groups of input bits as output
-   strings of 4 encoded characters. Proceeding from left to right, a
-   24-bit input group is formed by concatenating 3 8-bit input groups.
-   These 24 bits are then treated as 4 concatenated 6-bit groups, each
-   of which is translated into a single digit in the base64 alphabet.
+#include "base64.h"
 
-   Each 6-bit group is used as an index into an array of 64 printable
-   characters. The character referenced by the index is placed in the
-   output string.
-
-                         Table 1: The Base64 Alphabet
-
-      Value Encoding  Value Encoding  Value Encoding  Value Encoding
-          0 A            17 R            34 i            51 z
-          1 B            18 S            35 j            52 0
-          2 C            19 T            36 k            53 1
-          3 D            20 U            37 l            54 2
-          4 E            21 V            38 m            55 3
-          5 F            22 W            39 n            56 4
-          6 G            23 X            40 o            57 5
-          7 H            24 Y            41 p            58 6
-          8 I            25 Z            42 q            59 7
-          9 J            26 a            43 r            60 8
-         10 K            27 b            44 s            61 9
-         11 L            28 c            45 t            62 +
-         12 M            29 d            46 u            63 /
-         13 N            30 e            47 v
-         14 O            31 f            48 w         (pad) =
-         15 P            32 g            49 x
-         16 Q            33 h            50 y
-
-   Special processing is performed if fewer than 24 bits are available
-   at the end of the data being encoded.  A full encoding quantum is
-   always completed at the end of a quantity.  When fewer than 24 input
-   bits are available in an input group, zero bits are added (on the
-   right) to form an integral number of 6-bit groups.  Padding at the
-   end of the data is performed using the '=' character.
-
-   Since all base64 input is an integral number of octets, only the
-         -------------------------------------------------                     
  
-   following cases can arise:
-   
-       (1) the final quantum of encoding input is an integral
-           multiple of 24 bits; here, the final unit of encoded
-          output will be an integral multiple of 4 characters
-          with no "=" padding,
-       (2) the final quantum of encoding input is exactly 8 bits;
-           here, the final unit of encoded output will be two
-          characters followed by two "=" padding characters, or
-       (3) the final quantum of encoding input is exactly 16 bits;
-           here, the final unit of encoded output will be three
-          characters followed by one "=" padding character.
-   */
+/* Get SIZE_MAX.  */
+#include "xsize.h"
 
 /**
- * gsasl_base64_encode:
- * @src: input byte array
- * @srclength: size of input byte array
- * @target: output byte array
- * @targsize: size of output byte array
- * 
+ * gsasl_base64_to:
+ * @in: input byte array
+ * @inlen: size of input byte array
+ * @out: pointer to newly allocated output byte array
+ * @outlen: pointer to size of newly allocated output byte array
+ *
  * Encode data as base64.  Converts characters, three at a time,
  * starting at src into four base64 characters in the target area
  * until the entire input buffer is encoded.
- * 
- * Return value: Returns the number of data bytes stored at the
- * target, or -1 on error.
+ *
+ * Return value: Returns %GSASL_OK on success, or %GSASL_MALLOC_ERROR
+ * if memory allocation fail or length overflow occurs.
  **/
 int
-gsasl_base64_encode (char const *src,
-                    size_t srclength, char *target, size_t targsize)
+gsasl_base64_to (const char *in, size_t inlen, char **out, size_t *outlen)
 {
-  size_t datalength = 0;
-  unsigned char input[3];
-  unsigned char output[4];
-  size_t i;
-
-  while (2 < srclength)
-    {
-      input[0] = *src++;
-      input[1] = *src++;
-      input[2] = *src++;
-      srclength -= 3;
+  size_t len = base64_encode_alloc (in, inlen, out);
 
-      output[0] = input[0] >> 2;
-      output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4);
-      output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6);
-      output[3] = input[2] & 0x3f;
-      Assert (output[0] < 64);
-      Assert (output[1] < 64);
-      Assert (output[2] < 64);
-      Assert (output[3] < 64);
+  if (outlen)
+    *outlen = len;
 
-      if (datalength + 4 > targsize)
-       return (-1);
-      target[datalength++] = Base64[output[0]];
-      target[datalength++] = Base64[output[1]];
-      target[datalength++] = Base64[output[2]];
-      target[datalength++] = Base64[output[3]];
-    }
+  if (len == SIZE_MAX || *out == NULL)
+    return GSASL_MALLOC_ERROR;
 
-  /* Now we worry about padding. */
-  if (0 != srclength)
-    {
-      /* Get what's left. */
-      input[0] = input[1] = input[2] = '\0';
-      for (i = 0; i < srclength; i++)
-       input[i] = *src++;
-
-      output[0] = input[0] >> 2;
-      output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4);
-      output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6);
-      Assert (output[0] < 64);
-      Assert (output[1] < 64);
-      Assert (output[2] < 64);
-
-      if (datalength + 4 > targsize)
-       return (-1);
-      target[datalength++] = Base64[output[0]];
-      target[datalength++] = Base64[output[1]];
-      if (srclength == 1)
-       target[datalength++] = Pad64;
-      else
-       target[datalength++] = Base64[output[2]];
-      target[datalength++] = Pad64;
-    }
-  if (datalength >= targsize)
-    return (-1);
-  target[datalength] = '\0';   /* Returned value doesn't count \0. */
-  return (datalength);
+  return GSASL_OK;
 }
 
 /**
- * gsasl_base64_decode:
- * @src: input byte array
- * @target: output byte array
- * @targsize: size of output byte array
- * 
- * Decode Base64 data.  Skips all whitespace anywhere.  Converts
- * characters, four at a time, starting at (or after) src from Base64
- * numbers into three 8 bit bytes in the target area.
- * 
- * Return value: Returns the number of data bytes stored at the
- * target, or -1 on error.
+ * gsasl_base64_from:
+ * @in: input byte array
+ * @inlen: size of input byte array
+ * @out: pointer to newly allocated output byte array
+ * @outlen: pointer to size of newly allocated output byte array
+ *
+ * Decode Base64 data.  Converts characters, four at a time, starting
+ * at (or after) src from Base64 numbers into three 8 bit bytes in the
+ * target area.
+ *
+ * Return value: Returns %GSASL_OK on success, or %GSASL_MALLOC_ERROR
+ * on memory allocation errors, integer overflows, and (alas) invalid
+ * input.
  **/
 int
-gsasl_base64_decode (char const *src, char *target, size_t targsize)
+gsasl_base64_from (const char *in, size_t inlen,
+                  char **out, size_t * outlen)
 {
-  int tarindex, state, ch;
-  char *pos;
-
-  state = 0;
-  tarindex = 0;
-
-  while ((ch = *src++) != '\0')
-    {
-      if (isspace (ch))                /* Skip whitespace anywhere. */
-       continue;
-
-      if (ch == Pad64)
-       break;
-
-      pos = strchr (Base64, ch);
-      if (pos == 0)            /* A non-base64 character. */
-       return (-1);
-
-      switch (state)
-       {
-       case 0:
-         if (target)
-           {
-             if ((size_t) tarindex >= targsize)
-               return (-1);
-             target[tarindex] = (pos - Base64) << 2;
-           }
-         state = 1;
-         break;
-       case 1:
-         if (target)
-           {
-             if ((size_t) tarindex + 1 >= targsize)
-               return (-1);
-             target[tarindex] |= (pos - Base64) >> 4;
-             target[tarindex + 1] = ((pos - Base64) & 0x0f) << 4;
-           }
-         tarindex++;
-         state = 2;
-         break;
-       case 2:
-         if (target)
-           {
-             if ((size_t) tarindex + 1 >= targsize)
-               return (-1);
-             target[tarindex] |= (pos - Base64) >> 2;
-             target[tarindex + 1] = ((pos - Base64) & 0x03) << 6;
-           }
-         tarindex++;
-         state = 3;
-         break;
-       case 3:
-         if (target)
-           {
-             if ((size_t) tarindex >= targsize)
-               return (-1);
-             target[tarindex] |= (pos - Base64);
-           }
-         tarindex++;
-         state = 0;
-         break;
-       default:
-         abort ();
-       }
-    }
-
-  /*
-   * We are done decoding Base-64 chars.  Let's see if we ended
-   * on a byte boundary, and/or with erroneous trailing characters.
-   */
-
-  if (ch == Pad64)
-    {                          /* We got a pad char. */
-      ch = *src++;             /* Skip it, get next. */
-      switch (state)
-       {
-       case 0:         /* Invalid = in first position */
-       case 1:         /* Invalid = in second position */
-         return (-1);
-
-       case 2:         /* Valid, means one byte of info */
-         /* Skip any number of spaces. */
-         for ((void) NULL; ch != '\0'; ch = *src++)
-           if (!isspace (ch))
-             break;
-         /* Make sure there is another trailing = sign. */
-         if (ch != Pad64)
-           return (-1);
-         ch = *src++;          /* Skip the = */
-         /* Fall through to "single trailing =" case. */
-         /* FALLTHROUGH */
-
-       case 3:         /* Valid, means two bytes of info */
-         /*
-          * We know this char is an =.  Is there anything but
-          * whitespace after it?
-          */
-         for ((void) NULL; ch != '\0'; ch = *src++)
-           if (!isspace (ch))
-             return (-1);
-
-         /*
-          * Now make sure for cases 2 and 3 that the "extra"
-          * bits that slopped past the last full byte were
-          * zeros.  If we don't check them, they become a
-          * subliminal channel.
-          */
-         if (target && target[tarindex] != 0)
-           return (-1);
-       }
-    }
-  else
-    {
-      /*
-       * We ended by seeing the end of the string.  Make sure we
-       * have no partial bytes lying around.
-       */
-      if (state != 0)
-       return (-1);
-    }
-
-  return (tarindex);
+  return base64_decode_alloc (in, inlen, out, outlen)
+    ? GSASL_OK
+    : GSASL_MALLOC_ERROR;
 }





reply via email to

[Prev in Thread] Current Thread [Next in Thread]