Imported Upstream version 1.6.5
[platform/upstream/libksba.git] / tests / t-reader.c
1 /* t-reader.c - basic tests for the reader object
2  *      Copyright (C) 2017 g10 Code GmbH
3  *
4  * This file is part of KSBA.
5  *
6  * KSBA is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * KSBA is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <string.h>
23 #include <assert.h>
24 #include <time.h>
25 #include <errno.h>
26
27 #include <unistd.h>
28 #include <sys/types.h>
29 #include <sys/stat.h>
30 #include <fcntl.h>
31 #include <gpg-error.h>
32
33 #include "../src/ksba.h"
34 #include "t-common.h"
35
36 void
37 test_fd(const char* path)
38 {
39   int fd = open (path, O_RDONLY);
40   gpg_error_t err = 0;
41   ksba_reader_t reader;
42   ksba_cert_t cert;
43
44   if (fd < 0)
45     {
46       perror ("open() failed");
47       exit (1);
48     }
49
50   if ((err = ksba_reader_new (&reader)))
51     {
52       fprintf (stderr, "ksba_reader_new() failed: %s\n", gpg_strerror (err));
53       exit (1);
54     }
55
56   if ((err = ksba_reader_set_fd (reader, fd)))
57     {
58       fprintf (stderr, "ksba_reader_set_fd() failed: %s\n", gpg_strerror (err));
59       exit (1);
60     }
61
62   if ((err = ksba_cert_new (&cert)))
63     {
64       fprintf (stderr, "ksba_cert_new() failed: %s\n", gpg_strerror (err));
65       exit (1);
66     }
67
68   if ((err = ksba_cert_read_der (cert, reader)))
69     {
70       fprintf(stderr, "ksba_cert_read_der() failed: %s\n", gpg_strerror (err));
71       exit (1);
72     }
73
74   ksba_cert_release (cert);
75   ksba_reader_release (reader);
76   close (fd);
77 }
78
79 void
80 test_file(const char* path)
81 {
82   FILE* fp = fopen (path, "r");
83   gpg_error_t err = 0;
84   ksba_reader_t reader;
85   ksba_cert_t cert;
86
87   if (!fp)
88     {
89       perror ("fopen() failed");
90       exit (1);
91     }
92
93   if ((err = ksba_reader_new (&reader)))
94     {
95       fprintf (stderr, "ksba_reader_new() failed: %s\n", gpg_strerror (err));
96       exit (1);
97     }
98
99   if ((err = ksba_reader_set_file (reader, fp)))
100     {
101       fprintf (stderr, "ksba_reader_set_fd() failed: %s\n", gpg_strerror (err));
102       exit (1);
103     }
104
105   if ((err = ksba_cert_new (&cert)))
106     {
107       fprintf (stderr, "ksba_cert_new() failed: %s\n", gpg_strerror (err));
108       exit (1);
109     }
110
111   if ((err = ksba_cert_read_der (cert, reader)))
112     {
113       fprintf(stderr, "ksba_cert_read_der() failed: %s\n", gpg_strerror (err));
114       exit (1);
115     }
116
117   ksba_cert_release (cert);
118   ksba_reader_release (reader);
119   fclose (fp);
120 }
121
122 void
123 test_mem(const char* path)
124 {
125   int fd = open (path, O_RDONLY);
126   gpg_error_t err = 0;
127   ksba_reader_t reader;
128   ksba_cert_t cert;
129   char *mem = NULL;
130   ssize_t ret = 0;
131   size_t p = 0;
132   struct stat st;
133
134   if (fd < 0)
135     {
136       perror ("fopen() failed");
137       exit (1);
138     }
139
140   if (fstat (fd, &st))
141     {
142       fprintf (stderr, "fstat() failed: %s\n", gpg_strerror (err));
143       exit (1);
144     }
145
146   mem = xmalloc(st.st_size);
147
148   while (p < st.st_size && (ret = read(fd, mem + p, st.st_size - p)))
149     {
150       if (ret < 0)
151         {
152           fprintf (stderr, "read() failed: %s\n", gpg_strerror (err));
153           exit (1);
154         }
155       p += ret;
156     }
157
158   if ((err = ksba_reader_new (&reader)))
159     {
160       exit (1);
161     }
162
163   if ((err = ksba_reader_set_mem (reader, mem, st.st_size)))
164     {
165       fprintf (stderr, "ksba_reader_set_mem() failed: %s\n", gpg_strerror (err));
166       exit (1);
167     }
168
169   if ((err = ksba_cert_new (&cert)))
170     {
171       fprintf (stderr, "ksba_cert_new() failed: %s\n", gpg_strerror (err));
172       exit (1);
173     }
174
175   if ((err = ksba_cert_read_der (cert, reader)))
176     {
177       fprintf(stderr, "ksba_cert_read_der() failed: %s\n", gpg_strerror (err));
178       exit (1);
179     }
180
181   ksba_cert_release (cert);
182   ksba_reader_release (reader);
183   xfree (mem);
184   close (fd);
185 }
186
187 int
188 main (int argc, char **argv)
189 {
190   if (argc == 1)
191     {
192       char *fname = prepend_srcdir ("samples/cert_g10code_test1.der");
193
194       test_fd (fname);
195       test_file (fname);
196       test_mem (fname);
197       free(fname);
198     }
199   else
200     {
201       int i;
202       for (i = 1; i < argc; ++i)
203         {
204           test_fd (argv[i]);
205           test_file (argv[i]);
206           test_mem (argv[i]);
207         }
208     }
209
210   return 0;
211 }