<!DOCTYPE schema
   PUBLIC "-//W3C//DTD XMLSCHEMA 200010//EN" "http://www.w3.org/2000/10/XMLSchema.dtd"
  [
   <!ATTLIST schema 
     xmlns:ds CDATA #FIXED "http://www.w3.org/2000/09/xmldsig#">
   <!ENTITY dsig 'http://www.w3.org/2000/09/xmldsig#'> 
  ]>


<schema xmlns="http://www.w3.org/2000/10/XMLSchema"
      xmlns:ds="&dsig;"
      targetNamespace="&dsig;"
      version="0.1"
      elementFormDefault="qualified"> 

<!-- Basic Types Defined for Signatures -->

<simpleType name="CryptoBinary">
  <restriction base="binary">
   <encoding value="base64"/>
  </restriction>
</simpleType>

<!-- Start Signature -->

<element name="Signature"> 
  <complexType>
    <sequence> 
      <element ref="ds:SignedInfo"/> 
      <element ref="ds:SignatureValue"/> 
      <element ref="ds:KeyInfo" minOccurs="0"/> 
      <element ref="ds:Object" minOccurs="0" maxOccurs="unbounded"/> 
    </sequence>  
    <attribute name="Id" type="ID" use="optional"/> 
  </complexType>
</element> 

<!-- Start SignedInfo -->

<element name="SignedInfo"> 
  <complexType>
    <sequence> 
      <element ref="ds:CanonicalizationMethod"/> 
      <element ref="ds:SignatureMethod"/> 
      <element ref="ds:Reference" maxOccurs="unbounded"/> 
    </sequence>  
  <attribute name="Id" type="ID" use="optional"/> 
  </complexType>
</element> 

<element name="CanonicalizationMethod"> 
  <complexType>
    <sequence>
      <any namespace="##any" minOccurs="0" maxOccurs="unbounded"/>
    </sequence>
    <attribute name="Algorithm" type="uriReference" use="required"/> 
  </complexType>
</element> 

<element name="SignatureMethod"> 
  <complexType> 
    <sequence>
      <any namespace="##any" minOccurs="0" maxOccurs="unbounded"/>
    </sequence>
    <attribute name="Algorithm" type="uriReference" use="required"/> 
   </complexType>
</element> 

<element name="SignatureValue" type="ds:CryptoBinary"/> 

<!-- Start Reference -->

<element name="Reference"> 
  <complexType>
    <sequence> 
      <element ref="ds:Transforms" minOccurs="0"/> 
      <element ref="ds:DigestMethod"/> 
      <element ref="ds:DigestValue"/> 
    </sequence>
    <attribute name="Id" type="ID" use="optional"/> 
    <attribute name="URI" type="uriReference" use="optional"/> 
    <attribute name="Type" type="uriReference" use="optional"/> 
  </complexType>
</element> 

<element name="Transforms"> 
  <complexType> 
    <sequence>
      <element ref="ds:Transform" maxOccurs="unbounded"/>
    </sequence>  
  </complexType>
</element> 

  <element name="Transform"> 
    <complexType>
      <choice maxOccurs="unbounded"> 
        <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
        <element name="XSLT" type="string"/> 
        <!-- should be an xsl:stylesheet element -->
        <element name="XPath" type="string"/> 
      </choice>
      <attribute name="Algorithm" type="uriReference" use="required"/> 
    </complexType>
  </element>


<!-- End Reference -->

<element name="DigestMethod"> 
  <complexType> 
    <sequence>
      <any processContents="lax" minOccurs="0" maxOccurs="unbounded" namespace="##any"/>
    </sequence>
    <attribute name="Algorithm" type="uriReference" use="required"/> 
  </complexType>
</element> 

<element name="DigestValue" type="ds:CryptoBinary"/> 


<!-- End SignedInfo -->

<!-- Start KeyInfo -->

<element name="KeyInfo"> 
  <complexType>
    <choice maxOccurs="unbounded">     
      <any processContents="lax" namespace="##other" minOccurs="0" maxOccurs="unbounded"/> 
      <element name="KeyName" type="string"/> 
      <element ref="ds:KeyValue"/> 
      <element ref="ds:RetrievalMethod"/> 
      <element ref="ds:X509Data"/> 
      <element ref="ds:PGPData"/> 
      <element ref="ds:SPKIData"/>
      <element name="MgmtData" type="string"/>
    </choice>
    <attribute name="Id" type="ID" use="optional"/> 
  </complexType>
