5 // Created by Martin Baulig on 3/8/16.
6 // Copyright © 2016 Xamarin. All rights reserved.
9 #include <btls-pkcs12.h>
10 #include <openssl/pkcs12.h>
12 struct MonoBtlsPkcs12 {
13 STACK_OF(X509) *certs;
14 EVP_PKEY *private_key;
15 CRYPTO_refcount_t references;
18 MONO_API MonoBtlsPkcs12 *
19 mono_btls_pkcs12_new (void)
21 MonoBtlsPkcs12 *pkcs12 = (MonoBtlsPkcs12 *)OPENSSL_malloc (sizeof (MonoBtlsPkcs12));
25 memset (pkcs12, 0, sizeof(MonoBtlsPkcs12));
26 pkcs12->certs = sk_X509_new_null ();
27 pkcs12->references = 1;
32 mono_btls_pkcs12_get_count (MonoBtlsPkcs12 *pkcs12)
34 return (int)sk_X509_num (pkcs12->certs);
38 mono_btls_pkcs12_get_cert (MonoBtlsPkcs12 *pkcs12, int index)
42 if ((size_t)index >= sk_X509_num (pkcs12->certs))
44 cert = sk_X509_value (pkcs12->certs, index);
50 MONO_API STACK_OF(X509) *
51 mono_btls_pkcs12_get_certs (MonoBtlsPkcs12 *pkcs12)
57 mono_btls_pkcs12_free (MonoBtlsPkcs12 *pkcs12)
59 if (!CRYPTO_refcount_dec_and_test_zero (&pkcs12->references))
62 sk_X509_pop_free (pkcs12->certs, X509_free);
63 OPENSSL_free (pkcs12);
67 MONO_API MonoBtlsPkcs12 *
68 mono_btls_pkcs12_up_ref (MonoBtlsPkcs12 *pkcs12)
70 CRYPTO_refcount_inc (&pkcs12->references);
75 mono_btls_pkcs12_add_cert (MonoBtlsPkcs12 *pkcs12, X509 *x509)
78 sk_X509_push (pkcs12->certs, x509);
82 mono_btls_pkcs12_import (MonoBtlsPkcs12 *pkcs12, const void *data, int len, const void *password)
85 CBS_init (&cbs, data, len);
86 return PKCS12_get_key_and_certs (&pkcs12->private_key, pkcs12->certs, &cbs, password);
90 mono_btls_pkcs12_has_private_key (MonoBtlsPkcs12 *pkcs12)
92 return pkcs12->private_key != NULL;
96 mono_btls_pkcs12_get_private_key (MonoBtlsPkcs12 *pkcs12)
98 if (!pkcs12->private_key)
100 return EVP_PKEY_up_ref (pkcs12->private_key);