Dr. Stephen Henson wrote:
On Tue, Jun 21, 2005, soukyan wrote:


Hello

I have the following code:
variables
X509 * cert;
and
X509_PUBKEY * working_public_key;
are previously instantiated.
                        ASN1_BIT_STRING_free(working_public_key->public_key);
working_public_key->public_key =
 ASN1_STRING_dup(cert->cert_info->key->public_key);
if (cert->cert_info->key->algor->parameter)
{
 if (working_public_key->algor->parameter)
   ASN1_TYPE_free(working_public_key->algor->parameter);
 working_public_key->algor->parameter = ASN1_TYPE_new();
 ASN1_TYPE_set(working_public_key->algor->parameter,
   cert->cert_info->key->algor->parameter->type,
   (void*)(&(cert->cert_info->key->algor->parameter->value)));
}
else
{
 if (OBJ_cmp(working_public_key->algor->algorithm,
             cert->cert_info->key->algor->algorithm))
 {
   ASN1_TYPE_free(working_public_key->algor->parameter);
   working_public_key->algor->parameter = NULL;
 }
}
ASN1_OBJECT_free(working_public_key->algor->algorithm);
working_public_key->algor->algorithm =
 OBJ_dup(cert->cert_info->key->algor->algorithm);
EVP_PKEY_free(working_public_key->pkey);
working_public_key->pkey = NULL;
X509_PUBKEY_get(working_public_key);

I do it according to RFC 3280 chapter 6.1.4 (d), (e) and (f).

If an algorithm in certificates' chain is RSA, the above code works correctly. But if the algorithm is DSA, application crashes (segmentation fault) in X509_PUBKEY_get(working_public_key).

What do I wrong i this code?




That's horribly non-portable and depends on lots of structure internals. You
should instead use X509_verify() if you just want to verify the signature on a
certificate.

If you want to extract the public key portably from a certificate use
X509_get_pubkey().


Of course I use X509_verify() this way:
X509_verify(toBeVerifiedCert, working_public_key->pkey)
but I have to prepare first a proper EVP_PKEY. because in some certificates the DSA parameters are not included in a certificate and need to be inherited from a previous certificate in a path.
In such a situation the function X509_get_pubkey() isn't usefull for me.
For now my application doesn't pass tests 4.1.4, 4.1.5 and 4.1.6 from NIST Test Suite because of the above problem.

Is there in OpenSSL a way to support signatures' chaining?

Thanks,
Daniel

--
Promocja! Format 15x20 tylko 99gr!
Zamów odbitki cyfrowe online - odbierz za darmo w EMPiK-u lub wy¶lemy Ci je 
poczt±
http://gazeta.empikfoto.pl
______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    openssl-users@openssl.org
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to