Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mono / btls / btls-util.c
1 //
2 //  btls-util.c
3 //  MonoBtls
4 //
5 //  Created by Martin Baulig on 3/23/16.
6 //  Copyright © 2016 Xamarin. All rights reserved.
7 //
8
9 #include <btls-util.h>
10 #include <assert.h>
11 // #include <time.h>
12
13 extern int asn1_generalizedtime_to_tm (struct tm *tm, const ASN1_GENERALIZEDTIME *d);
14
15 extern int64_t btls_timegm64 (const struct tm *date);
16
17
18 MONO_API void
19 mono_btls_free (void *data)
20 {
21         OPENSSL_free (data);
22 }
23
24 int64_t
25 mono_btls_util_asn1_time_to_ticks (ASN1_TIME *time)
26 {
27         ASN1_GENERALIZEDTIME *gtime;
28         struct tm tm;
29         int64_t epoch;
30         int ret;
31         
32         memset (&tm, 0, sizeof (tm));
33
34         gtime = ASN1_TIME_to_generalizedtime (time, NULL);
35         ret = asn1_generalizedtime_to_tm (&tm, gtime);
36         ASN1_GENERALIZEDTIME_free (gtime);
37
38         /* FIXME: check the return value in managed code */
39         if (ret == 0) {
40                 return 0;
41         }
42
43         epoch = btls_timegm64 (&tm);
44
45         return epoch;
46 }
47
48 // Copied from crypto/bio/printf.c, takes va_list
49 int
50 mono_btls_debug_printf (BIO *bio, const char *format, va_list args)
51 {
52         char buf[256], *out, out_malloced = 0;
53         int out_len, ret;
54
55         out_len = vsnprintf (buf, sizeof(buf), format, args);
56         if (out_len < 0) {
57                 return -1;
58         }
59
60         if ((size_t) out_len >= sizeof(buf)) {
61                 const int requested_len = out_len;
62                 /* The output was truncated. Note that vsnprintf's return value
63                  * does not include a trailing NUL, but the buffer must be sized
64                  * for it. */
65                 out = OPENSSL_malloc (requested_len + 1);
66                 out_malloced = 1;
67                 if (out == NULL) {
68                         OPENSSL_PUT_ERROR(BIO, ERR_R_MALLOC_FAILURE);
69                         return -1;
70                 }
71                 out_len = vsnprintf (out, requested_len + 1, format, args);
72                 assert(out_len == requested_len);
73         } else {
74                 out = buf;
75         }
76
77         ret = BIO_write(bio, out, out_len);
78         if (out_malloced) {
79                 OPENSSL_free(out);
80         }
81
82         return ret;
83 }