Sample code for 30+ languages & platforms
PureBasic

Create CAdES-BES .p7m for FatturaPA XML Invoice

See more Digital Signatures Examples

Demonstrates how to create a CAdES BES invoice.xml.p7m for the Italian FatturaPA exchange system.

Note: This example requires Chilkat v9.5.0.75.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkCert.pb"
IncludeFile "CkJsonObject.pb"
IncludeFile "CkCrypt2.pb"

Procedure ChilkatExample()

    success.i = 0

    ; Note: Requires Chilkat v9.5.0.75 or greater.

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

    ; Use a digital certificate and private key from a PFX file (.pfx or .p12).
    pfxPath.s = "qa_data/pfx/cert_test123.pfx"
    pfxPassword.s = "test123"

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

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

    ; Provide the signing cert (with associated private key).
    success = CkCrypt2::ckSetSigningCert(crypt,cert)
    If success <> 1
        Debug CkCrypt2::ckLastErrorText(crypt)
        CkCrypt2::ckDispose(crypt)
        CkCert::ckDispose(cert)
        ProcedureReturn
    EndIf

    ; Indicate that SHA-256 should be used.
    CkCrypt2::setCkHashAlgorithm(crypt, "sha256")

    ; Specify the signed attributes to be included.
    ; (This is what makes it CAdES-BES compliant.)
    jsonSignedAttrs.i = CkJsonObject::ckCreate()
    If jsonSignedAttrs.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkJsonObject::ckUpdateInt(jsonSignedAttrs,"contentType",1)
    CkJsonObject::ckUpdateInt(jsonSignedAttrs,"signingTime",1)
    CkJsonObject::ckUpdateInt(jsonSignedAttrs,"messageDigest",1)
    CkJsonObject::ckUpdateInt(jsonSignedAttrs,"signingCertificateV2",1)
    CkCrypt2::setCkSigningAttributes(crypt, CkJsonObject::ckEmit(jsonSignedAttrs))

    inFile.s = "qa_data/xml/IT01234567890_11002.xml"
    sigFile.s = "qa_output/IT01234567890_11002.xml.p7m"

    ; Create the CAdES-BES signature, which contains the original data.
    success = CkCrypt2::ckCreateP7M(crypt,inFile,sigFile)
    If success = 0
        Debug CkCrypt2::ckLastErrorText(crypt)
        CkCrypt2::ckDispose(crypt)
        CkCert::ckDispose(cert)
        CkJsonObject::ckDispose(jsonSignedAttrs)
        ProcedureReturn
    EndIf

    Debug "Success."


    CkCrypt2::ckDispose(crypt)
    CkCert::ckDispose(cert)
    CkJsonObject::ckDispose(jsonSignedAttrs)


    ProcedureReturn
EndProcedure