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
);