Sample code for 30+ languages & platforms
PureBasic

CoSign PKCS7/CMS Signed Data

See more Digital Signatures Examples

Demonstrates how to add a 2nd signature to a CMS SignedData. This is to add an additional signature, SignerInfo and certificate(s) to an existing CMS signed data.

In this example, we cosign an existing pdf.p7s

Note: The CoSign method is added in Chilkat v9.5.0.89.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkBinData.pb"
IncludeFile "CkCert.pb"
IncludeFile "CkCrypt2.pb"

Procedure ChilkatExample()

    success.i = 0

    ; This example assumes the Chilkat API to have been previously unlocked.
    ; See Global Unlock Sample for sample code.

    crypt.i = CkCrypt2::ckCreate()
    If crypt.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    cert.i = CkCert::ckCreate()
    If cert.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    ; If loading from a smart card, set the smartcard PIN.
    CkCert::setCkSmartCardPin(cert, "0000")

    ; Load a certificate in some way, such as from a smart card.
    ; Chilkat provides other methods to load from a .pfx, .pem, or from the Windows certificate stores..
    success = CkCert::ckLoadFromSmartcard(cert,"")
    If success = 0
        Debug CkCert::ckLastErrorText(cert)
        CkCrypt2::ckDispose(crypt)
        CkCert::ckDispose(cert)
        ProcedureReturn
    EndIf

    success = CkCrypt2::ckSetSigningCert(crypt,cert)
    If success = 0
        Debug CkCrypt2::ckLastErrorText(crypt)
        CkCrypt2::ckDispose(crypt)
        CkCert::ckDispose(cert)
        ProcedureReturn
    EndIf

    ; Load the file to be co-signed.
    ; NOTE:  This is to cosign a PDF file contained within a CMS (PKCS7) message.
    ; (In other words, the PDF is contained within the CMS SignedData, rather than the other way around
    ; where a CMS signature is contained within a PDF.  Use Chilkat's PDF class to sign a PDF, which is
    ; to embed a CMS signature within the PDF.)
    bd.i = CkBinData::ckCreate()
    If bd.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkBinData::ckLoadFile(bd,"qa_data/p7s/cosign/sample.pdf.p7s")
    If success = 0
        Debug "Failed to load pdf.p7s input file."
        CkCrypt2::ckDispose(crypt)
        CkCert::ckDispose(cert)
        CkBinData::ckDispose(bd)
        ProcedureReturn
    EndIf

    ; bd2 will contain the co-signed result.
    bd2.i = CkBinData::ckCreate()
    If bd2.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkCrypt2::ckCoSign(crypt,bd,cert,bd2)
    If success = 0
        Debug CkCrypt2::ckLastErrorText(crypt)
        CkCrypt2::ckDispose(crypt)
        CkCert::ckDispose(cert)
        CkBinData::ckDispose(bd)
        CkBinData::ckDispose(bd2)
        ProcedureReturn
    EndIf

    success = CkBinData::ckWriteFile(bd,"qa_output/cosigned.pdf.p7s")
    If success = 0
        Debug "Failed to save pdf.p7s output file."
        CkCrypt2::ckDispose(crypt)
        CkCert::ckDispose(cert)
        CkBinData::ckDispose(bd)
        CkBinData::ckDispose(bd2)
        ProcedureReturn
    EndIf

    Debug "Success!"


    CkCrypt2::ckDispose(crypt)
    CkCert::ckDispose(cert)
    CkBinData::ckDispose(bd)
    CkBinData::ckDispose(bd2)


    ProcedureReturn
EndProcedure