summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/x509/x509_cmp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/x509/x509_cmp.c')
-rw-r--r--src/lib/libcrypto/x509/x509_cmp.c48
1 files changed, 13 insertions, 35 deletions
diff --git a/src/lib/libcrypto/x509/x509_cmp.c b/src/lib/libcrypto/x509/x509_cmp.c
index 030d0966fc..f460102f49 100644
--- a/src/lib/libcrypto/x509/x509_cmp.c
+++ b/src/lib/libcrypto/x509/x509_cmp.c
@@ -254,49 +254,33 @@ static int nocase_spacenorm_cmp(const ASN1_STRING *a, const ASN1_STRING *b)
254 return 0; 254 return 0;
255} 255}
256 256
257static int asn1_string_memcmp(ASN1_STRING *a, ASN1_STRING *b)
258 {
259 int j;
260 j = a->length - b->length;
261 if (j)
262 return j;
263 return memcmp(a->data, b->data, a->length);
264 }
265
266#define STR_TYPE_CMP (B_ASN1_PRINTABLESTRING|B_ASN1_T61STRING|B_ASN1_UTF8STRING)
267
268int X509_NAME_cmp(const X509_NAME *a, const X509_NAME *b) 257int X509_NAME_cmp(const X509_NAME *a, const X509_NAME *b)
269 { 258 {
270 int i,j; 259 int i,j;
271 X509_NAME_ENTRY *na,*nb; 260 X509_NAME_ENTRY *na,*nb;
272 261
273 unsigned long nabit, nbbit; 262 if (sk_X509_NAME_ENTRY_num(a->entries)
274 263 != sk_X509_NAME_ENTRY_num(b->entries))
275 j = sk_X509_NAME_ENTRY_num(a->entries) 264 return sk_X509_NAME_ENTRY_num(a->entries)
276 - sk_X509_NAME_ENTRY_num(b->entries); 265 -sk_X509_NAME_ENTRY_num(b->entries);
277 if (j)
278 return j;
279 for (i=sk_X509_NAME_ENTRY_num(a->entries)-1; i>=0; i--) 266 for (i=sk_X509_NAME_ENTRY_num(a->entries)-1; i>=0; i--)
280 { 267 {
281 na=sk_X509_NAME_ENTRY_value(a->entries,i); 268 na=sk_X509_NAME_ENTRY_value(a->entries,i);
282 nb=sk_X509_NAME_ENTRY_value(b->entries,i); 269 nb=sk_X509_NAME_ENTRY_value(b->entries,i);
283 j=na->value->type-nb->value->type; 270 j=na->value->type-nb->value->type;
284 if (j) 271 if (j) return(j);
285 { 272 if (na->value->type == V_ASN1_PRINTABLESTRING)
286 nabit = ASN1_tag2bit(na->value->type);
287 nbbit = ASN1_tag2bit(nb->value->type);
288 if (!(nabit & STR_TYPE_CMP) ||
289 !(nbbit & STR_TYPE_CMP))
290 return j;
291 j = asn1_string_memcmp(na->value, nb->value);
292 }
293 else if (na->value->type == V_ASN1_PRINTABLESTRING)
294 j=nocase_spacenorm_cmp(na->value, nb->value); 273 j=nocase_spacenorm_cmp(na->value, nb->value);
295 else if (na->value->type == V_ASN1_IA5STRING 274 else if (na->value->type == V_ASN1_IA5STRING
296 && OBJ_obj2nid(na->object) == NID_pkcs9_emailAddress) 275 && OBJ_obj2nid(na->object) == NID_pkcs9_emailAddress)
297 j=nocase_cmp(na->value, nb->value); 276 j=nocase_cmp(na->value, nb->value);
298 else 277 else
299 j = asn1_string_memcmp(na->value, nb->value); 278 {
279 j=na->value->length-nb->value->length;
280 if (j) return(j);
281 j=memcmp(na->value->data,nb->value->data,
282 na->value->length);
283 }
300 if (j) return(j); 284 if (j) return(j);
301 j=na->set-nb->set; 285 j=na->set-nb->set;
302 if (j) return(j); 286 if (j) return(j);
@@ -322,16 +306,10 @@ unsigned long X509_NAME_hash(X509_NAME *x)
322 { 306 {
323 unsigned long ret=0; 307 unsigned long ret=0;
324 unsigned char md[16]; 308 unsigned char md[16];
325 EVP_MD_CTX md_ctx;
326 309
327 /* Make sure X509_NAME structure contains valid cached encoding */ 310 /* Make sure X509_NAME structure contains valid cached encoding */
328 i2d_X509_NAME(x,NULL); 311 i2d_X509_NAME(x,NULL);
329 EVP_MD_CTX_init(&md_ctx); 312 EVP_Digest(x->bytes->data, x->bytes->length, md, NULL, EVP_md5(), NULL);
330 EVP_MD_CTX_set_flags(&md_ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
331 EVP_DigestInit_ex(&md_ctx, EVP_md5(), NULL);
332 EVP_DigestUpdate(&md_ctx, x->bytes->data, x->bytes->length);
333 EVP_DigestFinal_ex(&md_ctx,md,NULL);
334 EVP_MD_CTX_cleanup(&md_ctx);
335 313
336 ret=( ((unsigned long)md[0] )|((unsigned long)md[1]<<8L)| 314 ret=( ((unsigned long)md[0] )|((unsigned long)md[1]<<8L)|
337 ((unsigned long)md[2]<<16L)|((unsigned long)md[3]<<24L) 315 ((unsigned long)md[2]<<16L)|((unsigned long)md[3]<<24L)