Hi

I finally found the problem and could verify the PKCS#7 SignedData. The 
problem was in one bit:

Netscape DER encoded it's pkcs-9 15 object like this:

06 09                           
2A 86 48 86 F7 0D 01 09 0F      
31 35
30 33 <-- SEQUENCE (Constructed, definite-length method)
30 0A ......

while SSLeay 0.6.4 encodes the pkcs-9 15 object like this:

06 09                           
2A 86 48 86 F7 0D 01 09 0F      
31 35
10 33 <-- SEQUENCE (Primitive, definite-length method)
30 0A ......

Ok, I'm not an ASN.1 expert but I think the way Netscape did it is 
certainly correct. I will study the code to find out how this problem has 
to be solved. Assistance would be appreciated.

Markus

Markus Isler[SMTP:[EMAIL PROTECTED]] wrote:
> Hi
>
> I'm using SSLeay 0.6.4 and I'm trying to verify a PKCS#7 of type 
SignedData. I generated a PKCS#7 SignedData using the crypto.signText 
method with Netscape Navigator 4.04 . From my pint of view I have to 
proceed the following steps:
>
> 1. Get the DER encoding of the authenticatedAttributes field:
>
>       iAttributeDataLen = 
i2d_ASN1_SET(pAttributes,NULL,i2d_X509_ATTRIBUTE,V_ASN1_SET,V_ASN1_UNIVE  
RSAL);
>       pchAttributeData = malloc(iAttributeDataLen);
>       M_CHECK_NULL_POINTER(pchAttributeData);
>       pchAttributeDataPtr = pchAttributeData;
> 
        i2d_ASN1_SET(pAttributes,&pchAttributeDataPtr,i2d_X509_ATTRIBUTE,V_ASN1  
_SET,V_ASN1_UNIVERSAL);
>
> 2. Digest the DER encoded authenticatedAttributes:
>
>       EVP_DigestInit(&hCtx,pMessageDigestAlg);
>       EVP_DigestUpdate(&hCtx,pchAttributeData,iAttributeDataLen);
>       EVP_DigestFinal(&hCtx,pMessageDigest->data,&pMessageDigest->length);
>
> 3. Create a DigestInfo object and fill in the data:
>
>       pDigestInfo = PKCS7_DIGEST_INFO_new();
>       M_CHECK_NULL_POINTER(pDigestInfo);
>       M_FREE(ASN1_OCTET_STRING_free,pDigestInfo->digest);
>       pDigestInfo->digest = pMessageDigest;
>       SetAlgorithm(pDigestInfo->digest_alg,pMessageDigestAlg->type,piErr);
>
> 4. Get the DER encoding of the DigestInfo:
>
>       iDigestInfoDataLen = i2d_PKCS7_DIGEST_INFO(pDigestInfo,NULL);
>       pchDigestInfoData = malloc(iDigestInfoDataLen);
>       M_CHECK_NULL_POINTER(pchDigestInfoData);
>       pchDigestInfoDataPtr = pchDigestInfoData;
>       i2d_PKCS7_DIGEST_INFO(pDigestInfo,&pchDigestInfoDataPtr);
>
> 5. Public decrypt the encrypted message digest in the signer info:
>
> 
        RSA_public_decrypt(pEncMessageDigest->length,pEncMessageDigest->data,pc  
hDigestInfoData2,pepKey->pkey.rsa);
>
> 6. Compare the data
>
>       if (!memcmp(pchDigestInfoData2,pchDigestInfoData,iDigestInfoDataLen))
>               iRet = 1;
>
> Ok, so far so good. Everything works fine until I have to compare the 
data :( . The first 15 Bytes in the pchDigestInfoData2 and 
pchDigestInfoData are the same. This means that the DigestInfo structure 
was encoded correctly. The data only differs in the digest field. This 
means that I must have calculated the digest wrongly. I realized, that in 
the SSLeay 0.9.0 Eric was building the DER encoding of the 
authenticatedAttributes field the same way I do. He then does things 
completely different:
>
>       sk=si->auth_attr;
>       if ((sk != NULL) && (sk_num(sk) != 0))
>               {
>               i=i2d_ASN1_SET(sk,NULL,i2d_X509_ATTRIBUTE,
>                       V_ASN1_SET,V_ASN1_UNIVERSAL);
>               pp=(unsigned char *)malloc(i);
>               p=pp;
>               i2d_ASN1_SET(sk,&p,i2d_X509_ATTRIBUTE,
>                       V_ASN1_SET,V_ASN1_UNIVERSAL);
>               EVP_VerifyUpdate(&mdc_tmp,pp,i);
>               free(pp);
>               }
>
>       os=si->enc_digest;
>       i=EVP_VerifyFinal(&mdc_tmp,os->data,os->length,
>               X509_get_pubkey(x509));
>
> It looks to me like he is signing directly the DER encoded 
authenticatedAttributes. Did I miss something ? Anyway, that's not my 
problem but a hint if you have a problem verifying a Netscape generated 
SigningData.
>
> My question is: what is the correct input for the message digest ?
>
> Whit the asn1pars application I found out that Netscape is having a 
PKCS#9 object in the authenticatedAttributes that isn't recognized by 
SSLeay 0.6.4 nor by 9.0.0. The object is : 1 2 840 113549 1 9 15 == pkcs-9 
15. This object seems to trouble the reading or writing procedure
> of a PKCS#7. The result is that the PKCS#7 read differs in the PKCS#7 
written. If I read and write a PKCS#7 not having this object, the problem 
doesn't exist. Ok, what has this to do with the PKCS#7 verifying problem 
mentioned above. I believe that the function i2d_ASN1_SET produces a wrong 
result if the pkcs-9 15 object is present. If it is so, what I still have 
to find out, the input of the digesting process is wrong and the verifying 
process never works for this kind of PKCS#7.
>
> Has anybody made the same experience, or can anybody give me a hint ? 
Every comment is highly appreciated. I will go on trying to proof my theory 
and will let you know about my results.
>
> I still don't know the pkcs-9 15 object (it's not in the PKCS#9 standard 
so it must be defined somewhere else). What is it ? What is it's ASN.1 
definition ?
>
> Cheers
>
> Markus
>
>
> --
> Markus Isler
> P O Box 74028 Market Rd, Auckland 1130
> Level 7, Eden House, 44 Khyber Pass Rd, Grafton, Auckland, NEW ZEALAND
> Tel +64.9.366.1502   Fax +64.9.366.1554   Mobile +64.21.637.746
> Internet: [EMAIL PROTECTED]   http://www.hardcastle.co.nz
>
>


--
Markus Isler
P O Box 74028 Market Rd, Auckland 1130
Level 7, Eden House, 44 Khyber Pass Rd, Grafton, Auckland, NEW ZEALAND
Tel +64.9.366.1502   Fax +64.9.366.1554   Mobile +64.21.637.746
Internet: [EMAIL PROTECTED]   http://www.hardcastle.co.nz


+-------------------------------------------------------------------------+
| Administrative requests should be sent to [EMAIL PROTECTED] |
| List service provided by Open Software Associates, http://www.osa.com/  |
+-------------------------------------------------------------------------+

Reply via email to