Hi,
This may not be exactly the same issue, but today I saw a problem with
openssl 0.9.7d, PKCS12, and long passwords. Specifically I tried using
a 128 character import password on a PKCS12 file and found that I
couldn't parse the PKCS12 file using PKCS12_parse. The same certificate
with a 20 or 32 character password run through the same program worked
fine. I was also able to parse the certificate with a 128 char password
using the openssl command line.
Here is the gist of the program:
FILE *fp;
EVP_PKEY *pkey;
X509 *cert;
STACK_OF(X509) *ca = NULL;
// ...init fp and password...
PKCS12 *p12 = d2i_PKCS12_fp(fp, NULL);
if (!p12) {
fprintf(stderr, "Error reading PKCS#12 file\n");
ERR_print_errors_fp(stderr);
exit(1);
}
if (!PKCS12_parse(p12, password, &pkey, &cert, &ca)) {
fprintf(stderr, "Error parsing PKCS#12 file\n");
ERR_print_errors_fp(stderr);
exit(1);
}
On the file with the long password this program fails with the following
error:
Error parsing PKCS#12 file
31389:error:23076071:PKCS12 routines:PKCS12_parse:mac verify
failure:p12_kiss.c:121:
So either I'm using openssl incorrectly (entirely possible) or there is
a bug in the APIs. Below is a set of steps to reproduce the program. I
can send tarball of the certificate files and source to anyone who is
interested.
1. Created a test CA using CA.pl
2. Issued a certificate, pwtest_cert-4.pem, password test.
3. Converted the PEM file to pkcs12, pwtest_cert-4.p12
4. Created three PKCS12 files with passwords of length 20, 32, and 128
characters. The cert files are pwtest_cert-20.p12, pwtest_cert-32.p12,
and pwtest_cert-128.p12 respectively. This is a little convoluted, but
I used these commands for creating pkcs12 files with specific passwords:
$ openssl pkcs12 -in pwtest_cert-4.p12 -out temporary.pem
$ openssl pkcs12 -in temporary.pem -out pwtest_cert-XXX.p12 -export
For the second command I used the appropriate password and file name.
5. Use pkcs12_parse (my own program, described above) which calls the
PKCS12_parse function using the file and password data. Note that the
128 character password has a mac verify failure.
$ ./pkcs12_parse
Usage: ./pkcs12_parse <pkcs12 file> [password]
$ pkcs12_parse ../pwtest_cert-20.p12 12345678901234567890
pkcs12_parse: PASSED
$ pkcs12_parse ../pwtest_cert-32.p12 12345678901234567890123456789012
pkcs12_parse: PASSED
$ pkcs12_parse ../pwtest_cert-128.p12
123456789012345678901234567890123456789012345678901234567890123456789012
34567890123456789012345678901234567890123456789012345678
Error parsing PKCS#12 file
31389:error:23076071:PKCS12 routines:PKCS12_parse:mac verify
failure:p12_kiss.c:121:
6. However using command line openssl I can parse the 128 char password
certificate, e.g.
$ openssl pkcs12 -in pwtest_cert-128.p12 -info -noout
Enter Import Password:
MAC Iteration 2048
MAC verified OK
PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 2048
Certificate bag
PKCS7 Data
Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 2048
As I said above, I can send tarball of the certificate files and source
to anyone who is interested.
Steven
> -----Original Message-----
> From: [EMAIL PROTECTED]
> [mailto:[EMAIL PROTECTED] On Behalf Of Deane Sloan
> Sent: Monday, November 08, 2004 12:54 PM
> To: '[EMAIL PROTECTED]'
> Subject: RE: PKCS12 password >=32 chars interop issue with
> Microsoft cert stor es?
>
>
> Hi Stephen,
>
> A quick run under Netscape 4.74 (all I had around I'm sorry)
> shows a similar problem with longer passwords - pkcs12 export
> from MS (regardless of "Enable strong protection" option) or
> Netscape with long password won't import into the other.
>
> I'll test with the newer Mozilla variants - however at this
> point it's beginning to look like a point of difference.
>
> Unfortunately, removing the mac isn't too palatable for our
> usage - we need to export a PKCS12 that is of a similar
> "quality" to that exported by IE/user store. We also need to
> be able to support importing from a pkcs12 exported from
> IE/user store and correctly verify it.
>
> Regardless of the politics around the dominance of IE, this
> problem could be said to extend to anything reliant upon the
> CyptoAPI and the PFXExportCertStoreEx, PfxImportCertStore
> and PFXVerifyPassword functions - including Windows itself.
>
> Is there a possibility that a compatibility option (if not a
> #define) might surface in future versions of OpenSSL? With
> the steady shift from passwords to pass phrases, this issue
> is likely to become relevant to a larger number of users.
>
> On the face of it, what issues do you see with using the code
> below (aside from breaking from a supported OpenSSL distro
> etc) to achieve the desired compatibility?
>
> Best regards,
>
> Deane Sloan
>
> -----Original Message-----
> From: Dr. Stephen Henson
> To: [EMAIL PROTECTED]
> Sent: 9/11/2004 8:49 AM
> Subject: Re: PKCS12 password >=32 chars interop issue with
> Microsoft cert stor es?
>
> On Mon, Nov 08, 2004, Deane Sloan wrote:
>
> > Hi,
> >
> > We are using the OpenSSL PKCS#12 features for creating files for
> import
> > to/from the Microsoft user stores - using PKCS12_parse and
> PKCS12_create (
> > nid_key=NID_pbe_WithSHA1And3_Key_TripleDES_CBC,
> > nid_cert=NID_pbe_WithSHA1And40BitRC2_CBC, iter=2000, mac_iter=2000,
> > keytype=0).
> >
> > Our tests have uncovered an issue where passwords of 32
> ASCII chars or
> > larger used on either side (MS store or OpenSSL) result in neither
> system
> > reading files generated by the other due to MAC verification failure
> > (ERR_GET_LIB(...) == ERR_LIB_PKCS12 && ERR_GET_REASON(...) ==
> > PKCS12_R_MAC_VERIFY_FAILURE ) on the PKCS12_parse side and similar
> password
> > related errors on the certificate import wizard side (assuming
> > PFXVerifyPassword failure in the CryptoAPI).
> >
> > Basically - it would seem that MS's MAC generation is based on a
> maximum of
> > 32 characters (for example - try exporting from the MS user
> store with
> a
> > password greater than 32 chars, re-import the file to the store but
> only
> > supply the first 32 characters back).
> >
> > Changing the following in the PKCS12_key_gen_uni function in
> p12_key.c, line
> > 136, from:
> > if(passlen) Plen = v * ((passlen+v-1)/v);
> >
> > to:
> > if(passlen) Plen = v * ((min(passlen,0x40L)+v-1)/v);
> >
> > results in correct operation (from the *limited* testing I've
> undertaken)
> > for both import to and from OpenSSL and the MS stores - at character
> lengths
> > >= 32 ASCII chars. This has been tested against 0.9.7d - however I
> note that
> > p12_key.c hasn't changed in the 0.9.7d release.
> >
> > Is the Microsoft approach correct?
> > If not - is there possible scope for a #define option for
> users where
> MS
> > PKCS#12 interop is desirable? (apologies in advance if such
> an option
> does
> > exist)
> >
> > Best regards,
> >
>
> This is the first I've seen of this issue. The MS approach
> AFAIK is a bug. Have you tried Mozilla to see if it does the same?
>
> When you parse a file a workaround would be to use -nomacver.
> For creation there's also the (currently undocumented) -nomac
> option in OpenSSL 0.9.8.
>
> Steve.
> --
> Dr Stephen N. Henson. Email, S/MIME and PGP keys: see
> homepage OpenSSL project core developer and freelance
> consultant. Funding needed! Details on homepage.
> Homepage: http://www.drh-consultancy.demon.co.uk
> ______________________________________________________________________
> 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]
>
______________________________________________________________________
OpenSSL Project http://www.openssl.org
User Support Mailing List [EMAIL PROTECTED]
Automated List Manager [EMAIL PROTECTED]