[BTLS]: Add the native BTLS sources.
[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 void
12 mono_btls_key_free (EVP_PKEY *pkey)
13 {
14         EVP_PKEY_free (pkey);
15 }
16
17 EVP_PKEY *
18 mono_btls_key_up_ref (EVP_PKEY *pkey)
19 {
20         return EVP_PKEY_up_ref (pkey);
21 }
22
23 int
24 mono_btls_key_get_bits (EVP_PKEY *pkey)
25 {
26         return EVP_PKEY_bits (pkey);
27 }
28
29 int
30 mono_btls_key_is_rsa (EVP_PKEY *pkey)
31 {
32         return pkey->type == EVP_PKEY_RSA;
33 }
34
35 int
36 mono_btls_key_get_bytes (EVP_PKEY *pkey, uint8_t **buffer, int *size, int include_private_bits)
37 {
38         size_t len;
39         RSA *rsa;
40         int ret;
41
42         *size = 0;
43         *buffer = NULL;
44
45         if (pkey->type != EVP_PKEY_RSA)
46                 return 0;
47
48         rsa = EVP_PKEY_get1_RSA (pkey);
49         if (!rsa)
50                 return 0;
51
52         if (include_private_bits)
53                 ret = RSA_private_key_to_bytes (buffer, &len, rsa);
54         else
55                 ret = RSA_public_key_to_bytes (buffer, &len, rsa);
56
57         if (ret != 1)
58                 return 0;
59
60         *size = (int)len;
61         return 1;
62 }
63
64 int
65 mono_btls_key_test (EVP_PKEY *pkey)
66 {
67         RSA *rsa;
68         unsigned char *p = NULL;
69         int ret;
70
71         if (pkey->type != EVP_PKEY_RSA)
72                 return 0;
73
74         rsa = EVP_PKEY_get1_RSA (pkey);
75         if (!rsa)
76                 return 0;
77
78         ret = i2d_RSA_PUBKEY (rsa, &p);
79
80         RSA_free (rsa);
81         return ret;
82
83 }