5 // Created by Martin Baulig on 3/5/16.
6 // Copyright © 2016 Xamarin. All rights reserved.
9 #include "btls-x509-name.h"
11 struct MonoBtlsX509Name
{
16 MONO_API MonoBtlsX509Name
*
17 mono_btls_x509_name_from_name (X509_NAME
*xn
)
19 MonoBtlsX509Name
*name
;
21 name
= OPENSSL_malloc (sizeof (MonoBtlsX509Name
));
25 memset(name
, 0, sizeof(MonoBtlsX509Name
));
30 MONO_API MonoBtlsX509Name
*
31 mono_btls_x509_name_copy (X509_NAME
*xn
)
33 MonoBtlsX509Name
*name
;
35 name
= OPENSSL_malloc (sizeof (MonoBtlsX509Name
));
39 memset(name
, 0, sizeof(MonoBtlsX509Name
));
40 name
->name
= X509_NAME_dup(xn
);
46 mono_btls_x509_name_free (MonoBtlsX509Name
*name
)
50 X509_NAME_free(name
->name
);
58 mono_btls_x509_name_peek_name (MonoBtlsX509Name
*name
)
64 mono_btls_x509_name_print_bio (MonoBtlsX509Name
*name
, BIO
*bio
)
66 return X509_NAME_print_ex (bio
, name
->name
, 0, ASN1_STRFLGS_RFC2253
| XN_FLAG_FN_SN
| XN_FLAG_SEP_CPLUS_SPC
| XN_FLAG_DN_REV
);
70 mono_btls_x509_name_get_raw_data (MonoBtlsX509Name
*name
, void **buffer
, int use_canon_enc
)
76 // make sure canon_enc is initialized.
77 i2d_X509_NAME (name
->name
, NULL
);
79 len
= name
->name
->canon_enclen
;
80 ptr
= name
->name
->canon_enc
;
82 len
= (int)name
->name
->bytes
->length
;
83 ptr
= name
->name
->bytes
->data
;
86 *buffer
= OPENSSL_malloc (len
);
90 memcpy (*buffer
, ptr
, len
);
94 MONO_API MonoBtlsX509Name
*
95 mono_btls_x509_name_from_data (const void *data
, int len
, int use_canon_enc
)
97 MonoBtlsX509Name
*name
;
99 const unsigned char *ptr
;
102 name
= OPENSSL_malloc (sizeof (MonoBtlsX509Name
));
106 memset (name
, 0, sizeof(MonoBtlsX509Name
));
109 name
->name
= X509_NAME_new ();
119 // re-add ASN1 SEQUENCE header.
121 if (!CBB_add_asn1(&cbb
, &contents
, 0x30) ||
122 !CBB_add_bytes(&contents
, data
, len
) ||
123 !CBB_finish(&cbb
, &buf
, &buf_len
)) {
125 mono_btls_x509_name_free (name
);
136 ret
= d2i_X509_NAME (&name
->name
, &ptr
, len
);
141 if (ret
!= name
->name
) {
142 mono_btls_x509_name_free (name
);
150 mono_btls_x509_name_print_string (MonoBtlsX509Name
*name
, char *buffer
, int size
)
153 return X509_NAME_oneline (name
->name
, buffer
, size
) != NULL
;
157 mono_btls_x509_name_hash (MonoBtlsX509Name
*name
)
159 return X509_NAME_hash (name
->name
);
163 mono_btls_x509_name_hash_old (MonoBtlsX509Name
*name
)
165 return X509_NAME_hash_old (name
->name
);
169 mono_btls_x509_name_get_entry_count (MonoBtlsX509Name
*name
)
171 return X509_NAME_entry_count (name
->name
);
174 static MonoBtlsX509NameEntryType
178 case NID_countryName
:
179 return MONO_BTLS_X509_NAME_ENTRY_TYPE_COUNTRY_NAME
;
180 case NID_organizationName
:
181 return MONO_BTLS_X509_NAME_ENTRY_TYPE_ORGANIZATION_NAME
;
182 case NID_organizationalUnitName
:
183 return MONO_BTLS_X509_NAME_ENTRY_TYPE_ORGANIZATIONAL_UNIT_NAME
;
185 return MONO_BTLS_X509_NAME_ENTRY_TYPE_COMMON_NAME
;
186 case NID_localityName
:
187 return MONO_BTLS_X509_NAME_ENTRY_TYPE_LOCALITY_NAME
;
188 case NID_stateOrProvinceName
:
189 return MONO_BTLS_X509_NAME_ENTRY_TYPE_STATE_OR_PROVINCE_NAME
;
190 case NID_streetAddress
:
191 return MONO_BTLS_X509_NAME_ENTRY_TYPE_STREET_ADDRESS
;
192 case NID_serialNumber
:
193 return MONO_BTLS_X509_NAME_ENTRY_TYPE_SERIAL_NUMBER
;
194 case NID_domainComponent
:
195 return MONO_BTLS_X509_NAME_ENTRY_TYPE_DOMAIN_COMPONENT
;
197 return MONO_BTLS_X509_NAME_ENTRY_TYPE_USER_ID
;
198 case NID_dnQualifier
:
199 return MONO_BTLS_X509_NAME_ENTRY_TYPE_DN_QUALIFIER
;
201 return MONO_BTLS_X509_NAME_ENTRY_TYPE_TITLE
;
203 return MONO_BTLS_X509_NAME_ENTRY_TYPE_SURNAME
;
205 return MONO_BTLS_X509_NAME_ENTRY_TYPE_GIVEN_NAME
;
207 return MONO_BTLS_X509_NAME_ENTRY_TYPE_INITIAL
;
209 return MONO_BTLS_X509_NAME_ENTRY_TYPE_UNKNOWN
;
213 MONO_API MonoBtlsX509NameEntryType
214 mono_btls_x509_name_get_entry_type (MonoBtlsX509Name
*name
, int index
)
216 X509_NAME_ENTRY
*entry
;
219 if (index
>= X509_NAME_entry_count (name
->name
))
222 entry
= X509_NAME_get_entry (name
->name
, index
);
226 obj
= X509_NAME_ENTRY_get_object (entry
);
230 return nid2mono (OBJ_obj2nid (obj
));
234 mono_btls_x509_name_get_entry_oid (MonoBtlsX509Name
*name
, int index
, char *buffer
, int size
)
236 X509_NAME_ENTRY
*entry
;
239 if (index
>= X509_NAME_entry_count (name
->name
))
242 entry
= X509_NAME_get_entry (name
->name
, index
);
246 obj
= X509_NAME_ENTRY_get_object (entry
);
250 return OBJ_obj2txt (buffer
, size
, obj
, 1);
254 mono_btls_x509_name_get_entry_oid_data (MonoBtlsX509Name
*name
, int index
, const void **data
)
256 X509_NAME_ENTRY
*entry
;
259 if (index
>= X509_NAME_entry_count (name
->name
))
262 entry
= X509_NAME_get_entry (name
->name
, index
);
266 obj
= X509_NAME_ENTRY_get_object (entry
);
275 mono_btls_x509_name_get_entry_value (MonoBtlsX509Name
*name
, int index
, int *tag
, unsigned char **str
)
277 X509_NAME_ENTRY
*entry
;
283 if (index
>= X509_NAME_entry_count (name
->name
))
286 entry
= X509_NAME_get_entry (name
->name
, index
);
290 data
= X509_NAME_ENTRY_get_data (entry
);
295 return ASN1_STRING_to_UTF8 (str
, data
);