X-Git-Url: http://git.claws-mail.org/?p=claws.git;a=blobdiff_plain;f=src%2Fpassword.c;h=7e37e28750b92a7a98c899ab70799775dce60a35;hp=dba5ef20bc3c68da5aa08e7d1e02b64e48fcfd5a;hb=5bef3aecedf1f062cc9ddf9a3b819841a5d989f8;hpb=f1811794160f215211d17ed164d8d25822545a23;ds=sidebyside diff --git a/src/password.c b/src/password.c index dba5ef20b..7e37e2875 100644 --- a/src/password.c +++ b/src/password.c @@ -30,12 +30,16 @@ #include #include -#ifdef G_OS_UNIX +#if defined G_OS_UNIX #include #include +#elif defined G_OS_WIN32 +#include +#include #endif #include "common/passcrypt.h" +#include "common/plugin.h" #include "common/utils.h" #include "account.h" #include "alertpanel.h" @@ -210,6 +214,11 @@ void master_password_change(const gchar *newp) } } + /* Now reencrypt all plugins passwords fields + * FIXME: Unloaded plugins won't be able to update their stored passwords + */ + plugins_master_password_change(oldp, newp); + master_password_forget(); } #endif @@ -265,8 +274,10 @@ gchar *password_encrypt_gnutls(const gchar *password, gnutls_datum_t key, iv; int ivlen, keylen, digestlen, blocklen, ret, i; unsigned char hashbuf[BUFSIZE], *buf, *encbuf, *base, *output; -#ifdef G_OS_UNIX +#if defined G_OS_UNIX int rnd; +#elif defined G_OS_WIN32 + HCRYPTPROV rnd; #endif g_return_val_if_fail(password != NULL, NULL); @@ -293,38 +304,48 @@ gchar *password_encrypt_gnutls(const gchar *password, memcpy(key.data, &hashbuf, keylen); key.size = keylen; -#ifdef G_OS_UNIX /* Prepare our source of random data. */ +#if defined G_OS_UNIX rnd = open("/dev/urandom", O_RDONLY); if (rnd == -1) { perror("fopen on /dev/urandom"); +#elif defined G_OS_WIN32 + if (!CryptAcquireContext(&rnd, NULL, NULL, PROV_RSA_FULL, 0) && + !CryptAcquireContext(&rnd, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET)) { + debug_print("Could not acquire a CSP handle.\n"); +#endif g_free(key.data); g_free(iv.data); return NULL; } -#endif /* Prepare random IV for cipher */ iv.data = malloc(ivlen); iv.size = ivlen; -#ifdef G_OS_UNIX +#if defined G_OS_UNIX ret = read(rnd, iv.data, ivlen); if (ret != ivlen) { perror("read into iv"); + close(rnd); +#elif defined G_OS_WIN32 + if (!CryptGenRandom(rnd, ivlen, iv.data)) { + debug_print("Could not read random data for IV\n"); + CryptReleaseContext(rnd, 0); +#endif g_free(key.data); g_free(iv.data); - close(rnd); return NULL; } -#endif /* Initialize the encryption */ ret = gnutls_cipher_init(&handle, algo, &key, &iv); if (ret < 0) { g_free(key.data); g_free(iv.data); -#ifdef G_OS_UNIX +#if defined G_OS_UNIX close(rnd); +#elif defined G_OS_WIN32 + CryptReleaseContext(rnd, 0); #endif return NULL; } @@ -333,20 +354,28 @@ gchar *password_encrypt_gnutls(const gchar *password, * rest with zero bytes. */ buf = malloc(BUFSIZE + blocklen); memset(buf, 0, BUFSIZE); -#ifdef G_OS_UNIX +#if defined G_OS_UNIX ret = read(rnd, buf, blocklen); if (ret != blocklen) { perror("read into buffer"); + close(rnd); +#elif defined G_OS_WIN32 + if (!CryptGenRandom(rnd, blocklen, buf)) { + debug_print("Could not read random data for IV\n"); + CryptReleaseContext(rnd, 0); +#endif g_free(buf); g_free(key.data); g_free(iv.data); - close(rnd); gnutls_cipher_deinit(handle); return NULL; } /* We don't need any more random data. */ +#if defined G_OS_UNIX close(rnd); +#elif defined G_OS_WIN32 + CryptReleaseContext(rnd, 0); #endif memcpy(buf + blocklen, password, strlen(password)); @@ -392,8 +421,10 @@ gchar *password_decrypt_gnutls(const gchar *password, int ivlen, keylen, digestlen, blocklen, ret, i; gsize len; unsigned char hashbuf[BUFSIZE], *buf; -#ifdef G_OS_UNIX +#if defined G_OS_UNIX int rnd; +#elif defined G_OS_WIN32 + HCRYPTPROV rnd; #endif g_return_val_if_fail(password != NULL, NULL); @@ -446,34 +477,46 @@ gchar *password_decrypt_gnutls(const gchar *password, memcpy(key.data, &hashbuf, keylen); key.size = keylen; -#ifdef G_OS_UNIX /* Prepare our source of random data. */ +#if defined G_OS_UNIX rnd = open("/dev/urandom", O_RDONLY); if (rnd == -1) { perror("fopen on /dev/urandom"); +#elif defined G_OS_WIN32 + if (!CryptAcquireContext(&rnd, NULL, NULL, PROV_RSA_FULL, 0) && + !CryptAcquireContext(&rnd, NULL, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET)) { + debug_print("Could not acquire a CSP handle.\n"); +#endif g_free(key.data); g_free(iv.data); g_strfreev(tokens); return NULL; } -#endif /* Prepare random IV for cipher */ iv.data = malloc(ivlen); iv.size = ivlen; -#ifdef G_OS_UNIX +#if defined G_OS_UNIX ret = read(rnd, iv.data, ivlen); if (ret != ivlen) { perror("read into iv"); + close(rnd); +#elif defined G_OS_WIN32 + if (!CryptGenRandom(rnd, ivlen, iv.data)) { + debug_print("Could not read random data for IV\n"); + CryptReleaseContext(rnd, 0); +#endif g_free(key.data); g_free(iv.data); g_strfreev(tokens); - close(rnd); return NULL; } /* We don't need any more random data. */ +#if defined G_OS_UNIX close(rnd); +#elif defined G_OS_WIN32 + CryptReleaseContext(rnd, 0); #endif /* Prepare encrypted password string for decryption. */