Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mono / btls / btls-key.c
1 //
2 //  btls-key.c
3 //  MonoBtls
4 //
5 //  Created by Martin Baulig on 3/7/16.
6 //  Copyright © 2016 Xamarin. All rights reserved.
7 //
8
9 #include <btls-key.h>
10
11 MONO_API EVP_PKEY *
12 mono_btls_key_new ()
13 {
14         return EVP_PKEY_new ();
15 }
16
17 MONO_API void
18 mono_btls_key_free (EVP_PKEY *pkey)
19 {
20         EVP_PKEY_free (pkey);
21 }
22
23 MONO_API EVP_PKEY *
24 mono_btls_key_up_ref (EVP_PKEY *pkey)
25 {
26         return EVP_PKEY_up_ref (pkey);
27 }
28
29 MONO_API int
30 mono_btls_key_get_bits (EVP_PKEY *pkey)
31 {
32         return EVP_PKEY_bits (pkey);
33 }
34
35 MONO_API int
36 mono_btls_key_is_rsa (EVP_PKEY *pkey)
37 {
38         return pkey->type == EVP_PKEY_RSA;
39 }
40
41 MONO_API int
42 mono_btls_key_assign_rsa_private_key (EVP_PKEY *pkey, uint8_t *der_data, int der_length)
43 {
44         RSA *rsa;
45
46         rsa = RSA_private_key_from_bytes (der_data, der_length);
47         if (!rsa)
48                 return 0;
49
50         return EVP_PKEY_assign_RSA (pkey, rsa);
51 }
52
53 MONO_API int
54 mono_btls_key_get_bytes (EVP_PKEY *pkey, uint8_t **buffer, int *size, int include_private_bits)
55 {
56         size_t len;
57         RSA *rsa;
58         int ret;
59
60         *size = 0;
61         *buffer = NULL;
62
63         if (pkey->type != EVP_PKEY_RSA)
64                 return 0;
65
66         rsa = EVP_PKEY_get1_RSA (pkey);
67         if (!rsa)
68                 return 0;
69
70         if (include_private_bits)
71                 ret = RSA_private_key_to_bytes (buffer, &len, rsa);
72         else
73                 ret = RSA_public_key_to_bytes (buffer, &len, rsa);
74
75         RSA_free (rsa);
76
77         if (ret != 1)
78                 return 0;
79
80         *size = (int)len;
81         return 1;
82 }