Hi all,

i have a problem with the PKCS12_gen_mac() which is called from within
PKCS12_verify_mac().
I've a function which extracts the private key from a PKCS#12 file. If I
call it once all is fine, but if I call it twice (with the same or another
PKCS#12 file) the second run fails calling PKCS12_verify_mac().

Thanks in advance for any replies!

Yours friendly,
Stefan Richter

--
The function for extracting the private key:

long ExtractPrivateKeyFromPkcs12(char *lpszPkcs12In, char *mpass, char
**lppszPrivateKeyOut, int *lpPrivateKeyOutLen)
{
 long status = 0;
 BIO *in = NULL;
 PKCS12 *p12 = NULL;
 STACK *asafes, *bags;
 PKCS12_SAFEBAG *bag;
 int i, ii, bagnid;
 int passlen=-1;
 PKCS7 *p7;
 PKCS8_PRIV_KEY_INFO *p8;

 apps_startup();

 in = BIO_new_file(lpszPkcs12In, "rb");
 if (!in) {
  BIO_printf(bio_err, "Error opening input file %s\n", lpszPkcs12In ?
lpszPkcs12In : "<stdin>");
  perror(lpszPkcs12In);
  return -1;
 }

 if (enc == NULL)
  enc = EVP_des_ede3_cbc();

 if (!(p12 = d2i_PKCS12_bio(in, NULL))) {
  ERR_print_errors(bio_err);
  return -1;
 }

 if (!PKCS12_verify_mac (p12, mpass, -1)) {
  BIO_printf(bio_err, "Mac verify error: invalid password?\n");
  ERR_print_errors(bio_err);
  return -1;
    }
 else
  BIO_printf(bio_err, "MAC verified OK\n");

 if (!(asafes = M_PKCS12_unpack_authsafes (p12)))
  return 0;
 for (i = 0; i < sk_num (asafes); i++) {
  p7 = (PKCS7 *)sk_value(asafes, i);
  bagnid = OBJ_obj2nid(p7->type);
  if (bagnid == NID_pkcs7_data)
   bags = M_PKCS12_unpack_p7data (p7);
        else
   if (bagnid == NID_pkcs7_encrypted)
    bags = M_PKCS12_unpack_p7encdata(p7, mpass, passlen);
   else
    continue;

  if (!bags)
   return 0;
  for (ii = 0; ii < sk_num (bags); ii++) {
   bag = (PKCS12_SAFEBAG *)sk_value(bags, ii);
   if (M_PKCS12_bag_type(bag) == NID_keyBag) {
    p8 = bag->value.keybag;
    if (lppszPrivateKeyOut && lpPrivateKeyOutLen) {
     *lpPrivateKeyOutLen = (*(((*((*p8).pkey)).value).asn1_string)).length;
     *lppszPrivateKeyOut = (char *) calloc(1, *lpPrivateKeyOutLen);
     memcpy(*lppszPrivateKeyOut,
(*(((*((*p8).pkey)).value).asn1_string)).data, *lpPrivateKeyOutLen);
    }
   }
   else
    if (M_PKCS12_bag_type(bag) == NID_pkcs8ShroudedKeyBag){
     if (!(p8 = M_PKCS12_decrypt_skey(bag, mpass, passlen)))
      return 0;
     if (lppszPrivateKeyOut && lpPrivateKeyOutLen) {
      *lpPrivateKeyOutLen = (*(((*((*p8).pkey)).value).asn1_string)).length;
      *lppszPrivateKeyOut = (char *)calloc(1, *lpPrivateKeyOutLen);
      memcpy(*lppszPrivateKeyOut,
(*(((*((*p8).pkey)).value).asn1_string)).data, *lpPrivateKeyOutLen);
     }
     PKCS8_PRIV_KEY_INFO_free(p8);
    }
  }
 }

 sk_pop_free(bags, (void(__cdecl*)(void*))PKCS12_SAFEBAG_free);
 sk_pop_free(asafes, (void(__cdecl*)(void*))PKCS7_free);

 BIO_free(in);
 PKCS12_free(p12);
 EVP_cleanup();

 return(status);
}

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

Reply via email to