On Wed, Feb 03, 2010, Ujwal Chinthala wrote:
> Hi,
>
> I modified the code as you mentioned, I am just trying to verify if signing
> the certificate using private key works.
>
> I signed the certificate using private key.
> But I still get the same error from CMS_verify. It complains about "signer
> certificate not found".
> Is this the right way to create the self-signed dummy certificate? It seems
> to behave exactly the same way as before.
>
> Please find the modified code below (just added a block of code for signing
> the cert). Also I printed the certificate for reference.
>
>
> //COPY the DSA params and public keys from const char arrays into DSA
> structure
> DSA *dsaParams= DSA_new();
> dsaParams->g = BN_new();
> dsaParams->p = BN_new();
> dsaParams->q = BN_new();
> dsaParams->pub_key = BN_new();
> BN_bin2bn((const unsigned char *)uLicenseCheckG,
> sizeof(uLicenseCheckG), dsaParams->g);
> BN_bin2bn((const unsigned char *)uLicenseCheckP,
> sizeof(uLicenseCheckP), dsaParams->p);
> BN_bin2bn((const unsigned char *)uLicenseCheckQ,
> sizeof(uLicenseCheckQ), dsaParams->q);
> BN_bin2bn((const unsigned char *)uLicenseCheckY,
> sizeof(uLicenseCheckY), dsaParams->pub_key);
>
> //Create a EVP_PKEY to use in creating a certificate
> EVP_PKEY *evpTemp = EVP_PKEY_new();
> EVP_PKEY_assign_DSA(evpTemp, dsaParams);
>
> //Create a CMS content info structure out of the license key
> CMS_ContentInfo *cms = NULL;
> BIO *bioBuff = BIO_new_mem_buf((char *)nBytes, nCountOfBytes);
> BIO_set_mem_eof_return(bioBuff,0);
> cms = d2i_CMS_bio(bioBuff, NULL);// i believe this finds the end of
> ASN1 data
>
>
> STACK_OF(CMS_SignerInfo) *sinfos;
> CMS_SignerInfo *si;
> sinfos = CMS_get0_SignerInfos(cms);
> si = sk_CMS_SignerInfo_value(sinfos, 0);
> ASN1_OCTET_STRING* keyid;
> X509_NAME* issuer;
> ASN1_INTEGER* sno;
> int rc = CMS_SignerInfo_get0_signer_id(si, &keyid, &issuer, &sno);
> //USE THIS KEYID TO SET THE x509Cert->skid VALUE
> printf ("si: %d %p %p %p\n", rc, keyid, issuer, sno);
>
> //create a x509 cert with above DSA params and public key and skid
> X509 *x509Cert = X509_new();
> X509_set_version(x509Cert, 2);
> ASN1_INTEGER_set(X509_get_serialNumber(x509Cert), 0);
> x509Cert->skid = ASN1_OCTET_STRING_dup(keyid);
The above line is incorrect. You are just setting a cache SKID value and not
including it in the certificate.
Try X509_add1_ext_i2d(x509Cert, NID_subject_key_identifier, keyid, 0, 0);
Steve.
--
Dr Stephen N. Henson. OpenSSL project core developer.
Commercial tech support now available see: http://www.openssl.org
______________________________________________________________________
OpenSSL Project http://www.openssl.org
User Support Mailing List [email protected]
Automated List Manager [email protected]