Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mono / btls / btls-x509.c
index 54174223fb9acc33a5ecddf9307375465d692dbb..473d94fbaf3e341d0d7851860952bf6de7216bc8 100644 (file)
@@ -10,7 +10,7 @@
 #include <openssl/x509v3.h>
 #include <openssl/pkcs12.h>
 
-X509 *
+MONO_API X509 *
 mono_btls_x509_from_data (const void *buf, int len, MonoBtlsX509Format format)
 {
        BIO *bio;
@@ -29,52 +29,52 @@ mono_btls_x509_from_data (const void *buf, int len, MonoBtlsX509Format format)
        return cert;
 }
 
-X509 *
+MONO_API X509 *
 mono_btls_x509_up_ref (X509 *x509)
 {
        X509_up_ref (x509);
        return x509;
 }
 
-void
+MONO_API void
 mono_btls_x509_free (X509 *x509)
 {
        X509_free (x509);
 }
 
-X509 *
+MONO_API X509 *
 mono_btls_x509_dup (X509 *x509)
 {
        return X509_dup (x509);
 }
 
-MonoBtlsX509Name *
+MONO_API MonoBtlsX509Name *
 mono_btls_x509_get_subject_name (X509 *x509)
 {
        return mono_btls_x509_name_copy (X509_get_subject_name (x509));
 }
 
-MonoBtlsX509Name *
+MONO_API MonoBtlsX509Name *
 mono_btls_x509_get_issuer_name (X509 *x509)
 {
        return mono_btls_x509_name_copy (X509_get_issuer_name (x509));
 }
 
-int
+MONO_API int
 mono_btls_x509_get_subject_name_string (X509 *name, char *buffer, int size)
 {
        *buffer = 0;
        return X509_NAME_oneline (X509_get_subject_name (name), buffer, size) != NULL;
 }
 
-int
+MONO_API int
 mono_btls_x509_get_issuer_name_string (X509 *name, char *buffer, int size)
 {
        *buffer = 0;
        return X509_NAME_oneline (X509_get_issuer_name (name), buffer, size) != NULL;
 }
 
-int
+MONO_API int
 mono_btls_x509_get_raw_data (X509 *x509, BIO *bio, MonoBtlsX509Format format)
 {
        switch (format) {
@@ -87,13 +87,13 @@ mono_btls_x509_get_raw_data (X509 *x509, BIO *bio, MonoBtlsX509Format format)
        }
 }
 
-int
+MONO_API int
 mono_btls_x509_cmp (const X509 *a, const X509 *b)
 {
        return X509_cmp (a, b);
 }
 
-int
+MONO_API int
 mono_btls_x509_get_hash (X509 *x509, const void **data)
 {
        X509_check_purpose (x509, -1, 0);
@@ -101,19 +101,19 @@ mono_btls_x509_get_hash (X509 *x509, const void **data)
        return SHA_DIGEST_LENGTH;
 }
 
-long
+MONO_API int64_t
 mono_btls_x509_get_not_before (X509 *x509)
 {
        return mono_btls_util_asn1_time_to_ticks (X509_get_notBefore (x509));
 }
 
-long
+MONO_API int64_t
 mono_btls_x509_get_not_after (X509 *x509)
 {
        return mono_btls_util_asn1_time_to_ticks (X509_get_notAfter (x509));
 }
 
-int
+MONO_API int
 mono_btls_x509_get_public_key (X509 *x509, BIO *bio)
 {
        EVP_PKEY *pkey;
@@ -135,11 +135,11 @@ mono_btls_x509_get_public_key (X509 *x509, BIO *bio)
        return ret;
 }
 
