Sample code for 30+ languages & platforms
PureBasic

Duplicate OpensSSL to Create Signature using Cert and Key Files

See more OpenSSL Examples

This example duplicates the following:
openssl smime –sign -in something.xml -out something.der -signer mycert.crt -inkey cert.key -outform der –nodetach

Note: Although "smime" is the OpenSSL command, it's not actually producing S/MIME. The arguments "-outform der -binary" indicates that the output is binary DER (i.e. the PKCS7 binary signature). The input can be any type of file: XML, PDF, JPG, ... *anything*...

Chilkat PureBasic Downloads

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

Procedure ChilkatExample()

    success.i = 0

    ; This example requires 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

    ; Load the cert and private key from separate files.
    cert.i = CkCert::ckCreate()
    If cert.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkCert::ckLoadFromFile(cert,"myCert.crt")
    If success <> 1
        Debug CkCert::ckLastErrorText(cert)
        CkCrypt2::ckDispose(crypt)
        CkCert::ckDispose(cert)
        ProcedureReturn
    EndIf

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

    success = CkBinData::ckLoadFile(bd,"cert.key")
    privkey.i = CkPrivateKey::ckCreate()
    If privkey.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    ; Load from any format private key.
    ; If the file does not need a password, the 2nd arg is ignored.
    success = CkPrivateKey::ckLoadAnyFormat(privkey,bd,"password_if_needed")
    If success <> 1
        Debug CkPrivateKey::ckLastErrorText(privkey)
        CkCrypt2::ckDispose(crypt)
        CkCert::ckDispose(cert)
        CkBinData::ckDispose(bd)
        CkPrivateKey::ckDispose(privkey)
        ProcedureReturn
    EndIf

    success = CkCrypt2::ckSetSigningCert2(crypt,cert,privkey)
    If success <> 1
        Debug CkCrypt2::ckLastErrorText(crypt)
        CkCrypt2::ckDispose(crypt)
        CkCert::ckDispose(cert)
        CkBinData::ckDispose(bd)
        CkPrivateKey::ckDispose(privkey)
        ProcedureReturn
    EndIf

    ; Create the opaque signature (PKCS7 binary DER that contains both the signature and original file data).
    success = CkCrypt2::ckCreateP7M(crypt,"qa_data/infile.anything","qa_output/outfile.der")
    If success <> 1
        Debug CkCrypt2::ckLastErrorText(crypt)
        CkCrypt2::ckDispose(crypt)
        CkCert::ckDispose(cert)
        CkBinData::ckDispose(bd)
        CkPrivateKey::ckDispose(privkey)
        ProcedureReturn
    EndIf

    Debug "Success."


    CkCrypt2::ckDispose(crypt)
    CkCert::ckDispose(cert)
    CkBinData::ckDispose(bd)
    CkPrivateKey::ckDispose(privkey)


    ProcedureReturn
EndProcedure