Microsoft XML Core Services (MSXML) 5.0 for Microsoft Office - Digital Signatures

Visual Basic Source: sign.frm

Dim xmldoc As New DOMDocument50
Dim xmldsig As New MXDigitalSignature50
Dim dsigKey As IXMLDSigKey
Dim dataObj As IXMLDOMNode
Dim infile, provType, keyContainer

Const DSIGNS = "xmlns:ds='http://www.w3.org/2000/09/xmldsig#'"
Const PROV_RSA_FULL = 1
' Change this key container name to your own if necessary.
Const RSA_KEY = "MyRSAFullKeys"

Private Function WriteLine(ByVal str As String)
    Text1.Text = Text1.Text + str + vbNewLine
End Function
Private Function writeClear()
    Text1.Text = ""
End Function

Private Function LoadXML(ByVal file As String)
    ' Read input XML file and display the content in the text3.
    Path = App.Path + "\" + file
    xmldoc.async = False
    xmldoc.preserveWhiteSpace = True
    xmldoc.validateOnParse = False
    xmldoc.resolveExternals = False
    If xmldoc.Load(Path) = False Then
        WriteLine "Can't load " + Path
        WriteLine "Reason: " + xmldoc.parseError.reason
        LoadXML = False
        Exit Function
    End If
    xmldoc.setProperty "SelectionNamespaces", DSIGNS
    Set xmldsig.signature = xmldoc.selectSingleNode(".//ds:Signature")
    LoadXML = True
End Function
Private Function SignXML(fwWriteKeyInfo As Long)
    If xmldsig.signature Is Nothing Then
        WriteLine "Invalid signature template."
        SignXML = False
        Exit Function
    End If
    
    If keyContainer = "" Then
        WriteLine "Invalid key container."
        SignXML = False
        Exit Function
    End If
    
    Set oKey = xmldsig.createKeyFromCSP(provType, "", keyContainer, 0)
    If oKey Is Nothing Then
        WriteLine "Invalid key"
        SignXML = False
        Exit Function
    End If
    
    Set oSignedKey = xmldsig.sign(oKey, fwWriteKeyInfo)
    If oSignedKey Is Nothing Then
        WriteLine "sign failed."
        SignXML = False
        Exit Function
    End If
         
    WriteLine "The specified data was signed succesffully."
    WriteLine "Resultant signature: "
    WriteLine xmldoc.xml
    
    SignXML = True
End Function

Private Sub Form_Load()
    'Set text box to use form to determine its width
    'and height when form is loaded
    Text1.Left = 100
    Text1.Top = 100
    Text1.Width = Form1.Width - 350
    Text1.Height = Form1.Height - 750
    
    provType = PROV_RSA_FULL
    keyContainer = RSA_KEY
    infile = "signature_template.sign.rsa.xml"
    
    writeClear
    If LoadXML(infile) = True Then
       WriteLine "Sign with fwWriteKeyInfo = NOKEYINFO:"
       SignXML NOKEYINFO
       
       WriteLine "Sign with fwWriteKeyInfo = KEYVALUE:"
       SignXML KEYVALUE
       
       WriteLine "Sign with fwWriteKeyInfo = CERTIFICATES:"
       SignXML CERTIFICATES
       
       WriteLine "Sign with fwWriteKeyInfo = CERTIFICATES|PURGE:"
       SignXML CERTIFICATES + PURGE
       
       WriteLine "Sign with fwWriteKeyInfo = PURGE:"
       SignXML PURGE
    End If
    
End Sub

Private Sub Form_Resize()
    'Set text box to use form in determining its width and height
    'when form is resized
    Text1.Width = Form1.Width - 350
    Text1.Height = Form1.Height - 750
End Sub

Try It!

  1. Ensure that you have completed all the procedures in Getting Started with XML Digital Signatures.
  2. Copy the XML signature template resource file, and paste it into a text file. Save the file as signature_template.sign.rsa.xml.
  3. Create a Standard EXE project in Visual Basic. Save the empty project as sign.vbp to the same directory where you saved signature_template.sign.rsa.xml. Save the form file as sign.frm.
  4. Create a reference to MSXML 5.0. To do this, select References... from the Project menu, and then check the box for Microsoft XML, v5.0.
  5. Double click on the TextBox icon from the tools menu. A TextBox control will appear on the project's form named "Text1". In the Properties window, set the value for the ScrollBar property to "2 – Vertical" and the value of the MultiLine property to True.
  6. Copy the Visual Basic code listing above, and paste it into the code editor to replace whatever is already there.
  7. Execute the code by selecting Start from the Run menu.
  8. Verify that the output is similar to that listed in the Output topic. You can resize the form as needed to view the output text more easily.