Sample code for 30+ languages & platforms
Visual FoxPro

FatturaPA XML Invoice Sign+Encrypt to P7M

See more Digital Signatures Examples

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

Chilkat Visual FoxPro Downloads

Visual FoxPro
LOCAL lnSuccess
LOCAL loCrypt
LOCAL lcPfxPath
LOCAL lcPfxPassword
LOCAL loCert
LOCAL loJsonSignedAttrs
LOCAL lcInFile
LOCAL lcSigFile
LOCAL loEncryptCert

lnSuccess = 0

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

loCrypt = CreateObject('Chilkat.Crypt2')

* Use a digital certificate and private key from a PFX file (.pfx or .p12).
lcPfxPath = "qa_data/pfx/cert_test123.pfx"
lcPfxPassword = "test123"

loCert = CreateObject('Chilkat.Cert')
lnSuccess = loCert.LoadPfxFile(lcPfxPath,lcPfxPassword)
IF (lnSuccess = 0) THEN
    ? loCert.LastErrorText
    RELEASE loCrypt
    RELEASE loCert
    CANCEL
ENDIF

* Provide the signing cert (with associated private key).
lnSuccess = loCrypt.SetSigningCert(loCert)
IF (lnSuccess = 0) THEN
    ? loCrypt.LastErrorText
    RELEASE loCrypt
    RELEASE loCert
    CANCEL
ENDIF

* Indicate that SHA-256 should be used.
loCrypt.HashAlgorithm = "sha256"

* Specify the signed attributes to be included.
* (This is what makes it CAdES-BES compliant.)
loJsonSignedAttrs = CreateObject('Chilkat.JsonObject')
loJsonSignedAttrs.UpdateInt("contentType",1)
loJsonSignedAttrs.UpdateInt("signingTime",1)
loJsonSignedAttrs.UpdateInt("messageDigest",1)
loJsonSignedAttrs.UpdateInt("signingCertificateV2",1)
loCrypt.SigningAttributes = loJsonSignedAttrs.Emit()

lcInFile = "qa_data/xml/IT01234567890_11002.xml"
lcSigFile = "qa_data/fatturapa/signed.p7m"

* Create the CAdES-BES signature, which contains the original data.
lnSuccess = loCrypt.CreateP7M(lcInFile,lcSigFile)
IF (lnSuccess = 0) THEN
    ? loCrypt.LastErrorText
    RELEASE loCrypt
    RELEASE loCert
    RELEASE loJsonSignedAttrs
    CANCEL
ENDIF

* Now we'll encrypt what was signed using FatturaPA's certificate (from a PEM file)
loEncryptCert = CreateObject('Chilkat.Cert')
lnSuccess = loEncryptCert.LoadFromFile("qa_data/certs/fatturapa_cert.pem")
IF (lnSuccess = 0) THEN
    ? loEncryptCert.LastErrorText
    RELEASE loCrypt
    RELEASE loCert
    RELEASE loJsonSignedAttrs
    RELEASE loEncryptCert
    CANCEL
ENDIF

loCrypt.CryptAlgorithm = "pki"

lnSuccess = loCrypt.SetEncryptCert(loEncryptCert)
IF (lnSuccess = 0) THEN
    ? loCrypt.LastErrorText
    RELEASE loCrypt
    RELEASE loCert
    RELEASE loJsonSignedAttrs
    RELEASE loEncryptCert
    CANCEL
ENDIF

* Indicate the underlying bulk encryption algorithm to be used:
loCrypt.Pkcs7CryptAlg = "aes"
loCrypt.KeyLength = 128

* There's one last option that could be set.  If is the RSA encryption encryption/padding scheme. 
* By default, RSAES_PKCS1-V1_5 is used.  If desired, the OaepPadding property could be set to 1 to
* use RSAES_OAEP.  (We'll leave it set at the default value of 0)
loCrypt.OaepPadding = 0

* Everything is specified.  Encrypt the .p7m to create a new .p7m (which adds a layer of encryption around the opaque signature).
* The output is PKCS7 in binary DER format.
lnSuccess = loCrypt.CkEncryptFile(lcSigFile,"qa_output/signed_and_encrypted.p7m")
IF (lnSuccess = 0) THEN
    ? loCrypt.LastErrorText
    RELEASE loCrypt
    RELEASE loCert
    RELEASE loJsonSignedAttrs
    RELEASE loEncryptCert
    CANCEL
ENDIF

? "Success."

RELEASE loCrypt
RELEASE loCert
RELEASE loJsonSignedAttrs
RELEASE loEncryptCert