OpenCoverage

v3_alt.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/openssl/src/crypto/x509v3/v3_alt.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/*-
2 * Copyright 1999-2017 The OpenSSL Project Authors. All Rights Reserved.-
3 *-
4 * Licensed under the OpenSSL license (the "License"). You may not use-
5 * this file except in compliance with the License. You can obtain a copy-
6 * in the file LICENSE in the source distribution or at-
7 * https://www.openssl.org/source/license.html-
8 */-
9-
10#include <stdio.h>-
11#include "internal/cryptlib.h"-
12#include <openssl/conf.h>-
13#include <openssl/x509v3.h>-
14#include "ext_dat.h"-
15-
16static GENERAL_NAMES *v2i_subject_alt(X509V3_EXT_METHOD *method,-
17 X509V3_CTX *ctx,-
18 STACK_OF(CONF_VALUE) *nval);-
19static GENERAL_NAMES *v2i_issuer_alt(X509V3_EXT_METHOD *method,-
20 X509V3_CTX *ctx,-
21 STACK_OF(CONF_VALUE) *nval);-
22static int copy_email(X509V3_CTX *ctx, GENERAL_NAMES *gens, int move_p);-
23static int copy_issuer(X509V3_CTX *ctx, GENERAL_NAMES *gens);-
24static int do_othername(GENERAL_NAME *gen, const char *value, X509V3_CTX *ctx);-
25static int do_dirname(GENERAL_NAME *gen, const char *value, X509V3_CTX *ctx);-
26-
27const X509V3_EXT_METHOD v3_alt[3] = {-
28 {NID_subject_alt_name, 0, ASN1_ITEM_ref(GENERAL_NAMES),-
29 0, 0, 0, 0,-
30 0, 0,-
31 (X509V3_EXT_I2V) i2v_GENERAL_NAMES,-
32 (X509V3_EXT_V2I)v2i_subject_alt,-
33 NULL, NULL, NULL},-
34-
35 {NID_issuer_alt_name, 0, ASN1_ITEM_ref(GENERAL_NAMES),-
36 0, 0, 0, 0,-
37 0, 0,-
38 (X509V3_EXT_I2V) i2v_GENERAL_NAMES,-
39 (X509V3_EXT_V2I)v2i_issuer_alt,-
40 NULL, NULL, NULL},-
41-
42 {NID_certificate_issuer, 0, ASN1_ITEM_ref(GENERAL_NAMES),-
43 0, 0, 0, 0,-
44 0, 0,-
45 (X509V3_EXT_I2V) i2v_GENERAL_NAMES,-
46 NULL, NULL, NULL, NULL},-
47};-
48-
49STACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES(X509V3_EXT_METHOD *method,-
50 GENERAL_NAMES *gens,-
51 STACK_OF(CONF_VALUE) *ret)-
52{-
53 int i;-
54 GENERAL_NAME *gen;-
55 for (i = 0; i < sk_GENERAL_NAME_num(gens); i++) {
i < sk_GENERAL_NAME_num(gens)Description
TRUEevaluated 7477 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 3794 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
3794-7477
56 gen = sk_GENERAL_NAME_value(gens, i);-
57 ret = i2v_GENERAL_NAME(method, gen, ret);-
58 }
executed 7477 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
7477
59 if (!ret)
!retDescription
TRUEevaluated 617 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 3177 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
617-3177
60 return sk_CONF_VALUE_new_null();
executed 617 times by 1 test: return sk_CONF_VALUE_new_null();
Executed by:
  • libcrypto.so.1.1
617
61 return ret;
executed 3177 times by 1 test: return ret;
Executed by:
  • libcrypto.so.1.1
3177
62}-
63-
64STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(X509V3_EXT_METHOD *method,-
65 GENERAL_NAME *gen,-
66 STACK_OF(CONF_VALUE) *ret)-
67{-
68 unsigned char *p;-
69 char oline[256], htmp[5];-
70 int i;-
71-
72 switch (gen->type) {-
73 case GEN_OTHERNAME:
executed 110 times by 1 test: case 0:
Executed by:
  • libcrypto.so.1.1
110
74 if (!X509V3_add_value("othername", "<unsupported>", &ret))
!X509V3_add_va...orted>", &ret)Description
TRUEnever evaluated
FALSEevaluated 110 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-110
75 return NULL;
never executed: return ((void *)0) ;
0
76 break;
executed 110 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
110
77-
78 case GEN_X400:
executed 485 times by 1 test: case 3:
Executed by:
  • libcrypto.so.1.1
485
79 if (!X509V3_add_value("X400Name", "<unsupported>", &ret))
!X509V3_add_va...orted>", &ret)Description
TRUEnever evaluated
FALSEevaluated 485 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-485
80 return NULL;
never executed: return ((void *)0) ;
0
81 break;
executed 485 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
485
82-
83 case GEN_EDIPARTY:
executed 426 times by 1 test: case 5:
Executed by:
  • libcrypto.so.1.1
426
84 if (!X509V3_add_value("EdiPartyName", "<unsupported>", &ret))
!X509V3_add_va...orted>", &ret)Description
TRUEnever evaluated
FALSEevaluated 426 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-426
85 return NULL;
never executed: return ((void *)0) ;
0
86 break;
executed 426 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
426
87-
88 case GEN_EMAIL:
executed 1739 times by 1 test: case 1:
Executed by:
  • libcrypto.so.1.1
1739
89 if (!X509V3_add_value_uchar("email", gen->d.ia5->data, &ret))
!X509V3_add_va...5->data, &ret)Description
TRUEnever evaluated
FALSEevaluated 1739 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-1739
90 return NULL;
never executed: return ((void *)0) ;
0
91 break;
executed 1739 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
1739
92-
93 case GEN_DNS:
executed 786 times by 1 test: case 2:
Executed by:
  • libcrypto.so.1.1
786
94 if (!X509V3_add_value_uchar("DNS", gen->d.ia5->data, &ret))
!X509V3_add_va...5->data, &ret)Description
TRUEnever evaluated
FALSEevaluated 786 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-786
95 return NULL;
never executed: return ((void *)0) ;
0
96 break;
executed 786 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
786
97-
98 case GEN_URI:
executed 1086 times by 1 test: case 6:
Executed by:
  • libcrypto.so.1.1
