Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/crypto/heimdal/lib/hx509/peer.c
34879 views
1
/*
2
* Copyright (c) 2006 - 2007 Kungliga Tekniska Högskolan
3
* (Royal Institute of Technology, Stockholm, Sweden).
4
* All rights reserved.
5
*
6
* Portions Copyright (c) 2009 Apple Inc. 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 the
17
* documentation and/or other materials provided with the distribution.
18
*
19
* 3. Neither the name of the Institute nor the names of its contributors
20
* may be used to endorse or promote products derived from this software
21
* without specific prior written permission.
22
*
23
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
24
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
27
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33
* SUCH DAMAGE.
34
*/
35
36
#include "hx_locl.h"
37
38
/**
39
* @page page_peer Hx509 crypto selecting functions
40
*
41
* Peer info structures are used togeter with hx509_crypto_select() to
42
* select the best avaible crypto algorithm to use.
43
*
44
* See the library functions here: @ref hx509_peer
45
*/
46
47
/**
48
* Allocate a new peer info structure an init it to default values.
49
*
50
* @param context A hx509 context.
51
* @param peer return an allocated peer, free with hx509_peer_info_free().
52
*
53
* @return An hx509 error code, see hx509_get_error_string().
54
*
55
* @ingroup hx509_peer
56
*/
57
58
int
59
hx509_peer_info_alloc(hx509_context context, hx509_peer_info *peer)
60
{
61
*peer = calloc(1, sizeof(**peer));
62
if (*peer == NULL) {
63
hx509_set_error_string(context, 0, ENOMEM, "out of memory");
64
return ENOMEM;
65
}
66
return 0;
67
}
68
69
70
static void
71
free_cms_alg(hx509_peer_info peer)
72
{
73
if (peer->val) {
74
size_t i;
75
for (i = 0; i < peer->len; i++)
76
free_AlgorithmIdentifier(&peer->val[i]);
77
free(peer->val);
78
peer->val = NULL;
79
peer->len = 0;
80
}
81
}
82
83
/**
84
* Free a peer info structure.
85
*
86
* @param peer peer info to be freed.
87
*
88
* @ingroup hx509_peer
89
*/
90
91
void
92
hx509_peer_info_free(hx509_peer_info peer)
93
{
94
if (peer == NULL)
95
return;
96
if (peer->cert)
97
hx509_cert_free(peer->cert);
98
free_cms_alg(peer);
99
memset(peer, 0, sizeof(*peer));
100
free(peer);
101
}
102
103
/**
104
* Set the certificate that remote peer is using.
105
*
106
* @param peer peer info to update
107
* @param cert cerificate of the remote peer.
108
*
109
* @return An hx509 error code, see hx509_get_error_string().
110
*
111
* @ingroup hx509_peer
112
*/
113
114
int
115
hx509_peer_info_set_cert(hx509_peer_info peer,
116
hx509_cert cert)
117
{
118
if (peer->cert)
119
hx509_cert_free(peer->cert);
120
peer->cert = hx509_cert_ref(cert);
121
return 0;
122
}
123
124
/**
125
* Add an additional algorithm that the peer supports.
126
*
127
* @param context A hx509 context.
128
* @param peer the peer to set the new algorithms for
129
* @param val an AlgorithmsIdentier to add
130
*
131
* @return An hx509 error code, see hx509_get_error_string().
132
*
133
* @ingroup hx509_peer
134
*/
135
136
int
137
hx509_peer_info_add_cms_alg(hx509_context context,
138
hx509_peer_info peer,
139
const AlgorithmIdentifier *val)
140
{
141
void *ptr;
142
int ret;
143
144
ptr = realloc(peer->val, sizeof(peer->val[0]) * (peer->len + 1));
145
if (ptr == NULL) {
146
hx509_set_error_string(context, 0, ENOMEM, "out of memory");
147
return ENOMEM;
148
}
149
peer->val = ptr;
150
ret = copy_AlgorithmIdentifier(val, &peer->val[peer->len]);
151
if (ret == 0)
152
peer->len += 1;
153
else
154
hx509_set_error_string(context, 0, ret, "out of memory");
155
return ret;
156
}
157
158
/**
159
* Set the algorithms that the peer supports.
160
*
161
* @param context A hx509 context.
162
* @param peer the peer to set the new algorithms for
163
* @param val array of supported AlgorithmsIdentiers
164
* @param len length of array val.
165
*
166
* @return An hx509 error code, see hx509_get_error_string().
167
*
168
* @ingroup hx509_peer
169
*/
170
171
int
172
hx509_peer_info_set_cms_algs(hx509_context context,
173
hx509_peer_info peer,
174
const AlgorithmIdentifier *val,
175
size_t len)
176
{
177
size_t i;
178
179
free_cms_alg(peer);
180
181
peer->val = calloc(len, sizeof(*peer->val));
182
if (peer->val == NULL) {
183
peer->len = 0;
184
hx509_set_error_string(context, 0, ENOMEM, "out of memory");
185
return ENOMEM;
186
}
187
peer->len = len;
188
for (i = 0; i < len; i++) {
189
int ret;
190
ret = copy_AlgorithmIdentifier(&val[i], &peer->val[i]);
191
if (ret) {
192
hx509_clear_error_string(context);
193
free_cms_alg(peer);
194
return ret;
195
}
196
}
197
return 0;
198
}
199
200
#if 0
201
202
/*
203
* S/MIME
204
*/
205
206
int
207
hx509_peer_info_parse_smime(hx509_peer_info peer,
208
const heim_octet_string *data)
209
{
210
return 0;
211
}
212
213
int
214
hx509_peer_info_unparse_smime(hx509_peer_info peer,
215
heim_octet_string *data)
216
{
217
return 0;
218
}
219
220
/*
221
* For storing hx509_peer_info to be able to cache them.
222
*/
223
224
int
225
hx509_peer_info_parse(hx509_peer_info peer,
226
const heim_octet_string *data)
227
{
228
return 0;
229
}
230
231
int
232
hx509_peer_info_unparse(hx509_peer_info peer,
233
heim_octet_string *data)
234
{
235
return 0;
236
}
237
#endif
238
239