OpenCoverage

a_bitstr.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/libressl/src/crypto/asn1/a_bitstr.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* $OpenBSD: a_bitstr.c,v 1.28 2018/05/13 13:48:08 jsing Exp $ */-
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)-
3 * All rights reserved.-
4 *-
5 * This package is an SSL implementation written-
6 * by Eric Young (eay@cryptsoft.com).-
7 * The implementation was written so as to conform with Netscapes SSL.-
8 *-
9 * This library is free for commercial and non-commercial use as long as-
10 * the following conditions are aheared to. The following conditions-
11 * apply to all code found in this distribution, be it the RC4, RSA,-
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation-
13 * included with this distribution is covered by the same copyright terms-
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).-
15 *-
16 * Copyright remains Eric Young's, and as such any Copyright notices in-
17 * the code are not to be removed.-
18 * If this package is used in a product, Eric Young should be given attribution-
19 * as the author of the parts of the library used.-
20 * This can be in the form of a textual message at program startup or-
21 * in documentation (online or textual) provided with the package.-
22 *-
23 * Redistribution and use in source and binary forms, with or without-
24 * modification, are permitted provided that the following conditions-
25 * are met:-
26 * 1. Redistributions of source code must retain the copyright-
27 * notice, this list of conditions and the following disclaimer.-
28 * 2. Redistributions in binary form must reproduce the above copyright-
29 * notice, this list of conditions and the following disclaimer in the-
30 * documentation and/or other materials provided with the distribution.-
31 * 3. All advertising materials mentioning features or use of this software-
32 * must display the following acknowledgement:-
33 * "This product includes cryptographic software written by-
34 * Eric Young (eay@cryptsoft.com)"-
35 * The word 'cryptographic' can be left out if the rouines from the library-
36 * being used are not cryptographic related :-).-
37 * 4. If you include any Windows specific code (or a derivative thereof) from-
38 * the apps directory (application code) you must include an acknowledgement:-
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"-
40 *-
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND-
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE-
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE-
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE-
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL-
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS-
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)-
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT-
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY-
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF-
51 * SUCH DAMAGE.-
52 *-
53 * The licence and distribution terms for any publically available version or-
54 * derivative of this code cannot be changed. i.e. this code cannot simply be-
55 * copied and put under another distribution licence-
56 * [including the GNU Public Licence.]-
57 */-
58-
59#include <stdio.h>-
60#include <string.h>-
61-
62#include <openssl/asn1.h>-
63#include <openssl/err.h>-
64-
65int-
66ASN1_BIT_STRING_set(ASN1_BIT_STRING *x, unsigned char *d, int len)-
67{-
68 return ASN1_STRING_set(x, d, len);
never executed: return ASN1_STRING_set(x, d, len);
0
69}-
70-
71int-
72i2c_ASN1_BIT_STRING(ASN1_BIT_STRING *a, unsigned char **pp)-
73{-
74 int ret, j, bits, len;-
75 unsigned char *p, *d;-
76-
77 if (a == NULL)
a == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 1306 times by 6 tests
Evaluated by:
  • asn1test
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
0-1306
78 return (0);
never executed: return (0);
0
79-
80 len = a->length;-
81-
82 if (len > 0) {
len > 0Description
TRUEevaluated 1306 times by 6 tests
Evaluated by:
  • asn1test
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
FALSEnever evaluated
0-1306
83 if (a->flags & ASN1_STRING_FLAG_BITS_LEFT) {
a->flags & 0x08Description
TRUEevaluated 1306 times by 6 tests
Evaluated by:
  • asn1test
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
FALSEnever evaluated
0-1306
84 bits = (int)a->flags & 0x07;-
85 } else {
executed 1306 times by 6 tests: end of block
Executed by:
  • asn1test
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
1306
86 for (; len > 0; len--) {
len > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
87 if (a->data[len - 1])
a->data[len - 1]Description
TRUEnever evaluated
FALSEnever evaluated
0
88 break;
never executed: break;
0
89 }
never executed: end of block
0
90 j = a->data[len - 1];-
91 if (j & 0x01)
j & 0x01Description
TRUEnever evaluated
FALSEnever evaluated
0
92 bits = 0;
never executed: bits = 0;
0
93 else if (j & 0x02)
j & 0x02Description
TRUEnever evaluated
FALSEnever evaluated
0
94 bits = 1;
never executed: bits = 1;
0
95 else if (j & 0x04)
j & 0x04Description
TRUEnever evaluated
FALSEnever evaluated
0
96 bits = 2;
never executed: bits = 2;
0
97 else if (j & 0x08)
j & 0x08Description
TRUEnever evaluated
FALSEnever evaluated
0
98 bits = 3;
never executed: bits = 3;
0
99 else if (j & 0x10)
j & 0x10Description
TRUEnever evaluated
FALSEnever evaluated
0
100 bits = 4;
never executed: bits = 4;
0
101 else if (j & 0x20)
j & 0x20Description
TRUEnever evaluated
FALSEnever evaluated
0
102 bits = 5;
never executed: bits = 5;
0
103 else if (j & 0x40)
j & 0x40Description
TRUEnever evaluated
FALSEnever evaluated
0
104 bits = 6;
never executed: bits = 6;
0
105 else if (j & 0x80)
j & 0x80Description
TRUEnever evaluated
FALSEnever evaluated
0
106 bits = 7;
never executed: bits = 7;
0
107 else-
108 bits = 0; /* should not happen */
never executed: bits = 0;
0
109 }-
110 } else-
111 bits = 0;
never executed: bits = 0;
0
112-
113 ret = 1 + len;-
114 if (pp == NULL)
pp == ((void *)0)Description
TRUEevaluated 984 times by 6 tests
Evaluated by:
  • asn1test
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
FALSEevaluated 322 times by 6 tests
Evaluated by:
  • asn1test
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
322-984
115 return (ret);
executed 984 times by 6 tests: return (ret);
Executed by:
  • asn1test
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
984
116-
117 p= *pp;-
118-
119 *(p++) = (unsigned char)bits;-
120 d = a->data;-
121 memcpy(p, d, len);-
122 p += len;-
123 if (len > 0)
len > 0Description
TRUEevaluated 322 times by 6 tests
Evaluated by:
  • asn1test
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
FALSEnever evaluated
0-322
124 p[-1]&=(0xff << bits);
executed 322 times by 6 tests: p[-1]&=(0xff << bits);
Executed by:
  • asn1test
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
322
125 *pp = p;-
126 return (ret);
executed 322 times by 6 tests: return (ret);
Executed by:
  • asn1test
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
322
127}-
128-
129ASN1_BIT_STRING *-
130c2i_ASN1_BIT_STRING(ASN1_BIT_STRING **a, const unsigned char **pp, long len)-
131{-
132 ASN1_BIT_STRING *ret = NULL;-
133 const unsigned char *p;-
134 unsigned char *s;-
135 int i;-
136-
137 if (len < 1) {
len < 1Description
TRUEnever evaluated
FALSEevaluated 635 times by 7 tests
Evaluated by:
  • asn1test
  • keypairtest
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
0-635
138 ASN1error(ASN1_R_STRING_TOO_SHORT);-
139 goto err;
never executed: goto err;
0
140 }-
141-
142 if (a == NULL || *a == NULL) {
a == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 635 times by 7 tests
Evaluated by:
  • asn1test
  • keypairtest
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
*a == ((void *)0)Description
TRUEevaluated 197 times by 5 tests
Evaluated by:
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
FALSEevaluated 438 times by 7 tests
Evaluated by:
  • asn1test
  • keypairtest
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
0-635
143 if ((ret = ASN1_BIT_STRING_new()) == NULL)
(ret = ASN1_BI...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 197 times by 5 tests
Evaluated by:
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
0-197
144 return (NULL);
never executed: return ( ((void *)0) );
0
145 } else
executed 197 times by 5 tests: end of block
Executed by:
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
197
146 ret = *a;
executed 438 times by 7 tests: ret = *a;
Executed by:
  • asn1test
  • keypairtest
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
438
147-
148 p = *pp;-
149 i = *(p++);-
150 if (i > 7) {
i > 7Description
TRUEnever evaluated
FALSEevaluated 635 times by 7 tests
Evaluated by:
  • asn1test
  • keypairtest
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
0-635
151 ASN1error(ASN1_R_INVALID_BIT_STRING_BITS_LEFT);-
152 goto err;
never executed: goto err;
0
153 }-
154-
155 /*-
156 * We do this to preserve the settings. If we modify the settings,-
157 * via the _set_bit function, we will recalculate on output.-
158 */-
159 ret->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07); /* clear */-
160 ret->flags |= (ASN1_STRING_FLAG_BITS_LEFT | i); /* set */-
161-
162 /* using one because of the bits left byte */-
163 if (len-- > 1) {
len-- > 1Description
TRUEevaluated 635 times by 7 tests
Evaluated by:
  • asn1test
  • keypairtest
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
FALSEnever evaluated
0-635
164 if ((s = malloc(len)) == NULL) {
(s = malloc(le...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 635 times by 7 tests
Evaluated by:
  • asn1test
  • keypairtest
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
0-635
165 ASN1error(ERR_R_MALLOC_FAILURE);-
166 goto err;
never executed: goto err;
0
167 }-
168 memcpy(s, p, len);-
169 s[len - 1] &= (0xff << i);-
170 p += len;-
171 } else
executed 635 times by 7 tests: end of block
Executed by:
  • asn1test
  • keypairtest
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
635
172 s = NULL;
never executed: s = ((void *)0) ;
0
173-
174 free(ret->data);-
175 ret->data = s;-
176 ret->length = (int)len;-
177 ret->type = V_ASN1_BIT_STRING;-
178-
179 if (a != NULL)
a != ((void *)0)Description
TRUEevaluated 635 times by 7 tests
Evaluated by:
  • asn1test
  • keypairtest
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
FALSEnever evaluated
0-635
180 *a = ret;
executed 635 times by 7 tests: *a = ret;
Executed by:
  • asn1test
  • keypairtest
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
635
181-
182 *pp = p;-
183-
184 return (ret);
executed 635 times by 7 tests: return (ret);
Executed by:
  • asn1test
  • keypairtest
  • libcrypto.so.44.0.1
  • pkcs7test
  • servertest
  • ssltest
  • tlstest
635
185-
186 err:-
187 if (a == NULL || *a != ret)
a == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
*a != retDescription
TRUEnever evaluated
FALSEnever evaluated
0
188 ASN1_BIT_STRING_free(ret);
never executed: ASN1_BIT_STRING_free(ret);
0
189-
190 return (NULL);
never executed: return ( ((void *)0) );
0
191}-
192-
193int-
194ASN1_BIT_STRING_set_bit(ASN1_BIT_STRING *a, int n, int value)-
195{-
196 int w, v, iv;-
197 unsigned char *c;-
198-
199 w = n/8;-
200 v = 1 << (7 - (n & 0x07));-
201 iv = ~v;-
202 if (!value)
!valueDescription
TRUEnever evaluated
FALSEnever evaluated
0
203 v = 0;
never executed: v = 0;
0
204-
205 if (a == NULL)
a == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
206 return 0;
never executed: return 0;
0
207-
208 a->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07); /* clear, set on write */-
209-
210 if ((a->length < (w + 1)) || (a->data == NULL)) {
(a->length < (w + 1))Description
TRUEnever evaluated
FALSEnever evaluated
(a->data == ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
211 if (!value)
!valueDescription
TRUEnever evaluated
FALSEnever evaluated
0
212 return(1); /* Don't need to set */
never executed: return(1);
0
213 if ((c = recallocarray(a->data, a->length, w + 1, 1)) == NULL) {
(c = recalloca...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
214 ASN1error(ERR_R_MALLOC_FAILURE);-
215 return 0;
never executed: return 0;
0
216 }-
217 if (w + 1 - a->length > 0)
w + 1 - a->length > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
218 memset(c + a->length, 0, w + 1 - a->length);
never executed: memset(c + a->length, 0, w + 1 - a->length);
0
219 a->data = c;-
220 a->length = w + 1;-
221 }
never executed: end of block
0
222 a->data[w] = ((a->data[w]) & iv) | v;-
223 while ((a->length > 0) && (a->data[a->length - 1] == 0))
(a->length > 0)Description
TRUEnever evaluated
FALSEnever evaluated
(a->data[a->length - 1] == 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
224 a->length--;
never executed: a->length--;
0
225-
226 return (1);
never executed: return (1);
0
227}-
228-
229int-
230ASN1_BIT_STRING_get_bit(const ASN1_BIT_STRING *a, int n)-
231{-
232 int w, v;-
233-
234 w = n / 8;-
235 v = 1 << (7 - (n & 0x07));-
236 if ((a == NULL) || (a->length < (w + 1)) || (a->data == NULL))
(a == ((void *)0) )Description
TRUEnever evaluated
FALSEevaluated 9 times by 1 test
Evaluated by:
  • libcrypto.so.44.0.1
(a->length < (w + 1))Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.44.0.1
FALSEevaluated 8 times by 1 test
Evaluated by:
  • libcrypto.so.44.0.1
(a->data == ((void *)0) )Description
TRUEnever evaluated
FALSEevaluated 8 times by 1 test
Evaluated by:
  • libcrypto.so.44.0.1
0-9
237 return (0);
executed 1 time by 1 test: return (0);
Executed by:
  • libcrypto.so.44.0.1
1
238 return ((a->data[w] & v) != 0);
executed 8 times by 1 test: return ((a->data[w] & v) != 0);
Executed by:
  • libcrypto.so.44.0.1
8
239}-
240-
241/*-
242 * Checks if the given bit string contains only bits specified by-
243 * the flags vector. Returns 0 if there is at least one bit set in 'a'-
244 * which is not specified in 'flags', 1 otherwise.-
245 * 'len' is the length of 'flags'.-
246 */-
247int-
248ASN1_BIT_STRING_check(const ASN1_BIT_STRING *a, const unsigned char *flags,-
249 int flags_len)-
250{-
251 int i, ok;-
252-
253 /* Check if there is one bit set at all. */-
254 if (!a || !a->data)
!aDescription
TRUEnever evaluated
FALSEnever evaluated
!a->dataDescription
TRUEnever evaluated
FALSEnever evaluated
0
255 return 1;
never executed: return 1;
0
256-
257 /* Check each byte of the internal representation of the bit string. */-
258 ok = 1;-
259 for (i = 0; i < a->length && ok; ++i) {
i < a->lengthDescription
TRUEnever evaluated
FALSEnever evaluated
okDescription
TRUEnever evaluated
FALSEnever evaluated
0
260 unsigned char mask = i < flags_len ? ~flags[i] : 0xff;
i < flags_lenDescription
TRUEnever evaluated
FALSEnever evaluated
0
261 /* We are done if there is an unneeded bit set. */-
262 ok = (a->data[i] & mask) == 0;-
263 }
never executed: end of block
0
264 return ok;
never executed: return ok;
0
265}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2