Sample code for 30+ languages & platforms
C++

Create .p7s using Smart Card or USB Token

Demonstrates how to create a .p7s using a certificate stored on a smart card or USB token.

Chilkat C++ Downloads

C++
#include <CkCrypt2.h>
#include <CkCert.h>
#include <CkJsonObject.h>

void ChilkatSample(void)
    {
    bool success = false;

    //  This requires the Chilkat API to have been previously unlocked.
    //  See Global Unlock Sample for sample code.

    CkCrypt2 crypt;

    //  Use a certificate on a smartcard or USB token.
    CkCert cert;

    //  Provide the smartcard PIN.
    cert.put_SmartCardPin("000000");

    //  Load the certificate on the smartcard currently in the reader (or on the USB token).
    success = cert.LoadFromSmartcard("");
    if (success != true) {
        std::cout << cert.lastErrorText() << "\r\n";
        return;
    }

    //  Provide the certificate for signing.
    success = crypt.SetSigningCert(cert);
    if (success != true) {
        std::cout << crypt.lastErrorText() << "\r\n";
        return;
    }

    //  Indicate that SHA-256 should be used.
    crypt.put_HashAlgorithm("sha256");

    //  Specify the signed attributes to be included.
    CkJsonObject jsonSignedAttrs;
    jsonSignedAttrs.UpdateInt("contentType",1);
    jsonSignedAttrs.UpdateInt("signingTime",1);
    jsonSignedAttrs.UpdateInt("messageDigest",1);
    jsonSignedAttrs.UpdateInt("signingCertificateV2",1);
    crypt.put_SigningAttributes(jsonSignedAttrs.emit());

    const char *inFile = "qa_data/xml/IT01234567890_11002.xml";
    const char *sigFile = "qa_output/IT01234567890_11002.xml.p7s";

    //  Create the .p7s, which is a signature file that does not embed the original data.
    //  (To create a signature file that also embeds the original data, call CreateP7M instead)
    success = crypt.CreateP7S(inFile,sigFile);
    if (success == false) {
        std::cout << crypt.lastErrorText() << "\r\n";
        return;
    }

    std::cout << "Success." << "\r\n";
    }