DataFlex
DataFlex
Decrypt S/MIME and Verify S/MIME Signatures
See more MIME Examples
_LANGUAGE_ example to decrypt S/MIME and verify S/MIME signatures. The S/MIME is unwrapped to get the original MIME prior to signing/encrypting.Chilkat DataFlex Downloads
Use ChilkatAx-win32.pkg
Procedure Test
Boolean iSuccess
Handle hoMime
Boolean iIsEncrypted
Boolean iIsSigned
Variant vSignerCert
Handle hoSignerCert
Variant vDecryptCert
Handle hoDecryptCert
String sTemp1
Move False To iSuccess
// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
Get Create (RefClass(cComChilkatMime)) To hoMime
If (Not(IsComObjectCreated(hoMime))) Begin
Send CreateComObject of hoMime
End
// Load an S/MIME message from a file:
Get ComLoadMimeFile Of hoMime "signedMime.txt" To iSuccess
If (iSuccess = False) Begin
Get ComLastErrorText Of hoMime To sTemp1
Showln sTemp1
Procedure_Return
End
// The ContainsEncryptedParts/ContainsSignedParts methods
// can be called to determine if the MIME is encrypted and/or signed:
Get ComContainsEncryptedParts Of hoMime To iIsEncrypted
Get ComContainsSignedParts Of hoMime To iIsSigned
// We don't want the "unwrap extras". You'll see what those
// are in a few moments...
Set ComUnwrapExtras Of hoMime To False
// To verify the signature, call UnwrapSecurity. This will
// verify the signature(s) and decrypt the S/MIME and restore
// the MIME to the unsigned/unencrypted state.
// The results of what was found are present in the MIME object's
// properties, as well as extra header fields that are added
// to the unwrapped MIME.
Get ComUnwrapSecurity Of hoMime To iSuccess
If (iSuccess <> True) Begin
// UnwrapSecurity returns True if all signatures were
// verified and all parts decrypted.
Get ComLastErrorText Of hoMime To sTemp1
Showln sTemp1
Procedure_Return
End
// The mime.UnwrapExtras property controls whether or not
// these additional fields are added to the unwrapped MIME:
//
// X-NumPartsSigned: 1
// X-SignaturesValid: yes
// X-NumPartsEncrypted: 1
// X-Decrypted: no
//
// The X-NumPartsSigned/X-SignaturesValid headers are added
// if the MIME was signed.
//
// The X-NumPartsEncrypted/X-Decrypted headers are added
// if the MIME was encrypted.
//
// If the MIME was signed, get the certificate used for signing.
If (iIsSigned = True) Begin
Get Create (RefClass(cComChilkatCert)) To hoSignerCert
If (Not(IsComObjectCreated(hoSignerCert))) Begin
Send CreateComObject of hoSignerCert
End
// The NumSignerCerts property indicates how many certificates
// were used for signing. This example will assume the value is 1.
// To get the 1st signer cert, call LastSignerCert with an index of 0:
Get pvComObject of hoSignerCert to vSignerCert
Get ComLastSignerCert Of hoMime 0 vSignerCert To iSuccess
If (iSuccess = True) Begin
Get ComSubjectCN Of hoSignerCert To sTemp1
Showln "**** Signer Cert: " sTemp1
End
End
// If the MIME was encrypted, get the certificate used for decryption
If (iIsEncrypted = True) Begin
// The NumDecryptCerts property indicates how many certificates
// were used for decrypting. This example will assume the value is 1.
// To get the 1st decrypt cert, call LastDecryptCert with an index of 0:
Get Create (RefClass(cComChilkatCert)) To hoDecryptCert
If (Not(IsComObjectCreated(hoDecryptCert))) Begin
Send CreateComObject of hoDecryptCert
End
Get pvComObject of hoDecryptCert to vDecryptCert
Get ComLastDecryptCert Of hoMime 0 vDecryptCert To iSuccess
If (iSuccess = True) Begin
Get ComSubjectCN Of hoDecryptCert To sTemp1
Showln "**** Decrypt Cert: " sTemp1
End
End
// Display the unwrapped MIME:
Get ComGetMime Of hoMime To sTemp1
Showln sTemp1
// Save the unwrapped MIME to a file:
Get ComSaveMime Of hoMime "unwrappedMime.txt" To iSuccess
End_Procedure