w32: Fix build problem with dirmngr.
[gnupg.git] / common / t-openpgp-oid.c
1 /* t-openpgp-oid.c - Module test for openpgp-oid.c
2  *      Copyright (C) 2011 Free Software Foundation, Inc.
3  *
4  * This file is part of GnuPG.
5  *
6  * GnuPG 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  * GnuPG 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 <config.h>
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <assert.h>
24
25 #include "util.h"
26
27 #define pass()  do { ; } while(0)
28 #define fail(a,e)                                                       \
29   do { fprintf (stderr, "%s:%d: test %d failed (%s)\n",                 \
30                 __FILE__,__LINE__, (a), gpg_strerror (e));              \
31     exit (1);                                                           \
32   } while(0)
33
34
35 static void
36 test_openpgp_oid_from_str (void)
37 {
38    static char *sample_oids[] =
39     {
40       "0.0",
41       "1.0",
42       "1.2.3",
43       "1.2.840.10045.3.1.7",
44       "1.3.132.0.34",
45       "1.3.132.0.35",
46       NULL
47     };
48   gpg_error_t err;
49   gcry_mpi_t a;
50   int idx;
51   char *string;
52   unsigned char *p;
53   unsigned int nbits;
54   size_t length;
55
56   err = openpgp_oid_from_str ("", &a);
57   if (gpg_err_code (err) != GPG_ERR_INV_VALUE)
58     fail (0, err);
59   gcry_mpi_release (a);
60
61   err = openpgp_oid_from_str (".", &a);
62   if (gpg_err_code (err) != GPG_ERR_INV_OID_STRING)
63     fail (0, err);
64   gcry_mpi_release (a);
65
66   err = openpgp_oid_from_str ("0", &a);
67   if (gpg_err_code (err) != GPG_ERR_INV_OID_STRING)
68     fail (0, err);
69   gcry_mpi_release (a);
70
71   for (idx=0; sample_oids[idx]; idx++)
72     {
73       err = openpgp_oid_from_str (sample_oids[idx], &a);
74       if (err)
75         fail (idx, err);
76
77       string = openpgp_oid_to_str (a);
78       if (!string)
79         fail (idx, gpg_error_from_syserror ());
80       if (strcmp (string, sample_oids[idx]))
81         fail (idx, 0);
82       xfree (string);
83
84       p = gcry_mpi_get_opaque (a, &nbits);
85       length = (nbits+7)/8;
86       if (!p || !length || p[0] != length - 1)
87         fail (idx, 0);
88
89       gcry_mpi_release (a);
90     }
91
92 }
93
94
95 static void
96 test_openpgp_oid_to_str (void)
97 {
98   static struct {
99     const char *string;
100     unsigned char der[10];
101   } samples[] = {
102     { "1.2.840.10045.3.1.7",
103       {8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07 }},
104
105     { "1.3.132.0.34",
106       {5, 0x2B, 0x81, 0x04, 0x00, 0x22 }},
107
108     { "1.3.132.0.35",
109       { 5, 0x2B, 0x81, 0x04, 0x00, 0x23 }},
110
111     { NULL }};
112   gcry_mpi_t a;
113   int idx;
114   char *string;
115   unsigned char *p;
116
117   for (idx=0; samples[idx].string; idx++)
118     {
119       p = xmalloc (samples[idx].der[0]+1);
120       memcpy (p, samples[idx].der, samples[idx].der[0]+1);
121       a = gcry_mpi_set_opaque (NULL, p, (samples[idx].der[0]+1)*8);
122       if (!a)
123         fail (idx, gpg_error_from_syserror ());
124
125       string = openpgp_oid_to_str (a);
126       if (!string)
127         fail (idx, gpg_error_from_syserror ());
128       if (strcmp (string, samples[idx].string))
129         fail (idx, 0);
130       xfree (string);
131       gcry_mpi_release (a);
132     }
133
134 }
135
136
137 static void
138 test_openpgp_oid_is_ed25519 (void)
139 {
140   static struct
141   {
142     int yes;
143     const char *oidstr;
144   } samples[] = {
145     { 0, "0.0" },
146     { 0, "1.3.132.0.35" },
147     { 0, "1.3.6.1.4.1.3029.1.5.0" },
148     { 0, "1.3.6.1.4.1.3029.1.5.1" }, /* Used during Libgcrypt development. */
149     { 0, "1.3.6.1.4.1.3029.1.5.2" },
150     { 0, "1.3.6.1.4.1.3029.1.5.1.0" },
151     { 0, "1.3.6.1.4.1.3029.1.5" },
152     { 0, "1.3.6.1.4.1.11591.15.0" },
153     { 1, "1.3.6.1.4.1.11591.15.1" }, /* Your the one we want.  */
154     { 0, "1.3.6.1.4.1.11591.15.2" },
155     { 0, "1.3.6.1.4.1.11591.15.1.0" },
156     { 0, "1.3.6.1.4.1.11591.15" },
157     { 0, NULL },
158   };
159   gpg_error_t err;
160   gcry_mpi_t a;
161   int idx;
162
163   for (idx=0; samples[idx].oidstr; idx++)
164     {
165       err = openpgp_oid_from_str (samples[idx].oidstr, &a);
166       if (err)
167         fail (idx, err);
168
169       if (openpgp_oid_is_ed25519 (a) != samples[idx].yes)
170         fail (idx, 0);
171
172       gcry_mpi_release (a);
173     }
174
175 }
176
177
178 int
179 main (int argc, char **argv)
180 {
181   (void)argc;
182   (void)argv;
183
184   test_openpgp_oid_from_str ();
185   test_openpgp_oid_to_str ();
186   test_openpgp_oid_is_ed25519 ();
187
188   return 0;
189 }