gpg: Lowercase mailbox for PKA lookups.
[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 #define BADOID "1.3.6.1.4.1.11591.2.12242973"
36
37
38 static void
39 test_openpgp_oid_from_str (void)
40 {
41    static char *sample_oids[] =
42     {
43       "0.0",
44       "1.0",
45       "1.2.3",
46       "1.2.840.10045.3.1.7",
47       "1.3.132.0.34",
48       "1.3.132.0.35",
49       NULL
50     };
51   gpg_error_t err;
52   gcry_mpi_t a;
53   int idx;
54   char *string;
55   unsigned char *p;
56   unsigned int nbits;
57   size_t length;
58
59   err = openpgp_oid_from_str ("", &a);
60   if (gpg_err_code (err) != GPG_ERR_INV_VALUE)
61     fail (0, err);
62   gcry_mpi_release (a);
63
64   err = openpgp_oid_from_str (".", &a);
65   if (gpg_err_code (err) != GPG_ERR_INV_OID_STRING)
66     fail (0, err);
67   gcry_mpi_release (a);
68
69   err = openpgp_oid_from_str ("0", &a);
70   if (gpg_err_code (err) != GPG_ERR_INV_OID_STRING)
71     fail (0, err);
72   gcry_mpi_release (a);
73
74   for (idx=0; sample_oids[idx]; idx++)
75     {
76       err = openpgp_oid_from_str (sample_oids[idx], &a);
77       if (err)
78         fail (idx, err);
79
80       string = openpgp_oid_to_str (a);
81       if (!string)
82         fail (idx, gpg_error_from_syserror ());
83       if (strcmp (string, sample_oids[idx]))
84         fail (idx, 0);
85       xfree (string);
86
87       p = gcry_mpi_get_opaque (a, &nbits);
88       length = (nbits+7)/8;
89       if (!p || !length || p[0] != length - 1)
90         fail (idx, 0);
91
92       gcry_mpi_release (a);
93     }
94
95 }
96
97
98 static void
99 test_openpgp_oid_to_str (void)
100 {
101   static struct {
102     const char *string;
103     unsigned char der[10];
104   } samples[] = {
105     { "1.2.840.10045.3.1.7",
106       {8, 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07 }},
107
108     { "1.3.132.0.34",
109       {5, 0x2B, 0x81, 0x04, 0x00, 0x22 }},
110
111     { "1.3.132.0.35",
112       { 5, 0x2B, 0x81, 0x04, 0x00, 0x23 }},
113
114     { BADOID,
115       { 9, 0x80, 0x02, 0x70, 0x50, 0x25, 0x46, 0xfd, 0x0c, 0xc0 }},
116
117     { BADOID,
118       { 1, 0x80 }},
119
120     { NULL }};
121   gcry_mpi_t a;
122   int idx;
123   char *string;
124   unsigned char *p;
125
126   for (idx=0; samples[idx].string; idx++)
127     {
128       p = xmalloc (samples[idx].der[0]+1);
129       memcpy (p, samples[idx].der, samples[idx].der[0]+1);
130       a = gcry_mpi_set_opaque (NULL, p, (samples[idx].der[0]+1)*8);
131       if (!a)
132         fail (idx, gpg_error_from_syserror ());
133
134       string = openpgp_oid_to_str (a);
135       if (!string)
136         fail (idx, gpg_error_from_syserror ());
137       if (strcmp (string, samples[idx].string))
138         fail (idx, 0);
139       xfree (string);
140       gcry_mpi_release (a);
141     }
142
143 }
144
145
146 static void
147 test_openpgp_oid_is_ed25519 (void)
148 {
149   static struct
150   {
151     int yes;
152     const char *oidstr;
153   } samples[] = {
154     { 0, "0.0" },
155     { 0, "1.3.132.0.35" },
156     { 0, "1.3.6.1.4.1.3029.1.5.0" },
157     { 0, "1.3.6.1.4.1.3029.1.5.1" }, /* Used during Libgcrypt development. */
158     { 0, "1.3.6.1.4.1.3029.1.5.2" },
159     { 0, "1.3.6.1.4.1.3029.1.5.1.0" },
160     { 0, "1.3.6.1.4.1.3029.1.5" },
161     { 0, "1.3.6.1.4.1.11591.15.0" },
162     { 1, "1.3.6.1.4.1.11591.15.1" }, /* Your the one we want.  */
163     { 0, "1.3.6.1.4.1.11591.15.2" },
164     { 0, "1.3.6.1.4.1.11591.15.1.0" },
165     { 0, "1.3.6.1.4.1.11591.15" },
166     { 0, NULL },
167   };
168   gpg_error_t err;
169   gcry_mpi_t a;
170   int idx;
171
172   for (idx=0; samples[idx].oidstr; idx++)
173     {
174       err = openpgp_oid_from_str (samples[idx].oidstr, &a);
175       if (err)
176         fail (idx, err);
177
178       if (openpgp_oid_is_ed25519 (a) != samples[idx].yes)
179         fail (idx, 0);
180
181       gcry_mpi_release (a);
182     }
183
184 }
185
186
187 int
188 main (int argc, char **argv)
189 {
190   (void)argc;
191   (void)argv;
192
193   test_openpgp_oid_from_str ();
194   test_openpgp_oid_to_str ();
195   test_openpgp_oid_is_ed25519 ();
196
197   return 0;
198 }