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