asn1_read_value() and friends understand the ?CURRENT keyword.
[platform/upstream/libtasn1.git] / tests / Test_overflow.c
1 /*
2  * Copyright (C) 2012-2014 Free Software Foundation, Inc.
3  *
4  * This file is part of LIBTASN1.
5  *
6  * This program 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  * This program 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
21 /* Written by Simon Josefsson */
22
23 #include <stdio.h>
24 #include <string.h>
25 #include <stdlib.h>
26 #include <limits.h>
27
28 #include "libtasn1.h"
29
30 int
31 main (int argc, char **argv)
32 {
33   /* Test that values larger than long are rejected.  This has worked
34      fine with all versions of libtasn1. */
35   int verbose = 0;
36
37   if (argc > 1)
38     verbose = 1;
39
40   {
41     unsigned char der[] = "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF";
42     long l;
43     int len;
44
45     l = asn1_get_length_der (der, sizeof der, &len);
46
47     if (l == -2L)
48       {
49         if (verbose)
50           puts ("OK: asn1_get_length_der bignum");
51       }
52     else
53       {
54         printf ("ERROR: asn1_get_length_der bignum (l %ld len %d)\n", l, len);
55         return 1;
56       }
57   }
58
59   /* Test that values larger than int but smaller than long are
60      rejected.  This limitation was introduced with libtasn1 2.12. */
61   if (LONG_MAX > INT_MAX)
62     {
63       unsigned long num = ((long) UINT_MAX) << 2;
64       unsigned char der[20];
65       int der_len;
66       long l;
67       int len;
68
69       asn1_length_der (num, der, &der_len);
70
71       l = asn1_get_length_der (der, der_len, &len);
72
73       if (l == -2L)
74         {
75           if (verbose)
76             puts ("OK: asn1_get_length_der intnum");
77         }
78       else
79         {
80           printf ("ERROR: asn1_get_length_der intnum (l %ld len %d)\n", l,
81                   len);
82           return 1;
83         }
84     }
85
86   /* Test that values larger than would fit in the input string are
87      rejected.  This problem was fixed in libtasn1 2.12. */
88   {
89     unsigned long num = 64;
90     unsigned char der[20];
91     int der_len;
92     long l;
93     int len;
94
95     asn1_length_der (num, der, &der_len);
96
97     der_len = sizeof (der);
98     l = asn1_get_length_der (der, der_len, &len);
99
100     if (l == -4L)
101       {
102         if (verbose)
103           puts ("OK: asn1_get_length_der overflow-small");
104       }
105     else
106       {
107         printf ("ERROR: asn1_get_length_der overflow-small (l %ld len %d)\n",
108                 l, len);
109         return 1;
110       }
111   }
112
113   /* Test that values larger than would fit in the input string are
114      rejected.  This problem was fixed in libtasn1 2.12. */
115   {
116     unsigned long num = 1073741824;
117     unsigned char der[20];
118     int der_len;
119     long l;
120     int len;
121
122     asn1_length_der (num, der, &der_len);
123
124     der_len = sizeof (der);
125     l = asn1_get_length_der (der, der_len, &len);
126
127     if (l == -4L)
128       {
129         if (verbose)
130           puts ("OK: asn1_get_length_der overflow-large1");
131       }
132     else
133       {
134         printf ("ERROR: asn1_get_length_der overflow-large1 (l %ld len %d)\n",
135                 l, len);
136         return 1;
137       }
138   }
139
140   /* Test that values larger than would fit in the input string are
141      rejected.  This problem was fixed in libtasn1 2.12. */
142   {
143     unsigned long num = 2147483649;
144     unsigned char der[20];
145     int der_len;
146     long l;
147     int len;
148
149     asn1_length_der (num, der, &der_len);
150
151     der_len = sizeof (der);
152     l = asn1_get_length_der (der, der_len, &len);
153
154     if (l == -2L)
155       {
156         if (verbose)
157           puts ("OK: asn1_get_length_der overflow-large2");
158       }
159     else
160       {
161         printf ("ERROR: asn1_get_length_der overflow-large2 (l %ld len %d)\n",
162                 l, len);
163         return 1;
164       }
165   }
166
167   return 0;
168 }