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);