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