<?xml version="1.0" encoding="UTF-8"?>
<!-- http://www.xml.com/lpt/a/2002/01/23/relaxng.html -->
<!-- http://www.oasis-open.org/committees/relax-ng/tutorial-20011203.html -->
<!-- http://www.zvon.org/xxl/XMLSchemaTutorial/Output/ser_wildcards_st8.html -->
<!-- http://lists.oasis-open.org/archives/relax-ng-comment/200206/maillist.html -->

<grammar xmlns='http://relaxng.org/ns/structure/1.0'
        xmlns:ds='http://www.w3.org/2000/09/xmldsig#'
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        ns="http://www.w3.org/2001/04/xmlenc#"
        datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">

    <include href="xmldsig-core-schema.rng">
    <!-- Used for DigestMethod, KeyInfoType and anyThing -->
    <!-- Since xmldsig-core also has a start, I have to include it
        in the include for redefinition. -->
        <!--
        <start combine="choice">
            <choice>
                 We get to define the permissible root elements! 
                <element name="EncryptedData"><ref name="EncryptedDataType"/></element>
                <element name="EncryptedKey"><ref name="EncryptedKeyType"/></element>
            </choice>
        </start>  
        --> 
        
        <define name='anyThing'>
            <zeroOrMore>
                <choice>
                    <text/>
                    <element>
                        <anyName>
                            <except>
                                <nsName/>
                                <nsName ns='http://www.w3.org/2000/09/xmldsig#'/>
                            </except>
                        </anyName>
                        <ref name='anyThing'/>
                        <zeroOrMore>
                            <attribute>
                              <anyName/>
                            </attribute>
                        </zeroOrMore>
                    </element>
                </choice>
            </zeroOrMore>
            </define>
        
        
    </include>
    
        <!-- Import definitions from the xmldsig rng -->

        <define name="KeyInfoType" combine="interleave">
            <zeroOrMore>
                <choice>
                    <element name="EncryptedKey"><ref name="EncryptedKeyType"/></element>
                    <element name="AgreementMethod"><ref name="AgreementMethodType"/></element>
                </choice>
            </zeroOrMore>    
        </define>

        <define name="DigestMethodType" combine="choice">
            <notAllowed/>
         </define>

        <define name="TransformType" combine="choice">
            <notAllowed/>
         </define>

    <!-- Now redefined in the include statement
        <define name="anyThing" combine="choice">
            <notAllowed/>
         </define>
    -->

    <!-- End import -->
        
  
    <define name="EncryptedDataType">
          <ref name="EncryptedType"/>
    </define>
  
  
    <define name="EncryptedKeyType">
            <ref name="EncryptedType"/>
            <optional><element name='ReferenceList'>
                <ref name="ReferenceListType"/></element>
            </optional>
            <optional><element name='CarriedKeyName'><data type="string"/></element></optional>
            <optional><attribute name='Recipient'> <data type="string"/></attribute></optional>
    </define>

    
     <define name="EncryptedType">
        <element name="EncryptionMethod"><ref name="EncryptionMethodType"/></element>
        <optional>
            <element name="KeyInfo" ns="http://www.w3.org/2000/09/xmldsig#">
                <ref name="KeyInfoType"/>
            </element>
        </optional>
        <optional>
            <element name="CipherData"><ref name="CipherDataType"/></element>
        </optional> 
        <optional>
             <element name="EncryptionProperties"><ref name="EncryptionPropertiesType"/></element>
        </optional>
        <optional><attribute name="Id"><data type="ID"/></attribute></optional>
        <optional><attribute name="Type"><data type="anyURI"/></attribute></optional>
        <optional><attribute name="MimeType"><data type="string"/></attribute></optional>
        <optional><attribute name="Encoding"><data type="anyURI"/></attribute></optional>
        <optional><attribute name='xsi:schemaLocation'/></optional>
    </define> 

    <define name="EncryptionMethodType">
        <zeroOrMore>
            <choice>
                <element name="KeySize">
                    <data type="integer"/>
                </element>
                <element name="OAEPparams">
                    <data type="base64Binary"/>
                </element>
                <text/>
                <element name='DigestMethod' ns="http://www.w3.org/2000/09/xmldsig#">
                    <ref name="DigestMethodType"/>
                </element>
            </choice>
        </zeroOrMore>
        <attribute name="Algorithm"><data type="anyURI"/></attribute>
    </define>

            
    <define name="AgreementMethodType">
        <zeroOrMore>
            <choice>
                <element name="KA-Nonce">
                    <data type="base64Binary"/>
                </element>
                <element name='DigestMethod' ns="http://www.w3.org/2000/09/xmldsig#">
                    <ref name="DigestMethodType"/>
                </element>
                <text/>
                <element>
                    <nsName ns="http://www.w3.org/2000/09/xmldsig#"/>
                    <ref name="anyThing"/>
                </element>
                <element name="OriginatorKeyInfo"><ref name="KeyInfoType"/></element>
                <element name="RecipientKeyInfo"><ref name="KeyInfoType"/></element>
            </choice>
        </zeroOrMore>
        <attribute name="Algorithm"><data type="anyURI"/></attribute>
    </define>            
            
            
    <define name="ReferenceListType">
        <oneOrMore>
            <choice>
                <element name="DataReference">
                    <text/>
                    <attribute name="URI"><data type="anyURI"/></attribute>
                </element>
                <element name="KeyReference">
                    <text/>
                    <attribute name="URI"><data type="anyURI"/></attribute>
                </element>
            </choice>
        </oneOrMore>
    </define>
    
    
    <define name="CipherDataType">
        <choice>
            <element name="CipherValue"><data type="base64Binary"/></element>
            <element name="CipherReference">
                <optional> <!-- spec says it's optional -->
                	<element name="Transforms">
                  		<oneOrMore>
	                   		<element name='Transform' ns="http://www.w3.org/2000/09/xmldsig#">
                          		<ref name='TransformType'/>
                        	</element>
                    	</oneOrMore>
                	</element>
                </optional>
                <attribute name="URI">
                    <data type="anyURI"/>
                </attribute>      
            </element>
        </choice>
    </define>
    
    
    <define name="EncryptionPropertiesType">        
        <element name="EncryptionProperty">
          <zeroOrMore>
                <element>
                    <anyName/>
                    <text/>
                </element>
            </zeroOrMore>
            <optional>
                <attribute name="Target">
                    <data type="anyURI"/>
                </attribute>  
            </optional>
            <optional>                
                <attribute name="Id">
                    <data type="ID"/>
                </attribute>    
            </optional>
        </element>
        
        <optional>
            <attribute name="Id">
                <data type="ID"/>
            </attribute>    
        </optional>
        <zeroOrMore>
            <attribute><nsName ns="http://www.w3.org/XML/1998/namespace"/></attribute>
        </zeroOrMore>
    </define>

</grammar>