-int
+MONO_API int
 mono_btls_x509_get_serial_number (X509 *x509, char *buffer, int size, int mono_style)
 {
        ASN1_INTEGER *serial;
-       char *pos;
+       unsigned char *temp, *p;
        int len, idx;
 
        serial = X509_get_serialNumber (x509);
@@ -151,23 +151,28 @@ mono_btls_x509_get_serial_number (X509 *x509, char *buffer, int size, int mono_s
                return serial->length;
        }
 
-       pos = buffer;
-       len = 0;
+       temp = OPENSSL_malloc (serial->length + 1);
+       if (!temp)
+               return 0;
+
+       p = temp;
+       len = i2c_ASN1_INTEGER (serial, &p);
 
-       for (idx = serial->length - 1; idx >= 0; idx--) {
-               *pos++ = serial->data [idx];
-               len++;
+       if (!len) {
+               OPENSSL_free (temp);
+               return 0;
        }
 
-       if (serial->data [0] >= 0x80) {
-               *pos++ = 0;
-               len++;
+       for (idx = 0; idx < len; idx++) {
+               buffer [idx] = *(--p);
        }
+       buffer [len] = 0;
 
+       OPENSSL_free (temp);
        return len;
 }
 
-int
+MONO_API int
 mono_btls_x509_get_public_key_algorithm (X509 *x509, char *buffer, int size)
 {
        X509_PUBKEY *pkey;
@@ -186,13 +191,13 @@ mono_btls_x509_get_public_key_algorithm (X509 *x509, char *buffer, int size)
        return OBJ_obj2txt (buffer, size, ppkalg, 1);
 }
 
-int
+MONO_API int
 mono_btls_x509_get_version (X509 *x509)
 {
        return (int)X509_get_version (x509) + 1;
 }
 
-int
+MONO_API int
 mono_btls_x509_get_signature_algorithm (X509 *x509, char *buffer, int size)
 {
        const ASN1_OBJECT *obj;
@@ -209,7 +214,7 @@ mono_btls_x509_get_signature_algorithm (X509 *x509, char *buffer, int size)
        return OBJ_obj2txt (buffer, size, obj, 1);
 }
 
-int
+MONO_API int
 mono_btls_x509_get_public_key_asn1 (X509 *x509, char *out_oid, int oid_len, uint8_t **buffer, int *size)
 {
        X509_PUBKEY *pkey;
@@ -246,7 +251,7 @@ mono_btls_x509_get_public_key_asn1 (X509 *x509, char *out_oid, int oid_len, uint
 
 }
 
-int
+MONO_API int
 mono_btls_x509_get_public_key_parameters (X509 *x509, char *out_oid, int oid_len, uint8_t **buffer, int *size)
 {
        X509_PUBKEY *pkey;
@@ -305,13 +310,13 @@ mono_btls_x509_get_public_key_parameters (X509 *x509, char *out_oid, int oid_len
        }
 }
 
-EVP_PKEY *
+MONO_API EVP_PKEY *
 mono_btls_x509_get_pubkey (X509 *x509)
 {
        return X509_get_pubkey (x509);
 }
 
-int
+MONO_API int
 mono_btls_x509_get_subject_key_identifier (X509 *x509, uint8_t **buffer, int *size)
 {
        ASN1_OCTET_STRING *skid;
@@ -335,7 +340,7 @@ mono_btls_x509_get_subject_key_identifier (X509 *x509, uint8_t **buffer, int *si
        return 1;
 }
 
-int
+MONO_API int
 mono_btls_x509_print (X509 *x509, BIO *bio)
 {
        return X509_print_ex (bio, x509, XN_FLAG_COMPAT, X509_FLAG_COMPAT);
@@ -354,7 +359,7 @@ get_trust_nid (MonoBtlsX509Purpose purpose)
        }
 }
 
-int
+MONO_API int
 mono_btls_x509_add_trust_object (X509 *x509, MonoBtlsX509Purpose purpose)
 {
        ASN1_OBJECT *trust;
@@ -372,7 +377,7 @@ mono_btls_x509_add_trust_object (X509 *x509, MonoBtlsX509Purpose purpose)
        return X509_add1_trust_object (x509, trust);
 }
 
-int
+MONO_API int
 mono_btls_x509_add_reject_object (X509 *x509, MonoBtlsX509Purpose purpose)
 {
        ASN1_OBJECT *reject;
@@ -390,7 +395,7 @@ mono_btls_x509_add_reject_object (X509 *x509, MonoBtlsX509Purpose purpose)
        return X509_add1_reject_object (x509, reject);
 }
 
-int
+MONO_API int
 mono_btls_x509_add_explicit_trust (X509 *x509, MonoBtlsX509TrustKind kind)
 {
        int ret = 0;