Nilorea Library
C utilities for networking, threading, graphics
Loading...
Searching...
No Matches
ex_crypto.c
1
7#include "nilorea/n_log.h"
8#include "nilorea/n_list.h"
9#include "nilorea/n_str.h"
10#include "nilorea/n_base64.h"
11#include "nilorea/n_crypto.h"
12
13int main(int argc, char* argv[]) {
14 void usage(void) {
15 fprintf(stderr,
16 "%s usage:\n"
17 " -i input_file [optional] use a file as datas instead of hard coded 3 lines text\n"
18 " -v version\n"
19 " -V log level: LOG_INFO, LOG_NOTICE, LOG_ERR, LOG_DEBUG\n"
20 " -h help\n",
21 argv[0]);
22 }
23
24 int getoptret = 0, ret = 0,
25 log_level = LOG_DEBUG; /* default log level */
26
27 N_STR* input_name = NULL;
28
29 /* Arguments optionnels */
30 /* -v version
31 * -V log level
32 * -h help
33 */
34 while ((getoptret = getopt(argc, argv, "i:hvV:")) != EOF) {
35 switch (getoptret) {
36 case 'i':
37 input_name = char_to_nstr(optarg);
38 break;
39 case 'v':
40 fprintf(stderr, "Date de compilation : %s a %s.\n", __DATE__, __TIME__);
41 exit(1);
42 case 'V':
43 if (!strncmp("LOG_NULL", optarg, 5)) {
44 log_level = LOG_NULL;
45 } else {
46 if (!strncmp("LOG_NOTICE", optarg, 6)) {
47 log_level = LOG_NOTICE;
48 } else {
49 if (!strncmp("LOG_INFO", optarg, 7)) {
50 log_level = LOG_INFO;
51 } else {
52 if (!strncmp("LOG_ERR", optarg, 5)) {
53 log_level = LOG_ERR;
54 } else {
55 if (!strncmp("LOG_DEBUG", optarg, 5)) {
56 log_level = LOG_DEBUG;
57 } else {
58 fprintf(stderr, "%s n'est pas un niveau de log valide.\n", optarg);
59 exit(-1);
60 }
61 }
62 }
63 }
64 }
65 break;
66 default:
67 case '?': {
68 if (optopt == 'V') {
69 fprintf(stderr, " => Missing log level\n");
70 } else if (optopt == 'p') {
71 fprintf(stderr, " => Missing port\n");
72 } else if (optopt == 'i') {
73 fprintf(stderr, " => Missing filename\n");
74 } else if (optopt != 's') {
75 fprintf(stderr, " => Unknow missing option %c\n", optopt);
76 }
77 usage();
78 exit(1);
79 }
80 case 'h': {
81 usage();
82 exit(1);
83 }
84 }
85 }
86 set_log_level(log_level);
87
88 N_STR* EXAMPLE_TEXT = char_to_nstr(
89 "##############################################################\n"
90 "# This is an example of crypto encode/decode, with a newline #\n"
91 "# This is the end of the test #\n"
92 "##############################################################");
93
94 n_log(LOG_NOTICE, "Testing crypto, encoding text of size (%ld/%ld):\n%s", EXAMPLE_TEXT->written, EXAMPLE_TEXT->length, _nstr(EXAMPLE_TEXT));
95 /* 10 20 30 40 50 60 */
96 /* "1234567890123456789012345678901234567890123456789012345678901234" */
97 // N_STR *key = n_vigenere_get_rootkey( 128 );
98 N_STR* key = char_to_nstr("RKCHSLZWFNASULJFVPRVUUUAEUVEMSSGEVNWIMVPZVIWITBGIUBEQVEURBYEWTMCQZZYNWQMRAIBTMHDIKIZHOVZQUFONRQDSRDFNTTGVEKOSTSAEABLOXMGTTWIMPNE");
99 n_log(LOG_DEBUG, "key= %s", _nstr(key));
100
101 N_STR* B64_EXAMPLE_TEXT = n_base64_encode(EXAMPLE_TEXT);
102 N_STR* encoded_data = n_vigenere_encode(B64_EXAMPLE_TEXT, key);
103 n_log(LOG_DEBUG, "encoded data=\n%s", _nstr(encoded_data));
104
105 N_STR* decoded_data = n_vigenere_decode(encoded_data, key);
106 N_STR* unbase64 = n_base64_decode(decoded_data);
107 n_log(LOG_DEBUG, "decoded data=\n%s", _nstr(unbase64));
108 free_nstr(&unbase64);
109
110 N_STR* encoded_question = n_vigenere_get_question(128);
111 N_STR* decoded_question = n_vigenere_quick_decode(encoded_question);
112 n_log(LOG_DEBUG, "encoded_question: %s", _nstr(encoded_question));
113 n_log(LOG_DEBUG, "decoded_question: %s", _nstr(decoded_question));
114 free_nstr(&decoded_question);
115
116 N_STR* answer = n_vigenere_get_answer(key, encoded_question);
117 n_log(LOG_DEBUG, "answer: %s", _nstr(answer));
118
119 N_STR* decode_qa = n_vigenere_decode_qa(encoded_data, encoded_question, answer);
120 n_log(LOG_DEBUG, "encode root decode qa:\n%s", _nstr(decode_qa));
121 free_nstr(&decode_qa);
122
123 N_STR* encode_qa = n_vigenere_encode_qa(EXAMPLE_TEXT, encoded_question, answer);
124 n_log(LOG_DEBUG, "encode qa:\n%s", _nstr(encode_qa));
125
126 decode_qa = n_vigenere_decode_qa(encode_qa, encoded_question, answer);
127 n_log(LOG_DEBUG, "encode qa decode qa:\n%s", _nstr(decode_qa));
128 free_nstr(&decode_qa);
129
130 N_STR* decode_qa_root = n_vigenere_decode(encode_qa, key);
131 unbase64 = n_base64_decode(decode_qa_root);
132 n_log(LOG_DEBUG, "encode qa - decode root:\n%s", _nstr(unbase64));
133
134 free_nstr(&decode_qa_root);
135 free_nstr(&encode_qa);
136
137 if (input_name) {
138 N_STR* output_name_enc = NULL;
139 N_STR* output_name_dec = NULL;
140 N_STR* output_name_dec_question = NULL;
141
142 nstrprintf(output_name_enc, "%s.crypt_encoded", _nstr(input_name));
143 if (n_vigenere_encode_file(input_name, output_name_enc, key)) {
144 n_log(LOG_DEBUG, "Encoded file saved in %s", _nstr(output_name_enc));
145
146 nstrprintf(output_name_dec, "%s.crypt_decoded", _nstr(input_name));
147 if (n_vigenere_decode_file(output_name_enc, output_name_dec, key)) {
148 n_log(LOG_DEBUG, "Decoded file saved in %s", _nstr(output_name_dec));
149
150 nstrprintf(output_name_dec_question, "%s.crypt_decoded_question", _nstr(input_name));
151 if (n_vigenere_decode_file_qa(output_name_enc, output_name_dec_question, encoded_question, answer)) {
152 n_log(LOG_DEBUG, "Decoded with question/answer file saved in %s", _nstr(output_name_dec_question));
153 } else {
154 n_log(LOG_ERR, "unable to decode with question answer");
155 ret = 1;
156 }
157 } else {
158 n_log(LOG_ERR, "unable to decode with root key");
159 ret = 1;
160 }
161 } else {
162 n_log(LOG_ERR, "unable to encode with root key");
163 ret = 1;
164 }
165
166 free_nstr(&input_name);
167 free_nstr(&output_name_enc);
168 free_nstr(&output_name_dec);
169 free_nstr(&output_name_dec_question);
170 }
171
172 free_nstr(&key);
173 free_nstr(&encoded_data);
174 free_nstr(&decoded_data);
175 free_nstr(&encoded_question);
176 free_nstr(&answer);
177 free_nstr(&EXAMPLE_TEXT);
178 free_nstr(&B64_EXAMPLE_TEXT);
179 free_nstr(&unbase64);
180
181 exit(ret);
182} /* END_OF_MAIN */
#define _nstr(__PTR)
N_STR or "NULL" string for logging purposes.
Definition n_common.h:182
N_STR * n_base64_decode(N_STR *bufcoded)
decode a N_STR *string
Definition n_base64.c:168
N_STR * n_base64_encode(N_STR *input)
encode a N_STR *string
Definition n_base64.c:250
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:655
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:733
N_STR * n_vigenere_decode(N_STR *string, N_STR *key)
decode input using vigenere cypher and key
Definition n_crypto.c:416
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:534
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:690
N_STR * n_vigenere_encode(N_STR *string, N_STR *key)
encode input using vigenere cypher and key
Definition n_crypto.c:406
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:570
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:613
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:477
N_STR * n_vigenere_quick_decode(N_STR *encoded_data)
quick decode data
Definition n_crypto.c:460
#define n_log(__LEVEL__,...)
Logging function wrapper to get line and func.
Definition n_log.h:69
#define LOG_DEBUG
debug-level messages
Definition n_log.h:64
#define LOG_ERR
error conditions
Definition n_log.h:56
void set_log_level(const int log_level)
Set the global log level value ( static int LOG_LEVEL )
Definition n_log.c:91
#define LOG_NOTICE
normal but significant condition
Definition n_log.h:60
#define LOG_NULL
no log output
Definition n_log.h:26
#define LOG_INFO
informational
Definition n_log.h:62
size_t written
size of the written data inside the string
Definition n_str.h:45
size_t length
length of string (in case we wanna keep information after the 0 end of string value)
Definition n_str.h:43
#define free_nstr(__ptr)
free a N_STR structure and set the pointer to NULL
Definition n_str.h:176
N_STR * char_to_nstr(const char *src)
Convert a char into a N_STR, short version.
Definition n_str.c:228
#define nstrprintf(__nstr_var, __format,...)
Macro to quickly allocate and sprintf to N_STR.
Definition n_str.h:94
A box including a string and his lenght.
Definition n_str.h:39
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.