2004-05-17 Kristian Høgsberg <krh@redhat.com>
authorKristian Høgsberg <krh@redhat.com>
Mon, 17 May 2004 22:19:04 +0000 (22:19 +0000)
committerKristian Høgsberg <krh@redhat.com>
Mon, 17 May 2004 22:19:04 +0000 (22:19 +0000)
Remove base64 encoding, replace with hex encoding. Original patch
from trow@ximian.com, added error handling.

* dbus/dbus-string.c (_dbus_string_base64_encode)
(_dbus_string_base64_decode): Remove.
(_dbus_string_hex_decode): Add end_return argument so we can
distinguish between OOM and invalid hex encoding.
(_dbus_string_test): Remove base64 tests and add test case for
invalid hex.

* dbus/dbus-keyring.c, dbus/dbus-auth-script.c, dbus/dbus-auth.c:
Replace base64 with hex.

* test/data/auth/invalid-hex-encoding.auth-script: New test case
for invalid hex encoded data in auth protocol.

20 files changed:
ChangeLog
dbus/dbus-auth-script.c
dbus/dbus-auth.c
dbus/dbus-errors.c
dbus/dbus-keyring.c
dbus/dbus-string.c
dbus/dbus-string.h
doc/TODO
doc/dbus-specification.xml
doc/dbus-test-plan.xml
test/Makefile.am
test/data/auth/cancel.auth-script
test/data/auth/external-failed.auth-script
test/data/auth/external-root.auth-script
test/data/auth/external-silly.auth-script
test/data/auth/external-successful.auth-script
test/data/auth/extra-bytes.auth-script
test/data/auth/fail-after-n-attempts.auth-script
test/data/auth/invalid-hex-encoding.auth-script [new file with mode: 0644]
test/unbase64.c [deleted file]

index eb6adc0..b4a3182 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+2004-05-17  Kristian Høgsberg  <krh@redhat.com>
+
+       Remove base64 encoding, replace with hex encoding. Original patch
+       from trow@ximian.com, added error handling.
+
+       * dbus/dbus-string.c (_dbus_string_base64_encode)
+       (_dbus_string_base64_decode): Remove.
+       (_dbus_string_hex_decode): Add end_return argument so we can
+       distinguish between OOM and invalid hex encoding.
+       (_dbus_string_test): Remove base64 tests and add test case for
+       invalid hex.
+
+       * dbus/dbus-keyring.c, dbus/dbus-auth-script.c, dbus/dbus-auth.c:
+       Replace base64 with hex.
+
+       * test/data/auth/invalid-hex-encoding.auth-script: New test case
+       for invalid hex encoded data in auth protocol.
+
 2004-05-17  Olivier Andrieu  <oliv__a@users.sourceforge.net>
 
        * dbus/dbus-connection.c (check_for_reply_unlocked): plug a memory
index f3154c9..0c6426d 100644 (file)
@@ -366,12 +366,12 @@ _dbus_auth_script_run (const DBusString *filename)
               goto out;
             }
 
-          /* Replace USERID_BASE64 with our username in base64 */
+          /* Replace USERID_HEX with our username in hex */
           {
             int where;
             
             if (_dbus_string_find (&to_send, 0,
-                                   "USERID_BASE64", &where))
+                                   "USERID_HEX", &where))
               {
                 DBusString username;
 
@@ -391,12 +391,12 @@ _dbus_auth_script_run (const DBusString *filename)
                     goto out;
                   }
 
-                _dbus_string_delete (&to_send, where, strlen ("USERID_BASE64"));
+                _dbus_string_delete (&to_send, where, strlen ("USERID_HEX"));
                 
-                if (!_dbus_string_base64_encode (&username, 0,
-                                                 &to_send, where))
+                if (!_dbus_string_hex_encode (&username, 0,
+                                             &to_send, where))
                   {
-                    _dbus_warn ("no memory to subst USERID_BASE64\n");
+                    _dbus_warn ("no memory to subst USERID_HEX\n");
                     _dbus_string_free (&username);
                     _dbus_string_free (&to_send);
                     goto out;
@@ -405,7 +405,7 @@ _dbus_auth_script_run (const DBusString *filename)
                 _dbus_string_free (&username);
               }
             else if (_dbus_string_find (&to_send, 0,
-                                        "USERNAME_BASE64", &where))
+                                        "USERNAME_HEX", &where))
               {
                 DBusString username;
                 const DBusString *u;
@@ -427,12 +427,12 @@ _dbus_auth_script_run (const DBusString *filename)
                     goto out;
                   }
 
-                _dbus_string_delete (&to_send, where, strlen ("USERNAME_BASE64"));
+                _dbus_string_delete (&to_send, where, strlen ("USERNAME_HEX"));
                 
-                if (!_dbus_string_base64_encode (&username, 0,
-                                                 &to_send, where))
+                if (!_dbus_string_hex_encode (&username, 0,
+                                             &to_send, where))
                   {
-                    _dbus_warn ("no memory to subst USERNAME_BASE64\n");
+                    _dbus_warn ("no memory to subst USERNAME_HEX\n");
                     _dbus_string_free (&username);
                     _dbus_string_free (&to_send);
                     goto out;
index 6d3dfcc..726091a 100644 (file)
@@ -586,8 +586,8 @@ sha1_handle_first_client_response (DBusAuth         *auth,
                             "DATA "))
     goto out;
   
