Index: openssl/crypto/x509v3/v3_genn.c |
=================================================================== |
--- openssl/crypto/x509v3/v3_genn.c (revision 105093) |
+++ openssl/crypto/x509v3/v3_genn.c (working copy) |
@@ -3,7 +3,7 @@ |
* project 1999. |
*/ |
/* ==================================================================== |
- * Copyright (c) 1999 The OpenSSL Project. All rights reserved. |
+ * Copyright (c) 1999-2008 The OpenSSL Project. All rights reserved. |
* |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
@@ -99,3 +99,154 @@ |
ASN1_ITEM_TEMPLATE_END(GENERAL_NAMES) |
IMPLEMENT_ASN1_FUNCTIONS(GENERAL_NAMES) |
+ |
+GENERAL_NAME *GENERAL_NAME_dup(GENERAL_NAME *a) |
+ { |
+ return (GENERAL_NAME *) ASN1_dup((i2d_of_void *) i2d_GENERAL_NAME, |
+ (d2i_of_void *) d2i_GENERAL_NAME, |
+ (char *) a); |
+ } |
+ |
+/* Returns 0 if they are equal, != 0 otherwise. */ |
+int GENERAL_NAME_cmp(GENERAL_NAME *a, GENERAL_NAME *b) |
+ { |
+ int result = -1; |
+ |
+ if (!a || !b || a->type != b->type) return -1; |
+ switch(a->type) |
+ { |
+ case GEN_X400: |
+ case GEN_EDIPARTY: |
+ result = ASN1_TYPE_cmp(a->d.other, b->d.other); |
+ break; |
+ |
+ case GEN_OTHERNAME: |
+ result = OTHERNAME_cmp(a->d.otherName, b->d.otherName); |
+ break; |
+ |
+ case GEN_EMAIL: |
+ case GEN_DNS: |
+ case GEN_URI: |
+ result = ASN1_STRING_cmp(a->d.ia5, b->d.ia5); |
+ break; |
+ |
+ case GEN_DIRNAME: |
+ result = X509_NAME_cmp(a->d.dirn, b->d.dirn); |
+ break; |
+ |
+ case GEN_IPADD: |
+ result = ASN1_OCTET_STRING_cmp(a->d.ip, b->d.ip); |
+ break; |
+ |
+ case GEN_RID: |
+ result = OBJ_cmp(a->d.rid, b->d.rid); |
+ break; |
+ } |
+ return result; |
+ } |
+ |
+/* Returns 0 if they are equal, != 0 otherwise. */ |
+int OTHERNAME_cmp(OTHERNAME *a, OTHERNAME *b) |
+ { |
+ int result = -1; |
+ |
+ if (!a || !b) return -1; |
+ /* Check their type first. */ |
+ if ((result = OBJ_cmp(a->type_id, b->type_id)) != 0) |
+ return result; |
+ /* Check the value. */ |
+ result = ASN1_TYPE_cmp(a->value, b->value); |
+ return result; |
+ } |
+ |
+void GENERAL_NAME_set0_value(GENERAL_NAME *a, int type, void *value) |
+ { |
+ switch(type) |
+ { |
+ case GEN_X400: |
+ case GEN_EDIPARTY: |
+ a->d.other = value; |
+ break; |
+ |
+ case GEN_OTHERNAME: |
+ a->d.otherName = value; |
+ break; |
+ |
+ case GEN_EMAIL: |
+ case GEN_DNS: |
+ case GEN_URI: |
+ a->d.ia5 = value; |
+ break; |
+ |
+ case GEN_DIRNAME: |
+ a->d.dirn = value; |
+ break; |
+ |
+ case GEN_IPADD: |
+ a->d.ip = value; |
+ break; |
+ |
+ case GEN_RID: |
+ a->d.rid = value; |
+ break; |
+ } |
+ a->type = type; |
+ } |
+ |
+void *GENERAL_NAME_get0_value(GENERAL_NAME *a, int *ptype) |
+ { |
+ if (ptype) |
+ *ptype = a->type; |
+ switch(a->type) |
+ { |
+ case GEN_X400: |
+ case GEN_EDIPARTY: |
+ return a->d.other; |
+ |
+ case GEN_OTHERNAME: |
+ return a->d.otherName; |
+ |
+ case GEN_EMAIL: |
+ case GEN_DNS: |
+ case GEN_URI: |
+ return a->d.ia5; |
+ |
+ case GEN_DIRNAME: |
+ return a->d.dirn; |
+ |
+ case GEN_IPADD: |
+ return a->d.ip; |
+ |
+ case GEN_RID: |
+ return a->d.rid; |
+ |
+ default: |
+ return NULL; |
+ } |
+ } |
+ |
+int GENERAL_NAME_set0_othername(GENERAL_NAME *gen, |
+ ASN1_OBJECT *oid, ASN1_TYPE *value) |
+ { |
+ OTHERNAME *oth; |
+ oth = OTHERNAME_new(); |
+ if (!oth) |
+ return 0; |
+ oth->type_id = oid; |
+ oth->value = value; |
+ GENERAL_NAME_set0_value(gen, GEN_OTHERNAME, oth); |
+ return 1; |
+ } |
+ |
+int GENERAL_NAME_get0_otherName(GENERAL_NAME *gen, |
+ ASN1_OBJECT **poid, ASN1_TYPE **pvalue) |
+ { |
+ if (gen->type != GEN_OTHERNAME) |
+ return 0; |
+ if (poid) |
+ *poid = gen->d.otherName->type_id; |
+ if (pvalue) |
+ *pvalue = gen->d.otherName->value; |
+ return 1; |
+ } |
+ |