Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mono / btls / btls-x509-chain.c
1 //
2 //  btls-x509-chain.c
3 //  MonoBtls
4 //
5 //  Created by Martin Baulig on 3/3/16.
6 //  Copyright © 2016 Xamarin. All rights reserved.
7 //
8
9 #include <btls-x509-chain.h>
10
11 struct MonoBtlsX509Chain {
12         STACK_OF(X509) *certs;
13         CRYPTO_refcount_t references;
14 };
15
16 MONO_API MonoBtlsX509Chain *
17 mono_btls_x509_chain_new (void)
18 {
19         MonoBtlsX509Chain *chain = (MonoBtlsX509Chain *)OPENSSL_malloc (sizeof (MonoBtlsX509Chain));
20         if (chain == NULL)
21                 return NULL;
22
23         memset(chain, 0, sizeof(MonoBtlsX509Chain));
24         chain->certs = sk_X509_new_null ();
25         chain->references = 1;
26         return chain;
27 }
28
29 MONO_API MonoBtlsX509Chain *
30 mono_btls_x509_chain_from_certs (STACK_OF(X509) *certs)
31 {
32         MonoBtlsX509Chain *chain = (MonoBtlsX509Chain *)OPENSSL_malloc (sizeof (MonoBtlsX509Chain));
33         if (chain == NULL)
34                 return NULL;
35
36         memset(chain, 0, sizeof(MonoBtlsX509Chain));
37         chain->certs = X509_chain_up_ref(certs);
38         chain->references = 1;
39         return chain;
40 }
41
42 MONO_API STACK_OF(X509) *
43 mono_btls_x509_chain_peek_certs (MonoBtlsX509Chain *chain)
44 {
45         return chain->certs;
46 }
47
48 MONO_API int
49 mono_btls_x509_chain_get_count (MonoBtlsX509Chain *chain)
50 {
51         return (int)sk_X509_num(chain->certs);
52 }
53
54 MONO_API X509 *
55 mono_btls_x509_chain_get_cert (MonoBtlsX509Chain *chain, int index)
56 {
57         X509 *cert;
58
59         if ((size_t)index >= sk_X509_num(chain->certs))
60                 return NULL;
61         cert = sk_X509_value(chain->certs, index);
62         if (cert)
63                 X509_up_ref(cert);
64         return cert;
65 }
66
67 MONO_API STACK_OF(X509) *
68 mono_btls_x509_chain_get_certs (MonoBtlsX509Chain *chain)
69 {
70         return chain->certs;
71 }
72
73 MONO_API int
74 mono_btls_x509_chain_free (MonoBtlsX509Chain *chain)
75 {
76         if (!CRYPTO_refcount_dec_and_test_zero(&chain->references))
77                 return 0;
78
79         sk_X509_pop_free(chain->certs, X509_free);
80         OPENSSL_free (chain);
81         return 1;
82 }
83
84 MONO_API MonoBtlsX509Chain *
85 mono_btls_x509_chain_up_ref (MonoBtlsX509Chain *chain)
86 {
87         CRYPTO_refcount_inc(&chain->references);
88         return chain;
89 }
90
91 MONO_API void
92 mono_btls_x509_chain_add_cert (MonoBtlsX509Chain *chain, X509 *x509)
93 {
94         X509_up_ref(x509);
95         sk_X509_push(chain->certs, x509);
96 }