summaryrefslogtreecommitdiff
path: root/src/analysis/db/keymgn.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2016-04-09 15:12:06 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2016-04-09 15:12:06 (GMT)
commit865be356c53afc3bdeae21c640bf0c3d5433fc4b (patch)
tree1204a61960a417b6964b4aef245576e0f790ac20 /src/analysis/db/keymgn.c
parent9b7dfd449b08637c4b4fc6d95acf3a8fcb5fd58d (diff)
Created user public and private RSA keys if needed.
Diffstat (limited to 'src/analysis/db/keymgn.c')
-rw-r--r--src/analysis/db/keymgn.c166
1 files changed, 166 insertions, 0 deletions
diff --git a/src/analysis/db/keymgn.c b/src/analysis/db/keymgn.c
new file mode 100644
index 0000000..bcd8d28
--- /dev/null
+++ b/src/analysis/db/keymgn.c
@@ -0,0 +1,166 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * keymgn.c - mise en place et gestion des clefs cryptographiques
+ *
+ * Copyright (C) 2016 Cyrille Bagard
+ *
+ * This file is part of Chrysalide.
+ *
+ * OpenIDA is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * OpenIDA is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#include "keymgn.h"
+
+
+#include <glib.h>
+#include <malloc.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <openssl/evp.h>
+#include <openssl/rsa.h>
+
+
+#include <i18n.h>
+
+
+#include "../../common/xdg.h"
+
+
+
+/* Met en place de nouvelles clefs RSA. */
+static bool generate_user_rsa_keys(const char *, const char *);
+
+
+
+/******************************************************************************
+* *
+* Paramètres : - *
+* *
+* Description : S'assure que l'utilisateur dispose de clefs RSA. *
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool ensure_user_has_rsa_keys(void)
+{
+ bool result; /* Bilan à retourner */
+ char *priv; /* Chemin de la clef privée */
+ char *pub; /* Chemin de la clef publique */
+ int priv_check; /* Bilan d'une vérification #1 */
+ int pub_check; /* Bilan d'une vérification #2 */
+
+ result = NULL;
+
+ priv = get_xdg_config_dir("chrysalide" G_DIR_SEPARATOR_S "id_rsa.priv");
+ pub = get_xdg_config_dir("chrysalide" G_DIR_SEPARATOR_S "id_rsa.pub");
+
+ priv_check = access(priv, R_OK);
+ pub_check = access(pub, R_OK);
+
+ result = (priv_check == 0 && pub_check == 0);
+
+ if (!result)
+ {
+ result = generate_user_rsa_keys(priv, pub);
+
+ if (!result)
+ fprintf(stderr, _("Unable to create new user RSA key pair."));
+
+ }
+
+ free(priv);
+ free(pub);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : priv = chemin d'accès pour la clef privée. *
+* pub = chemin d'accès pour la clef publique. *
+* *
+* Description : Met en place de nouvelles clefs RSA. *
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static bool generate_user_rsa_keys(const char *priv, const char *pub)
+{
+ bool result; /* Bilan à retourner */
+ EVP_PKEY_CTX *ctx; /* Contexte de génération */
+ int ret; /* Bilan d'un appel */
+ EVP_PKEY *pair; /* Paire de clefs RSA générée */
+ char *filename; /* Chemin d'accès */
+ FILE *stream; /* Flux ouvert en écriture */
+
+ result = false;
+
+ /**
+ * Cf. https://www.openssl.org/docs/manmaster/crypto/EVP_PKEY_keygen.html
+ */
+
+ ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL);
+ if (ctx == NULL) goto euhrk_exit;
+
+ ret = EVP_PKEY_keygen_init(ctx);
+ if (ret != 1) goto euhrk_exit;
+
+ ret = EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, 2048);
+ if (ret != 1) goto euhrk_exit;
+
+ ret = EVP_PKEY_keygen(ctx, &pair);
+ if (ret != 1) goto euhrk_exit;
+
+ /* Clef privée */
+
+ stream = fopen(priv, "wt");
+ if (stream == NULL) goto euhrk_bad_write;
+
+ ret = PEM_write_PrivateKey(stream, pair, NULL, NULL, 0, NULL, NULL);
+ if (ret != 1) goto euhrk_bad_write;
+
+ fclose(stream);
+
+ /* Clef publique */
+
+ stream = fopen(pub, "wt");
+ if (stream == NULL) goto euhrk_bad_write;
+
+ ret = PEM_write_PUBKEY(stream, pair);
+ if (ret != 1) goto euhrk_bad_write;
+
+ result = true;
+
+ euhrk_bad_write:
+
+ fclose(stream);
+
+ EVP_PKEY_free(pair);
+
+ euhrk_exit:
+
+ EVP_PKEY_CTX_free(ctx);
+
+ return result;
+
+}