Nilorea Library
C utilities for networking, threading, graphics
Loading...
Searching...
No Matches
ex_crypto.c
Go to the documentation of this file.
1/*
2 * Nilorea Library
3 * Copyright (C) 2005-2026 Castagnier Mickael
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation, either version 3 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <https://www.gnu.org/licenses/>.
17 */
18
27#include "nilorea/n_log.h"
28#include "nilorea/n_list.h"
29#include "nilorea/n_str.h"
30#include "nilorea/n_base64.h"
31#include "nilorea/n_crypto.h"
32
33int main(int argc, char* argv[]) {
34 void usage(void) {
35 fprintf(stderr,
36 "%s usage:\n"
37 " -i input_file [optional] use a file as datas instead of hard coded 3 lines text\n"
38 " -v version\n"
39 " -V log level: LOG_INFO, LOG_NOTICE, LOG_ERR, LOG_DEBUG\n"
40 " -h help\n",
41 argv[0]);
42 }
43
44 int getoptret = 0, ret = 0,
45 log_level = LOG_DEBUG; /* default log level */
46
47 N_STR* input_name = NULL;
48
49 /* Arguments optionnels */
50 /* -v version
51 * -V log level
52 * -h help
53 */
54 while ((getoptret = getopt(argc, argv, "i:hvV:")) != EOF) {
55 switch (getoptret) {
56 case 'i':
57 input_name = char_to_nstr(optarg);
58 break;
59 case 'v':
60 fprintf(stderr, "Date de compilation : %s a %s.\n", __DATE__, __TIME__);
61 exit(1);
62 case 'V':
63 if (!strcmp("LOG_NULL", optarg))
65 else if (!strcmp("LOG_NOTICE", optarg))
67 else if (!strcmp("LOG_INFO", optarg))
69 else if (!strcmp("LOG_ERR", optarg))
71 else if (!strcmp("LOG_DEBUG", optarg))
73 else {
74 fprintf(stderr, "%s n'est pas un niveau de log valide.\n", optarg);
75 exit(-1);
76 }
77 break;
78 default:
79 case '?': {
80 if (optopt == 'V') {
81 fprintf(stderr, " => Missing log level\n");
82 } else if (optopt == 'p') {
83 fprintf(stderr, " => Missing port\n");
84 } else if (optopt == 'i') {
85 fprintf(stderr, " => Missing filename\n");
86 } else if (optopt != 's') {
87 fprintf(stderr, " => Unknow missing option %c\n", optopt);
88 }
89 usage();
90 exit(1);
91 }
92 case 'h': {
93 usage();
94 exit(1);
95 }
96 }
97 }
99
100 N_STR* EXAMPLE_TEXT = char_to_nstr(
101 "##############################################################\n"
102 "# This is an example of crypto encode/decode, with a newline #\n"
103 "# This is the end of the test #\n"
104 "##############################################################");
105
106 n_log(LOG_NOTICE, "Testing crypto, encoding text of size (%ld/%ld):\n%s", EXAMPLE_TEXT->written, EXAMPLE_TEXT->length, _nstr(EXAMPLE_TEXT));
107 /* 10 20 30 40 50 60 */
108 /* "1234567890123456789012345678901234567890123456789012345678901234" */
109 /* test n_vigenere_get_rootkey */
110 N_STR* rootkey = n_vigenere_get_rootkey(128);
111 n_log(LOG_DEBUG, "n_vigenere_get_rootkey(128): %s", _nstr(rootkey));
112 free_nstr(&rootkey);
113
114 N_STR* key = char_to_nstr("RKCHSLZWFNASULJFVPRVUUUAEUVEMSSGEVNWIMVPZVIWITBGIUBEQVEURBYEWTMCQZZYNWQMRAIBTMHDIKIZHOVZQUFONRQDSRDFNTTGVEKOSTSAEABLOXMGTTWIMPNE");
115 n_log(LOG_DEBUG, "key= %s", _nstr(key));
116
117 N_STR* B64_EXAMPLE_TEXT = n_base64_encode(EXAMPLE_TEXT);
118 N_STR* encoded_data = n_vigenere_encode(B64_EXAMPLE_TEXT, key);
119 n_log(LOG_DEBUG, "encoded data=\n%s", _nstr(encoded_data));
120
121 N_STR* decoded_data = n_vigenere_decode(encoded_data, key);
122 N_STR* unbase64 = n_base64_decode(decoded_data);
123 n_log(LOG_DEBUG, "decoded data=\n%s", _nstr(unbase64));
124 free_nstr(&unbase64);
125
126 /* test n_vigenere_quick_encode / n_vigenere_quick_decode */
127 N_STR* quick_src = char_to_nstr("quick encode test");
128 N_STR* quick_enc = n_vigenere_quick_encode(quick_src);
129 n_log(LOG_DEBUG, "n_vigenere_quick_encode: %s", _nstr(quick_enc));
130 N_STR* quick_dec = n_vigenere_quick_decode(quick_enc);
131 n_log(LOG_DEBUG, "n_vigenere_quick_decode: %s", _nstr(quick_dec));
132 free_nstr(&quick_src);
133 free_nstr(&quick_enc);
134 free_nstr(&quick_dec);
135
136 N_STR* encoded_question = n_vigenere_get_question(128);
137 N_STR* decoded_question = n_vigenere_quick_decode(encoded_question);
138 n_log(LOG_DEBUG, "encoded_question: %s", _nstr(encoded_question));
139 n_log(LOG_DEBUG, "decoded_question: %s", _nstr(decoded_question));
140 free_nstr(&decoded_question);
141
142 N_STR* answer = n_vigenere_get_answer(key, encoded_question);
143 n_log(LOG_DEBUG, "answer: %s", _nstr(answer));
144
145 N_STR* decode_qa = n_vigenere_decode_qa(encoded_data, encoded_question, answer);
146 n_log(LOG_DEBUG, "encode root decode qa:\n%s", _nstr(decode_qa));
147 free_nstr(&decode_qa);
148
149 N_STR* encode_qa = n_vigenere_encode_qa(EXAMPLE_TEXT, encoded_question, answer);
150 n_log(LOG_DEBUG, "encode qa:\n%s", _nstr(encode_qa));
151
152 decode_qa = n_vigenere_decode_qa(encode_qa, encoded_question, answer);
153 n_log(LOG_DEBUG, "encode qa decode qa:\n%s", _nstr(decode_qa));
154 free_nstr(&decode_qa);
155
156 N_STR* decode_qa_root = n_vigenere_decode(encode_qa, key);
157 unbase64 = n_base64_decode(decode_qa_root);
158 n_log(LOG_DEBUG, "encode qa - decode root:\n%s", _nstr(unbase64));
159
160 free_nstr(&decode_qa_root);
161 free_nstr(&encode_qa);
162
163 if (input_name) {
164 N_STR* output_name_enc = NULL;
165 N_STR* output_name_dec = NULL;
166 N_STR* output_name_dec_question = NULL;
167
168 nstrprintf(output_name_enc, "%s.crypt_encoded", _nstr(input_name));
169 if (n_vigenere_encode_file(input_name, output_name_enc, key)) {
170 n_log(LOG_DEBUG, "Encoded file saved in %s", _nstr(output_name_enc));
171
172 nstrprintf(output_name_dec, "%s.crypt_decoded", _nstr(input_name));
173 if (n_vigenere_decode_file(output_name_enc, output_name_dec, key)) {
174 n_log(LOG_DEBUG, "Decoded file saved in %s", _nstr(output_name_dec));
175
176 nstrprintf(output_name_dec_question, "%s.crypt_decoded_question", _nstr(input_name));
177 if (n_vigenere_decode_file_qa(output_name_enc, output_name_dec_question, encoded_question, answer)) {
178 n_log(LOG_DEBUG, "Decoded with question/answer file saved in %s", _nstr(output_name_dec_question));
179 } else {
180 n_log(LOG_ERR, "unable to decode with question answer");
181 ret = 1;
182 }
183 } else {
184 n_log(LOG_ERR, "unable to decode with root key");
185 ret = 1;
186 }
187 } else {
188 n_log(LOG_ERR, "unable to encode with root key");
189 ret = 1;
190 }
191
192 free_nstr(&input_name);
193 free_nstr(&output_name_enc);
194 free_nstr(&output_name_dec);
195 free_nstr(&output_name_dec_question);
196 }
197
198 free_nstr(&key);
199 free_nstr(&encoded_data);
200 free_nstr(&decoded_data);
201 free_nstr(&encoded_question);
202 free_nstr(&answer);
203 free_nstr(&EXAMPLE_TEXT);
204 free_nstr(&B64_EXAMPLE_TEXT);
205 free_nstr(&unbase64);
206
207 exit(ret);
208} /* END_OF_MAIN */
static void usage(void)
int main(void)
int getoptret
Definition ex_fluid.c:60
int log_level
Definition ex_fluid.c:61
char * key
#define _nstr(__PTR)
N_STR or "NULL" string for logging purposes.
Definition n_common.h:198
N_STR * n_base64_decode(N_STR *bufcoded)
decode a N_STR *string
Definition n_base64.c:187
N_STR * n_base64_encode(N_STR *input)
encode a N_STR *string
Definition n_base64.c:269
N_STR * n_vigenere_encode_qa(N_STR *input_data, N_STR *question, N_STR *answer)
directly vigenere encode a file using key
Definition n_crypto.c:704
int n_vigenere_decode_file_qa(N_STR *in, N_STR *out, N_STR *question, N_STR *answer)
directly vigenere decode a file using question and answer
Definition n_crypto.c:789
N_STR * n_vigenere_quick_encode(N_STR *decoded_data)
quick encode data
Definition n_crypto.c:484
N_STR * n_vigenere_decode(N_STR *string, N_STR *key)
decode input using vigenere cypher and key
Definition n_crypto.c:455
N_STR * n_vigenere_get_answer(N_STR *root_key, N_STR *question)
get an answer from a root key and a question
Definition n_crypto.c:577
N_STR * n_vigenere_decode_qa(N_STR *input_data, N_STR *question, N_STR *answer)
directly vigenere decode a file using key
Definition n_crypto.c:746
N_STR * n_vigenere_encode(N_STR *string, N_STR *key)
encode input using vigenere cypher and key
Definition n_crypto.c:445
int n_vigenere_encode_file(N_STR *in, N_STR *out, N_STR *key)
directly vigenere encode a file using key
Definition n_crypto.c:617
int n_vigenere_decode_file(N_STR *in, N_STR *out, N_STR *key)
directly vigenere decode a file using key
Definition n_crypto.c:661
N_STR * n_vigenere_get_rootkey(size_t rootkey_size)
get a rootkey randomly generated
Definition n_crypto.c:68
N_STR * n_vigenere_get_question(size_t question_size)
get a question generated from the current machine hardware (disk&cpu)
Definition n_crypto.c:516
N_STR * n_vigenere_quick_decode(N_STR *encoded_data)
quick decode data
Definition n_crypto.c:499
#define n_log(__LEVEL__,...)
Logging function wrapper to get line and func.
Definition n_log.h:88
#define LOG_DEBUG
debug-level messages
Definition n_log.h:83
#define LOG_ERR
error conditions
Definition n_log.h:75
void set_log_level(const int log_level)
Set the global log level value ( static int LOG_LEVEL )
Definition n_log.c:120
#define LOG_NOTICE
normal but significant condition
Definition n_log.h:79
#define LOG_NULL
no log output
Definition n_log.h:45
#define LOG_INFO
informational
Definition n_log.h:81
size_t written
size of the written data inside the string
Definition n_str.h:66
size_t length
length of string (in case we wanna keep information after the 0 end of string value)
Definition n_str.h:64
#define free_nstr(__ptr)
free a N_STR structure and set the pointer to NULL
Definition n_str.h:201
N_STR * char_to_nstr(const char *src)
Convert a char into a N_STR, short version.
Definition n_str.c:254
#define nstrprintf(__nstr_var, __format,...)
Macro to quickly allocate and sprintf to N_STR.
Definition n_str.h:115
A box including a string and his lenght.
Definition n_str.h:60
Base64 encoding and decoding functions using N_STR.
Vigenere encoding and decoding functions using N_STR/files.
List structures and definitions.
Generic log system.
N_STR and string function declaration.