[openssl-users] Is it possible to add eContent to a signedData which has no signers

Martin, Neil Neil.Martin at ncr.com
Fri Feb 6 10:08:35 UTC 2015


Hi,

I'd like to know if it is possible to add eContent to a signedData which has no signers?

The ANS X9 TR34 technical report defines a rebind token as having the following structure.

SignedData (inner content):
   There are no digestAlgorithms included.
   The EncapsulatedContentInfo eContentType is id-data.
   The EncapsulatedContentInfo eContent includes an identifier  as an 
      issuerAndSerialNumber field.
   1 Certificate is included in the certificates field.
   The CRL field is omitted.
   There are no signers on the content.

SignedData (outer content):
   The digestAlgorithms field specifies id- sha256 : '2.16.840.1.101.3.4.2.1'.
   The EncapsulatedContentInfo eContentType is id-signedData.
   The certificates field is omitted.
   1 is included in the crl field.
   IssuerAndSerialNumber is chosen for SignerInfo SignerIdentifier.
   The current certificate owner identifier is included in the SignerInfos
     issuerAndSerialNumber field.
   The SignerInfo digestAlgorithm field specifies id- sha256 : '2.16.840.1.101.3.4.2.1'.
   The random number, is included as random nonce authenticated attribute
     within SignerInfo SignedAttributes.
   The signatureAlgorithm is specified as id-sha256WithrsaEncryption
      '1.2.840.113549.1.1.11'
   The unsignedAttrs field is omitted.

My problem is I can't include the eContent  in the inner content.
In the following code, CMS_final for the inner content fails.

void CreateRebindToken(X509* deviceCertificate, X509* currentCertificate, EVP_PKEY* currentPrivateKey, X509* newCertificate, X509_CRL* crl, LPCSTR tokenFile)
{
    int rc = 0;

    // Prepare the inner content
    CMS_ContentInfo* cms = CMS_sign(NULL, NULL, NULL, NULL, CMS_PARTIAL);

    rc = CMS_add1_cert(cms, newCertificate);

    BIO* eContentBio = BIO_new(BIO_s_mem()); 
    CreateIssuerAndSerialNumberSequence(deviceCertificate, eContentBio);

    // This fails, presumably because no signer has been added. 
    // How can eContent be added to a SignedData structure with no signers?
    rc = CMS_final(cms, eContentBio, NULL, CMS_NOATTR | SMIME_BINARY);

    rc = BIO_free(eContentBio);
    eContentBio = NULL;

    // Cache the inner content cms in DER format then free the cms
    eContentBio = BIO_new(BIO_s_mem()); 
    rc = i2d_CMS_bio(eContentBio, cms);
    CMS_ContentInfo_free(cms);
    cms = NULL;

    // prepare the outer content
    cms = CMS_sign(NULL, NULL, NULL, NULL, CMS_PARTIAL);
    rc = CMS_add1_crl(cms, crl);
    CMS_SignerInfo* si = CMS_add1_signer(cms, currentCertificate, currentPrivateKey, EVP_sha256(), CMS_NOATTR | CMS_NOCERTS);
    rc = CMS_final(cms, eContentBio, NULL, SMIME_BINARY);

    BIO_free(eContentBio);
    eContentBio = NULL;

    // Write to file
    BIO* bio = BIO_new_file(tokenFile, "wb");
    rc = i2d_CMS_bio(bio, cms);

    // Cleanup
    rc = BIO_free(bio);
    bio = NULL;

    CMS_ContentInfo_free(cms);
    cms = NULL;
}

Thanks,
Neil




More information about the openssl-users mailing list