</element> 

<element name="KeyValue">
  <complexType mixed="true">
    <choice>
      <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
      <element ref="ds:DSAKeyValue"/>
      <element ref="ds:RSAKeyValue"/>
    </choice>
  </complexType>
</element>

<element name="RetrievalMethod">
  <complexType>
    <sequence>
      <element ref="ds:Transforms" minOccurs="0"/>
    </sequence>
    <attribute name="URI" type="uriReference"/>
    <attribute name="Type" type="uriReference" use="optional"/>
  </complexType>
</element> 

<!-- Start X509Data -->

<element name="X509Data"> 
   <complexType> 
    <choice>
      <sequence maxOccurs="unbounded"> 
        <choice> 
          <element ref="ds:X509IssuerSerial"/>
          <element name="X509SKI" type="ds:CryptoBinary"/>
          <element name="X509SubjectName" type="string"/> 
          <element name="X509Certificate" type="ds:CryptoBinary"/>
        </choice>  
      </sequence>
      <element name="X509CRL" type="ds:CryptoBinary"/>
    </choice>
  </complexType>
</element>

<element name="X509IssuerSerial"> 
   <complexType> 
    <sequence> 
      <element name="X509IssuerName" type="string"/> 
      <element name="X509SerialNumber" type="integer"/> 
    </sequence>
   </complexType>
</element>

<!-- End X509Data -->

<!-- Begin PGPData -->

<element name="PGPData"> 
  <complexType> 
    <choice>
      <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
      <sequence>
        <element name="PGPKeyID" type="string"/> 
        <element name="PGPKeyPacket" type="ds:CryptoBinary"/> 
      </sequence>  
    </choice>
  </complexType>
</element>

<!-- End PGPData -->

<!-- Begin SPKIData -->

<element name="SPKIData" type="string"/>

<!-- End SPKIData -->

<!-- End KeyInfo -->

<!-- Start Object (Manifest, SignatureProperty) -->

<element name="Object"> 
  <complexType mixed="true">
    <sequence maxOccurs="unbounded">
      <any namespace="##any" processContents="lax"/>
    </sequence>
    <attribute name="Id" type="ID" use="optional"/> 
    <attribute name="MimeType" type="string" use="optional"/> <!-- add a grep facet -->
    <attribute name="Encoding" type="uriReference" use="optional"/> 
  </complexType>
</element> 

<element name="Manifest"> 
  <complexType>
    <sequence>
      <element ref="ds:Reference" maxOccurs="unbounded"/> 
    </sequence>  
    <attribute name="Id" type="ID" use="optional"/> 
  </complexType>
</element> 

<element name="SignatureProperties"> 
  <complexType> 
    <sequence>
   <element ref="ds:SignatureProperty" maxOccurs="unbounded"/>
  </sequence> 
    <attribute name="Id" type="ID" use="optional"/> 
  </complexType>
</element> 

   <element name="SignatureProperty"> 
     <complexType mixed="true"> 
       <choice minOccurs="0" maxOccurs="unbounded">
         <any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
       </choice>
       <attribute name="Target" type="uriReference" use="required"/> 
       <attribute name="Id" type="ID" use="optional"/> 
       </complexType>
   </element> 

<!-- End Object (Manifest, SignatureProperty) -->

<!-- Start Algorithm Parameters -->

<element name="HMACOutputLength" type="integer"/>

<!-- Start KeyValue Element-types -->

<element name="DSAKeyValue"> 
  <complexType> 
    <sequence>
      <sequence>
        <element name="P" type="ds:CryptoBinary"/> 
        <element name="Q" type="ds:CryptoBinary"/> 
        <element name="G" type="ds:CryptoBinary"/> 
        <element name="Y" type="ds:CryptoBinary"/> 
        <element name="J" type="ds:CryptoBinary" minOccurs="0"/> 
      </sequence>
      <sequence minOccurs="0">
        <element name="Seed" type="ds:CryptoBinary"/> 
        <element name="PgenCounter" type="ds:CryptoBinary"/> 
      </sequence>
    </sequence>
  </complexType>
</element>

<element name="RSAKeyValue"> 
  <complexType> 
    <sequence>
      <element name="Modulus" type="ds:CryptoBinary"/> 
      <element name="Exponent" type="ds:CryptoBinary"/>
    </sequence> 
  </complexType> 
</element>

<!-- End KeyValue Element-types -->

<!-- End Signature -->

</schema>