-  if (!_dbus_string_base64_encode (&tmp2, 0, &auth->outgoing,
-                                   _dbus_string_get_length (&auth->outgoing)))
+  if (!_dbus_string_hex_encode (&tmp2, 0, &auth->outgoing,
+                               _dbus_string_get_length (&auth->outgoing)))
     goto out;
 
   if (!_dbus_string_append (&auth->outgoing,
@@ -734,9 +734,9 @@ handle_client_initial_response_cookie_sha1_mech (DBusAuth   *auth,
   if (!_dbus_username_from_current_process (&username))
     goto out_0;
 
-  if (!_dbus_string_base64_encode (username, 0,
-                                   response,
-                                   _dbus_string_get_length (response)))
+  if (!_dbus_string_hex_encode (username, 0,
+                               response,
+                               _dbus_string_get_length (response)))
     goto out_0;
 
   retval = TRUE;
@@ -919,9 +919,9 @@ handle_client_data_cookie_sha1_mech (DBusAuth         *auth,
   if (!_dbus_string_append (&auth->outgoing, "DATA "))
     goto out_6;
 
-  if (!_dbus_string_base64_encode (&tmp, 0,
-                                   &auth->outgoing,
-                                   _dbus_string_get_length (&auth->outgoing)))
+  if (!_dbus_string_hex_encode (&tmp, 0,
+                               &auth->outgoing,
+                               _dbus_string_get_length (&auth->outgoing)))
     {
       _dbus_string_set_length (&auth->outgoing, old_len);
       goto out_6;
@@ -1091,9 +1091,9 @@ handle_client_initial_response_external_mech (DBusAuth         *auth,
                                  _dbus_getuid ()))
     goto failed;
 
-  if (!_dbus_string_base64_encode (&plaintext, 0,
-                                   response,
-                                   _dbus_string_get_length (response)))
+  if (!_dbus_string_hex_encode (&plaintext, 0,
+                               response,
+                               _dbus_string_get_length (response)))
     goto failed;
 
   _dbus_string_free (&plaintext);
@@ -1248,9 +1248,9 @@ process_auth (DBusAuth         *auth,
     }
   else
     {
-      int i;
+      int i, end;
       DBusString mech;
-      DBusString base64_response;
+      DBusString hex_response;
       DBusString decoded_response;
       
       _dbus_string_find_blank (args, 0, &i);
@@ -1258,7 +1258,7 @@ process_auth (DBusAuth         *auth,
       if (!_dbus_string_init (&mech))
         return FALSE;
 
-      if (!_dbus_string_init (&base64_response))
+      if (!_dbus_string_init (&hex_response))
         {
           _dbus_string_free (&mech);
           return FALSE;
@@ -1267,20 +1267,30 @@ process_auth (DBusAuth         *auth,
       if (!_dbus_string_init (&decoded_response))
         {
           _dbus_string_free (&mech);
-          _dbus_string_free (&base64_response);
+          _dbus_string_free (&hex_response);
           return FALSE;
         }
 
       if (!_dbus_string_copy_len (args, 0, i, &mech, 0))
         goto failed;
 
-      if (!_dbus_string_copy (args, i, &base64_response, 0))
+      _dbus_string_skip_blank (args, i, &i);
+      if (!_dbus_string_copy (args, i, &hex_response, 0))
         goto failed;
 
-      if (!_dbus_string_base64_decode (&base64_response, 0,
-                                       &decoded_response, 0))
-        goto failed;
-      
+      if (!_dbus_string_hex_decode (&hex_response, 0, &end,
+                                   &decoded_response, 0))
+       goto failed;
+
+      if (_dbus_string_get_length (&hex_response) != end)
+       {
+         if (!_dbus_string_append (&auth->outgoing,
+                                   "ERROR \"Invalid hex encoding\"\r\n"))
+           goto failed;
+
+         goto out;
+        }
+     
       auth->mech = find_mech (&mech, auth->allowed_mechs);
       if (auth->mech != NULL)
         {
@@ -1300,8 +1310,9 @@ process_auth (DBusAuth         *auth,
             goto failed;
         }
 
+    out:
       _dbus_string_free (&mech);      
-      _dbus_string_free (&base64_response);
+      _dbus_string_free (&hex_response);
       _dbus_string_free (&decoded_response);
 
       return TRUE;
@@ -1309,7 +1320,7 @@ process_auth (DBusAuth         *auth,
     failed:
       auth->mech = NULL;
       _dbus_string_free (&mech);
-      _dbus_string_free (&base64_response);
+      _dbus_string_free (&hex_response);
       _dbus_string_free (&decoded_response);
       return FALSE;
     }
@@ -1349,6 +1360,8 @@ process_data_server (DBusAuth         *auth,
                      const DBusString *command,
                      const DBusString *args)
 {
+  int end;
+
   if (auth->mech != NULL)
     {
       DBusString decoded;
@@ -1356,10 +1369,20 @@ process_data_server (DBusAuth         *auth,
       if (!_dbus_string_init (&decoded))
         return FALSE;
 
-      if (!_dbus_string_base64_decode (args, 0, &decoded, 0))
-        {
+      if (!_dbus_string_hex_decode (args, 0, &end, &decoded, 0))
+       {
           _dbus_string_free (&decoded);
-          return FALSE;
+         return FALSE;
+       }
+
+      if (_dbus_string_get_length (args) != end)
+       {
+          _dbus_string_free (&decoded);
+         if (!_dbus_string_append (&auth->outgoing,
+                                   "ERROR \"Invalid hex encoding\"\r\n"))
+           return FALSE;
+
+         return TRUE;
         }
 
 #ifdef DBUS_ENABLE_VERBOSE_MODE
@@ -1632,6 +1655,8 @@ process_data_client (DBusAuth         *auth,
                      const DBusString *command,
                      const DBusString *args)
 {
+  int end;
+
   if (auth->mech != NULL)
     {
       DBusString decoded;
@@ -1639,10 +1664,20 @@ process_data_client (DBusAuth         *auth,
       if (!_dbus_string_init (&decoded))
         return FALSE;
 
-      if (!_dbus_string_base64_decode (args, 0, &decoded, 0))
+      if (!_dbus_string_hex_decode (args, 0, &end, &decoded, 0))
         {
           _dbus_string_free (&decoded);
-          return FALSE;
+         return FALSE;
+       }
+
+      if (_dbus_string_get_length (args) != end)
+       {
+          _dbus_string_free (&decoded);
+         if (!_dbus_string_append (&auth->outgoing,
+                                   "ERROR \"Invalid hex encoding\"\r\n"))
+           return FALSE;
+         
+         return TRUE;
         }
 
 #ifdef DBUS_ENABLE_VERBOSE_MODE
index 07f42e3..2a7dd85 100644 (file)
@@ -91,7 +91,7 @@ message_from_error (const char *error)
   else if (strcmp (error, DBUS_ERROR_DISCONNECTED) == 0)
     return "Disconnected.";
   else if (strcmp (error, DBUS_ERROR_INVALID_ARGS) == 0)
-    return "Invalid argumemts.";
+    return "Invalid arguments.";
   else if (strcmp (error, DBUS_ERROR_NO_REPLY) == 0)
     return "Did not get a reply message.";
   else if (strcmp (error, DBUS_ERROR_FILE_NOT_FOUND) == 0)
index 68178b1..92989b8 100644 (file)
@@ -474,6 +474,7 @@ _dbus_keyring_reload (DBusKeyring *keyring,
       int id;
       long timestamp;
       int len;
+      int end;
       DBusKey *new;
 
       /* Don't load more than the max. */
@@ -542,13 +543,20 @@ _dbus_keyring_reload (DBusKeyring *keyring,
       
       keys[n_keys-1].id = id;
       keys[n_keys-1].creation_time = timestamp;
-      if (!_dbus_string_hex_decode (&line, next,
-                                    &keys[n_keys-1].secret,
-                                    0))
-        {
-          dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
-          goto out;
-        }
+      if (!_dbus_string_hex_decode (&line, next, &end,
+                                    &keys[n_keys-1].secret, 0))
+       {
+         dbus_set_error (error, DBUS_ERROR_NO_MEMORY, NULL);
+         goto out;
+       }
+
+      if (_dbus_string_get_length (&line) != end)
+       {
+         _dbus_verbose ("invalid hex encoding in keyring file\n");
+         _dbus_string_free (&keys[n_keys - 1].secret);
+         n_keys -= 1;
+         continue;
+       }
     }
 
   _dbus_verbose ("Successfully loaded %d existing keys\n",
index 6a83398..8820273 100644 (file)
@@ -2125,400 +2125,6 @@ _dbus_string_ends_with_c_str (const DBusString *a,
   return TRUE;
 }
 
-static const signed char base64_table[] = {
-  /* 0 */ 'A',
-  /* 1 */ 'B',
-  /* 2 */ 'C',
-  /* 3 */ 'D',
-  /* 4 */ 'E',
-  /* 5 */ 'F',
-  /* 6 */ 'G',
-  /* 7 */ 'H',
-  /* 8 */ 'I',
-  /* 9 */ 'J',
-  /* 10 */ 'K',
-  /* 11 */ 'L',
-  /* 12 */ 'M',
-  /* 13 */ 'N',
-  /* 14 */ 'O',
-  /* 15 */ 'P',
-  /* 16 */ 'Q',
-  /* 17 */ 'R',
-  /* 18 */ 'S',
-  /* 19 */ 'T',
-  /* 20 */ 'U',
-  /* 21 */ 'V',
-  /* 22 */ 'W',
-  /* 23 */ 'X',
-  /* 24 */ 'Y',
-  /* 25 */ 'Z',
-  /* 26 */ 'a',
-  /* 27 */ 'b',
-  /* 28 */ 'c',
-  /* 29 */ 'd',
-  /* 30 */ 'e',
-  /* 31 */ 'f',
-  /* 32 */ 'g',
-  /* 33 */ 'h',
-  /* 34 */ 'i',
-  /* 35 */ 'j',
-  /* 36 */ 'k',
-  /* 37 */ 'l',
-  /* 38 */ 'm',
-  /* 39 */ 'n',
-  /* 40 */ 'o',
-  /* 41 */ 'p',
-  /* 42 */ 'q',
-  /* 43 */ 'r',
-  /* 44 */ 's',
-  /* 45 */ 't',
-  /* 46 */ 'u',
-  /* 47 */ 'v',
-  /* 48 */ 'w',
-  /* 49 */ 'x',
-  /* 50 */ 'y',
-  /* 51 */ 'z',
-  /* 52 */ '0',
-  /* 53 */ '1',
-  /* 54 */ '2',
-  /* 55 */ '3',
-  /* 56 */ '4',
-  /* 57 */ '5',
-  /* 58 */ '6',
-  /* 59 */ '7',
-  /* 60 */ '8',
-  /* 61 */ '9',
-  /* 62 */ '+',
-  /* 63 */ '/'
-};
-
-/** The minimum char that's a valid char in Base64-encoded text */
-#define UNBASE64_MIN_CHAR (43)
-/** The maximum char that's a valid char in Base64-encoded text */
-#define UNBASE64_MAX_CHAR (122)
-/** Must subtract this from a char's integer value before offsetting
- * into unbase64_table
- */
-#define UNBASE64_TABLE_OFFSET UNBASE64_MIN_CHAR
-static const signed char unbase64_table[] = {
-  /* 43 + */ 62,
-  /* 44 , */ -1,
-  /* 45 - */ -1,
-  /* 46 . */ -1,
-  /* 47 / */ 63,
-  /* 48 0 */ 52,
-  /* 49 1 */ 53,
-  /* 50 2 */ 54,
-  /* 51 3 */ 55,
-  /* 52 4 */ 56,
-  /* 53 5 */ 57,
-  /* 54 6 */ 58,
-  /* 55 7 */ 59,
-  /* 56 8 */ 60,
-  /* 57 9 */ 61,
-  /* 58 : */ -1,
-  /* 59 ; */ -1,
-  /* 60 < */ -1,
-  /* 61 = */ -1,
-  /* 62 > */ -1,
-  /* 63 ? */ -1,
-  /* 64 @ */ -1,
-  /* 65 A */ 0,
-  /* 66 B */ 1,
-  /* 67 C */ 2,
-  /* 68 D */ 3,
-  /* 69 E */ 4,
-  /* 70 F */ 5,
-  /* 71 G */ 6,
-  /* 72 H */ 7,
-  /* 73 I */ 8,
-  /* 74 J */ 9,
-  /* 75 K */ 10,
-  /* 76 L */ 11,
-  /* 77 M */ 12,
-  /* 78 N */ 13,
-  /* 79 O */ 14,
-  /* 80 P */ 15,
-  /* 81 Q */ 16,
-  /* 82 R */ 17,
-  /* 83 S */ 18,
-  /* 84 T */ 19,
-  /* 85 U */ 20,
-  /* 86 V */ 21,
-  /* 87 W */ 22,
-  /* 88 X */ 23,
-  /* 89 Y */ 24,
-  /* 90 Z */ 25,
-  /* 91 [ */ -1,
-  /* 92 \ */ -1,
-  /* 93 ] */ -1,
-  /* 94 ^ */ -1,
-  /* 95 _ */ -1,
-  /* 96 ` */ -1,
-  /* 97 a */ 26,
-  /* 98 b */ 27,
-  /* 99 c */ 28,
-  /* 100 d */ 29,
-  /* 101 e */ 30,
-  /* 102 f */ 31,
-  /* 103 g */ 32,
-  /* 104 h */ 33,
-  /* 105 i */ 34,
-  /* 106 j */ 35,
-  /* 107 k */ 36,
-  /* 108 l */ 37,
-  /* 109 m */ 38,
-  /* 110 n */ 39,
-  /* 111 o */ 40,
-  /* 112 p */ 41,
-  /* 113 q */ 42,
-  /* 114 r */ 43,
-  /* 115 s */ 44,
-  /* 116 t */ 45,
-  /* 117 u */ 46,
-  /* 118 v */ 47,
-  /* 119 w */ 48,
-  /* 120 x */ 49,
-  /* 121 y */ 50,
-  /* 122 z */ 51
-};
-
-/**
- * Encodes a string using Base64, as documented in RFC 2045.
- *
- * @param source the string to encode
- * @param start byte index to start encoding
- * @param dest string where encoded data should be placed
- * @param insert_at where to place encoded data
- * @returns #TRUE if encoding was successful, #FALSE if no memory etc.
- */
-dbus_bool_t
-_dbus_string_base64_encode (const DBusString *source,
-                            int               start,
-                            DBusString       *dest,
-                            int               insert_at)
-{
-  int source_len;
-  unsigned int dest_len; /* unsigned for overflow checks below */
-  const unsigned char *s;
-  unsigned char *d;
-  const unsigned char *triplet_end;
-  const unsigned char *final_end;
-  DBUS_STRING_COPY_PREAMBLE (source, start, dest, insert_at);  
-  _dbus_assert (source != dest);
-  
-  /* For each 24 bits (3 bytes) of input, we have 4 bytes of
-   * output.
-   */
-  source_len = real_source->len - start;
-  dest_len = (source_len / 3) * 4;
-  if (source_len % 3 != 0)
-    dest_len += 4;
-
-  if (dest_len > (unsigned int) real_dest->max_length)
-    return FALSE;
-  
-  if (source_len == 0)
-    return TRUE;
-  
-  if (!open_gap (dest_len, real_dest, insert_at))
-    return FALSE;
-
-  d = real_dest->str + insert_at;
-  s = real_source->str + start;
-  final_end = real_source->str + (start + source_len);
-  triplet_end = final_end - (source_len % 3);
-  _dbus_assert (triplet_end <= final_end);
-  _dbus_assert ((final_end - triplet_end) < 3);
-
-#define ENCODE_64(v) (base64_table[ (unsigned char) (v) ])
-#define SIX_BITS_MASK (0x3f)
-  _dbus_assert (SIX_BITS_MASK < _DBUS_N_ELEMENTS (base64_table));
-  
-  while (s != triplet_end)
-    {
-      unsigned int triplet;
-
-      triplet = s[2] | (s[1] << 8) | (s[0] << 16);
-
-      /* Encode each 6 bits. */
-
-      *d++ = ENCODE_64 (triplet >> 18);
-      *d++ = ENCODE_64 ((triplet >> 12) & SIX_BITS_MASK);
-      *d++ = ENCODE_64 ((triplet >> 6) & SIX_BITS_MASK);
-      *d++ = ENCODE_64 (triplet & SIX_BITS_MASK);
-      
-      s += 3;
-    }
-
-  switch (final_end - triplet_end)
-    {
-    case 2:
-      {
-        unsigned int doublet;
-        
-        doublet = s[1] | (s[0] << 8);        
-
-        *d++ = ENCODE_64 (doublet >> 12);
-        *d++ = ENCODE_64 ((doublet >> 6) & SIX_BITS_MASK);
-        *d++ = ENCODE_64 (doublet & SIX_BITS_MASK);
-        *d++ = '=';
-      }
-      break;
-    case 1:
-      {
-        unsigned int singlet;
-        
-        singlet = s[0];
-
-        *d++ = ENCODE_64 ((singlet >> 6) & SIX_BITS_MASK);
-        *d++ = ENCODE_64 (singlet & SIX_BITS_MASK);
-        *d++ = '=';
-        *d++ = '=';
-      }
-      break;
-    case 0:
-      break;
-    }
-
-  _dbus_assert (d == (real_dest->str + (insert_at + dest_len)));
-
-  return TRUE;
-}
-
-/**
- * Decodes a string from Base64, as documented in RFC 2045.
- *
- * @todo sort out the AUDIT comment in here. The case it mentions
- * ("====" or "x===") is not allowed in correct base64, so need to
- * decide what to do with that kind of input. Probably ignore it
- * since we ignore any other junk seen.
- *
- * @param source the string to decode
- * @param start byte index to start decode
- * @param dest string where decoded data should be placed
- * @param insert_at where to place decoded data
- * @returns #TRUE if decoding was successful, #FALSE if no memory etc.
- */
-dbus_bool_t
-_dbus_string_base64_decode (const DBusString *source,
-                            int               start,
-                            DBusString       *dest,
-                            int               insert_at)
-{
-  int source_len;
-  const char *s;
-  const char *end;
-  DBusString result;
-  unsigned int triplet = 0;
-  int sextet_count;
-  int pad_count;
-  DBUS_STRING_COPY_PREAMBLE (source, start, dest, insert_at);
-  _dbus_assert (source != dest);
-  
-  source_len = real_source->len - start;
-  s = real_source->str + start;
-  end = real_source->str + source_len;
-
-  if (source_len == 0)
-    return TRUE;
-
-  if (!_dbus_string_init (&result))
-    return FALSE;
-
-  pad_count = 0;
-  sextet_count = 0;
-  while (s != end)
-    {
-      /* The idea is to just skip anything that isn't
-       * a base64 char - it's allowed to have whitespace,
-       * newlines, etc. in here. We also ignore trailing
-       * base64 chars, though that's suspicious.
-       */
-      
-      if (*s >= UNBASE64_MIN_CHAR &&
-          *s <= UNBASE64_MAX_CHAR)
-        {
-          if (*s == '=')
-            {
-              /* '=' is padding, doesn't represent additional data
-               * but does increment our count.
-               */
-              pad_count += 1;
-              sextet_count += 1;
-            }
-          else
-            {
-              int val;
-
-              val = unbase64_table[(*s) - UNBASE64_TABLE_OFFSET];
-
-              if (val >= 0)
-                {
-                  triplet <<= 6;
-                  triplet |= (unsigned int) val;
-                  sextet_count += 1;
-                }
-            }
-
-          if (sextet_count == 4)
-            {
-              /* no pad = 3 bytes, 1 pad = 2 bytes, 2 pad = 1 byte */
-
-
-             /* AUDIT: Comment doesn't mention 4 pad => 0,
-              *         3 pad => 1 byte, though the code should
-              *        work fine if those are the required outputs.
-              *
-              *        I assume that the spec requires dropping
-              *        the top two bits of, say, ///= which is > 2 
-              *        bytes worth of bits. (Or otherwise, you couldn't
-              *        actually represent 2 byte sequences.
-              */
-              
-              if (pad_count < 1)
-                {
-                  if (!_dbus_string_append_byte (&result,
-                                                 triplet >> 16))
-                    goto failed;
-                }
-              
-              if (pad_count < 2)
-                {
-                  if (!_dbus_string_append_byte (&result,
-                                                 (triplet >> 8) & 0xff))
-                    goto failed;
-                }
-              
-              if (!_dbus_string_append_byte (&result,
-                                             triplet & 0xff))
-                goto failed;
-              
-              sextet_count = 0;
-              pad_count = 0;
-              triplet = 0;
-            }
-        }
-      
-      ++s;
-    }
-
-  if (!_dbus_string_move (&result, 0, dest, insert_at))
-    {
-      _dbus_string_free (&result);
-      return FALSE;
-    }
-
-  _dbus_string_free (&result);
-
-  return TRUE;
-
- failed:
-  _dbus_string_free (&result);
-
-  return FALSE;
-}
-
 /**
  * Encodes a string in hex, the way MD5 and SHA-1 are usually
  * encoded. (Each byte is two hex digits.)
@@ -2583,13 +2189,15 @@ _dbus_string_hex_encode (const DBusString *source,
  *
  * @param source the string to decode
  * @param start byte index to start decode
+ * @param end_return return location of the end of the hex data, or #NULL
  * @param dest string where decoded data should be placed
  * @param insert_at where to place decoded data
- * @returns #TRUE if decoding was successful, #FALSE if no memory etc.
+ * @returns #TRUE if decoding was successful, #FALSE if no memory.
  */
 dbus_bool_t
 _dbus_string_hex_decode (const DBusString *source,
                          int               start,
+                        int              *end_return,
                          DBusString       *dest,
                          int               insert_at)
 {
@@ -2672,17 +2280,14 @@ _dbus_string_hex_decode (const DBusString *source,
           val = 15;
           break;
         default:
-          val = 0;
-          _dbus_verbose ("invalid character '%c' in hex encoded text\n",
-                         *p);
-          goto out;
+          goto done;
         }
 
       if (high_bits)
         {
           if (!_dbus_string_append_byte (&result,
                                          val << 4))
-            goto out;
+           goto out;
         }
       else
         {
@@ -2703,9 +2308,13 @@ _dbus_string_hex_decode (const DBusString *source,
       ++p;
     }
 
+ done:
   if (!_dbus_string_move (&result, 0, dest, insert_at))
     goto out;
 
+  if (end_return)
+    *end_return = p - (const unsigned char*) _dbus_string_get_const_data (source);
+
   retval = TRUE;
   
  out:
@@ -3228,60 +2837,13 @@ test_max_len (DBusString *str,
 }
 
 static void
-test_base64_roundtrip (const unsigned char *data,
-                       int                  len)
-{
-  DBusString orig;
-  DBusString encoded;
-  DBusString decoded;
-
-  if (len < 0)
-    len = strlen (data);
-  
-  if (!_dbus_string_init (&orig))
-    _dbus_assert_not_reached ("could not init string");
-
-  if (!_dbus_string_init (&encoded))
-    _dbus_assert_not_reached ("could not init string");
-  
-  if (!_dbus_string_init (&decoded))
-    _dbus_assert_not_reached ("could not init string");
-
-  if (!_dbus_string_append_len (&orig, data, len))
-    _dbus_assert_not_reached ("couldn't append orig data");
-
-  if (!_dbus_string_base64_encode (&orig, 0, &encoded, 0))
-    _dbus_assert_not_reached ("could not encode");
-
-  if (!_dbus_string_base64_decode (&encoded, 0, &decoded, 0))
-    _dbus_assert_not_reached ("could not decode");
-
-  if (!_dbus_string_equal (&orig, &decoded))
-    {
-      const char *s;
-      
-      printf ("Original string %d bytes encoded %d bytes decoded %d bytes\n",
-              _dbus_string_get_length (&orig),
-              _dbus_string_get_length (&encoded),
-              _dbus_string_get_length (&decoded));
-      printf ("Original: %s\n", data);
-      s = _dbus_string_get_const_data (&decoded);
-      printf ("Decoded: %s\n", s);
-      _dbus_assert_not_reached ("original string not the same as string decoded from base64");
-    }
-  
-  _dbus_string_free (&orig);
-  _dbus_string_free (&encoded);
-  _dbus_string_free (&decoded);  
-}
-
-static void
 test_hex_roundtrip (const unsigned char *data,
                     int                  len)
 {
   DBusString orig;
   DBusString encoded;
   DBusString decoded;
+  int end;
 
   if (len < 0)
     len = strlen (data);
@@ -3301,9 +2863,11 @@ test_hex_roundtrip (const unsigned char *data,
   if (!_dbus_string_hex_encode (&orig, 0, &encoded, 0))
     _dbus_assert_not_reached ("could not encode");
 
-  if (!_dbus_string_hex_decode (&encoded, 0, &decoded, 0))
+  if (!_dbus_string_hex_decode (&encoded, 0, &end, &decoded, 0))
     _dbus_assert_not_reached ("could not decode");
     
+  _dbus_assert (_dbus_string_get_length (&encoded) == end);
+
   if (!_dbus_string_equal (&orig, &decoded))
     {
       const char *s;
@@ -3315,7 +2879,7 @@ test_hex_roundtrip (const unsigned char *data,
       printf ("Original: %s\n", data);
       s = _dbus_string_get_const_data (&decoded);
       printf ("Decoded: %s\n", s);
-      _dbus_assert_not_reached ("original string not the same as string decoded from base64");
+      _dbus_assert_not_reached ("original string not the same as string decoded from hex");
     }
   
   _dbus_string_free (&orig);
@@ -3867,8 +3431,18 @@ _dbus_string_test (void)
   
   _dbus_string_free (&str);
 
-  /* Base 64 and Hex encoding */
-  test_roundtrips (test_base64_roundtrip);
+  /* Hex encoding */
+  _dbus_string_init_const (&str, "cafebabe, this is a bogus hex string");
+  if (!_dbus_string_init (&other))
+    _dbus_assert_not_reached ("could not init string");
+
+  if (!_dbus_string_hex_decode (&str, 0, &end, &other, 0))
+    _dbus_assert_not_reached ("deccoded bogus hex string with no error");
+
+  _dbus_assert (end == 8);
+
+  _dbus_string_free (&other);
+
   test_roundtrips (test_hex_roundtrip);
 
   /* Path validation */
index 00d12a3..1499e0c 100644 (file)
@@ -202,20 +202,13 @@ dbus_bool_t   _dbus_string_pop_line              (DBusString        *source,
                                                   DBusString        *dest);
 void          _dbus_string_delete_first_word     (DBusString        *str);
 void          _dbus_string_delete_leading_blanks (DBusString        *str);
-dbus_bool_t   _dbus_string_base64_encode         (const DBusString  *source,
-                                                  int                start,
-                                                  DBusString        *dest,
-                                                  int                insert_at);
-dbus_bool_t   _dbus_string_base64_decode         (const DBusString  *source,
-                                                  int                start,
-                                                  DBusString        *dest,
-                                                  int                insert_at);
 dbus_bool_t   _dbus_string_hex_encode            (const DBusString  *source,
                                                   int                start,
                                                   DBusString        *dest,
                                                   int                insert_at);
 dbus_bool_t   _dbus_string_hex_decode            (const DBusString  *source,
                                                   int                start,
+                                                 int               *end_return,
                                                   DBusString        *dest,
                                                   int                insert_at);
 dbus_bool_t   _dbus_string_validate_ascii        (const DBusString  *str,
index c35b25e..68051db 100644 (file)
--- a/doc/TODO
+++ b/doc/TODO
 
  - recursive dispatch, see dbus_connection_dispatch()
 
- - the auth protocol may as well use hex encoding instead of 
-   base64, then we can dump the base64 implementation and 
-   save some bloat.
-
  - Better error checking for bogus configuration files. Currently if a 
    configuration file tries to include itself the bus crashes on start. We 
    should probably have a check against this.
index 7a09a5c..aacb480 100644 (file)
       <title>DATA Command</title>
       <para>
         The DATA command may come from either client or server, and simply 
-        contains a base64-encoded block of data to be interpreted 
+        contains a hex-encoded block of data to be interpreted 
         according to the SASL mechanism in use.
       </para>
       <para>
index bcb9b3e..b69f940 100644 (file)
           ## this tests a successful auth of type EXTERNAL
           
           SERVER
-          SEND 'AUTH EXTERNAL USERNAME_BASE64'
+          SEND 'AUTH EXTERNAL USERNAME_HEX'
           EXPECT_COMMAND OK
           EXPECT_STATE WAITING_FOR_INPUT
           SEND 'BEGIN'
index 53170a2..387456a 100644 (file)
@@ -9,7 +9,7 @@ INCLUDES=-I$(top_srcdir) $(DBUS_TEST_CFLAGS)
 
 
 if DBUS_BUILD_TESTS
-TEST_BINARIES=test-service unbase64 break-loader spawn-test test-segfault test-exit test-sleep-forever
+TEST_BINARIES=test-service break-loader spawn-test test-segfault test-exit test-sleep-forever
 else
 TEST_BINARIES=
 endif
@@ -27,9 +27,6 @@ test_service_SOURCES=                         \
        test-utils.c                            \
        test-utils.h
 
-unbase64_SOURCES=                              \
-       unbase64.c
-
 break_loader_SOURCES=                          \
        break-loader.c
 
@@ -51,7 +48,6 @@ decode_gcov_SOURCES=                          \
 TEST_LIBS=$(DBUS_TEST_LIBS) $(top_builddir)/dbus/libdbus-convenience.la
 
 test_service_LDADD=$(TEST_LIBS)
-unbase64_LDADD=$(TEST_LIBS)
 break_loader_LDADD= $(TEST_LIBS)
 spawn_test_LDADD=$(TEST_LIBS)
 decode_gcov_LDADD=$(TEST_LIBS)
index a99c612..f2c519a 100644 (file)
@@ -1,7 +1,7 @@
 ## this tests canceling EXTERNAL
 
 SERVER
-SEND 'AUTH EXTERNAL USERID_BASE64'
+SEND 'AUTH EXTERNAL USERID_HEX'
 EXPECT_COMMAND OK
 EXPECT_STATE WAITING_FOR_INPUT
 SEND 'CANCEL'
@@ -9,7 +9,7 @@ EXPECT_COMMAND REJECTED
 EXPECT_STATE WAITING_FOR_INPUT
 
 ## now start over and see if it works
-SEND 'AUTH EXTERNAL USERID_BASE64'
+SEND 'AUTH EXTERNAL USERID_HEX'
 EXPECT_COMMAND OK
 EXPECT_STATE WAITING_FOR_INPUT
 SEND 'BEGIN'
index 8f0d1aa..b11ee9c 100644 (file)
@@ -2,7 +2,7 @@
 
 SERVER
 NO_CREDENTIALS
-SEND 'AUTH EXTERNAL USERID_BASE64'
+SEND 'AUTH EXTERNAL USERID_HEX'
 EXPECT_COMMAND REJECTED
 EXPECT_STATE WAITING_FOR_INPUT
 
index c126067..b018971 100644 (file)
@@ -2,7 +2,7 @@
 
 SERVER
 ROOT_CREDENTIALS
-SEND 'AUTH EXTERNAL USERID_BASE64'
+SEND 'AUTH EXTERNAL USERID_HEX'
 EXPECT_COMMAND OK
 EXPECT_STATE WAITING_FOR_INPUT
 SEND 'BEGIN'
index cbfef8f..8ac0688 100644 (file)
@@ -2,7 +2,7 @@
 
 SERVER
 SILLY_CREDENTIALS
-SEND 'AUTH EXTERNAL USERID_BASE64'
+SEND 'AUTH EXTERNAL USERID_HEX'
 EXPECT_COMMAND REJECTED
 EXPECT_STATE WAITING_FOR_INPUT
 
index 02ecdc0..128d329 100644 (file)
@@ -1,7 +1,7 @@
 ## this tests a successful auth of type EXTERNAL
 
 SERVER
-SEND 'AUTH EXTERNAL USERID_BASE64'
+SEND 'AUTH EXTERNAL USERID_HEX'
 EXPECT_COMMAND OK
 EXPECT_STATE WAITING_FOR_INPUT
 SEND 'BEGIN'
index 0bd705d..cd1e01d 100644 (file)
@@ -1,7 +1,7 @@
 ## this tests that we have the expected extra bytes at the end
 
 SERVER
-SEND 'AUTH EXTERNAL USERID_BASE64'
+SEND 'AUTH EXTERNAL USERID_HEX'
 EXPECT_COMMAND OK
 EXPECT_STATE WAITING_FOR_INPUT
 SEND 'BEGIN\r\nHello'
index ae3b907..a56f182 100644 (file)
@@ -4,30 +4,30 @@ SERVER
 NO_CREDENTIALS
 
 # 1
-SEND 'AUTH EXTERNAL USERID_BASE64'
+SEND 'AUTH EXTERNAL USERID_HEX'
 EXPECT_COMMAND REJECTED
 EXPECT_STATE WAITING_FOR_INPUT
 
 # 2
-SEND 'AUTH EXTERNAL USERID_BASE64'
+SEND 'AUTH EXTERNAL USERID_HEX'
 EXPECT_COMMAND REJECTED
 EXPECT_STATE WAITING_FOR_INPUT
 
 # 3
-SEND 'AUTH EXTERNAL USERID_BASE64'
+SEND 'AUTH EXTERNAL USERID_HEX'
 EXPECT_COMMAND REJECTED
 EXPECT_STATE WAITING_FOR_INPUT
 
 # 4
-SEND 'AUTH EXTERNAL USERID_BASE64'
+SEND 'AUTH EXTERNAL USERID_HEX'
 EXPECT_COMMAND REJECTED
 EXPECT_STATE WAITING_FOR_INPUT
 
 # 5
-SEND 'AUTH EXTERNAL USERID_BASE64'
+SEND 'AUTH EXTERNAL USERID_HEX'
 EXPECT_COMMAND REJECTED
 EXPECT_STATE WAITING_FOR_INPUT
 
 # 6
-SEND 'AUTH EXTERNAL USERID_BASE64'
+SEND 'AUTH EXTERNAL USERID_HEX'
 EXPECT_STATE NEED_DISCONNECT
diff --git a/test/data/auth/invalid-hex-encoding.auth-script b/test/data/auth/invalid-hex-encoding.auth-script
new file mode 100644 (file)
index 0000000..1f15c43
--- /dev/null
@@ -0,0 +1,6 @@
+## this tests an invalid hex encoding followed by successful authentication
+
+SERVER
+SEND 'AUTH EXTERNAL willy'
+EXPECT_COMMAND ERROR
+EXPECT_STATE WAITING_FOR_INPUT
diff --git a/test/unbase64.c b/test/unbase64.c
deleted file mode 100644 (file)
index 2dc232f..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-#include <dbus/dbus.h>
-#define DBUS_COMPILATION /* cheat and use string etc. */
-#include <dbus/dbus-string.h>
-#include <dbus/dbus-sysdeps.h>
-#include <dbus/dbus-internals.h>
-#undef DBUS_COMPILATION
-#include <stdio.h>
-
-int
-main (int    argc,
-      char **argv)
-{
-  DBusString contents;
-  DBusString decoded;
-  DBusString filename;
-  const char *s;
-  DBusError error;
-  
-  if (argc < 2)
-    {
-      fprintf (stderr, "Give the file to decode as an argument\n");
-      return 1;
-    }
-
-  _dbus_string_init_const (&filename, argv[1]);
-  
-  if (!_dbus_string_init (&contents))
-    return 1;
-
-  if (!_dbus_string_init (&decoded))
-    return 1;
-
-  dbus_error_init (&error);
-  if (!_dbus_file_get_contents (&contents, &filename, &error))
-    {
-      fprintf (stderr, "Failed to load file: %s\n", error.message);
-      dbus_error_free (&error);
-      return 1;
-    }
-
-  if (!_dbus_string_base64_decode (&contents, 0,
-                                   &decoded, 0))
-    return 1;
-
-  s = _dbus_string_get_const_data (&decoded);
-  
-  fputs (s, stdout);
-  
-  return 0;
-}