<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" version="1.0" targetNamespace="http://www.w3.org/2001/04/xmlenc#" elementFormDefault="qualified">

    <import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="classpath:/schema/xmldsig-core-schema.xsd"/>

    <complexType name="EncryptedType" abstract="true">
        <sequence>
            <element name="EncryptionMethod" type="xenc:EncryptionMethodType" minOccurs="0"/>
            <element ref="ds:KeyInfo" minOccurs="0"/>
            <element ref="xenc:CipherData"/>
            <element ref="xenc:EncryptionProperties" minOccurs="0"/>
        </sequence>
        <attribute name="Id" type="ID" use="optional"/>
        <attribute name="Type" type="anyURI" use="optional"/>
        <attribute name="MimeType" type="string" use="optional"/>
        <attribute name="Encoding" type="anyURI" use="optional"/>
    </complexType>

    <complexType name="EncryptionMethodType" mixed="true">
        <sequence>
            <element name="KeySize" minOccurs="0" type="xenc:KeySizeType"/>
            <element name="OAEPparams" minOccurs="0" type="base64Binary"/>
            <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
        </sequence>
        <attribute name="Algorithm" type="anyURI" use="required"/>
    </complexType>

    <simpleType name="KeySizeType">
        <restriction base="integer"/>
    </simpleType>

    <element name="CipherData" type="xenc:CipherDataType"/>
    <complexType name="CipherDataType">
        <choice>
            <element name="CipherValue" type="base64Binary"/>
            <element ref="xenc:CipherReference"/>
        </choice>
    </complexType>

    <element name="CipherReference" type="xenc:CipherReferenceType"/>
    <complexType name="CipherReferenceType">
        <choice>
            <element name="Transforms" type="xenc:TransformsType" minOccurs="0"/>
        </choice>
        <attribute name="URI" type="anyURI" use="required"/>
    </complexType>

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


    <element name="EncryptedData" type="xenc:EncryptedDataType"/>
    <complexType name="EncryptedDataType">
        <complexContent>
            <extension base="xenc:EncryptedType"/>
        </complexContent>
    </complexType>

    <!-- Children of ds:KeyInfo -->

    <element name="EncryptedKey" type="xenc:EncryptedKeyType"/>
    <complexType name="EncryptedKeyType">
        <complexContent>
            <extension base="xenc:EncryptedType">
                <sequence>
                    <element ref="xenc:ReferenceList" minOccurs="0"/>
                    <element name="CarriedKeyName" type="string" minOccurs="0"/>
                </sequence>
                <attribute name="Recipient" type="string" use="optional"/>
            </extension>
        </complexContent>
    </complexType>

    <element name="AgreementMethod" type="xenc:AgreementMethodType"/>
    <complexType name="AgreementMethodType" mixed="true">
        <sequence>
            <element name="KA-Nonce" minOccurs="0" type="base64Binary"/>
            <!-- <element ref="ds:DigestMethod" minOccurs="0"/> -->
            <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
            <element name="OriginatorKeyInfo" minOccurs="0" type="ds:KeyInfoType"/>
            <element name="RecipientKeyInfo" minOccurs="0" type="ds:KeyInfoType"/>
        </sequence>
        <attribute name="Algorithm" type="anyURI" use="required"/>
    </complexType>
    
    <!-- Note: DHKeyValue element and type added per XEnc spec errata 'E03 2003-11-18 (Error)'   -->
    <element name="DHKeyValue" type="xenc:DHKeyValueType"/>
    <complexType name="DHKeyValueType">
        <sequence>
            <sequence minOccurs="0">
                <element name="P" type="ds:CryptoBinary"/>
                <element name="Q" type="ds:CryptoBinary"/>
                <element name="Generator" type="ds:CryptoBinary"/>
            </sequence>
            <element name="Public" type="ds:CryptoBinary"/>
            <sequence minOccurs="0">
                <element name="seed" type="ds:CryptoBinary"/>
                <element name="pgenCounter" type="ds:CryptoBinary"/>
            </sequence>
        </sequence>
    </complexType>

    <!-- End Children of ds:KeyInfo -->

    <element name="ReferenceList">
        <complexType>
            <choice minOccurs="1" maxOccurs="unbounded">
                <element name="DataReference" type="xenc:ReferenceType"/>
                <element name="KeyReference" type="xenc:ReferenceType"/>
            </choice>
        </complexType>
    </element>

    <complexType name="ReferenceType">
        <sequence>
            <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
        </sequence>
        <attribute name="URI" type="anyURI" use="required"/>
    </complexType>


    <element name="EncryptionProperties" type="xenc:EncryptionPropertiesType"/>
    <complexType name="EncryptionPropertiesType">
        <sequence>
            <element ref="xenc:EncryptionProperty" maxOccurs="unbounded"/>
        </sequence>
        <attribute name="Id" type="ID" use="optional"/>
    </complexType>

    <element name="EncryptionProperty" type="xenc:EncryptionPropertyType"/>
    <complexType name="EncryptionPropertyType" mixed="true">
        <choice maxOccurs="unbounded">
            <any namespace="##other" processContents="lax"/>
        </choice>
        <attribute name="Target" type="anyURI" use="optional"/>
        <attribute name="Id" type="ID" use="optional"/>
        <anyAttribute namespace="http://www.w3.org/XML/1998/namespace"/>
    </complexType>

</schema>
