Sample code for 30+ languages & platforms
PureBasic

Create PEM-encoded PKCS#7 Detached Signature

See more Digital Signatures Examples

Demonstrates how to create a PKCS7 PEM-encoded object containing a detached signature.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkCert.pb"
IncludeFile "CkStringBuilder.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.

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

    ; Load the cert and private key.
    success = CkCert::ckLoadPfxFile(cert,"qa_data/pfx/myCertAndKey.p12","password")
    If success <> 1
        Debug CkCert::ckLastErrorText(cert)
        CkCert::ckDispose(cert)
        ProcedureReturn
    EndIf

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

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

    ; Use SHA-256
    CkCrypt2::setCkHashAlgorithm(crypt, "sha256")

    ; Hash the utf-8 byte representation of the string
    CkCrypt2::setCkCharset(crypt, "utf-8")

    ; Return the result in base64
    CkCrypt2::setCkEncodingMode(crypt, "base64Mime")

    ; Sign some text to create a detached signature (i.e. a signature that does not include the signed data)
    textToSign.s = "This is the text to be hashed and signed."
    sigBase64.s = CkCrypt2::ckSignStringENC(crypt,textToSign)
    If CkCrypt2::ckLastMethodSuccess(crypt) <> 1
        Debug CkCrypt2::ckLastErrorText(crypt)
        CkCert::ckDispose(cert)
        CkCrypt2::ckDispose(crypt)
        ProcedureReturn
    EndIf

    Debug sigBase64

    ; The result:

    ; MIIWbgYJKoZIhvcNAQcCoIIWXzCCFlsCAQExDzANBglghkgBZQMEAgEFADALBgkqhkiG9w0BBwGg
    ; ghMXMIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQx
    ; ...
    ; ...

    ; If we want it in PEM format with just LF line-endings:
    sb.i = CkStringBuilder::ckCreate()
    If sb.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    ; Just LF line endings, not CRLF.
    crlf.i = 0
    CkStringBuilder::ckAppendLine(sb,"-----BEGIN PKCS7-----",crlf)
    CkStringBuilder::ckAppend(sb,sigBase64)
    CkStringBuilder::ckAppendLine(sb,"-----END PKCS7-----",crlf)
    CkStringBuilder::ckToLF(sb)

    ; Save to a file.
    CkStringBuilder::ckWriteFile(sb,"c:/temp/qa_output/sig.pem","utf-8",0)

    ; Examine..
    Debug CkStringBuilder::ckGetAsString(sb)

    ; Result is:

    ; -----BEGIN PKCS7-----
    ; MIIWbgYJKoZIhvcNAQcCoIIWXzCCFlsCAQExDzANBglghkgBZQMEAgEFADALBgkqhkiG9w0BBwGg
    ; ghMXMIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQx
    ; DjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUG
    ; A1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMw
    ; MDkyMjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3Rh
    ; bGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBS
    ; b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTuf
    ; ClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlN
    ; AJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45Rnij
    ; MCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9
    ; ...
    ; ...
    ; -----END PKCS7-----


    CkCert::ckDispose(cert)
    CkCrypt2::ckDispose(crypt)
    CkStringBuilder::ckDispose(sb)


    ProcedureReturn
EndProcedure