1086
99 if (!X509V3_add_value_uchar("URI", gen->d.ia5->data, &ret))
!X509V3_add_va...5->data, &ret)Description
TRUEnever evaluated
FALSEevaluated 1086 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-1086
100 return NULL;
never executed: return ((void *)0) ;
0
101 break;
executed 1086 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
1086
102-
103 case GEN_DIRNAME:
executed 461 times by 1 test: case 4:
Executed by:
  • libcrypto.so.1.1
461
104 if (X509_NAME_oneline(gen->d.dirn, oline, sizeof(oline)) == NULL
X509_NAME_onel...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 461 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-461
105 || !X509V3_add_value("DirName", oline, &ret))
!X509V3_add_va..., oline, &ret)Description
TRUEnever evaluated
FALSEevaluated 461 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-461
106 return NULL;
never executed: return ((void *)0) ;
0
107 break;
executed 461 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
461
108-
109 case GEN_IPADD:
executed 2009 times by 1 test: case 7:
Executed by:
  • libcrypto.so.1.1
2009
110 p = gen->d.ip->data;-
111 if (gen->d.ip->length == 4)
gen->d.ip->length == 4Description
TRUEevaluated 827 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 1182 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
827-1182
112 BIO_snprintf(oline, sizeof(oline), "%d.%d.%d.%d",
executed 827 times by 1 test: BIO_snprintf(oline, sizeof(oline), "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
Executed by:
  • libcrypto.so.1.1
827
113 p[0], p[1], p[2], p[3]);
executed 827 times by 1 test: BIO_snprintf(oline, sizeof(oline), "%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
Executed by:
  • libcrypto.so.1.1
827
114 else if (gen->d.ip->length == 16) {
gen->d.ip->length == 16Description
TRUEevaluated 628 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 554 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
554-628
115 oline[0] = 0;-
116 for (i = 0; i < 8; i++) {
i < 8Description
TRUEevaluated 5024 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 628 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
628-5024
117 BIO_snprintf(htmp, sizeof(htmp), "%X", p[0] << 8 | p[1]);-
118 p += 2;-
119 strcat(oline, htmp);-
120 if (i != 7)
i != 7Description
TRUEevaluated 4396 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 628 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
628-4396
121 strcat(oline, ":");
executed 4396 times by 1 test: strcat(oline, ":");
Executed by:
  • libcrypto.so.1.1
4396
122 }
executed 5024 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
5024
123 } else {
executed 628 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
628
124 if (!X509V3_add_value("IP Address", "<invalid>", &ret))
!X509V3_add_va...valid>", &ret)Description
TRUEnever evaluated
FALSEevaluated 554 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-554
125 return NULL;
never executed: return ((void *)0) ;
0
126 break;
executed 554 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
554
127 }-
128 if (!X509V3_add_value("IP Address", oline, &ret))
!X509V3_add_va..., oline, &ret)Description
TRUEnever evaluated
FALSEevaluated 1455 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-1455
129 return NULL;
never executed: return ((void *)0) ;
0
130 break;
executed 1455 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
1455
131-
132 case GEN_RID:
executed 520 times by 1 test: case 8:
Executed by:
  • libcrypto.so.1.1
520
133 i2t_ASN1_OBJECT(oline, 256, gen->d.rid);-
134 if (!X509V3_add_value("Registered ID", oline, &ret))
!X509V3_add_va..., oline, &ret)Description
TRUEnever evaluated
FALSEevaluated 520 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-520
135 return NULL;
never executed: return ((void *)0) ;
0
136 break;
executed 520 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
520
137 }-
138 return ret;
executed 7622 times by 1 test: return ret;
Executed by:
  • libcrypto.so.1.1
