25 #include "dbus-keyring.h"
26 #include "dbus-protocol.h"
27 #include <dbus/dbus-string.h>
28 #include <dbus/dbus-list.h>
29 #include <dbus/dbus-sysdeps.h>
67 #define NEW_KEY_TIMEOUT_SECONDS (60*5)
73 #define EXPIRE_KEYS_TIMEOUT_SECONDS (NEW_KEY_TIMEOUT_SECONDS + (60*2))
77 #define MAX_TIME_TRAVEL_SECONDS (60*5)
83 #ifdef DBUS_BUILD_TESTS
84 #define MAX_KEYS_IN_FILE 10
86 #define MAX_KEYS_IN_FILE 256
123 _dbus_keyring_new (
void)
191 #define MAX_LOCK_TIMEOUTS 32
193 #define LOCK_TIMEOUT_MILLISECONDS 250
209 _dbus_verbose (
"Did not get lock file, sleeping %d milliseconds (%s)\n",
222 _dbus_verbose (
"Lock file timed out %d times, assuming stale\n",
227 _dbus_verbose (
"Couldn't delete old lock file: %s\n",
236 _dbus_verbose (
"Couldn't create lock file after deleting stale one: %s\n",
253 _dbus_warn (
"Failed to delete lock file: %s\n",
269 if (keys[i].
id ==
id)
287 const unsigned char *s;
292 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
313 s = (
const unsigned char*) _dbus_string_get_const_data (&bytes);
315 id = s[0] | (s[1] << 8) | (s[2] << 16) | (s[3] << 24);
320 if (find_key_by_id (keys, n_keys,
id) !=
NULL)
323 _dbus_verbose (
"Key ID %d already existed, trying another one\n",
328 _dbus_verbose (
"Creating key with ID %d\n",
id);
330 #define KEY_LENGTH_BYTES 24
358 keys[n_keys-1].
id = id;
361 &keys[n_keys-1].secret,
408 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
435 if (!_dbus_keyring_lock (keyring))
438 "Could not lock keyring file to add to it");
450 _dbus_verbose (
"Failed to load keyring file: %s\n",
457 _dbus_string_get_length (&contents)))
459 _dbus_warn (
"Secret keyring file contains non-ASCII! Ignoring existing contents\n");
483 _dbus_verbose (
"could not parse secret key ID at start of line\n");
489 _dbus_verbose (
"invalid secret key ID at start of line\n");
499 _dbus_verbose (
"could not parse secret key timestamp\n");
507 _dbus_verbose (
"dropping/ignoring %ld-seconds old key with timestamp %ld as current time is %ld\n",
508 now - timestamp, timestamp, now);
514 len = _dbus_string_get_length (&line);
516 if ((len - next) == 0)
518 _dbus_verbose (
"no secret key after ID and timestamp\n");
540 keys[n_keys-1].
id = id;
543 &keys[n_keys-1].secret, 0))
549 if (_dbus_string_get_length (&line) != end)
551 _dbus_verbose (
"invalid hex encoding in keyring file\n");
558 _dbus_verbose (
"Successfully loaded %d existing keys\n",
563 if (!add_new_key (&keys, &n_keys, error))
565 _dbus_verbose (
"Failed to generate new key: %s\n",
566 error ? error->
message :
"(unknown)");
583 keys[i].creation_time))
591 _dbus_string_get_length (&contents)))
612 keyring->
keys = keys;
621 _dbus_keyring_unlock (keyring);
626 if (error && error->
name)
627 _dbus_verbose (
"error is %s: %s\n", error->
name, error->
message);
628 _dbus_warn (
"returning %d but error pointer %p name %s\n",
629 retval, error, error->
name ? error->
name :
"(none)");
719 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
723 our_credentials =
NULL;
731 if (credentials !=
NULL)
740 if (our_credentials ==
NULL)
753 keyring = _dbus_keyring_new ();
759 our_credentials =
NULL;
767 "Invalid context in keyring creation");
795 if (!_dbus_keyring_reload (keyring,
FALSE, &tmp_error))
797 _dbus_verbose (
"didn't load an existing keyring: %s\n",
810 _dbus_verbose (
"Creating keyring directory: %s\n",
848 if (_dbus_string_get_length (context) == 0)
850 _dbus_verbose (
"context is zero-length\n");
855 _dbus_string_get_length (context)))
857 _dbus_verbose (
"context not valid ascii\n");
864 _dbus_verbose (
"context contains a slash\n");
870 _dbus_verbose (
"context contains a backslash\n");
879 _dbus_verbose (
"context contains a dot\n");
886 _dbus_verbose (
"context contains a blank\n");
892 _dbus_verbose (
"context contains a newline\n");
898 _dbus_verbose (
"context contains a carriage return\n");
909 long tv_sec, tv_usec;
914 while (i < keyring->n_keys)
918 _dbus_verbose (
"Key %d is %ld seconds old\n",
947 _DBUS_ASSERT_ERROR_IS_CLEAR (error);
949 key = find_recent_key (keyring);
956 if (!_dbus_keyring_reload (keyring,
TRUE,
960 key = find_recent_key (keyring);
967 "No recent-enough key found in keyring, and unable to create a new key");
1006 key = find_key_by_id (keyring->
keys,
1014 _dbus_string_get_length (hex_key));
1019 #ifdef DBUS_BUILD_TESTS
1020 #include "dbus-test.h"
1024 _dbus_keyring_test (
void)
1083 fprintf (stderr,
"Could not load keyring: %s\n", error.
message);
1094 fprintf (stderr,
"Different number of keys in keyrings\n");
1102 while (i < ring1->n_keys)
1106 fprintf (stderr,
"Keyring 1 has first key ID %d and keyring 2 has %d\n",
1113 fprintf (stderr,
"Keyring 1 has first key time %ld and keyring 2 has %ld\n",
1121 fprintf (stderr,
"Keyrings 1 and 2 have different secrets for same ID/timestamp\n");
1128 printf (
" %d keys in test\n", ring1->
n_keys);