@@ -72,8 +72,9 @@ ASN1_SEQUENCE(OTHERNAME) = {
7272IMPLEMENT_ASN1_FUNCTIONS (OTHERNAME )
7373
7474ASN1_SEQUENCE (EDIPARTYNAME ) = {
75- ASN1_IMP_OPT (EDIPARTYNAME , nameAssigner , DIRECTORYSTRING , 0 ),
76- ASN1_IMP_OPT (EDIPARTYNAME , partyName , DIRECTORYSTRING , 1 )
75+ /* DirectoryString is a CHOICE type so use explicit tagging */
76+ ASN1_EXP_OPT (EDIPARTYNAME , nameAssigner , DIRECTORYSTRING , 0 ),
77+ ASN1_EXP (EDIPARTYNAME , partyName , DIRECTORYSTRING , 1 )
7778} ASN1_SEQUENCE_END (EDIPARTYNAME )
7879
7980IMPLEMENT_ASN1_FUNCTIONS (EDIPARTYNAME )
@@ -107,6 +108,37 @@ GENERAL_NAME *GENERAL_NAME_dup(GENERAL_NAME *a)
107108 (char * )a );
108109}
109110
111+ static int edipartyname_cmp (const EDIPARTYNAME * a , const EDIPARTYNAME * b )
112+ {
113+ int res ;
114+
115+ if (a == NULL || b == NULL ) {
116+ /*
117+ * Shouldn't be possible in a valid GENERAL_NAME, but we handle it
118+ * anyway. OTHERNAME_cmp treats NULL != NULL so we do the same here
119+ */
120+ return -1 ;
121+ }
122+ if (a -> nameAssigner == NULL && b -> nameAssigner != NULL )
123+ return -1 ;
124+ if (a -> nameAssigner != NULL && b -> nameAssigner == NULL )
125+ return 1 ;
126+ /* If we get here then both have nameAssigner set, or both unset */
127+ if (a -> nameAssigner != NULL ) {
128+ res = ASN1_STRING_cmp (a -> nameAssigner , b -> nameAssigner );
129+ if (res != 0 )
130+ return res ;
131+ }
132+ /*
133+ * partyName is required, so these should never be NULL. We treat it in
134+ * the same way as the a == NULL || b == NULL case above
135+ */
136+ if (a -> partyName == NULL || b -> partyName == NULL )
137+ return -1 ;
138+
139+ return ASN1_STRING_cmp (a -> partyName , b -> partyName );
140+ }
141+
110142/* Returns 0 if they are equal, != 0 otherwise. */
111143int GENERAL_NAME_cmp (GENERAL_NAME * a , GENERAL_NAME * b )
112144{
@@ -116,8 +148,11 @@ int GENERAL_NAME_cmp(GENERAL_NAME *a, GENERAL_NAME *b)
116148 return -1 ;
117149 switch (a -> type ) {
118150 case GEN_X400 :
151+ result = ASN1_TYPE_cmp (a -> d .x400Address , b -> d .x400Address );
152+ break ;
153+
119154 case GEN_EDIPARTY :
120- result = ASN1_TYPE_cmp (a -> d .other , b -> d .other );
155+ result = edipartyname_cmp (a -> d .ediPartyName , b -> d .ediPartyName );
121156 break ;
122157
123158 case GEN_OTHERNAME :
@@ -164,8 +199,11 @@ void GENERAL_NAME_set0_value(GENERAL_NAME *a, int type, void *value)
164199{
165200 switch (type ) {
166201 case GEN_X400 :
202+ a -> d .x400Address = value ;
203+ break ;
204+
167205 case GEN_EDIPARTY :
168- a -> d .other = value ;
206+ a -> d .ediPartyName = value ;
169207 break ;
170208
171209 case GEN_OTHERNAME :
@@ -199,8 +237,10 @@ void *GENERAL_NAME_get0_value(GENERAL_NAME *a, int *ptype)
199237 * ptype = a -> type ;
200238 switch (a -> type ) {
201239 case GEN_X400 :
240+ return a -> d .x400Address ;
241+
202242 case GEN_EDIPARTY :
203- return a -> d .other ;
243+ return a -> d .ediPartyName ;
204244
205245 case GEN_OTHERNAME :
206246 return a -> d .otherName ;
0 commit comments