Hi,

First, OpenSSL_add_all_algorithms is just a define that resolves to
OPENSSL_add_all_algorithms_noconf (or OPENSSL_add_all_algorithms_conf if
you define OPENSSL_LOAD_CONF in your build). It's there on evp.h .

To solve you PKCS#12 problem, all you need is to call
OpenSSL_add_all_algorithms at the start of your program. Which means in
your case that you should dlsym for OPENSSL_add_all_algorithms_noconf and
then call it.

I hope this will help.
Cheers,
--
Mounir IDRASSI
IDRIX
http://www.idrix.fr


> Hello,
>
>    For certain reasons I want to load the OpenSSL libraries at run-time
> (rather than at load-time). My application will specifically need to be
> able to load a PKCS#12 file, and fiddle around with the data in it.
>
>    The relevant code snippets follows (the code below is just exerts,
> and parts where originally taken from apps/apps.c):
>
> ------------------------
> typedef int (OPENSSLCALLCONV *pfnPKCS12_parse)(PKCS12 *p12, const char
> *pass,
>               EVP_PKEY **pkey, X509 **cert, STACK_OF(X509) **ca);
> typedef int (OPENSSLCALLCONV *pfnPKCS12_free)(PKCS12 *p12);
> typedef int (OPENSSLCALLCONV *pfnPKCS12_verify_mac)(PKCS12 *p12,
>               const char *pass, int passlen);
> typedef PKCS12 *(OPENSSLCALLCONV *pfnd2i_PKCS12_fp)(FILE *fp, PKCS12
> **p12);
>
>
> pfnPKCS12_parse pkcs12_parse = NULL;
> pfnPKCS12_free pkcs12_free = NULL;
> pfnPKCS12_verify_mac pkcs12_verify_mac = NULL;
> pfnd2i_PKCS12_fp d2i_pkcs12_fp = NULL;
>
>
> main()
> {
>    int ret = 0;
>    void *lib = NULL;
>    char *error = NULL;
>
>    lib = dlopen(fname, RTLD_LAZY);
>
>    dlerror();
>
>    pkcs12_parse = (pfnPKCS12_parse)dlsym(lib, "PKCS12_parse");
>    pkcs12_free = (pfnPKCS12_free)dlsym(lib, "PKCS12_free");
>    pkcs12_verify_mac = (pfnPKCS12_verify_mac)dlsym(lib,
> "PKCS12_verify_mac");
>    d2i_pkcs12_fp = (pfnd2i_PKCS12_fp)dlsym(lib, "d2i_PKCS12_fp");
>
>
>    fpp12file = fopen(p12file, "rb");
>    if(fpp12file == NULL)
>    {
>       printf("Error: Unable to fopen(\"%s\")\n", p12file);
>       return 1;
>    }
>
>    load_pkcs12(fpp12file, "P12 test #1", p12password, NULL, NULL, NULL);
>
>    return 0;
> }
>
>
> int load_pkcs12(FILE *fp, const char *desc, const char *passwd,
>               EVP_PKEY **pkey, X509 **cert, STACK_OF(X509) **ca)
> {
>       int len, ret = 0;
>       PKCS12 *p12;
>
>       p12 = d2i_pkcs12_fp(fp, NULL);
>       if(p12 == NULL)
>       {
>               printf("Error: Unable to load PKCS12 file for \"%s\"\n", desc);
>               goto die;
>       }
>       /* See if an empty password will do */
>       if(pkcs12_verify_mac(p12, "", 0) || pkcs12_verify_mac(p12, NULL, 0))
>       {
>               pass = "";
>       }
>       else
>       {
>               len = strlen(passwd);
>               if(!pkcs12_verify_mac(p12, passwd, len))
>               {
>                       printf("Mac verify error (wrong password?) in PKCS12 "
>                                       "file for %s\n", desc);
>                       goto die;
>               }
>               pass = tpass;
>       }
>       ret = pkcs12_parse(p12, pass, pkey, cert, ca);
> die:
>       if(p12)
>               pkcs12_free(p12);
>       return ret;
> }
> ------------------------
>
>    I get the "Mac verify error (wrong password? ..." error.
>
>    My initial guess was that I need to initialize the library in some
> manner before I can call functions which perform the verification. A
> quick search led me to
> http://www.ibm.com/developerworks/linux/library/l-openssl.html, which
> stipulates:
>
>    ``/* Initializing OpenSSL */
>
>      SSL_load_error_strings();
>      ERR_load_BIO_strings();
>      OpenSSL_add_all_algorithms();''
>
>    I nm'd my /usr/lib/libcrypto.so, but it doesn't appear to contain any
> entry for OpenSSL_add_all_algorithms. It does however have:
> 000000000009be20 T OpenSSL_add_all_ciphers
> 000000000009bc90 T OpenSSL_add_all_digests
>
>    But I'm beginning to feel that I might be chasing the wrong end here.
> Can anyone find an immediate problem with how I'm using the PKCS#12
> functions?
>
> --
> Kind regards,
> Jan Danielsson
>
>
>


______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    openssl-users@openssl.org
Automated List Manager                           majord...@openssl.org

Reply via email to