Line | Source | Count |
1 | | - |
2 | | - |
3 | | - |
4 | | - |
5 | | - |
6 | | - |
7 | | - |
8 | | - |
9 | | - |
10 | | - |
11 | | - |
12 | | - |
13 | | - |
14 | | - |
15 | | - |
16 | | - |
17 | | - |
18 | | - |
19 | | - |
20 | | - |
21 | | - |
22 | | - |
23 | | - |
24 | | - |
25 | | - |
26 | | - |
27 | | - |
28 | | - |
29 | | - |
30 | | - |
31 | | - |
32 | | - |
33 | | - |
34 | | - |
35 | | - |
36 | | - |
37 | | - |
38 | | - |
39 | | - |
40 | | - |
41 | | - |
42 | | - |
43 | | - |
44 | | - |
45 | | - |
46 | | - |
47 | | - |
48 | | - |
49 | | - |
50 | | - |
51 | | - |
52 | | - |
53 | | - |
54 | | - |
55 | | - |
56 | | - |
57 | | - |
58 | | - |
59 | #include <stdio.h> | - |
60 | #include <string.h> | - |
61 | | - |
62 | #include <openssl/asn1_mac.h> | - |
63 | #include <openssl/err.h> | - |
64 | | - |
65 | #ifndef NO_ASN1_OLD | - |
66 | | - |
67 | typedef struct { | - |
68 | unsigned char *pbData; | - |
69 | int cbData; | - |
70 | } MYBLOB; | - |
71 | | - |
72 | | - |
73 | | - |
74 | | - |
75 | static int | - |
76 | SetBlobCmp(const void *elem1, const void *elem2) | - |
77 | { | - |
78 | const MYBLOB *b1 = (const MYBLOB *)elem1; | - |
79 | const MYBLOB *b2 = (const MYBLOB *)elem2; | - |
80 | int r; | - |
81 | | - |
82 | r = memcmp(b1->pbData, b2->pbData, | - |
83 | b1->cbData < b2->cbData ? b1->cbData : b2->cbData); | - |
84 | if (r != 0)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
85 | return r; never executed: return r; | 0 |
86 | return b1->cbData - b2->cbData; never executed: return b1->cbData - b2->cbData; | 0 |
87 | } | - |
88 | | - |
89 | | - |
90 | int | - |
91 | i2d_ASN1_SET(STACK_OF(OPENSSL_BLOCK) *a, unsigned char **pp, i2d_of_void *i2d, | - |
92 | int ex_tag, int ex_class, int is_set) | - |
93 | { | - |
94 | int ret = 0, r; | - |
95 | int i; | - |
96 | unsigned char *p; | - |
97 | unsigned char *pStart, *pTempMem; | - |
98 | MYBLOB *rgSetBlob; | - |
99 | int totSize; | - |
100 | | - |
101 | if (a == NULL)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
102 | return 0; never executed: return 0; | 0 |
103 | for (i = sk_OPENSSL_BLOCK_num(a) - 1; i >= 0; i--)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
104 | ret += i2d(sk_OPENSSL_BLOCK_value(a, i), NULL); never executed: ret += i2d(((OPENSSL_BLOCK)sk_value(((_STACK*) (1 ? a : (struct stack_st_OPENSSL_BLOCK*)0)), i)), ((void *)0) ); | 0 |
105 | r = ASN1_object_size(1, ret, ex_tag); | - |
106 | if (pp == NULL)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
107 | return r; never executed: return r; | 0 |
108 | | - |
109 | p = *pp; | - |
110 | ASN1_put_object(&p, 1, ret, ex_tag, ex_class); | - |
111 | | - |
112 | | - |
113 | | - |
114 | | - |
115 | | - |
116 | if (!is_set || (sk_OPENSSL_BLOCK_num(a) < 2)) {TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
117 | for (i = 0; i < sk_OPENSSL_BLOCK_num(a); i++)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
118 | i2d(sk_OPENSSL_BLOCK_value(a, i), &p); never executed: i2d(((OPENSSL_BLOCK)sk_value(((_STACK*) (1 ? a : (struct stack_st_OPENSSL_BLOCK*)0)), i)), &p); | 0 |
119 | | - |
120 | *pp = p; | - |
121 | return r; never executed: return r; | 0 |
122 | } | - |
123 | | - |
124 | pStart = p; | - |
125 | | - |
126 | rgSetBlob = reallocarray(NULL, sk_OPENSSL_BLOCK_num(a), sizeof(MYBLOB)); | - |
127 | if (rgSetBlob == NULL) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
128 | ASN1error(ERR_R_MALLOC_FAILURE); | - |
129 | return 0; never executed: return 0; | 0 |
130 | } | - |
131 | | - |
132 | for (i = 0; i < sk_OPENSSL_BLOCK_num(a); i++) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
133 | rgSetBlob[i].pbData = p; | - |
134 | i2d(sk_OPENSSL_BLOCK_value(a, i), &p); | - |
135 | | - |
136 | rgSetBlob[i].cbData = p - rgSetBlob[i].pbData; | - |
137 | } never executed: end of block | 0 |
138 | *pp = p; | - |
139 | totSize = p - pStart; | - |
140 | | - |
141 | | - |
142 | | - |
143 | | - |
144 | | - |
145 | | - |
146 | qsort(rgSetBlob, sk_OPENSSL_BLOCK_num(a), sizeof(MYBLOB), SetBlobCmp); | - |
147 | if ((pTempMem = malloc(totSize)) == NULL) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
148 | free(rgSetBlob); | - |
149 | ASN1error(ERR_R_MALLOC_FAILURE); | - |
150 | return 0; never executed: return 0; | 0 |
151 | } | - |
152 | | - |
153 | | - |
154 | p = pTempMem; | - |
155 | for (i = 0; i < sk_OPENSSL_BLOCK_num(a); ++i) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
156 | memcpy(p, rgSetBlob[i].pbData, rgSetBlob[i].cbData); | - |
157 | p += rgSetBlob[i].cbData; | - |
158 | } never executed: end of block | 0 |
159 | | - |
160 | | - |
161 | memcpy(pStart, pTempMem, totSize); | - |
162 | free(pTempMem); | - |
163 | free(rgSetBlob); | - |
164 | | - |
165 | return r; never executed: return r; | 0 |
166 | } | - |
167 | | - |
168 | STACK_OF(OPENSSL_BLOCK) * | - |
169 | d2i_ASN1_SET(STACK_OF(OPENSSL_BLOCK) **a, const unsigned char **pp, long length, | - |
170 | d2i_of_void *d2i, void (*free_func)(OPENSSL_BLOCK), int ex_tag, | - |
171 | int ex_class) | - |
172 | { | - |
173 | ASN1_const_CTX c; | - |
174 | STACK_OF(OPENSSL_BLOCK) *ret = NULL; | - |
175 | | - |
176 | if (a == NULL || (*a) == NULL) {TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
177 | if ((ret = sk_OPENSSL_BLOCK_new_null()) == NULL) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
178 | ASN1error(ERR_R_MALLOC_FAILURE); | - |
179 | goto err; never executed: goto err; | 0 |
180 | } | - |
181 | } else never executed: end of block | 0 |
182 | ret = *a; never executed: ret = *a; | 0 |
183 | | - |
184 | c.p = *pp; | - |
185 | c.max = (length == 0) ? 0 : (c.p + length);TRUE | never evaluated | FALSE | never evaluated |
| 0 |
186 | | - |
187 | c.inf = ASN1_get_object(&c.p, &c.slen, &c.tag, &c.xclass, c.max - c.p); | - |
188 | if (c.inf & 0x80)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
189 | goto err; never executed: goto err; | 0 |
190 | if (ex_class != c.xclass) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
191 | ASN1error(ASN1_R_BAD_CLASS); | - |
192 | goto err; never executed: goto err; | 0 |
193 | } | - |
194 | if (ex_tag != c.tag) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
195 | ASN1error(ASN1_R_BAD_TAG); | - |
196 | goto err; never executed: goto err; | 0 |
197 | } | - |
198 | if (c.slen + c.p > c.max) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
199 | ASN1error(ASN1_R_LENGTH_ERROR); | - |
200 | goto err; never executed: goto err; | 0 |
201 | } | - |
202 | | - |
203 | | - |
204 | if (c.inf == (V_ASN1_CONSTRUCTED + 1))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
205 | c.slen = length + *pp - c.p; never executed: c.slen = length + *pp - c.p; | 0 |
206 | c.max = c.p + c.slen; | - |
207 | | - |
208 | while (c.p < c.max) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
209 | char *s; | - |
210 | | - |
211 | if (M_ASN1_D2I_end_sequence())TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
212 | break; never executed: break; | 0 |
213 | if ((s = d2i(NULL, &c.p, c.slen)) == NULL) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
214 | ASN1error(ASN1_R_ERROR_PARSING_SET_ELEMENT); | - |
215 | asn1_add_error(*pp, (int)(c.p - *pp)); | - |
216 | goto err; never executed: goto err; | 0 |
217 | } | - |
218 | if (!sk_OPENSSL_BLOCK_push(ret, s))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
219 | goto err; never executed: goto err; | 0 |
220 | } never executed: end of block | 0 |
221 | if (a != NULL)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
222 | *a = ret; never executed: *a = ret; | 0 |
223 | *pp = c.p; | - |
224 | return ret; never executed: return ret; | 0 |
225 | | - |
226 | err: | - |
227 | if (a == NULL || *a != ret) {TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
228 | if (free_func != NULL)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
229 | sk_OPENSSL_BLOCK_pop_free(ret, free_func); never executed: sk_pop_free(((_STACK*) (1 ? ret : (struct stack_st_OPENSSL_BLOCK*)0)), ((void (*)(void *)) ((1 ? free_func : (void (*)(OPENSSL_BLOCK))0)))); | 0 |
230 | else | - |
231 | sk_OPENSSL_BLOCK_free(ret); never executed: sk_free(((_STACK*) (1 ? ret : (struct stack_st_OPENSSL_BLOCK*)0))); | 0 |
232 | } | - |
233 | return NULL; never executed: return ((void *)0) ; | 0 |
234 | } | - |
235 | | - |
236 | #endif | - |
| | |