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 by the demo system on 16 February 2019 using a developer's PC in Kirkland, Washington. It can be validated by any compliant XML Digital Signature implementation.
<?xml version="1.0" encoding="UTF-8"?>
<snapshots xmlns="http://open.esignforms.com/XMLSchema/2019" timestamp="2019-02-16T12:40:45-08:00">
<snapshot xmlns="http://open.esignforms.com/XMLSchema/2019" timestamp="2019-02-16T12:40:45-08: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>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>W-4</title>
<meta name="robots" content="noindex, nofollow" />
<meta name="Description" content="Confidential document" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="Generator" content="Yozons Open eSignForms document generator version 19.1.19_p0215_1750" />
<meta name="DeploymentId" content="bbfe9bed-918d-446b-9518-8ec303bafb83" />
<meta name="TransactionId" content="ccc1bb24-7f1d-43f6-99c2-4ef352001191" />
<meta name="TransactionTemplateId" content="589aaf0b-6f8a-49d3-b080-a10a83ecbe0c" />
<meta name="TransactionMode" content="Production" />
<meta name="PackageId" content="16f8f766-68b4-43de-9f1a-82ca9cd3d92a" />
<meta name="PackageVersionId" content="9b7bfc26-b4f3-4d6f-b746-a552c203aeaf" />
<meta name="PackageVersionPartyName" content="employee" />
<meta name="DocumentId" content="19641089-b0e8-4467-b4d4-113ede914724" />
<meta name="DocumentName" content="W-4" />
<meta name="DocumentVersionId" content="4abac535-d043-4389-9a56-4992de07cf65" />
<meta name="DocumentVersionPageId" content="080bfdf0-ba45-4efb-a996-2e7355d2b075" />
<meta name="DocumentVersionPartyName" content="Employee" />
<meta name="DocumentPageMode" content="REVIEW" />
<meta name="HtmlRenderTimestamp" content="2019-02-16 12:40:39.305 PST" />
<meta name="RequestIpAddr" content="50-46-118-196.evrt.wa.frontiernet.net (50.46.118.196)" />
<meta name="RequestUserAgent" content="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.3 Safari/605.1.15" />
<base href="https://open.esignforms.com/demo/" />
<style type="text/css">
/* platform esf.css */
@import url(//fonts.googleapis.com/css?family=Pacifico);
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, .esf th.left, .esf td.left { text-align: left; }
.esf p.right, .esf span.right, .esf div.right, .esf th.right, .esf td.right { text-align: right; }
.esf p.center, .esf span.center, .esf th.center, .esf td.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 ::-webkit-input-placeholder { font-style: italic; }
.esf :-moz-placeholder { font-style: italic; }
.esf ::-moz-placeholder { font-style: italic; }
.esf :-ms-input-placeholder { 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; }
/* HTML5 versions for table cellpadding="0" through cellpadding="5" */
.esf table.cellpadding0 th, .esf table.cellpadding0 td { padding: 0; }
.esf table.cellpadding1 th, .esf table.cellpadding1 td { padding: 1px; }
.esf table.cellpadding2 th, .esf table.cellpadding2 td { padding: 2px; }
.esf table.cellpadding3 th, .esf table.cellpadding3 td { padding: 3px; }
.esf table.cellpadding4 th, .esf table.cellpadding4 td { padding: 4px; }
.esf table.cellpadding5 th, .esf table.cellpadding5 td { padding: 5px; }
/* HTML5 versions for table cellspacing="0" through cellspacing="5" */
.esf table.cellspacing0 { border-spacing: 0; }
.esf table.cellspacing1 { border-spacing: 1px; }
.esf table.cellspacing2 { border-spacing: 2px; }
.esf table.cellspacing3 { border-spacing: 3px; }
.esf table.cellspacing4 { border-spacing: 4px; }
.esf table.cellspacing5 { border-spacing: 5px; }
/* HTML5 version of border="1" through border="2" */
table.gridBorder { border-top: 1px solid black; border-left: 1px solid black; }
table.gridBorder th, table.gridBorder td { border-bottom: 1px solid black; border-right: 1px solid black; }
table.gridBorder2 { border-top: 2px solid black; border-left: 2px solid black; }
table.gridBorder2 th, table.gridBorder2 td { border-bottom: 2px solid black; border-right: 2px solid black; }
.esf div.newPage { border-top: 1px dotted gray; }
.esf .doNotPrint { } /* do nothing normally, but we override in @print so suppress the element */
.esf div.pagediv { } /* do nothing, but allows you to style as each page is wrapped in a div */
.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; }
.esf span.fieldAreaAuto { display: inline; }
/* Auto widths do not make sense really with alignment as the field should be no bigger than the contents; we'll keep it inline-blocked */
.esf span.fieldAreaLeftAuto { display: inline-block; text-align: left; }
.esf span.fieldAreaRightAuto { display: inline-block; text-align: right; }
.esf span.fieldAreaCenterAuto { display: inline-block; text-align: center; }
/* For signature/initials display */
.esf .signature, .esf .signature input { font-family: 'Pacifico', 'Bradley Hand ITC', 'Lucida Handwriting', 'Comic Sans MS', cursive; font-size: 14pt; color: blue; white-space: nowrap; }
.esf div.signatureBlock { border: 3px solid #9899c4; border-radius: 10px; background-color: #efffff; padding: 0px 3px 3px 12px; width: 720px; page-break-inside: avoid; }
.esf div.signatureBlock p.signatureHeader { font-size: 11pt; font-weight: bold; text-decoration: underline; margin-bottom: 0px; }
.esf .signatureMetadata { font-size: 8pt; font-family: 'Courier New', Courier, monospace; white-space: nowrap; }
/* 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: 2em; margin-left: 2em; }
.esf p.buttons input { margin-right: 2em; font-size: 1.1em; padding: 5px 10px; margin-top: 5px; }
.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 p.extraButtons { text-align: right; margin-top: -3em; }
.esf p.extraButtons input { color: blue; font-size: 0.6em; padding: 2px 3px; margin-right: 1em; }
.esf div.documentAndPageNumbersInfo { font-family: 'Courier New', Courier, monospace; font-size: 8pt; text-align: right; color: lightgray; }
/* For image overlays */
.esf div.imageOverlay { position: relative; display: inline-block; }
.esf div.imageOverlay img { margin: 0; padding: 0; }
.esf div.imageOverlay span.imageOverlayFieldArea { position: absolute; margin: 0; padding: 0; }
.esf div.imageOverlay span.imageOverlayFieldArea input[type="radio"] { margin: 0; padding: 0; }
.esf div.imageOverlay span.imageOverlayFieldArea input[type="checkbox"] { margin: 0; padding: 0; }
.esf input.small { font-size: 8pt; }
.esf input.upload { color: green; }
/* For file uploads of images displayed inline */
.esf img.fileUploadInlineImage200 { max-width: 200px; border: 2px solid black; page-break-inside: avoid; }
.esf img.fileUploadInlineImage400 { max-width: 400px; border: 2px solid black; page-break-inside: avoid; }
.esf img.fileUploadInlineImage600 { max-width: 800px; border: 2px solid black; page-break-inside: avoid; }
.esf img.fileUploadInlineImage800 { max-width: 800px; border: 2px solid black; page-break-inside: avoid; }
/* For standard display of ErrorEntry[] arrays from Errors */
.esf table.errorEntryArea { margin-left: 1em; border: 1px solid #FBD777; border-radius: 5px; background-color: #FDE8A5; width: 95%; padding-top: 2px; padding-bottom: 2px; }
.esf ul.errorEntryArea { padding-left: 20px; }
.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; }
.esf div.jspErrorPageMessage { margin-left: 1em; width: 700px; font-weight: bold; background-color: pink; border: 1px solid black; border-radius: 10px; padding: 0px 1em 0px 1em; }
@media print {
body.esf { margin: 0; padding: 0; font-size: 80% !important; }
.esf div.newPage { border-top: none; page-break-after: always; }
.esf a.showURL:link:after, a.showURL:visited:after { content: " (" attr(href) ")"; font-size: 80%; }
.esf .doNotPrint { display: none; }
}
/* Begin document style id: 9a000404-5f56-4a1c-ad4a-be6382c67d97, version id: 86f339d5-81e2-4117-95c2-8f747f5a6fe3 */
body.esf { font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 11pt; }
.esf .X86f339d5_81e2_4117_95c2_8f747f5a6fe3 span.signature { font-family: Pacifico, cursive; font-size: 14pt; color: blue; font-style: normal; font-weight: normal; font-variant: normal; text-transform: inherit; }
.esf .X86f339d5_81e2_4117_95c2_8f747f5a6fe3 span.signature input { font-family: Pacifico, cursive; font-size: 14pt; color: blue; font-style: normal; font-weight: normal; font-variant: normal; text-transform: inherit; }
.esf .X86f339d5_81e2_4117_95c2_8f747f5a6fe3 span.viewFieldData { }
.esf .X86f339d5_81e2_4117_95c2_8f747f5a6fe3 input[type='checkbox'].required { border: 0 none !important; outline-color: #FFFFE7; outline-style: solid; outline-width: medium; }
.esf .X86f339d5_81e2_4117_95c2_8f747f5a6fe3 input[type='radio'].required { border: 0 none !important; outline-color: #FFFFE7; outline-style: solid; outline-width: medium; }
.esf .X86f339d5_81e2_4117_95c2_8f747f5a6fe3 input.required { font-style: normal; font-weight: bold; font-variant: normal; text-transform: inherit; background-color: #FFFFE7; border: 1px solid #7F9DB9; }
.esf .X86f339d5_81e2_4117_95c2_8f747f5a6fe3 select.required { font-style: normal; font-weight: bold; font-variant: normal; text-transform: inherit; background-color: #FFFFE7; border: 1px solid #7F9DB9; }
.esf .X86f339d5_81e2_4117_95c2_8f747f5a6fe3 textarea.required { font-style: normal; font-weight: bold; font-variant: normal; text-transform: inherit; background-color: #FFFFE7; border: 1px solid #7F9DB9; }
.esf .X86f339d5_81e2_4117_95c2_8f747f5a6fe3 input.optional { font-style: normal; font-weight: bold; font-variant: normal; text-transform: inherit; background-color: white; border: 1px solid #7F9DB9; }
.esf .X86f339d5_81e2_4117_95c2_8f747f5a6fe3 select.optional { font-style: normal; font-weight: bold; font-variant: normal; text-transform: inherit; background-color: white; border: 1px solid #7F9DB9; }
.esf .X86f339d5_81e2_4117_95c2_8f747f5a6fe3 textarea.optional { font-style: normal; font-weight: bold; font-variant: normal; text-transform: inherit; background-color: white; border: 1px solid #7F9DB9; }
.esf .X86f339d5_81e2_4117_95c2_8f747f5a6fe3 input[type='checkbox'].error { border: 0 none !important; outline: 1px solid red; }
.esf .X86f339d5_81e2_4117_95c2_8f747f5a6fe3 input[type='radio'].error { border: 0 none !important; outline: 1px solid red; }
.esf .X86f339d5_81e2_4117_95c2_8f747f5a6fe3 input.error { font-style: normal; font-weight: bold; font-variant: normal; text-transform: inherit; background-color: #FFC0CB; border: 1px solid red; }
.esf .X86f339d5_81e2_4117_95c2_8f747f5a6fe3 select.error { font-style: normal; font-weight: bold; font-variant: normal; text-transform: inherit; background-color: #FFC0CB; border: 1px solid red; }
.esf .X86f339d5_81e2_4117_95c2_8f747f5a6fe3 textarea.error { font-style: normal; font-weight: bold; font-variant: normal; text-transform: inherit; background-color: #FFC0CB; border: 1px solid red; }
.esf .X86f339d5_81e2_4117_95c2_8f747f5a6fe3 label.normal { }
.esf .X86f339d5_81e2_4117_95c2_8f747f5a6fe3 label.normal-error { color: red; font-style: normal; font-weight: bold; font-variant: normal; text-transform: inherit; background-color: yellow; }
.esf .X86f339d5_81e2_4117_95c2_8f747f5a6fe3 label.small { font-size: 8pt; }
.esf .X86f339d5_81e2_4117_95c2_8f747f5a6fe3 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: 19, minor: 1, update: '19',
toString: function(){
with(esf.version){
return major + "." + minor + "." + update;
}
}
},
appname: 'Open eSignForms',
htmlCopyright: '© 2019 Yozons, Inc.',
textCopyright: 'Copyright (c) 2009-2019 Yozons, Inc.'
};
esf.getRelease = function() {
return this.appname + " " + this.version.toString();
};
if ( typeof console != "undefined") console.log(esf.getRelease() + ' - ' + esf.textCopyright);
esf.saveScrollPosition = function(elem) {
var currLeft = window.pageXOffset || document.documentElement.scrollLeft;
var currTop = window.pageYOffset || document.documentElement.scrollTop;
elem.form.ESF_PAGE_SCROLLLEFT.value = currLeft; // form field name must match DocumentPageBean.HIDDEN_PAGE_SCROLLLEFT
elem.form.ESF_PAGE_SCROLLTOP.value = currTop; // form field name must match DocumentPageBean.HIDDEN_PAGE_SCROLLTOP
}
esf.autoPost = function(inputField) {
esf.confirmOnPageUnloadMessage = null; // do not block leaving page for autopost
esf.hideAllSubmitInputFields();
inputField.form.ESF_AUTO_POST_FIELD_ID.value = inputField.id; // form field name must match DocumentPageBean.HIDDEN_AUTO_POST_FIELD_ID
esf.saveScrollPosition(inputField);
inputField.form.submit();
};
esf.blockEnterKeyViaInputFields = function(e) {
var evt = e || window.event;
var node = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
if ((evt.keyCode == 13) && (node.type=="text")) {
return false;
}
};
esf.checkConfirmOnPageUnload = function(confirm,durationMsec) {
if (! confirm) {
window.onbeforeunload = null;
}
if ( durationMsec && durationMsec > 0 )
esf.hideAllSubmitInputFieldsTemporarily(durationMsec);
else
esf.hideAllSubmitInputFields();
};
// For links, we don't hide buttons and we don't clear the unload unless requested AND the target is _top or _self (or no target set)
esf.checkLinkConfirmOnPageUnload = function(confirm,atag) {
if (! confirm && (atag.target == "_top" || atag.target == "_self" || atag.target == "") ) {
window.onbeforeunload = null;
}
};
// Default is no message to display on page unload
esf.confirmOnPageUnloadMessage = null;
esf.confirmOnPageUnload = function(e) {
e = e || window.event;
if ( esf.confirmOnPageUnloadMessage ) {
if (e) {
e.returnValue = esf.confirmOnPageUnloadMessage;
}
return esf.confirmOnPageUnloadMessage;
}
};
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.showAllSubmitInputFields = function() {
if ( document.getElementsByTagName ) {
var inputFields = document.getElementsByTagName("input");
for( var i=0; i < inputFields.length; ++i ) {
if ( inputFields[i].type == "submit" )
esf.makeVisible(inputFields[i]);
}
var buttonFields = document.getElementsByTagName("button");
for( var i=0; i < buttonFields.length; ++i ) {
esf.makeVisible(buttonFields[i]);
}
return true;
}
};
esf.hideAllSubmitInputFieldsTemporarily = function(durationMsec) {
esf.hideAllSubmitInputFields();
setTimeout( esf.showAllSubmitInputFields, durationMsec );
};
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.makeTemporarilyInvisible = function(elem, durationMsec) {
esf.makeInvisible(elem);
setTimeout( function(){esf.makeVisible(elem);}, durationMsec );
};
esf.ensureTopWindow = function() {
if (window != window.top)
top.location.href = location.href;
};
esf.getElementsByFieldName = function(fieldName) {
if ( document.getElementsByName ) {
return document.getElementsByName(fieldName.toLowerCase()); // Field names are all lowercase in the HTML DOM
}
return []; // not really an empty node list, but an empty array so it has a 'length' property to query before accessing
};
esf.getElementByFieldName = function(fieldName) {
var elemNL = esf.getElementsByFieldName(fieldName);
return elemNL.length > 0 ? elemNL[0] : null;
};
esf.setAllCheckboxesByName = function(name,b) {
var checkboxes = esf.getElementsByFieldName(name);
for( var i=0; i < checkboxes.length; ++i ) {
if ( checkboxes[i].type == "checkbox" )
checkboxes[i].checked = b;
}
};
esf.checkAllCheckboxesByName = function(name) {
esf.setAllCheckboxesByName(name,true);
};
esf.uncheckAllCheckboxesByName = function(name) {
esf.setAllCheckboxesByName(name,false);
};
/* Expects two radiobuttons to be laid out as [] Yes [] No order -- can also be stacked as long as Yes is first */
esf.setupDisplayIfYesNoRadioButtonGroupIsYes = function(yesNoRadioButtonGroupName,elemIdToShowIfYes,currentRadioButtonGroupFieldValue) {
var rbYesNoElems = document.getElementsByName(yesNoRadioButtonGroupName.toLowerCase());
if ( rbYesNoElems && rbYesNoElems.length == 2 ) { /* radio buttons will only exist in EDIT mode */
rbYesNoElems[0].onclick = function() { esf.displayById(elemIdToShowIfYes); }; /* yes rb */
rbYesNoElems[1].onclick = function() { esf.hideById(elemIdToShowIfYes); }; /* no rb */
}
var lowerValue = currentRadioButtonGroupFieldValue.toLowerCase();
if ( lowerValue.startsWith('y') || lowerValue.startsWith('t') || lowerValue == '1' )
esf.displayById(elemIdToShowIfYes);
else
esf.hideById(elemIdToShowIfYes);
};
/* Expects two radiobuttons to be laid out as [] Yes [] No order -- can also be stacked as long as Yes is first */
esf.setupDisplayIfYesNoRadioButtonGroupIsNo = function(yesNoRadioButtonGroupName,elemIdToShowIfNo,currentRadioButtonGroupFieldValue) {
var rbYesNoElems = document.getElementsByName(yesNoRadioButtonGroupName.toLowerCase());
if ( rbYesNoElems && rbYesNoElems.length == 2 ) { /* radio buttons will only exist in EDIT mode */
rbYesNoElems[0].onclick = function() { esf.hideById(elemIdToShowIfNo); }; /* yes rb */
rbYesNoElems[1].onclick = function() { esf.displayById(elemIdToShowIfNo); }; /* no rb */
}
var lowerValue = currentRadioButtonGroupFieldValue.toLowerCase();
if ( lowerValue.startsWith('n') || lowerValue.startsWith('f') || lowerValue == '0' )
esf.displayById(elemIdToShowIfNo);
else
esf.hideById(elemIdToShowIfNo);
};
esf.setupDisplayIfChecked = function(checkboxName,elemIdToShowIfChecked,currentCheckboxFieldValue,checkboxValueWhenChecked) {
var cbElems = document.getElementsByName(checkboxName.toLowerCase());
if ( cbElems && cbElems.length == 1 ) { /* checkboxes will only exist in EDIT mode */
cbElems[0].onchange = function() {
if ( this.checked )
esf.displayById(elemIdToShowIfChecked);
else
esf.hideById(elemIdToShowIfChecked);
};
}
if ( currentCheckboxFieldValue == checkboxValueWhenChecked )
esf.displayById(elemIdToShowIfChecked);
else
esf.hideById(elemIdToShowIfChecked);
};
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;
};
// 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);
};
// Opens a window -- for a given name, width and height
esf.showWindow = function(url,name,width,height) {
var win = window.open(url,name,'width='+width+',height='+height+',scrollbars=yes,resizable=yes');
win.focus();
return false;
};
}
})();
/* Workaround for IE, the only browser in the world that doesn't support standard JavaScript String.startsWith() */
if ( ! String.prototype.startsWith ) {
String.prototype.startsWith = function(searchString, position) {
position = position || 0;
return this.indexOf(searchString, position) === position;
};
}
</script>
</head>
<body class="esf">
<div id="X4abac535_d043_4389_9a56_4992de07cf65" class="X86f339d5_81e2_4117_95c2_8f747f5a6fe3 pagediv">
<div id="X080bfdf0_ba45_4efb_a996_2e7355d2b075" class="Page1">
<style type="text/css">
body { background-color: #FFFFFF; font-family: Arial, Veranda, Times New Roman, sans-serif; margin: 0px 10px 0px 10px; font-size: 10pt; }
table { background-color: #FFFFFF; font-family: Arial, Veranda, Times New Roman, sans-serif; font-size: 10pt; }
table.button { background-color: transparent; width: 50%; margin: 20px 25% 20px 25%; }
table.button td { border: none; }
table.w4 td { padding: 0 5px 0 5px; }
p.w4 { padding: 0 5px 0 5px; }
ul.w4 { margin-top: 3px; margin-bottom: 3px; }
ul.w4 li { margin-top: 3px; margin-bottom: 3px; }
td.boBdashed { border-bottom: 1px dotted; }
div.newPage { border-bottom: 1px solid #A040A0; }
.data { font-weight: bold; }
.w4textTitle { font-size: 21pt; font-family: Helvetica; font-weight: bold; }
.w4title { font-size: 12pt; font-weight: bold; }
.w4titlepara{ font-size: 8pt; font-weight: bold; white-space: nowrap; }
.w4smallText { font-size: 8pt; }
.w4midText { font-size: 9pt; }
.w4indent{ margin-left: 10px; }
.w4indent2{ margin-left: 20px; }
.w4bgcolor { background-color: #BCBDC0; }
span.year { font-size: 28pt; font-weight: bold; }
@media print
{
body { font-size: 8pt; }
table { font-size: 8pt; }
p { font-size: 8pt; }
div.newPage { border-bottom: none; page-break-after: auto; margin-top: 5em; }
}</style>
<table border="0" cellpadding="0" cellspacing="0" class="w100 w4">
<tbody>
<tr>
<td class="w15 boR boB top nowrap bottom"><span class="w4smallText">Form</span> <span class="w4textTitle">W-4</span>
<p><span class="w4smallText">Department of the Treasury</span><br />
<span class="w4smallText">Internal Revenue Service</span></p>
</td>
<td align="center" class="w70 boR boB bottom">
<p class="nowrap w4title"><b>Employee's Withholding Allowance Certificate</b></p>
<p class="w4titlepara">Whether you are entitled to claim a certain number of allowances or exemption from withholding is<br />
subject to review by the IRS. Your employer may be required to send a copy of this form to the IRS.</p>
</td>
<td align="center" class="w15 top boB nowrap"><span class="w4smallText">OMB No. 1545-0074</span><br />
<span style="font-size: 37px; font-weight: bold; text-align: -webkit-center; white-space: nowrap;">2018</span></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0" cellspacing="0" class="w100 w4">
<tbody>
<tr>
<td class="w30 nowrap boR boB"><span class="w4smallText"><b>1</b> <span class="w4indent">Your first name and middle initial</span></span><br />
<span class="w4indent2"><span class="viewFieldData fieldAreaAuto " style="width: auto;">Test</span> <span class="viewFieldData fieldAreaAuto " style="width: auto;"> </span></span></td>
<td class="w40 nowrap boR boB"><span class="w4smallText">Last name</span><br />
<span class="viewFieldData fieldArea " style="width: 100%;">Last</span></td>
<td class="w30 nowrap boB"><span class="w4smallText bold">2 <span class="w4indent">Your social security number</span></span><br />
<span class="viewFieldData fieldArea " style="width: 95%;">XXX-XX-6789</span></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0" cellspacing="0" class="w100 w4">
<tbody>
<tr>
<td class="w50 nowrap boR boB"><span class="w4indent2 w4smallText">Home address (number and street or rural route)</span><br />
<span class="w4indent2"><span class="viewFieldData fieldArea " style="width: 95%;">123 Main St.</span></span></td>
<td class="w50 nowrap boB w4smallText"><b>3</b> <span class="labelFieldArea bottom" ><span class="bottom fieldAreaAuto viewFieldData " style="width: auto;"><img src="./static/esf/radioSelect.png" style="padding-bottom: 2px;" alt="Selected" title="Selected"/></span><span class="labelArea"><label class="normal"> Single</label></span></span> <span class="labelFieldArea bottom" ><span class="bottom fieldAreaAuto viewFieldData " style="width: auto;"><img src="./static/esf/radioUnselect.png" style="padding-bottom: 2px;" alt="NOT selected" title="NOT selected"/></span><span class="labelArea"><label class="normal"> Married</label></span></span> <span class="labelFieldArea bottom" ><span class="bottom fieldAreaAuto viewFieldData " style="width: auto;"><img src="./static/esf/radioUnselect.png" style="padding-bottom: 2px;" alt="NOT selected" title="NOT selected"/></span><span class="labelArea"><label class="normal"> Married, but withhold at higher Single rate</label></span></span>.<br />
<b>Note.</b> If married, but legally separated, or spouse is a nonresident alien, check the "Single" box.</td>
</tr>
<tr>
<td class="w40 nowrap boR boB"><span class="w4indent2 w4smallText">City or town, state, and ZIP code</span><br />
<span class="w4indent2"><span class="viewFieldData fieldAreaAuto " style="width: auto;">Kirkland</span>, <span class="viewFieldData fieldAreaAuto " style="width: auto;">WA</span> <span class="viewFieldData fieldAreaAuto " style="width: auto;">98033</span></span></td>
<td class="w60 nowrap boB w4smallText"><b>4</b> <span class="w4indent bold">If your last name differs from that shown on your social security card,</span><br />
<span class="w4indent2 bold">check here. You must call 1-800-772-1213 for a replacement card. <span class="viewFieldData fieldAreaAuto " style="width: auto;"><img src="./static/esf/uncheck.png" style="padding-bottom: 2px;" alt="NOT checked" title="NOT checked"/></span></span></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0" cellspacing="0" class="w100 w4">
<tbody>
<tr>
<td class="w90 nowrap" colspan="2"><span class="bold w4smallText">5</span> <span class="w4indent2"><label class="normal">Total number of allowances you are claiming</label> (from line <b>H</b> above <b>or</b> from the <a href="http://www.irs.gov/pub/irs-pdf/fw4.pdf" target="_blank">applicable worksheet on page 2</a>)</span></td>
<td class="nowrap boL boR boB bold">5</td>
<td class="w10 nowrap boB"><span class="viewFieldData fieldAreaAuto " style="width: auto;">0</span></td>
</tr>
<tr>
<td colspan="2">
<table class="w100" style="margin-left: -7px; ">
<tbody>
<tr>
<td class="nowrap"><span class="bold w4smallText">6</span> <span class="w4indent2">Additional amount, if any, you want withheld from each paycheck</span></td>
<td class="w90 boBdashed"> </td>
</tr>
</tbody>
</table>
</td>
<td class="boL boR boB bold">6</td>
<td class="w10 nowrap boB"><span class="viewFieldData fieldAreaAuto " style="width: auto;"> </span></td>
</tr>
<tr>
<td class="nowrap" colspan="3"><span class="bold w4smallText">7</span> <span class="w4indent2">I claim exemption from withholding</span> for 2018, and I certify that I meet <b>both</b> of the following conditions for exemption.
<ul class="w4">
<li>Last year I had a right to a refund of <b>all</b> federal income tax withheld because I had <b>no</b> tax liability, <b>and</b></li>
<li>This year I expect a refund of <b>all</b> federal income tax withheld because I expect to have <b>no</b> tax liability.</li>
</ul>
</td>
<td class="w4bgcolor boL"> </td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0" cellspacing="0" class="w100 w4" style="margin-bottom: 3px;">
<tbody>
<tr>
<td class="nowrap"><span class="w4indent2"><span class="normalLabel">If you meet both conditions, write "Exempt" here</span></span></td>
<td class="w50 boBdashed"> </td>
<td class="boT boR boB boL bold nowrap">7 </td>
<td class="w30 boT boB"><span class="viewFieldData fieldArea " style="width: 100%;"> </span></td>
</tr>
</tbody>
</table>
<p class="w4midText nomargin boT">Under penalties of perjury, I declare that I have examined this certificate and, to the best of my knowledge and belief, it is true, correct, and complete.</p>
<table border="0" cellpadding="0" cellspacing="0" class="w100 w4" style="margin-top: .5em; ">
<tbody>
<tr>
<td class="nowrap"><b><label class="normal">Employee's signature</label></b><br />
<span class="nowrap w4smallText">(This form is not valid unless you sign it.)</span></td>
<td class="w75 bottom" style="min-width: 30ex;"><span class="viewFieldData fieldArea signature " style="width: 100%;">Test signature</span></td>
<td class="w25 bottom"><b><label class="normal">Date </label></b><span class="viewFieldData fieldArea signature " style="width: 98%;">16-Feb-2019</span></td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0" cellspacing="0" class="w100 w4">
<tbody>
<tr style="height: 2em;">
<td class="nowrap boT boR boB top"><span class="w4smallText"><b>8</b><span class="w4indent">Employer's name and address (Employer: Complete lines 8 and 10 only if sending to the IRS.)</span></span><br />
<span class="w4indent">Demo Company, LLC, 123 Main St., Anytown, WA 12345-1234</span></td>
<td class="nowrap boT boR boB top"><span class="w4smallText"><b>9</b><span class="w4indent">Office code (optional)</span></span></td>
<td class="nowrap boT boB top"><span class="w4smallText"><b>10</b><span class="w4indent">Employer identification number (EIN)</span></span><br />
91-1234567</td>
</tr>
</tbody>
</table>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tbody>
<tr>
<td class="w4smallText nowrap" width="60%"><b>For Privacy Act and Paperwork Reduction Act Notice, <a href="http://www.irs.gov/pub/irs-pdf/fw4.pdf" target="_blank">see page 2</a>.</b></td>
<td align="center" class="w4smallText" width="20%">Cat. No. 10220Q</td>
<td align="right" width="20%"><span class="w4smallText">Form </span><span class="normalText"><b>W-4</b></span> <span class="w4smallText">(2018)</span></td>
</tr>
</tbody>
</table>
</div>
<div> </div><div class="signatureBlock signatureMetadata"><p class="signatureHeader">Electronic Signature Process Record</p><p>The document above has been electronically signed in accordance with the law.</p><p><span title="The document above, uniquely identified by this YUID, has been electronically signed in accordance with the law.">YUID: <b>ccc1bb24-7f1d-43f6-99c2-4ef352001191-4abac535-d043-4389-9a56-4992de07cf65</b></span></p><p>Signing party: Employee<br /> Signer ID: a7291bc3-bc0e-4544-8d47-5426a05183bb<br /> IP Address: 50-46-118-196.evrt.wa.frontiernet.net (50.46.118.196)<br /> Timestamp: 2019-02-16 12:40:39 PST (2019-02-16 20:40:39.290Z)<br /> Email: email@example.com<br /> User: Example <email@example.com> (8e2d38ce-7457-406f-9fb0-c174d2bc997d)</p></div>
</div>
</body>
</html>
]]>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="OpenESignForms_Seal">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2006/12/xml-c14n11#WithComments"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha512"/>
<ds:Reference Id="Payload_Reference_ID" URI="">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"/>
<ds:DigestValue>F8mgu0S9tyosrWPJ2yQlPwNwZb8p2SO+C0LN8M3bcqT3cbhZGFKyfa7OLug7ORh4iif8pGEx27Or
XFdBhoBt9g==</ds:DigestValue>
</ds:Reference>
<ds:Reference URI="#KeyInfo_ID">
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"/>
<ds:DigestValue>HnULuiA4yy72qDreCaGQXm1QZtXu8rOd4OaHZ9raXfqexEuCq1qJ0DOewHsCxQCx9kyWkB1IHCc8
m7/DAPcXbg==</ds:DigestValue>
</ds:Reference>
<ds:Reference URI="#QualifyingProperties_ID">
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"/>
<ds:DigestValue>v7ljecvM5AEIgoUoYpBqBt6UZjhFxolIN2Qpbt5/r17822tpITwiT81ONM/tx4u+/eSIiS/vsMKt
hA9ICyPrJg==</ds:DigestValue>
</ds:Reference>
<ds:Reference URI="#OpenESignForms_Seal_ID">
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"/>
<ds:DigestValue>EEWzubdiWHJkKuotkoHfYYY+pgazuedJi3/1+Ir6D0bn0mKIBn9lWg8DaPY3b6m86xVevgHQNZQj
wylwUG68Hg==</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>YvsJhtoCLEkyHYQDl6mNwnL7qOJuL7SzahVOdaEnHnZvkpHIxRC7xqqlehEKtN46f4+TH5+o8n56
f7WmBcx79cQc6Ihhl1OnwTmttLBhUWx/qSm8PCQ4bC7Pl3Pabb+9QXDCV2ph7h3aJgh2BdU3r+Ib
WSqPC/VZB3Kmd4MxPpo1BBuAkMG/BWpCsHsp3EHMYfrDWh14aZicTEXn8zQ6fZrB/3/fU6Uh3hpn
OMHzdfot9qmR4KIQ5KbumlfBRWKS44lmJLQR55LcMZI/WyWDsn3vcsITOjLYeHtj3th8cwpDauvm
oXzKoRr5XZw4dSu6/bI262pKgCGs2dFPAnDBtQIyoaT5DFrrcztUY6YVWcx9PsrRz0qo0BQGBVTu
5bYdaD8ftgMJEfLTya/XrDab+Z+6ICU6AeAmxAkBeXhCn9/f++/nh8vxHp3QLlPaM4Elkisen1e/
vCV1U/6vdnbikrdbAVlTmgTVu2UmcsMO0BiuNuhA4ch6uI0X48MMWX3OCNNSSHls5EZGAxBFTWOR
dY7XS8w20Yc8F0LGMIPBvq11AWpQPVWzMEUcU5nGxP9sv//2piQLV3bexMUO2EgBjDYkd5LKZOqz
OGask92kiPG6RSnS8bufYJrP/TB+8NAugQcxSOUoVQAhp4WFSCXxiR6iAD168A3o5ZPbHDuu4EQ=</ds:SignatureValue>
<ds:KeyInfo Id="KeyInfo_ID">
<ds:KeyName>021eddcd-ebd0-4603-8b26-24b3f7fee682</ds:KeyName>
<ds:KeyValue>
<ds:RSAKeyValue>
<ds:Modulus>iSEKAXeyDOq1RKCwypjN5iuU2uR//YM4ssMBGBCtfpq7eF6pXm0rU5Zz4LnmoptUyu4IcnrStgRr
JP3NPOeHgibR8i/Ef9frzd4rCwX2JpY3tztCGYByzk93ln7tzRYnMug9q0IVk6Far7JxBIuMy/eg
LOyptCZGnRU8wV6D+gydsdoFsaR+zghMtBmoZ8sArGd81rzq28B3NDdqrd4camU7viI+5mMTRGJn
UtBzU/4p7kxv2gePzUc2vJ76+8I1eUGbqc7Co12q8vS+wGpQ4a0lUiWJwj7BRXR21oPz+Qo5fiqb
a/mSo0gv11s3T2oHTTzWSyvTPb2wbwyBSFAVVaoqJ0g01UEjU2Lv2RkTi/YZpyyPPUDh4OA1KMfX
f3M7wxzS0+tJFfE4O4ELsaYlcRElVIor1y98LPKmqWgTg0olfU8H00igjbJdU37SzyqygqNadZlC
ocTtaMvveNIkDURAPPZS/Llp1KUm4YY29m+Of0JK0ZoEBLIj5R0uEIpOBe0MWhH4d8l5mxn8IKpR
chGgxgJ4P7bNpPQmPUH2rpFukV0NIPe946X7oJE/NubjePyQxpQwwE6zzavz0rf9s4OQpW7tdG/+
fyubGHXq4H/DH4ZZt0KBuIhLfqjEd3mgyzp4waihnkn4bhcRFm8s5UJEuszp6BkD0EHcPfN76Uk=</ds:Modulus>
<ds:Exponent>AQAB</ds:Exponent>
</ds:RSAKeyValue>
</ds:KeyValue>
<ds:X509Data>
<ds:X509Certificate>MIIKkDCCCHigAwIBAgIIXjPAnc0XFeIwDQYJKoZIhvcNAQENBQAwgcIxOTA3BgNVBAMMME9wZW5f
ZVNpZ25Gb3Jtc19odHRwczovL29wZW4uZXNpZ25mb3Jtcy5jb20vZGVtbzE6MDgGA1UECgwxRGVw
bG95bWVudElEL2JiZmU5YmVkLTkxOGQtNDQ2Yi05NTE4LThlYzMwM2JhZmI4MzE8MDoGA1UECwwz
U2lnbmF0dXJlS2V5SUQvMDIxZWRkY2QtZWJkMC00NjAzLThiMjYtMjRiM2Y3ZmVlNjgyMQswCQYD
VQQGEwJVUzAeFw0xMTA0MTYwMzIxMzhaFw0yMTA0MTYwMzIxMzhaMIHCMTkwNwYDVQQDDDBPcGVu
X2VTaWduRm9ybXNfaHR0cHM6Ly9vcGVuLmVzaWduZm9ybXMuY29tL2RlbW8xOjA4BgNVBAoMMURl
cGxveW1lbnRJRC9iYmZlOWJlZC05MThkLTQ0NmItOTUxOC04ZWMzMDNiYWZiODMxPDA6BgNVBAsM
M1NpZ25hdHVyZUtleUlELzAyMWVkZGNkLWViZDAtNDYwMy04YjI2LTI0YjNmN2ZlZTY4MjELMAkG
A1UEBhMCVVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCJIQoBd7IM6rVEoLDKmM3m
K5Ta5H/9gziywwEYEK1+mrt4XqlebStTlnPgueaim1TK7ghyetK2BGsk/c0854eCJtHyL8R/1+vN
3isLBfYmlje3O0IZgHLOT3eWfu3NFicy6D2rQhWToVqvsnEEi4zL96As7Km0JkadFTzBXoP6DJ2x
2gWxpH7OCEy0GahnywCsZ3zWvOrbwHc0N2qt3hxqZTu+Ij7mYxNEYmdS0HNT/inuTG/aB4/NRza8
nvr7wjV5QZupzsKjXary9L7AalDhrSVSJYnCPsFFdHbWg/P5Cjl+Kptr+ZKjSC/XWzdPagdNPNZL
K9M9vbBvDIFIUBVVqionSDTVQSNTYu/ZGROL9hmnLI89QOHg4DUox9d/czvDHNLT60kV8Tg7gQux
piVxESVUiivXL3ws8qapaBODSiV9TwfTSKCNsl1TftLPKrKCo1p1mUKhxO1oy+940iQNREA89lL8
uWnUpSbhhjb2b45/QkrRmgQEsiPlHS4Qik4F7QxaEfh3yXmbGfwgqlFyEaDGAng/ts2k9CY9Qfau
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
9zGxY4cvR4vn4VtWcebg9AVMJCwhV85c7l0P0uU=</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
<ds:Object>
<xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.4.1#" Id="QualifyingProperties_ID" Target="#OpenESignForms_Seal">
<xades:SignedProperties>
<xades:SignedSignatureProperties>
<xades:SigningTime>2019-02-16T12:40:45-08:00</xades:SigningTime>
</xades:SignedSignatureProperties>
<xades:SignedDataObjectProperties>
<xades:DataObjectFormat ObjectReference="#Payload_Reference_ID">
<xades:Description>W-4.html</xades:Description>
<xades:MimeType>text/html</xades:MimeType>
</xades:DataObjectFormat>
</xades:SignedDataObjectProperties>
</xades:SignedProperties>
</xades:QualifyingProperties>
</ds:Object>
<ds:Object>
<ds:SignatureProperties>
<ds:SignatureProperty Id="OpenESignForms_Seal_ID" Target="#OpenESignForms_Seal">
<OpenESignForms_XmlDigitalSignatureSeal DeploymentHostAddress="104.239.136.116" DeploymentHostName="open.esignforms.com" DeploymentId="bbfe9bed-918d-446b-9518-8ec303bafb83" SignerAddress="50-46-118-196.evrt.wa.frontiernet.net (50.46.118.196)" SignerAgent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.3 Safari/605.1.15" Timestamp="2019-02-16T12:40:45-08:00" Version="19.1.19_p0215_1750"/>
</ds:SignatureProperty>
</ds:SignatureProperties>
</ds:Object>
</ds:Signature>
</snapshot>
<snapshot xmlns="http://open.esignforms.com/XMLSchema/2019" timestamp="2019-02-16T12:40:45-08:00" type="data">
<esfRecord xmlns="http://open.esignforms.com/XMLSchema/2009">
<id>3223afb5-bd03-4b8a-84c4-62452edf2ec6</id>
<esfname>W4</esfname>
<encrypt>true</encrypt>
<compress>true</compress>
<nameValues count="18">
<nameValue clone="false">
<name>signature_IPOnly</name>
<value>50.46.118.196</value>
</nameValue>
<nameValue>
<name>firstName</name>
<value>Test</value>
</nameValue>
<nameValue>
<name>city</name>
<value>Kirkland</value>
</nameValue>
<nameValue clone="false">
<name>signature</name>
<value>Test signature</value>
</nameValue>
<nameValue clone="false" type="datetime">
<name>signature_Timestamp</name>
<value>2019-02-16T20:40:45Z</value>
</nameValue>
<nameValue>
<name>rbMaritalStatus</name>
<value>Single</value>
</nameValue>
<nameValue clone="false" type="date">
<name>signatureDate</name>
<value>2019-02-16</value>
</nameValue>
<nameValue>
<name>cbLastNameDiffer</name>
<value/>
</nameValue>
<nameValue>
<name>middleName</name>
<value/>
</nameValue>
<nameValue type="money">
<name>additionalAmount</name>
<value null="true"/>
</nameValue>
<nameValue>
<name>lastName</name>
<value>Last</value>
</nameValue>
<nameValue>
<name>ssn</name>
<value>123456789</value>
</nameValue>
<nameValue>
<name>zipCode</name>
<value>98033</value>
</nameValue>
<nameValue>
<name>streetAddress</name>
<value>123 Main St.</value>
</nameValue>
<nameValue>
<name>exempt</name>
<value/>
</nameValue>
<nameValue>
<name>state</name>
<value>WA</value>
</nameValue>
<nameValue type="integer">
<name>numAllowances</name>
<value>0</value>
</nameValue>
<nameValue clone="false">
<name>signature_IP</name>
<value>50-46-118-196.evrt.wa.frontiernet.net (50.46.118.196)</value>
</nameValue>
</nameValues>
</esfRecord>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="OpenESignForms_Seal">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2006/12/xml-c14n11#WithComments"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha512"/>
<ds:Reference Id="Payload_Reference_ID" URI="">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"/>
<ds:DigestValue>7Do65Ffl6kW/TIFOAp1S8e9ZFUestgPmyVppeCMuqky3nU4YhhRCPA/NSXfom5sPLM+7x3MFhVnW
amd426jynw==</ds:DigestValue>
</ds:Reference>
<ds:Reference URI="#KeyInfo_ID">
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"/>
<ds:DigestValue>HnULuiA4yy72qDreCaGQXm1QZtXu8rOd4OaHZ9raXfqexEuCq1qJ0DOewHsCxQCx9kyWkB1IHCc8
m7/DAPcXbg==</ds:DigestValue>
</ds:Reference>
<ds:Reference URI="#QualifyingProperties_ID">
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"/>
<ds:DigestValue>YJ9B8y8c0mzLZYRUsAywTXnVgPPTCsVkjo4RYuOK9wvcAFCIEbyg+JDX672bzcNAmRl9Eowwe4Rd
VkZODsVoRQ==</ds:DigestValue>
</ds:Reference>
<ds:Reference URI="#OpenESignForms_Seal_ID">
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"/>
<ds:DigestValue>EEWzubdiWHJkKuotkoHfYYY+pgazuedJi3/1+Ir6D0bn0mKIBn9lWg8DaPY3b6m86xVevgHQNZQj
wylwUG68Hg==</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>Usqn96PqLVA41nzk+pd2HXizm0RF9dwpI3GZ89pZTG7jvvJcBBNl/TtJ8qhgOSqZ5sSQ+m8bgDXq
bDfmwtCtbJ6QqlEPC69alMhI5J2AyUYqZ17B2P7ZYpalFdcelxQ2qaGm92FAm7SW30UIRY6GkB3v
w9ev8MdRgJbuJVNdRZJw1PDM7EmbxD371tkAo40s0H5RTKC2vTlscG4goZfM1EJxKCl12l4RjHPV
lnQpu2+9MJ268EMyi9oJNxeG91hqx4Ng4U02/jtdMxQLmeEzIAC7XD0x79NSPP7rqWcwKcs9bQWt
2XiVIL+gFduncD3PXXvyBBI3neHk3Vm5djpBURVChT1jz6LowqGFkS8QNDpCifwwKWfErlH+7nZf
58e2nNOYmYiZxiIPArOfUFCcxZh9AaNvIAIcNb1t2cwL/fkPUuH/y5yKbvK/nHMGVI2zjenwmxgH
q7oSq2gNrnf+7gVg8PC2RQKt0SNVlJqfQ7nsyOCDQD1ouno0+YXrIk9B3HWT70XYF5nIgaoNUOk4
GKBCepV6rLenzXEOF52oWw8FDBEToNCBhN5TGYRLmbpdXACB/JmmGom1z6MIMbeQg7NxEHZOUVVm
1JCIb7SSZAgb0s0yRKe69pP9VD3/DwXF3QtYabechDjkeNqHyASrDk9BHFqfFpBCTEiaAvfzZSU=</ds:SignatureValue>
<ds:KeyInfo Id="KeyInfo_ID">
<ds:KeyName>021eddcd-ebd0-4603-8b26-24b3f7fee682</ds:KeyName>
<ds:KeyValue><ds:RSAKeyValue>
<ds:Modulus>iSEKAXeyDOq1RKCwypjN5iuU2uR//YM4ssMBGBCtfpq7eF6pXm0rU5Zz4LnmoptUyu4IcnrStgRr
JP3NPOeHgibR8i/Ef9frzd4rCwX2JpY3tztCGYByzk93ln7tzRYnMug9q0IVk6Far7JxBIuMy/eg
LOyptCZGnRU8wV6D+gydsdoFsaR+zghMtBmoZ8sArGd81rzq28B3NDdqrd4camU7viI+5mMTRGJn
UtBzU/4p7kxv2gePzUc2vJ76+8I1eUGbqc7Co12q8vS+wGpQ4a0lUiWJwj7BRXR21oPz+Qo5fiqb
a/mSo0gv11s3T2oHTTzWSyvTPb2wbwyBSFAVVaoqJ0g01UEjU2Lv2RkTi/YZpyyPPUDh4OA1KMfX
f3M7wxzS0+tJFfE4O4ELsaYlcRElVIor1y98LPKmqWgTg0olfU8H00igjbJdU37SzyqygqNadZlC
ocTtaMvveNIkDURAPPZS/Llp1KUm4YY29m+Of0JK0ZoEBLIj5R0uEIpOBe0MWhH4d8l5mxn8IKpR
chGgxgJ4P7bNpPQmPUH2rpFukV0NIPe946X7oJE/NubjePyQxpQwwE6zzavz0rf9s4OQpW7tdG/+
fyubGHXq4H/DH4ZZt0KBuIhLfqjEd3mgyzp4waihnkn4bhcRFm8s5UJEuszp6BkD0EHcPfN76Uk=</ds:Modulus>
<ds:Exponent>AQAB</ds:Exponent>
</ds:RSAKeyValue>
</ds:KeyValue>
<ds:X509Data> <ds:X509Certificate>MIIKkDCCCHigAwIBAgIIXjPAnc0XFeIwDQYJKoZIhvcNAQENBQAwgcIxOTA3BgNVBAMMME9wZW5f
ZVNpZ25Gb3Jtc19odHRwczovL29wZW4uZXNpZ25mb3Jtcy5jb20vZGVtbzE6MDgGA1UECgwxRGVw
bG95bWVudElEL2JiZmU5YmVkLTkxOGQtNDQ2Yi05NTE4LThlYzMwM2JhZmI4MzE8MDoGA1UECwwz
U2lnbmF0dXJlS2V5SUQvMDIxZWRkY2QtZWJkMC00NjAzLThiMjYtMjRiM2Y3ZmVlNjgyMQswCQYD
VQQGEwJVUzAeFw0xMTA0MTYwMzIxMzhaFw0yMTA0MTYwMzIxMzhaMIHCMTkwNwYDVQQDDDBPcGVu
X2VTaWduRm9ybXNfaHR0cHM6Ly9vcGVuLmVzaWduZm9ybXMuY29tL2RlbW8xOjA4BgNVBAoMMURl
cGxveW1lbnRJRC9iYmZlOWJlZC05MThkLTQ0NmItOTUxOC04ZWMzMDNiYWZiODMxPDA6BgNVBAsM
M1NpZ25hdHVyZUtleUlELzAyMWVkZGNkLWViZDAtNDYwMy04YjI2LTI0YjNmN2ZlZTY4MjELMAkG
A1UEBhMCVVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCJIQoBd7IM6rVEoLDKmM3m
K5Ta5H/9gziywwEYEK1+mrt4XqlebStTlnPgueaim1TK7ghyetK2BGsk/c0854eCJtHyL8R/1+vN
3isLBfYmlje3O0IZgHLOT3eWfu3NFicy6D2rQhWToVqvsnEEi4zL96As7Km0JkadFTzBXoP6DJ2x
2gWxpH7OCEy0GahnywCsZ3zWvOrbwHc0N2qt3hxqZTu+Ij7mYxNEYmdS0HNT/inuTG/aB4/NRza8
nvr7wjV5QZupzsKjXary9L7AalDhrSVSJYnCPsFFdHbWg/P5Cjl+Kptr+ZKjSC/XWzdPagdNPNZL
K9M9vbBvDIFIUBVVqionSDTVQSNTYu/ZGROL9hmnLI89QOHg4DUox9d/czvDHNLT60kV8Tg7gQux
piVxESVUiivXL3ws8qapaBODSiV9TwfTSKCNsl1TftLPKrKCo1p1mUKhxO1oy+940iQNREA89lL8
uWnUpSbhhjb2b45/QkrRmgQEsiPlHS4Qik4F7QxaEfh3yXmbGfwgqlFyEaDGAng/ts2k9CY9Qfau
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
9zGxY4cvR4vn4VtWcebg9AVMJCwhV85c7l0P0uU=</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
<ds:Object>
<xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.4.1#" Id="QualifyingProperties_ID" Target="#OpenESignForms_Seal">
<xades:SignedProperties>
<xades:SignedSignatureProperties>
<xades:SigningTime>2019-02-16T12:40:45-08:00</xades:SigningTime>
</xades:SignedSignatureProperties>
<xades:SignedDataObjectProperties>
<xades:DataObjectFormat ObjectReference="#Payload_Reference_ID">
<xades:Description>W-4.xml</xades:Description>
<xades:MimeType>application/xml</xades:MimeType>
</xades:DataObjectFormat>
</xades:SignedDataObjectProperties>
</xades:SignedProperties>
</xades:QualifyingProperties>
</ds:Object>
<ds:Object>
<ds:SignatureProperties>
<ds:SignatureProperty Id="OpenESignForms_Seal_ID" Target="#OpenESignForms_Seal">
<OpenESignForms_XmlDigitalSignatureSeal DeploymentHostAddress="104.239.136.116" DeploymentHostName="open.esignforms.com" DeploymentId="bbfe9bed-918d-446b-9518-8ec303bafb83" SignerAddress="50-46-118-196.evrt.wa.frontiernet.net (50.46.118.196)" SignerAgent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.3 Safari/605.1.15" Timestamp="2019-02-16T12:40:45-08:00" Version="19.1.19_p0215_1750"/>
</ds:SignatureProperty>
</ds:SignatureProperties>
</ds:Object></ds: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/2019" timestamp="2019-02-16T12:40:45-08:00" type="document">
<!-- Standard XML Digital Signature inserted into the XML data via Open eSignForms -->
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="OpenESignForms_Seal">
<ds:SignedInfo>
<!-- Uniform XML formatting before signature is applied -->
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2006/12/xml-c14n11#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. -->
<ds: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 -->
<ds:Reference Id="Payload_Reference_ID" URI="">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"/>
<ds:DigestValue>F8mgu0S9tyosrWPJ2yQlPwNwZb8p2SO+C0LN8M3bcqT3cbhZGFKyfa7OLug7ORh4iif8pGEx27Or
XFdBhoBt9g==</ds:DigestValue>
</ds:Reference>
<!-- We sign the KeyInfo to prevent key substitution per XAdES -->
<ds:Reference URI="#KeyInfo_ID">
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"/>
<ds:DigestValue>HnULuiA4yy72qDreCaGQXm1QZtXu8rOd4OaHZ9raXfqexEuCq1qJ0DOewHsCxQCx9kyWkB1IHCc8
m7/DAPcXbg==</ds:DigestValue>
</ds:Reference>
<!-- We sign the QualifyingProperties per XAdES -->
<ds:Reference URI="#QualifyingProperties_ID">
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"/>
<ds:DigestValue>v7ljecvM5AEIgoUoYpBqBt6UZjhFxolIN2Qpbt5/r17822tpITwiT81ONM/tx4u+/eSIiS/vsMKt
hA9ICyPrJg==</ds:DigestValue>
</ds:Reference>
<!-- We include extra deployment identifiers in our Seal regarding the generating system -->
<ds:Reference URI="#OpenESignForms_Seal_ID">
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"/>
<ds:DigestValue>EEWzubdiWHJkKuotkoHfYYY+pgazuedJi3/1+Ir6D0bn0mKIBn9lWg8DaPY3b6m86xVevgHQNZQj
wylwUG68Hg==</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<!-- This is the actual digital signature created across the above four References -->
<ds:SignatureValue>YvsJhtoCLEkyHYQDl6mNwnL7qOJuL7SzahVOdaEnHnZvkpHIxRC7xqqlehEKtN46f4+TH5+o8n56
f7WmBcx79cQc6Ihhl1OnwTmttLBhUWx/qSm8PCQ4bC7Pl3Pabb+9QXDCV2ph7h3aJgh2BdU3r+Ib
WSqPC/VZB3Kmd4MxPpo1BBuAkMG/BWpCsHsp3EHMYfrDWh14aZicTEXn8zQ6fZrB/3/fU6Uh3hpn
OMHzdfot9qmR4KIQ5KbumlfBRWKS44lmJLQR55LcMZI/WyWDsn3vcsITOjLYeHtj3th8cwpDauvm
oXzKoRr5XZw4dSu6/bI262pKgCGs2dFPAnDBtQIyoaT5DFrrcztUY6YVWcx9PsrRz0qo0BQGBVTu
5bYdaD8ftgMJEfLTya/XrDab+Z+6ICU6AeAmxAkBeXhCn9/f++/nh8vxHp3QLlPaM4Elkisen1e/
vCV1U/6vdnbikrdbAVlTmgTVu2UmcsMO0BiuNuhA4ch6uI0X48MMWX3OCNNSSHls5EZGAxBFTWOR
dY7XS8w20Yc8F0LGMIPBvq11AWpQPVWzMEUcU5nGxP9sv//2piQLV3bexMUO2EgBjDYkd5LKZOqz
OGask92kiPG6RSnS8bufYJrP/TB+8NAugQcxSOUoVQAhp4WFSCXxiR6iAD168A3o5ZPbHDuu4EQ=</ds:SignatureValue>
<!-- The public key and its UUID along with the X.509 certificate
that can be used to verify the digital signature -->
<ds:KeyInfo Id="KeyInfo_ID">
<ds:KeyName>021eddcd-ebd0-4603-8b26-24b3f7fee682</ds:KeyName>
<ds:KeyValue>
<ds:RSAKeyValue>
<ds:Modulus>iSEKAXeyDOq1RKCwypjN5iuU2uR//YM4ssMBGBCtfpq7eF6pXm0rU5Zz4LnmoptUyu4IcnrStgRr
JP3NPOeHgibR8i/Ef9frzd4rCwX2JpY3tztCGYByzk93ln7tzRYnMug9q0IVk6Far7JxBIuMy/eg
LOyptCZGnRU8wV6D+gydsdoFsaR+zghMtBmoZ8sArGd81rzq28B3NDdqrd4camU7viI+5mMTRGJn
UtBzU/4p7kxv2gePzUc2vJ76+8I1eUGbqc7Co12q8vS+wGpQ4a0lUiWJwj7BRXR21oPz+Qo5fiqb
a/mSo0gv11s3T2oHTTzWSyvTPb2wbwyBSFAVVaoqJ0g01UEjU2Lv2RkTi/YZpyyPPUDh4OA1KMfX
f3M7wxzS0+tJFfE4O4ELsaYlcRElVIor1y98LPKmqWgTg0olfU8H00igjbJdU37SzyqygqNadZlC
ocTtaMvveNIkDURAPPZS/Llp1KUm4YY29m+Of0JK0ZoEBLIj5R0uEIpOBe0MWhH4d8l5mxn8IKpR
chGgxgJ4P7bNpPQmPUH2rpFukV0NIPe946X7oJE/NubjePyQxpQwwE6zzavz0rf9s4OQpW7tdG/+
fyubGHXq4H/DH4ZZt0KBuIhLfqjEd3mgyzp4waihnkn4bhcRFm8s5UJEuszp6BkD0EHcPfN76Uk=</ds:Modulus>
<ds:Exponent>AQAB</ds:Exponent>
</ds:RSAKeyValue>
</ds:KeyValue>
<ds:X509Data>
<ds:X509Certificate>MIIKkDCCCHigAwIBAgIIXjPAnc0XFeIwDQYJKoZIhvcNAQENBQAwgcIxOTA3BgNVBAMMME9wZW5f
ZVNpZ25Gb3Jtc19odHRwczovL29wZW4uZXNpZ25mb3Jtcy5jb20vZGVtbzE6MDgGA1UECgwxRGVw
bG95bWVudElEL2JiZmU5YmVkLTkxOGQtNDQ2Yi05NTE4LThlYzMwM2JhZmI4MzE8MDoGA1UECwwz
U2lnbmF0dXJlS2V5SUQvMDIxZWRkY2QtZWJkMC00NjAzLThiMjYtMjRiM2Y3ZmVlNjgyMQswCQYD
VQQGEwJVUzAeFw0xMTA0MTYwMzIxMzhaFw0yMTA0MTYwMzIxMzhaMIHCMTkwNwYDVQQDDDBPcGVu
X2VTaWduRm9ybXNfaHR0cHM6Ly9vcGVuLmVzaWduZm9ybXMuY29tL2RlbW8xOjA4BgNVBAoMMURl
cGxveW1lbnRJRC9iYmZlOWJlZC05MThkLTQ0NmItOTUxOC04ZWMzMDNiYWZiODMxPDA6BgNVBAsM
M1NpZ25hdHVyZUtleUlELzAyMWVkZGNkLWViZDAtNDYwMy04YjI2LTI0YjNmN2ZlZTY4MjELMAkG
A1UEBhMCVVMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCJIQoBd7IM6rVEoLDKmM3m
K5Ta5H/9gziywwEYEK1+mrt4XqlebStTlnPgueaim1TK7ghyetK2BGsk/c0854eCJtHyL8R/1+vN
3isLBfYmlje3O0IZgHLOT3eWfu3NFicy6D2rQhWToVqvsnEEi4zL96As7Km0JkadFTzBXoP6DJ2x
2gWxpH7OCEy0GahnywCsZ3zWvOrbwHc0N2qt3hxqZTu+Ij7mYxNEYmdS0HNT/inuTG/aB4/NRza8
nvr7wjV5QZupzsKjXary9L7AalDhrSVSJYnCPsFFdHbWg/P5Cjl+Kptr+ZKjSC/XWzdPagdNPNZL
K9M9vbBvDIFIUBVVqionSDTVQSNTYu/ZGROL9hmnLI89QOHg4DUox9d/czvDHNLT60kV8Tg7gQux
piVxESVUiivXL3ws8qapaBODSiV9TwfTSKCNsl1TftLPKrKCo1p1mUKhxO1oy+940iQNREA89lL8
uWnUpSbhhjb2b45/QkrRmgQEsiPlHS4Qik4F7QxaEfh3yXmbGfwgqlFyEaDGAng/ts2k9CY9Qfau
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
9zGxY4cvR4vn4VtWcebg9AVMJCwhV85c7l0P0uU=</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
<!-- QualifyingProperties per XAdES has the signing time, file name and file type -->
<ds:Object>
<xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.4.1#" Id="QualifyingProperties_ID" Target="#OpenESignForms_Seal">
<xades:SignedProperties>
<xades:SignedSignatureProperties>
<xades:SigningTime>2019-02-16T12:40:45-08:00</xades:SigningTime>
</xades:SignedSignatureProperties>
<xades:SignedDataObjectProperties>
<xades:DataObjectFormat ObjectReference="#Payload_Reference_ID">
<xades:Description>W-4.html</xades:Description>
<xades:MimeType>text/html</xades:MimeType>
</xades:DataObjectFormat>
</xades:SignedDataObjectProperties>
</xades:SignedProperties>
</xades:QualifyingProperties>
</ds: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. -->
<ds:Object>
<ds:SignatureProperties>
<ds:SignatureProperty Id="OpenESignForms_Seal_ID" Target="#OpenESignForms_Seal">
<OpenESignForms_XmlDigitalSignatureSeal DeploymentHostAddress="104.239.136.116" DeploymentHostName="open.esignforms.com" DeploymentId="bbfe9bed-918d-446b-9518-8ec303bafb83" SignerAddress="50-46-118-196.evrt.wa.frontiernet.net (50.46.118.196)" SignerAgent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.3 Safari/605.1.15" Timestamp="2019-02-16T12:40:45-08:00" Version="19.1.19_p0215_1750"/>
</ds:SignatureProperty>
</ds:SignatureProperties>
</ds:Object>
</ds: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-2019 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.FileInputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.security.Key;
import java.security.KeyException;
import java.security.PublicKey;
import java.util.Iterator;
import java.util.List;
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 javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
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 as of Java, but not in the API yet...
private static final String SignatureMethod_RSA_SHA512 = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha512";
private final static String XML_NAMESPACE_2011 = "http://open.esignforms.com/XMLSchema/2011"; // OpenESF signatures through 19.1.19 release
private final static String XML_NAMESPACE_2019 = "http://open.esignforms.com/XMLSchema/2019"; // OpenESF signatures after 19.1.19 release
// For the ETSI XAdES advanced signature QualifyingProperties element
private static final String ETSI_XAdES_NAMESPACE = "http://uri.etsi.org/01903/v1.4.1#";
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")))));
Element rootElement = document.getDocumentElement();
String ns = rootElement.getNamespaceURI();
if ( XML_NAMESPACE_2019.equals(ns) ) {
NodeList qualifyingPropertiesNodeList = document.getElementsByTagNameNS(ETSI_XAdES_NAMESPACE, "QualifyingProperties");
if (qualifyingPropertiesNodeList != null && qualifyingPropertiesNodeList.getLength() > 0) {
for (int i = 0; i < qualifyingPropertiesNodeList.getLength(); ++i) {
Element qualifyingPropertiesElement = (Element) qualifyingPropertiesNodeList.item(i);
if (qualifyingPropertiesElement != null)
qualifyingPropertiesElement.setIdAttributeNS(null, "Id", true); // mark our id as the "Id" attribute
}
}
} else if ( XML_NAMESPACE_2011.equals(ns) ) {
NodeList qualifyingPropertiesNodeList = document.getElementsByTagName("QualifyingProperties");
if (qualifyingPropertiesNodeList != null) {
for (int i = 0; i < qualifyingPropertiesNodeList.getLength(); ++i) {
Element qualifyingPropertiesElement = (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++) {
Reference ref = (Reference) i.next();
boolean refValid = ref.validate(valContext);
exceptionText.append("; ").append(getReferenceName(ref,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 getReferenceName(Reference ref, int i) {
String uri = ref.getURI();
if ( uri == null )
uri = "";
String id = ref.getId();
if ( id == null )
id = "";
return "Reference[" + i + "] (URI=" + uri + "; id=" + id + ")";
}
static void validateElement(Element e, int size) throws Exception {
XmlDigitalSignatureSimpleVerifier verifier = new XmlDigitalSignatureSimpleVerifier();
Writer writer = new StringWriter(size);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.transform(new DOMSource(e), new StreamResult(writer));
String signedSnapshotXml = writer.toString();
verifier.verify(signedSnapshotXml);
}
public static void main(String[] args) throws IOException {
if (args.length < 1) {
System.err.println("Usage: XmlDigitalSignatureSimpleVerifier <signedXmlSnapshotFileName>...");
System.exit(1);
}
for (String f : args) {
File file = new File(f);
if (file.exists() && file.canRead()) {
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
Document document = dbf.newDocumentBuilder().parse(new BufferedInputStream(new FileInputStream(file)));
Element rootElement = document.getDocumentElement();
String ns = rootElement.getNamespaceURI();
String rootNodeName = rootElement.getNodeName();
// If it's an OpenESF generated XML digital signature, it likely is the snapshots element with both a document and data snapshot
if ( "snapshots".equals(rootNodeName) ) {
NodeList snapshotList = rootElement.getElementsByTagNameNS(ns,"snapshot");
for (int i=0; i < snapshotList.getLength(); ++i ) {
Element snapshotElement = (Element)snapshotList.item(i);
String type = snapshotElement.getAttribute("type");
String timestamp = snapshotElement.getAttribute("timestamp");
try {
validateElement(snapshotElement, (int)file.length());
System.err.println("Signature for embedded snapshot element type: " + type + "; timestamp: " + timestamp + "; validated SUCCESSFULLY from file: " + file.getAbsolutePath());
} catch (Exception e) {
System.err.println("Signature for embedded snapshot element type: " + type + "; timestamp: " + timestamp + "; validation FAILED from file: " + file.getAbsolutePath() + "; exception: " + e.getMessage());
}
}
} else if ( "snapshot".equals(rootNodeName) ) {
String type = rootElement.getAttribute("type");
String timestamp = rootElement.getAttribute("timestamp");
try {
validateElement(rootElement, (int)file.length());
System.err.println("Signature for standalone snapshot element type: " + type + "; timestamp: " + timestamp + "; validated SUCCESSFULLY from file: " + file.getAbsolutePath());
} catch (Exception e) {
System.err.println("Signature for standalone snapshot element type: " + type + "; timestamp: " + timestamp + "; validation FAILED from file: " + file.getAbsolutePath() + "; exception: " + e.getMessage());
}
} else {
// This is not an OpenESF digitally signed content, so let's try to validate whatever it is!
try {
validateElement(rootElement, (int)file.length());
System.err.println("Signature for '" + rootNodeName + "' element validated SUCCESSFULLY from file: " + file.getAbsolutePath());
} catch (Exception e) {
System.err.println("Signature for '" + rootNodeName + "' element validation FAILED from file: " + file.getAbsolutePath() + "; exception: " + e.getMessage());
}
}
} catch (java.io.IOException e) {
System.err.println("I/O Error: Could not read the XML contents from file named: " + file.getAbsolutePath());
} catch (DOMException e) {
System.err.println("DOM Error: Could not parse XML contents from file named: " + file.getAbsolutePath());
} catch (Exception 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);
}
}