diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2019-09-01 21:37:51 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2019-09-01 21:37:51 (GMT) |
commit | a820f204162f61e3e7a91e66c1aabea22f23d0cb (patch) | |
tree | d8cd00ab7dbef97272858c5217ce3ef4b6981996 /src/analysis | |
parent | 14f1b8ff552dfb8aef6c66b3c65e816aa7820bb0 (diff) |
Prepared the update of the user identity from the GUI.
Diffstat (limited to 'src/analysis')
-rw-r--r-- | src/analysis/db/auth.c | 49 | ||||
-rw-r--r-- | src/analysis/db/auth.h | 3 | ||||
-rw-r--r-- | src/analysis/db/certs.c | 109 | ||||
-rw-r--r-- | src/analysis/db/certs.h | 3 |
4 files changed, 138 insertions, 26 deletions
diff --git a/src/analysis/db/auth.c b/src/analysis/db/auth.c index af51af6..5e62f58 100644 --- a/src/analysis/db/auth.c +++ b/src/analysis/db/auth.c @@ -209,6 +209,38 @@ static char *get_cert_storage_directory(const char *outdir, const char *host, co /****************************************************************************** * * +* Paramètres : - * +* * +* Description : Détermine la désignation par défaut de l'usager. * +* * +* Retour : Nom déterminé à libérer de la mémoire. * +* * +* Remarques : - * +* * +******************************************************************************/ + +char *get_default_username(void) +{ + char *result; /* Désignation à retourner */ + uid_t uid; /* Identifiant d'utilisateur */ + struct passwd *pw; /* Indications sur l'usager */ + + uid = geteuid(); + pw = getpwuid(uid); + + if (pw != NULL) + result = strdup(pw->pw_name); + + else + result = strdup("anonymous"); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : valid = durée de validité des certificats. * * entries = éléments d'identité à utiliser pour l'opération. * * * @@ -224,8 +256,6 @@ bool setup_client_identity(unsigned long valid, x509_entries *entries) { bool result; /* Bilan de l'opération */ char *working; /* Répertoire pour le client */ - uid_t uid; /* Identifiant d'utilisateur */ - struct passwd *pw; /* Indications sur l'usager */ working = get_db_working_directory("clients", NULL, NULL, NULL); @@ -235,18 +265,11 @@ bool setup_client_identity(unsigned long valid, x509_entries *entries) { if (entries->common_name == NULL) { - uid = geteuid(); - pw = getpwuid(uid); - - if (pw != NULL) - { - log_variadic_message(LMT_WARNING, - _("Replaced the empty identity common name with '%s'"), - pw->pw_name); - - entries->common_name = strdup(pw->pw_name); + entries->common_name = get_default_username(); - } + log_variadic_message(LMT_WARNING, + _("Replaced the empty identity common name with '%s'"), + entries->common_name); } diff --git a/src/analysis/db/auth.h b/src/analysis/db/auth.h index 4db7af7..4464244 100644 --- a/src/analysis/db/auth.h +++ b/src/analysis/db/auth.h @@ -39,6 +39,9 @@ bool build_internal_server_socket(struct sockaddr_un *); /* Fournit le répertoire de travail pour les données d'analyse. */ char *get_db_working_directory(const char *, const char *, const char *, const char *); +/* Détermine la désignation par défaut de l'usager. */ +char *get_default_username(void); + /* Etablit une base pour l'identité de l'utilisateur. */ bool setup_client_identity(unsigned long, x509_entries *); diff --git a/src/analysis/db/certs.c b/src/analysis/db/certs.c index a333d9a..107b7b9 100644 --- a/src/analysis/db/certs.c +++ b/src/analysis/db/certs.c @@ -24,6 +24,7 @@ #include "certs.h" +#include <assert.h> #include <glib.h> #include <malloc.h> #include <stdio.h> @@ -258,7 +259,7 @@ bool build_keys_and_ca(const char *dir, const char *label, unsigned long valid, EVP_PKEY *pk; /* Enveloppe pour clef publique*/ int ret; /* Bilan d'un appel */ X509 *x509; /* Certificat X509 à définir */ - X509_NAME *name; /* Désignation du certificat */ + X509_NAME *subject; /* SUjet du certificat */ char *filename; /* Chemin d'accès à un fichier */ FILE *stream; /* Flux ouvert en écriture */ @@ -288,14 +289,14 @@ bool build_keys_and_ca(const char *dir, const char *label, unsigned long valid, /* Etablissement d'une identité */ - name = X509_get_subject_name(x509); + subject = X509_get_subject_name(x509); #define SET_NAME_ENTRY(key, value) \ do \ { \ if (entries->value != NULL) \ { \ - ret = X509_NAME_add_entry_by_txt(name, key, MBSTRING_UTF8, \ + ret = X509_NAME_add_entry_by_txt(subject, key, MBSTRING_UTF8, \ (unsigned char *)entries->value, -1, -1, 0); \ if (ret != 1) goto ca_failed; \ } \ @@ -316,7 +317,7 @@ bool build_keys_and_ca(const char *dir, const char *label, unsigned long valid, #undef SET_NAME_ENTRY - ret = X509_set_issuer_name(x509, name); + ret = X509_set_issuer_name(x509, subject); if (ret != 1) goto ca_failed; /* Extensions */ @@ -461,7 +462,7 @@ bool build_keys_and_request(const char *dir, const char *label, const x509_entri EVP_PKEY *pk; /* Enveloppe pour clef publique*/ int ret; /* Bilan d'un appel */ X509_REQ *x509; /* Certificat X509 à définir */ - X509_NAME *name; /* Désignation du certificat */ + X509_NAME *subject; /* Sujet du certificat */ STACK_OF(X509_EXTENSION) *exts; /* Extensions du certificat */ char *filename; /* Chemin d'accès à un fichier */ FILE *stream; /* Flux ouvert en écriture */ @@ -483,14 +484,14 @@ bool build_keys_and_request(const char *dir, const char *label, const x509_entri /* Etablissement d'une identité */ - name = X509_REQ_get_subject_name(x509); + subject = X509_REQ_get_subject_name(x509); #define SET_NAME_ENTRY(key, value) \ do \ { \ if (entries->value != NULL) \ { \ - ret = X509_NAME_add_entry_by_txt(name, key, MBSTRING_UTF8, \ + ret = X509_NAME_add_entry_by_txt(subject, key, MBSTRING_UTF8, \ (unsigned char *)entries->value, -1, -1, 0); \ if (ret != 1) goto req_failed; \ } \ @@ -603,6 +604,88 @@ bool build_keys_and_request(const char *dir, const char *label, const x509_entri /****************************************************************************** * * +* Paramètres : csr = fichier contenant le certificat à signer. * +* entries = éléments de l'identité constituée. [OUT] * +* * +* Description : Recharge l'identité inscrite dans une requête de signature. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool load_identity_from_request(const char *csr, x509_entries *entries) +{ + bool result; /* Bilan à retourner */ + FILE *stream; /* Flux ouvert en lecture */ + X509_REQ *req; /* Certificat X509 à signer */ + X509_NAME *subject; /* Sujet du certificat */ + int length; /* Taille du champ visé */ + + result = false; + + memset(entries, 0, sizeof(*entries)); + + /* Chargement de la requête */ + + stream = fopen(csr, "rb"); + if (stream == NULL) goto csr_read_failed; + + req = PEM_read_X509_REQ(stream, NULL, NULL, NULL); + + fclose(stream); + + if (req == NULL) + { + log_variadic_message(LMT_ERROR, _("Unable to read the certificate signing request from '%s'"), csr); + goto csr_read_failed; + } + + /* Recherche des éléments */ + + subject = X509_REQ_get_subject_name(req); + +#define GET_NAME_ENTRY(key, value) \ + do \ + { \ + length = X509_NAME_get_text_by_NID(subject, key, NULL, -1); \ + if (length != -1) \ + { \ + entries->value = malloc((length + 1) * sizeof(char)); \ + length = X509_NAME_get_text_by_NID(subject, key, entries->value, length + 1); \ + assert(length != -1); \ + } \ + } \ + while (0) + + GET_NAME_ENTRY(NID_countryName, country); + + GET_NAME_ENTRY(NID_stateOrProvinceName, state); + + GET_NAME_ENTRY(NID_localityName, locality); + + GET_NAME_ENTRY(NID_organizationName, organisation); + + GET_NAME_ENTRY(NID_organizationalUnitName, organisational_unit); + + GET_NAME_ENTRY(NID_commonName, common_name); + +#undef GET_NAME_ENTRY + + X509_REQ_free(req); + + result = true; + + csr_read_failed: + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : csr = fichier contenant le certificat à signer. * * cacert = fichier contenant le certificat de l'autorité. * * cakey = fichier contenant la clef privée du CA. * @@ -619,14 +702,14 @@ bool build_keys_and_request(const char *dir, const char *label, const x509_entri bool sign_cert(const char *csr, const char *cacert, const char *cakey, const char *cert, unsigned long valid) { - FILE *stream; /* Flux ouvert en écriture */ + FILE *stream; /* Flux ouvert en lecture */ X509_REQ *req; /* Certificat X509 à signer */ EVP_PKEY *pk; /* Enveloppe pour clef publique*/ X509 *ca_cert; /* Certificat de l'autorité */ EVP_PKEY *ca_pk; /* Enveloppe pour clef privée */ X509 *x509; /* Certificat X509 à définir */ int ret; /* Bilan d'un appel */ - X509_NAME *name; /* Désignation du certificat */ + X509_NAME *subject; /* Sujet de certificat */ /* Chargement de la requête */ @@ -696,14 +779,14 @@ bool sign_cert(const char *csr, const char *cacert, const char *cakey, const cha ret = X509_set_pubkey(x509, pk); if (ret != 1) goto signing_failed; - name = X509_REQ_get_subject_name(req); + subject = X509_REQ_get_subject_name(req); - ret = X509_set_subject_name(x509, name); + ret = X509_set_subject_name(x509, subject); if (ret != 1) goto signing_failed; - name = X509_get_subject_name(ca_cert); + subject = X509_get_subject_name(ca_cert); - ret = X509_set_issuer_name(x509, name); + ret = X509_set_issuer_name(x509, subject); if (ret != 1) goto signing_failed; /* Extensions */ diff --git a/src/analysis/db/certs.h b/src/analysis/db/certs.h index 132cd7f..50c96c0 100644 --- a/src/analysis/db/certs.h +++ b/src/analysis/db/certs.h @@ -54,6 +54,9 @@ bool build_keys_and_ca(const char *, const char *, unsigned long, const x509_ent /* Crée un certificat pour application. */ bool build_keys_and_request(const char *, const char *, const x509_entries *); +/* Recharge l'identité inscrite dans une requête de signature. */ +bool load_identity_from_request(const char *, x509_entries *); + /* Signe un certificat pour application. */ bool sign_cert(const char *, const char *, const char *, const char *, unsigned long); |