[java-opensaml] 02/13: Additional XML Encryption 1.1 XMLObject providers.

Brent Putman putmanb at georgetown.edu
Wed Jan 6 01:27:16 UTC 2021


This is an automated email from the git hooks/post-receive script.

putmanb pushed a commit to branch dev/OSJ-82
in repository java-opensaml.

View the commit online:
http://git.shibboleth.net/view/?p=java-opensaml.git;a=commit;h=dd0dc1cda906ac7d8944937a44564063c3f3d2c0

commit dd0dc1cda906ac7d8944937a44564063c3f3d2c0
Author: Brent Putman <putmanb at georgetown.edu>
AuthorDate: Thu Dec 3 20:51:56 2020 -0500

    Additional XML Encryption 1.1 XMLObject providers.
---
 .../xmlsec/encryption/ConcatKDFParams.java         | 216 ++++++++++++++++++++
 .../org/opensaml/xmlsec/encryption/DerivedKey.java | 152 +++++++++++++++
 .../opensaml/xmlsec/encryption/DerivedKeyName.java |  37 ++++
 .../opensaml/xmlsec/encryption/IterationCount.java |  37 ++++
 .../xmlsec/encryption/KeyDerivationMethod.java     |  63 ++++++
 .../org/opensaml/xmlsec/encryption/KeyLength.java  |  37 ++++
 .../opensaml/xmlsec/encryption/MasterKeyName.java  |  37 ++++
 .../opensaml/xmlsec/encryption/OtherSource.java    |  36 ++++
 .../opensaml/xmlsec/encryption/PBKDF2Params.java   | 101 ++++++++++
 .../java/org/opensaml/xmlsec/encryption/PRF.java   |  43 ++++
 .../java/org/opensaml/xmlsec/encryption/Salt.java  |  66 +++++++
 .../org/opensaml/xmlsec/encryption/Specified.java  |  37 ++++
 .../encryption/impl/ConcatKDFParamsBuilder.java    |  49 +++++
 .../encryption/impl/ConcatKDFParamsImpl.java       | 215 ++++++++++++++++++++
 .../encryption/impl/ConcatKDFParamsMarshaller.java |  53 +++++
 .../impl/ConcatKDFParamsUnmarshaller.java          |  62 ++++++
 .../xmlsec/encryption/impl/DerivedKeyBuilder.java  |  46 +++++
 .../xmlsec/encryption/impl/DerivedKeyImpl.java     | 171 ++++++++++++++++
 .../encryption/impl/DerivedKeyMarshaller.java      |  55 ++++++
 .../encryption/impl/DerivedKeyNameBuilder.java     |  47 +++++
 .../xmlsec/encryption/impl/DerivedKeyNameImpl.java |  40 ++++
 .../encryption/impl/DerivedKeyUnmarshaller.java    |  68 +++++++
 .../encryption/impl/IterationCountBuilder.java     |  46 +++++
 .../xmlsec/encryption/impl/IterationCountImpl.java |  40 ++++
 .../impl/KeyDerivationMethodBuilder.java           |  49 +++++
 .../encryption/impl/KeyDerivationMethodImpl.java   |  91 +++++++++
 .../impl/KeyDerivationMethodMarshaller.java        |  41 ++++
 .../impl/KeyDerivationMethodUnmarshaller.java      |  49 +++++
 .../xmlsec/encryption/impl/KeyLengthBuilder.java   |  46 +++++
 .../xmlsec/encryption/impl/KeyLengthImpl.java      |  40 ++++
 .../encryption/impl/MasterKeyNameBuilder.java      |  46 +++++
 .../xmlsec/encryption/impl/MasterKeyNameImpl.java  |  40 ++++
 .../xmlsec/encryption/impl/OtherSourceBuilder.java |  47 +++++
 .../xmlsec/encryption/impl/OtherSourceImpl.java    |  38 ++++
 .../encryption/impl/OtherSourceMarshaller.java     |  25 +++
 .../encryption/impl/OtherSourceUnmarshaller.java   |  25 +++
 .../encryption/impl/PBKDF2ParamsBuilder.java       |  48 +++++
 .../xmlsec/encryption/impl/PBKDF2ParamsImpl.java   | 126 ++++++++++++
 .../encryption/impl/PBKDF2ParamsMarshaller.java    |  25 +++
 .../encryption/impl/PBKDF2ParamsUnmarshaller.java  |  52 +++++
 .../xmlsec/encryption/impl/PRFBuilder.java         |  47 +++++
 .../opensaml/xmlsec/encryption/impl/PRFImpl.java   |  38 ++++
 .../xmlsec/encryption/impl/PRFMarshaller.java      |  25 +++
 .../xmlsec/encryption/impl/PRFUnmarshaller.java    |  25 +++
 .../xmlsec/encryption/impl/SaltBuilder.java        |  50 +++++
 .../opensaml/xmlsec/encryption/impl/SaltImpl.java  |  93 +++++++++
 .../xmlsec/encryption/impl/SaltMarshaller.java     |  25 +++
 .../xmlsec/encryption/impl/SaltUnmarshaller.java   |  46 +++++
 .../xmlsec/encryption/impl/SpecifiedBuilder.java   |  48 +++++
 .../xmlsec/encryption/impl/SpecifiedImpl.java      |  39 ++++
 .../src/main/resources/encryption-config.xml       |  85 ++++++++
 .../encryption/impl/ConcatKDFParamsTest.java       | 217 +++++++++++++++++++++
 .../xmlsec/encryption/impl/DerivedKeyNameTest.java |  66 +++++++
 .../xmlsec/encryption/impl/DerivedKeyTest.java     | 119 +++++++++++
 .../xmlsec/encryption/impl/IterationCountTest.java |  66 +++++++
 .../encryption/impl/KeyDerivationMethodTest.java   |  94 +++++++++
 .../xmlsec/encryption/impl/KeyLengthTest.java      |  66 +++++++
 .../xmlsec/encryption/impl/MasterKeyNameTest.java  |  66 +++++++
 .../xmlsec/encryption/impl/OtherSourceTest.java    |  99 ++++++++++
 .../xmlsec/encryption/impl/PBKDF2ParamsTest.java   |  85 ++++++++
 .../opensaml/xmlsec/encryption/impl/PRFTest.java   |  99 ++++++++++
 .../opensaml/xmlsec/encryption/impl/SaltTest.java  |  79 ++++++++
 .../xmlsec/encryption/impl/SpecifiedTest.java      |  66 +++++++
 .../src/test/resources/logback-test.xml            |   5 +
 .../xmlsec/encryption/impl/ConcatKDFParams.xml     |   7 +
 .../impl/ConcatKDFParamsChildElements.xml          |  11 ++
 .../opensaml/xmlsec/encryption/impl/DerivedKey.xml |   4 +
 .../encryption/impl/DerivedKeyChildElements.xml    |  12 ++
 .../xmlsec/encryption/impl/DerivedKeyName.xml      |   2 +
 .../impl/DerivedKeyOptionalAttributes.xml          |   4 +
 .../xmlsec/encryption/impl/IterationCount.xml      |   2 +
 .../xmlsec/encryption/impl/KeyDerivationMethod.xml |   4 +
 .../impl/KeyDerivationMethodChildElements.xml      |   6 +
 .../opensaml/xmlsec/encryption/impl/KeyLength.xml  |   2 +
 .../xmlsec/encryption/impl/MasterKeyName.xml       |   2 +
 .../xmlsec/encryption/impl/OtherSource.xml         |   2 +
 .../encryption/impl/OtherSourceChildElements.xml   |   4 +
 .../xmlsec/encryption/impl/PBKDF2Params.xml        |   2 +
 .../encryption/impl/PBKDF2ParamsChildElements.xml  |   7 +
 .../org/opensaml/xmlsec/encryption/impl/PRF.xml    |   2 +
 .../xmlsec/encryption/impl/PRFChildElements.xml    |   4 +
 .../org/opensaml/xmlsec/encryption/impl/Salt.xml   |   2 +
 .../xmlsec/encryption/impl/SaltChildElements.xml   |   5 +
 .../opensaml/xmlsec/encryption/impl/Specified.xml  |   2 +
 84 files changed, 4276 insertions(+)

diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/ConcatKDFParams.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/ConcatKDFParams.java
new file mode 100644
index 000000000..9d5672227
--- /dev/null
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/ConcatKDFParams.java
@@ -0,0 +1,216 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption;
+
+import javax.annotation.Nullable;
+import javax.xml.namespace.QName;
+
+import org.opensaml.core.xml.XMLObject;
+import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
+import org.opensaml.xmlsec.signature.DigestMethod;
+
+/**
+ * XMLObject representing XML Encryption 1.1 ConcatKDFParams element.
+ */
+public interface ConcatKDFParams extends XMLObject {
+    
+    /** Element local name. */
+    static final String DEFAULT_ELEMENT_LOCAL_NAME = "ConcatKDFParams";
+
+    /** Default element name. */
+    static final QName DEFAULT_ELEMENT_NAME = new QName(EncryptionConstants.XMLENC11_NS, DEFAULT_ELEMENT_LOCAL_NAME,
+      EncryptionConstants.XMLENC11_PREFIX);
+
+    /** Local name of the XSI type. */
+    static final String TYPE_LOCAL_NAME = "ConcatKDFParamsType";
+
+    /** QName of the XSI type. */
+    static final QName TYPE_NAME =
+            new QName(EncryptionConstants.XMLENC11_NS, TYPE_LOCAL_NAME, EncryptionConstants.XMLENC11_PREFIX);
+
+    /** AlgorithmID attribute name. */
+    static final String ALGORITHM_ID_ATTRIBUTE_NAME = "AlgorithmID";
+
+    /** PartyUInfo attribute name. */
+    static final String PARTY_U_INFO_ATTRIBUTE_NAME = "PartyUInfo";
+
+    /** PartyVInfo attribute name. */
+    static final String PARTY_V_INFO_ATTRIBUTE_NAME = "PartyVInfo";
+
+    /** SuppPubInfo attribute name. */
+    static final String SUPP_PUB_INFO_ATTRIBUTE_NAME = "SuppPubInfo";
+
+    /** SuppPrivInfo attribute name. */
+    static final String SUPP_PRIV_INFO_ATTRIBUTE_NAME = "SuppPrivInfo";
+
+    /**
+     * Gets the digest method.
+     * 
+     * @return the digest method
+     */
+    @Nullable DigestMethod getDigestMethod();
+
+    /**
+     * Sets the digest method.
+     * 
+     * @param digestMethod the digest method
+     */
+    void setDigestMethod(@Nullable final DigestMethod digestMethod);
+
+    /**
+     * Gets the AlgorithmID attribute in its padded hex-encoded form.
+     * 
+     * @return the {@code AlgorithmID} attribute
+     */
+    @Nullable String getAlgorithmID();
+
+    /**
+     * Sets the AlgorithmID attribute.
+     * 
+     * @param algorithmID the AlgorithmID attribute in its padded hex-encoded form
+     */
+    void setAlgorithmID(@Nullable final String algorithmID);
+    
+    /**
+     * Gets the AlgorithmID attribute in its padded byte array form.
+     * 
+     * @return the {@code AlgorithmID} attribute
+     */
+    @Nullable byte[] getAlgorithmIDBytes();
+
+    /**
+     * Sets the AlgorithmID attribute.
+     * 
+     * @param algorithmID the AlgorithmID attribute in its padded byte array form
+     */
+    void setAlgorithmIDBytes(@Nullable final byte[] algorithmID);
+    
+    /**
+     * Gets the PartyUInfo attribute in its padded hex-encoded form.
+     * 
+     * @return the PartyUInfo attribute
+     */
+    @Nullable String getPartyUInfo();
+
+    /**
+     * Sets the PartyUInfo attribute.
+     * 
+     * @param partyUInfo PartyUInfo attribute in its padded hex-encoded form
+     */
+    void setPartyUInfo(@Nullable final String partyUInfo);
+
+
+    /**
+     * Gets the PartyUInfo attribute in its padded byte array form.
+     * 
+     * @return the PartyUInfo attribute
+     */
+    @Nullable byte[] getPartyUInfoBytes();
+
+    /**
+     * Sets the PartyUInfo attribute.
+     * 
+     * @param partyUInfo PartyUInfo attribute in its padded byte array form
+     */
+    void setPartyUInfoBytes(@Nullable final byte[] partyUInfo);
+    
+    /**
+     * Gets the PartyVInfo attribute in its padded hex-encoded form.
+     * 
+     * @return the PartyVInfo attribute
+     */
+    @Nullable String getPartyVInfo();
+
+    /**
+     * Sets the PartyVInfo attribute.
+     * 
+     * @param partyVInfo PartyVInfo attribute in its padded hex-encoded form
+     */
+    void setPartyVInfo(@Nullable final String partyVInfo);
+
+    /**
+     * Gets the PartyVInfo attribute in its padded byte array form.
+     * 
+     * @return the PartyVInfo attribute
+     */
+    @Nullable byte[] getPartyVInfoBytes();
+
+    /**
+     * Sets the PartyVInfo attribute.
+     * 
+     * @param partyVInfo PartyVInfo attribute in its padded byte array form
+     */
+    void setPartyVInfoBytes(@Nullable final byte[] partyVInfo);
+
+    /**
+     * Gets the SuppPubInfo attribute in its padded hex-encoded form.
+     * 
+     * @return the SuppPubInfo attribute
+     */
+    @Nullable String getSuppPubInfo();
+
+    /**
+     * Sets the SuppPubInfo attribute.
+     * 
+     * @param suppPubInfo SuppPubInfo attribute in its padded hex-encoded form
+     */
+    void setSuppPubInfo(@Nullable final String suppPubInfo);
+    
+    /**
+     * Gets the SuppPubInfo attribute in its padded byte array form.
+     * 
+     * @return the SuppPubInfo attribute
+     */
+    @Nullable byte[] getSuppPubInfoBytes();
+
+    /**
+     * Sets the SuppPubInfo attribute.
+     * 
+     * @param suppPubInfo SuppPubInfo attribute in its padded byte array form
+     */
+    void setSuppPubInfoBytes(@Nullable final byte[] suppPubInfo);
+    
+    /**
+     * Gets the SuppPrivInfo attribute in its padded hex-encoded form.
+     * 
+     * @return the SuppPrivInfo attribute
+     */
+    @Nullable String getSuppPrivInfo();
+
+    /**
+     * Sets the SuppPrivInfo attribute.
+     * 
+     * @param suppPrivInfo SuppPrivInfo attribute in its padded hex-encoded form
+     */
+    void setSuppPrivInfo(@Nullable final String suppPrivInfo);
+
+    /**
+     * Gets the SuppPrivInfo attribute in its padded byte array form.
+     * 
+     * @return the SuppPrivInfo attribute
+     */
+    @Nullable byte[] getSuppPrivInfoBytes();
+
+    /**
+     * Sets the SuppPrivInfo attribute.
+     * 
+     * @param suppPrivInfo SuppPrivInfo attribute in its padded byte array form
+     */
+    void setSuppPrivInfoBytes(@Nullable final byte[] suppPrivInfo);
+
+}
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/DerivedKey.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/DerivedKey.java
new file mode 100644
index 000000000..3d202565c
--- /dev/null
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/DerivedKey.java
@@ -0,0 +1,152 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption;
+
+import javax.annotation.Nullable;
+import javax.xml.namespace.QName;
+
+import org.opensaml.core.xml.XMLObject;
+import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
+
+/**
+ * XMLObject representing XML Encryption 1.1 DerivedKey element.
+ */
+public interface DerivedKey extends XMLObject {
+    
+    /** Element local name. */
+    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "DerivedKey";
+
+    /** Default element name. */
+    public static final QName DEFAULT_ELEMENT_NAME =
+            new QName(EncryptionConstants.XMLENC11_NS, DEFAULT_ELEMENT_LOCAL_NAME, EncryptionConstants.XMLENC11_PREFIX);
+
+    /** Local name of the XSI type. */
+    public static final String TYPE_LOCAL_NAME = "DerivedKeyType";
+
+    /** QName of the XSI type. */
+    public static final QName TYPE_NAME =
+            new QName(EncryptionConstants.XMLENC11_NS, TYPE_LOCAL_NAME, EncryptionConstants.XMLENC11_PREFIX);
+
+    /** Recipient attribute name. */
+    public static final String RECIPIENT_ATTRIBUTE_NAME = "Recipient";
+
+    /** Algorithm attribute name. */
+    public static final String ID_ATTRIBUTE_NAME = "Id";
+
+    /** Algorithm attribute name. */
+    public static final String TYPE_ATTRIBUTE_NAME = "Type";
+    
+    /**
+     * Get the KeyDerivationMethod child element.
+     * 
+     * @return the element
+     */
+    @Nullable public KeyDerivationMethod getKeyDerivationMethod();
+    
+    /**
+     * Set the KeyDerivationMethod child element.
+     * 
+     * @param method the key derivation method
+     */
+    public void setKeyDerivationMethod(@Nullable final KeyDerivationMethod method);
+
+    /**
+     * Get the ReferenceList child element.
+     * 
+     * @return the element
+     */
+    @Nullable public ReferenceList getReferenceList();
+    
+    /**
+     * Set the ReferenceList child element.
+     * 
+     * @param referenceList the list
+     */
+    public void setReferenceList(@Nullable final ReferenceList referenceList);
+
+    /**
+     * Get the DerivedKeyName child element.
+     * 
+     * @return the element
+     */
+    @Nullable public DerivedKeyName getDerivedKeyName();
+    
+    /**
+     * Set the DerivedKeyName child element.
+     * 
+     * @param name the key name
+     */
+    public void setDerivedKeyName(@Nullable final DerivedKeyName name);
+
+    /**
+     * Get the MasterKeyName child element.
+     * 
+     * @return the element
+     */
+    @Nullable public MasterKeyName getMasterKeyName();
+    
+    /**
+     * Set the MasterKeyName child element.
+     * 
+     * @param name the key name
+     */
+    public void setMasterKeyName(@Nullable final MasterKeyName name);
+
+    /**
+     * Gets the Recipient attribute.
+     * 
+     * @return the recipient
+     */
+    @Nullable String getRecipient();
+
+    /**
+     * Sets the Recipient attribute.
+     * 
+     * @param recipient the recipient
+     */
+    void setRecipient(@Nullable final String recipient);
+
+    /**
+     * Gets the Id attribute.
+     * 
+     * @return the id
+     */
+    @Nullable String getId();
+
+    /**
+     * Sets the Id attribute.
+     * 
+     * @param id the id
+     */
+    void setId(@Nullable final String id);
+
+    /**
+     * Gets the Type attribute.
+     * 
+     * @return the type
+     */
+    @Nullable String getType();
+
+    /**
+     * Sets the Type attribute.
+     * 
+     * @param type the type
+     */
+    void setType(@Nullable final String type);
+
+}
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/DerivedKeyName.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/DerivedKeyName.java
new file mode 100644
index 000000000..2f1d032c3
--- /dev/null
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/DerivedKeyName.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.core.xml.schema.XSString;
+import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
+
+/**
+ * XMLObject representing XML Encryption 1.1 DerivedKeyName element.
+ */
+public interface DerivedKeyName extends XSString {
+    
+    /** Element local name. */
+    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "DerivedKeyName";
+
+    /** Default element name. */
+    public static final QName DEFAULT_ELEMENT_NAME =
+            new QName(EncryptionConstants.XMLENC11_NS, DEFAULT_ELEMENT_LOCAL_NAME, EncryptionConstants.XMLENC11_PREFIX);
+
+}
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/IterationCount.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/IterationCount.java
new file mode 100644
index 000000000..f8eb8934f
--- /dev/null
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/IterationCount.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.core.xml.schema.XSInteger;
+import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
+
+/**
+ * XMLObject representing XML Encryption 1.1 IterationCount element.
+ */
+public interface IterationCount extends XSInteger {
+    
+    /** Element local name. */
+    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "IterationCount";
+
+    /** Default element name. */
+    public static final QName DEFAULT_ELEMENT_NAME = new QName(EncryptionConstants.XMLENC11_NS,
+            DEFAULT_ELEMENT_LOCAL_NAME, EncryptionConstants.XMLENC11_PREFIX);
+
+}
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/KeyDerivationMethod.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/KeyDerivationMethod.java
new file mode 100644
index 000000000..f14f7cdbf
--- /dev/null
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/KeyDerivationMethod.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption;
+
+import javax.annotation.Nullable;
+import javax.xml.namespace.QName;
+
+import org.opensaml.core.xml.ElementExtensibleXMLObject;
+import org.opensaml.core.xml.XMLObject;
+import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
+
+/**
+ * XMLObject representing XML Encryption 1.1 KeyDerivationMethod element.
+ */
+public interface KeyDerivationMethod extends XMLObject, ElementExtensibleXMLObject {
+    
+    /** Element local name. */
+    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "KeyDerivationMethod";
+
+    /** Default element name. */
+    public static final QName DEFAULT_ELEMENT_NAME =
+            new QName(EncryptionConstants.XMLENC11_NS, DEFAULT_ELEMENT_LOCAL_NAME, EncryptionConstants.XMLENC11_PREFIX);
+
+    /** Local name of the XSI type. */
+    public static final String TYPE_LOCAL_NAME = "KeyDerivationMethodType";
+
+    /** QName of the XSI type. */
+    public static final QName TYPE_NAME =
+            new QName(EncryptionConstants.XMLENC11_NS, TYPE_LOCAL_NAME, EncryptionConstants.XMLENC11_PREFIX);
+
+    /** Algorithm attribute name. */
+    public static final String ALGORITHM_ATTRIBUTE_NAME = "Algorithm";
+
+    /**
+     * Gets the algorithm URI attribute.
+     * 
+     * @return the algorithm
+     */
+    @Nullable String getAlgorithm();
+
+    /**
+     * Sets the algorithm URI attribute.
+     * 
+     * @param algorithm the algorithm URI
+     */
+    void setAlgorithm(@Nullable final String algorithm);
+
+}
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/KeyLength.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/KeyLength.java
new file mode 100644
index 000000000..65659dec1
--- /dev/null
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/KeyLength.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.core.xml.schema.XSInteger;
+import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
+
+/**
+ * XMLObject representing XML Encryption 1.1 IterationCount KeyLength element.
+ */
+public interface KeyLength extends XSInteger {
+    
+    /** Element local name. */
+    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "KeyLength";
+
+    /** Default element name. */
+    public static final QName DEFAULT_ELEMENT_NAME = new QName(EncryptionConstants.XMLENC11_NS,
+            DEFAULT_ELEMENT_LOCAL_NAME, EncryptionConstants.XMLENC11_PREFIX);
+
+}
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/MasterKeyName.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/MasterKeyName.java
new file mode 100644
index 000000000..f03435390
--- /dev/null
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/MasterKeyName.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.core.xml.schema.XSString;
+import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
+
+/**
+ * XMLObject representing XML Encryption 1.1 MasterKeyName element.
+ */
+public interface MasterKeyName extends XSString {
+    
+    /** Element local name. */
+    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "MasterKeyName";
+
+    /** Default element name. */
+    public static final QName DEFAULT_ELEMENT_NAME =
+            new QName(EncryptionConstants.XMLENC11_NS, DEFAULT_ELEMENT_LOCAL_NAME, EncryptionConstants.XMLENC11_PREFIX);
+
+}
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/OtherSource.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/OtherSource.java
new file mode 100644
index 000000000..699556bdd
--- /dev/null
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/OtherSource.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
+
+/**
+ * XMLObject representing XML Encryption 1.1 OtherSource element.
+ */
+public interface OtherSource extends AlgorithmIdentifierType {
+    
+    /** Element local name. */
+    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "OtherSource";
+
+    /** Default element name. */
+    public static final QName DEFAULT_ELEMENT_NAME = new QName(EncryptionConstants.XMLENC11_NS,
+            DEFAULT_ELEMENT_LOCAL_NAME, EncryptionConstants.XMLENC11_PREFIX);
+
+}
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/PBKDF2Params.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/PBKDF2Params.java
new file mode 100644
index 000000000..0034bf6dd
--- /dev/null
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/PBKDF2Params.java
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption;
+
+import javax.annotation.Nullable;
+import javax.xml.namespace.QName;
+
+import org.opensaml.core.xml.XMLObject;
+import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
+
+/**
+ * XMLObject representing XML Encryption 1.1 PBKDF2-params element.
+ */
+public interface PBKDF2Params extends XMLObject {
+    
+    /** Element local name. */
+    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "PBKDF2-params";
+
+    /** Default element name. */
+    public static final QName DEFAULT_ELEMENT_NAME =
+            new QName(EncryptionConstants.XMLENC11_NS, DEFAULT_ELEMENT_LOCAL_NAME, EncryptionConstants.XMLENC11_PREFIX);
+
+    /** Local name of the XSI type. */
+    public static final String TYPE_LOCAL_NAME = "PBKDF2ParameterType";
+
+    /** QName of the XSI type. */
+    public static final QName TYPE_NAME =
+            new QName(EncryptionConstants.XMLENC11_NS, TYPE_LOCAL_NAME, EncryptionConstants.XMLENC11_PREFIX);
+
+    /**
+     * Get the Salt child element.
+     * 
+     * @return the element
+     */
+    @Nullable public Salt getSalt();
+    
+    /**
+     * Set the Salt child element.
+     * 
+     * @param salt the salt
+     */
+    public void setSalt(@Nullable final Salt salt);
+    
+    /**
+     * Get the IterationCount child element.
+     * 
+     * @return the element
+     */
+    @Nullable public IterationCount getIterationCount();
+    
+    /**
+     * Set the IterationCount child element.
+     * 
+     * @param count
+     */
+    public void setIterationCount(@Nullable final IterationCount count);
+    
+    /**
+     * Get the KeyLength child element.
+     * 
+     * @return the element
+     */
+    @Nullable public KeyLength getKeyLength();
+    
+    /**
+     * Set the KeyLength child element.
+     * 
+     * @param length
+     */
+    public void setKeyLength(@Nullable final KeyLength length);
+    
+    /**
+     * Get the PRF child element.
+     * 
+     * @return the element
+     */
+    @Nullable public PRF getPRF();
+    
+    /**
+     * Set the PRF child element.
+     * 
+     * @param prf
+     */
+    public void setPRF(@Nullable final PRF prf);
+
+}
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/PRF.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/PRF.java
new file mode 100644
index 000000000..3001acc38
--- /dev/null
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/PRF.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
+
+/**
+ * XMLObject representing XML Encryption, version 1.1, PRF element.
+ */
+public interface PRF extends AlgorithmIdentifierType {
+    
+    /** Element local name. */
+    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "PRF";
+
+    /** Default element name. */
+    public static final QName DEFAULT_ELEMENT_NAME = new QName(EncryptionConstants.XMLENC11_NS,
+            DEFAULT_ELEMENT_LOCAL_NAME, EncryptionConstants.XMLENC11_PREFIX);
+    
+    /** Local name of the XSI type. */
+    public static final String TYPE_LOCAL_NAME = "PRFAlgorithmIdentifierType";
+
+    /** QName of the XSI type. */
+    public static final QName TYPE_NAME = new QName(EncryptionConstants.XMLENC11_NS, TYPE_LOCAL_NAME,
+            EncryptionConstants.XMLENC11_PREFIX);
+
+}
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/Salt.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/Salt.java
new file mode 100644
index 000000000..abbea0214
--- /dev/null
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/Salt.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption;
+
+import javax.annotation.Nullable;
+import javax.xml.namespace.QName;
+
+import org.opensaml.core.xml.XMLObject;
+import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
+
+/**
+ * XMLObject representing XML Encryption 1.1 Salt element.
+ */
+public interface Salt extends XMLObject {
+    
+    /** Element local name. */
+    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "Salt";
+
+    /** Default element name. */
+    public static final QName DEFAULT_ELEMENT_NAME =
+            new QName(EncryptionConstants.XMLENC11_NS, DEFAULT_ELEMENT_LOCAL_NAME, EncryptionConstants.XMLENC11_PREFIX);
+    
+    /**
+     * Get the Specified child element.
+     * 
+     * @return the element
+     */
+    @Nullable public Specified getSpecified();
+    
+    /**
+     * Set the Specified child element.
+     * 
+     * @param specified
+     */
+    public void setSpecified(@Nullable final Specified specified);
+    
+    /**
+     * Get the OtherSource child element.
+     * 
+     * @return the element
+     */
+    @Nullable public OtherSource getOtherSource();
+    
+    /**
+     * Set the OtherSource child element.
+     * 
+     * @param source value
+     */
+    public void setOtherSource(@Nullable final OtherSource source);
+    
+}
diff --git a/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/Specified.java b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/Specified.java
new file mode 100644
index 000000000..8cb8e5993
--- /dev/null
+++ b/opensaml-xmlsec-api/src/main/java/org/opensaml/xmlsec/encryption/Specified.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption;
+
+import javax.xml.namespace.QName;
+
+import org.opensaml.core.xml.schema.XSBase64Binary;
+import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
+
+/**
+ * XMLObject representing XML Encryption 1.1 Specified element.
+ */
+public interface Specified extends XSBase64Binary {
+    
+    /** Element local name. */
+    public static final String DEFAULT_ELEMENT_LOCAL_NAME = "Specified";
+
+    /** Default element name. */
+    public static final QName DEFAULT_ELEMENT_NAME =
+            new QName(EncryptionConstants.XMLENC11_NS, DEFAULT_ELEMENT_LOCAL_NAME, EncryptionConstants.XMLENC11_PREFIX);
+
+}
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/ConcatKDFParamsBuilder.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/ConcatKDFParamsBuilder.java
new file mode 100644
index 000000000..50b117d66
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/ConcatKDFParamsBuilder.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+import org.opensaml.core.xml.AbstractXMLObjectBuilder;
+import org.opensaml.xmlsec.encryption.ConcatKDFParams;
+import org.opensaml.xmlsec.encryption.XMLEncryptionBuilder;
+import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
+
+/**
+ * Builder of {@link org.opensaml.xmlsec.encryption.ConcatKDFParams}.
+ */
+public class ConcatKDFParamsBuilder extends AbstractXMLObjectBuilder<ConcatKDFParams>
+        implements XMLEncryptionBuilder<ConcatKDFParams> {
+
+    /**
+     * Constructor.
+     */
+    public ConcatKDFParamsBuilder() {
+    }
+
+    /** {@inheritDoc} */
+    public ConcatKDFParams buildObject(final String namespaceURI, final String localName,
+            final String namespacePrefix) {
+        return new ConcatKDFParamsImpl(namespaceURI, localName, namespacePrefix);
+    }
+
+    /** {@inheritDoc} */
+    public ConcatKDFParams buildObject() {
+        return buildObject(EncryptionConstants.XMLENC11_NS, ConcatKDFParams.DEFAULT_ELEMENT_LOCAL_NAME,
+                EncryptionConstants.XMLENC11_PREFIX);
+    }
+
+}
\ No newline at end of file
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/ConcatKDFParamsImpl.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/ConcatKDFParamsImpl.java
new file mode 100644
index 000000000..7af7a7338
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/ConcatKDFParamsImpl.java
@@ -0,0 +1,215 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.Nullable;
+
+import org.apache.commons.codec.DecoderException;
+import org.apache.commons.codec.binary.Hex;
+import org.opensaml.core.xml.AbstractXMLObject;
+import org.opensaml.core.xml.XMLObject;
+import org.opensaml.core.xml.XMLRuntimeException;
+import org.opensaml.xmlsec.encryption.ConcatKDFParams;
+import org.opensaml.xmlsec.signature.DigestMethod;
+
+/**
+ * Concrete implementation of {@link org.opensaml.xmlsec.encryption.ConcatKDFParams}.
+ */
+public class ConcatKDFParamsImpl extends AbstractXMLObject implements ConcatKDFParams {
+    
+    /** DigestMethod. */
+    private DigestMethod digestMethod;
+    
+    /** AlgorithmID. */
+    @Nullable private String algorithmID;
+    
+    /** PartyUInfo. */
+    @Nullable private String partyUInfo;
+   
+    /** PartyVInfo. */
+    @Nullable private String partyVInfo;
+
+    /** SuppPubInfo. */
+    @Nullable private String suppPubInfo;
+
+    /** SuppPrivInfo. */
+    @Nullable private String suppPrivInfo;
+
+    /**
+     * Constructor.
+     *
+     * @param namespaceURI namespace URI
+     * @param elementLocalName element local name
+     * @param namespacePrefix namespace prefix
+     */
+    protected ConcatKDFParamsImpl(final String namespaceURI, final String elementLocalName,
+            final String namespacePrefix) {
+        super(namespaceURI, elementLocalName, namespacePrefix);
+    }
+
+    /** {@inheritDoc} */
+    @Nullable public DigestMethod getDigestMethod() {
+        return digestMethod;
+    }
+
+    /** {@inheritDoc} */
+    public void setDigestMethod(@Nullable final DigestMethod newDigestMethod) {
+        digestMethod = prepareForAssignment(digestMethod, newDigestMethod);
+    }
+
+    /** {@inheritDoc} */
+    @Nullable public String getAlgorithmID() {
+        return algorithmID;
+    }
+
+    /** {@inheritDoc} */
+    public void setAlgorithmID(@Nullable final String newAlgorithmID) {
+        algorithmID = prepareForAssignment(algorithmID, newAlgorithmID);
+    }
+
+    /** {@inheritDoc} */
+    @Nullable public byte[] getAlgorithmIDBytes() {
+        try {
+            return algorithmID == null ? null : Hex.decodeHex(algorithmID);
+        } catch (final DecoderException e) {
+            throw new XMLRuntimeException(e);
+        }
+    }
+
+    /** {@inheritDoc} */
+    public void setAlgorithmIDBytes(@Nullable final byte[] newAlgorithmID) {
+        setAlgorithmID(newAlgorithmID == null ? null : Hex.encodeHexString(newAlgorithmID, false));
+    }
+
+    /** {@inheritDoc} */
+    @Nullable public String getPartyUInfo() {
+        return partyUInfo;
+    }
+
+    /** {@inheritDoc} */
+    public void setPartyUInfo(@Nullable final String newPartyUInfo) {
+        partyUInfo = prepareForAssignment(partyUInfo, newPartyUInfo);
+    }
+
+    /** {@inheritDoc} 
+     * @throws DecoderException */
+    @Nullable public byte[] getPartyUInfoBytes() {
+        try {
+            return partyUInfo == null ? null : Hex.decodeHex(partyUInfo);
+        } catch (final DecoderException e) {
+            throw new XMLRuntimeException(e);
+        }
+    }
+
+    /** {@inheritDoc} */
+    public void setPartyUInfoBytes(@Nullable final byte[] newPartyUInfo) {
+        setPartyUInfo(newPartyUInfo == null ? null : Hex.encodeHexString(newPartyUInfo, false));
+    }
+
+    /** {@inheritDoc} */
+    @Nullable public String getPartyVInfo() {
+        return partyVInfo;
+    }
+
+    /** {@inheritDoc} */
+    public void setPartyVInfo(@Nullable final String newPartyVInfo) {
+        partyVInfo = prepareForAssignment(partyVInfo, newPartyVInfo);
+    }
+
+    /** {@inheritDoc} */
+    @Nullable public byte[] getPartyVInfoBytes() {
+        try {
+            return partyVInfo == null ? null : Hex.decodeHex(partyVInfo);
+        } catch (final DecoderException e) {
+            throw new XMLRuntimeException(e);
+        }
+    }
+
+    /** {@inheritDoc} */
+    public void setPartyVInfoBytes(@Nullable final byte[] newPartyVInfo) {
+        setPartyVInfo(newPartyVInfo == null ? null : Hex.encodeHexString(newPartyVInfo, false));
+    }
+
+    /** {@inheritDoc} */
+    @Nullable public String getSuppPubInfo() {
+        return suppPubInfo;
+    }
+
+    /** {@inheritDoc} */
+    public void setSuppPubInfo(@Nullable final String newSuppPubInfo) {
+        suppPubInfo = prepareForAssignment(suppPubInfo, newSuppPubInfo);
+    }
+
+    /** {@inheritDoc} */
+    @Nullable public byte[] getSuppPubInfoBytes() {
+        try {
+            return suppPubInfo == null ? null : Hex.decodeHex(suppPubInfo);
+        } catch (final DecoderException e) {
+            throw new XMLRuntimeException(e);
+        }
+    }
+
+    /** {@inheritDoc} */
+    public void setSuppPubInfoBytes(@Nullable final byte[] newSuppPubInfo) {
+        setSuppPubInfo(newSuppPubInfo == null ? null : Hex.encodeHexString(newSuppPubInfo, false));
+    }
+
+    /** {@inheritDoc} */
+    @Nullable public String getSuppPrivInfo() {
+        return suppPrivInfo;
+    }
+
+    /** {@inheritDoc} */
+    public void setSuppPrivInfo(@Nullable final String newSuppPrivInfo) {
+        suppPrivInfo = prepareForAssignment(suppPrivInfo, newSuppPrivInfo);
+    }
+
+    /** {@inheritDoc} */
+    @Nullable public byte[] getSuppPrivInfoBytes() {
+        try {
+            return suppPrivInfo == null ? null : Hex.decodeHex(suppPrivInfo);
+        } catch (final DecoderException e) {
+            throw new XMLRuntimeException(e);
+        }
+    }
+
+    /** {@inheritDoc} */
+    public void setSuppPrivInfoBytes(@Nullable final byte[] newSuppPrivInfo) {
+        setSuppPrivInfo(newSuppPrivInfo == null ? null : Hex.encodeHexString(newSuppPrivInfo, false));
+    }
+
+    /** {@inheritDoc} */
+    public List<XMLObject> getOrderedChildren() {
+        final ArrayList<XMLObject> children = new ArrayList<>();
+        
+        if (digestMethod != null) {
+            children.add(digestMethod); 
+        }
+        
+        if (children.size() == 0) {
+            return null;
+        }
+        
+        return Collections.unmodifiableList(children);
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/ConcatKDFParamsMarshaller.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/ConcatKDFParamsMarshaller.java
new file mode 100644
index 000000000..ad65fe344
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/ConcatKDFParamsMarshaller.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+import org.opensaml.core.xml.XMLObject;
+import org.opensaml.core.xml.io.MarshallingException;
+import org.opensaml.xmlsec.encryption.ConcatKDFParams;
+import org.w3c.dom.Element;
+
+/**
+ * A thread-safe Marshaller for {@link org.opensaml.xmlsec.encryption.ConcatKDFParams} objects.
+ */
+public class ConcatKDFParamsMarshaller extends AbstractXMLEncryptionMarshaller {
+
+    /** {@inheritDoc} */
+    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+        final ConcatKDFParams params = (ConcatKDFParams) xmlObject;
+
+        if (params.getAlgorithmID() != null) {
+            domElement.setAttributeNS(null, ConcatKDFParams.ALGORITHM_ID_ATTRIBUTE_NAME, params.getAlgorithmID());
+        }
+        if (params.getPartyUInfo() != null) {
+            domElement.setAttributeNS(null, ConcatKDFParams.PARTY_U_INFO_ATTRIBUTE_NAME, params.getPartyUInfo());
+        }
+        if (params.getPartyVInfo() != null) {
+            domElement.setAttributeNS(null, ConcatKDFParams.PARTY_V_INFO_ATTRIBUTE_NAME, params.getPartyVInfo());
+        }
+        if (params.getSuppPubInfo() != null) {
+            domElement.setAttributeNS(null, ConcatKDFParams.SUPP_PUB_INFO_ATTRIBUTE_NAME, params.getSuppPubInfo());
+        }
+        if (params.getSuppPrivInfo() != null) {
+            domElement.setAttributeNS(null, ConcatKDFParams.SUPP_PRIV_INFO_ATTRIBUTE_NAME, params.getSuppPrivInfo());
+        }
+        
+        super.marshallAttributes(xmlObject, domElement);
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/ConcatKDFParamsUnmarshaller.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/ConcatKDFParamsUnmarshaller.java
new file mode 100644
index 000000000..da211b896
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/ConcatKDFParamsUnmarshaller.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+import org.opensaml.core.xml.XMLObject;
+import org.opensaml.core.xml.io.UnmarshallingException;
+import org.opensaml.xmlsec.encryption.ConcatKDFParams;
+import org.opensaml.xmlsec.signature.DigestMethod;
+import org.w3c.dom.Attr;
+
+/**
+ * A thread-safe Unmarshaller for {@link org.opensaml.xmlsec.encryption.ConcatKDFParams} objects.
+ */
+public class ConcatKDFParamsUnmarshaller extends AbstractXMLEncryptionUnmarshaller {
+
+    /** {@inheritDoc} */
+    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+        final ConcatKDFParams params = (ConcatKDFParams) xmlObject;
+
+        if (attribute.getLocalName().equals(ConcatKDFParams.ALGORITHM_ID_ATTRIBUTE_NAME)) {
+            params.setAlgorithmID(attribute.getValue());
+        } else if (attribute.getLocalName().equals(ConcatKDFParams.PARTY_U_INFO_ATTRIBUTE_NAME)) {
+            params.setPartyUInfo(attribute.getValue());
+        } else if (attribute.getLocalName().equals(ConcatKDFParams.PARTY_V_INFO_ATTRIBUTE_NAME)) {
+            params.setPartyVInfo(attribute.getValue());
+        } else if (attribute.getLocalName().equals(ConcatKDFParams.SUPP_PUB_INFO_ATTRIBUTE_NAME)) {
+            params.setSuppPubInfo(attribute.getValue());
+        } else if (attribute.getLocalName().equals(ConcatKDFParams.SUPP_PRIV_INFO_ATTRIBUTE_NAME)) {
+            params.setSuppPrivInfo(attribute.getValue());
+        } else {
+            super.processAttribute(xmlObject, attribute);
+        }
+    }
+
+    /** {@inheritDoc} */
+    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
+            throws UnmarshallingException {
+        final ConcatKDFParams params = (ConcatKDFParams) parentXMLObject;
+
+        if (childXMLObject instanceof DigestMethod) {
+            params.setDigestMethod((DigestMethod) childXMLObject);
+        } else {
+            super.processChildElement(parentXMLObject, childXMLObject);
+        }
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/DerivedKeyBuilder.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/DerivedKeyBuilder.java
new file mode 100644
index 000000000..726ee0fb0
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/DerivedKeyBuilder.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+import org.opensaml.core.xml.AbstractXMLObjectBuilder;
+import org.opensaml.xmlsec.encryption.DerivedKey;
+import org.opensaml.xmlsec.encryption.XMLEncryptionBuilder;
+import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
+
+/**
+ * Builder of {@link org.opensaml.xmlsec.encryption.CarriedKeyName}.
+ */
+public class DerivedKeyBuilder extends AbstractXMLObjectBuilder<DerivedKey> implements
+        XMLEncryptionBuilder<DerivedKey> {
+
+    /** Constructor. */
+    public DerivedKeyBuilder() {
+    }
+
+    /** {@inheritDoc} */
+    public DerivedKey buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+        return new DerivedKeyImpl(namespaceURI, localName, namespacePrefix);
+    }
+
+    /** {@inheritDoc} */
+    public DerivedKey buildObject() {
+        return buildObject(EncryptionConstants.XMLENC11_NS, DerivedKey.DEFAULT_ELEMENT_LOCAL_NAME,
+                EncryptionConstants.XMLENC11_PREFIX);
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/DerivedKeyImpl.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/DerivedKeyImpl.java
new file mode 100644
index 000000000..b05dee27e
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/DerivedKeyImpl.java
@@ -0,0 +1,171 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.Nullable;
+
+import org.opensaml.core.xml.AbstractXMLObject;
+import org.opensaml.core.xml.XMLObject;
+import org.opensaml.xmlsec.encryption.DerivedKey;
+import org.opensaml.xmlsec.encryption.DerivedKeyName;
+import org.opensaml.xmlsec.encryption.KeyDerivationMethod;
+import org.opensaml.xmlsec.encryption.MasterKeyName;
+import org.opensaml.xmlsec.encryption.ReferenceList;
+
+/**
+ * Concrete implementation of {@link org.opensaml.xmlsec.encryption.DerivedKey}.
+ */
+public class DerivedKeyImpl extends AbstractXMLObject implements DerivedKey {
+    
+    /** KeyDerivationMethod child element. */
+    @Nullable private KeyDerivationMethod keyDerivationMethod;
+    
+    /** ReferenceList child element. */
+    @Nullable private ReferenceList referenceList;
+    
+    /** DerivedKeyName child element. */
+    @Nullable private DerivedKeyName derivedKeyName;
+    
+    /** MasterKeyName child element. */
+    @Nullable private MasterKeyName masterKeyName;
+    
+    /** Recipient attribute. */
+    @Nullable private String recipient;
+    
+    /** Id attribute. */
+    @Nullable private String id;
+    
+    /** Type attribute. */
+    @Nullable private String type;
+
+    /**
+     * Constructor.
+     * 
+     * @param namespaceURI namespace URI
+     * @param elementLocalName local name
+     * @param namespacePrefix namespace prefix
+     */
+    protected DerivedKeyImpl(final String namespaceURI, final String elementLocalName,
+            final String namespacePrefix) {
+        super(namespaceURI, elementLocalName, namespacePrefix);
+    }
+
+    /** {@inheritDoc} */
+    @Nullable public KeyDerivationMethod getKeyDerivationMethod() {
+        return keyDerivationMethod;
+    }
+
+    /** {@inheritDoc} */
+    public void setKeyDerivationMethod(@Nullable final KeyDerivationMethod method) {
+        keyDerivationMethod = prepareForAssignment(keyDerivationMethod, method);
+    }
+
+    /** {@inheritDoc} */
+    @Nullable public ReferenceList getReferenceList() {
+        return referenceList;
+    }
+
+    /** {@inheritDoc} */
+    public void setReferenceList(@Nullable final ReferenceList newReferenceList) {
+        referenceList = prepareForAssignment(referenceList, newReferenceList);
+    }
+
+    /** {@inheritDoc} */
+    @Nullable public DerivedKeyName getDerivedKeyName() {
+        return derivedKeyName;
+    }
+
+    /** {@inheritDoc} */
+    public void setDerivedKeyName(@Nullable final DerivedKeyName name) {
+        derivedKeyName = prepareForAssignment(derivedKeyName, name);
+    }
+
+    /** {@inheritDoc} */
+    @Nullable public MasterKeyName getMasterKeyName() {
+        return masterKeyName;
+    }
+
+    /** {@inheritDoc} */
+    public void setMasterKeyName(@Nullable final MasterKeyName name) {
+        masterKeyName = prepareForAssignment(masterKeyName, name);
+    }
+
+    /** {@inheritDoc} */
+    @Nullable public String getRecipient() {
+        return recipient;
+    }
+
+    /** {@inheritDoc} */
+    public void setRecipient(@Nullable final String newRecipient) {
+        recipient = prepareForAssignment(recipient, newRecipient);
+    }
+
+    /** {@inheritDoc} */
+    @Nullable public String getId() {
+        return id;
+    }
+
+    /** {@inheritDoc} */
+    public void setId(@Nullable final String newId) {
+        final String oldID = id;
+        id = prepareForAssignment(id, newId);
+        registerOwnID(oldID, id);
+    }
+
+    /** {@inheritDoc} */
+    @Nullable public String getType() {
+        return type;
+    }
+
+    /** {@inheritDoc} */
+    public void setType(@Nullable final String newType) {
+        type = prepareForAssignment(type, newType);
+    }
+
+    /** {@inheritDoc} */
+    public List<XMLObject> getOrderedChildren() {
+        final ArrayList<XMLObject> children = new ArrayList<>();
+
+        if (keyDerivationMethod != null) {
+            children.add(keyDerivationMethod);
+        }
+
+        if (referenceList != null) {
+            children.add(referenceList);
+        }
+
+        if (derivedKeyName != null) {
+            children.add(derivedKeyName);
+        }
+
+        if (masterKeyName != null) {
+            children.add(masterKeyName);
+        }
+
+        if (children.size() == 0) {
+            return null;
+        }
+
+        return Collections.unmodifiableList(children);
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/DerivedKeyMarshaller.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/DerivedKeyMarshaller.java
new file mode 100644
index 000000000..88ae0b118
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/DerivedKeyMarshaller.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+import org.opensaml.core.xml.XMLObject;
+import org.opensaml.core.xml.io.MarshallingException;
+import org.opensaml.core.xml.util.XMLObjectSupport;
+import org.opensaml.xmlsec.encryption.DerivedKey;
+import org.w3c.dom.Element;
+
+/**
+ * A thread-safe Marshaller for {@link org.opensaml.xmlsec.encryption.DerivedKey} objects.
+ */
+public class DerivedKeyMarshaller extends AbstractXMLEncryptionMarshaller {
+
+    /** {@inheritDoc} */
+    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+        final DerivedKey dk = (DerivedKey) xmlObject;
+
+        if (dk.getRecipient() != null) {
+            domElement.setAttributeNS(null, DerivedKey.RECIPIENT_ATTRIBUTE_NAME, dk.getRecipient());
+        }
+        if (dk.getId() != null) {
+            domElement.setAttributeNS(null, DerivedKey.ID_ATTRIBUTE_NAME, dk.getId());
+        }
+        if (dk.getType() != null) {
+            domElement.setAttributeNS(null, DerivedKey.TYPE_ATTRIBUTE_NAME, dk.getType());
+        }
+        
+        super.marshallAttributes(xmlObject, domElement);
+    }
+
+    /** {@inheritDoc} */
+    protected void marshallAttributeIDness(final XMLObject xmlObject, final Element domElement)
+            throws MarshallingException {
+
+        XMLObjectSupport.marshallAttributeIDness(null, DerivedKey.ID_ATTRIBUTE_NAME, domElement, true);
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/DerivedKeyNameBuilder.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/DerivedKeyNameBuilder.java
new file mode 100644
index 000000000..fec5d9e49
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/DerivedKeyNameBuilder.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+import org.opensaml.core.xml.AbstractXMLObjectBuilder;
+import org.opensaml.xmlsec.encryption.CarriedKeyName;
+import org.opensaml.xmlsec.encryption.DerivedKeyName;
+import org.opensaml.xmlsec.encryption.XMLEncryptionBuilder;
+import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
+
+/**
+ * Builder of {@link org.opensaml.xmlsec.encryption.CarriedKeyName}.
+ */
+public class DerivedKeyNameBuilder extends AbstractXMLObjectBuilder<DerivedKeyName> implements
+        XMLEncryptionBuilder<DerivedKeyName> {
+
+    /** Constructor. */
+    public DerivedKeyNameBuilder() {
+    }
+
+    /** {@inheritDoc} */
+    public DerivedKeyName buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+        return new DerivedKeyNameImpl(namespaceURI, localName, namespacePrefix);
+    }
+
+    /** {@inheritDoc} */
+    public DerivedKeyName buildObject() {
+        return buildObject(EncryptionConstants.XMLENC11_NS, CarriedKeyName.DEFAULT_ELEMENT_LOCAL_NAME,
+                EncryptionConstants.XMLENC11_PREFIX);
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/DerivedKeyNameImpl.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/DerivedKeyNameImpl.java
new file mode 100644
index 000000000..bd97ab1a6
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/DerivedKeyNameImpl.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+import org.opensaml.core.xml.schema.impl.XSStringImpl;
+import org.opensaml.xmlsec.encryption.DerivedKeyName;
+
+/**
+ * Concrete implementation of {@link org.opensaml.xmlsec.encryption.DerivedKeyName}.
+ */
+public class DerivedKeyNameImpl extends XSStringImpl implements DerivedKeyName {
+
+    /**
+     * Constructor.
+     *
+     * @param namespaceURI namespace URI
+     * @param elementLocalName local name
+     * @param namespacePrefix namespace prefix
+     */
+    protected DerivedKeyNameImpl(final String namespaceURI, final String elementLocalName,
+            final String namespacePrefix) {
+        super(namespaceURI, elementLocalName, namespacePrefix);
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/DerivedKeyUnmarshaller.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/DerivedKeyUnmarshaller.java
new file mode 100644
index 000000000..154230464
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/DerivedKeyUnmarshaller.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+import org.opensaml.core.xml.XMLObject;
+import org.opensaml.core.xml.io.UnmarshallingException;
+import org.opensaml.xmlsec.encryption.DerivedKey;
+import org.opensaml.xmlsec.encryption.DerivedKeyName;
+import org.opensaml.xmlsec.encryption.KeyDerivationMethod;
+import org.opensaml.xmlsec.encryption.MasterKeyName;
+import org.opensaml.xmlsec.encryption.ReferenceList;
+import org.w3c.dom.Attr;
+
+/**
+ * A thread-safe Unmarshaller for {@link org.opensaml.xmlsec.encryption.DerivedKey} objects.
+ */
+public class DerivedKeyUnmarshaller extends AbstractXMLEncryptionUnmarshaller {
+
+    /** {@inheritDoc} */
+    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+        final DerivedKey dk = (DerivedKey) xmlObject;
+
+        if (attribute.getLocalName().equals(DerivedKey.ID_ATTRIBUTE_NAME)) {
+            dk.setId(attribute.getValue());
+            attribute.getOwnerElement().setIdAttributeNode(attribute, true);
+        } else if (attribute.getLocalName().equals(DerivedKey.RECIPIENT_ATTRIBUTE_NAME)) {
+            dk.setRecipient(attribute.getValue());
+        } else if (attribute.getLocalName().equals(DerivedKey.TYPE_ATTRIBUTE_NAME)) {
+            dk.setType(attribute.getValue());
+        } else {
+            super.processAttribute(xmlObject, attribute);
+        }
+    }
+
+    /** {@inheritDoc} */
+    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
+            throws UnmarshallingException {
+        final DerivedKey dk = (DerivedKey) parentXMLObject;
+
+        if (childXMLObject instanceof KeyDerivationMethod) {
+            dk.setKeyDerivationMethod((KeyDerivationMethod) childXMLObject);
+        } else if (childXMLObject instanceof ReferenceList) {
+            dk.setReferenceList((ReferenceList) childXMLObject);
+        } else if (childXMLObject instanceof DerivedKeyName) {
+            dk.setDerivedKeyName((DerivedKeyName) childXMLObject);
+        } else if (childXMLObject instanceof MasterKeyName) {
+            dk.setMasterKeyName((MasterKeyName) childXMLObject);
+        } else {
+            super.processChildElement(parentXMLObject, childXMLObject);
+        }
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/IterationCountBuilder.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/IterationCountBuilder.java
new file mode 100644
index 000000000..24eca0d09
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/IterationCountBuilder.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+import org.opensaml.core.xml.AbstractXMLObjectBuilder;
+import org.opensaml.xmlsec.encryption.IterationCount;
+import org.opensaml.xmlsec.encryption.XMLEncryptionBuilder;
+import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
+
+/**
+ * Builder of {@link org.opensaml.xmlsec.encryption.CarriedKeyName}.
+ */
+public class IterationCountBuilder extends AbstractXMLObjectBuilder<IterationCount> implements
+        XMLEncryptionBuilder<IterationCount> {
+
+    /** Constructor. */
+    public IterationCountBuilder() {
+    }
+
+    /** {@inheritDoc} */
+    public IterationCount buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+        return new IterationCountImpl(namespaceURI, localName, namespacePrefix);
+    }
+
+    /** {@inheritDoc} */
+    public IterationCount buildObject() {
+        return buildObject(EncryptionConstants.XMLENC11_NS, IterationCount.DEFAULT_ELEMENT_LOCAL_NAME,
+                EncryptionConstants.XMLENC11_PREFIX);
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/IterationCountImpl.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/IterationCountImpl.java
new file mode 100644
index 000000000..64930e2f7
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/IterationCountImpl.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+import org.opensaml.core.xml.schema.impl.XSIntegerImpl;
+import org.opensaml.xmlsec.encryption.IterationCount;
+
+/**
+ * Concrete implementation of {@link org.opensaml.xmlsec.encryption.IterationCount}.
+ */
+public class IterationCountImpl extends XSIntegerImpl implements IterationCount {
+
+    /**
+     * Constructor.
+     *
+     * @param namespaceURI namespace URI
+     * @param elementLocalName local name
+     * @param namespacePrefix namespace prefix
+     */
+    protected IterationCountImpl(final String namespaceURI, final String elementLocalName,
+            final String namespacePrefix) {
+        super(namespaceURI, elementLocalName, namespacePrefix);
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/KeyDerivationMethodBuilder.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/KeyDerivationMethodBuilder.java
new file mode 100644
index 000000000..e8e4c3ae9
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/KeyDerivationMethodBuilder.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+import org.opensaml.core.xml.AbstractXMLObjectBuilder;
+import org.opensaml.xmlsec.encryption.KeyDerivationMethod;
+import org.opensaml.xmlsec.encryption.XMLEncryptionBuilder;
+import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
+
+/**
+ * Builder of {@link org.opensaml.xmlsec.encryption.KANonce}.
+ */
+public class KeyDerivationMethodBuilder extends AbstractXMLObjectBuilder<KeyDerivationMethod>
+        implements XMLEncryptionBuilder<KeyDerivationMethod> {
+
+    /**
+     * Constructor.
+     */
+    public KeyDerivationMethodBuilder() {
+    }
+
+    /** {@inheritDoc} */
+    public KeyDerivationMethod buildObject(final String namespaceURI, final String localName,
+            final String namespacePrefix) {
+        return new KeyDerivationMethodImpl(namespaceURI, localName, namespacePrefix);
+    }
+
+    /** {@inheritDoc} */
+    public KeyDerivationMethod buildObject() {
+        return buildObject(EncryptionConstants.XMLENC11_NS, KeyDerivationMethod.DEFAULT_ELEMENT_LOCAL_NAME,
+                EncryptionConstants.XMLENC11_PREFIX);
+    }
+
+}
\ No newline at end of file
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/KeyDerivationMethodImpl.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/KeyDerivationMethodImpl.java
new file mode 100644
index 000000000..09f86a057
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/KeyDerivationMethodImpl.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import javax.xml.namespace.QName;
+
+import org.opensaml.core.xml.AbstractXMLObject;
+import org.opensaml.core.xml.XMLObject;
+import org.opensaml.core.xml.util.IndexedXMLObjectChildrenList;
+import org.opensaml.xmlsec.encryption.KeyDerivationMethod;
+
+/**
+ * Concrete implementation of {@link org.opensaml.xmlsec.encryption.KeyDerivationMethod}.
+ */
+public class KeyDerivationMethodImpl extends AbstractXMLObject implements KeyDerivationMethod {
+
+    /** Algorithm attribute value. */
+    private String algorithm;
+    
+    /** Wildcard children. */
+    private IndexedXMLObjectChildrenList<XMLObject> unknownChildren;
+
+    /**
+     * Constructor.
+     * 
+     * @param namespaceURI namespace URI
+     * @param elementLocalName local name
+     * @param namespacePrefix namespace prefix
+     */
+    protected KeyDerivationMethodImpl(final String namespaceURI, final String elementLocalName,
+            final String namespacePrefix) {
+        super(namespaceURI, elementLocalName, namespacePrefix);
+        
+        unknownChildren = new IndexedXMLObjectChildrenList<>(this);
+    }
+
+    /** {@inheritDoc} */
+    @Nullable public String getAlgorithm() {
+        return algorithm;
+    }
+
+    /** {@inheritDoc} */
+    public void setAlgorithm(@Nullable final String newAlgorithm) {
+        algorithm = prepareForAssignment(algorithm, newAlgorithm);
+    }
+
+    /** {@inheritDoc} */
+    public List<XMLObject> getUnknownXMLObjects() {
+        return unknownChildren;
+    }
+
+    /** {@inheritDoc} */
+    public List<XMLObject> getUnknownXMLObjects(@Nonnull final QName typeOrName) {
+        return (List<XMLObject>) unknownChildren.subList(typeOrName);
+    }
+
+    /** {@inheritDoc} */
+    public List<XMLObject> getOrderedChildren() {
+        final ArrayList<XMLObject> children = new ArrayList<>();
+
+        children.addAll(unknownChildren);
+
+        if (children.size() == 0) {
+            return null;
+        }
+
+        return Collections.unmodifiableList(children);
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/KeyDerivationMethodMarshaller.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/KeyDerivationMethodMarshaller.java
new file mode 100644
index 000000000..f3cf0dfc3
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/KeyDerivationMethodMarshaller.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+import org.opensaml.core.xml.XMLObject;
+import org.opensaml.core.xml.io.MarshallingException;
+import org.opensaml.xmlsec.encryption.KeyDerivationMethod;
+import org.w3c.dom.Element;
+
+/**
+ * A thread-safe Marshaller for {@link org.opensaml.xmlsec.encryption.DerivedKey} objects.
+ */
+public class KeyDerivationMethodMarshaller extends AbstractXMLEncryptionMarshaller {
+
+    /** {@inheritDoc} */
+    protected void marshallAttributes(final XMLObject xmlObject, final Element domElement) throws MarshallingException {
+        final KeyDerivationMethod kdm = (KeyDerivationMethod) xmlObject;
+
+        if (kdm.getAlgorithm() != null) {
+            domElement.setAttributeNS(null, KeyDerivationMethod.ALGORITHM_ATTRIBUTE_NAME, kdm.getAlgorithm());
+        }
+        
+        super.marshallAttributes(xmlObject, domElement);
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/KeyDerivationMethodUnmarshaller.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/KeyDerivationMethodUnmarshaller.java
new file mode 100644
index 000000000..44500134f
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/KeyDerivationMethodUnmarshaller.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+import org.opensaml.core.xml.XMLObject;
+import org.opensaml.core.xml.io.UnmarshallingException;
+import org.opensaml.xmlsec.encryption.KeyDerivationMethod;
+import org.w3c.dom.Attr;
+
+/**
+ * A thread-safe Unmarshaller for {@link org.opensaml.xmlsec.encryption.AgreementMethod} objects.
+ */
+public class KeyDerivationMethodUnmarshaller extends AbstractXMLEncryptionUnmarshaller {
+
+    /** {@inheritDoc} */
+    protected void processAttribute(final XMLObject xmlObject, final Attr attribute) throws UnmarshallingException {
+        final KeyDerivationMethod kdm = (KeyDerivationMethod) xmlObject;
+
+        if (attribute.getLocalName().equals(KeyDerivationMethod.ALGORITHM_ATTRIBUTE_NAME)) {
+            kdm.setAlgorithm(attribute.getValue());
+        } else {
+            super.processAttribute(xmlObject, attribute);
+        }
+    }
+
+    /** {@inheritDoc} */
+    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
+            throws UnmarshallingException {
+        final KeyDerivationMethod kdm = (KeyDerivationMethod) parentXMLObject;
+
+        kdm.getUnknownXMLObjects().add(childXMLObject);
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/KeyLengthBuilder.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/KeyLengthBuilder.java
new file mode 100644
index 000000000..efca56136
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/KeyLengthBuilder.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+import org.opensaml.core.xml.AbstractXMLObjectBuilder;
+import org.opensaml.xmlsec.encryption.KeyLength;
+import org.opensaml.xmlsec.encryption.XMLEncryptionBuilder;
+import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
+
+/**
+ * Builder of {@link org.opensaml.xmlsec.encryption.CarriedKeyName}.
+ */
+public class KeyLengthBuilder extends AbstractXMLObjectBuilder<KeyLength> implements
+        XMLEncryptionBuilder<KeyLength> {
+
+    /** Constructor. */
+    public KeyLengthBuilder() {
+    }
+
+    /** {@inheritDoc} */
+    public KeyLength buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+        return new KeyLengthImpl(namespaceURI, localName, namespacePrefix);
+    }
+
+    /** {@inheritDoc} */
+    public KeyLength buildObject() {
+        return buildObject(EncryptionConstants.XMLENC11_NS, KeyLength.DEFAULT_ELEMENT_LOCAL_NAME,
+                EncryptionConstants.XMLENC11_PREFIX);
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/KeyLengthImpl.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/KeyLengthImpl.java
new file mode 100644
index 000000000..a3abc713f
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/KeyLengthImpl.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+import org.opensaml.core.xml.schema.impl.XSIntegerImpl;
+import org.opensaml.xmlsec.encryption.KeyLength;
+
+/**
+ * Concrete implementation of {@link org.opensaml.xmlsec.encryption.IterationCount}.
+ */
+public class KeyLengthImpl extends XSIntegerImpl implements KeyLength {
+
+    /**
+     * Constructor.
+     *
+     * @param namespaceURI namespace URI
+     * @param elementLocalName local name
+     * @param namespacePrefix namespace prefix
+     */
+    protected KeyLengthImpl(final String namespaceURI, final String elementLocalName,
+            final String namespacePrefix) {
+        super(namespaceURI, elementLocalName, namespacePrefix);
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/MasterKeyNameBuilder.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/MasterKeyNameBuilder.java
new file mode 100644
index 000000000..2272eaa48
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/MasterKeyNameBuilder.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+import org.opensaml.core.xml.AbstractXMLObjectBuilder;
+import org.opensaml.xmlsec.encryption.MasterKeyName;
+import org.opensaml.xmlsec.encryption.XMLEncryptionBuilder;
+import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
+
+/**
+ * Builder of {@link org.opensaml.xmlsec.encryption.CarriedKeyName}.
+ */
+public class MasterKeyNameBuilder extends AbstractXMLObjectBuilder<MasterKeyName> implements
+        XMLEncryptionBuilder<MasterKeyName> {
+
+    /** Constructor. */
+    public MasterKeyNameBuilder() {
+    }
+
+    /** {@inheritDoc} */
+    public MasterKeyName buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+        return new MasterKeyNameImpl(namespaceURI, localName, namespacePrefix);
+    }
+
+    /** {@inheritDoc} */
+    public MasterKeyName buildObject() {
+        return buildObject(EncryptionConstants.XMLENC11_NS, MasterKeyName.DEFAULT_ELEMENT_LOCAL_NAME,
+                EncryptionConstants.XMLENC11_PREFIX);
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/MasterKeyNameImpl.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/MasterKeyNameImpl.java
new file mode 100644
index 000000000..08d5df61d
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/MasterKeyNameImpl.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+import org.opensaml.core.xml.schema.impl.XSStringImpl;
+import org.opensaml.xmlsec.encryption.MasterKeyName;
+
+/**
+ * Concrete implementation of {@link org.opensaml.xmlsec.encryption.MasterKeyName}.
+ */
+public class MasterKeyNameImpl extends XSStringImpl implements MasterKeyName {
+
+    /**
+     * Constructor.
+     *
+     * @param namespaceURI namespace URI
+     * @param elementLocalName local name
+     * @param namespacePrefix namespace prefix
+     */
+    protected MasterKeyNameImpl(final String namespaceURI, final String elementLocalName,
+            final String namespacePrefix) {
+        super(namespaceURI, elementLocalName, namespacePrefix);
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/OtherSourceBuilder.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/OtherSourceBuilder.java
new file mode 100644
index 000000000..3a67eee18
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/OtherSourceBuilder.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+import org.opensaml.core.xml.AbstractXMLObjectBuilder;
+import org.opensaml.xmlsec.encryption.OtherSource;
+import org.opensaml.xmlsec.encryption.XMLEncryptionBuilder;
+import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
+
+/**
+ * Builder of {@link org.opensaml.xmlsec.encryption.OtherSource}.
+ */
+public class OtherSourceBuilder extends AbstractXMLObjectBuilder<OtherSource> implements XMLEncryptionBuilder<OtherSource> {
+
+    /**
+     * Constructor.
+     */
+    public OtherSourceBuilder() {
+    }
+
+    /** {@inheritDoc} */
+    public OtherSource buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+        return new OtherSourceImpl(namespaceURI, localName, namespacePrefix);
+    }
+
+    /** {@inheritDoc} */
+    public OtherSource buildObject() {
+        return buildObject(EncryptionConstants.XMLENC11_NS, OtherSource.DEFAULT_ELEMENT_LOCAL_NAME,
+                EncryptionConstants.XMLENC11_PREFIX);
+    }
+
+}
\ No newline at end of file
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/OtherSourceImpl.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/OtherSourceImpl.java
new file mode 100644
index 000000000..cdd6b16ca
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/OtherSourceImpl.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+import org.opensaml.xmlsec.encryption.OtherSource;
+
+/**
+ * Abstract implementation of {@link org.opensaml.xmlsec.encryption.OtherSource}.
+ */
+public class OtherSourceImpl extends AlgorithmIdentifierTypeImpl implements OtherSource {
+
+    /**
+     * Constructor.
+     *
+     * @param namespaceURI namespace URI
+     * @param elementLocalName local name
+     * @param namespacePrefix namespace prefix
+     */
+    protected OtherSourceImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+        super(namespaceURI, elementLocalName, namespacePrefix);
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/OtherSourceMarshaller.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/OtherSourceMarshaller.java
new file mode 100644
index 000000000..c939e3a1f
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/OtherSourceMarshaller.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+/**
+ * A thread-safe Marshaller for {@link org.opensaml.xmlsec.encryption.OtherSource} objects.
+ */
+public class OtherSourceMarshaller extends AlgorithmIdentifierTypeMarshaller {
+
+}
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/OtherSourceUnmarshaller.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/OtherSourceUnmarshaller.java
new file mode 100644
index 000000000..18f3fea7e
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/OtherSourceUnmarshaller.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+/**
+ * A thread-safe Unmarshaller for {@link org.opensaml.xmlsec.encryption.OtherSource} objects.
+ */
+public class OtherSourceUnmarshaller extends AlgorithmIdentifierTypeUnmarshaller {
+
+}
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/PBKDF2ParamsBuilder.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/PBKDF2ParamsBuilder.java
new file mode 100644
index 000000000..0a2211147
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/PBKDF2ParamsBuilder.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+import org.opensaml.core.xml.AbstractXMLObjectBuilder;
+import org.opensaml.xmlsec.encryption.PBKDF2Params;
+import org.opensaml.xmlsec.encryption.XMLEncryptionBuilder;
+import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
+
+/**
+ * Builder of {@link org.opensaml.xmlsec.encryption.PBKDF2Params}.
+ */
+public class PBKDF2ParamsBuilder extends AbstractXMLObjectBuilder<PBKDF2Params>
+        implements XMLEncryptionBuilder<PBKDF2Params> {
+
+    /**
+     * Constructor.
+     */
+    public PBKDF2ParamsBuilder() {
+    }
+
+    /** {@inheritDoc} */
+    public PBKDF2Params buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+        return new PBKDF2ParamsImpl(namespaceURI, localName, namespacePrefix);
+    }
+
+    /** {@inheritDoc} */
+    public PBKDF2Params buildObject() {
+        return buildObject(EncryptionConstants.XMLENC11_NS, PBKDF2Params.DEFAULT_ELEMENT_LOCAL_NAME,
+                EncryptionConstants.XMLENC11_PREFIX);
+    }
+
+}
\ No newline at end of file
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/PBKDF2ParamsImpl.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/PBKDF2ParamsImpl.java
new file mode 100644
index 000000000..1277dd4c5
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/PBKDF2ParamsImpl.java
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.Nullable;
+
+import org.opensaml.core.xml.AbstractXMLObject;
+import org.opensaml.core.xml.XMLObject;
+import org.opensaml.xmlsec.encryption.IterationCount;
+import org.opensaml.xmlsec.encryption.KeyLength;
+import org.opensaml.xmlsec.encryption.PBKDF2Params;
+import org.opensaml.xmlsec.encryption.PRF;
+import org.opensaml.xmlsec.encryption.Salt;
+
+/**
+ * Concrete implementation of {@link org.opensaml.xmlsec.encryption.PBKDF2Params}.
+ */
+public class PBKDF2ParamsImpl extends AbstractXMLObject implements PBKDF2Params {
+    
+    /** Salt child element. */
+    @Nullable private Salt salt;
+
+    /** IterationCount child element. */
+    @Nullable private IterationCount iterationCount;
+
+    /** KeyLength child element. */
+    @Nullable private KeyLength keyLength;
+
+    /** PRF child element. */
+    @Nullable private PRF prf;
+
+    /**
+     * Constructor.
+     *
+     * @param namespaceURI namespace URI
+     * @param elementLocalName local name
+     * @param namespacePrefix namespace prefix
+     */
+    protected PBKDF2ParamsImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+        super(namespaceURI, elementLocalName, namespacePrefix);
+    }
+
+    /** {@inheritDoc} */
+    @Nullable public Salt getSalt() {
+        return salt;
+    }
+
+    /** {@inheritDoc} */
+    public void setSalt(@Nullable final Salt newSalt) {
+        salt = prepareForAssignment(salt, newSalt);
+    }
+
+    /** {@inheritDoc} */
+    @Nullable public IterationCount getIterationCount() {
+        return iterationCount;
+    }
+
+    /** {@inheritDoc} */
+    public void setIterationCount(@Nullable final IterationCount count) {
+        iterationCount = prepareForAssignment(iterationCount, count);
+    }
+
+    /** {@inheritDoc} */
+    @Nullable public KeyLength getKeyLength() {
+        return keyLength;
+    }
+
+    /** {@inheritDoc} */
+    public void setKeyLength(@Nullable final KeyLength length) {
+        keyLength = prepareForAssignment(keyLength, length);
+    }
+
+    /** {@inheritDoc} */
+    @Nullable public PRF getPRF() {
+        return prf;
+    }
+
+    /** {@inheritDoc} */
+    public void setPRF(@Nullable final PRF newPRF) {
+        prf = prepareForAssignment(prf, newPRF);
+    }
+
+    /** {@inheritDoc} */
+    public List<XMLObject> getOrderedChildren() {
+       final ArrayList<XMLObject> children = new ArrayList<>();
+        
+        if (salt != null) {
+            children.add(salt);
+        }
+        if (iterationCount != null) {
+            children.add(iterationCount);
+        }
+        if (keyLength != null) {
+            children.add(keyLength);
+        }
+        if (prf != null) {
+            children.add(prf);
+        }
+        
+        if (children.size() == 0) {
+            return null;
+        }
+        
+        return Collections.unmodifiableList(children);
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/PBKDF2ParamsMarshaller.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/PBKDF2ParamsMarshaller.java
new file mode 100644
index 000000000..a74929b07
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/PBKDF2ParamsMarshaller.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+/**
+ * A thread-safe Marshaller for {@link org.opensaml.xmlsec.encryption.PBKDF2Params} objects.
+ */
+public class PBKDF2ParamsMarshaller extends AbstractXMLEncryptionMarshaller {
+
+}
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/PBKDF2ParamsUnmarshaller.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/PBKDF2ParamsUnmarshaller.java
new file mode 100644
index 000000000..faf3e1cb8
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/PBKDF2ParamsUnmarshaller.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+import org.opensaml.core.xml.XMLObject;
+import org.opensaml.core.xml.io.UnmarshallingException;
+import org.opensaml.xmlsec.encryption.IterationCount;
+import org.opensaml.xmlsec.encryption.KeyLength;
+import org.opensaml.xmlsec.encryption.PBKDF2Params;
+import org.opensaml.xmlsec.encryption.PRF;
+import org.opensaml.xmlsec.encryption.Salt;
+
+/**
+ * A thread-safe Unmarshaller for {@link org.opensaml.xmlsec.encryption.PBKDF2Params} objects.
+ */
+public class PBKDF2ParamsUnmarshaller extends AbstractXMLEncryptionUnmarshaller {
+
+    /** {@inheritDoc} */
+    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
+            throws UnmarshallingException {
+        
+        final PBKDF2Params params = (PBKDF2Params) parentXMLObject;
+        
+        if (childXMLObject instanceof Salt) {
+            params.setSalt((Salt) childXMLObject);
+        } else if (childXMLObject instanceof IterationCount) {
+            params.setIterationCount((IterationCount) childXMLObject);
+        } else if (childXMLObject instanceof KeyLength) {
+            params.setKeyLength((KeyLength) childXMLObject);
+        } else if (childXMLObject instanceof PRF) {
+            params.setPRF((PRF) childXMLObject);
+        } else {
+            super.processChildElement(parentXMLObject, childXMLObject);
+        }
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/PRFBuilder.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/PRFBuilder.java
new file mode 100644
index 000000000..b00f69243
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/PRFBuilder.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+import org.opensaml.core.xml.AbstractXMLObjectBuilder;
+import org.opensaml.xmlsec.encryption.PRF;
+import org.opensaml.xmlsec.encryption.XMLEncryptionBuilder;
+import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
+
+/**
+ * Builder of {@link org.opensaml.xmlsec.encryption.PRF}.
+ */
+public class PRFBuilder extends AbstractXMLObjectBuilder<PRF> implements XMLEncryptionBuilder<PRF> {
+
+    /**
+     * Constructor.
+     */
+    public PRFBuilder() {
+    }
+
+    /** {@inheritDoc} */
+    public PRF buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+        return new PRFImpl(namespaceURI, localName, namespacePrefix);
+    }
+
+    /** {@inheritDoc} */
+    public PRF buildObject() {
+        return buildObject(EncryptionConstants.XMLENC11_NS, PRF.DEFAULT_ELEMENT_LOCAL_NAME,
+                EncryptionConstants.XMLENC11_PREFIX);
+    }
+
+}
\ No newline at end of file
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/PRFImpl.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/PRFImpl.java
new file mode 100644
index 000000000..aaaef5021
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/PRFImpl.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+import org.opensaml.xmlsec.encryption.PRF;
+
+/**
+ * Abstract implementation of {@link org.opensaml.xmlsec.encryption.PRF}.
+ */
+public class PRFImpl extends AlgorithmIdentifierTypeImpl implements PRF {
+
+    /**
+     * Constructor.
+     *
+     * @param namespaceURI namespace URI
+     * @param elementLocalName local name
+     * @param namespacePrefix namespace prefix
+     */
+    protected PRFImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+        super(namespaceURI, elementLocalName, namespacePrefix);
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/PRFMarshaller.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/PRFMarshaller.java
new file mode 100644
index 000000000..4519fb007
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/PRFMarshaller.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+/**
+ * A thread-safe Marshaller for {@link org.opensaml.xmlsec.encryption.PRF} objects.
+ */
+public class PRFMarshaller extends AlgorithmIdentifierTypeMarshaller {
+
+}
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/PRFUnmarshaller.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/PRFUnmarshaller.java
new file mode 100644
index 000000000..b5079477f
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/PRFUnmarshaller.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+/**
+ * A thread-safe Unmarshaller for {@link org.opensaml.xmlsec.encryption.PRF} objects.
+ */
+public class PRFUnmarshaller extends AlgorithmIdentifierTypeUnmarshaller {
+
+}
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/SaltBuilder.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/SaltBuilder.java
new file mode 100644
index 000000000..fc21c689a
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/SaltBuilder.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+import org.opensaml.core.xml.AbstractXMLObjectBuilder;
+import org.opensaml.xmlsec.encryption.Salt;
+import org.opensaml.xmlsec.encryption.XMLEncryptionBuilder;
+import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
+
+/**
+ * Builder of {@link org.opensaml.xmlsec.encryption.EncryptionMethod}.
+ */
+public class SaltBuilder extends AbstractXMLObjectBuilder<Salt> implements
+        XMLEncryptionBuilder<Salt> {
+
+    /**
+     * Constructor.
+     * 
+     */
+    public SaltBuilder() {
+    }
+
+    /** {@inheritDoc} */
+    public Salt buildObject(final String namespaceURI, final String localName,
+            final String namespacePrefix) {
+        return new SaltImpl(namespaceURI, localName, namespacePrefix);
+    }
+
+    /** {@inheritDoc} */
+    public Salt buildObject() {
+        return buildObject(EncryptionConstants.XMLENC11_NS, Salt.DEFAULT_ELEMENT_LOCAL_NAME,
+                EncryptionConstants.XMLENC11_PREFIX);
+    }
+
+}
\ No newline at end of file
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/SaltImpl.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/SaltImpl.java
new file mode 100644
index 000000000..bfdc7b90d
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/SaltImpl.java
@@ -0,0 +1,93 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.Nullable;
+
+import org.opensaml.core.xml.AbstractXMLObject;
+import org.opensaml.core.xml.XMLObject;
+import org.opensaml.xmlsec.encryption.OtherSource;
+import org.opensaml.xmlsec.encryption.Salt;
+import org.opensaml.xmlsec.encryption.Specified;
+
+/**
+ * Concrete implementation of {@link org.opensaml.xmlsec.encryption.Salt}.
+ */
+public class SaltImpl extends AbstractXMLObject implements Salt {
+    
+    /** Specified child element value. */
+    private Specified specified;
+    
+    /** OtherSource child element value. */
+    private OtherSource otherSource;
+    
+    /**
+     * Constructor.
+     *
+     * @param namespaceURI namespace URI
+     * @param elementLocalName local name
+     * @param namespacePrefix namespace prefix
+     */
+    protected SaltImpl(final String namespaceURI, final String elementLocalName,
+            final String namespacePrefix) {
+        super(namespaceURI, elementLocalName, namespacePrefix);
+    }
+
+    /** {@inheritDoc} */
+    @Nullable public Specified getSpecified() {
+        return specified;
+    }
+
+    /** {@inheritDoc} */
+    public void setSpecified(@Nullable final Specified newSpecified) {
+        specified = prepareForAssignment(specified, newSpecified);
+    }
+
+    /** {@inheritDoc} */
+    @Nullable public OtherSource getOtherSource() {
+        return otherSource;
+    }
+
+    /** {@inheritDoc} */
+    public void setOtherSource(@Nullable final OtherSource newOtherSource) {
+        otherSource = prepareForAssignment(otherSource, newOtherSource);
+    }
+
+    /** {@inheritDoc} */
+    public List<XMLObject> getOrderedChildren() {
+        final ArrayList<XMLObject> children = new ArrayList<>();
+        
+        if (specified != null) {
+            children.add(specified);
+        }
+        if (otherSource != null) {
+            children.add(otherSource);
+        }
+        
+        if (children.size() == 0) {
+            return null;
+        }
+        
+        return Collections.unmodifiableList(children);
+    }
+
+}
\ No newline at end of file
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/SaltMarshaller.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/SaltMarshaller.java
new file mode 100644
index 000000000..2776a6a66
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/SaltMarshaller.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+/**
+ * A thread-safe Marshaller for {@link org.opensaml.xmlsec.encryption.Salt} objects.
+ */
+public class SaltMarshaller extends AbstractXMLEncryptionMarshaller {
+
+}
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/SaltUnmarshaller.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/SaltUnmarshaller.java
new file mode 100644
index 000000000..7dcddb606
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/SaltUnmarshaller.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+import org.opensaml.core.xml.XMLObject;
+import org.opensaml.core.xml.io.UnmarshallingException;
+import org.opensaml.xmlsec.encryption.OtherSource;
+import org.opensaml.xmlsec.encryption.Salt;
+import org.opensaml.xmlsec.encryption.Specified;
+
+/**
+ * A thread-safe Unmarshaller for {@link org.opensaml.xmlsec.encryption.Salt} objects.
+ */
+public class SaltUnmarshaller extends AbstractXMLEncryptionUnmarshaller {
+
+    /** {@inheritDoc} */
+    protected void processChildElement(final XMLObject parentXMLObject, final XMLObject childXMLObject)
+            throws UnmarshallingException {
+        
+        final Salt salt = (Salt) parentXMLObject;
+        
+        if (childXMLObject instanceof Specified) {
+            salt.setSpecified((Specified) childXMLObject);
+        } else if (childXMLObject instanceof OtherSource) {
+            salt.setOtherSource((OtherSource) childXMLObject);
+        } else {
+            super.processChildElement(parentXMLObject, childXMLObject);
+        }
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/SpecifiedBuilder.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/SpecifiedBuilder.java
new file mode 100644
index 000000000..6ee4d86b9
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/SpecifiedBuilder.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+import org.opensaml.core.xml.AbstractXMLObjectBuilder;
+import org.opensaml.xmlsec.encryption.Specified;
+import org.opensaml.xmlsec.encryption.XMLEncryptionBuilder;
+import org.opensaml.xmlsec.encryption.support.EncryptionConstants;
+
+/**
+ * Builder of {@link org.opensaml.xmlsec.encryption.Specified}.
+ */
+public class SpecifiedBuilder
+    extends AbstractXMLObjectBuilder<Specified> implements XMLEncryptionBuilder<Specified> {
+
+    /**
+     * Constructor.
+     */
+    public SpecifiedBuilder() {
+    }
+
+    /** {@inheritDoc} */
+    public Specified buildObject(final String namespaceURI, final String localName, final String namespacePrefix) {
+        return new SpecifiedImpl(namespaceURI, localName, namespacePrefix);
+    }
+
+    /** {@inheritDoc} */
+    public Specified buildObject() {
+        return buildObject(EncryptionConstants.XMLENC11_NS, Specified.DEFAULT_ELEMENT_LOCAL_NAME,
+                EncryptionConstants.XMLENC11_PREFIX);
+    }
+
+}
\ No newline at end of file
diff --git a/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/SpecifiedImpl.java b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/SpecifiedImpl.java
new file mode 100644
index 000000000..7ec18053c
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/main/java/org/opensaml/xmlsec/encryption/impl/SpecifiedImpl.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+import org.opensaml.core.xml.schema.impl.XSBase64BinaryImpl;
+import org.opensaml.xmlsec.encryption.Specified;
+
+/**
+ * Concrete implementation of {@link org.opensaml.xmlsec.encryption.Specified}.
+ */
+public class SpecifiedImpl extends XSBase64BinaryImpl implements Specified {
+
+    /**
+     * Constructor.
+     *
+     * @param namespaceURI namespace URI
+     * @param elementLocalName local name
+     * @param namespacePrefix namespace prefix
+     */
+    protected SpecifiedImpl(final String namespaceURI, final String elementLocalName, final String namespacePrefix) {
+        super(namespaceURI, elementLocalName, namespacePrefix);
+    }
+
+}
\ No newline at end of file
diff --git a/opensaml-xmlsec-impl/src/main/resources/encryption-config.xml b/opensaml-xmlsec-impl/src/main/resources/encryption-config.xml
index 9ded3a142..05adde279 100644
--- a/opensaml-xmlsec-impl/src/main/resources/encryption-config.xml
+++ b/opensaml-xmlsec-impl/src/main/resources/encryption-config.xml
@@ -187,12 +187,97 @@
         
         <!-- 1.1 stuff -->
         
+        <!-- DerivedKey -->
+        <ObjectProvider qualifiedName="xenc11:DerivedKey">
+            <BuilderClass className="org.opensaml.xmlsec.encryption.impl.DerivedKeyBuilder"/>
+            <MarshallingClass className="org.opensaml.xmlsec.encryption.impl.DerivedKeyMarshaller"/>
+            <UnmarshallingClass className="org.opensaml.xmlsec.encryption.impl.DerivedKeyUnmarshaller"/>
+        </ObjectProvider>
+        
+        <!-- DerivedKeyName -->
+        <ObjectProvider qualifiedName="xenc11:DerivedKeyName">
+            <BuilderClass className="org.opensaml.xmlsec.encryption.impl.DerivedKeyNameBuilder"/>
+            <MarshallingClass className="org.opensaml.core.xml.schema.impl.XSStringMarshaller"/>
+            <UnmarshallingClass className="org.opensaml.core.xml.schema.impl.XSStringUnmarshaller"/>
+        </ObjectProvider>
+        
+        <!-- ConcatKDFParams -->
+        <ObjectProvider qualifiedName="xenc11:ConcatKDFParams">
+            <BuilderClass className="org.opensaml.xmlsec.encryption.impl.ConcatKDFParamsBuilder"/>
+            <MarshallingClass className="org.opensaml.xmlsec.encryption.impl.ConcatKDFParamsMarshaller"/>
+            <UnmarshallingClass className="org.opensaml.xmlsec.encryption.impl.ConcatKDFParamsUnmarshaller"/>
+        </ObjectProvider>
+ 
+        <!-- IterationCount -->
+        <ObjectProvider qualifiedName="xenc11:IterationCount">
+            <BuilderClass className="org.opensaml.xmlsec.encryption.impl.IterationCountBuilder"/>
+            <MarshallingClass className="org.opensaml.core.xml.schema.impl.XSIntegerMarshaller"/>
+            <UnmarshallingClass className="org.opensaml.core.xml.schema.impl.XSIntegerUnmarshaller"/>
+        </ObjectProvider>
+        
+        <!-- IterationCount -->
+        <ObjectProvider qualifiedName="xenc11:KeyLength">
+            <BuilderClass className="org.opensaml.xmlsec.encryption.impl.KeyLengthBuilder"/>
+            <MarshallingClass className="org.opensaml.core.xml.schema.impl.XSIntegerMarshaller"/>
+            <UnmarshallingClass className="org.opensaml.core.xml.schema.impl.XSIntegerUnmarshaller"/>
+        </ObjectProvider>
+        
+        <!-- KeyDerivationMethod  -->
+        <ObjectProvider qualifiedName="xenc11:KeyDerivationMethod">
+            <BuilderClass className="org.opensaml.xmlsec.encryption.impl.KeyDerivationMethodBuilder"/>
+            <MarshallingClass className="org.opensaml.xmlsec.encryption.impl.KeyDerivationMethodMarshaller"/>
+            <UnmarshallingClass className="org.opensaml.xmlsec.encryption.impl.KeyDerivationMethodUnmarshaller"/>
+        </ObjectProvider>
+        
         <!-- MGF -->
         <ObjectProvider qualifiedName="xenc11:MGF">
             <BuilderClass className="org.opensaml.xmlsec.encryption.impl.MGFBuilder"/>
             <MarshallingClass className="org.opensaml.xmlsec.encryption.impl.MGFMarshaller"/>
             <UnmarshallingClass className="org.opensaml.xmlsec.encryption.impl.MGFUnmarshaller"/>
         </ObjectProvider>
+        
+        <!-- MasterKeyName -->
+        <ObjectProvider qualifiedName="xenc11:MasterKeyName">
+            <BuilderClass className="org.opensaml.xmlsec.encryption.impl.MasterKeyNameBuilder"/>
+            <MarshallingClass className="org.opensaml.core.xml.schema.impl.XSStringMarshaller"/>
+            <UnmarshallingClass className="org.opensaml.core.xml.schema.impl.XSStringUnmarshaller"/>
+        </ObjectProvider>
+        
+        <!-- OtherSource -->
+        <ObjectProvider qualifiedName="xenc11:OtherSource">
+            <BuilderClass className="org.opensaml.xmlsec.encryption.impl.OtherSourceBuilder"/>
+            <MarshallingClass className="org.opensaml.xmlsec.encryption.impl.OtherSourceMarshaller"/>
+            <UnmarshallingClass className="org.opensaml.xmlsec.encryption.impl.OtherSourceUnmarshaller"/>
+        </ObjectProvider>
+        
+        <!-- PBKDF2-params-->
+        <ObjectProvider qualifiedName="xenc11:PBKDF2-params">
+            <BuilderClass className="org.opensaml.xmlsec.encryption.impl.PBKDF2ParamsBuilder"/>
+            <MarshallingClass className="org.opensaml.xmlsec.encryption.impl.PBKDF2ParamsMarshaller"/>
+            <UnmarshallingClass className="org.opensaml.xmlsec.encryption.impl.PBKDF2ParamsUnmarshaller"/>
+        </ObjectProvider>
+        
+        <!-- PRF -->
+        <ObjectProvider qualifiedName="xenc11:PRF">
+            <BuilderClass className="org.opensaml.xmlsec.encryption.impl.PRFBuilder"/>
+            <MarshallingClass className="org.opensaml.xmlsec.encryption.impl.PRFMarshaller"/>
+            <UnmarshallingClass className="org.opensaml.xmlsec.encryption.impl.PRFUnmarshaller"/>
+        </ObjectProvider>
+        
+        <!-- Salt -->
+        <ObjectProvider qualifiedName="xenc11:Salt">
+            <BuilderClass className="org.opensaml.xmlsec.encryption.impl.SaltBuilder"/>
+            <MarshallingClass className="org.opensaml.xmlsec.encryption.impl.SaltMarshaller"/>
+            <UnmarshallingClass className="org.opensaml.xmlsec.encryption.impl.SaltUnmarshaller"/>
+        </ObjectProvider>
+        
+        <!-- Specified -->
+        <ObjectProvider qualifiedName="xenc11:Specified">
+            <BuilderClass className="org.opensaml.xmlsec.encryption.impl.SpecifiedBuilder"/>
+            <MarshallingClass className="org.opensaml.core.xml.schema.impl.XSBase64BinaryMarshaller"/>
+            <UnmarshallingClass className="org.opensaml.core.xml.schema.impl.XSBase64BinaryUnmarshaller"/>
+        </ObjectProvider>
+        
  
     </ObjectProviders>
 
diff --git a/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/ConcatKDFParamsTest.java b/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/ConcatKDFParamsTest.java
new file mode 100644
index 000000000..d56fee9b3
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/ConcatKDFParamsTest.java
@@ -0,0 +1,217 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+
+import org.opensaml.core.testing.XMLObjectProviderBaseTestCase;
+import org.opensaml.core.xml.XMLRuntimeException;
+import org.opensaml.xmlsec.encryption.ConcatKDFParams;
+import org.opensaml.xmlsec.signature.DigestMethod;
+import org.testng.Assert;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+/**
+ *
+ */
+public class ConcatKDFParamsTest extends XMLObjectProviderBaseTestCase {
+    
+    private String expectedDigestMethod;
+    private String expectedAlgorithmID;
+    private String expectedPartyUInfo;
+    private String expectedPartyVInfo;
+    private String expectedSuppPubInfo;
+    private String expectedSuppPrivInfo;
+    
+    /**
+     * Constructor
+     *
+     */
+    public ConcatKDFParamsTest() {
+        singleElementFile = "/org/opensaml/xmlsec/encryption/impl/ConcatKDFParams.xml";
+        childElementsFile = "/org/opensaml/xmlsec/encryption/impl/ConcatKDFParamsChildElements.xml";
+    }
+
+    @BeforeMethod
+    protected void setUp() throws Exception {
+        expectedDigestMethod = "urn:string:foo";
+        expectedAlgorithmID = "00AA";
+        expectedPartyUInfo = "00BB";
+        expectedPartyVInfo = "00CC";
+        expectedSuppPubInfo = "00DD";
+        expectedSuppPrivInfo = "00EE";
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testSingleElementUnmarshall() {
+        ConcatKDFParams params = (ConcatKDFParams) unmarshallElement(singleElementFile);
+        
+        Assert.assertNotNull(params);
+        Assert.assertEquals(params.getAlgorithmID(), expectedAlgorithmID);
+        Assert.assertEquals(params.getPartyVInfo(), expectedPartyVInfo);
+        Assert.assertEquals(params.getPartyUInfo(), expectedPartyUInfo);
+        Assert.assertEquals(params.getSuppPubInfo(), expectedSuppPubInfo);
+        Assert.assertEquals(params.getSuppPrivInfo(), expectedSuppPrivInfo);
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testChildElementsUnmarshall() {
+        ConcatKDFParams params = (ConcatKDFParams) unmarshallElement(childElementsFile);
+        
+        Assert.assertNotNull(params);
+        Assert.assertEquals(params.getAlgorithmID(), expectedAlgorithmID);
+        Assert.assertEquals(params.getPartyVInfo(), expectedPartyVInfo);
+        Assert.assertEquals(params.getPartyUInfo(), expectedPartyUInfo);
+        Assert.assertEquals(params.getSuppPubInfo(), expectedSuppPubInfo);
+        Assert.assertEquals(params.getSuppPrivInfo(), expectedSuppPrivInfo);
+        
+        Assert.assertNotNull(params.getDigestMethod());
+        Assert.assertEquals(params.getDigestMethod().getAlgorithm(), expectedDigestMethod);
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testSingleElementMarshall() {
+        ConcatKDFParams params = (ConcatKDFParams) buildXMLObject(ConcatKDFParams.DEFAULT_ELEMENT_NAME);
+        
+        params.setAlgorithmID(expectedAlgorithmID);
+        params.setPartyUInfo(expectedPartyUInfo);
+        params.setPartyVInfo(expectedPartyVInfo);
+        params.setSuppPubInfo(expectedSuppPubInfo);
+        params.setSuppPrivInfo(expectedSuppPrivInfo);
+        
+        assertXMLEquals(expectedDOM, params);
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testChildElementsMarshall() {
+        ConcatKDFParams params = (ConcatKDFParams) buildXMLObject(ConcatKDFParams.DEFAULT_ELEMENT_NAME);
+        
+        params.setAlgorithmID(expectedAlgorithmID);
+        params.setPartyUInfo(expectedPartyUInfo);
+        params.setPartyVInfo(expectedPartyVInfo);
+        params.setSuppPubInfo(expectedSuppPubInfo);
+        params.setSuppPrivInfo(expectedSuppPrivInfo);
+        
+        DigestMethod dm = buildXMLObject(DigestMethod.DEFAULT_ELEMENT_NAME);
+        dm.setAlgorithm(expectedDigestMethod);
+        params.setDigestMethod(dm);
+        
+        assertXMLEquals(expectedChildElementsDOM, params);
+    }
+    
+    @Test
+    public void testStringBytesConversions() {
+        ConcatKDFParams params = null;
+        
+        // AlgorithmID
+        params = buildXMLObject(ConcatKDFParams.DEFAULT_ELEMENT_NAME);
+        params.setAlgorithmID(expectedAlgorithmID);
+        Assert.assertEquals(params.getAlgorithmIDBytes(), new byte[] {0x0, (byte) 0xAA});
+        params.setAlgorithmID(null);
+        Assert.assertNull(params.getAlgorithmIDBytes());
+        params.setAlgorithmIDBytes(new byte[] {0x0, (byte) 0xAA});
+        Assert.assertEquals(params.getAlgorithmID(), expectedAlgorithmID);
+        params.setAlgorithmIDBytes(null);
+        Assert.assertNull(params.getAlgorithmID());
+        try {
+            params.setAlgorithmID("FOO");
+            params.getAlgorithmIDBytes();
+            Assert.fail("Invalid hexBinary value, auto-decoding should have failed");
+        } catch (XMLRuntimeException e) {
+            // expected, do nothing
+        }
+        
+        // PartyUInfo
+        params = buildXMLObject(ConcatKDFParams.DEFAULT_ELEMENT_NAME);
+        params.setPartyUInfo(expectedPartyUInfo);
+        Assert.assertEquals(params.getPartyUInfoBytes(), new byte[] {0x0, (byte) 0xBB});
+        params.setPartyUInfo(null);
+        Assert.assertNull(params.getPartyUInfoBytes());
+        params.setPartyUInfoBytes(new byte[] {0x0, (byte) 0xBB});
+        Assert.assertEquals(params.getPartyUInfo(), expectedPartyUInfo);
+        params.setPartyUInfoBytes(null);
+        Assert.assertNull(params.getPartyUInfo());
+        try {
+            params.setPartyUInfo("FOO");
+            params.getPartyUInfoBytes();
+            Assert.fail("Invalid hexBinary value, auto-decoding should have failed");
+        } catch (XMLRuntimeException e) {
+            // expected, do nothing
+        }
+        
+        // PartyVInfo
+        params = buildXMLObject(ConcatKDFParams.DEFAULT_ELEMENT_NAME);
+        params.setPartyVInfo(expectedPartyVInfo);
+        Assert.assertEquals(params.getPartyVInfoBytes(), new byte[] {0x0, (byte) 0xCC});
+        params.setPartyVInfo(null);
+        Assert.assertNull(params.getPartyVInfoBytes());
+        params.setPartyVInfoBytes(new byte[] {0x0, (byte) 0xCC});
+        Assert.assertEquals(params.getPartyVInfo(), expectedPartyVInfo);
+        params.setPartyVInfoBytes(null);
+        Assert.assertNull(params.getPartyVInfo());
+        try {
+            params.setPartyVInfo("FOO");
+            params.getPartyVInfoBytes();
+            Assert.fail("Invalid hexBinary value, auto-decoding should have failed");
+        } catch (XMLRuntimeException e) {
+            // expected, do nothing
+        }
+        
+        // SuppPubInfo
+        params = buildXMLObject(ConcatKDFParams.DEFAULT_ELEMENT_NAME);
+        params.setSuppPubInfo(expectedSuppPubInfo);
+        Assert.assertEquals(params.getSuppPubInfoBytes(), new byte[] {0x0, (byte) 0xDD});
+        params.setSuppPubInfo(null);
+        Assert.assertNull(params.getSuppPubInfoBytes());
+        params.setSuppPubInfoBytes(new byte[] {0x0, (byte) 0xDD});
+        Assert.assertEquals(params.getSuppPubInfo(), expectedSuppPubInfo);
+        params.setSuppPubInfoBytes(null);
+        Assert.assertNull(params.getSuppPubInfo());
+        try {
+            params.setSuppPubInfo("FOO");
+            params.getSuppPubInfoBytes();
+            Assert.fail("Invalid hexBinary value, auto-decoding should have failed");
+        } catch (XMLRuntimeException e) {
+            // expected, do nothing
+        }
+        
+        // SuppPrivInfo
+        params = buildXMLObject(ConcatKDFParams.DEFAULT_ELEMENT_NAME);
+        params.setSuppPrivInfo(expectedSuppPrivInfo);
+        Assert.assertEquals(params.getSuppPrivInfoBytes(), new byte[] {0x0, (byte) 0xEE});
+        params.setSuppPrivInfo(null);
+        Assert.assertNull(params.getSuppPrivInfoBytes());
+        params.setSuppPrivInfoBytes(new byte[] {0x0, (byte) 0xEE});
+        Assert.assertEquals(params.getSuppPrivInfo(), expectedSuppPrivInfo);
+        params.setSuppPrivInfoBytes(null);
+        Assert.assertNull(params.getSuppPrivInfo());
+        try {
+            params.setSuppPrivInfo("FOO");
+            params.getSuppPrivInfoBytes();
+            Assert.fail("Invalid hexBinary value, auto-decoding should have failed");
+        } catch (XMLRuntimeException e) {
+            // expected, do nothing
+        }
+        
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/DerivedKeyNameTest.java b/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/DerivedKeyNameTest.java
new file mode 100644
index 000000000..e9c1dddf7
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/DerivedKeyNameTest.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+
+import org.testng.annotations.Test;
+import org.testng.annotations.BeforeMethod;
+import org.testng.Assert;
+import org.opensaml.core.testing.XMLObjectProviderBaseTestCase;
+import org.opensaml.xmlsec.encryption.DerivedKeyName;
+
+/**
+ *
+ */
+public class DerivedKeyNameTest extends XMLObjectProviderBaseTestCase {
+    
+    private String expectedStringContent;
+
+    /**
+     * Constructor
+     *
+     */
+    public DerivedKeyNameTest() {
+        singleElementFile = "/org/opensaml/xmlsec/encryption/impl/DerivedKeyName.xml";
+        
+    }
+
+    @BeforeMethod
+    protected void setUp() throws Exception {
+        expectedStringContent = "someKeyName";
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testSingleElementUnmarshall() {
+        DerivedKeyName dkn = (DerivedKeyName) unmarshallElement(singleElementFile);
+        
+        Assert.assertNotNull(dkn, "DerivedKeyName");
+        Assert.assertEquals(expectedStringContent, dkn.getValue(), "DerivedKeyName value");
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testSingleElementMarshall() {
+        DerivedKeyName dkn = (DerivedKeyName) buildXMLObject(DerivedKeyName.DEFAULT_ELEMENT_NAME);
+        dkn.setValue(expectedStringContent);
+        
+        assertXMLEquals(expectedDOM, dkn);
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/DerivedKeyTest.java b/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/DerivedKeyTest.java
new file mode 100644
index 000000000..7c76a63fa
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/DerivedKeyTest.java
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+
+import org.opensaml.core.testing.XMLObjectProviderBaseTestCase;
+import org.opensaml.xmlsec.encryption.DerivedKey;
+import org.opensaml.xmlsec.encryption.DerivedKeyName;
+import org.opensaml.xmlsec.encryption.KeyDerivationMethod;
+import org.opensaml.xmlsec.encryption.MasterKeyName;
+import org.opensaml.xmlsec.encryption.ReferenceList;
+import org.testng.Assert;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+/**
+ *
+ */
+public class DerivedKeyTest extends XMLObjectProviderBaseTestCase {
+    
+    private String expectedId;
+    private String expectedRecipient;
+    private String expectedType;
+    
+    /**
+     * Constructor
+     *
+     */
+    public DerivedKeyTest() {
+        singleElementFile = "/org/opensaml/xmlsec/encryption/impl/DerivedKey.xml";
+        singleElementOptionalAttributesFile = "/org/opensaml/xmlsec/encryption/impl/DerivedKeyOptionalAttributes.xml";
+        childElementsFile = "/org/opensaml/xmlsec/encryption/impl/DerivedKeyChildElements.xml";
+    }
+
+    @BeforeMethod
+    protected void setUp() throws Exception {
+        expectedId = "abc123";
+        expectedRecipient = "theRecipient";
+        expectedType = "urn:string:foo";
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testSingleElementUnmarshall() {
+        DerivedKey dk = (DerivedKey) unmarshallElement(singleElementFile);
+        
+        Assert.assertNotNull(dk);
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testChildElementsUnmarshall() {
+        DerivedKey dk = (DerivedKey) unmarshallElement(childElementsFile);
+        
+        Assert.assertNotNull(dk.getKeyDerivationMethod());
+        Assert.assertNotNull(dk.getReferenceList());
+        Assert.assertNotNull(dk.getDerivedKeyName());
+        Assert.assertNotNull(dk.getMasterKeyName());
+        Assert.assertNotNull(dk);
+    }
+    
+    /** {@inheritDoc} */
+    public void testSingleElementOptionalAttributesUnmarshall() {
+        DerivedKey dk = (DerivedKey) unmarshallElement(singleElementOptionalAttributesFile);
+        
+        Assert.assertNotNull(dk);
+        Assert.assertEquals(dk.getId(), expectedId);
+        Assert.assertEquals(dk.getRecipient(), expectedRecipient);
+        Assert.assertEquals(dk.getType(), expectedType);
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testSingleElementMarshall() {
+        DerivedKey dk = (DerivedKey) buildXMLObject(DerivedKey.DEFAULT_ELEMENT_NAME);
+        
+        assertXMLEquals(expectedDOM, dk);
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testChildElementsMarshall() {
+        DerivedKey dk = (DerivedKey) buildXMLObject(DerivedKey.DEFAULT_ELEMENT_NAME);
+        
+        dk.setKeyDerivationMethod(buildXMLObject(KeyDerivationMethod.DEFAULT_ELEMENT_NAME));
+        dk.setReferenceList(buildXMLObject(ReferenceList.DEFAULT_ELEMENT_NAME));
+        dk.setDerivedKeyName(buildXMLObject(DerivedKeyName.DEFAULT_ELEMENT_NAME));
+        dk.setMasterKeyName(buildXMLObject(MasterKeyName.DEFAULT_ELEMENT_NAME));
+        
+        assertXMLEquals(expectedChildElementsDOM, dk);
+    }
+
+    /** {@inheritDoc} */
+    public void testSingleElementOptionalAttributesMarshall() {
+        DerivedKey dk = (DerivedKey) buildXMLObject(DerivedKey.DEFAULT_ELEMENT_NAME);
+        
+        dk.setId(expectedId);
+        dk.setRecipient(expectedRecipient);
+        dk.setType(expectedType);
+        
+        assertXMLEquals(expectedOptionalAttributesDOM, dk);
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/IterationCountTest.java b/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/IterationCountTest.java
new file mode 100644
index 000000000..8cb7af6d0
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/IterationCountTest.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+
+import org.testng.annotations.Test;
+import org.testng.annotations.BeforeMethod;
+import org.testng.Assert;
+import org.opensaml.core.testing.XMLObjectProviderBaseTestCase;
+import org.opensaml.xmlsec.encryption.IterationCount;
+
+/**
+ *
+ */
+public class IterationCountTest extends XMLObjectProviderBaseTestCase {
+    
+    private Integer expectedIntegerContent;
+
+    /**
+     * Constructor
+     *
+     */
+    public IterationCountTest() {
+        singleElementFile = "/org/opensaml/xmlsec/encryption/impl/IterationCount.xml";
+        
+    }
+
+    @BeforeMethod
+    protected void setUp() throws Exception {
+        expectedIntegerContent = 2020;
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testSingleElementUnmarshall() {
+        IterationCount ic = (IterationCount) unmarshallElement(singleElementFile);
+        
+        Assert.assertNotNull(ic, "IterationCount");
+        Assert.assertEquals(expectedIntegerContent, ic.getValue(), "IterationCount value");
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testSingleElementMarshall() {
+        IterationCount ic = (IterationCount) buildXMLObject(IterationCount.DEFAULT_ELEMENT_NAME);
+        ic.setValue(expectedIntegerContent);
+        
+        assertXMLEquals(expectedDOM, ic);
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/KeyDerivationMethodTest.java b/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/KeyDerivationMethodTest.java
new file mode 100644
index 000000000..85e7e1874
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/KeyDerivationMethodTest.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+
+import org.opensaml.core.testing.XMLObjectProviderBaseTestCase;
+import org.opensaml.core.xml.mock.SimpleXMLObject;
+import org.opensaml.xmlsec.encryption.KeyDerivationMethod;
+import org.testng.Assert;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+/**
+ *
+ */
+public class KeyDerivationMethodTest extends XMLObjectProviderBaseTestCase {
+    
+    private String expectedAlgorithm;
+    private int expectedNumUnknownChildren;
+    
+    /**
+     * Constructor
+     *
+     */
+    public KeyDerivationMethodTest() {
+        singleElementFile = "/org/opensaml/xmlsec/encryption/impl/KeyDerivationMethod.xml";
+        childElementsFile = "/org/opensaml/xmlsec/encryption/impl/KeyDerivationMethodChildElements.xml";
+    }
+
+    @BeforeMethod
+    protected void setUp() throws Exception {
+        expectedAlgorithm = "urn:string:foo";
+        expectedNumUnknownChildren = 3;
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testSingleElementUnmarshall() {
+        KeyDerivationMethod kdm = (KeyDerivationMethod) unmarshallElement(singleElementFile);
+        
+        Assert.assertNotNull(kdm, "KeyDerivationMethod");
+        Assert.assertEquals(kdm.getAlgorithm(), expectedAlgorithm, "Algorithm attribute");
+        Assert.assertEquals(kdm.getUnknownXMLObjects().size(), 0, "Unknown children");
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testChildElementsUnmarshall() {
+        KeyDerivationMethod kdm = (KeyDerivationMethod) unmarshallElement(childElementsFile);
+        
+        Assert.assertNotNull(kdm, "KeyDerivationMethod");
+        Assert.assertEquals(kdm.getAlgorithm(), expectedAlgorithm, "Algorithm attribute");
+        Assert.assertEquals(kdm.getUnknownXMLObjects().size(), expectedNumUnknownChildren, "Unknown children");
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testSingleElementMarshall() {
+        KeyDerivationMethod kdm = (KeyDerivationMethod) buildXMLObject(KeyDerivationMethod.DEFAULT_ELEMENT_NAME);
+        
+        kdm.setAlgorithm(expectedAlgorithm);
+        
+        assertXMLEquals(expectedDOM, kdm);
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testChildElementsMarshall() {
+        KeyDerivationMethod kdm = (KeyDerivationMethod) buildXMLObject(KeyDerivationMethod.DEFAULT_ELEMENT_NAME);
+        
+        kdm.setAlgorithm(expectedAlgorithm);
+        kdm.getUnknownXMLObjects().add(buildXMLObject(SimpleXMLObject.ELEMENT_NAME));
+        kdm.getUnknownXMLObjects().add(buildXMLObject(SimpleXMLObject.ELEMENT_NAME));
+        kdm.getUnknownXMLObjects().add(buildXMLObject(SimpleXMLObject.ELEMENT_NAME));
+        
+        assertXMLEquals(expectedChildElementsDOM, kdm);
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/KeyLengthTest.java b/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/KeyLengthTest.java
new file mode 100644
index 000000000..27be76eaf
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/KeyLengthTest.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+
+import org.testng.annotations.Test;
+import org.testng.annotations.BeforeMethod;
+import org.testng.Assert;
+import org.opensaml.core.testing.XMLObjectProviderBaseTestCase;
+import org.opensaml.xmlsec.encryption.KeyLength;
+
+/**
+ *
+ */
+public class KeyLengthTest extends XMLObjectProviderBaseTestCase {
+    
+    private Integer expectedIntegerContent;
+
+    /**
+     * Constructor
+     *
+     */
+    public KeyLengthTest() {
+        singleElementFile = "/org/opensaml/xmlsec/encryption/impl/KeyLength.xml";
+        
+    }
+
+    @BeforeMethod
+    protected void setUp() throws Exception {
+        expectedIntegerContent = 256;
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testSingleElementUnmarshall() {
+        KeyLength kl = (KeyLength) unmarshallElement(singleElementFile);
+        
+        Assert.assertNotNull(kl, "KeyLength");
+        Assert.assertEquals(expectedIntegerContent, kl.getValue(), "KeyLength value");
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testSingleElementMarshall() {
+        KeyLength kl = (KeyLength) buildXMLObject(KeyLength.DEFAULT_ELEMENT_NAME);
+        kl.setValue(expectedIntegerContent);
+        
+        assertXMLEquals(expectedDOM, kl);
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/MasterKeyNameTest.java b/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/MasterKeyNameTest.java
new file mode 100644
index 000000000..96d6843a1
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/MasterKeyNameTest.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+
+import org.testng.annotations.Test;
+import org.testng.annotations.BeforeMethod;
+import org.testng.Assert;
+import org.opensaml.core.testing.XMLObjectProviderBaseTestCase;
+import org.opensaml.xmlsec.encryption.MasterKeyName;
+
+/**
+ *
+ */
+public class MasterKeyNameTest extends XMLObjectProviderBaseTestCase {
+    
+    private String expectedStringContent;
+
+    /**
+     * Constructor
+     *
+     */
+    public MasterKeyNameTest() {
+        singleElementFile = "/org/opensaml/xmlsec/encryption/impl/MasterKeyName.xml";
+        
+    }
+
+    @BeforeMethod
+    protected void setUp() throws Exception {
+        expectedStringContent = "someKeyName";
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testSingleElementUnmarshall() {
+        MasterKeyName mkn = (MasterKeyName) unmarshallElement(singleElementFile);
+        
+        Assert.assertNotNull(mkn, "MasterKeyName");
+        Assert.assertEquals(expectedStringContent, mkn.getValue(), "MasterKeyName value");
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testSingleElementMarshall() {
+        MasterKeyName mkn = (MasterKeyName) buildXMLObject(MasterKeyName.DEFAULT_ELEMENT_NAME);
+        mkn.setValue(expectedStringContent);
+        
+        assertXMLEquals(expectedDOM, mkn);
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/OtherSourceTest.java b/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/OtherSourceTest.java
new file mode 100644
index 000000000..5a80fafe8
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/OtherSourceTest.java
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+
+import org.opensaml.core.testing.XMLObjectProviderBaseTestCase;
+import org.opensaml.core.xml.XMLObjectBuilder;
+import org.opensaml.core.xml.schema.XSAny;
+import org.opensaml.xmlsec.encryption.OtherSource;
+import org.opensaml.xmlsec.encryption.Parameters;
+import org.testng.Assert;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+/**
+ *
+ */
+public class OtherSourceTest extends XMLObjectProviderBaseTestCase {
+    
+    private String expectedAlgorithm;
+    
+    private String expectedParametersContent;
+    
+    /**
+     * Constructor
+     *
+     */
+    public OtherSourceTest() {
+        singleElementFile = "/org/opensaml/xmlsec/encryption/impl/OtherSource.xml";
+        childElementsFile = "/org/opensaml/xmlsec/encryption/impl/OtherSourceChildElements.xml";
+    }
+
+    @BeforeMethod
+    protected void setUp() throws Exception {
+        expectedAlgorithm = "urn:string:foo";
+        expectedParametersContent = "MyParams";
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testSingleElementUnmarshall() {
+        OtherSource otherSource = (OtherSource) unmarshallElement(singleElementFile);
+        
+        Assert.assertNotNull(otherSource, "OtherSource");
+        Assert.assertEquals(otherSource.getAlgorithm(), expectedAlgorithm, "Algorithm attribute");
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testChildElementsUnmarshall() {
+        OtherSource otherSource = (OtherSource) unmarshallElement(childElementsFile);
+        
+        Assert.assertNotNull(otherSource, "OtherSource");
+        Assert.assertEquals(otherSource.getAlgorithm(), expectedAlgorithm, "Algorithm attribute");
+        Assert.assertNotNull(otherSource.getParameters(), "Parameters child element");
+        System.out.println("Parameters: " + otherSource.getParameters().getClass().getName());
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testSingleElementMarshall() {
+        OtherSource otherSource = (OtherSource) buildXMLObject(OtherSource.DEFAULT_ELEMENT_NAME);
+        
+        otherSource.setAlgorithm(expectedAlgorithm);
+        
+        assertXMLEquals(expectedDOM, otherSource);
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testChildElementsMarshall() {
+        OtherSource otherSource = (OtherSource) buildXMLObject(OtherSource.DEFAULT_ELEMENT_NAME);
+        
+        otherSource.setAlgorithm(expectedAlgorithm);
+        
+        XMLObjectBuilder<XSAny> xsAnyBuilder = builderFactory.getBuilderOrThrow(XSAny.TYPE_NAME);
+        XSAny parameters = xsAnyBuilder.buildObject(Parameters.DEFAULT_ELEMENT_NAME);
+        parameters.setTextContent(expectedParametersContent);
+        otherSource.setParameters(parameters);
+        
+        assertXMLEquals(expectedChildElementsDOM, otherSource);
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/PBKDF2ParamsTest.java b/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/PBKDF2ParamsTest.java
new file mode 100644
index 000000000..3d6270bbb
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/PBKDF2ParamsTest.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+
+import org.opensaml.core.testing.XMLObjectProviderBaseTestCase;
+import org.opensaml.xmlsec.encryption.IterationCount;
+import org.opensaml.xmlsec.encryption.KeyLength;
+import org.opensaml.xmlsec.encryption.PBKDF2Params;
+import org.opensaml.xmlsec.encryption.PRF;
+import org.opensaml.xmlsec.encryption.Salt;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+/**
+ *
+ */
+public class PBKDF2ParamsTest extends XMLObjectProviderBaseTestCase {
+    
+    /**
+     * Constructor
+     *
+     */
+    public PBKDF2ParamsTest() {
+        singleElementFile = "/org/opensaml/xmlsec/encryption/impl/PBKDF2Params.xml";
+        childElementsFile = "/org/opensaml/xmlsec/encryption/impl/PBKDF2ParamsChildElements.xml";
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testSingleElementUnmarshall() {
+        PBKDF2Params params = (PBKDF2Params) unmarshallElement(singleElementFile);
+        
+        Assert.assertNotNull(params, "PBKDF2Params");
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testChildElementsUnmarshall() {
+        PBKDF2Params params = (PBKDF2Params) unmarshallElement(childElementsFile);
+        
+        Assert.assertNotNull(params, "PBKDF2Params");
+        Assert.assertNotNull(params.getSalt());
+        Assert.assertNotNull(params.getIterationCount());
+        Assert.assertNotNull(params.getKeyLength());
+        Assert.assertNotNull(params.getPRF());
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testSingleElementMarshall() {
+        PBKDF2Params params = (PBKDF2Params) buildXMLObject(PBKDF2Params.DEFAULT_ELEMENT_NAME);
+        
+        assertXMLEquals(expectedDOM, params);
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testChildElementsMarshall() {
+        PBKDF2Params params = (PBKDF2Params) buildXMLObject(PBKDF2Params.DEFAULT_ELEMENT_NAME);
+        
+        params.setSalt(buildXMLObject(Salt.DEFAULT_ELEMENT_NAME));
+        params.setIterationCount(buildXMLObject(IterationCount.DEFAULT_ELEMENT_NAME));
+        params.setKeyLength(buildXMLObject(KeyLength.DEFAULT_ELEMENT_NAME));
+        params.setPRF(buildXMLObject(PRF.DEFAULT_ELEMENT_NAME));
+        
+        assertXMLEquals(expectedChildElementsDOM, params);
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/PRFTest.java b/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/PRFTest.java
new file mode 100644
index 000000000..81f011a6b
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/PRFTest.java
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+
+import org.opensaml.core.testing.XMLObjectProviderBaseTestCase;
+import org.opensaml.core.xml.XMLObjectBuilder;
+import org.opensaml.core.xml.schema.XSAny;
+import org.opensaml.xmlsec.encryption.PRF;
+import org.opensaml.xmlsec.encryption.Parameters;
+import org.testng.Assert;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+/**
+ *
+ */
+public class PRFTest extends XMLObjectProviderBaseTestCase {
+    
+    private String expectedAlgorithm;
+    
+    private String expectedParametersContent;
+    
+    /**
+     * Constructor
+     *
+     */
+    public PRFTest() {
+        singleElementFile = "/org/opensaml/xmlsec/encryption/impl/PRF.xml";
+        childElementsFile = "/org/opensaml/xmlsec/encryption/impl/PRFChildElements.xml";
+    }
+
+    @BeforeMethod
+    protected void setUp() throws Exception {
+        expectedAlgorithm = "urn:string:foo";
+        expectedParametersContent = "MyParams";
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testSingleElementUnmarshall() {
+        PRF prf = (PRF) unmarshallElement(singleElementFile);
+        
+        Assert.assertNotNull(prf, "PRF");
+        Assert.assertEquals(prf.getAlgorithm(), expectedAlgorithm, "Algorithm attribute");
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testChildElementsUnmarshall() {
+        PRF prf = (PRF) unmarshallElement(childElementsFile);
+        
+        Assert.assertNotNull(prf, "PRF");
+        Assert.assertEquals(prf.getAlgorithm(), expectedAlgorithm, "Algorithm attribute");
+        Assert.assertNotNull(prf.getParameters(), "Parameters child element");
+        System.out.println("Parameters: " + prf.getParameters().getClass().getName());
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testSingleElementMarshall() {
+        PRF prf = (PRF) buildXMLObject(PRF.DEFAULT_ELEMENT_NAME);
+        
+        prf.setAlgorithm(expectedAlgorithm);
+        
+        assertXMLEquals(expectedDOM, prf);
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testChildElementsMarshall() {
+        PRF prf = (PRF) buildXMLObject(PRF.DEFAULT_ELEMENT_NAME);
+        
+        prf.setAlgorithm(expectedAlgorithm);
+        
+        XMLObjectBuilder<XSAny> xsAnyBuilder = builderFactory.getBuilderOrThrow(XSAny.TYPE_NAME);
+        XSAny parameters = xsAnyBuilder.buildObject(Parameters.DEFAULT_ELEMENT_NAME);
+        parameters.setTextContent(expectedParametersContent);
+        prf.setParameters(parameters);
+        
+        assertXMLEquals(expectedChildElementsDOM, prf);
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/SaltTest.java b/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/SaltTest.java
new file mode 100644
index 000000000..6e52755f1
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/SaltTest.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+
+import org.opensaml.core.testing.XMLObjectProviderBaseTestCase;
+import org.opensaml.xmlsec.encryption.OtherSource;
+import org.opensaml.xmlsec.encryption.Salt;
+import org.opensaml.xmlsec.encryption.Specified;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+/**
+ *
+ */
+public class SaltTest extends XMLObjectProviderBaseTestCase {
+    
+    /**
+     * Constructor
+     *
+     */
+    public SaltTest() {
+        singleElementFile = "/org/opensaml/xmlsec/encryption/impl/Salt.xml";
+        childElementsFile = "/org/opensaml/xmlsec/encryption/impl/SaltChildElements.xml";
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testSingleElementUnmarshall() {
+        Salt salt = (Salt) unmarshallElement(singleElementFile);
+        
+        Assert.assertNotNull(salt, "Salt");
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testChildElementsUnmarshall() {
+        Salt salt = (Salt) unmarshallElement(childElementsFile);
+        
+        Assert.assertNotNull(salt, "Salt");
+        Assert.assertNotNull(salt.getSpecified());
+        Assert.assertNotNull(salt.getOtherSource());
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testSingleElementMarshall() {
+        Salt salt = (Salt) buildXMLObject(Salt.DEFAULT_ELEMENT_NAME);
+        
+        assertXMLEquals(expectedDOM, salt);
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testChildElementsMarshall() {
+        Salt salt = (Salt) buildXMLObject(Salt.DEFAULT_ELEMENT_NAME);
+        
+        salt.setSpecified(buildXMLObject(Specified.DEFAULT_ELEMENT_NAME));
+        salt.setOtherSource(buildXMLObject(OtherSource.DEFAULT_ELEMENT_NAME));
+        
+        assertXMLEquals(expectedChildElementsDOM, salt);
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/SpecifiedTest.java b/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/SpecifiedTest.java
new file mode 100644
index 000000000..98648c191
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/test/java/org/opensaml/xmlsec/encryption/impl/SpecifiedTest.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the University Corporation for Advanced Internet Development,
+ * Inc. (UCAID) under one or more contributor license agreements.  See the
+ * NOTICE file distributed with this work for additional information regarding
+ * copyright ownership. The UCAID licenses this file to You under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file except in
+ * compliance with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.opensaml.xmlsec.encryption.impl;
+
+
+import org.testng.annotations.Test;
+import org.testng.annotations.BeforeMethod;
+import org.testng.Assert;
+import org.opensaml.core.testing.XMLObjectProviderBaseTestCase;
+import org.opensaml.xmlsec.encryption.Specified;
+
+/**
+ *
+ */
+public class SpecifiedTest extends XMLObjectProviderBaseTestCase {
+    
+    private String expectedStringContent;
+
+    /**
+     * Constructor
+     *
+     */
+    public SpecifiedTest() {
+        singleElementFile = "/org/opensaml/xmlsec/encryption/impl/Specified.xml";
+        
+    }
+
+    @BeforeMethod
+    protected void setUp() throws Exception {
+        expectedStringContent = "someBase64==";
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testSingleElementUnmarshall() {
+        Specified specified = (Specified) unmarshallElement(singleElementFile);
+        
+        Assert.assertNotNull(specified, "Specified");
+        Assert.assertEquals(expectedStringContent, specified.getValue(), "Specified value");
+    }
+
+    /** {@inheritDoc} */
+    @Test
+    public void testSingleElementMarshall() {
+        Specified specified = (Specified) buildXMLObject(Specified.DEFAULT_ELEMENT_NAME);
+        specified.setValue(expectedStringContent);
+        
+        assertXMLEquals(expectedDOM, specified);
+    }
+
+}
diff --git a/opensaml-xmlsec-impl/src/test/resources/logback-test.xml b/opensaml-xmlsec-impl/src/test/resources/logback-test.xml
index 188709e07..3de039be6 100644
--- a/opensaml-xmlsec-impl/src/test/resources/logback-test.xml
+++ b/opensaml-xmlsec-impl/src/test/resources/logback-test.xml
@@ -14,6 +14,11 @@
     <logger name="org.apache.xml.security.encryption.XMLCipherUtil">
         <level value="TRACE"/>
     </logger>
+    
+    <logger name="org.opensaml.core.testing">
+        <level value="TRACE"/>
+    </logger>
+    
     <logger name="org.opensaml.xmlsec.encryption.support">
         <level value="TRACE"/>
     </logger>
diff --git a/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/ConcatKDFParams.xml b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/ConcatKDFParams.xml
new file mode 100644
index 000000000..fac2bbdec
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/ConcatKDFParams.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xenc11:ConcatKDFParams xmlns:xenc11="http://www.w3.org/2009/xmlenc11#"
+    AlgorithmID="00AA"
+    PartyUInfo="00BB"
+    PartyVInfo="00CC"
+    SuppPubInfo="00DD"
+    SuppPrivInfo="00EE" />
diff --git a/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/ConcatKDFParamsChildElements.xml b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/ConcatKDFParamsChildElements.xml
new file mode 100644
index 000000000..fd9ad9caf
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/ConcatKDFParamsChildElements.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xenc11:ConcatKDFParams xmlns:xenc11="http://www.w3.org/2009/xmlenc11#"
+    AlgorithmID="00AA"
+    PartyUInfo="00BB"
+    PartyVInfo="00CC"
+    SuppPubInfo="00DD"
+    SuppPrivInfo="00EE" >
+    
+    <ds:DigestMethod xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Algorithm="urn:string:foo"/>
+    
+</xenc11:ConcatKDFParams>
diff --git a/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/DerivedKey.xml b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/DerivedKey.xml
new file mode 100644
index 000000000..bac716d68
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/DerivedKey.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xenc11:DerivedKey xmlns:xenc11="http://www.w3.org/2009/xmlenc11#">
+    
+</xenc11:DerivedKey>
diff --git a/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/DerivedKeyChildElements.xml b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/DerivedKeyChildElements.xml
new file mode 100644
index 000000000..fac89f4ae
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/DerivedKeyChildElements.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xenc11:DerivedKey xmlns:xenc11="http://www.w3.org/2009/xmlenc11#">
+    
+    <xenc11:KeyDerivationMethod></xenc11:KeyDerivationMethod>
+    
+    <xenc:ReferenceList xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" ></xenc:ReferenceList>
+    
+    <xenc11:DerivedKeyName></xenc11:DerivedKeyName>
+    
+    <xenc11:MasterKeyName></xenc11:MasterKeyName>
+    
+</xenc11:DerivedKey>
diff --git a/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/DerivedKeyName.xml b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/DerivedKeyName.xml
new file mode 100644
index 000000000..0f375b845
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/DerivedKeyName.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xenc11:DerivedKeyName xmlns:xenc11="http://www.w3.org/2009/xmlenc11#">someKeyName</xenc11:DerivedKeyName>
diff --git a/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/DerivedKeyOptionalAttributes.xml b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/DerivedKeyOptionalAttributes.xml
new file mode 100644
index 000000000..a12180ee4
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/DerivedKeyOptionalAttributes.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xenc11:DerivedKey xmlns:xenc11="http://www.w3.org/2009/xmlenc11#" Id="abc123" Recipient="theRecipient" Type="urn:string:foo">
+    
+</xenc11:DerivedKey>
diff --git a/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/IterationCount.xml b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/IterationCount.xml
new file mode 100644
index 000000000..efeed2875
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/IterationCount.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xenc11:IterationCount xmlns:xenc11="http://www.w3.org/2009/xmlenc11#">2020</xenc11:IterationCount>
diff --git a/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/KeyDerivationMethod.xml b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/KeyDerivationMethod.xml
new file mode 100644
index 000000000..ef61ec91f
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/KeyDerivationMethod.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xenc11:KeyDerivationMethod xmlns:xenc11="http://www.w3.org/2009/xmlenc11#" Algorithm="urn:string:foo">
+    
+</xenc11:KeyDerivationMethod>
diff --git a/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/KeyDerivationMethodChildElements.xml b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/KeyDerivationMethodChildElements.xml
new file mode 100644
index 000000000..791149389
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/KeyDerivationMethodChildElements.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xenc11:KeyDerivationMethod xmlns:xenc11="http://www.w3.org/2009/xmlenc11#" Algorithm="urn:string:foo">
+    <test:SimpleElement xmlns:test="http://www.example.org/testObjects"/>
+    <test:SimpleElement xmlns:test="http://www.example.org/testObjects"/>
+    <test:SimpleElement xmlns:test="http://www.example.org/testObjects"/>
+</xenc11:KeyDerivationMethod>
diff --git a/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/KeyLength.xml b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/KeyLength.xml
new file mode 100644
index 000000000..794a7cb6b
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/KeyLength.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xenc11:KeyLength xmlns:xenc11="http://www.w3.org/2009/xmlenc11#">256</xenc11:KeyLength>
diff --git a/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/MasterKeyName.xml b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/MasterKeyName.xml
new file mode 100644
index 000000000..ec47e9e3e
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/MasterKeyName.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xenc11:MasterKeyName xmlns:xenc11="http://www.w3.org/2009/xmlenc11#">someKeyName</xenc11:MasterKeyName>
diff --git a/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/OtherSource.xml b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/OtherSource.xml
new file mode 100644
index 000000000..177b6a87e
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/OtherSource.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xenc11:OtherSource xmlns:xenc11="http://www.w3.org/2009/xmlenc11#" Algorithm="urn:string:foo"/>
diff --git a/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/OtherSourceChildElements.xml b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/OtherSourceChildElements.xml
new file mode 100644
index 000000000..c9a2b1ff1
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/OtherSourceChildElements.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xenc11:OtherSource xmlns:xenc11="http://www.w3.org/2009/xmlenc11#" Algorithm="urn:string:foo">
+    <xenc11:Parameters>MyParams</xenc11:Parameters>
+</xenc11:OtherSource>
diff --git a/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/PBKDF2Params.xml b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/PBKDF2Params.xml
new file mode 100644
index 000000000..3c444b5ec
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/PBKDF2Params.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xenc11:PBKDF2-params xmlns:xenc11="http://www.w3.org/2009/xmlenc11#" />
diff --git a/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/PBKDF2ParamsChildElements.xml b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/PBKDF2ParamsChildElements.xml
new file mode 100644
index 000000000..92ef6bc3c
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/PBKDF2ParamsChildElements.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xenc11:PBKDF2-params xmlns:xenc11="http://www.w3.org/2009/xmlenc11#">
+    <xenc11:Salt />
+    <xenc11:IterationCount/>
+    <xenc11:KeyLength/>
+    <xenc11:PRF/>
+</xenc11:PBKDF2-params>
diff --git a/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/PRF.xml b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/PRF.xml
new file mode 100644
index 000000000..109edf094
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/PRF.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xenc11:PRF xmlns:xenc11="http://www.w3.org/2009/xmlenc11#" Algorithm="urn:string:foo"/>
diff --git a/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/PRFChildElements.xml b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/PRFChildElements.xml
new file mode 100644
index 000000000..9d8f60290
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/PRFChildElements.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xenc11:PRF xmlns:xenc11="http://www.w3.org/2009/xmlenc11#" Algorithm="urn:string:foo">
+    <xenc11:Parameters>MyParams</xenc11:Parameters>
+</xenc11:PRF>
diff --git a/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/Salt.xml b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/Salt.xml
new file mode 100644
index 000000000..75e350b28
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/Salt.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xenc11:Salt xmlns:xenc11="http://www.w3.org/2009/xmlenc11#" />
diff --git a/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/SaltChildElements.xml b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/SaltChildElements.xml
new file mode 100644
index 000000000..8bc5faa5d
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/SaltChildElements.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xenc11:Salt xmlns:xenc11="http://www.w3.org/2009/xmlenc11#">
+    <xenc11:Specified />
+    <xenc11:OtherSource />
+</xenc11:Salt>
diff --git a/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/Specified.xml b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/Specified.xml
new file mode 100644
index 000000000..34933f871
--- /dev/null
+++ b/opensaml-xmlsec-impl/src/test/resources/org/opensaml/xmlsec/encryption/impl/Specified.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xenc11:Specified xmlns:xenc11="http://www.w3.org/2009/xmlenc11#">someBase64==</xenc11:Specified>

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the commits mailing list