[2019-12] [threads] Add back mono_threads_attach_tools_thread as a public API (#18074)
[mono-project.git] / mono / btls / btls-x509-verify-param.c
blobef9905f71c5960535a626675fd4b59c5efffc239
1 //
2 // btls-x509-verify-param.c
3 // MonoBtls
4 //
5 // Created by Martin Baulig on 3/5/16.
6 // Copyright © 2016 Xamarin. All rights reserved.
7 //
9 #include "btls-x509-verify-param.h"
10 #include "btls-x509-store-ctx.h"
12 struct MonoBtlsX509VerifyParam {
13 int owns;
14 MonoBtlsX509StoreCtx *owner;
15 X509_VERIFY_PARAM *param;
18 MonoBtlsX509VerifyParam *
19 mono_btls_x509_verify_param_new (void)
21 MonoBtlsX509VerifyParam *param;
23 param = OPENSSL_malloc (sizeof(MonoBtlsX509VerifyParam));
24 if (!param)
25 return NULL;
26 memset (param, 0, sizeof (MonoBtlsX509VerifyParam));
27 param->param = X509_VERIFY_PARAM_new();
28 param->owns = 1;
29 return param;
32 MonoBtlsX509VerifyParam *
33 mono_btls_x509_verify_param_from_store_ctx (MonoBtlsX509StoreCtx *ctx, X509_VERIFY_PARAM *param)
35 MonoBtlsX509VerifyParam *instance;
37 instance = OPENSSL_malloc (sizeof(MonoBtlsX509VerifyParam));
38 if (!instance)
39 return NULL;
40 memset (instance, 0, sizeof (MonoBtlsX509VerifyParam));
41 instance->param = param;
42 instance->owner = mono_btls_x509_store_ctx_up_ref (ctx);
43 return instance;
46 MonoBtlsX509VerifyParam *
47 mono_btls_x509_verify_param_copy (const MonoBtlsX509VerifyParam *from)
49 MonoBtlsX509VerifyParam *param;
51 param = mono_btls_x509_verify_param_new ();
52 if (!param)
53 return NULL;
55 X509_VERIFY_PARAM_set1 (param->param, from->param);
56 return param;
59 const X509_VERIFY_PARAM *
60 mono_btls_x509_verify_param_peek_param (const MonoBtlsX509VerifyParam *param)
62 return param->param;
65 int
66 mono_btls_x509_verify_param_can_modify (MonoBtlsX509VerifyParam *param)
68 return param->owns;
71 MonoBtlsX509VerifyParam *
72 mono_btls_x509_verify_param_lookup (const char *name)
74 MonoBtlsX509VerifyParam *param;
75 const X509_VERIFY_PARAM *p;
77 p = X509_VERIFY_PARAM_lookup(name);
78 if (!p)
79 return NULL;
81 param = OPENSSL_malloc (sizeof(MonoBtlsX509VerifyParam));
82 if (!param)
83 return NULL;
84 memset (param, 0, sizeof (MonoBtlsX509VerifyParam));
85 param->param = (X509_VERIFY_PARAM *)p;
86 return param;
89 void
90 mono_btls_x509_verify_param_free (MonoBtlsX509VerifyParam *param)
92 if (param->owns) {
93 if (param->param) {
94 X509_VERIFY_PARAM_free (param->param);
95 param->param = NULL;
98 if (param->owner) {
99 mono_btls_x509_store_ctx_free (param->owner);
100 param->owner = NULL;
102 OPENSSL_free (param);
106 mono_btls_x509_verify_param_set_name (MonoBtlsX509VerifyParam *param, const char *name)
108 if (!param->owns)
109 return -1;
110 return X509_VERIFY_PARAM_set1_name (param->param, name);
114 mono_btls_x509_verify_param_set_host (MonoBtlsX509VerifyParam *param, const char *host, int namelen)
116 if (!param->owns)
117 return -1;
118 return X509_VERIFY_PARAM_set1_host (param->param, host, namelen);
122 mono_btls_x509_verify_param_add_host (MonoBtlsX509VerifyParam *param, const char *host, int namelen)
124 if (!param->owns)
125 return -1;
126 return X509_VERIFY_PARAM_set1_host (param->param, host, namelen);
129 uint64_t
130 mono_btls_x509_verify_param_get_flags (MonoBtlsX509VerifyParam *param)
132 return X509_VERIFY_PARAM_get_flags (param->param);
136 mono_btls_x509_verify_param_set_flags (MonoBtlsX509VerifyParam *param, uint64_t flags)
138 if (!param->owns)
139 return -1;
140 return X509_VERIFY_PARAM_set_flags (param->param, (unsigned long)flags);
143 MonoBtlsX509VerifyFlags
144 mono_btls_x509_verify_param_get_mono_flags (MonoBtlsX509VerifyParam *param)
146 MonoBtlsX509VerifyFlags current;
147 uint64_t flags;
149 current = 0;
150 flags = X509_VERIFY_PARAM_get_flags (param->param);
152 if (flags & X509_V_FLAG_CRL_CHECK)
153 current |= MONO_BTLS_X509_VERIFY_FLAGS_CRL_CHECK;
154 if (flags & X509_V_FLAG_CRL_CHECK_ALL)
155 current |= MONO_BTLS_X509_VERIFY_FLAGS_CRL_CHECK_ALL;
156 if (flags & X509_V_FLAG_X509_STRICT)
157 current |= MONO_BTLS_X509_VERIFY_FLAGS_X509_STRICT;
159 return current;
163 mono_btls_x509_verify_param_set_mono_flags (MonoBtlsX509VerifyParam *param, MonoBtlsX509VerifyFlags flags)
165 unsigned long current;
167 if (!param->owns)
168 return -1;
170 current = X509_VERIFY_PARAM_get_flags (param->param);
171 if (flags & MONO_BTLS_X509_VERIFY_FLAGS_CRL_CHECK)
172 current |= X509_V_FLAG_CRL_CHECK;
173 if (flags & MONO_BTLS_X509_VERIFY_FLAGS_CRL_CHECK_ALL)
174 current |= X509_V_FLAG_CRL_CHECK_ALL;
175 if (flags & MONO_BTLS_X509_VERIFY_FLAGS_X509_STRICT)
176 current |= X509_V_FLAG_X509_STRICT;
178 return X509_VERIFY_PARAM_set_flags (param->param, current);
182 mono_btls_x509_verify_param_set_purpose (MonoBtlsX509VerifyParam *param, MonoBtlsX509Purpose purpose)
184 if (!param->owns)
185 return -1;
186 return X509_VERIFY_PARAM_set_purpose (param->param, purpose);
190 mono_btls_x509_verify_param_get_depth (MonoBtlsX509VerifyParam *param)
192 return X509_VERIFY_PARAM_get_depth (param->param);
196 mono_btls_x509_verify_param_set_depth (MonoBtlsX509VerifyParam *param, int depth)
198 if (!param->owns)
199 return -1;
200 X509_VERIFY_PARAM_set_depth (param->param, depth);
201 return 1;
205 mono_btls_x509_verify_param_set_time (MonoBtlsX509VerifyParam *param, int64_t time)
207 if (!param->owns)
208 return -1;
209 X509_VERIFY_PARAM_set_time (param->param, time);
210 return 1;
213 char *
214 mono_btls_x509_verify_param_get_peername (MonoBtlsX509VerifyParam *param)
216 char *peer = X509_VERIFY_PARAM_get0_peername (param->param);
217 return peer;