diff options
Diffstat (limited to 'src/glibext/secstorage.c')
-rw-r--r-- | src/glibext/secstorage.c | 132 |
1 files changed, 127 insertions, 5 deletions
diff --git a/src/glibext/secstorage.c b/src/glibext/secstorage.c index ed2e4e6..b118aa6 100644 --- a/src/glibext/secstorage.c +++ b/src/glibext/secstorage.c @@ -84,6 +84,9 @@ static void g_secret_storage_dispose(GObject *); /* Procède à la libération totale de la mémoire. */ static void g_secret_storage_finalize(GObject *); +/* Teste un mot de passe par Déverrouillage de clef maître. */ +static bool g_secret_storage_check_primary_password(GSecretStorage *, const char *, void **); + /* Indique le type défini pour un gardien des secrets avec support des stockages. */ @@ -298,7 +301,7 @@ bool g_secret_storage_has_key(const GSecretStorage *storage) * * ******************************************************************************/ -bool g_secret_storage_set_password(const GSecretStorage *storage, const char *passwd) +bool g_secret_storage_set_password(GSecretStorage *storage, const char *passwd) { bool result; /* Bilan à retourner */ unsigned char salt[SECRET_STORAGE_SALT_SIZE]; /* Sel pour la dérivation*/ @@ -422,6 +425,8 @@ bool g_secret_storage_set_password(const GSecretStorage *storage, const char *pa g_settings_set_value(storage->settings, "master", value); + g_signal_emit_by_name(storage, "lock-update"); + result = true; exit_with_ctx: @@ -438,6 +443,89 @@ bool g_secret_storage_set_password(const GSecretStorage *storage, const char *pa /****************************************************************************** * * * Paramètres : storage = espace de stockage sécurisé à consulter. * +* old = ancien mot de passe principal à vérifier. * +* new = nouveau mot de passe principal à appliquer. * +* * +* Description : Modifie le mot de passe protégeant une clef maître. * +* * +* Retour : Bilan de la mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_secret_storage_change_password(GSecretStorage *storage, const char *old, const char *new) +{ + bool result; /* Bilan à retourner */ + + result = false; + + if (!g_secret_storage_has_key(storage)) + goto exit; + + if (!g_secret_storage_check_primary_password(storage, old, NULL)) + goto exit; + + if (!g_secret_storage_is_locked(storage)) + g_secret_storage_lock(storage); + + g_settings_reset(storage->settings, "salt"); + g_settings_reset(storage->settings, "master"); + + result = g_secret_storage_set_password(storage, new); + + exit: + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : storage = espace de stockage sécurisé à consulter. * +* password = mot de passe principal à appliquer. * +* * +* Description : Supprime le mot de passe protégeant une clef maître. * +* * +* Retour : Bilan de la mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_secret_storage_remove_password(GSecretStorage *storage, const char *passwd) +{ + bool result; /* Bilan à retourner */ + + result = false; + + if (!g_secret_storage_has_key(storage)) + goto exit; + + if (!g_secret_storage_check_primary_password(storage, passwd, NULL)) + goto exit; + + if (!g_secret_storage_is_locked(storage)) + g_secret_storage_lock(storage); + + g_settings_reset(storage->settings, "salt"); + g_settings_reset(storage->settings, "master"); + + g_signal_emit_by_name(storage, "lock-update"); + + result = true; + + exit: + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : storage = espace de stockage sécurisé à consulter. * * * * Description : Détermine si la clef de chiffrement maître est vérouillée. * * * @@ -462,8 +550,9 @@ bool g_secret_storage_is_locked(const GSecretStorage *storage) * * * Paramètres : storage = espace de stockage sécurisé à manipuler. * * password = mot de passe principal à utiliser. * +* master = éventuelle adresse pour un stockage de clef. [OUT]* * * -* Description : Déverrouille la clef de chiffrement maître. * +* Description : Teste un mot de passe par Déverrouillage de clef maître. * * * * Retour : Bilan de l'opération. * * * @@ -471,7 +560,7 @@ bool g_secret_storage_is_locked(const GSecretStorage *storage) * * ******************************************************************************/ -bool g_secret_storage_unlock(GSecretStorage *storage, const char *passwd) +static bool g_secret_storage_check_primary_password(GSecretStorage *storage, const char *passwd, void **master) { bool result; /* Bilan à retourner */ GVariant *salt_value; /* Valeur du sel configuré */ @@ -572,8 +661,11 @@ bool g_secret_storage_unlock(GSecretStorage *storage, const char *passwd) /* Stockage de la clef maître en mémoire */ - storage->master_key = malloc(SECRET_STORAGE_KEY_SIZE); - memcpy(storage->master_key, key, SECRET_STORAGE_KEY_SIZE); + if (master != NULL) + { + *master = malloc(SECRET_STORAGE_KEY_SIZE); + memcpy(*master, key, SECRET_STORAGE_KEY_SIZE); + } result = true; @@ -600,6 +692,33 @@ bool g_secret_storage_unlock(GSecretStorage *storage, const char *passwd) /****************************************************************************** * * +* Paramètres : storage = espace de stockage sécurisé à manipuler. * +* password = mot de passe principal à utiliser. * +* * +* Description : Déverrouille la clef de chiffrement maître. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_secret_storage_unlock(GSecretStorage *storage, const char *passwd) +{ + bool result; /* Bilan à retourner */ + + result = g_secret_storage_check_primary_password(storage, passwd, &storage->master_key); + + if (result) + g_signal_emit_by_name(storage, "lock-update"); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : storage = espace de stockage sécurisé à manipuler. * * * * Description : Verrouille la clef de chiffrement maître. * @@ -616,6 +735,9 @@ void g_secret_storage_lock(GSecretStorage *storage) { free(storage->master_key); storage->master_key = NULL; + + g_signal_emit_by_name(storage, "lock-update"); + } } |