svn update: 51457 (latest:51480)
[framework/uifw/eet.git] / src / bin / eet_main.c
1 #ifdef HAVE_CONFIG_H
2 # include <config.h>
3 #endif /* ifdef HAVE_CONFIG_H */
4
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <string.h>
8 #ifndef _MSC_VER
9 # include <unistd.h>
10 #endif /* ifndef _MSC_VER */
11
12 #ifdef HAVE_EVIL
13 # include <Evil.h>
14 #endif /* ifdef HAVE_EVIL */
15
16 #include <Eet.h>
17
18 static int _eet_main_log_dom = -1;
19
20 #ifdef EET_DEFAULT_LOG_COLOR
21 #undef EET_DEFAULT_LOG_COLOR
22 #endif /* ifdef EET_DEFAULT_LOG_COLOR */
23 #define EET_DEFAULT_LOG_COLOR EINA_COLOR_CYAN
24 #ifdef ERR
25 #undef ERR
26 #endif /* ifdef ERR */
27 #define ERR(...)  EINA_LOG_DOM_ERR(_eet_main_log_dom, __VA_ARGS__)
28 #ifdef DBG
29 #undef DBG
30 #endif /* ifdef DBG */
31 #define DBG(...)  EINA_LOG_DOM_DBG(_eet_main_log_dom, __VA_ARGS__)
32 #ifdef INF
33 #undef INF
34 #endif /* ifdef INF */
35 #define INF(...)  EINA_LOG_DOM_INFO(_eet_main_log_dom, __VA_ARGS__)
36 #ifdef WRN
37 #undef WRN
38 #endif /* ifdef WRN */
39 #define WRN(...)  EINA_LOG_DOM_WARN(_eet_main_log_dom, __VA_ARGS__)
40 #ifdef CRIT
41 #undef CRIT
42 #endif /* ifdef CRIT */
43 #define CRIT(...) EINA_LOG_DOM_CRIT(_eet_main_log_dom, __VA_ARGS__)
44
45 static void
46 do_eet_list(const char * file)
47 {
48    int i, num;
49    char ** list;
50    Eet_File * ef;
51
52    ef = eet_open(file, EET_FILE_MODE_READ);
53    if (!ef)
54      {
55         ERR("cannot open for reading: %s\n", file);
56         exit(-1);
57      }
58
59    list = eet_list(ef, "*", &num);
60    if (list)
61      {
62         for (i = 0; i < num; i++)
63            printf("%s\n",list[i]);
64         free(list);
65      }
66
67    eet_close(ef);
68 } /* do_eet_list */
69
70 static void
71 do_eet_extract(const char * file,
72                const char * key,
73                const char * out,
74                const char * crypto_key)
75 {
76    Eet_File * ef;
77    void * data;
78    int size = 0;
79    FILE * f;
80
81    ef = eet_open(file, EET_FILE_MODE_READ);
82    if (!ef)
83      {
84         ERR("cannot open for reading: %s\n", file);
85         exit(-1);
86      }
87
88    data = eet_read_cipher(ef, key, &size, crypto_key);
89    if (!data)
90      {
91         ERR("cannot read key %s\n", key);
92         exit(-1);
93      }
94
95    f = fopen(out, "wb");
96    if (!f)
97      {
98         ERR("cannot open %s\n", out);
99         exit(-1);
100      }
101
102    if (fwrite(data, size, 1, f) != 1)
103      {
104         ERR("cannot write to %s\n", out);
105         exit(-1);
106      }
107
108    fclose(f);
109    free(data);
110    eet_close(ef);
111 } /* do_eet_extract */
112
113 static void
114 do_eet_decode_dump(void * data, const char * str)
115 {
116    fputs(str, (FILE *)data);
117 } /* do_eet_decode_dump */
118
119 static void
120 do_eet_decode(const char * file,
121               const char * key,
122               const char * out,
123               const char * crypto_key)
124 {
125    Eet_File * ef;
126    FILE * f;
127
128    ef = eet_open(file, EET_FILE_MODE_READ);
129    if (!ef)
130      {
131         ERR("cannot open for reading: %s\n", file);
132         exit(-1);
133      }
134
135    f = fopen(out, "wb");
136    if (!f)
137      {
138         ERR("cannot open %s\n", out);
139         exit(-1);
140      }
141
142    if (!eet_data_dump_cipher(ef, key, crypto_key, do_eet_decode_dump, f))
143      {
144         ERR("cannot write to %s\n", out);
145         exit(-1);
146      }
147
148    fclose(f);
149    eet_close(ef);
150 } /* do_eet_decode */
151
152 static void
153 do_eet_insert(const char * file,
154               const char * key,
155               const char * out,
156               int          compress,
157               const char * crypto_key)
158 {
159    Eet_File * ef;
160    void * data;
161    int size = 0;
162    FILE * f;
163
164    ef = eet_open(file, EET_FILE_MODE_READ_WRITE);
165    if (!ef)
166       ef = eet_open(file, EET_FILE_MODE_WRITE);
167
168    if (!ef)
169      {
170         ERR("cannot open for read+write: %s\n", file);
171         exit(-1);
172      }
173
174    f = fopen(out, "rb");
175    if (!f)
176      {
177         ERR("cannot open %s\n", out);
178         exit(-1);
179      }
180
181    fseek(f, 0, SEEK_END);
182    size = ftell(f);
183    rewind(f);
184    data = malloc(size);
185    if (!data)
186      {
187         ERR("cannot allocate %i bytes\n", size);
188         exit(-1);
189      }
190
191    if (fread(data, size, 1, f) != 1)
192      {
193         ERR("cannot read file %s\n", out);
194         exit(-1);
195      }
196
197    fclose(f);
198    eet_write_cipher(ef, key, data, size, compress, crypto_key);
199    free(data);
200    eet_close(ef);
201 } /* do_eet_insert */
202
203 static void
204 do_eet_encode(const char * file,
205               const char * key,
206               const char * out,
207               int          compress,
208               const char * crypto_key)
209 {
210    Eet_File * ef;
211    char * text;
212    int textlen = 0;
213    int size = 0;
214    FILE * f;
215
216    ef = eet_open(file, EET_FILE_MODE_READ_WRITE);
217    if (!ef)
218       ef = eet_open(file, EET_FILE_MODE_WRITE);
219
220    if (!ef)
221      {
222         ERR("cannot open for read+write: %s\n", file);
223         exit(-1);
224      }
225
226    f = fopen(out, "rb");
227    if (!f)
228      {
229         ERR("cannot open %s\n", out);
230         exit(-1);
231      }
232
233    fseek(f, 0, SEEK_END);
234    textlen = ftell(f);
235    rewind(f);
236    text = malloc(textlen);
237    if (!text)
238      {
239         ERR("cannot allocate %i bytes\n", size);
240         exit(-1);
241      }
242
243    if (fread(text, textlen, 1, f) != 1)
244      {
245         ERR("cannot read file %s\n", out);
246         exit(-1);
247      }
248
249    fclose(f);
250    if (!eet_data_undump_cipher(ef, key, crypto_key, text, textlen, compress))
251      {
252         ERR("cannot parse %s\n", out);
253         exit(-1);
254      }
255
256    free(text);
257    eet_close(ef);
258 } /* do_eet_encode */
259
260 static void
261 do_eet_remove(const char * file, const char * key)
262 {
263    Eet_File * ef;
264
265    ef = eet_open(file, EET_FILE_MODE_READ_WRITE);
266    if (!ef)
267      {
268         ERR("cannot open for read+write: %s\n", file);
269         exit(-1);
270      }
271
272    eet_delete(ef, key);
273    eet_close(ef);
274 } /* do_eet_remove */
275
276 static void
277 do_eet_check(const char * file)
278 {
279    Eet_File * ef;
280    const void * der;
281    int der_length;
282    int sign_length;
283
284    ef = eet_open(file, EET_FILE_MODE_READ);
285    if (!ef)
286      {
287         ERR("checking signature of `%s` failed\n", file);
288         exit(-1);
289      }
290
291    der = eet_identity_x509(ef, &der_length);
292
293    fprintf(stdout, "Certificate length %i.\n", der_length);
294    eet_identity_certificate_print(der, der_length, stdout);
295
296    eet_identity_signature(ef, &sign_length);
297    fprintf(stdout, "Signature length %i.\n", sign_length);
298
299    eet_close(ef);
300 } /* do_eet_check */
301
302 static void
303 do_eet_sign(const char * file, const char * private_key, const char * public_key)
304 {
305    Eet_File * ef;
306    Eet_Key * key;
307
308    ef = eet_open(file, EET_FILE_MODE_READ_WRITE);
309    if (!ef)
310      {
311         ERR("cannot open for read+write: %s.\n", file);
312         exit(-1);
313      }
314
315    key = eet_identity_open(public_key, private_key, NULL);
316    if (!key)
317      {
318         ERR("cannot open key '%s:%s'.\n", public_key, private_key);
319         exit(-1);
320      }
321
322    fprintf(stdout, "Using the following key to sign `%s`.\n", file);
323    eet_identity_print(key, stdout);
324
325    eet_identity_set(ef, key);
326
327    eet_close(ef);
328 } /* do_eet_sign */
329
330 int
331 main(int argc, char ** argv)
332 {
333    if (!eet_init())
334       return -1;
335
336    _eet_main_log_dom = eina_log_domain_register("Eet_Main",EINA_COLOR_CYAN);
337    if(_eet_main_log_dom < -1)
338      {
339         EINA_LOG_ERR("Impossible to create a log domain for eet_main.\n");
340         eet_shutdown();
341         return(-1);
342      }
343
344    if (argc < 2)
345      {
346 help:
347         printf(
348            "Usage:\n"
349            "  eet -l FILE.EET                                list all keys in FILE.EET\n"
350            "  eet -x FILE.EET KEY OUT-FILE [CRYPTO_KEY]          extract data stored in KEY in FILE.EET and write to OUT-FILE\n"
351            "  eet -d FILE.EET KEY OUT-FILE [CRYPTO_KEY]          extract and decode data stored in KEY in FILE.EET and write to OUT-FILE\n"
352            "  eet -i FILE.EET KEY IN-FILE COMPRESS [CRYPTO_KEY]  insert data to KEY in FILE.EET from IN-FILE and if COMPRESS is 1, compress it\n"
353            "  eet -e FILE.EET KEY IN-FILE COMPRESS [CRYPTO_KEY]  insert and encode to KEY in FILE.EET from IN-FILE and if COMPRESS is 1, compress it\n"
354            "  eet -r FILE.EET KEY                                remove KEY in FILE.EET\n"
355            "  eet -c FILE.EET                                    report and check the signature information of an eet file\n"
356            "  eet -s FILE.EET PRIVATE_KEY PUBLIC_KEY             sign FILE.EET with PRIVATE_KEY and attach PUBLIC_KEY as it's certificate\n"
357            );
358         eet_shutdown();
359         return -1;
360      }
361
362    if ((!strncmp(argv[1], "-h", 2)))
363       goto help;
364    else if ((!strcmp(argv[1], "-l")) && (argc > 2))
365       do_eet_list(argv[2]);
366    else if ((!strcmp(argv[1], "-x")) && (argc > 4))
367      {
368         if (argc > 5)
369            do_eet_extract(argv[2], argv[3], argv[4], argv[5]);
370         else
371            do_eet_extract(argv[2], argv[3], argv[4], NULL);
372      }
373    else if ((!strcmp(argv[1], "-d")) && (argc > 4))
374      {
375         if (argc > 5)
376            do_eet_decode(argv[2], argv[3], argv[4], argv[5]);
377         else
378            do_eet_decode(argv[2], argv[3], argv[4], NULL);
379      }
380    else if ((!strcmp(argv[1], "-i")) && (argc > 5))
381      {
382         if (argc > 6)
383            do_eet_insert(argv[2], argv[3], argv[4], atoi(argv[5]), argv[6]);
384         else
385            do_eet_insert(argv[2], argv[3], argv[4], atoi(argv[5]), NULL);
386      }
387    else if ((!strcmp(argv[1], "-e")) && (argc > 5))
388      {
389         if (argc > 6)
390            do_eet_encode(argv[2], argv[3], argv[4], atoi(argv[5]), argv[6]);
391         else
392            do_eet_encode(argv[2], argv[3], argv[4], atoi(argv[5]), NULL);
393      }
394    else if ((!strcmp(argv[1], "-r")) && (argc > 3))
395       do_eet_remove(argv[2], argv[3]);
396    else if ((!strcmp(argv[1], "-c")) && (argc > 2))
397       do_eet_check(argv[2]);
398    else if ((!strcmp(argv[1], "-s")) && (argc > 4))
399       do_eet_sign(argv[2], argv[3], argv[4]);
400    else
401       goto help;
402
403    eina_log_domain_unregister(_eet_main_log_dom);
404    eet_shutdown();
405    return 0;
406 } /* main */
407