Ok I finally figured it out: the compare routine's signature needs to be

int my_cmp(X509_ATTRIBUTE **a, X509_ATTRIBUTE **b);

not

int my_cmp(X509_ATTRIBUTE *a, X509_ATTRIBUTE *b);

However, my compare routine can only compare a few types of attributes
like OCTET_STRINGs and BMPSTRINGs.. It is not a generic, multi-purpose
compare routine.  If anyone has one or knows of one please let me know!!


Chris Jarshant wrote:

> Is there documentation (aside from looking at the header files) on how to
> use things like STACK_OF(type) and the sk_*_find() functions?
> Perhaps I'm going about it wrong, but I can't figure it out.
> Any help would be most apprecianted.  I'm trying to do this:
>
> given a STACK_OF(PKCS12_SAFEBAG) instance and a
> STACK_OF(X509_ATTRIBUTES) instance, I'm trying to find the
> safebag which has all of the attributes in the given attribute stack. So,
> here's the code pseudo-code (omitting return values):
>
> void find_bag(STACK_OF(PKCS12_SAFEBAG) *bags,
> STACK_OF(X509_ATTRIBUTES) *attribs) {
>
> foreach (s in safebag) {
>     bag_attribs = safebag[s]->attrib;
>     foreach (i in attribs) {
>         attrib = sk_X509_ATTRIBUTE_value(attribs, i);
>         if ((attrib_pos = sk_X509_ATTRIBUTE_find(bag_attribs, attrib)) < 0) {
>             printf("couldn't find attrib %d\n", i);
>             return;
>         } else {
>             printf("FOUND attrib at position %d\n", attrib_pos);
>         }
>     }
>     /* all given attributes found in this bag */
>     printf("bag %d has all the attributes, it's the one you want", s);
> }
>
> The sk_X509_ATTRIBUTE_find() *always* returns -1.  I believe this is
> because the base OpenSSL installation does not include a compare function
> for the X509_ATTRIBUTE type, so the sk_*_find function can't find an
> X509_ATTRIBUTE given a STACK_OF them.  I tried declaring a compare
> function myself with the signature:
>
> int my_cmp(X509_ATTRIBUTE *a, X509_ATTRIBUTE *b);
>
> but when it's called during the sk_*_find invocation, it is passing invalid
> arguments (i.e. they're not pointers to X509_ATTRIBUTE structures).
>
> Anyone have any idea of a better way to do this, or if there is indeed a good
> X509_ATTRIBUTE compare function I can use when calling the sk_* functions
> when dealing with X509_ATTRIBUTES?
>
> ______________________________________________________________________
> OpenSSL Project                                 http://www.openssl.org
> User Support Mailing List                    [EMAIL PROTECTED]
> Automated List Manager                           [EMAIL PROTECTED]

______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    [EMAIL PROTECTED]
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to