1*de0e0e4dSAntonio Huete Jimenez /* $OpenBSD: ts_req_utils.c,v 1.7 2022/07/24 08:16:47 tb Exp $ */
2f5b1c8a1SJohn Marino /* Written by Zoltan Glozik (zglozik@stones.com) for the OpenSSL
3f5b1c8a1SJohn Marino  * project 2002.
4f5b1c8a1SJohn Marino  */
5f5b1c8a1SJohn Marino /* ====================================================================
6f5b1c8a1SJohn Marino  * Copyright (c) 2006 The OpenSSL Project.  All rights reserved.
7f5b1c8a1SJohn Marino  *
8f5b1c8a1SJohn Marino  * Redistribution and use in source and binary forms, with or without
9f5b1c8a1SJohn Marino  * modification, are permitted provided that the following conditions
10f5b1c8a1SJohn Marino  * are met:
11f5b1c8a1SJohn Marino  *
12f5b1c8a1SJohn Marino  * 1. Redistributions of source code must retain the above copyright
13f5b1c8a1SJohn Marino  *    notice, this list of conditions and the following disclaimer.
14f5b1c8a1SJohn Marino  *
15f5b1c8a1SJohn Marino  * 2. Redistributions in binary form must reproduce the above copyright
16f5b1c8a1SJohn Marino  *    notice, this list of conditions and the following disclaimer in
17f5b1c8a1SJohn Marino  *    the documentation and/or other materials provided with the
18f5b1c8a1SJohn Marino  *    distribution.
19f5b1c8a1SJohn Marino  *
20f5b1c8a1SJohn Marino  * 3. All advertising materials mentioning features or use of this
21f5b1c8a1SJohn Marino  *    software must display the following acknowledgment:
22f5b1c8a1SJohn Marino  *    "This product includes software developed by the OpenSSL Project
23f5b1c8a1SJohn Marino  *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24f5b1c8a1SJohn Marino  *
25f5b1c8a1SJohn Marino  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26f5b1c8a1SJohn Marino  *    endorse or promote products derived from this software without
27f5b1c8a1SJohn Marino  *    prior written permission. For written permission, please contact
28f5b1c8a1SJohn Marino  *    licensing@OpenSSL.org.
29f5b1c8a1SJohn Marino  *
30f5b1c8a1SJohn Marino  * 5. Products derived from this software may not be called "OpenSSL"
31f5b1c8a1SJohn Marino  *    nor may "OpenSSL" appear in their names without prior written
32f5b1c8a1SJohn Marino  *    permission of the OpenSSL Project.
33f5b1c8a1SJohn Marino  *
34f5b1c8a1SJohn Marino  * 6. Redistributions of any form whatsoever must retain the following
35f5b1c8a1SJohn Marino  *    acknowledgment:
36f5b1c8a1SJohn Marino  *    "This product includes software developed by the OpenSSL Project
37f5b1c8a1SJohn Marino  *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38f5b1c8a1SJohn Marino  *
39f5b1c8a1SJohn Marino  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40f5b1c8a1SJohn Marino  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41f5b1c8a1SJohn Marino  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42f5b1c8a1SJohn Marino  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
43f5b1c8a1SJohn Marino  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44f5b1c8a1SJohn Marino  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45f5b1c8a1SJohn Marino  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46f5b1c8a1SJohn Marino  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47f5b1c8a1SJohn Marino  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48f5b1c8a1SJohn Marino  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49f5b1c8a1SJohn Marino  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50f5b1c8a1SJohn Marino  * OF THE POSSIBILITY OF SUCH DAMAGE.
51f5b1c8a1SJohn Marino  * ====================================================================
52f5b1c8a1SJohn Marino  *
53f5b1c8a1SJohn Marino  * This product includes cryptographic software written by Eric Young
54f5b1c8a1SJohn Marino  * (eay@cryptsoft.com).  This product includes software written by Tim
55f5b1c8a1SJohn Marino  * Hudson (tjh@cryptsoft.com).
56f5b1c8a1SJohn Marino  *
57f5b1c8a1SJohn Marino  */
58f5b1c8a1SJohn Marino 
59f5b1c8a1SJohn Marino #include <stdio.h>
60f5b1c8a1SJohn Marino 
61f5b1c8a1SJohn Marino #include <openssl/err.h>
62f5b1c8a1SJohn Marino #include <openssl/objects.h>
63f5b1c8a1SJohn Marino #include <openssl/ts.h>
64f5b1c8a1SJohn Marino #include <openssl/x509v3.h>
65f5b1c8a1SJohn Marino 
66*de0e0e4dSAntonio Huete Jimenez #include "ts_local.h"
67*de0e0e4dSAntonio Huete Jimenez 
68f5b1c8a1SJohn Marino int
TS_REQ_set_version(TS_REQ * a,long version)69f5b1c8a1SJohn Marino TS_REQ_set_version(TS_REQ *a, long version)
70f5b1c8a1SJohn Marino {
71f5b1c8a1SJohn Marino 	return ASN1_INTEGER_set(a->version, version);
72f5b1c8a1SJohn Marino }
73f5b1c8a1SJohn Marino 
74f5b1c8a1SJohn Marino long
TS_REQ_get_version(const TS_REQ * a)75f5b1c8a1SJohn Marino TS_REQ_get_version(const TS_REQ *a)
76f5b1c8a1SJohn Marino {
77f5b1c8a1SJohn Marino 	return ASN1_INTEGER_get(a->version);
78f5b1c8a1SJohn Marino }
79f5b1c8a1SJohn Marino 
80f5b1c8a1SJohn Marino int
TS_REQ_set_msg_imprint(TS_REQ * a,TS_MSG_IMPRINT * msg_imprint)81f5b1c8a1SJohn Marino TS_REQ_set_msg_imprint(TS_REQ *a, TS_MSG_IMPRINT *msg_imprint)
82f5b1c8a1SJohn Marino {
83f5b1c8a1SJohn Marino 	TS_MSG_IMPRINT *new_msg_imprint;
84f5b1c8a1SJohn Marino 
85f5b1c8a1SJohn Marino 	if (a->msg_imprint == msg_imprint)
86f5b1c8a1SJohn Marino 		return 1;
87f5b1c8a1SJohn Marino 	new_msg_imprint = TS_MSG_IMPRINT_dup(msg_imprint);
88f5b1c8a1SJohn Marino 	if (new_msg_imprint == NULL) {
8972c33676SMaxim Ag 		TSerror(ERR_R_MALLOC_FAILURE);
90f5b1c8a1SJohn Marino 		return 0;
91f5b1c8a1SJohn Marino 	}
92f5b1c8a1SJohn Marino 	TS_MSG_IMPRINT_free(a->msg_imprint);
93f5b1c8a1SJohn Marino 	a->msg_imprint = new_msg_imprint;
94f5b1c8a1SJohn Marino 	return 1;
95f5b1c8a1SJohn Marino }
96f5b1c8a1SJohn Marino 
97f5b1c8a1SJohn Marino TS_MSG_IMPRINT *
TS_REQ_get_msg_imprint(TS_REQ * a)98f5b1c8a1SJohn Marino TS_REQ_get_msg_imprint(TS_REQ *a)
99f5b1c8a1SJohn Marino {
100f5b1c8a1SJohn Marino 	return a->msg_imprint;
101f5b1c8a1SJohn Marino }
102f5b1c8a1SJohn Marino 
103f5b1c8a1SJohn Marino int
TS_MSG_IMPRINT_set_algo(TS_MSG_IMPRINT * a,X509_ALGOR * alg)104f5b1c8a1SJohn Marino TS_MSG_IMPRINT_set_algo(TS_MSG_IMPRINT *a, X509_ALGOR *alg)
105f5b1c8a1SJohn Marino {
106f5b1c8a1SJohn Marino 	X509_ALGOR *new_alg;
107f5b1c8a1SJohn Marino 
108f5b1c8a1SJohn Marino 	if (a->hash_algo == alg)
109f5b1c8a1SJohn Marino 		return 1;
110f5b1c8a1SJohn Marino 	new_alg = X509_ALGOR_dup(alg);
111f5b1c8a1SJohn Marino 	if (new_alg == NULL) {
11272c33676SMaxim Ag 		TSerror(ERR_R_MALLOC_FAILURE);
113f5b1c8a1SJohn Marino 		return 0;
114f5b1c8a1SJohn Marino 	}
115f5b1c8a1SJohn Marino 	X509_ALGOR_free(a->hash_algo);
116f5b1c8a1SJohn Marino 	a->hash_algo = new_alg;
117f5b1c8a1SJohn Marino 	return 1;
118f5b1c8a1SJohn Marino }
119f5b1c8a1SJohn Marino 
120f5b1c8a1SJohn Marino X509_ALGOR *
TS_MSG_IMPRINT_get_algo(TS_MSG_IMPRINT * a)121f5b1c8a1SJohn Marino TS_MSG_IMPRINT_get_algo(TS_MSG_IMPRINT *a)
122f5b1c8a1SJohn Marino {
123f5b1c8a1SJohn Marino 	return a->hash_algo;
124f5b1c8a1SJohn Marino }
125f5b1c8a1SJohn Marino 
126f5b1c8a1SJohn Marino int
TS_MSG_IMPRINT_set_msg(TS_MSG_IMPRINT * a,unsigned char * d,int len)127f5b1c8a1SJohn Marino TS_MSG_IMPRINT_set_msg(TS_MSG_IMPRINT *a, unsigned char *d, int len)
128f5b1c8a1SJohn Marino {
129f5b1c8a1SJohn Marino 	return ASN1_OCTET_STRING_set(a->hashed_msg, d, len);
130f5b1c8a1SJohn Marino }
131f5b1c8a1SJohn Marino 
132f5b1c8a1SJohn Marino ASN1_OCTET_STRING *
TS_MSG_IMPRINT_get_msg(TS_MSG_IMPRINT * a)133f5b1c8a1SJohn Marino TS_MSG_IMPRINT_get_msg(TS_MSG_IMPRINT *a)
134f5b1c8a1SJohn Marino {
135f5b1c8a1SJohn Marino 	return a->hashed_msg;
136f5b1c8a1SJohn Marino }
137f5b1c8a1SJohn Marino 
138f5b1c8a1SJohn Marino int
TS_REQ_set_policy_id(TS_REQ * a,const ASN1_OBJECT * policy)13972c33676SMaxim Ag TS_REQ_set_policy_id(TS_REQ *a, const ASN1_OBJECT *policy)
140f5b1c8a1SJohn Marino {
141f5b1c8a1SJohn Marino 	ASN1_OBJECT *new_policy;
142f5b1c8a1SJohn Marino 
143f5b1c8a1SJohn Marino 	if (a->policy_id == policy)
144f5b1c8a1SJohn Marino 		return 1;
145f5b1c8a1SJohn Marino 	new_policy = OBJ_dup(policy);
146f5b1c8a1SJohn Marino 	if (new_policy == NULL) {
14772c33676SMaxim Ag 		TSerror(ERR_R_MALLOC_FAILURE);
148f5b1c8a1SJohn Marino 		return 0;
149f5b1c8a1SJohn Marino 	}
150f5b1c8a1SJohn Marino 	ASN1_OBJECT_free(a->policy_id);
151f5b1c8a1SJohn Marino 	a->policy_id = new_policy;
152f5b1c8a1SJohn Marino 	return 1;
153f5b1c8a1SJohn Marino }
154f5b1c8a1SJohn Marino 
155f5b1c8a1SJohn Marino ASN1_OBJECT *
TS_REQ_get_policy_id(TS_REQ * a)156f5b1c8a1SJohn Marino TS_REQ_get_policy_id(TS_REQ *a)
157f5b1c8a1SJohn Marino {
158f5b1c8a1SJohn Marino 	return a->policy_id;
159f5b1c8a1SJohn Marino }
160f5b1c8a1SJohn Marino 
161f5b1c8a1SJohn Marino int
TS_REQ_set_nonce(TS_REQ * a,const ASN1_INTEGER * nonce)162f5b1c8a1SJohn Marino TS_REQ_set_nonce(TS_REQ *a, const ASN1_INTEGER *nonce)
163f5b1c8a1SJohn Marino {
164f5b1c8a1SJohn Marino 	ASN1_INTEGER *new_nonce;
165f5b1c8a1SJohn Marino 
166f5b1c8a1SJohn Marino 	if (a->nonce == nonce)
167f5b1c8a1SJohn Marino 		return 1;
168f5b1c8a1SJohn Marino 	new_nonce = ASN1_INTEGER_dup(nonce);
169f5b1c8a1SJohn Marino 	if (new_nonce == NULL) {
17072c33676SMaxim Ag 		TSerror(ERR_R_MALLOC_FAILURE);
171f5b1c8a1SJohn Marino 		return 0;
172f5b1c8a1SJohn Marino 	}
173f5b1c8a1SJohn Marino 	ASN1_INTEGER_free(a->nonce);
174f5b1c8a1SJohn Marino 	a->nonce = new_nonce;
175f5b1c8a1SJohn Marino 	return 1;
176f5b1c8a1SJohn Marino }
177f5b1c8a1SJohn Marino 
178f5b1c8a1SJohn Marino const ASN1_INTEGER *
TS_REQ_get_nonce(const TS_REQ * a)179f5b1c8a1SJohn Marino TS_REQ_get_nonce(const TS_REQ *a)
180f5b1c8a1SJohn Marino {
181f5b1c8a1SJohn Marino 	return a->nonce;
182f5b1c8a1SJohn Marino }
183f5b1c8a1SJohn Marino 
184f5b1c8a1SJohn Marino int
TS_REQ_set_cert_req(TS_REQ * a,int cert_req)185f5b1c8a1SJohn Marino TS_REQ_set_cert_req(TS_REQ *a, int cert_req)
186f5b1c8a1SJohn Marino {
187f5b1c8a1SJohn Marino 	a->cert_req = cert_req ? 0xFF : 0x00;
188f5b1c8a1SJohn Marino 	return 1;
189f5b1c8a1SJohn Marino }
190f5b1c8a1SJohn Marino 
191f5b1c8a1SJohn Marino int
TS_REQ_get_cert_req(const TS_REQ * a)192f5b1c8a1SJohn Marino TS_REQ_get_cert_req(const TS_REQ *a)
193f5b1c8a1SJohn Marino {
194f5b1c8a1SJohn Marino 	return a->cert_req ? 1 : 0;
195f5b1c8a1SJohn Marino }
196f5b1c8a1SJohn Marino 
STACK_OF(X509_EXTENSION)197f5b1c8a1SJohn Marino STACK_OF(X509_EXTENSION) *TS_REQ_get_exts(TS_REQ *a)
198f5b1c8a1SJohn Marino {
199f5b1c8a1SJohn Marino 	return a->extensions;
200f5b1c8a1SJohn Marino }
201f5b1c8a1SJohn Marino 
202f5b1c8a1SJohn Marino void
TS_REQ_ext_free(TS_REQ * a)203f5b1c8a1SJohn Marino TS_REQ_ext_free(TS_REQ *a)
204f5b1c8a1SJohn Marino {
205f5b1c8a1SJohn Marino 	if (!a)
206f5b1c8a1SJohn Marino 		return;
207f5b1c8a1SJohn Marino 	sk_X509_EXTENSION_pop_free(a->extensions, X509_EXTENSION_free);
208f5b1c8a1SJohn Marino 	a->extensions = NULL;
209f5b1c8a1SJohn Marino }
210f5b1c8a1SJohn Marino 
211f5b1c8a1SJohn Marino int
TS_REQ_get_ext_count(TS_REQ * a)212f5b1c8a1SJohn Marino TS_REQ_get_ext_count(TS_REQ *a)
213f5b1c8a1SJohn Marino {
214f5b1c8a1SJohn Marino 	return X509v3_get_ext_count(a->extensions);
215f5b1c8a1SJohn Marino }
216f5b1c8a1SJohn Marino 
217f5b1c8a1SJohn Marino int
TS_REQ_get_ext_by_NID(TS_REQ * a,int nid,int lastpos)218f5b1c8a1SJohn Marino TS_REQ_get_ext_by_NID(TS_REQ *a, int nid, int lastpos)
219f5b1c8a1SJohn Marino {
220f5b1c8a1SJohn Marino 	return X509v3_get_ext_by_NID(a->extensions, nid, lastpos);
221f5b1c8a1SJohn Marino }
222f5b1c8a1SJohn Marino 
223f5b1c8a1SJohn Marino int
TS_REQ_get_ext_by_OBJ(TS_REQ * a,const ASN1_OBJECT * obj,int lastpos)22472c33676SMaxim Ag TS_REQ_get_ext_by_OBJ(TS_REQ *a, const ASN1_OBJECT *obj, int lastpos)
225f5b1c8a1SJohn Marino {
226f5b1c8a1SJohn Marino 	return X509v3_get_ext_by_OBJ(a->extensions, obj, lastpos);
227f5b1c8a1SJohn Marino }
228f5b1c8a1SJohn Marino 
229f5b1c8a1SJohn Marino int
TS_REQ_get_ext_by_critical(TS_REQ * a,int crit,int lastpos)230f5b1c8a1SJohn Marino TS_REQ_get_ext_by_critical(TS_REQ *a, int crit, int lastpos)
231f5b1c8a1SJohn Marino {
232f5b1c8a1SJohn Marino 	return X509v3_get_ext_by_critical(a->extensions, crit, lastpos);
233f5b1c8a1SJohn Marino }
234f5b1c8a1SJohn Marino 
235f5b1c8a1SJohn Marino X509_EXTENSION *
TS_REQ_get_ext(TS_REQ * a,int loc)236f5b1c8a1SJohn Marino TS_REQ_get_ext(TS_REQ *a, int loc)
237f5b1c8a1SJohn Marino {
238f5b1c8a1SJohn Marino 	return X509v3_get_ext(a->extensions, loc);
239f5b1c8a1SJohn Marino }
240f5b1c8a1SJohn Marino 
241f5b1c8a1SJohn Marino X509_EXTENSION *
TS_REQ_delete_ext(TS_REQ * a,int loc)242f5b1c8a1SJohn Marino TS_REQ_delete_ext(TS_REQ *a, int loc)
243f5b1c8a1SJohn Marino {
244f5b1c8a1SJohn Marino 	return X509v3_delete_ext(a->extensions, loc);
245f5b1c8a1SJohn Marino }
246f5b1c8a1SJohn Marino 
247f5b1c8a1SJohn Marino int
TS_REQ_add_ext(TS_REQ * a,X509_EXTENSION * ex,int loc)248f5b1c8a1SJohn Marino TS_REQ_add_ext(TS_REQ *a, X509_EXTENSION *ex, int loc)
249f5b1c8a1SJohn Marino {
250f5b1c8a1SJohn Marino 	return X509v3_add_ext(&a->extensions, ex, loc) != NULL;
251f5b1c8a1SJohn Marino }
252f5b1c8a1SJohn Marino 
253f5b1c8a1SJohn Marino void *
TS_REQ_get_ext_d2i(TS_REQ * a,int nid,int * crit,int * idx)254f5b1c8a1SJohn Marino TS_REQ_get_ext_d2i(TS_REQ *a, int nid, int *crit, int *idx)
255f5b1c8a1SJohn Marino {
256f5b1c8a1SJohn Marino 	return X509V3_get_d2i(a->extensions, nid, crit, idx);
257f5b1c8a1SJohn Marino }
258