This is a fully standards-compliant XML digital signature created by Open eSignForms software on a test document and test data. As of the 12.9.29 release, it supports XAdES-BES as specified in ETSI TS 101 903 v1.4.1 XML Advanced Electronic Signatures by including the QualifyingProperties, SignedProperties, SignedSignatureProperties, SigningTime, SignedDataObjectProperties and DataObjectFormat elements, as well as signing the ds:KeyInfo element.

It uses our standard format, an Enveloped Signature that encompasses the entire XML source document, the KeyInfo, QualifyingProperties as well as a special Seal containing platform identity information. It was captured on 30 August 2012 on a developer's PC in Kirkland, Washington. It can still be validated by any compliant XML Digital Signature implementation.

<?xml version="1.0" encoding="UTF-8"?>
<snapshots xmlns="http://open.esignforms.com/XMLSchema/2011" timestamp="2012-08-30T17:38:27-07:00"><snapshot xmlns="http://open.esignforms.com/XMLSchema/2011" timestamp="2012-08-30T17:38:27-07:00" type="document"><![CDATA[<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Open eSignForms - Patient information</title>
<meta name="robots" content="noindex, nofollow" />
<meta name="Description" content="Confidential document" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="Generator" content="Yozons Open eSignForms document generator version 12.9.29_pre0830" />
<meta name="DeploymentId" content="c8570129-d24a-4b7f-9ccc-1b0bf55752ff" />
<meta name="TransactionId" content="6cba08c5-d629-4217-898e-0b9cd3c6cb49" />
<meta name="TransactionTemplateId" content="a6d955ad-6d78-4094-8650-a163ad65b412" />
<meta name="TransactionMode" content="Test" />
<meta name="PackageId" content="b071c004-583b-460c-8b71-d30f8916fc51" />
<meta name="PackageVersionId" content="ed82f9f2-e837-4505-9740-33d673b65a76" />
<meta name="PackageVersionPartyName" content="Patient" />
<meta name="DocumentId" content="e314a5ab-9b71-45f1-8757-18b755f67451" />
<meta name="DocumentName" content="Patient information" />
<meta name="DocumentVersionId" content="41572536-7c72-42fa-925c-f154ec5b3dbd" />
<meta name="DocumentVersionPageId" content="66ed454d-51c4-4d09-8b73-06af12b06ed1" />
<meta name="DocumentVersionPartyName" content="Patient" />
<meta name="DocumentPageMode" content="REVIEW" />
<meta name="HtmlRenderTimestamp" content="2012-08-30 17:38:23.567 PDT" />
<meta name="RequestIpAddr" content="127.0.0.1" />
<meta name="RequestUserAgent" content="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.83 Safari/537.1" />
<base href="http://localhost/open-eSignFormsVaadin/" />
<style type="text/css">
/* platform esf.css */
body.esf { font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 1em; }

.esf a img { border: none; }

.esf table.center, .esf div.center { margin-left: auto; margin-right: auto; }

.esf p.left, .esf span.left, .esf div.left { text-align: left; }
.esf p.right, .esf span.right, .esf div.right, .esf td.right { text-align: right; }
.esf p.center, .esf span.center { text-align: center; }
.esf p.justify, .esf span.justify, .esf div.justify { text-align: justify; }

.esf .bottom { vertical-align: bottom; }
.esf .top { vertical-align: top; }
.esf .middle { vertical-align: middle; }

.esf .w5 { width: 5%; }
.esf .w10 { width: 10%; }
.esf .w15 { width: 15%; }
.esf .w20 { width: 20%; }
.esf .w25 { width: 25%; }
.esf .w30 { width: 30%; }
.esf .w33 { width: 33%; }
.esf .w34 { width: 34%; }
.esf .w35 { width: 35%; }
.esf .w40 { width: 40%; }
.esf .w45 { width: 45%; }
.esf .w48 { width: 48%; }
.esf .w50 { width: 50%; }
.esf .w60 { width: 60%; }
.esf .w70 { width: 70%; }
.esf .w75 { width: 75%; }
.esf .w80 { width: 80%; }
.esf .w85 { width: 85%; }
.esf .w90 { width: 90%; }
.esf .w95 { width: 95%; }
.esf .w98 { width: 98%; }
.esf .w100 { width: 100%; }

.esf .boT { border-top: 1px solid black; }
.esf .boB { border-bottom: 1px solid black; }
.esf .boTB { border-top: 1px solid black; border-bottom: 1px solid black; }
.esf .boL { border-left: 1px solid black; }
.esf .boR { border-right: 1px solid black; }
.esf .boLR { border-left: 1px solid black; border-right: 1px solid black; }
.esf .boBdash { border-bottom: 1px dashed black; }
.esf .boBdot { border-bottom: 1px dotted black; }
.esf .boBthick { border-bottom: 4px solid black; }

.esf .box { border: 1px solid black; }
.esf .boxthicker { border: 2px solid black; }
.esf .boxthick { border: 4px solid black; }

.esf .underline { text-decoration: underline; }
.esf .bold { font-weight: bold; }
.esf .italic { font-style: italic; }

.esf .caps { text-transform: uppercase; }
.esf .smallcaps { font-variant: small-caps; }
.esf .lowercase { text-transform: lowercase; }

.esf .f6 { font-size: 6pt; }
.esf .f7 { font-size: 7pt; }
.esf .f8 { font-size: 8pt; }
.esf .f9 { font-size: 9pt; }
.esf .f10 { font-size: 10pt; }
.esf .f11 { font-size: 11pt; }
.esf .f12 { font-size: 12pt; }
.esf .f14 { font-size: 14pt; }
.esf .f16 { font-size: 16pt; }
.esf .f18 { font-size: 18pt; }
.esf .f20 { font-size: 20pt; }
.esf .f22 { font-size: 22pt; }
.esf .f24 { font-size: 24pt; }
.esf .f28 { font-size: 28pt; }
.esf .f32 { font-size: 32pt; }
.esf .f36 { font-size: 36pt; }
.esf .f40 { font-size: 40pt; }
.esf .f48 { font-size: 48pt; }
.esf .f60 { font-size: 60pt; }
.esf .f72 { font-size: 72pt; }
.esf .f96 { font-size: 96pt; }

.esf .red {color: red;}
.esf .green {color: green;}
.esf .blue {color: blue;}
.esf .white {color: white;}
.esf .black {color: black;}
.esf .gray  {color: gray;}

.esf .nomargin { margin: 0; }
.esf .nomarginT { margin-top: 0; }
.esf .nomarginB { margin-bottom: 0; }
.esf .nomarginTB { margin-top: 0; margin-bottom: 0; }
.esf .nomarginL { margin-left: 0; }
.esf .nomarginR { margin-right: 0; }
.esf .nomarginLR { margin-left: 0; margin-right: 0; }
.esf .nowrap { white-space: nowrap; }

.esf div.newPage { border-top: 1px dotted gray; }

.esf div.inline { display: inline-block; }
.esf span.inlineblock { display: inline-block; }

/* The following are generally not useful for a document, but are used in the auto-rendering of fields, labels, errors, etc. Many of these can be set via DocumentStyles in Open ESF. */

/* For the Field Label rendering */
.esf label.normal { } 
.esf label.normal-error { color: red; font-weight: bold; background-color: yellow; } 
.esf label.small { font-size: 8pt; } 
.esf label.small-error { font-size: 8pt; color: red; font-weight: bold; background-color: yellow; } 

.esf span.viewFieldData { width: inherit; } /* when viewing field data -- not in input mode */
.esf span.viewFieldData-error { font-weight: bold; font-style: italic; background-color: pink; border: 2px dashed red; } /* when viewing data that was not known -- not in input mode */

.esf span.labelFieldArea { display: inline-block; } /* sets the width for the label and field area */

.esf span.labelFieldArea span.labelAreaStacked { display: block; white-space: nowrap; }
.esf span.labelFieldArea span.labelAreaRightStacked { display: block; text-align: right; white-space: nowrap; }
.esf span.labelFieldArea span.labelAreaCenterStacked { display: block; text-align: center; white-space: nowrap; }
.esf span.labelFieldArea span.labelArea { display: inline-block; white-space: nowrap; }
.esf span.labelFieldArea span.labelAreaRight { display: inline-block; text-align: right; white-space: nowrap; }
.esf span.labelFieldArea span.labelAreaCenter { display: inline-block; text-align: center; white-space: nowrap; }

.esf span.labelFieldArea span.fieldAreaStacked { display: block; width: 100%; }
.esf span.labelFieldArea span.fieldAreaLeftStacked { display: block; width: 100%; text-align: left; }
.esf span.labelFieldArea span.fieldAreaRightStacked { display: block; width: 100%; text-align: right; }
.esf span.labelFieldArea span.fieldAreaCenterStacked { display: block; width: 100%; text-align: center; }
.esf span.labelFieldArea span.fieldArea { display: inline-block; width: 100%; }
.esf span.labelFieldArea span.fieldAreaLeft { display: inline-block; width: 100%; text-align: left; }
.esf span.labelFieldArea span.fieldAreaRight { display: inline-block; width: 100%; text-align: right; }
.esf span.labelFieldArea span.fieldAreaCenter { display: inline-block; width: 100%; text-align: center; }

.esf span.labelFieldArea span.fieldAreaStackedAuto { display: block; width: auto; }
.esf span.labelFieldArea span.fieldAreaLeftStackedAuto { display: block; width: auto; text-align: left; }
.esf span.labelFieldArea span.fieldAreaRightStackedAuto { display: block; width: auto; text-align: right; }
.esf span.labelFieldArea span.fieldAreaCenterStackedAuto { display: block; width: auto; text-align: center; }
.esf span.labelFieldArea span.fieldAreaAuto { display: inline-block; width: auto; }
.esf span.labelFieldArea span.fieldAreaLeftAuto { display: inline-block; width: auto; text-align: left; }
.esf span.labelFieldArea span.fieldAreaRightAuto { display: inline-block; width: auto; text-align: right; }
.esf span.labelFieldArea span.fieldAreaCenterAuto { display: inline-block; width: auto; text-align: center; }

.esf span.fieldArea { display: inline-block; }
.esf span.fieldAreaLeft { display: inline-block; text-align: left; }
.esf span.fieldAreaRight { display: inline-block; text-align: right; }
.esf span.fieldAreaCenter { display: inline-block; text-align: center; }

/* For signature/initials display */
.esf .signature, .esf .signature input { font-family: 'Bradley Hand ITC', 'Lucida Handwriting', 'Comic Sans MS', cursive; font-size: 14pt; font-weight: bold; font-style: italic; color: blue; }
.esf div.signatureBlock { border: 3px solid #9899c4; border-radius: 10px; background-color: #efffff; padding: 0px 5px 5px 15px; width: 700px; }
.esf .signatureMetadata { font-size: 10pt; font-family: 'Courier New', Courier, monospace; }

/* For optional/required/error input fields; uses span.viewFieldData for showing the data when in non-edit mode */
.esf input.required { background-color: #FFFFE7; font-weight: bold; border: 1px solid #7F9DB9; width: inherit; }
.esf input.optional { background-color: white; font-weight: bold; border: 1px solid #7F9DB9; width: inherit; }
.esf input.error { background-color: #FFC0CB; font-weight: bold; border: 1px solid red; width: inherit; }
.esf select.required { background-color: #FFFFE7; font-weight: bold; border: 1px solid #7F9DB9; width: inherit; }
.esf select.optional { background-color: white; font-weight: bold; border: 1px solid #7F9DB9; width: inherit; }
.esf select.error { background-color: #FFC0CB; font-weight: bold; border: 1px solid red; width: inherit; }
.esf textarea.required { background-color: #FFFFE7; font-weight: bold; border: 1px solid #7F9DB9; width: inherit; }
.esf textarea.optional { background-color: white; font-weight: bold; border: 1px solid #7F9DB9; width: inherit; }
.esf textarea.error { background-color: #FFC0CB; font-weight: bold; border: 1px solid red; width: inherit; }
/* Special override for optional checkboxes to not have a border around them */
.esf input[type="checkbox"].required { border: 0 none !important; outline-color: #FFFFE7; outline-style: solid; outline-width: medium; }
.esf input[type="checkbox"].optional { border: 0 none !important; }
.esf input[type="checkbox"].error { outline: 1px solid red; }
/* Special override for optional radio to not have a border around them */
.esf input[type="radio"].required { border: 0 none !important; outline-color: #FFFFE7; outline-style: solid; outline-width: medium; }
.esf input[type="radio"].optional { border: 0 none !important; }
.esf input[type="radio"].error { outline: 1px solid red; }
.esf input[type="radio"] { margin-bottom: 3px; } /* push it up a bit so fits with label better */

/* For buttons */
.esf p.buttons { margin-top: 1em; margin-left: 2em; white-space: nowrap; }
.esf p.buttons input { margin-right: 2em; font-size: 1.1em; padding: 5px 10px; }
.esf p.buttons input.caution { color: #FF8000; }
.esf p.buttons input.preferredFlow { font-weight: bold; color: green; font-size: 1.3em; padding: 8px 15px; }

.esf input.small { font-size: 8pt; }
.esf input.upload { color: green; }

/* For GWTException standard display of ErrorEntry[] arrays from Errors */
.esf ul.errorEntryArea { border: 1px solid blue; background-color: #FDE8A5; width: 90%; padding-top: 2px; padding-bottom: 2px; }
.esf li.error-ErrorEntry { list-style-type: circle; font-size: 1em; font-weight: bold; color: red; margin-left: 0px; margin-right: 1em; }
.esf li.warning-ErrorEntry { list-style-type: circle; font-size: 1em; font-weight: bold; color: blue; margin-left: 0px; margin-right: 1em; }
.esf li.success-ErrorEntry { list-style-type: circle; font-size: 1em; font-weight: bold; color: green; margin-left: 0px; margin-right: 1em; }
.esf li.info-ErrorEntry { list-style-type: circle; font-size: 1em; font-weight: bold; color: black; margin-left: 0px; margin-right: 1em; }

/* Used for multi-line reports to separate them like "greenbar paper" of old */
.esf .bgGreenbarLight { background-color: transparent; }
.esf .bgGreenbarDark { background-color: #E8E6E6; }

.esf span.jspfooter { font-size: 8pt; color: gray; }

@media print { 
	body.esf { margin: 0; padding: 0; font-size: 90%; }
	.esf div.newPage { border-top: none; page-break-after: always; }
	.esf a.showURL:link:after, a.showURL:visited:after { content: " (" attr(href) ")"; font-size: 90%; }
}

/* Begin document style id: 95d0b471-8507-4327-96bc-f306dbdf679c, version id: e4dd5299-8f11-4c1f-b1ca-74c85fddcde3 */
body.esf, body.e4dd5299_8f11_4c1f_b1ca_74c85fddcde3, div.e4dd5299_8f11_4c1f_b1ca_74c85fddcde3 { font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 11pt;    } 
.esf .e4dd5299_8f11_4c1f_b1ca_74c85fddcde3 span.signature { font-family: 'Bradley Hand ITC', 'Lucida Handwriting', 'Comic Sans MS', cursive; font-size: 14pt; color: blue; font-style: italic; font-weight: bold; font-variant: normal; text-transform: inherit;  } 
.esf .e4dd5299_8f11_4c1f_b1ca_74c85fddcde3 span.signature input { font-family: 'Bradley Hand ITC', 'Lucida Handwriting', 'Comic Sans MS', cursive; font-size: 14pt; color: blue; font-style: italic; font-weight: bold; font-variant: normal; text-transform: inherit;  } 
.esf .e4dd5299_8f11_4c1f_b1ca_74c85fddcde3 span.viewFieldData {      } 
.esf .e4dd5299_8f11_4c1f_b1ca_74c85fddcde3 input[type='checkbox'].required { border: 0 none !important; outline-color: #FFFFE7;; outline-style: solid; outline-width: medium; } 
.esf .e4dd5299_8f11_4c1f_b1ca_74c85fddcde3 input[type='radio'].required { border: 0 none !important; outline-color: #FFFFE7;; outline-style: solid; outline-width: medium; } 
.esf .e4dd5299_8f11_4c1f_b1ca_74c85fddcde3 input.required {    font-style: normal; font-weight: bold; font-variant: normal; text-transform: inherit; background-color: #FFFFE7; border: 1px solid #7F9DB9; } 
.esf .e4dd5299_8f11_4c1f_b1ca_74c85fddcde3 select.required {    font-style: normal; font-weight: bold; font-variant: normal; text-transform: inherit; background-color: #FFFFE7; border: 1px solid #7F9DB9; } 
.esf .e4dd5299_8f11_4c1f_b1ca_74c85fddcde3 textarea.required {    font-style: normal; font-weight: bold; font-variant: normal; text-transform: inherit; background-color: #FFFFE7; border: 1px solid #7F9DB9; } 
.esf .e4dd5299_8f11_4c1f_b1ca_74c85fddcde3 input.optional {    font-style: normal; font-weight: bold; font-variant: normal; text-transform: inherit; background-color: white; border: 1px solid #7F9DB9; } 
.esf .e4dd5299_8f11_4c1f_b1ca_74c85fddcde3 select.optional {    font-style: normal; font-weight: bold; font-variant: normal; text-transform: inherit; background-color: white; border: 1px solid #7F9DB9; } 
.esf .e4dd5299_8f11_4c1f_b1ca_74c85fddcde3 textarea.optional {    font-style: normal; font-weight: bold; font-variant: normal; text-transform: inherit; background-color: white; border: 1px solid #7F9DB9; } 
.esf .e4dd5299_8f11_4c1f_b1ca_74c85fddcde3 input[type='checkbox'].error { border: 0 none !important; outline: 1px solid red; } 
.esf .e4dd5299_8f11_4c1f_b1ca_74c85fddcde3 input[type='radio'].error { border: 0 none !important; outline: 1px solid red; } 
.esf .e4dd5299_8f11_4c1f_b1ca_74c85fddcde3 input.error {    font-style: normal; font-weight: bold; font-variant: normal; text-transform: inherit; background-color: #FFC0CB; border: 1px solid red; } 
.esf .e4dd5299_8f11_4c1f_b1ca_74c85fddcde3 select.error {    font-style: normal; font-weight: bold; font-variant: normal; text-transform: inherit; background-color: #FFC0CB; border: 1px solid red; } 
.esf .e4dd5299_8f11_4c1f_b1ca_74c85fddcde3 textarea.error {    font-style: normal; font-weight: bold; font-variant: normal; text-transform: inherit; background-color: #FFC0CB; border: 1px solid red; } 
.esf .e4dd5299_8f11_4c1f_b1ca_74c85fddcde3 label.normal {      } 
.esf .e4dd5299_8f11_4c1f_b1ca_74c85fddcde3 label.normal-error {   color: red; font-style: normal; font-weight: bold; font-variant: normal; text-transform: inherit; background-color: yellow; } 
.esf .e4dd5299_8f11_4c1f_b1ca_74c85fddcde3 label.small {  font-size: 8pt;    } 
.esf .e4dd5299_8f11_4c1f_b1ca_74c85fddcde3 label.small-error {  font-size: 8pt; color: red; font-style: normal; font-weight: bold; font-variant: normal; text-transform: inherit; background-color: yellow; } 
/* End document style */
</style>
<script type="text/javascript">
(function() {
	// If not defined yet, ensure our top "JavaScript namespace" variable 'esf' is created.
	if ( typeof esf == "undefined" ) {
		esf = {
			version: {
				major: 12, minor: 8, update: "4",
				toString: function(){
					with(esf.version){
						return major + "." + minor + "." + update;
					}
				}
			},
			appname: "Open eSignForms",
			htmlCopyright: "© 2012 Yozons, Inc.",
			textCopyright: "Copyright (c) 2009-2012 Yozons, Inc."
		};
		
		esf.getRelease = function(){
			return this.appname + " " + this.version.toString();
		};
		
		if ( typeof console != "undefined") console.log(esf.getRelease() + " - " + esf.textCopyright);

		esf.hideAllSubmitInputFields = function() {
		  if ( document.getElementsByTagName )
		  {
		   	var inputFields = document.getElementsByTagName("input");
		   	for( var i=0; i < inputFields.length; ++i )	{
		   	  if ( inputFields[i].type == "submit" )
		   	      esf.makeInvisible(inputFields[i]);
		   	}
		   	var buttonFields = document.getElementsByTagName("button");
		   	for( var i=0; i < buttonFields.length; ++i ) {
		   		esf.makeInvisible(buttonFields[i]);
		   	}
		   	return true;
		  }
		};
		
		esf.displayById = function(id){
			if ( document.getElementById && document.getElementById(id) )
				esf.display(document.getElementById(id));
		};
		
		esf.display = function(elem){
			if ( elem && elem.style )
				elem.style.display = "block";
		};
		
		esf.hideById = function(id){
			if ( document.getElementById && document.getElementById(id) )
				esf.hide(document.getElementById(id));
		};
		
		esf.hide = function(elem){
			if ( elem && elem.style )
				elem.style.display = "none";
		};
		
		esf.makeVisibleById = function(id){
			if ( document.getElementById && document.getElementById(id) )
				esf.makeVisible(document.getElementById(id));
		};
		
		esf.makeVisible = function(elem){
		  if ( elem && elem.style )
		  	elem.style.visibility = 'visible';
		};
		
		esf.makeInvisibleById = function(id){
			if ( document.getElementById && document.getElementById(id) )
				esf.makeInvisible(document.getElementById(id));
		};
		
		esf.makeInvisible = function(elem){
		  if ( elem && elem.style )
		  	elem.style.visibility = 'hidden';
		};
		
		esf.ensureTopWindow = function(){
		  if (window != window.top)
			top.location.href = location.href;
		};
		
		esf.setAllCheckboxesByName = function(name,b){
		  if ( document.getElementsByName ) {
		   	var checkboxes = document.getElementsByName(name);
		   	for( var i=0; i < checkboxes.length; ++i ) {
		   	  if ( checkboxes[i].type == "checkbox" )
		   	      checkboxes[i].checked = b;
		   	}
		  }
		};
		
		esf.containsSpace = function(s){
			if ( s == null )
				return false;
			i = 0;
			while( i < s.length ) {
				if ( s.charAt(i) == ' ' )
					return true;
				++i;
			}
		
			return false;
		};
		
		esf.isOnlyNumbers = function(s){
			if ( s == null )
				return false;
			var i = 0;
			while( i < s.length ) {
				if ( "0123456789".indexOf(s.charAt(i)) < 0 )
					return false;
				i++;
			}
			return true;
		};
		
		esf.countCharInString = function(s,c){
			var num=0;
			var at=s.indexOf(c);
		    while(at>=0) {
				++num;
				at=s.indexOf(c,++at);
			}
			return num;
		};
		
		// Trims whitespace from the front and end of a string
		esf.trimSpace = function(s){
			if ( s == null || s.length == 0 )
				return s;
		
			var beginIndex = 0;
			var endIndex   = s.length - 1;
			while( beginIndex < s.length && s.charAt(beginIndex) == ' ' )
				++beginIndex;
			while( endIndex >= 0 && s.charAt(endIndex) == ' ' )
				--endIndex;	
			++endIndex;
			
			if ( beginIndex >= endIndex )
				return '';
				
			return s.substring(beginIndex,endIndex);
		};
		
		esf.isValidEmail = function(addr,doalert){
			if (addr.indexOf("..") >= 0 ) {
				doalert && alert("Your email address contains invalid double dot '..' characters.");
				return false;
			}
		
			var at=addr.lastIndexOf("@");
			if (at < 0 ) {
				doalert && alert("Your email address is missing the '@' character. Please check the user name, '@' sign and host name.");
				return false;
			}
			if (at == 0 ) {
				doalert && alert("Your email address begins with your email name, not the '@' character. Please check the user name, '@' sign and host name.");
				return false;
			}
			if ( esf.countCharInString(addr,"@") > 1 ) {
				doalert && alert("Your email address has more than one '@' character. There should only be one, like 'myname@example.com'. Please check the user name, '@' sign and host name.");
				return false;
			}
		
			var username = addr.substring(0,at);
			if ( username == null || username.length < 1 ) {
				doalert && alert("Your email address is missing a user name before the '@' character. Please check the user name, '@' sign and host name.");
				return false;
			}
			if ( esf.containsSpace(username) ) {
				doalert && alert("Your email user name should not contain any spaces. Please check the user name, '@' sign and host name.");
				return false;
			}
		
			var hostname = addr.substring(at+1);
			if ( hostname == null || hostname.length < 4 ) {
				doalert && alert("Your email address is missing a host name after the '@' character. Please check the user name, '@' sign and host name.");
				return false;
			}
			if ( esf.containsSpace(hostname) ) {
				doalert && alert("Your email host name should not contains any spaces. Please check the user name, '@' sign and host name.");
				return false;
			}
		
			var dot = hostname.lastIndexOf(".");
			if ( dot < 1 ) {
				doalert && alert("Your email host name should have a '.' separator, like 'example.com'. Please check the user name, '@' sign and host name.");
				return false;
			}
		
			var tld = hostname.substring(dot+1);
			if ( tld == null || tld.length < 2 || tld.length > 6 ) {
				doalert && alert("Your email address is missing a .com or .net suffix, like 'example.COM'. Please check the user name, '@' sign and host name.");
				return false;
			}
		
			return true; 
		};
	}
})();
</script>
</head>
<body class="esf">
<div id="X66ed454d_51c4_4d09_8b73_06af12b06ed1" class="e4dd5299_8f11_4c1f_b1ca_74c85fddcde3">
<div style="background-color: pink; text-align: center; width: 100%;">* * *   T E S T   T R A N S A C T I O N   * * *</div>



<p><span class="labelFieldArea bottom" style="width: 100%;"><span class="labelAreaStacked"><label class="small">First name: </label></span><span class="bottom fieldArea " >Tom</span></span> <span class="labelFieldArea bottom" style="width: 100%;"><span class="labelAreaStacked"><label class="small">Last name: </label></span><span class="bottom fieldArea " >Gonser</span></span></p>
<p><span class="labelFieldArea bottom" style="width: 100%;"><span class="labelAreaStacked"><label class="small">Doctor: </label></span><span class="bottom fieldArea " ></span></span></p>
<p><span class="labelFieldArea bottom" style="width: 100%;"><span class="labelAreaStacked"><label class="small">DoctorPhone: </label></span><span class="bottom fieldArea " > </span></span></p>



</div>
</body>
</html>
]]><Signature xmlns="http://www.w3.org/2000/09/xmldsig#" Id="OpenESignForms_Seal"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/><SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha512"/><Reference Id="Payload_Reference_ID" URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"/><DigestValue>BFF/73RUhECnPSHpP1L+OjA+boreAJwrn28Bb5Hq3IMemwJFaTRVYq7jP4Ea9uu9bWCTcSy9/UXY
n5W1bXgjVA==</DigestValue></Reference><Reference URI="#KeyInfo_ID"><DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"/><DigestValue>b6iXTPzoT55NtN6F+aFFdbRWStEthCBFmzwPAVnC3Tn8AkmSepvioD14uIeyj80crQ+RLvLXPccJ
CMfThuV6oQ==</DigestValue></Reference><Reference URI="#QualifyingProperties_ID"><DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"/><DigestValue>FX05yiVY9xf+wW9/e6+QmhS0RGk7gawmt9/TSoXnylf/KXoLuTmJbhc7wdgJX5kVcCpeTwxJ7rLG
m3MuhJJeAg==</DigestValue></Reference><Reference URI="#OpenESignForms_Seal_ID"><DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"/><DigestValue>oYyKxXl3smEQXE8acnKWcg7LXdotdBjcfVdskaX2G1rtsE1dJMnGR2x+TO8strbIkKcGbVYuPQdZ
OCF+KB0+8A==</DigestValue></Reference></SignedInfo><SignatureValue>l2XcZacb843qqXxKTRjw25v9bU2o5qGwlNfbH2oLM4dbc9gwSN7gUPnC+8Z6VG+Ync8UhaA5kkuR
gOQmz9s+z9L2/4aU1yqhuEsSWVe2QuTOW1uUhQgVi7VEoAbbdqgK7wlOKMXE30bnG5GOqkO1KZtR
TXdozi2KJH+iP5IsDgRlL5bg0xTs7N4XpslPpGO7gzJ9L1/DpBpTkx/uWjaRIxxlP8p2rwkJ1yJh
0qf/tqUExNnhqUhZXiFnIIkf1O3mQ1bTCP1f1sYHcAg+U9ffAd8hau/4qooD/Rw+WTVa8r+WHvBM
ySlwoonkzQn6G0xmIZMzZCCw8sA1X1LzSdxZqdXwsedmPEFhHYrqTaeguAP+D1wRSzVrI/+T6sCl
tZ27AXExRzqmGvl2r1P+UaHaontIhYNL69r99A6CCERfKZeg7j2mAcGDU1OJ7ArQtXK63hgBRvGN
KKA2gERaX3Ig+VlbeEhrJFsCsxlVSexM+3u/1cz3n7kIpl0kEvPvbzQaLghBRHX/b8KJyuX+8AgI
2O9T156LRLkkYtM3HautuVluEveGH0Mxf4QOgYZrcuWcI5wa8TCjzX1Q4WapfssSyY7zrDMpdkd6
JcmGReE9UTEe/P9/I8prcSOfa1B/bLd5GFjcJv7g7BGe/1d/MDkyiSKj8GebFhTKSuRMr/RFlPo=</SignatureValue><KeyInfo Id="KeyInfo_ID"><KeyName>23025bbf-0489-4044-a330-9cdeca373ddf</KeyName><KeyValue><RSAKeyValue><Modulus>t5RZeG3UJQ9s55iBv1fZkIk79GPQGWCTF+Y9ViApTrZHsjDmX9/6nvQ8veCIWLdOq13xBT6lPEQs
xvarkw1K7XdRHJ7ouyLscWHW7kaSZTe7VaXCZlP9g+M/kzJntQJpTEwzkHn5rbqK/7beEmOt0xsp
r5PHLGrhPVxwUFXdvH6uCrpwdA5sPEqL1iSs8VzWdnIgccZ/49asM3ISCfGEpFjgcCdBNfa9SKau
Gs796pla0Z2SFwA81FIpMgfJe0wntmrB/+Pfbr5znpDeTzbZ/B+p1sLrRYbv9ZY1KH+gD8nMIxBi
gk2Wa+x1CMIHELVKXfxD7+ODv6s2/1n3i2UKKZ9hI8IGqb5CYhdfDkR4jFtFOzpANI/n1dwUNrC4
D1OImleTL+o8q6SNuoS+q4SVtatQNwIVmVmLWtWNq+yqGNARIN8MoLTpUz3Kib9kCg8HQQWe0Hyt
7AN1XaNkFcAaKAz65nm5FnXuGeV2zTnMUVPzuwCnI8336P5apLaLaLRN/M37ZXadVPzPDmjNJexO
ieu68MPGZBX1zSQOkOT7WBNsm/uLHwgVCf2RrkmoLNLCQDu1s2aqPVNbJrLphEg08/DGFPq+7mmb
bKWCvX03Rfx8jWuxPvCUoDXWKVvAA6g6Fz8j48+B5E168m8W5khI7d6IPV0FYcaX4YHOxSVWGhc=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue></KeyValue><X509Data><X509Certificate>MIIKnTCCCIWgAwIBAgIJAOW7Oqz5h7nMMA0GCSqGSIb3DQEBDQUAMIHIMT8wPQYDVQQDDDZPcGVu
X2VTaWduRm9ybXNfaHR0cDovL2xvY2FsaG9zdC9vcGVuLWVTaWduRm9ybXNWYWFkaW4xOjA4BgNV
BAoMMURlcGxveW1lbnRJRC9jODU3MDEyOS1kMjRhLTRiN2YtOWNjYy0xYjBiZjU1NzUyZmYxPDA6
BgNVBAsMM1NpZ25hdHVyZUtleUlELzIzMDI1YmJmLTA0ODktNDA0NC1hMzMwLTljZGVjYTM3M2Rk
ZjELMAkGA1UEBhMCVVMwHhcNMTEwNzI1MTgwNjI1WhcNMjEwNzI1MTgwNjI1WjCByDE/MD0GA1UE
Aww2T3Blbl9lU2lnbkZvcm1zX2h0dHA6Ly9sb2NhbGhvc3Qvb3Blbi1lU2lnbkZvcm1zVmFhZGlu
MTowOAYDVQQKDDFEZXBsb3ltZW50SUQvYzg1NzAxMjktZDI0YS00YjdmLTljY2MtMWIwYmY1NTc1
MmZmMTwwOgYDVQQLDDNTaWduYXR1cmVLZXlJRC8yMzAyNWJiZi0wNDg5LTQwNDQtYTMzMC05Y2Rl
Y2EzNzNkZGYxCzAJBgNVBAYTAlVTMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAt5RZ
eG3UJQ9s55iBv1fZkIk79GPQGWCTF+Y9ViApTrZHsjDmX9/6nvQ8veCIWLdOq13xBT6lPEQsxvar
kw1K7XdRHJ7ouyLscWHW7kaSZTe7VaXCZlP9g+M/kzJntQJpTEwzkHn5rbqK/7beEmOt0xspr5PH
LGrhPVxwUFXdvH6uCrpwdA5sPEqL1iSs8VzWdnIgccZ/49asM3ISCfGEpFjgcCdBNfa9SKauGs79
6pla0Z2SFwA81FIpMgfJe0wntmrB/+Pfbr5znpDeTzbZ/B+p1sLrRYbv9ZY1KH+gD8nMIxBigk2W
a+x1CMIHELVKXfxD7+ODv6s2/1n3i2UKKZ9hI8IGqb5CYhdfDkR4jFtFOzpANI/n1dwUNrC4D1OI
mleTL+o8q6SNuoS+q4SVtatQNwIVmVmLWtWNq+yqGNARIN8MoLTpUz3Kib9kCg8HQQWe0Hyt7AN1
XaNkFcAaKAz65nm5FnXuGeV2zTnMUVPzuwCnI8336P5apLaLaLRN/M37ZXadVPzPDmjNJexOieu6
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</X509Certificate></X509Data></KeyInfo><Object><QualifyingProperties Id="QualifyingProperties_ID"><SignedProperties><SignedSignatureProperties><SigningTime>2012-08-30T17:38:27-07:00</SigningTime></SignedSignatureProperties><SignedDataObjectProperties><DataObjectFormat ObjectReference="#Payload_Reference_ID"><Description>document.html</Description><MimeType>text/html</MimeType></DataObjectFormat></SignedDataObjectProperties></SignedProperties></QualifyingProperties></Object><Object><SignatureProperties><SignatureProperty Id="OpenESignForms_Seal_ID" Target="#OpenESignForms_Seal"><OpenESignForms_XmlDigitalSignatureSeal DeploymentHostAddress="192.168.1.3" DeploymentHostName="DavidHP2009" DeploymentId="c8570129-d24a-4b7f-9ccc-1b0bf55752ff" SignerAddress="127.0.0.1" SignerAgent="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.83 Safari/537.1" Timestamp="2012-08-30T17:38:27-07:00" Version="12.9.29_pre0830"/></SignatureProperty></SignatureProperties></Object></Signature></snapshot><snapshot xmlns="http://open.esignforms.com/XMLSchema/2011" timestamp="2012-08-30T17:38:27-07:00" type="data"><esfRecord xmlns="http://open.esignforms.com/XMLSchema/2009">
 <id>faf314af-ea3d-43c5-9693-d49fac4d49cf</id>
 <esfname>ArizonaMMA</esfname>
 <encrypt>true</encrypt>
 <compress>true</compress>
<nameValues count="5">
 <nameValue type="html">
  <name>messageToPatient</name>
  <value null="true"/>
 </nameValue>
 <nameValue>
  <name>lastName</name>
  <value>Gonser</value>
 </nameValue>
 <nameValue clone="false">
  <name>firstName</name>
  <value>Tom</value>
 </nameValue>
 <nameValue>
  <name>doctorPhone</name>
  <value null="true"/>
 </nameValue>
 <nameValue>
  <name>doctorEmail</name>
  <value null="true"/>
 </nameValue>
</nameValues>
</esfRecord>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#" Id="OpenESignForms_Seal"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/><SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha512"/><Reference Id="Payload_Reference_ID" URI=""><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"/><DigestValue>u1+vNn4JlUJPh3BnPU5tXbDykUKjh3rd/DNWpbI2vnqCAZ2qB2NKGcNjN+OJHniRilzW7WBJVGLt
F1pymHAofQ==</DigestValue></Reference><Reference URI="#KeyInfo_ID"><DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"/><DigestValue>b6iXTPzoT55NtN6F+aFFdbRWStEthCBFmzwPAVnC3Tn8AkmSepvioD14uIeyj80crQ+RLvLXPccJ
CMfThuV6oQ==</DigestValue></Reference><Reference URI="#QualifyingProperties_ID"><DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"/><DigestValue>ZXVe7v1gTdwVXIW5h3JPnEW4x4/6i3UUWhFDMyNC5pF0X4Mxwv50vBPaDeswX6jKd21vDzWwSdIB
Kq9jz5Eebg==</DigestValue></Reference><Reference URI="#OpenESignForms_Seal_ID"><DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"/><DigestValue>0jA+TBlcb3IEJrqGrDOi+cA/W2/BxF5H1/K4X7cD5i/rO5YttJBMNbNbvvdHBYDgHEm1+4W7VAin
sah9+/oh1Q==</DigestValue></Reference></SignedInfo><SignatureValue>ap5SqkTMFb7nwMC3b06+4sb3dVsV2PYRhhkpl+KpHzuPTjNgcm5OmvApVimBNxNfF4jdDxGoKfDp
yZwwJI6DS0z1E/wV8r/8kDK9qDmD1/RGda9q2jXEX5u/fe2bhHeh1ZJOkbkcA64m5z/7qVuMlD50
3dVYx7SnJdS+A/emed/+b/RJkK69ZJcp4FCgsJN0nvAgVkdEE84abOozQTpHczGtsr8RltkIYtT6
HOJWmeLoUOz00mm/vmiCgh56xpG8xl0h9rbIhiZyWbr06M1NABX0MSSxT3HkogFZOF9KMr75BoUW
97+tQjZi0Jb7Gm3jOTm8BVwWMYIa1RusQjEcjKQvWSErRlwnviJ3GAa+eiaFj5GEhaJ4Yv49XL5w
PdT0XdHzzJZo8uGG47lDD5B1bFfKBK08CV1meU+0FEDBal1wJqkTo7XsXKn/LgIA4ym4yZ47mvxX
Yj1TS3D0Lj0tXULHZ4apDre+/EP/DkrVj+ku8j7qmNtq4btoJDK/3ypYtZ6bkeo8MOPHa+tZNCfp
wvbDdMck3CDCTdjBMFcUd0y8xlw+CGWEeyysSQxns8/qgNlavKh4LsAmtprp16zw2pOpypi04GsP
RTZVCZNolOS2ttQ91NRi7wn0nX8Iwu1b5lU284Nxqr0S3FkGUeTsnRHsZwIbS9h9blb9r4ppHz4=</SignatureValue><KeyInfo Id="KeyInfo_ID"><KeyName>23025bbf-0489-4044-a330-9cdeca373ddf</KeyName><KeyValue><RSAKeyValue><Modulus>t5RZeG3UJQ9s55iBv1fZkIk79GPQGWCTF+Y9ViApTrZHsjDmX9/6nvQ8veCIWLdOq13xBT6lPEQs
xvarkw1K7XdRHJ7ouyLscWHW7kaSZTe7VaXCZlP9g+M/kzJntQJpTEwzkHn5rbqK/7beEmOt0xsp
r5PHLGrhPVxwUFXdvH6uCrpwdA5sPEqL1iSs8VzWdnIgccZ/49asM3ISCfGEpFjgcCdBNfa9SKau
Gs796pla0Z2SFwA81FIpMgfJe0wntmrB/+Pfbr5znpDeTzbZ/B+p1sLrRYbv9ZY1KH+gD8nMIxBi
gk2Wa+x1CMIHELVKXfxD7+ODv6s2/1n3i2UKKZ9hI8IGqb5CYhdfDkR4jFtFOzpANI/n1dwUNrC4
D1OImleTL+o8q6SNuoS+q4SVtatQNwIVmVmLWtWNq+yqGNARIN8MoLTpUz3Kib9kCg8HQQWe0Hyt
7AN1XaNkFcAaKAz65nm5FnXuGeV2zTnMUVPzuwCnI8336P5apLaLaLRN/M37ZXadVPzPDmjNJexO
ieu68MPGZBX1zSQOkOT7WBNsm/uLHwgVCf2RrkmoLNLCQDu1s2aqPVNbJrLphEg08/DGFPq+7mmb
bKWCvX03Rfx8jWuxPvCUoDXWKVvAA6g6Fz8j48+B5E168m8W5khI7d6IPV0FYcaX4YHOxSVWGhc=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue></KeyValue><X509Data><X509Certificate>MIIKnTCCCIWgAwIBAgIJAOW7Oqz5h7nMMA0GCSqGSIb3DQEBDQUAMIHIMT8wPQYDVQQDDDZPcGVu
X2VTaWduRm9ybXNfaHR0cDovL2xvY2FsaG9zdC9vcGVuLWVTaWduRm9ybXNWYWFkaW4xOjA4BgNV
BAoMMURlcGxveW1lbnRJRC9jODU3MDEyOS1kMjRhLTRiN2YtOWNjYy0xYjBiZjU1NzUyZmYxPDA6
BgNVBAsMM1NpZ25hdHVyZUtleUlELzIzMDI1YmJmLTA0ODktNDA0NC1hMzMwLTljZGVjYTM3M2Rk
ZjELMAkGA1UEBhMCVVMwHhcNMTEwNzI1MTgwNjI1WhcNMjEwNzI1MTgwNjI1WjCByDE/MD0GA1UE
Aww2T3Blbl9lU2lnbkZvcm1zX2h0dHA6Ly9sb2NhbGhvc3Qvb3Blbi1lU2lnbkZvcm1zVmFhZGlu
MTowOAYDVQQKDDFEZXBsb3ltZW50SUQvYzg1NzAxMjktZDI0YS00YjdmLTljY2MtMWIwYmY1NTc1
MmZmMTwwOgYDVQQLDDNTaWduYXR1cmVLZXlJRC8yMzAyNWJiZi0wNDg5LTQwNDQtYTMzMC05Y2Rl
Y2EzNzNkZGYxCzAJBgNVBAYTAlVTMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAt5RZ
eG3UJQ9s55iBv1fZkIk79GPQGWCTF+Y9ViApTrZHsjDmX9/6nvQ8veCIWLdOq13xBT6lPEQsxvar
kw1K7XdRHJ7ouyLscWHW7kaSZTe7VaXCZlP9g+M/kzJntQJpTEwzkHn5rbqK/7beEmOt0xspr5PH
LGrhPVxwUFXdvH6uCrpwdA5sPEqL1iSs8VzWdnIgccZ/49asM3ISCfGEpFjgcCdBNfa9SKauGs79
6pla0Z2SFwA81FIpMgfJe0wntmrB/+Pfbr5znpDeTzbZ/B+p1sLrRYbv9ZY1KH+gD8nMIxBigk2W
a+x1CMIHELVKXfxD7+ODv6s2/1n3i2UKKZ9hI8IGqb5CYhdfDkR4jFtFOzpANI/n1dwUNrC4D1OI
mleTL+o8q6SNuoS+q4SVtatQNwIVmVmLWtWNq+yqGNARIN8MoLTpUz3Kib9kCg8HQQWe0Hyt7AN1
XaNkFcAaKAz65nm5FnXuGeV2zTnMUVPzuwCnI8336P5apLaLaLRN/M37ZXadVPzPDmjNJexOieu6
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</X509Certificate></X509Data></KeyInfo><Object><QualifyingProperties Id="QualifyingProperties_ID"><SignedProperties><SignedSignatureProperties><SigningTime>2012-08-30T17:38:28-07:00</SigningTime></SignedSignatureProperties><SignedDataObjectProperties><DataObjectFormat ObjectReference="#Payload_Reference_ID"><Description>document.xml</Description><MimeType>application/xml</MimeType></DataObjectFormat></SignedDataObjectProperties></SignedProperties></QualifyingProperties></Object><Object><SignatureProperties><SignatureProperty Id="OpenESignForms_Seal_ID" Target="#OpenESignForms_Seal"><OpenESignForms_XmlDigitalSignatureSeal DeploymentHostAddress="192.168.1.3" DeploymentHostName="DavidHP2009" DeploymentId="c8570129-d24a-4b7f-9ccc-1b0bf55752ff" SignerAddress="127.0.0.1" SignerAgent="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.83 Safari/537.1" Timestamp="2012-08-30T17:38:28-07:00" Version="12.9.29_pre0830"/></SignatureProperty></SignatureProperties></Object></Signature></snapshot></snapshots>

This explains the XML digital signature portion in a bit more detail:

<!-- The XML digital signature encompasses everything in the 
     <snapshot> element except for the <Signature> element itself, 
     though the <KeyInfo>, <QualifyingProperties> and <SignatureProperty> are included. -->
     
<snapshot xmlns="http://open.esignforms.com/XMLSchema/2011" timestamp="2012-08-29T11:11:18-07:00" type="document">

  <!-- Standard XML Digital Signature inserted into the XML data via Open eSignForms -->
  <Signature xmlns="http://www.w3.org/2000/09/xmldsig#" Id="OpenESignForms_Seal">
    <SignedInfo>
      <!-- Uniform XML formatting before signature is applied -->
      <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/> 

      <!-- We use 4096-bit RSA public/private keypairs, managed by the server, with encrypted private key storage. 
           We do use SHA-512 for data digests and the digital signature itself. -->
      <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha512"/> 

      <!-- The "empty" URI points to the root element, in this case <snapshot>, 
           and its contents in full -->
      <Reference Id="Payload_Reference_ID" URI="">
        <Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/></Transforms>
        <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"/>
        <DigestValue>WxP9sAnTprRzdIklU8dq7Qgb384FyO/f1fjjQXNNYsWPxSzALuz4oFoEAE7FtqJKWpIfm9yklLwmD2MQMCOKvw==</DigestValue>
      </Reference>
        
      <!-- We sign the KeyInfo to prevent key substitution per XAdES -->
      <Reference URI="#KeyInfo_ID">
        <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"/>
        <DigestValue>b6iXTPzoT55NtN6F+aFFdbRWStEthCBFmzwPAVnC3Tn8AkmSepvioD14uIeyj80crQ+RLvLXPccJCMfThuV6oQ==</DigestValue>
      </Reference>
        
      <!-- We sign the QualifyingProperties per XAdES -->
      <Reference URI="#QualifyingProperties_ID">
        <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"/>
        <DigestValue>cap+k/NPGDJVyE9wM09Nh0YV60cHg+XY2z4PYdcRfOv5GlZPgfDctA1FCf4kv1yUc8rRxUgmrTBkzQwKnFlkeQ==</DigestValue>
      </Reference>
        
      <!-- We include extra deployment identifiers in our Seal regarding the generating system -->
      <Reference URI="#OpenESignForms_Seal_ID">
        <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"/>
        <DigestValue>0zyV3YABmVPyvp4pPbvf/2S3ymvL2kaVjMFZ38LVqrUaIJlJe1LzgzqrX2WKVbRrJ8LZY3Y0kru0rvdwKumNgg==</DigestValue>
      </Reference>
    </SignedInfo>

    <!-- This is the actual digital signature created across the above four References -->
    <SignatureValue>hEPnvrAAshuYb6lyK3vjx2nPkadxrksg6hRkjwPKFMxyqVAef5U3hoI1xmH1mYzCxl5h3WqhC07N
x4HKvLeN8sgbgmAK4ioWPf3vKumKU0HlhQKZh9Q4WhaqOfmqaEBboO4nhjGgOuHlXvpNoQFgmlMg
b9i6sb8cqV55Zwpfako9dczY7T/Juc9ac0Mr/q1L9aXwHY9HYSdvO6PqfFgwvwUPfo+hI2WjQeWO
G0XSvkbqTm+2qjER8MrXYYOA5PBlrKkVbFHidIgLtsN8WhIrdDvlRrax9QfdBnGTlm+fLZ87sDUa
UDScvFQ+wLcbeiOnJ+0MXlYiQrMwHWEDxLo4AgC6d6bHIC0/jKsNFqVORm+JAovTqFx/7ZNWJvUU
dAAihdYh6CM8NXuAEA4y2EygCTer+tfVavkjtzc5pRAOGlYf9LUA7D3iHtvzJSblFcVXKL05kh71
hDWpyOHlmEQ0jb3Oksh4fp1Nv/0SWHIxSJaGgISZHowII6RR2vUB0otLq6jdg9DqOoTw1mxE6ipa
heq0ptSq53pdf9/L8zqQC6XeLHxLknKqGpYUczB4E48bhyD7VVmDh+LedOYZaPNuUoCae2Pypg3d
/Ct07RiuXRS0/FqYDn/xJtyciwExBElvBTHuL7+fMv3srSLw/+e54x9ayMzd0iofpdTxNnOnXjA=</SignatureValue>

    <!-- The public key and its UUID along with the X.509 certificate
         that can be used to verify the digital signature -->
    <KeyInfo Id="KeyInfo_ID">
      <KeyName>23025bbf-0489-4044-a330-9cdeca373ddf</KeyName>
      <KeyValue>
        <RSAKeyValue>
          <Modulus>t5RZeG3UJQ9s55iBv1fZkIk79GPQGWCTF+Y9ViApTrZHsjDmX9/6nvQ8veCIWLdOq13xBT6lPEQs
xvarkw1K7XdRHJ7ouyLscWHW7kaSZTe7VaXCZlP9g+M/kzJntQJpTEwzkHn5rbqK/7beEmOt0xsp
r5PHLGrhPVxwUFXdvH6uCrpwdA5sPEqL1iSs8VzWdnIgccZ/49asM3ISCfGEpFjgcCdBNfa9SKau
Gs796pla0Z2SFwA81FIpMgfJe0wntmrB/+Pfbr5znpDeTzbZ/B+p1sLrRYbv9ZY1KH+gD8nMIxBi
gk2Wa+x1CMIHELVKXfxD7+ODv6s2/1n3i2UKKZ9hI8IGqb5CYhdfDkR4jFtFOzpANI/n1dwUNrC4
D1OImleTL+o8q6SNuoS+q4SVtatQNwIVmVmLWtWNq+yqGNARIN8MoLTpUz3Kib9kCg8HQQWe0Hyt
7AN1XaNkFcAaKAz65nm5FnXuGeV2zTnMUVPzuwCnI8336P5apLaLaLRN/M37ZXadVPzPDmjNJexO
ieu68MPGZBX1zSQOkOT7WBNsm/uLHwgVCf2RrkmoLNLCQDu1s2aqPVNbJrLphEg08/DGFPq+7mmb
bKWCvX03Rfx8jWuxPvCUoDXWKVvAA6g6Fz8j48+B5E168m8W5khI7d6IPV0FYcaX4YHOxSVWGhc=</Modulus>
          <Exponent>AQAB</Exponent>
        </RSAKeyValue>
      </KeyValue>
      <X509Data>
        <X509Certificate>MIIKnTCCCIWgAwIBAgIJAOW7Oqz5h7nMMA0GCSqGSIb3DQEBDQUAMIHIMT8wPQYDVQQDDDZPcGVu
X2VTaWduRm9ybXNfaHR0cDovL2xvY2FsaG9zdC9vcGVuLWVTaWduRm9ybXNWYWFkaW4xOjA4BgNV
BAoMMURlcGxveW1lbnRJRC9jODU3MDEyOS1kMjRhLTRiN2YtOWNjYy0xYjBiZjU1NzUyZmYxPDA6
BgNVBAsMM1NpZ25hdHVyZUtleUlELzIzMDI1YmJmLTA0ODktNDA0NC1hMzMwLTljZGVjYTM3M2Rk
ZjELMAkGA1UEBhMCVVMwHhcNMTEwNzI1MTgwNjI1WhcNMjEwNzI1MTgwNjI1WjCByDE/MD0GA1UE
Aww2T3Blbl9lU2lnbkZvcm1zX2h0dHA6Ly9sb2NhbGhvc3Qvb3Blbi1lU2lnbkZvcm1zVmFhZGlu
MTowOAYDVQQKDDFEZXBsb3ltZW50SUQvYzg1NzAxMjktZDI0YS00YjdmLTljY2MtMWIwYmY1NTc1
MmZmMTwwOgYDVQQLDDNTaWduYXR1cmVLZXlJRC8yMzAyNWJiZi0wNDg5LTQwNDQtYTMzMC05Y2Rl
Y2EzNzNkZGYxCzAJBgNVBAYTAlVTMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAt5RZ
eG3UJQ9s55iBv1fZkIk79GPQGWCTF+Y9ViApTrZHsjDmX9/6nvQ8veCIWLdOq13xBT6lPEQsxvar
kw1K7XdRHJ7ouyLscWHW7kaSZTe7VaXCZlP9g+M/kzJntQJpTEwzkHn5rbqK/7beEmOt0xspr5PH
LGrhPVxwUFXdvH6uCrpwdA5sPEqL1iSs8VzWdnIgccZ/49asM3ISCfGEpFjgcCdBNfa9SKauGs79
6pla0Z2SFwA81FIpMgfJe0wntmrB/+Pfbr5znpDeTzbZ/B+p1sLrRYbv9ZY1KH+gD8nMIxBigk2W
a+x1CMIHELVKXfxD7+ODv6s2/1n3i2UKKZ9hI8IGqb5CYhdfDkR4jFtFOzpANI/n1dwUNrC4D1OI
mleTL+o8q6SNuoS+q4SVtatQNwIVmVmLWtWNq+yqGNARIN8MoLTpUz3Kib9kCg8HQQWe0Hyt7AN1
XaNkFcAaKAz65nm5FnXuGeV2zTnMUVPzuwCnI8336P5apLaLaLRN/M37ZXadVPzPDmjNJexOieu6
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</X509Certificate>
      </X509Data>
    </KeyInfo>

    <!-- QualifyingProperties per XAdES has the signing time, file name and file type -->
    <Object>
      <QualifyingProperties Id="QualifyingProperties_ID">
        <SignedProperties>
          <SignedSignatureProperties>
            <SigningTime>2012-08-29T11:11:18-07:00</SigningTime>
          </SignedSignatureProperties>
          <SignedDataObjectProperties>
            <DataObjectFormat ObjectReference="#Payload_Reference_ID">
              <Description>document.html</Description>
              <MimeType>text/html</MimeType>
            </DataObjectFormat>
          </SignedDataObjectProperties>
        </SignedProperties>
      </QualifyingProperties>
    </Object>
    
    <!-- Standard extension for the Open eSignForms XML Digital Signature Seal.
         Includes the deployment host add, name and UUID of the instance of Open eSignForms that created the signature.
         It also includes the signer's IP address and browser type, along with the timestamp and version of the 
         software used when it was signed. -->
    <Object>
      <SignatureProperties>
        <SignatureProperty Id="OpenESignForms_Seal_ID" Target="#OpenESignForms_Seal">
          <OpenESignForms_XmlDigitalSignatureSeal 
            DeploymentHostAddress="192.168.1.3" 
            DeploymentHostName="YozonsDevHP" 
            DeploymentId="c8570129-d24a-4b7f-9ccc-1b0bf55752ff" 
            SignerAddress="127.0.0.1" 
            SignerAgent="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.83 Safari/537.1" 
            Timestamp="2012-08-29T11:11:18-07:00" 
            Version="12.9.29_pre0829"/>
        </SignatureProperty>
      </SignatureProperties>
    </Object>
    
  </Signature>
</snapshot>

The Java source code that created it can be seen in com.esignforms.open.crypto.XmlDigitalSignature.

For those who care, this is simple Java code that can be used to verify such an XML digital signature. Of course, in our platform, we can also verify the public key shown is valid or not.

// Copyright (C) 2011-2013 Yozons, Inc.
// Open eSignForms - Web-based electronic contracting software
//
// This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License 
// as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
// See the GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License along with this program.  
// If not, see <http://open.esignforms.com/agpl.txt> or <http://www.gnu.org/licenses/>.
// Contact information is via the public forums at http://open.esignforms.com or via private email to open-esign@yozons.com.
//
package com.esignforms.open.crypto;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.security.Key;
import java.security.KeyException;
import java.security.PublicKey;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

import javax.xml.crypto.AlgorithmMethod;
import javax.xml.crypto.KeySelector;
import javax.xml.crypto.KeySelectorException;
import javax.xml.crypto.KeySelectorResult;
import javax.xml.crypto.XMLCryptoContext;
import javax.xml.crypto.XMLStructure;
import javax.xml.crypto.dsig.Reference;
import javax.xml.crypto.dsig.SignatureMethod;
import javax.xml.crypto.dsig.XMLSignature;
import javax.xml.crypto.dsig.XMLSignatureFactory;
import javax.xml.crypto.dsig.dom.DOMValidateContext;
import javax.xml.crypto.dsig.keyinfo.KeyInfo;
import javax.xml.crypto.dsig.keyinfo.KeyName;
import javax.xml.crypto.dsig.keyinfo.KeyValue;
import javax.xml.parsers.DocumentBuilderFactory;

import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.Namespace;
import org.jdom2.input.SAXBuilder;
import org.jdom2.input.sax.XMLReaders;
import org.jdom2.output.XMLOutputter;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;


/**
 * XmlDigitalSignatureSimpleVerifier is a simple verifier that relies on no Open eSignForms components.
 * It includes a main so it can be run as a program to validate a snapshots XML file created by Open eSignForms.
 * Much of the code understanding came from Oracle's technotes: 
 * http://download.oracle.com/javase/6/docs/technotes/guides/security/xmldsig/XMLDigitalSignature.html
 * It's not actually used except as an example of Java standard code that can verify the signatures
 * independently of any of our platform code.
 * @author Yozons, Inc.
 */
public final class XmlDigitalSignatureSimpleVerifier {
	// This literal is supported, but not in the API yet...
	private static final String SignatureMethod_RSA_SHA512 = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha512";

	private XMLSignatureFactory xmlSignatureFactory;
    
    public XmlDigitalSignatureSimpleVerifier() {
    	xmlSignatureFactory = XMLSignatureFactory.getInstance("DOM");
    }
    
    public void verify(String signedXml) throws Exception {
    	if ( signedXml == null ) {
    		throw new Exception("Missing required parameter signedXml");
    	}

    	try	{
        	DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        	dbf.setNamespaceAware(true);
        	Document document = dbf.newDocumentBuilder().parse((new BufferedInputStream(new ByteArrayInputStream(signedXml.getBytes("UTF-8")))));

        	NodeList qualifyingPropertiesNodeList = document.getElementsByTagName("QualifyingProperties");
        	if ( qualifyingPropertiesNodeList != null ) 
        	{
        		for( int i=0; i < qualifyingPropertiesNodeList.getLength(); ++i )
        		{
        			org.w3c.dom.Element qualifyingPropertiesElement = (org.w3c.dom.Element)qualifyingPropertiesNodeList.item(i);
        			if ( qualifyingPropertiesElement != null )
        				qualifyingPropertiesElement.setIdAttribute("Id",true); // mark our id as the "Id" attribute 
        		}
        	}

        	NodeList nl = document.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature");
        	if (nl.getLength() == 0) {
        		throw new Exception("The signedXML has no Signature element");
        	}

        	// The embedded key must match our signatureKey's values or the validation will fail.
        	DOMValidateContext valContext = new DOMValidateContext(new AcceptEmbeddedKeySelector(), nl.item(0));

        	XMLSignature signature = xmlSignatureFactory.unmarshalXMLSignature(valContext);
        	if ( ! signature.validate(valContext) ) {
        	    boolean isSignatureValueValid = signature.getSignatureValue().validate(valContext);
        		StringBuilder exceptionText = new StringBuilder();
        		exceptionText.append("Invalid signature. SignatureValue ").append(isSignatureValueValid ? "validated" : "INVALID");
    	        Iterator<?> i = signature.getSignedInfo().getReferences().iterator();
    	        for (int j=0; i.hasNext(); j++) {
    	            boolean refValid = ((Reference)i.next()).validate(valContext);
            		exceptionText.append("; ").append(getReferenceNameForOpenESignFormsOnly(j)).append(refValid ? " validated" : " INVALID");
    	        }
        	    throw new Exception(exceptionText.toString());
        	}
    	} catch( Exception e ) {
    		throw e;
    	}
    }
    
	private static class AcceptEmbeddedKeySelector extends KeySelector {
		public AcceptEmbeddedKeySelector() {}
		
		@Override
		public KeySelectorResult select(KeyInfo keyInfo, Purpose purpose, AlgorithmMethod method, XMLCryptoContext context) throws KeySelectorException {
			if (keyInfo == null) {
				throw new KeySelectorException("NULL KeyInfo");
			}

		    SignatureMethod sm = (SignatureMethod) method;
		    List<?> list = keyInfo.getContent();

    		String keyId = null;
    		PublicKey publicKey = null;
		    for (int i = 0; i < list.size(); i++) {
		    	XMLStructure xmlStructure = (XMLStructure)list.get(i);
		    	if (xmlStructure instanceof KeyName) {
		    		keyId = ((KeyName)xmlStructure).getName();
		    	} else if (xmlStructure instanceof KeyValue) {
		    		try {
		    			publicKey = ((KeyValue)xmlStructure).getPublicKey();
		    		} catch( KeyException ke ) {
		    			throw new KeySelectorException(ke);
		    		}
		    	}
		    }
		    
		    if ( keyId == null || publicKey == null ) {
		    	throw new KeySelectorException("XML Signature element needs KeyName and KeyValue as these are always present when valid, even if not trusted");
		    }
		    
		    if ( algEquals(sm.getAlgorithm(), publicKey.getAlgorithm()) ) {
		    	return new SimpleKeySelectorResult(publicKey);
		    }
		    
		    throw new KeySelectorException("KeyName and KeyValue are not correct");
		}
	} 
	
	private static class SimpleKeySelectorResult implements KeySelectorResult {
		PublicKey publicKey;
		SimpleKeySelectorResult(PublicKey publicKey) {
			this.publicKey = publicKey;
		}
		
		public Key getKey() {
			return publicKey;
		}
	}

	private static boolean algEquals(String algURI, String algName) {
	    return (algName.equalsIgnoreCase("DSA") && algURI.equalsIgnoreCase(SignatureMethod.DSA_SHA1)) ||
	           (algName.equalsIgnoreCase("RSA") && (algURI.equalsIgnoreCase(SignatureMethod_RSA_SHA512) || algURI.equalsIgnoreCase(SignatureMethod.RSA_SHA1)));
	}

    private static String getReferenceNameForOpenESignFormsOnly(int i) {
    	if ( i == 0 ) {
    		return "XML data payload";
    	}
    	if ( i == 1 ) {
    		return "OpenESignForms Seal";
    	}
    	return "Unexpected Reference[" + i + "]";
    }
    
    public static void main(String[] args) throws IOException {
    	if ( args.length < 1 ) {
    		System.err.println("Usage: XmlDigitalSignatureSimpleVerifier <signedXmlSnapshotFileName>...");
    		System.exit(1);
    	}
    		
   		SAXBuilder saxBuilder = new SAXBuilder(XMLReaders.NONVALIDATING);
   		saxBuilder.setIgnoringElementContentWhitespace(true);
   		
   		XmlDigitalSignatureSimpleVerifier verifier = new XmlDigitalSignatureSimpleVerifier();
		Namespace ns = Namespace.getNamespace("http://open.esignforms.com/XMLSchema/2011");
    	
    	for( String f : args ) {
    		File file = new File(f);
    		if ( file.exists() && file.canRead() ) {
       			try {
       				org.jdom2.Document doc = saxBuilder.build(file);
       				org.jdom2.Element rootElement = doc.getRootElement();

       				List<org.jdom2.Element> snapshotList;
       				
       				String rootName = rootElement.getName();
       				if ( "snapshot".equals(rootName) ) { // if this is just a single snapshot, not embedded in our snapshots XML, we'll try to work just this one element
       					snapshotList = new java.util.LinkedList<org.jdom2.Element>();
       					snapshotList.add(rootElement);
       				} else if (!"snapshots".equals(rootName)) {
       					System.err.println("Root element is not snapshots.  Found instead: " + rootName + "; in file: " + file.getAbsolutePath());
       					continue;
       				} else {
       					snapshotList = rootElement.getChildren("snapshot", ns);
       				}
       				
       				if ( snapshotList == null ) {
       					System.err.println("No snapshot elements found in file: " + file.getAbsolutePath());
       					continue;
       				}

       				ListIterator<Element> iter = snapshotList.listIterator();
       				while (iter.hasNext()) {
       					Element snapshotElement = iter.next();
       					String type = snapshotElement.getAttributeValue("type");
       	   				String timestamp = snapshotElement.getAttributeValue("timestamp");
           				System.err.println("Found snapshot type: " + type + "; timestamp: " + timestamp + "; in file: " + file.getAbsolutePath());
       	   				XMLOutputter snapshotOutputter = new XMLOutputter();
       	   				StringWriter writer = new StringWriter(snapshotElement.getText().length()+100);
       	   				snapshotOutputter.output(snapshotElement, writer);
       	   				String signedSnapshotXml = writer.toString();
       	   				try	{
       	   					verifier.verify(signedSnapshotXml);
       	    				System.err.println("Signature validated SUCCESSFULLY for file: " + file.getAbsolutePath());
       	   				} catch(Exception e) {
       	    				System.err.println("Signature validation FAILED for file: " + file.getAbsolutePath() + "; exception: " + e.getMessage());
       	   				}
       				}
       				
       			} catch (java.io.IOException e) {
        			System.err.println("Error: Could not read the XML contents from file named: " + file.getAbsolutePath());
       			} catch (JDOMException e) {
        			System.err.println("Error: Could not parse XML contents from file named: " + file.getAbsolutePath());
       			} finally {
       			}

    		} else {
    			System.err.println("Error: Could not find a readable file named: " + file.getAbsolutePath());
    		}
    	}
    	
    	System.exit(0);
    }
}

Return to main page...