7622
139}-
140-
141int GENERAL_NAME_print(BIO *out, GENERAL_NAME *gen)-
142{-
143 unsigned char *p;-
144 int i;-
145 switch (gen->type) {-
146 case GEN_OTHERNAME:
executed 207 times by 1 test: case 0:
Executed by:
  • libcrypto.so.1.1
207
147 BIO_printf(out, "othername:<unsupported>");-
148 break;
executed 207 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
207
149-
150 case GEN_X400:
executed 463 times by 1 test: case 3:
Executed by:
  • libcrypto.so.1.1
463
151 BIO_printf(out, "X400Name:<unsupported>");-
152 break;
executed 463 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
463
153-
154 case GEN_EDIPARTY:
executed 601 times by 1 test: case 5:
Executed by:
  • libcrypto.so.1.1
601
155 /* Maybe fix this: it is supported now */-
156 BIO_printf(out, "EdiPartyName:<unsupported>");-
157 break;
executed 601 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
601
158-
159 case GEN_EMAIL:
executed 1105 times by 1 test: case 1:
Executed by:
  • libcrypto.so.1.1
1105
160 BIO_printf(out, "email:%s", gen->d.ia5->data);-
161 break;
executed 1105 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
1105
162-
163 case GEN_DNS:
executed 504 times by 1 test: case 2:
Executed by:
  • libcrypto.so.1.1
504
164 BIO_printf(out, "DNS:%s", gen->d.ia5->data);-
165 break;
executed 504 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
504
166-
167 case GEN_URI:
executed 648 times by 1 test: case 6:
Executed by:
  • libcrypto.so.1.1
648
168 BIO_printf(out, "URI:%s", gen->d.ia5->data);-
169 break;
executed 648 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
648
170-
171 case GEN_DIRNAME:
executed 778 times by 1 test: case 4:
Executed by:
  • libcrypto.so.1.1
778
172 BIO_printf(out, "DirName:");-
173 X509_NAME_print_ex(out, gen->d.dirn, 0, XN_FLAG_ONELINE);-
174 break;
executed 778 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
778
175-
176 case GEN_IPADD:
executed 2302 times by 1 test: case 7:
Executed by:
  • libcrypto.so.1.1
2302
177 p = gen->d.ip->data;-
178 if (gen->d.ip->length == 4)
gen->d.ip->length == 4Description
TRUEevaluated 531 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 1771 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
531-1771
179 BIO_printf(out, "IP Address:%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
executed 531 times by 1 test: BIO_printf(out, "IP Address:%d.%d.%d.%d", p[0], p[1], p[2], p[3]);
Executed by:
  • libcrypto.so.1.1
531
180 else if (gen->d.ip->length == 16) {
gen->d.ip->length == 16Description
TRUEevaluated 631 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 1140 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
631-1140
181 BIO_printf(out, "IP Address");-
182 for (i = 0; i < 8; i++) {
i < 8Description
TRUEevaluated 5048 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 631 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
631-5048
183 BIO_printf(out, ":%X", p[0] << 8 | p[1]);-
184 p += 2;-
185 }
executed 5048 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
5048
186 BIO_puts(out, "\n");-
187 } else {
executed 631 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
631
188 BIO_printf(out, "IP Address:<invalid>");-
189 break;
executed 1140 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
1140
190 }-
191 break;
executed 1162 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
1162
192-
193 case GEN_RID:
executed 518 times by 1 test: case 8:
Executed by:
  • libcrypto.so.1.1
518
194 BIO_printf(out, "Registered ID:");-
195 i2a_ASN1_OBJECT(out, gen->d.rid);-
196 break;
executed 518 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
518
197 }-
198 return 1;
executed 7126 times by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
7126
199}-
200-
201static GENERAL_NAMES *v2i_issuer_alt(X509V3_EXT_METHOD *method,-
202 X509V3_CTX *ctx,-
203 STACK_OF(CONF_VALUE) *nval)-
204{-
205 const int num = sk_CONF_VALUE_num(nval);-
206 GENERAL_NAMES *gens = sk_GENERAL_NAME_new_reserve(NULL, num);-
207 int i;-
208-
209 if (gens == NULL) {
gens == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-4
210 X509V3err(X509V3_F_V2I_ISSUER_ALT, ERR_R_MALLOC_FAILURE);-
211 sk_GENERAL_NAME_free(gens);-
212 return NULL;
never executed: return ((void *)0) ;
0
213 }-
214 for (i = 0; i < num; i++) {
i < numDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
4
215 CONF_VALUE *cnf = sk_CONF_VALUE_value(nval, i);-
216-
217 if (!name_cmp(cnf->name, "issuer")
!name_cmp(cnf->name, "issuer")Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-4
218 && cnf->value && strcmp(cnf->value, "copy") == 0) {
never executed: __result = (((const unsigned char *) (const char *) ( cnf->value ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "copy" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
cnf->valueDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
__extension__ ... )))); }) == 0Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-4
219 if (!copy_issuer(ctx, gens))
!copy_issuer(ctx, gens)Description
TRUEnever evaluated
FALSEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-4
220 goto err;
never executed: goto err;
0
221 } else {
executed 4 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
4
222 GENERAL_NAME *gen = v2i_GENERAL_NAME(method, ctx, cnf);-
223-
224 if (gen == NULL)
gen == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
225 goto err;
never executed: goto err;
0
226 sk_GENERAL_NAME_push(gens, gen); /* no failure as it was reserved */-
227 }
never executed: end of block
0
228 }-
229 return gens;
executed 4 times by 1 test: return gens;
Executed by:
  • libcrypto.so.1.1
4
230 err:-
231 sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);-
232 return NULL;
never executed: return ((void *)0) ;
0
233}-
234-
235/* Append subject altname of issuer to issuer alt name of subject */-
236-
237static int copy_issuer(X509V3_CTX *ctx, GENERAL_NAMES *gens)-
238{-
239 GENERAL_NAMES *ialt;-
240 GENERAL_NAME *gen;-
241 X509_EXTENSION *ext;-
242 int i, num;-
243-
244 if (ctx && (ctx->flags == CTX_TEST))
ctxDescription
TRUEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
(ctx->flags == 0x1)Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 2 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-4
245 return 1;
executed 2 times by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
2
246 if (!ctx || !ctx->issuer_cert) {
!ctxDescription
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
!ctx->issuer_certDescription
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-2
247 X509V3err(X509V3_F_COPY_ISSUER, X509V3_R_NO_ISSUER_DETAILS);-
248 goto err;
never executed: goto err;
0
249 }-
250 i = X509_get_ext_by_NID(ctx->issuer_cert, NID_subject_alt_name, -1);-
251 if (i < 0)
i < 0Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-2
252 return 1;
executed 2 times by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
2
253 if ((ext = X509_get_ext(ctx->issuer_cert, i)) == NULL
(ext = X509_ge...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
254 || (ialt = X509V3_EXT_d2i(ext)) == NULL) {
(ialt = X509V3...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
255 X509V3err(X509V3_F_COPY_ISSUER, X509V3_R_ISSUER_DECODE_ERROR);-
256 goto err;
never executed: goto err;
0
257 }-
258-
259 num = sk_GENERAL_NAME_num(ialt);-
260 if (!sk_GENERAL_NAME_reserve(gens, num)) {
!sk_GENERAL_NA...rve(gens, num)Description
TRUEnever evaluated
FALSEnever evaluated
0
261 X509V3err(X509V3_F_COPY_ISSUER, ERR_R_MALLOC_FAILURE);-
262 goto err;
never executed: goto err;
0
263 }-
264-
265 for (i = 0; i < num; i++) {
i < numDescription
TRUEnever evaluated
FALSEnever evaluated
0
266 gen = sk_GENERAL_NAME_value(ialt, i);-
267 sk_GENERAL_NAME_push(gens, gen); /* no failure as it was reserved */-
268 }
never executed: end of block
0
269 sk_GENERAL_NAME_free(ialt);-
270-
271 return 1;
never executed: return 1;
0
272-
273 err:-
274 return 0;
never executed: return 0;
0
275-
276}-
277-
278static GENERAL_NAMES *v2i_subject_alt(X509V3_EXT_METHOD *method,-
279 X509V3_CTX *ctx,-
280 STACK_OF(CONF_VALUE) *nval)-
281{-
282 GENERAL_NAMES *gens;-
283 CONF_VALUE *cnf;-
284 const int num = sk_CONF_VALUE_num(nval);-
285 int i;-
286-
287 gens = sk_GENERAL_NAME_new_reserve(NULL, num);-
288 if (gens == NULL) {
gens == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-2
289 X509V3err(X509V3_F_V2I_SUBJECT_ALT, ERR_R_MALLOC_FAILURE);-
290 sk_GENERAL_NAME_free(gens);-
291 return NULL;
never executed: return ((void *)0) ;
0
292 }-
293-
294 for (i = 0; i < num; i++) {
i < numDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 2 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
2
295 cnf = sk_CONF_VALUE_value(nval, i);-
296 if (!name_cmp(cnf->name, "email")
!name_cmp(cnf->name, "email")Description
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-2
297 && cnf->value && strcmp(cnf->value, "copy") == 0) {
never executed: __result = (((const unsigned char *) (const char *) ( cnf->value ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "copy" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
cnf->valueDescription
TRUEnever evaluated
FALSEnever evaluated
__extension__ ... )))); }) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
298 if (!copy_email(ctx, gens, 0))
!copy_email(ctx, gens, 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
299 goto err;
never executed: goto err;
0
300 } else if (!name_cmp(cnf->name, "email")
never executed: end of block
!name_cmp(cnf->name, "email")Description
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-2
301 && cnf->value && strcmp(cnf->value, "move") == 0) {
never executed: __result = (((const unsigned char *) (const char *) ( cnf->value ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "move" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
cnf->valueDescription
TRUEnever evaluated
FALSEnever evaluated
__extension__ ... )))); }) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
302 if (!copy_email(ctx, gens, 1))
!copy_email(ctx, gens, 1)Description
TRUEnever evaluated
FALSEnever evaluated
0
303 goto err;
never executed: goto err;
0
304 } else {
never executed: end of block
0
305 GENERAL_NAME *gen;-
306 if ((gen = v2i_GENERAL_NAME(method, ctx, cnf)) == NULL)
(gen = v2i_GEN...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-2
307 goto err;
never executed: goto err;
0
308 sk_GENERAL_NAME_push(gens, gen); /* no failure as it was reserved */-
309 }
executed 2 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
2
310 }-
311 return gens;
executed 2 times by 1 test: return gens;
Executed by:
  • libcrypto.so.1.1
2
312 err:-
313 sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);-
314 return NULL;
never executed: return ((void *)0) ;
0
315}-
316-
317/*-
318 * Copy any email addresses in a certificate or request to GENERAL_NAMES-
319 */-
320-
321static int copy_email(X509V3_CTX *ctx, GENERAL_NAMES *gens, int move_p)-
322{-
323 X509_NAME *nm;-
324 ASN1_IA5STRING *email = NULL;-
325 X509_NAME_ENTRY *ne;-
326 GENERAL_NAME *gen = NULL;-
327 int i = -1;-
328-
329 if (ctx != NULL && ctx->flags == CTX_TEST)
ctx != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
ctx->flags == 0x1Description
TRUEnever evaluated
FALSEnever evaluated
0
330 return 1;
never executed: return 1;
0
331 if (ctx == NULL
ctx == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
332 || (ctx->subject_cert == NULL && ctx->subject_req == NULL)) {
ctx->subject_c...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
ctx->subject_r...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
333 X509V3err(X509V3_F_COPY_EMAIL, X509V3_R_NO_SUBJECT_DETAILS);-
334 goto err;
never executed: goto err;
0
335 }-
336 /* Find the subject name */-
337 if (ctx->subject_cert)
ctx->subject_certDescription
TRUEnever evaluated
FALSEnever evaluated
0
338 nm = X509_get_subject_name(ctx->subject_cert);
never executed: nm = X509_get_subject_name(ctx->subject_cert);
0
339 else-
340 nm = X509_REQ_get_subject_name(ctx->subject_req);
never executed: nm = X509_REQ_get_subject_name(ctx->subject_req);
0
341-
342 /* Now add any email address(es) to STACK */-
343 while ((i = X509_NAME_get_index_by_NID(nm,
(i = X509_NAME..., 48, i)) >= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
344 NID_pkcs9_emailAddress, i)) >= 0) {
(i = X509_NAME..., 48, i)) >= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
345 ne = X509_NAME_get_entry(nm, i);-
346 email = ASN1_STRING_dup(X509_NAME_ENTRY_get_data(ne));-
347 if (move_p) {
move_pDescription
TRUEnever evaluated
FALSEnever evaluated
0
348 X509_NAME_delete_entry(nm, i);-
349 X509_NAME_ENTRY_free(ne);-
350 i--;-
351 }
never executed: end of block
0
352 if (email == NULL || (gen = GENERAL_NAME_new()) == NULL) {
email == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
(gen = GENERAL...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
353 X509V3err(X509V3_F_COPY_EMAIL, ERR_R_MALLOC_FAILURE);-
354 goto err;
never executed: goto err;
0
355 }-
356 gen->d.ia5 = email;-
357 email = NULL;-
358 gen->type = GEN_EMAIL;-
359 if (!sk_GENERAL_NAME_push(gens, gen)) {
!sk_GENERAL_NA...ush(gens, gen)Description
TRUEnever evaluated
FALSEnever evaluated
0
360 X509V3err(X509V3_F_COPY_EMAIL, ERR_R_MALLOC_FAILURE);-
361 goto err;
never executed: goto err;
0
362 }-
363 gen = NULL;-
364 }
never executed: end of block
0
365-
366 return 1;
never executed: return 1;
0
367-
368 err:-
369 GENERAL_NAME_free(gen);-
370 ASN1_IA5STRING_free(email);-
371 return 0;
never executed: return 0;
0
372-
373}-
374-
375GENERAL_NAMES *v2i_GENERAL_NAMES(const X509V3_EXT_METHOD *method,-
376 X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval)-
377{-
378 GENERAL_NAME *gen;-
379 GENERAL_NAMES *gens;-
380 CONF_VALUE *cnf;-
381 const int num = sk_CONF_VALUE_num(nval);-
382 int i;-
383-
384 gens = sk_GENERAL_NAME_new_reserve(NULL, num);-
385 if (gens == NULL) {
gens == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
386 X509V3err(X509V3_F_V2I_GENERAL_NAMES, ERR_R_MALLOC_FAILURE);-
387 sk_GENERAL_NAME_free(gens);-
388 return NULL;
never executed: return ((void *)0) ;
0
389 }-
390-
391 for (i = 0; i < num; i++) {
i < numDescription
TRUEnever evaluated
FALSEnever evaluated
0
392 cnf = sk_CONF_VALUE_value(nval, i);-
393 if ((gen = v2i_GENERAL_NAME(method, ctx, cnf)) == NULL)
(gen = v2i_GEN...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
394 goto err;
never executed: goto err;
0
395 sk_GENERAL_NAME_push(gens, gen); /* no failure as it was reserved */-
396 }
never executed: end of block
0
397 return gens;
never executed: return gens;
0
398 err:-
399 sk_GENERAL_NAME_pop_free(gens, GENERAL_NAME_free);-
400 return NULL;
never executed: return ((void *)0) ;
0
401}-
402-
403GENERAL_NAME *v2i_GENERAL_NAME(const X509V3_EXT_METHOD *method,-
404 X509V3_CTX *ctx, CONF_VALUE *cnf)-
405{-
406 return v2i_GENERAL_NAME_ex(NULL, method, ctx, cnf, 0);
executed 2 times by 1 test: return v2i_GENERAL_NAME_ex( ((void *)0) , method, ctx, cnf, 0);
Executed by:
  • libcrypto.so.1.1
2
407}-
408-
409GENERAL_NAME *a2i_GENERAL_NAME(GENERAL_NAME *out,-
410 const X509V3_EXT_METHOD *method,-
411 X509V3_CTX *ctx, int gen_type, const char *value,-
412 int is_nc)-
413{-
414 char is_string = 0;-
415 GENERAL_NAME *gen = NULL;-
416-
417 if (!value) {
!valueDescription
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-3
418 X509V3err(X509V3_F_A2I_GENERAL_NAME, X509V3_R_MISSING_VALUE);-
419 return NULL;
never executed: return ((void *)0) ;
0
420 }-
421-
422 if (out)
outDescription
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-3
423 gen = out;
never executed: gen = out;
0
424 else {-
425 gen = GENERAL_NAME_new();-
426 if (gen == NULL) {
gen == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-3
427 X509V3err(X509V3_F_A2I_GENERAL_NAME, ERR_R_MALLOC_FAILURE);-
428 return NULL;
never executed: return ((void *)0) ;
0
429 }-
430 }
executed 3 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
3
431-
432 switch (gen_type) {-
433 case GEN_URI:
never executed: case 6:
0
434 case GEN_EMAIL:
executed 1 time by 1 test: case 1:
Executed by:
  • libcrypto.so.1.1
1
435 case GEN_DNS:
executed 2 times by 1 test: case 2:
Executed by:
  • libcrypto.so.1.1
2
436 is_string = 1;-
437 break;
executed 3 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
3
438-
439 case GEN_RID:
never executed: case 8:
0
440 {-
441 ASN1_OBJECT *obj;-
442 if ((obj = OBJ_txt2obj(value, 0)) == NULL) {
(obj = OBJ_txt...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
443 X509V3err(X509V3_F_A2I_GENERAL_NAME, X509V3_R_BAD_OBJECT);-
444 ERR_add_error_data(2, "value=", value);-
445 goto err;
never executed: goto err;
0
446 }-
447 gen->d.rid = obj;-
448 }-
449 break;
never executed: break;
0
450-
451 case GEN_IPADD:
never executed: case 7:
0
452 if (is_nc)
is_ncDescription
TRUEnever evaluated
FALSEnever evaluated
0
453 gen->d.ip = a2i_IPADDRESS_NC(value);
never executed: gen->d.ip = a2i_IPADDRESS_NC(value);
0
454 else-
455 gen->d.ip = a2i_IPADDRESS(value);
never executed: gen->d.ip = a2i_IPADDRESS(value);
0
456 if (gen->d.ip == NULL) {
gen->d.ip == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
457 X509V3err(X509V3_F_A2I_GENERAL_NAME, X509V3_R_BAD_IP_ADDRESS);-
458 ERR_add_error_data(2, "value=", value);-
459 goto err;
never executed: goto err;
0
460 }-
461 break;
never executed: break;
0
462-
463 case GEN_DIRNAME:
never executed: case 4:
0
464 if (!do_dirname(gen, value, ctx)) {
!do_dirname(gen, value, ctx)Description
TRUEnever evaluated
FALSEnever evaluated
0
465 X509V3err(X509V3_F_A2I_GENERAL_NAME, X509V3_R_DIRNAME_ERROR);-
466 goto err;
never executed: goto err;
0
467 }-
468 break;
never executed: break;
0
469-
470 case GEN_OTHERNAME:
never executed: case 0:
0
471 if (!do_othername(gen, value, ctx)) {
!do_othername(gen, value, ctx)Description
TRUEnever evaluated
FALSEnever evaluated
0
472 X509V3err(X509V3_F_A2I_GENERAL_NAME, X509V3_R_OTHERNAME_ERROR);-
473 goto err;
never executed: goto err;
0
474 }-
475 break;
never executed: break;
0
476 default:
never executed: default:
0
477 X509V3err(X509V3_F_A2I_GENERAL_NAME, X509V3_R_UNSUPPORTED_TYPE);-
478 goto err;
never executed: goto err;
0
479 }-
480-
481 if (is_string) {
is_stringDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-3
482 if ((gen->d.ia5 = ASN1_IA5STRING_new()) == NULL ||
(gen->d.ia5 = ...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-3
483 !ASN1_STRING_set(gen->d.ia5, (unsigned char *)value,
!ASN1_STRING_s...strlen(value))Description
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-3
484 strlen(value))) {
!ASN1_STRING_s...strlen(value))Description
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-3
485 X509V3err(X509V3_F_A2I_GENERAL_NAME, ERR_R_MALLOC_FAILURE);-
486 goto err;
never executed: goto err;
0
487 }-
488 }
executed 3 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
3
489-
490 gen->type = gen_type;-
491-
492 return gen;
executed 3 times by 1 test: return gen;
Executed by:
  • libcrypto.so.1.1
3
493-
494 err:-
495 if (!out)
!outDescription
TRUEnever evaluated
FALSEnever evaluated
0
496 GENERAL_NAME_free(gen);
never executed: GENERAL_NAME_free(gen);
0
497 return NULL;
never executed: return ((void *)0) ;
0
498}-
499-
500GENERAL_NAME *v2i_GENERAL_NAME_ex(GENERAL_NAME *out,-
501 const X509V3_EXT_METHOD *method,-
502 X509V3_CTX *ctx, CONF_VALUE *cnf, int is_nc)-
503{-
504 int type;-
505-
506 char *name, *value;-
507-
508 name = cnf->name;-
509 value = cnf->value;-
510-
511 if (!value) {
!valueDescription
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-2
512 X509V3err(X509V3_F_V2I_GENERAL_NAME_EX, X509V3_R_MISSING_VALUE);-
513 return NULL;
never executed: return ((void *)0) ;
0
514 }-
515-
516 if (!name_cmp(name, "email"))
!name_cmp(name, "email")Description
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-2
517 type = GEN_EMAIL;
never executed: type = 1;
0
518 else if (!name_cmp(name, "URI"))
!name_cmp(name, "URI")Description
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-2
519 type = GEN_URI;
never executed: type = 6;
0
520 else if (!name_cmp(name, "DNS"))
!name_cmp(name, "DNS")Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-2
521 type = GEN_DNS;
executed 2 times by 1 test: type = 2;
Executed by:
  • libcrypto.so.1.1
2
522 else if (!name_cmp(name, "RID"))
!name_cmp(name, "RID")Description
TRUEnever evaluated
FALSEnever evaluated
0
523 type = GEN_RID;
never executed: type = 8;
0
524 else if (!name_cmp(name, "IP"))
!name_cmp(name, "IP")Description
TRUEnever evaluated
FALSEnever evaluated
0
525 type = GEN_IPADD;
never executed: type = 7;
0
526 else if (!name_cmp(name, "dirName"))
!name_cmp(name, "dirName")Description
TRUEnever evaluated
FALSEnever evaluated
0
527 type = GEN_DIRNAME;
never executed: type = 4;
0
528 else if (!name_cmp(name, "otherName"))
!name_cmp(name, "otherName")Description
TRUEnever evaluated
FALSEnever evaluated
0
529 type = GEN_OTHERNAME;
never executed: type = 0;
0
530 else {-
531 X509V3err(X509V3_F_V2I_GENERAL_NAME_EX, X509V3_R_UNSUPPORTED_OPTION);-
532 ERR_add_error_data(2, "name=", name);-
533 return NULL;
never executed: return ((void *)0) ;
0
534 }-
535-
536 return a2i_GENERAL_NAME(out, method, ctx, type, value, is_nc);
executed 2 times by 1 test: return a2i_GENERAL_NAME(out, method, ctx, type, value, is_nc);
Executed by:
  • libcrypto.so.1.1
2
537-
538}-
539-
540static int do_othername(GENERAL_NAME *gen, const char *value, X509V3_CTX *ctx)-
541{-
542 char *objtmp = NULL, *p;-
543 int objlen;-
544-
545 if ((p = strchr(value, ';')) == NULL)
(p = (__extens...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( ';' )Description
TRUEnever evaluated
FALSEnever evaluated
!__builtin_con...nt_p ( value )Description
TRUEnever evaluated
FALSEnever evaluated
( ';' ) == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
546 return 0;
never executed: return 0;
0
547 if ((gen->d.otherName = OTHERNAME_new()) == NULL)
(gen->d.otherN...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
548 return 0;
never executed: return 0;
0
549 /*-
550 * Free this up because we will overwrite it. no need to free type_id-
551 * because it is static-
552 */-
553 ASN1_TYPE_free(gen->d.otherName->value);-
554 if ((gen->d.otherName->value = ASN1_generate_v3(p + 1, ctx)) == NULL)
(gen->d.otherN...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
555 return 0;
never executed: return 0;
0
556 objlen = p - value;-
557 objtmp = OPENSSL_strndup(value, objlen);-
558 if (objtmp == NULL)
objtmp == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
559 return 0;
never executed: return 0;
0
560 gen->d.otherName->type_id = OBJ_txt2obj(objtmp, 0);-
561 OPENSSL_free(objtmp);-
562 if (!gen->d.otherName->type_id)
!gen->d.otherName->type_idDescription
TRUEnever evaluated
FALSEnever evaluated
0
563 return 0;
never executed: return 0;
0
564 return 1;
never executed: return 1;
0
565}-
566-
567static int do_dirname(GENERAL_NAME *gen, const char *value, X509V3_CTX *ctx)-
568{-
569 int ret = 0;-
570 STACK_OF(CONF_VALUE) *sk = NULL;-
571 X509_NAME *nm;-
572-
573 if ((nm = X509_NAME_new()) == NULL)
(nm = X509_NAM...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
574 goto err;
never executed: goto err;
0
575 sk = X509V3_get_section(ctx, value);-
576 if (!sk) {
!skDescription
TRUEnever evaluated
FALSEnever evaluated
0
577 X509V3err(X509V3_F_DO_DIRNAME, X509V3_R_SECTION_NOT_FOUND);-
578 ERR_add_error_data(2, "section=", value);-
579 goto err;
never executed: goto err;
0
580 }-
581 /* FIXME: should allow other character types... */-
582 ret = X509V3_NAME_from_section(nm, sk, MBSTRING_ASC);-
583 if (!ret)
!retDescription
TRUEnever evaluated
FALSEnever evaluated
0
584 goto err;
never executed: goto err;
0
585 gen->d.dirn = nm;-
586-
587err:
code before this statement never executed: err:
0
588 if (ret == 0)
ret == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
589 X509_NAME_free(nm);
never executed: X509_NAME_free(nm);
0
590 X509V3_section_free(ctx, sk);-
591 return ret;
never executed: return ret;
0
592}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2