src/share/classes/com/sun/org/apache/xml/internal/security/encryption/XMLCipher.java
Print this page
*** 1,80 ****
/*
* reserved comment block
* DO NOT REMOVE OR ALTER!
*/
! /*
! * Copyright 2003-2004 The Apache Software Foundation.
! *
! * Licensed 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 com.sun.org.apache.xml.internal.security.encryption;
-
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
- import java.io.IOException;
- import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
! import javax.xml.XMLConstants;
! import javax.xml.parsers.DocumentBuilder;
! import javax.xml.parsers.DocumentBuilderFactory;
! import javax.xml.parsers.ParserConfigurationException;
import com.sun.org.apache.xml.internal.security.algorithms.JCEMapper;
import com.sun.org.apache.xml.internal.security.algorithms.MessageDigestAlgorithm;
import com.sun.org.apache.xml.internal.security.c14n.Canonicalizer;
import com.sun.org.apache.xml.internal.security.c14n.InvalidCanonicalizerException;
import com.sun.org.apache.xml.internal.security.exceptions.XMLSecurityException;
import com.sun.org.apache.xml.internal.security.keys.KeyInfo;
import com.sun.org.apache.xml.internal.security.keys.keyresolver.KeyResolverException;
import com.sun.org.apache.xml.internal.security.keys.keyresolver.implementations.EncryptedKeyResolver;
import com.sun.org.apache.xml.internal.security.signature.XMLSignatureException;
import com.sun.org.apache.xml.internal.security.transforms.InvalidTransformException;
import com.sun.org.apache.xml.internal.security.transforms.TransformationException;
import com.sun.org.apache.xml.internal.security.utils.Base64;
import com.sun.org.apache.xml.internal.security.utils.Constants;
import com.sun.org.apache.xml.internal.security.utils.ElementProxy;
import com.sun.org.apache.xml.internal.security.utils.EncryptionConstants;
import com.sun.org.apache.xml.internal.security.utils.XMLUtils;
- import com.sun.org.apache.xml.internal.utils.URI;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
- import org.w3c.dom.DocumentFragment;
import org.w3c.dom.Element;
- import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
- import org.xml.sax.InputSource;
- import org.xml.sax.SAXException;
-
/**
* <code>XMLCipher</code> encrypts and decrypts the contents of
* <code>Document</code>s, <code>Element</code>s and <code>Element</code>
* contents. It was designed to resemble <code>javax.crypto.Cipher</code> in
--- 1,79 ----
/*
* reserved comment block
* DO NOT REMOVE OR ALTER!
*/
! /**
! * Licensed to the Apache Software Foundation (ASF) under one
! * or more contributor license agreements. See the NOTICE file
! * distributed with this work for additional information
! * regarding copyright ownership. The ASF 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 com.sun.org.apache.xml.internal.security.encryption;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
+ import java.net.URI;
+ import java.net.URISyntaxException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
+ import java.security.SecureRandom;
+ import java.security.spec.MGF1ParameterSpec;
+ import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
+ import java.util.Map;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
! import javax.crypto.spec.OAEPParameterSpec;
! import javax.crypto.spec.PSource;
import com.sun.org.apache.xml.internal.security.algorithms.JCEMapper;
import com.sun.org.apache.xml.internal.security.algorithms.MessageDigestAlgorithm;
import com.sun.org.apache.xml.internal.security.c14n.Canonicalizer;
import com.sun.org.apache.xml.internal.security.c14n.InvalidCanonicalizerException;
+ import com.sun.org.apache.xml.internal.security.exceptions.Base64DecodingException;
import com.sun.org.apache.xml.internal.security.exceptions.XMLSecurityException;
import com.sun.org.apache.xml.internal.security.keys.KeyInfo;
import com.sun.org.apache.xml.internal.security.keys.keyresolver.KeyResolverException;
+ import com.sun.org.apache.xml.internal.security.keys.keyresolver.KeyResolverSpi;
import com.sun.org.apache.xml.internal.security.keys.keyresolver.implementations.EncryptedKeyResolver;
import com.sun.org.apache.xml.internal.security.signature.XMLSignatureException;
import com.sun.org.apache.xml.internal.security.transforms.InvalidTransformException;
import com.sun.org.apache.xml.internal.security.transforms.TransformationException;
import com.sun.org.apache.xml.internal.security.utils.Base64;
import com.sun.org.apache.xml.internal.security.utils.Constants;
import com.sun.org.apache.xml.internal.security.utils.ElementProxy;
import com.sun.org.apache.xml.internal.security.utils.EncryptionConstants;
import com.sun.org.apache.xml.internal.security.utils.XMLUtils;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* <code>XMLCipher</code> encrypts and decrypts the contents of
* <code>Document</code>s, <code>Element</code>s and <code>Element</code>
* contents. It was designed to resemble <code>javax.crypto.Cipher</code> in
*** 83,243 ****
* @author Axl Mattheus (Sun Microsystems)
* @author Christian Geuer-Pollmann
*/
public class XMLCipher {
! private static java.util.logging.Logger logger =
java.util.logging.Logger.getLogger(XMLCipher.class.getName());
- //J-
/** Triple DES EDE (192 bit key) in CBC mode */
public static final String TRIPLEDES =
EncryptionConstants.ALGO_ID_BLOCKCIPHER_TRIPLEDES;
/** AES 128 Cipher */
public static final String AES_128 =
EncryptionConstants.ALGO_ID_BLOCKCIPHER_AES128;
/** AES 256 Cipher */
public static final String AES_256 =
EncryptionConstants.ALGO_ID_BLOCKCIPHER_AES256;
/** AES 192 Cipher */
public static final String AES_192 =
EncryptionConstants.ALGO_ID_BLOCKCIPHER_AES192;
/** RSA 1.5 Cipher */
public static final String RSA_v1dot5 =
EncryptionConstants.ALGO_ID_KEYTRANSPORT_RSA15;
/** RSA OAEP Cipher */
public static final String RSA_OAEP =
EncryptionConstants.ALGO_ID_KEYTRANSPORT_RSAOAEP;
/** DIFFIE_HELLMAN Cipher */
public static final String DIFFIE_HELLMAN =
EncryptionConstants.ALGO_ID_KEYAGREEMENT_DH;
/** Triple DES EDE (192 bit key) in CBC mode KEYWRAP*/
public static final String TRIPLEDES_KeyWrap =
EncryptionConstants.ALGO_ID_KEYWRAP_TRIPLEDES;
/** AES 128 Cipher KeyWrap */
public static final String AES_128_KeyWrap =
EncryptionConstants.ALGO_ID_KEYWRAP_AES128;
/** AES 256 Cipher KeyWrap */
public static final String AES_256_KeyWrap =
EncryptionConstants.ALGO_ID_KEYWRAP_AES256;
/** AES 192 Cipher KeyWrap */
public static final String AES_192_KeyWrap =
EncryptionConstants.ALGO_ID_KEYWRAP_AES192;
/** SHA1 Cipher */
public static final String SHA1 =
Constants.ALGO_ID_DIGEST_SHA1;
/** SHA256 Cipher */
public static final String SHA256 =
MessageDigestAlgorithm.ALGO_ID_DIGEST_SHA256;
/** SHA512 Cipher */
public static final String SHA512 =
MessageDigestAlgorithm.ALGO_ID_DIGEST_SHA512;
/** RIPEMD Cipher */
public static final String RIPEMD_160 =
MessageDigestAlgorithm.ALGO_ID_DIGEST_RIPEMD160;
/** XML Signature NS */
public static final String XML_DSIG =
Constants.SignatureSpecNS;
/** N14C_XML */
public static final String N14C_XML =
Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS;
/** N14C_XML with comments*/
public static final String N14C_XML_WITH_COMMENTS =
Canonicalizer.ALGO_ID_C14N_WITH_COMMENTS;
! /** N14C_XML excluisve */
public static final String EXCL_XML_N14C =
Canonicalizer.ALGO_ID_C14N_EXCL_OMIT_COMMENTS;
! /** N14C_XML exclusive with commetns*/
public static final String EXCL_XML_N14C_WITH_COMMENTS =
Canonicalizer.ALGO_ID_C14N_EXCL_WITH_COMMENTS;
/** Base64 encoding */
public static final String BASE64_ENCODING =
com.sun.org.apache.xml.internal.security.transforms.Transforms.TRANSFORM_BASE64_DECODE;
- //J+
/** ENCRYPT Mode */
public static final int ENCRYPT_MODE = Cipher.ENCRYPT_MODE;
/** DECRYPT Mode */
public static final int DECRYPT_MODE = Cipher.DECRYPT_MODE;
/** UNWRAP Mode */
public static final int UNWRAP_MODE = Cipher.UNWRAP_MODE;
/** WRAP Mode */
public static final int WRAP_MODE = Cipher.WRAP_MODE;
private static final String ENC_ALGORITHMS = TRIPLEDES + "\n" +
AES_128 + "\n" + AES_256 + "\n" + AES_192 + "\n" + RSA_v1dot5 + "\n" +
! RSA_OAEP + "\n" + TRIPLEDES_KeyWrap + "\n" + AES_128_KeyWrap + "\n" +
! AES_256_KeyWrap + "\n" + AES_192_KeyWrap+ "\n";
/** Cipher created during initialisation that is used for encryption */
! private Cipher _contextCipher;
/** Mode that the XMLCipher object is operating in */
! private int _cipherMode = Integer.MIN_VALUE;
/** URI of algorithm that is being used for cryptographic operation */
! private String _algorithm = null;
/** Cryptographic provider requested by caller */
! private String _requestedJCEProvider = null;
/** Holds c14n to serialize, if initialized then _always_ use this c14n to serialize */
! private Canonicalizer _canon;
/** Used for creation of DOM nodes in WRAP and ENCRYPT modes */
! private Document _contextDocument;
/** Instance of factory used to create XML Encryption objects */
! private Factory _factory;
! /** Internal serializer class for going to/from UTF-8 */
! private Serializer _serializer;
/** Local copy of user's key */
! private Key _key;
/** Local copy of the kek (used to decrypt EncryptedKeys during a
* DECRYPT_MODE operation */
! private Key _kek;
// The EncryptedKey being built (part of a WRAP operation) or read
// (part of an UNWRAP operation)
!
! private EncryptedKey _ek;
// The EncryptedData being built (part of a WRAP operation) or read
// (part of an UNWRAP operation)
! private EncryptedData _ed;
/**
* Creates a new <code>XMLCipher</code>.
*
! * @since 1.0.
*/
! private XMLCipher() {
! logger.log(java.util.logging.Level.FINE, "Constructing XMLCipher...");
! _factory = new Factory();
! _serializer = new Serializer();
}
/**
* Checks to ensure that the supplied algorithm is valid.
*
* @param algorithm the algorithm to check.
* @return true if the algorithm is valid, otherwise false.
* @since 1.0.
*/
private static boolean isValidEncryptionAlgorithm(String algorithm) {
! boolean result = (
algorithm.equals(TRIPLEDES) ||
algorithm.equals(AES_128) ||
algorithm.equals(AES_256) ||
algorithm.equals(AES_192) ||
algorithm.equals(RSA_v1dot5) ||
algorithm.equals(RSA_OAEP) ||
algorithm.equals(TRIPLEDES_KeyWrap) ||
algorithm.equals(AES_128_KeyWrap) ||
algorithm.equals(AES_256_KeyWrap) ||
algorithm.equals(AES_192_KeyWrap)
);
! return (result);
}
/**
* Returns an <code>XMLCipher</code> that implements the specified
* transformation and operates on the specified context document.
--- 82,372 ----
* @author Axl Mattheus (Sun Microsystems)
* @author Christian Geuer-Pollmann
*/
public class XMLCipher {
! private static java.util.logging.Logger log =
java.util.logging.Logger.getLogger(XMLCipher.class.getName());
/** Triple DES EDE (192 bit key) in CBC mode */
public static final String TRIPLEDES =
EncryptionConstants.ALGO_ID_BLOCKCIPHER_TRIPLEDES;
+
/** AES 128 Cipher */
public static final String AES_128 =
EncryptionConstants.ALGO_ID_BLOCKCIPHER_AES128;
+
/** AES 256 Cipher */
public static final String AES_256 =
EncryptionConstants.ALGO_ID_BLOCKCIPHER_AES256;
+
/** AES 192 Cipher */
public static final String AES_192 =
EncryptionConstants.ALGO_ID_BLOCKCIPHER_AES192;
+
+ /** AES 128 GCM Cipher */
+ public static final String AES_128_GCM =
+ EncryptionConstants.ALGO_ID_BLOCKCIPHER_AES128_GCM;
+
+ /** AES 192 GCM Cipher */
+ public static final String AES_192_GCM =
+ EncryptionConstants.ALGO_ID_BLOCKCIPHER_AES192_GCM;
+
+ /** AES 256 GCM Cipher */
+ public static final String AES_256_GCM =
+ EncryptionConstants.ALGO_ID_BLOCKCIPHER_AES256_GCM;
+
/** RSA 1.5 Cipher */
public static final String RSA_v1dot5 =
EncryptionConstants.ALGO_ID_KEYTRANSPORT_RSA15;
+
/** RSA OAEP Cipher */
public static final String RSA_OAEP =
EncryptionConstants.ALGO_ID_KEYTRANSPORT_RSAOAEP;
+
+ /** RSA OAEP Cipher */
+ public static final String RSA_OAEP_11 =
+ EncryptionConstants.ALGO_ID_KEYTRANSPORT_RSAOAEP_11;
+
/** DIFFIE_HELLMAN Cipher */
public static final String DIFFIE_HELLMAN =
EncryptionConstants.ALGO_ID_KEYAGREEMENT_DH;
+
/** Triple DES EDE (192 bit key) in CBC mode KEYWRAP*/
public static final String TRIPLEDES_KeyWrap =
EncryptionConstants.ALGO_ID_KEYWRAP_TRIPLEDES;
+
/** AES 128 Cipher KeyWrap */
public static final String AES_128_KeyWrap =
EncryptionConstants.ALGO_ID_KEYWRAP_AES128;
+
/** AES 256 Cipher KeyWrap */
public static final String AES_256_KeyWrap =
EncryptionConstants.ALGO_ID_KEYWRAP_AES256;
+
/** AES 192 Cipher KeyWrap */
public static final String AES_192_KeyWrap =
EncryptionConstants.ALGO_ID_KEYWRAP_AES192;
+
/** SHA1 Cipher */
public static final String SHA1 =
Constants.ALGO_ID_DIGEST_SHA1;
+
/** SHA256 Cipher */
public static final String SHA256 =
MessageDigestAlgorithm.ALGO_ID_DIGEST_SHA256;
+
/** SHA512 Cipher */
public static final String SHA512 =
MessageDigestAlgorithm.ALGO_ID_DIGEST_SHA512;
+
/** RIPEMD Cipher */
public static final String RIPEMD_160 =
MessageDigestAlgorithm.ALGO_ID_DIGEST_RIPEMD160;
+
/** XML Signature NS */
public static final String XML_DSIG =
Constants.SignatureSpecNS;
+
/** N14C_XML */
public static final String N14C_XML =
Canonicalizer.ALGO_ID_C14N_OMIT_COMMENTS;
+
/** N14C_XML with comments*/
public static final String N14C_XML_WITH_COMMENTS =
Canonicalizer.ALGO_ID_C14N_WITH_COMMENTS;
!
! /** N14C_XML exclusive */
public static final String EXCL_XML_N14C =
Canonicalizer.ALGO_ID_C14N_EXCL_OMIT_COMMENTS;
!
! /** N14C_XML exclusive with comments*/
public static final String EXCL_XML_N14C_WITH_COMMENTS =
Canonicalizer.ALGO_ID_C14N_EXCL_WITH_COMMENTS;
+
+ /** N14C_PHYSICAL preserve the physical representation*/
+ public static final String PHYSICAL_XML_N14C =
+ Canonicalizer.ALGO_ID_C14N_PHYSICAL;
+
/** Base64 encoding */
public static final String BASE64_ENCODING =
com.sun.org.apache.xml.internal.security.transforms.Transforms.TRANSFORM_BASE64_DECODE;
/** ENCRYPT Mode */
public static final int ENCRYPT_MODE = Cipher.ENCRYPT_MODE;
+
/** DECRYPT Mode */
public static final int DECRYPT_MODE = Cipher.DECRYPT_MODE;
+
/** UNWRAP Mode */
public static final int UNWRAP_MODE = Cipher.UNWRAP_MODE;
+
/** WRAP Mode */
public static final int WRAP_MODE = Cipher.WRAP_MODE;
private static final String ENC_ALGORITHMS = TRIPLEDES + "\n" +
AES_128 + "\n" + AES_256 + "\n" + AES_192 + "\n" + RSA_v1dot5 + "\n" +
! RSA_OAEP + "\n" + RSA_OAEP_11 + "\n" + TRIPLEDES_KeyWrap + "\n" +
! AES_128_KeyWrap + "\n" + AES_256_KeyWrap + "\n" + AES_192_KeyWrap + "\n" +
! AES_128_GCM + "\n" + AES_192_GCM + "\n" + AES_256_GCM + "\n";
/** Cipher created during initialisation that is used for encryption */
! private Cipher contextCipher;
!
/** Mode that the XMLCipher object is operating in */
! private int cipherMode = Integer.MIN_VALUE;
!
/** URI of algorithm that is being used for cryptographic operation */
! private String algorithm = null;
!
/** Cryptographic provider requested by caller */
! private String requestedJCEProvider = null;
!
/** Holds c14n to serialize, if initialized then _always_ use this c14n to serialize */
! private Canonicalizer canon;
!
/** Used for creation of DOM nodes in WRAP and ENCRYPT modes */
! private Document contextDocument;
!
/** Instance of factory used to create XML Encryption objects */
! private Factory factory;
!
! /** Serializer class for going to/from UTF-8 */
! private Serializer serializer;
/** Local copy of user's key */
! private Key key;
!
/** Local copy of the kek (used to decrypt EncryptedKeys during a
* DECRYPT_MODE operation */
! private Key kek;
// The EncryptedKey being built (part of a WRAP operation) or read
// (part of an UNWRAP operation)
! private EncryptedKey ek;
// The EncryptedData being built (part of a WRAP operation) or read
// (part of an UNWRAP operation)
+ private EncryptedData ed;
! private SecureRandom random;
!
! private boolean secureValidation;
!
! private String digestAlg;
!
! /** List of internal KeyResolvers for DECRYPT and UNWRAP modes. */
! private List<KeyResolverSpi> internalKeyResolvers;
!
! /**
! * Set the Serializer algorithm to use
! */
! public void setSerializer(Serializer serializer) {
! this.serializer = serializer;
! serializer.setCanonicalizer(this.canon);
! }
!
! /**
! * Get the Serializer algorithm to use
! */
! public Serializer getSerializer() {
! return serializer;
! }
/**
* Creates a new <code>XMLCipher</code>.
*
! * @param transformation the name of the transformation, e.g.,
! * <code>XMLCipher.TRIPLEDES</code>. If null the XMLCipher can only
! * be used for decrypt or unwrap operations where the encryption method
! * is defined in the <code>EncryptionMethod</code> element.
! * @param provider the JCE provider that supplies the transformation,
! * if null use the default provider.
! * @param canon the name of the c14n algorithm, if
! * <code>null</code> use standard serializer
! * @param digestMethod An optional digestMethod to use.
*/
! private XMLCipher(
! String transformation,
! String provider,
! String canonAlg,
! String digestMethod
! ) throws XMLEncryptionException {
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "Constructing XMLCipher...");
! }
!
! factory = new Factory();
!
! algorithm = transformation;
! requestedJCEProvider = provider;
! digestAlg = digestMethod;
!
! // Create a canonicalizer - used when serializing DOM to octets
! // prior to encryption (and for the reverse)
!
! try {
! if (canonAlg == null) {
! // The default is to preserve the physical representation.
! this.canon = Canonicalizer.getInstance(Canonicalizer.ALGO_ID_C14N_PHYSICAL);
! } else {
! this.canon = Canonicalizer.getInstance(canonAlg);
! }
! } catch (InvalidCanonicalizerException ice) {
! throw new XMLEncryptionException("empty", ice);
! }
! if (serializer == null) {
! serializer = new DocumentSerializer();
! }
! serializer.setCanonicalizer(this.canon);
+ if (transformation != null) {
+ contextCipher = constructCipher(transformation, digestMethod);
+ }
}
/**
* Checks to ensure that the supplied algorithm is valid.
*
* @param algorithm the algorithm to check.
* @return true if the algorithm is valid, otherwise false.
* @since 1.0.
*/
private static boolean isValidEncryptionAlgorithm(String algorithm) {
! return (
algorithm.equals(TRIPLEDES) ||
algorithm.equals(AES_128) ||
algorithm.equals(AES_256) ||
algorithm.equals(AES_192) ||
+ algorithm.equals(AES_128_GCM) ||
+ algorithm.equals(AES_192_GCM) ||
+ algorithm.equals(AES_256_GCM) ||
algorithm.equals(RSA_v1dot5) ||
algorithm.equals(RSA_OAEP) ||
+ algorithm.equals(RSA_OAEP_11) ||
algorithm.equals(TRIPLEDES_KeyWrap) ||
algorithm.equals(AES_128_KeyWrap) ||
algorithm.equals(AES_256_KeyWrap) ||
algorithm.equals(AES_192_KeyWrap)
);
+ }
! /**
! * Validate the transformation argument of getInstance or getProviderInstance
! *
! * @param transformation the name of the transformation, e.g.,
! * <code>XMLCipher.TRIPLEDES</code> which is shorthand for
! * "http://www.w3.org/2001/04/xmlenc#tripledes-cbc"
! */
! private static void validateTransformation(String transformation) {
! if (null == transformation) {
! throw new NullPointerException("Transformation unexpectedly null...");
! }
! if (!isValidEncryptionAlgorithm(transformation)) {
! log.log(java.util.logging.Level.WARNING, "Algorithm non-standard, expected one of " + ENC_ALGORITHMS);
! }
}
/**
* Returns an <code>XMLCipher</code> that implements the specified
* transformation and operates on the specified context document.
*** 246,481 ****
* requested transformation, an instance of Cipher containing that
* implementation is returned. If the transformation is not available in
* the default provider package, other provider packages are searched.
* <p>
* <b>NOTE<sub>1</sub>:</b> The transformation name does not follow the same
! * pattern as that oulined in the Java Cryptography Extension Reference
* Guide but rather that specified by the XML Encryption Syntax and
* Processing document. The rational behind this is to make it easier for a
* novice at writing Java Encryption software to use the library.
* <p>
* <b>NOTE<sub>2</sub>:</b> <code>getInstance()</code> does not follow the
* same pattern regarding exceptional conditions as that used in
* <code>javax.crypto.Cipher</code>. Instead, it only throws an
* <code>XMLEncryptionException</code> which wraps an underlying exception.
! * The stack trace from the exception should be self explanitory.
*
* @param transformation the name of the transformation, e.g.,
* <code>XMLCipher.TRIPLEDES</code> which is shorthand for
* "http://www.w3.org/2001/04/xmlenc#tripledes-cbc"
* @throws XMLEncryptionException
* @return the XMLCipher
* @see javax.crypto.Cipher#getInstance(java.lang.String)
*/
! public static XMLCipher getInstance(String transformation) throws
! XMLEncryptionException {
! // sanity checks
! logger.log(java.util.logging.Level.FINE, "Getting XMLCipher...");
! if (null == transformation)
! logger.log(java.util.logging.Level.SEVERE, "Transformation unexpectedly null...");
! if(!isValidEncryptionAlgorithm(transformation))
! logger.log(java.util.logging.Level.WARNING, "Algorithm non-standard, expected one of " + ENC_ALGORITHMS);
!
! XMLCipher instance = new XMLCipher();
!
! instance._algorithm = transformation;
! instance._key = null;
! instance._kek = null;
!
!
! /* Create a canonicaliser - used when serialising DOM to octets
! * prior to encryption (and for the reverse) */
!
! try {
! instance._canon = Canonicalizer.getInstance
! (Canonicalizer.ALGO_ID_C14N_WITH_COMMENTS);
!
! } catch (InvalidCanonicalizerException ice) {
! throw new XMLEncryptionException("empty", ice);
! }
!
! String jceAlgorithm = JCEMapper.translateURItoJCEID(transformation);
!
! try {
! instance._contextCipher = Cipher.getInstance(jceAlgorithm);
! logger.log(java.util.logging.Level.FINE, "cihper.algoritm = " +
! instance._contextCipher.getAlgorithm());
! } catch (NoSuchAlgorithmException nsae) {
! throw new XMLEncryptionException("empty", nsae);
! } catch (NoSuchPaddingException nspe) {
! throw new XMLEncryptionException("empty", nspe);
}
!
! return (instance);
}
/**
* Returns an <code>XMLCipher</code> that implements the specified
* transformation, operates on the specified context document and serializes
* the document with the specified canonicalization algorithm before it
* encrypts the document.
* <p>
*
! * @param transformation the name of the transformation, e.g.,
! * <code>XMLCipher.TRIPLEDES</code> which is
! * shorthand for
! * "http://www.w3.org/2001/04/xmlenc#tripledes-cbc"
! * @param canon the name of the c14n algorithm, if
! * <code>null</code> use standard serializer
! * @return
* @throws XMLEncryptionException
*/
-
public static XMLCipher getInstance(String transformation, String canon)
throws XMLEncryptionException {
! XMLCipher instance = XMLCipher.getInstance(transformation);
!
! if (canon != null) {
! try {
! instance._canon = Canonicalizer.getInstance(canon);
! } catch (InvalidCanonicalizerException ice) {
! throw new XMLEncryptionException("empty", ice);
! }
! }
!
! return instance;
}
!
! public static XMLCipher getInstance(String transformation,Cipher cipher) throws XMLEncryptionException {
! // sanity checks
! logger.log(java.util.logging.Level.FINE, "Getting XMLCipher...");
! if (null == transformation)
! logger.log(java.util.logging.Level.SEVERE, "Transformation unexpectedly null...");
! if(!isValidEncryptionAlgorithm(transformation))
! logger.log(java.util.logging.Level.WARNING, "Algorithm non-standard, expected one of " + ENC_ALGORITHMS);
!
! XMLCipher instance = new XMLCipher();
!
! instance._algorithm = transformation;
! instance._key = null;
! instance._kek = null;
!
!
! /* Create a canonicaliser - used when serialising DOM to octets
! * prior to encryption (and for the reverse) */
!
! try {
! instance._canon = Canonicalizer.getInstance
! (Canonicalizer.ALGO_ID_C14N_WITH_COMMENTS);
!
! } catch (InvalidCanonicalizerException ice) {
! throw new XMLEncryptionException("empty", ice);
}
! String jceAlgorithm = JCEMapper.translateURItoJCEID(transformation);
!
! try {
! instance._contextCipher = cipher;
! //Cipher.getInstance(jceAlgorithm);
! logger.log(java.util.logging.Level.FINE, "cihper.algoritm = " +
! instance._contextCipher.getAlgorithm());
! }catch(Exception ex) {
! throw new XMLEncryptionException("empty", ex);
}
!
! return (instance);
}
/**
* Returns an <code>XMLCipher</code> that implements the specified
* transformation and operates on the specified context document.
*
! * @param transformation the name of the transformation, e.g.,
! * <code>XMLCipher.TRIPLEDES</code> which is shorthand for
! * "http://www.w3.org/2001/04/xmlenc#tripledes-cbc"
* @param provider the JCE provider that supplies the transformation
* @return the XMLCipher
* @throws XMLEncryptionException
*/
-
public static XMLCipher getProviderInstance(String transformation, String provider)
throws XMLEncryptionException {
! // sanity checks
! logger.log(java.util.logging.Level.FINE, "Getting XMLCipher...");
! if (null == transformation)
! logger.log(java.util.logging.Level.SEVERE, "Transformation unexpectedly null...");
! if(null == provider)
! logger.log(java.util.logging.Level.SEVERE, "Provider unexpectedly null..");
! if("" == provider)
! logger.log(java.util.logging.Level.SEVERE, "Provider's value unexpectedly not specified...");
! if(!isValidEncryptionAlgorithm(transformation))
! logger.log(java.util.logging.Level.WARNING, "Algorithm non-standard, expected one of " + ENC_ALGORITHMS);
!
! XMLCipher instance = new XMLCipher();
!
! instance._algorithm = transformation;
! instance._requestedJCEProvider = provider;
! instance._key = null;
! instance._kek = null;
!
! /* Create a canonicaliser - used when serialising DOM to octets
! * prior to encryption (and for the reverse) */
!
! try {
! instance._canon = Canonicalizer.getInstance
! (Canonicalizer.ALGO_ID_C14N_WITH_COMMENTS);
! } catch (InvalidCanonicalizerException ice) {
! throw new XMLEncryptionException("empty", ice);
}
!
! try {
! String jceAlgorithm =
! JCEMapper.translateURItoJCEID(transformation);
!
! instance._contextCipher = Cipher.getInstance(jceAlgorithm, provider);
!
! logger.log(java.util.logging.Level.FINE, "cipher._algorithm = " +
! instance._contextCipher.getAlgorithm());
! logger.log(java.util.logging.Level.FINE, "provider.name = " + provider);
! } catch (NoSuchAlgorithmException nsae) {
! throw new XMLEncryptionException("empty", nsae);
! } catch (NoSuchProviderException nspre) {
! throw new XMLEncryptionException("empty", nspre);
! } catch (NoSuchPaddingException nspe) {
! throw new XMLEncryptionException("empty", nspe);
}
!
! return (instance);
}
/**
* Returns an <code>XMLCipher</code> that implements the specified
* transformation, operates on the specified context document and serializes
* the document with the specified canonicalization algorithm before it
* encrypts the document.
* <p>
*
! * @param transformation the name of the transformation, e.g.,
! * <code>XMLCipher.TRIPLEDES</code> which is
! * shorthand for
! * "http://www.w3.org/2001/04/xmlenc#tripledes-cbc"
* @param provider the JCE provider that supplies the transformation
! * @param canon the name of the c14n algorithm, if
! * <code>null</code> use standard serializer
! * @return
* @throws XMLEncryptionException
*/
public static XMLCipher getProviderInstance(
! String transformation,
! String provider,
! String canon)
! throws XMLEncryptionException {
! XMLCipher instance = XMLCipher.getProviderInstance(transformation, provider);
! if (canon != null) {
! try {
! instance._canon = Canonicalizer.getInstance(canon);
! } catch (InvalidCanonicalizerException ice) {
! throw new XMLEncryptionException("empty", ice);
}
}
! return instance;
}
/**
* Returns an <code>XMLCipher</code> that implements no specific
* transformation, and can therefore only be used for decrypt or
--- 375,529 ----
* requested transformation, an instance of Cipher containing that
* implementation is returned. If the transformation is not available in
* the default provider package, other provider packages are searched.
* <p>
* <b>NOTE<sub>1</sub>:</b> The transformation name does not follow the same
! * pattern as that outlined in the Java Cryptography Extension Reference
* Guide but rather that specified by the XML Encryption Syntax and
* Processing document. The rational behind this is to make it easier for a
* novice at writing Java Encryption software to use the library.
* <p>
* <b>NOTE<sub>2</sub>:</b> <code>getInstance()</code> does not follow the
* same pattern regarding exceptional conditions as that used in
* <code>javax.crypto.Cipher</code>. Instead, it only throws an
* <code>XMLEncryptionException</code> which wraps an underlying exception.
! * The stack trace from the exception should be self explanatory.
*
* @param transformation the name of the transformation, e.g.,
* <code>XMLCipher.TRIPLEDES</code> which is shorthand for
* "http://www.w3.org/2001/04/xmlenc#tripledes-cbc"
* @throws XMLEncryptionException
* @return the XMLCipher
* @see javax.crypto.Cipher#getInstance(java.lang.String)
*/
! public static XMLCipher getInstance(String transformation) throws XMLEncryptionException {
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "Getting XMLCipher with transformation");
}
! validateTransformation(transformation);
! return new XMLCipher(transformation, null, null, null);
}
/**
* Returns an <code>XMLCipher</code> that implements the specified
* transformation, operates on the specified context document and serializes
* the document with the specified canonicalization algorithm before it
* encrypts the document.
* <p>
*
! * @param transformation the name of the transformation
! * @param canon the name of the c14n algorithm, if <code>null</code> use
! * standard serializer
! * @return the XMLCipher
* @throws XMLEncryptionException
*/
public static XMLCipher getInstance(String transformation, String canon)
throws XMLEncryptionException {
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "Getting XMLCipher with transformation and c14n algorithm");
}
! validateTransformation(transformation);
! return new XMLCipher(transformation, null, canon, null);
}
! /**
! * Returns an <code>XMLCipher</code> that implements the specified
! * transformation, operates on the specified context document and serializes
! * the document with the specified canonicalization algorithm before it
! * encrypts the document.
! * <p>
! *
! * @param transformation the name of the transformation
! * @param canon the name of the c14n algorithm, if <code>null</code> use
! * standard serializer
! * @param digestMethod An optional digestMethod to use
! * @return the XMLCipher
! * @throws XMLEncryptionException
! */
! public static XMLCipher getInstance(String transformation, String canon, String digestMethod)
! throws XMLEncryptionException {
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "Getting XMLCipher with transformation and c14n algorithm");
}
! validateTransformation(transformation);
! return new XMLCipher(transformation, null, canon, digestMethod);
}
/**
* Returns an <code>XMLCipher</code> that implements the specified
* transformation and operates on the specified context document.
*
! * @param transformation the name of the transformation
* @param provider the JCE provider that supplies the transformation
* @return the XMLCipher
* @throws XMLEncryptionException
*/
public static XMLCipher getProviderInstance(String transformation, String provider)
throws XMLEncryptionException {
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "Getting XMLCipher with transformation and provider");
}
! if (null == provider) {
! throw new NullPointerException("Provider unexpectedly null..");
}
! validateTransformation(transformation);
! return new XMLCipher(transformation, provider, null, null);
}
/**
* Returns an <code>XMLCipher</code> that implements the specified
* transformation, operates on the specified context document and serializes
* the document with the specified canonicalization algorithm before it
* encrypts the document.
* <p>
*
! * @param transformation the name of the transformation
* @param provider the JCE provider that supplies the transformation
! * @param canon the name of the c14n algorithm, if <code>null</code> use standard
! * serializer
! * @return the XMLCipher
* @throws XMLEncryptionException
*/
public static XMLCipher getProviderInstance(
! String transformation, String provider, String canon
! ) throws XMLEncryptionException {
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "Getting XMLCipher with transformation, provider and c14n algorithm");
! }
! if (null == provider) {
! throw new NullPointerException("Provider unexpectedly null..");
! }
! validateTransformation(transformation);
! return new XMLCipher(transformation, provider, canon, null);
! }
! /**
! * Returns an <code>XMLCipher</code> that implements the specified
! * transformation, operates on the specified context document and serializes
! * the document with the specified canonicalization algorithm before it
! * encrypts the document.
! * <p>
! *
! * @param transformation the name of the transformation
! * @param provider the JCE provider that supplies the transformation
! * @param canon the name of the c14n algorithm, if <code>null</code> use standard
! * serializer
! * @param digestMethod An optional digestMethod to use
! * @return the XMLCipher
! * @throws XMLEncryptionException
! */
! public static XMLCipher getProviderInstance(
! String transformation, String provider, String canon, String digestMethod
! ) throws XMLEncryptionException {
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "Getting XMLCipher with transformation, provider and c14n algorithm");
}
+ if (null == provider) {
+ throw new NullPointerException("Provider unexpectedly null..");
}
! validateTransformation(transformation);
! return new XMLCipher(transformation, provider, canon, digestMethod);
}
/**
* Returns an <code>XMLCipher</code> that implements no specific
* transformation, and can therefore only be used for decrypt or
*** 483,517 ****
* <code>EncryptionMethod</code> element.
*
* @return The XMLCipher
* @throws XMLEncryptionException
*/
!
! public static XMLCipher getInstance()
! throws XMLEncryptionException {
! // sanity checks
! logger.log(java.util.logging.Level.FINE, "Getting XMLCipher for no transformation...");
!
! XMLCipher instance = new XMLCipher();
!
! instance._algorithm = null;
! instance._requestedJCEProvider = null;
! instance._key = null;
! instance._kek = null;
! instance._contextCipher = null;
!
! /* Create a canonicaliser - used when serialising DOM to octets
! * prior to encryption (and for the reverse) */
!
! try {
! instance._canon = Canonicalizer.getInstance
! (Canonicalizer.ALGO_ID_C14N_WITH_COMMENTS);
! } catch (InvalidCanonicalizerException ice) {
! throw new XMLEncryptionException("empty", ice);
}
!
! return (instance);
}
/**
* Returns an <code>XMLCipher</code> that implements no specific
* transformation, and can therefore only be used for decrypt or
--- 531,545 ----
* <code>EncryptionMethod</code> element.
*
* @return The XMLCipher
* @throws XMLEncryptionException
*/
! public static XMLCipher getInstance() throws XMLEncryptionException {
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "Getting XMLCipher with no arguments");
}
! return new XMLCipher(null, null, null, null);
}
/**
* Returns an <code>XMLCipher</code> that implements no specific
* transformation, and can therefore only be used for decrypt or
*** 519,560 ****
* <code>EncryptionMethod</code> element.
*
* Allows the caller to specify a provider that will be used for
* cryptographic operations.
*
! * @param provider the JCE provider that supplies the cryptographic
! * needs.
* @return the XMLCipher
* @throws XMLEncryptionException
*/
!
! public static XMLCipher getProviderInstance(String provider)
! throws XMLEncryptionException {
! // sanity checks
!
! logger.log(java.util.logging.Level.FINE, "Getting XMLCipher, provider but no transformation");
! if(null == provider)
! logger.log(java.util.logging.Level.SEVERE, "Provider unexpectedly null..");
! if("" == provider)
! logger.log(java.util.logging.Level.SEVERE, "Provider's value unexpectedly not specified...");
!
! XMLCipher instance = new XMLCipher();
!
! instance._algorithm = null;
! instance._requestedJCEProvider = provider;
! instance._key = null;
! instance._kek = null;
! instance._contextCipher = null;
!
! try {
! instance._canon = Canonicalizer.getInstance
! (Canonicalizer.ALGO_ID_C14N_WITH_COMMENTS);
! } catch (InvalidCanonicalizerException ice) {
! throw new XMLEncryptionException("empty", ice);
}
!
! return (instance);
}
/**
* Initializes this cipher with a key.
* <p>
--- 547,565 ----
* <code>EncryptionMethod</code> element.
*
* Allows the caller to specify a provider that will be used for
* cryptographic operations.
*
! * @param provider the JCE provider that supplies the transformation
* @return the XMLCipher
* @throws XMLEncryptionException
*/
! public static XMLCipher getProviderInstance(String provider) throws XMLEncryptionException {
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "Getting XMLCipher with provider");
}
! return new XMLCipher(null, provider, null, null);
}
/**
* Initializes this cipher with a key.
* <p>
*** 575,631 ****
* @see javax.crypto.Cipher#init(int, java.security.Key)
* @throws XMLEncryptionException
*/
public void init(int opmode, Key key) throws XMLEncryptionException {
// sanity checks
! logger.log(java.util.logging.Level.FINE, "Initializing XMLCipher...");
! _ek = null;
! _ed = null;
switch (opmode) {
case ENCRYPT_MODE :
! logger.log(java.util.logging.Level.FINE, "opmode = ENCRYPT_MODE");
! _ed = createEncryptedData(CipherData.VALUE_TYPE, "NO VALUE YET");
break;
case DECRYPT_MODE :
! logger.log(java.util.logging.Level.FINE, "opmode = DECRYPT_MODE");
break;
case WRAP_MODE :
! logger.log(java.util.logging.Level.FINE, "opmode = WRAP_MODE");
! _ek = createEncryptedKey(CipherData.VALUE_TYPE, "NO VALUE YET");
break;
case UNWRAP_MODE :
! logger.log(java.util.logging.Level.FINE, "opmode = UNWRAP_MODE");
break;
default :
! logger.log(java.util.logging.Level.SEVERE, "Mode unexpectedly invalid");
throw new XMLEncryptionException("Invalid mode in init");
}
! _cipherMode = opmode;
! _key = key;
}
/**
! * Get the EncryptedData being build
*
* Returns the EncryptedData being built during an ENCRYPT operation.
* This can then be used by applications to add KeyInfo elements and
* set other parameters.
*
* @return The EncryptedData being built
*/
-
public EncryptedData getEncryptedData() {
-
// Sanity checks
! logger.log(java.util.logging.Level.FINE, "Returning EncryptedData");
! return _ed;
!
}
/**
* Get the EncryptedData being build
*
--- 580,665 ----
* @see javax.crypto.Cipher#init(int, java.security.Key)
* @throws XMLEncryptionException
*/
public void init(int opmode, Key key) throws XMLEncryptionException {
// sanity checks
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "Initializing XMLCipher...");
! }
! ek = null;
! ed = null;
switch (opmode) {
case ENCRYPT_MODE :
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "opmode = ENCRYPT_MODE");
! }
! ed = createEncryptedData(CipherData.VALUE_TYPE, "NO VALUE YET");
break;
case DECRYPT_MODE :
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "opmode = DECRYPT_MODE");
! }
break;
case WRAP_MODE :
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "opmode = WRAP_MODE");
! }
! ek = createEncryptedKey(CipherData.VALUE_TYPE, "NO VALUE YET");
break;
case UNWRAP_MODE :
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "opmode = UNWRAP_MODE");
! }
break;
default :
! log.log(java.util.logging.Level.SEVERE, "Mode unexpectedly invalid");
throw new XMLEncryptionException("Invalid mode in init");
}
! cipherMode = opmode;
! this.key = key;
! }
+ /**
+ * Set whether secure validation is enabled or not. The default is false.
+ */
+ public void setSecureValidation(boolean secureValidation) {
+ this.secureValidation = secureValidation;
}
/**
! * This method is used to add a custom {@link KeyResolverSpi} to an XMLCipher.
! * These KeyResolvers are used in KeyInfo objects in DECRYPT and
! * UNWRAP modes.
*
+ * @param keyResolver
+ */
+ public void registerInternalKeyResolver(KeyResolverSpi keyResolver) {
+ if (internalKeyResolvers == null) {
+ internalKeyResolvers = new ArrayList<KeyResolverSpi>();
+ }
+ internalKeyResolvers.add(keyResolver);
+ }
+
+ /**
+ * Get the EncryptedData being built
+ * <p>
* Returns the EncryptedData being built during an ENCRYPT operation.
* This can then be used by applications to add KeyInfo elements and
* set other parameters.
*
* @return The EncryptedData being built
*/
public EncryptedData getEncryptedData() {
// Sanity checks
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "Returning EncryptedData");
! }
! return ed;
}
/**
* Get the EncryptedData being build
*
*** 633,648 ****
* This can then be used by applications to add KeyInfo elements and
* set other parameters.
*
* @return The EncryptedData being built
*/
-
public EncryptedKey getEncryptedKey() {
-
// Sanity checks
! logger.log(java.util.logging.Level.FINE, "Returning EncryptedKey");
! return _ek;
}
/**
* Set a Key Encryption Key.
* <p>
--- 667,682 ----
* This can then be used by applications to add KeyInfo elements and
* set other parameters.
*
* @return The EncryptedData being built
*/
public EncryptedKey getEncryptedKey() {
// Sanity checks
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "Returning EncryptedKey");
! }
! return ek;
}
/**
* Set a Key Encryption Key.
* <p>
*** 653,665 ****
*
* @param kek The key to use for de/encrypting key data
*/
public void setKEK(Key kek) {
!
! _kek = kek;
!
}
/**
* Martial an EncryptedData
*
--- 687,697 ----
*
* @param kek The key to use for de/encrypting key data
*/
public void setKEK(Key kek) {
! this.kek = kek;
}
/**
* Martial an EncryptedData
*
*** 671,685 ****
*
* @param encryptedData EncryptedData object to martial
* @return the DOM <code>Element</code> representing the passed in
* object
*/
-
public Element martial(EncryptedData encryptedData) {
! return (_factory.toElement (encryptedData));
!
}
/**
* Martial an EncryptedKey
*
--- 703,730 ----
*
* @param encryptedData EncryptedData object to martial
* @return the DOM <code>Element</code> representing the passed in
* object
*/
public Element martial(EncryptedData encryptedData) {
+ return factory.toElement(encryptedData);
+ }
! /**
! * Martial an EncryptedData
! *
! * Takes an EncryptedData object and returns a DOM Element that
! * represents the appropriate <code>EncryptedData</code>
! *
! * @param context The document that will own the returned nodes
! * @param encryptedData EncryptedData object to martial
! * @return the DOM <code>Element</code> representing the passed in
! * object
! */
! public Element martial(Document context, EncryptedData encryptedData) {
! contextDocument = context;
! return factory.toElement(encryptedData);
}
/**
* Martial an EncryptedKey
*
*** 690,723 ****
* <b>Note:</b> This should only be used in cases where the context
* document has been passed in via a call to doFinal.
*
* @param encryptedKey EncryptedKey object to martial
* @return the DOM <code>Element</code> representing the passed in
! * object */
!
public Element martial(EncryptedKey encryptedKey) {
!
! return (_factory.toElement (encryptedKey));
!
! }
!
! /**
! * Martial an EncryptedData
! *
! * Takes an EncryptedData object and returns a DOM Element that
! * represents the appropriate <code>EncryptedData</code>
! *
! * @param context The document that will own the returned nodes
! * @param encryptedData EncryptedData object to martial
! * @return the DOM <code>Element</code> representing the passed in
! * object */
!
! public Element martial(Document context, EncryptedData encryptedData) {
!
! _contextDocument = context;
! return (_factory.toElement (encryptedData));
!
}
/**
* Martial an EncryptedKey
*
--- 735,748 ----
* <b>Note:</b> This should only be used in cases where the context
* document has been passed in via a call to doFinal.
*
* @param encryptedKey EncryptedKey object to martial
* @return the DOM <code>Element</code> representing the passed in
! * object
! */
public Element martial(EncryptedKey encryptedKey) {
! return factory.toElement(encryptedKey);
}
/**
* Martial an EncryptedKey
*
*** 725,741 ****
* represents the appropriate <code>EncryptedKey</code>
*
* @param context The document that will own the created nodes
* @param encryptedKey EncryptedKey object to martial
* @return the DOM <code>Element</code> representing the passed in
! * object */
!
public Element martial(Document context, EncryptedKey encryptedKey) {
! _contextDocument = context;
! return (_factory.toElement (encryptedKey));
}
/**
* Encrypts an <code>Element</code> and replaces it with its encrypted
* counterpart in the context <code>Document</code>, that is, the
--- 750,798 ----
* represents the appropriate <code>EncryptedKey</code>
*
* @param context The document that will own the created nodes
* @param encryptedKey EncryptedKey object to martial
* @return the DOM <code>Element</code> representing the passed in
! * object
! */
public Element martial(Document context, EncryptedKey encryptedKey) {
+ contextDocument = context;
+ return factory.toElement(encryptedKey);
+ }
! /**
! * Martial a ReferenceList
! *
! * Takes a ReferenceList object and returns a DOM Element that
! * represents the appropriate <code>ReferenceList</code>
! *
! * <p>
! * <b>Note:</b> This should only be used in cases where the context
! * document has been passed in via a call to doFinal.
! *
! * @param referenceList ReferenceList object to martial
! * @return the DOM <code>Element</code> representing the passed in
! * object
! */
! public Element martial(ReferenceList referenceList) {
! return factory.toElement(referenceList);
! }
+ /**
+ * Martial a ReferenceList
+ *
+ * Takes a ReferenceList object and returns a DOM Element that
+ * represents the appropriate <code>ReferenceList</code>
+ *
+ * @param context The document that will own the created nodes
+ * @param referenceList ReferenceList object to martial
+ * @return the DOM <code>Element</code> representing the passed in
+ * object
+ */
+ public Element martial(Document context, ReferenceList referenceList) {
+ contextDocument = context;
+ return factory.toElement(referenceList);
}
/**
* Encrypts an <code>Element</code> and replaces it with its encrypted
* counterpart in the context <code>Document</code>, that is, the
*** 745,773 ****
* @param element the <code>Element</code> to encrypt.
* @return the context <code>Document</code> with the encrypted
* <code>Element</code> having replaced the source <code>Element</code>.
* @throws Exception
*/
-
private Document encryptElement(Element element) throws Exception{
! logger.log(java.util.logging.Level.FINE, "Encrypting element...");
! if(null == element)
! logger.log(java.util.logging.Level.SEVERE, "Element unexpectedly null...");
! if(_cipherMode != ENCRYPT_MODE)
! logger.log(java.util.logging.Level.FINE, "XMLCipher unexpectedly not in ENCRYPT_MODE...");
! if (_algorithm == null) {
throw new XMLEncryptionException("XMLCipher instance without transformation specified");
}
! encryptData(_contextDocument, element, false);
! Element encryptedElement = _factory.toElement(_ed);
Node sourceParent = element.getParentNode();
sourceParent.replaceChild(encryptedElement, element);
! return (_contextDocument);
}
/**
* Encrypts a <code>NodeList</code> (the contents of an
* <code>Element</code>) and replaces its parent <code>Element</code>'s
--- 802,833 ----
* @param element the <code>Element</code> to encrypt.
* @return the context <code>Document</code> with the encrypted
* <code>Element</code> having replaced the source <code>Element</code>.
* @throws Exception
*/
private Document encryptElement(Element element) throws Exception{
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "Encrypting element...");
! }
! if (null == element) {
! log.log(java.util.logging.Level.SEVERE, "Element unexpectedly null...");
! }
! if (cipherMode != ENCRYPT_MODE && log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "XMLCipher unexpectedly not in ENCRYPT_MODE...");
! }
! if (algorithm == null) {
throw new XMLEncryptionException("XMLCipher instance without transformation specified");
}
! encryptData(contextDocument, element, false);
! Element encryptedElement = factory.toElement(ed);
Node sourceParent = element.getParentNode();
sourceParent.replaceChild(encryptedElement, element);
! return contextDocument;
}
/**
* Encrypts a <code>NodeList</code> (the contents of an
* <code>Element</code>) and replaces its parent <code>Element</code>'s
*** 780,808 ****
* @return the context <code>Document</code> with the encrypted
* <code>NodeList</code> having replaced the content of the source
* <code>Element</code>.
* @throws Exception
*/
! private Document encryptElementContent(Element element) throws
! /* XMLEncryption */Exception {
! logger.log(java.util.logging.Level.FINE, "Encrypting element content...");
! if(null == element)
! logger.log(java.util.logging.Level.SEVERE, "Element unexpectedly null...");
! if(_cipherMode != ENCRYPT_MODE)
! logger.log(java.util.logging.Level.FINE, "XMLCipher unexpectedly not in ENCRYPT_MODE...");
! if (_algorithm == null) {
throw new XMLEncryptionException("XMLCipher instance without transformation specified");
}
! encryptData(_contextDocument, element, true);
! Element encryptedElement = _factory.toElement(_ed);
removeContent(element);
element.appendChild(encryptedElement);
! return (_contextDocument);
}
/**
* Process a DOM <code>Document</code> node. The processing depends on the
* initialization parameters of {@link #init(int, Key) init()}.
--- 840,871 ----
* @return the context <code>Document</code> with the encrypted
* <code>NodeList</code> having replaced the content of the source
* <code>Element</code>.
* @throws Exception
*/
! private Document encryptElementContent(Element element) throws /* XMLEncryption */Exception {
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "Encrypting element content...");
! }
! if (null == element) {
! log.log(java.util.logging.Level.SEVERE, "Element unexpectedly null...");
! }
! if (cipherMode != ENCRYPT_MODE && log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "XMLCipher unexpectedly not in ENCRYPT_MODE...");
! }
! if (algorithm == null) {
throw new XMLEncryptionException("XMLCipher instance without transformation specified");
}
! encryptData(contextDocument, element, true);
! Element encryptedElement = factory.toElement(ed);
removeContent(element);
element.appendChild(encryptedElement);
! return contextDocument;
}
/**
* Process a DOM <code>Document</code> node. The processing depends on the
* initialization parameters of {@link #init(int, Key) init()}.
*** 810,848 ****
* @param context the context <code>Document</code>.
* @param source the <code>Document</code> to be encrypted or decrypted.
* @return the processed <code>Document</code>.
* @throws Exception to indicate any exceptional conditions.
*/
! public Document doFinal(Document context, Document source) throws
! /* XMLEncryption */Exception {
! logger.log(java.util.logging.Level.FINE, "Processing source document...");
! if(null == context)
! logger.log(java.util.logging.Level.SEVERE, "Context document unexpectedly null...");
! if(null == source)
! logger.log(java.util.logging.Level.SEVERE, "Source document unexpectedly null...");
! _contextDocument = context;
Document result = null;
! switch (_cipherMode) {
case DECRYPT_MODE:
result = decryptElement(source.getDocumentElement());
break;
case ENCRYPT_MODE:
result = encryptElement(source.getDocumentElement());
break;
case UNWRAP_MODE:
- break;
case WRAP_MODE:
break;
default:
! throw new XMLEncryptionException(
! "empty", new IllegalStateException());
}
! return (result);
}
/**
* Process a DOM <code>Element</code> node. The processing depends on the
* initialization parameters of {@link #init(int, Key) init()}.
--- 873,912 ----
* @param context the context <code>Document</code>.
* @param source the <code>Document</code> to be encrypted or decrypted.
* @return the processed <code>Document</code>.
* @throws Exception to indicate any exceptional conditions.
*/
! public Document doFinal(Document context, Document source) throws /* XMLEncryption */Exception {
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "Processing source document...");
! }
! if (null == context) {
! log.log(java.util.logging.Level.SEVERE, "Context document unexpectedly null...");
! }
! if (null == source) {
! log.log(java.util.logging.Level.SEVERE, "Source document unexpectedly null...");
! }
! contextDocument = context;
Document result = null;
! switch (cipherMode) {
case DECRYPT_MODE:
result = decryptElement(source.getDocumentElement());
break;
case ENCRYPT_MODE:
result = encryptElement(source.getDocumentElement());
break;
case UNWRAP_MODE:
case WRAP_MODE:
break;
default:
! throw new XMLEncryptionException("empty", new IllegalStateException());
}
! return result;
}
/**
* Process a DOM <code>Element</code> node. The processing depends on the
* initialization parameters of {@link #init(int, Key) init()}.
*** 850,888 ****
* @param context the context <code>Document</code>.
* @param element the <code>Element</code> to be encrypted.
* @return the processed <code>Document</code>.
* @throws Exception to indicate any exceptional conditions.
*/
! public Document doFinal(Document context, Element element) throws
! /* XMLEncryption */Exception {
! logger.log(java.util.logging.Level.FINE, "Processing source element...");
! if(null == context)
! logger.log(java.util.logging.Level.SEVERE, "Context document unexpectedly null...");
! if(null == element)
! logger.log(java.util.logging.Level.SEVERE, "Source element unexpectedly null...");
! _contextDocument = context;
Document result = null;
! switch (_cipherMode) {
case DECRYPT_MODE:
result = decryptElement(element);
break;
case ENCRYPT_MODE:
result = encryptElement(element);
break;
case UNWRAP_MODE:
- break;
case WRAP_MODE:
break;
default:
! throw new XMLEncryptionException(
! "empty", new IllegalStateException());
}
! return (result);
}
/**
* Process the contents of a DOM <code>Element</code> node. The processing
* depends on the initialization parameters of
--- 914,953 ----
* @param context the context <code>Document</code>.
* @param element the <code>Element</code> to be encrypted.
* @return the processed <code>Document</code>.
* @throws Exception to indicate any exceptional conditions.
*/
! public Document doFinal(Document context, Element element) throws /* XMLEncryption */Exception {
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "Processing source element...");
! }
! if (null == context) {
! log.log(java.util.logging.Level.SEVERE, "Context document unexpectedly null...");
! }
! if (null == element) {
! log.log(java.util.logging.Level.SEVERE, "Source element unexpectedly null...");
! }
! contextDocument = context;
Document result = null;
! switch (cipherMode) {
case DECRYPT_MODE:
result = decryptElement(element);
break;
case ENCRYPT_MODE:
result = encryptElement(element);
break;
case UNWRAP_MODE:
case WRAP_MODE:
break;
default:
! throw new XMLEncryptionException("empty", new IllegalStateException());
}
! return result;
}
/**
* Process the contents of a DOM <code>Element</code> node. The processing
* depends on the initialization parameters of
*** 895,915 ****
* @return the processed <code>Document</code>.
* @throws Exception to indicate any exceptional conditions.
*/
public Document doFinal(Document context, Element element, boolean content)
throws /* XMLEncryption*/ Exception {
! logger.log(java.util.logging.Level.FINE, "Processing source element...");
! if(null == context)
! logger.log(java.util.logging.Level.SEVERE, "Context document unexpectedly null...");
! if(null == element)
! logger.log(java.util.logging.Level.SEVERE, "Source element unexpectedly null...");
! _contextDocument = context;
Document result = null;
! switch (_cipherMode) {
case DECRYPT_MODE:
if (content) {
result = decryptElementContent(element);
} else {
result = decryptElement(element);
--- 960,984 ----
* @return the processed <code>Document</code>.
* @throws Exception to indicate any exceptional conditions.
*/
public Document doFinal(Document context, Element element, boolean content)
throws /* XMLEncryption*/ Exception {
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "Processing source element...");
! }
! if (null == context) {
! log.log(java.util.logging.Level.SEVERE, "Context document unexpectedly null...");
! }
! if (null == element) {
! log.log(java.util.logging.Level.SEVERE, "Source element unexpectedly null...");
! }
! contextDocument = context;
Document result = null;
! switch (cipherMode) {
case DECRYPT_MODE:
if (content) {
result = decryptElementContent(element);
} else {
result = decryptElement(element);
*** 921,947 ****
} else {
result = encryptElement(element);
}
break;
case UNWRAP_MODE:
- break;
case WRAP_MODE:
break;
default:
! throw new XMLEncryptionException(
! "empty", new IllegalStateException());
}
! return (result);
}
/**
* Returns an <code>EncryptedData</code> interface. Use this operation if
* you want to have full control over the contents of the
* <code>EncryptedData</code> structure.
*
! * this does not change the source document in any way.
*
* @param context the context <code>Document</code>.
* @param element the <code>Element</code> that will be encrypted.
* @return the <code>EncryptedData</code>
* @throws Exception
--- 990,1014 ----
} else {
result = encryptElement(element);
}
break;
case UNWRAP_MODE:
case WRAP_MODE:
break;
default:
! throw new XMLEncryptionException("empty", new IllegalStateException());
}
! return result;
}
/**
* Returns an <code>EncryptedData</code> interface. Use this operation if
* you want to have full control over the contents of the
* <code>EncryptedData</code> structure.
*
! * This does not change the source document in any way.
*
* @param context the context <code>Document</code>.
* @param element the <code>Element</code> that will be encrypted.
* @return the <code>EncryptedData</code>
* @throws Exception
*** 963,1079 ****
* of the encrypted content (may be <code>null</code>)
* @param serializedData the serialized data
* @return the <code>EncryptedData</code>
* @throws Exception
*/
! public EncryptedData encryptData(Document context, String type,
! InputStream serializedData) throws Exception {
!
! logger.log(java.util.logging.Level.FINE, "Encrypting element...");
! if (null == context)
! logger.log(java.util.logging.Level.SEVERE, "Context document unexpectedly null...");
! if (null == serializedData)
! logger.log(java.util.logging.Level.SEVERE, "Serialized data unexpectedly null...");
! if (_cipherMode != ENCRYPT_MODE)
! logger.log(java.util.logging.Level.FINE, "XMLCipher unexpectedly not in ENCRYPT_MODE...");
return encryptData(context, null, type, serializedData);
}
/**
* Returns an <code>EncryptedData</code> interface. Use this operation if
* you want to have full control over the contents of the
* <code>EncryptedData</code> structure.
*
! * this does not change the source document in any way.
*
* @param context the context <code>Document</code>.
* @param element the <code>Element</code> that will be encrypted.
* @param contentMode <code>true</code> to encrypt element's content only,
* <code>false</code> otherwise
* @return the <code>EncryptedData</code>
* @throws Exception
*/
public EncryptedData encryptData(
! Document context, Element element, boolean contentMode)
! throws /* XMLEncryption */ Exception {
!
! logger.log(java.util.logging.Level.FINE, "Encrypting element...");
! if (null == context)
! logger.log(java.util.logging.Level.SEVERE, "Context document unexpectedly null...");
! if (null == element)
! logger.log(java.util.logging.Level.SEVERE, "Element unexpectedly null...");
! if (_cipherMode != ENCRYPT_MODE)
! logger.log(java.util.logging.Level.FINE, "XMLCipher unexpectedly not in ENCRYPT_MODE...");
if (contentMode) {
! return encryptData
! (context, element, EncryptionConstants.TYPE_CONTENT, null);
} else {
! return encryptData
! (context, element, EncryptionConstants.TYPE_ELEMENT, null);
}
}
private EncryptedData encryptData(
! Document context, Element element, String type,
! InputStream serializedData) throws /* XMLEncryption */ Exception {
!
! _contextDocument = context;
! if (_algorithm == null) {
! throw new XMLEncryptionException
! ("XMLCipher instance without transformation specified");
}
! String serializedOctets = null;
if (serializedData == null) {
! if (type == EncryptionConstants.TYPE_CONTENT) {
NodeList children = element.getChildNodes();
if (null != children) {
! serializedOctets = _serializer.serialize(children);
} else {
Object exArgs[] = { "Element has no content." };
throw new XMLEncryptionException("empty", exArgs);
}
} else {
! serializedOctets = _serializer.serialize(element);
}
- logger.log(java.util.logging.Level.FINE, "Serialized octets:\n" + serializedOctets);
}
byte[] encryptedBytes = null;
// Now create the working cipher if none was created already
Cipher c;
! if (_contextCipher == null) {
! String jceAlgorithm = JCEMapper.translateURItoJCEID(_algorithm);
! logger.log(java.util.logging.Level.FINE, "alg = " + jceAlgorithm);
!
! try {
! if (_requestedJCEProvider == null)
! c = Cipher.getInstance(jceAlgorithm);
! else
! c = Cipher.getInstance(jceAlgorithm, _requestedJCEProvider);
! } catch (NoSuchAlgorithmException nsae) {
! throw new XMLEncryptionException("empty", nsae);
! } catch (NoSuchProviderException nspre) {
! throw new XMLEncryptionException("empty", nspre);
! } catch (NoSuchPaddingException nspae) {
! throw new XMLEncryptionException("empty", nspae);
! }
} else {
! c = _contextCipher;
}
// Now perform the encryption
try {
! // Should internally generate an IV
! // todo - allow user to set an IV
! c.init(_cipherMode, _key);
} catch (InvalidKeyException ike) {
throw new XMLEncryptionException("empty", ike);
}
try {
if (serializedData != null) {
int numBytes;
--- 1030,1151 ----
* of the encrypted content (may be <code>null</code>)
* @param serializedData the serialized data
* @return the <code>EncryptedData</code>
* @throws Exception
*/
! public EncryptedData encryptData(
! Document context, String type, InputStream serializedData
! ) throws Exception {
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "Encrypting element...");
! }
! if (null == context) {
! log.log(java.util.logging.Level.SEVERE, "Context document unexpectedly null...");
! }
! if (null == serializedData) {
! log.log(java.util.logging.Level.SEVERE, "Serialized data unexpectedly null...");
! }
! if (cipherMode != ENCRYPT_MODE && log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "XMLCipher unexpectedly not in ENCRYPT_MODE...");
! }
return encryptData(context, null, type, serializedData);
}
/**
* Returns an <code>EncryptedData</code> interface. Use this operation if
* you want to have full control over the contents of the
* <code>EncryptedData</code> structure.
*
! * This does not change the source document in any way.
*
* @param context the context <code>Document</code>.
* @param element the <code>Element</code> that will be encrypted.
* @param contentMode <code>true</code> to encrypt element's content only,
* <code>false</code> otherwise
* @return the <code>EncryptedData</code>
* @throws Exception
*/
public EncryptedData encryptData(
! Document context, Element element, boolean contentMode
! ) throws /* XMLEncryption */ Exception {
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "Encrypting element...");
! }
! if (null == context) {
! log.log(java.util.logging.Level.SEVERE, "Context document unexpectedly null...");
! }
! if (null == element) {
! log.log(java.util.logging.Level.SEVERE, "Element unexpectedly null...");
! }
! if (cipherMode != ENCRYPT_MODE && log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "XMLCipher unexpectedly not in ENCRYPT_MODE...");
! }
if (contentMode) {
! return encryptData(context, element, EncryptionConstants.TYPE_CONTENT, null);
} else {
! return encryptData(context, element, EncryptionConstants.TYPE_ELEMENT, null);
}
}
private EncryptedData encryptData(
! Document context, Element element, String type, InputStream serializedData
! ) throws /* XMLEncryption */ Exception {
! contextDocument = context;
! if (algorithm == null) {
! throw new XMLEncryptionException("XMLCipher instance without transformation specified");
}
! byte[] serializedOctets = null;
if (serializedData == null) {
! if (type.equals(EncryptionConstants.TYPE_CONTENT)) {
NodeList children = element.getChildNodes();
if (null != children) {
! serializedOctets = serializer.serializeToByteArray(children);
} else {
Object exArgs[] = { "Element has no content." };
throw new XMLEncryptionException("empty", exArgs);
}
} else {
! serializedOctets = serializer.serializeToByteArray(element);
! }
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "Serialized octets:\n" + new String(serializedOctets, "UTF-8"));
}
}
byte[] encryptedBytes = null;
// Now create the working cipher if none was created already
Cipher c;
! if (contextCipher == null) {
! c = constructCipher(algorithm, null);
} else {
! c = contextCipher;
}
// Now perform the encryption
try {
! // The Spec mandates a 96-bit IV for GCM algorithms
! if (AES_128_GCM.equals(algorithm) || AES_192_GCM.equals(algorithm)
! || AES_256_GCM.equals(algorithm)) {
! if (random == null) {
! random = SecureRandom.getInstance("SHA1PRNG");
! }
! byte[] temp = new byte[12];
! random.nextBytes(temp);
! IvParameterSpec paramSpec = new IvParameterSpec(temp);
! c.init(cipherMode, key, paramSpec);
! } else {
! c.init(cipherMode, key);
! }
} catch (InvalidKeyException ike) {
throw new XMLEncryptionException("empty", ike);
+ } catch (NoSuchAlgorithmException ex) {
+ throw new XMLEncryptionException("empty", ex);
}
try {
if (serializedData != null) {
int numBytes;
*** 1084,1100 ****
baos.write(data);
}
baos.write(c.doFinal());
encryptedBytes = baos.toByteArray();
} else {
! encryptedBytes = c.doFinal(serializedOctets.getBytes("UTF-8"));
! logger.log(java.util.logging.Level.FINE, "Expected cipher.outputSize = " +
! Integer.toString(c.getOutputSize(
! serializedOctets.getBytes().length)));
}
- logger.log(java.util.logging.Level.FINE, "Actual cipher.outputSize = " +
- Integer.toString(encryptedBytes.length));
} catch (IllegalStateException ise) {
throw new XMLEncryptionException("empty", ise);
} catch (IllegalBlockSizeException ibse) {
throw new XMLEncryptionException("empty", ibse);
} catch (BadPaddingException bpe) {
--- 1156,1175 ----
baos.write(data);
}
baos.write(c.doFinal());
encryptedBytes = baos.toByteArray();
} else {
! encryptedBytes = c.doFinal(serializedOctets);
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "Expected cipher.outputSize = " +
! Integer.toString(c.getOutputSize(serializedOctets.length)));
! }
! }
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "Actual cipher.outputSize = "
! + Integer.toString(encryptedBytes.length));
}
} catch (IllegalStateException ise) {
throw new XMLEncryptionException("empty", ise);
} catch (IllegalBlockSizeException ibse) {
throw new XMLEncryptionException("empty", ibse);
} catch (BadPaddingException bpe) {
*** 1104,1406 ****
}
// Now build up to a properly XML Encryption encoded octet stream
// IvParameterSpec iv;
byte[] iv = c.getIV();
! byte[] finalEncryptedBytes =
! new byte[iv.length + encryptedBytes.length];
System.arraycopy(iv, 0, finalEncryptedBytes, 0, iv.length);
! System.arraycopy(encryptedBytes, 0, finalEncryptedBytes, iv.length,
! encryptedBytes.length);
String base64EncodedEncryptedOctets = Base64.encode(finalEncryptedBytes);
! logger.log(java.util.logging.Level.FINE, "Encrypted octets:\n" + base64EncodedEncryptedOctets);
! logger.log(java.util.logging.Level.FINE, "Encrypted octets length = " +
! base64EncodedEncryptedOctets.length());
try {
! CipherData cd = _ed.getCipherData();
CipherValue cv = cd.getCipherValue();
// cv.setValue(base64EncodedEncryptedOctets.getBytes());
cv.setValue(base64EncodedEncryptedOctets);
if (type != null) {
! _ed.setType(new URI(type).toString());
}
EncryptionMethod method =
! _factory.newEncryptionMethod(new URI(_algorithm).toString());
! _ed.setEncryptionMethod(method);
! } catch (URI.MalformedURIException mfue) {
! throw new XMLEncryptionException("empty", mfue);
}
! return (_ed);
}
/**
* Returns an <code>EncryptedData</code> interface. Use this operation if
* you want to load an <code>EncryptedData</code> structure from a DOM
! * structure and manipulate the contents
*
* @param context the context <code>Document</code>.
* @param element the <code>Element</code> that will be loaded
* @throws XMLEncryptionException
! * @return
*/
public EncryptedData loadEncryptedData(Document context, Element element)
throws XMLEncryptionException {
! logger.log(java.util.logging.Level.FINE, "Loading encrypted element...");
! if(null == context)
! logger.log(java.util.logging.Level.SEVERE, "Context document unexpectedly null...");
! if(null == element)
! logger.log(java.util.logging.Level.SEVERE, "Element unexpectedly null...");
! if(_cipherMode != DECRYPT_MODE)
! logger.log(java.util.logging.Level.SEVERE, "XMLCipher unexpectedly not in DECRYPT_MODE...");
! _contextDocument = context;
! _ed = _factory.newEncryptedData(element);
! return (_ed);
}
/**
* Returns an <code>EncryptedKey</code> interface. Use this operation if
* you want to load an <code>EncryptedKey</code> structure from a DOM
* structure and manipulate the contents.
*
* @param context the context <code>Document</code>.
* @param element the <code>Element</code> that will be loaded
! * @return
* @throws XMLEncryptionException
*/
-
public EncryptedKey loadEncryptedKey(Document context, Element element)
throws XMLEncryptionException {
! logger.log(java.util.logging.Level.FINE, "Loading encrypted key...");
! if(null == context)
! logger.log(java.util.logging.Level.SEVERE, "Context document unexpectedly null...");
! if(null == element)
! logger.log(java.util.logging.Level.SEVERE, "Element unexpectedly null...");
! if(_cipherMode != UNWRAP_MODE && _cipherMode != DECRYPT_MODE)
! logger.log(java.util.logging.Level.FINE, "XMLCipher unexpectedly not in UNWRAP_MODE or DECRYPT_MODE...");
!
! _contextDocument = context;
! _ek = _factory.newEncryptedKey(element);
! return (_ek);
}
/**
* Returns an <code>EncryptedKey</code> interface. Use this operation if
* you want to load an <code>EncryptedKey</code> structure from a DOM
* structure and manipulate the contents.
*
* Assumes that the context document is the document that owns the element
*
* @param element the <code>Element</code> that will be loaded
! * @return
* @throws XMLEncryptionException
*/
!
! public EncryptedKey loadEncryptedKey(Element element)
! throws XMLEncryptionException {
!
! return (loadEncryptedKey(element.getOwnerDocument(), element));
}
/**
* Encrypts a key to an EncryptedKey structure
*
* @param doc the Context document that will be used to general DOM
* @param key Key to encrypt (will use previously set KEK to
* perform encryption
! * @return
* @throws XMLEncryptionException
*/
! public EncryptedKey encryptKey(Document doc, Key key) throws
! XMLEncryptionException {
!
! logger.log(java.util.logging.Level.FINE, "Encrypting key ...");
!
! if(null == key)
! logger.log(java.util.logging.Level.SEVERE, "Key unexpectedly null...");
! if(_cipherMode != WRAP_MODE)
! logger.log(java.util.logging.Level.FINE, "XMLCipher unexpectedly not in WRAP_MODE...");
!
! if (_algorithm == null) {
throw new XMLEncryptionException("XMLCipher instance without transformation specified");
}
! _contextDocument = doc;
byte[] encryptedBytes = null;
Cipher c;
! if (_contextCipher == null) {
// Now create the working cipher
!
! String jceAlgorithm =
! JCEMapper.translateURItoJCEID(_algorithm);
!
! logger.log(java.util.logging.Level.FINE, "alg = " + jceAlgorithm);
!
! try {
! if (_requestedJCEProvider == null)
! c = Cipher.getInstance(jceAlgorithm);
! else
! c = Cipher.getInstance(jceAlgorithm, _requestedJCEProvider);
! } catch (NoSuchAlgorithmException nsae) {
! throw new XMLEncryptionException("empty", nsae);
! } catch (NoSuchProviderException nspre) {
! throw new XMLEncryptionException("empty", nspre);
! } catch (NoSuchPaddingException nspae) {
! throw new XMLEncryptionException("empty", nspae);
! }
} else {
! c = _contextCipher;
}
// Now perform the encryption
try {
// Should internally generate an IV
// todo - allow user to set an IV
! c.init(Cipher.WRAP_MODE, _key);
encryptedBytes = c.wrap(key);
} catch (InvalidKeyException ike) {
throw new XMLEncryptionException("empty", ike);
} catch (IllegalBlockSizeException ibse) {
throw new XMLEncryptionException("empty", ibse);
}
String base64EncodedEncryptedOctets = Base64.encode(encryptedBytes);
! logger.log(java.util.logging.Level.FINE, "Encrypted key octets:\n" + base64EncodedEncryptedOctets);
! logger.log(java.util.logging.Level.FINE, "Encrypted key octets length = " +
! base64EncodedEncryptedOctets.length());
!
! CipherValue cv = _ek.getCipherData().getCipherValue();
cv.setValue(base64EncodedEncryptedOctets);
try {
! EncryptionMethod method = _factory.newEncryptionMethod(
! new URI(_algorithm).toString());
! _ek.setEncryptionMethod(method);
! } catch (URI.MalformedURIException mfue) {
! throw new XMLEncryptionException("empty", mfue);
}
! return _ek;
!
}
/**
* Decrypt a key from a passed in EncryptedKey structure
*
* @param encryptedKey Previously loaded EncryptedKey that needs
* to be decrypted.
* @param algorithm Algorithm for the decryption
! * @return a key corresponding to the give type
* @throws XMLEncryptionException
*/
! public Key decryptKey(EncryptedKey encryptedKey, String algorithm) throws
! XMLEncryptionException {
!
! logger.log(java.util.logging.Level.FINE, "Decrypting key from previously loaded EncryptedKey...");
!
! if(_cipherMode != UNWRAP_MODE)
! logger.log(java.util.logging.Level.FINE, "XMLCipher unexpectedly not in UNWRAP_MODE...");
if (algorithm == null) {
throw new XMLEncryptionException("Cannot decrypt a key without knowing the algorithm");
}
! if (_key == null) {
!
! logger.log(java.util.logging.Level.FINE, "Trying to find a KEK via key resolvers");
KeyInfo ki = encryptedKey.getKeyInfo();
if (ki != null) {
try {
! _key = ki.getSecretKey();
}
catch (Exception e) {
}
}
! if (_key == null) {
! logger.log(java.util.logging.Level.SEVERE, "XMLCipher::decryptKey called without a KEK and cannot resolve");
throw new XMLEncryptionException("Unable to decrypt without a KEK");
}
}
// Obtain the encrypted octets
XMLCipherInput cipherInput = new XMLCipherInput(encryptedKey);
! byte [] encryptedBytes = cipherInput.getBytes();
! String jceKeyAlgorithm =
! JCEMapper.getJCEKeyAlgorithmFromURI(algorithm);
Cipher c;
! if (_contextCipher == null) {
// Now create the working cipher
! String jceAlgorithm =
! JCEMapper.translateURItoJCEID(
! encryptedKey.getEncryptionMethod().getAlgorithm());
! logger.log(java.util.logging.Level.FINE, "JCE Algorithm = " + jceAlgorithm);
try {
! if (_requestedJCEProvider == null)
c = Cipher.getInstance(jceAlgorithm);
! else
! c = Cipher.getInstance(jceAlgorithm, _requestedJCEProvider);
} catch (NoSuchAlgorithmException nsae) {
throw new XMLEncryptionException("empty", nsae);
} catch (NoSuchProviderException nspre) {
throw new XMLEncryptionException("empty", nspre);
} catch (NoSuchPaddingException nspae) {
throw new XMLEncryptionException("empty", nspae);
}
- } else {
- c = _contextCipher;
- }
-
- Key ret;
-
- try {
- c.init(Cipher.UNWRAP_MODE, _key);
- ret = c.unwrap(encryptedBytes, jceKeyAlgorithm, Cipher.SECRET_KEY);
-
- } catch (InvalidKeyException ike) {
- throw new XMLEncryptionException("empty", ike);
- } catch (NoSuchAlgorithmException nsae) {
- throw new XMLEncryptionException("empty", nsae);
- }
-
- logger.log(java.util.logging.Level.FINE, "Decryption of key type " + algorithm + " OK");
-
- return ret;
}
/**
* Decrypt a key from a passed in EncryptedKey structure. This version
* is used mainly internally, when the cipher already has an
* EncryptedData loaded. The algorithm URI will be read from the
* EncryptedData
*
* @param encryptedKey Previously loaded EncryptedKey that needs
* to be decrypted.
! * @return a key corresponding to the give type
* @throws XMLEncryptionException
*/
!
! public Key decryptKey(EncryptedKey encryptedKey) throws
! XMLEncryptionException {
!
! return decryptKey(encryptedKey, _ed.getEncryptionMethod().getAlgorithm());
!
}
/**
* Removes the contents of a <code>Node</code>.
*
--- 1179,1591 ----
}
// Now build up to a properly XML Encryption encoded octet stream
// IvParameterSpec iv;
byte[] iv = c.getIV();
! byte[] finalEncryptedBytes = new byte[iv.length + encryptedBytes.length];
System.arraycopy(iv, 0, finalEncryptedBytes, 0, iv.length);
! System.arraycopy(encryptedBytes, 0, finalEncryptedBytes, iv.length, encryptedBytes.length);
String base64EncodedEncryptedOctets = Base64.encode(finalEncryptedBytes);
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "Encrypted octets:\n" + base64EncodedEncryptedOctets);
! log.log(java.util.logging.Level.FINE, "Encrypted octets length = " + base64EncodedEncryptedOctets.length());
! }
try {
! CipherData cd = ed.getCipherData();
CipherValue cv = cd.getCipherValue();
// cv.setValue(base64EncodedEncryptedOctets.getBytes());
cv.setValue(base64EncodedEncryptedOctets);
if (type != null) {
! ed.setType(new URI(type).toString());
}
EncryptionMethod method =
! factory.newEncryptionMethod(new URI(algorithm).toString());
! method.setDigestAlgorithm(digestAlg);
! ed.setEncryptionMethod(method);
! } catch (URISyntaxException ex) {
! throw new XMLEncryptionException("empty", ex);
}
! return ed;
}
/**
* Returns an <code>EncryptedData</code> interface. Use this operation if
* you want to load an <code>EncryptedData</code> structure from a DOM
! * structure and manipulate the contents.
*
* @param context the context <code>Document</code>.
* @param element the <code>Element</code> that will be loaded
* @throws XMLEncryptionException
! * @return the <code>EncryptedData</code>
*/
public EncryptedData loadEncryptedData(Document context, Element element)
throws XMLEncryptionException {
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "Loading encrypted element...");
! }
! if (null == context) {
! throw new NullPointerException("Context document unexpectedly null...");
! }
! if (null == element) {
! throw new NullPointerException("Element unexpectedly null...");
! }
! if (cipherMode != DECRYPT_MODE) {
! throw new XMLEncryptionException("XMLCipher unexpectedly not in DECRYPT_MODE...");
! }
! contextDocument = context;
! ed = factory.newEncryptedData(element);
! return ed;
}
/**
* Returns an <code>EncryptedKey</code> interface. Use this operation if
* you want to load an <code>EncryptedKey</code> structure from a DOM
* structure and manipulate the contents.
*
* @param context the context <code>Document</code>.
* @param element the <code>Element</code> that will be loaded
! * @return the <code>EncryptedKey</code>
* @throws XMLEncryptionException
*/
public EncryptedKey loadEncryptedKey(Document context, Element element)
throws XMLEncryptionException {
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "Loading encrypted key...");
! }
! if (null == context) {
! throw new NullPointerException("Context document unexpectedly null...");
! }
! if (null == element) {
! throw new NullPointerException("Element unexpectedly null...");
! }
! if (cipherMode != UNWRAP_MODE && cipherMode != DECRYPT_MODE) {
! throw new XMLEncryptionException(
! "XMLCipher unexpectedly not in UNWRAP_MODE or DECRYPT_MODE..."
! );
! }
!
! contextDocument = context;
! ek = factory.newEncryptedKey(element);
! return ek;
}
/**
* Returns an <code>EncryptedKey</code> interface. Use this operation if
* you want to load an <code>EncryptedKey</code> structure from a DOM
* structure and manipulate the contents.
*
* Assumes that the context document is the document that owns the element
*
* @param element the <code>Element</code> that will be loaded
! * @return the <code>EncryptedKey</code>
* @throws XMLEncryptionException
*/
! public EncryptedKey loadEncryptedKey(Element element) throws XMLEncryptionException {
! return loadEncryptedKey(element.getOwnerDocument(), element);
}
/**
* Encrypts a key to an EncryptedKey structure
*
* @param doc the Context document that will be used to general DOM
* @param key Key to encrypt (will use previously set KEK to
* perform encryption
! * @return the <code>EncryptedKey</code>
* @throws XMLEncryptionException
*/
+ public EncryptedKey encryptKey(Document doc, Key key) throws XMLEncryptionException {
+ return encryptKey(doc, key, null, null);
+ }
! /**
! * Encrypts a key to an EncryptedKey structure
! *
! * @param doc the Context document that will be used to general DOM
! * @param key Key to encrypt (will use previously set KEK to
! * perform encryption
! * @param mgfAlgorithm The xenc11 MGF Algorithm to use
! * @param oaepParams The OAEPParams to use
! * @return the <code>EncryptedKey</code>
! * @throws XMLEncryptionException
! */
! public EncryptedKey encryptKey(
! Document doc,
! Key key,
! String mgfAlgorithm,
! byte[] oaepParams
! ) throws XMLEncryptionException {
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "Encrypting key ...");
! }
+ if (null == key) {
+ log.log(java.util.logging.Level.SEVERE, "Key unexpectedly null...");
+ }
+ if (cipherMode != WRAP_MODE) {
+ log.log(java.util.logging.Level.FINE, "XMLCipher unexpectedly not in WRAP_MODE...");
+ }
+ if (algorithm == null) {
throw new XMLEncryptionException("XMLCipher instance without transformation specified");
}
! contextDocument = doc;
byte[] encryptedBytes = null;
Cipher c;
! if (contextCipher == null) {
// Now create the working cipher
! c = constructCipher(algorithm, null);
} else {
! c = contextCipher;
}
// Now perform the encryption
try {
// Should internally generate an IV
// todo - allow user to set an IV
! OAEPParameterSpec oaepParameters =
! constructOAEPParameters(
! algorithm, digestAlg, mgfAlgorithm, oaepParams
! );
! if (oaepParameters == null) {
! c.init(Cipher.WRAP_MODE, this.key);
! } else {
! c.init(Cipher.WRAP_MODE, this.key, oaepParameters);
! }
encryptedBytes = c.wrap(key);
} catch (InvalidKeyException ike) {
throw new XMLEncryptionException("empty", ike);
} catch (IllegalBlockSizeException ibse) {
throw new XMLEncryptionException("empty", ibse);
+ } catch (InvalidAlgorithmParameterException e) {
+ throw new XMLEncryptionException("empty", e);
}
String base64EncodedEncryptedOctets = Base64.encode(encryptedBytes);
+ if (log.isLoggable(java.util.logging.Level.FINE)) {
+ log.log(java.util.logging.Level.FINE, "Encrypted key octets:\n" + base64EncodedEncryptedOctets);
+ log.log(java.util.logging.Level.FINE, "Encrypted key octets length = " + base64EncodedEncryptedOctets.length());
+ }
! CipherValue cv = ek.getCipherData().getCipherValue();
cv.setValue(base64EncodedEncryptedOctets);
try {
! EncryptionMethod method = factory.newEncryptionMethod(new URI(algorithm).toString());
! method.setDigestAlgorithm(digestAlg);
! method.setMGFAlgorithm(mgfAlgorithm);
! method.setOAEPparams(oaepParams);
! ek.setEncryptionMethod(method);
! } catch (URISyntaxException ex) {
! throw new XMLEncryptionException("empty", ex);
}
! return ek;
}
/**
* Decrypt a key from a passed in EncryptedKey structure
*
* @param encryptedKey Previously loaded EncryptedKey that needs
* to be decrypted.
* @param algorithm Algorithm for the decryption
! * @return a key corresponding to the given type
* @throws XMLEncryptionException
*/
+ public Key decryptKey(EncryptedKey encryptedKey, String algorithm)
+ throws XMLEncryptionException {
+ if (log.isLoggable(java.util.logging.Level.FINE)) {
+ log.log(java.util.logging.Level.FINE, "Decrypting key from previously loaded EncryptedKey...");
+ }
! if (cipherMode != UNWRAP_MODE && log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "XMLCipher unexpectedly not in UNWRAP_MODE...");
! }
if (algorithm == null) {
throw new XMLEncryptionException("Cannot decrypt a key without knowing the algorithm");
}
! if (key == null) {
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "Trying to find a KEK via key resolvers");
! }
KeyInfo ki = encryptedKey.getKeyInfo();
if (ki != null) {
+ ki.setSecureValidation(secureValidation);
try {
! String keyWrapAlg = encryptedKey.getEncryptionMethod().getAlgorithm();
! String keyType = JCEMapper.getJCEKeyAlgorithmFromURI(keyWrapAlg);
! if ("RSA".equals(keyType)) {
! key = ki.getPrivateKey();
! } else {
! key = ki.getSecretKey();
! }
}
catch (Exception e) {
+ if (log.isLoggable(java.util.logging.Level.FINE)) {
+ log.log(java.util.logging.Level.FINE, e.getMessage(), e);
+ }
}
}
! if (key == null) {
! log.log(java.util.logging.Level.SEVERE, "XMLCipher::decryptKey called without a KEK and cannot resolve");
throw new XMLEncryptionException("Unable to decrypt without a KEK");
}
}
// Obtain the encrypted octets
XMLCipherInput cipherInput = new XMLCipherInput(encryptedKey);
! cipherInput.setSecureValidation(secureValidation);
! byte[] encryptedBytes = cipherInput.getBytes();
! String jceKeyAlgorithm = JCEMapper.getJCEKeyAlgorithmFromURI(algorithm);
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "JCE Key Algorithm: " + jceKeyAlgorithm);
! }
Cipher c;
! if (contextCipher == null) {
// Now create the working cipher
+ c =
+ constructCipher(
+ encryptedKey.getEncryptionMethod().getAlgorithm(),
+ encryptedKey.getEncryptionMethod().getDigestAlgorithm()
+ );
+ } else {
+ c = contextCipher;
+ }
+
+ Key ret;
+
+ try {
+ EncryptionMethod encMethod = encryptedKey.getEncryptionMethod();
+ OAEPParameterSpec oaepParameters =
+ constructOAEPParameters(
+ encMethod.getAlgorithm(), encMethod.getDigestAlgorithm(),
+ encMethod.getMGFAlgorithm(), encMethod.getOAEPparams()
+ );
+ if (oaepParameters == null) {
+ c.init(Cipher.UNWRAP_MODE, key);
+ } else {
+ c.init(Cipher.UNWRAP_MODE, key, oaepParameters);
+ }
+ ret = c.unwrap(encryptedBytes, jceKeyAlgorithm, Cipher.SECRET_KEY);
+ } catch (InvalidKeyException ike) {
+ throw new XMLEncryptionException("empty", ike);
+ } catch (NoSuchAlgorithmException nsae) {
+ throw new XMLEncryptionException("empty", nsae);
+ } catch (InvalidAlgorithmParameterException e) {
+ throw new XMLEncryptionException("empty", e);
+ }
+ if (log.isLoggable(java.util.logging.Level.FINE)) {
+ log.log(java.util.logging.Level.FINE, "Decryption of key type " + algorithm + " OK");
+ }
+
+ return ret;
+ }
+
+ /**
+ * Construct an OAEPParameterSpec object from the given parameters
+ */
+ private OAEPParameterSpec constructOAEPParameters(
+ String encryptionAlgorithm,
+ String digestAlgorithm,
+ String mgfAlgorithm,
+ byte[] oaepParams
+ ) {
+ if (XMLCipher.RSA_OAEP.equals(encryptionAlgorithm)
+ || XMLCipher.RSA_OAEP_11.equals(encryptionAlgorithm)) {
+
+ String jceDigestAlgorithm = "SHA-1";
+ if (digestAlgorithm != null) {
+ jceDigestAlgorithm = JCEMapper.translateURItoJCEID(digestAlgorithm);
+ }
+
+ PSource.PSpecified pSource = PSource.PSpecified.DEFAULT;
+ if (oaepParams != null) {
+ pSource = new PSource.PSpecified(oaepParams);
+ }
+
+ MGF1ParameterSpec mgfParameterSpec = new MGF1ParameterSpec("SHA-1");
+ if (XMLCipher.RSA_OAEP_11.equals(encryptionAlgorithm)) {
+ if (EncryptionConstants.MGF1_SHA256.equals(mgfAlgorithm)) {
+ mgfParameterSpec = new MGF1ParameterSpec("SHA-256");
+ } else if (EncryptionConstants.MGF1_SHA384.equals(mgfAlgorithm)) {
+ mgfParameterSpec = new MGF1ParameterSpec("SHA-384");
+ } else if (EncryptionConstants.MGF1_SHA512.equals(mgfAlgorithm)) {
+ mgfParameterSpec = new MGF1ParameterSpec("SHA-512");
+ }
+ }
+ return new OAEPParameterSpec(jceDigestAlgorithm, "MGF1", mgfParameterSpec, pSource);
+ }
! return null;
! }
! /**
! * Construct a Cipher object
! */
! private Cipher constructCipher(String algorithm, String digestAlgorithm) throws XMLEncryptionException {
! String jceAlgorithm = JCEMapper.translateURItoJCEID(algorithm);
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "JCE Algorithm = " + jceAlgorithm);
! }
+ Cipher c;
try {
! if (requestedJCEProvider == null) {
c = Cipher.getInstance(jceAlgorithm);
! } else {
! c = Cipher.getInstance(jceAlgorithm, requestedJCEProvider);
! }
} catch (NoSuchAlgorithmException nsae) {
+ // Check to see if an RSA OAEP MGF-1 with SHA-1 algorithm was requested
+ // Some JDKs don't support RSA/ECB/OAEPPadding
+ if (XMLCipher.RSA_OAEP.equals(algorithm)
+ && (digestAlgorithm == null
+ || MessageDigestAlgorithm.ALGO_ID_DIGEST_SHA1.equals(digestAlgorithm))) {
+ try {
+ if (requestedJCEProvider == null) {
+ c = Cipher.getInstance("RSA/ECB/OAEPWithSHA1AndMGF1Padding");
+ } else {
+ c = Cipher.getInstance("RSA/ECB/OAEPWithSHA1AndMGF1Padding", requestedJCEProvider);
+ }
+ } catch (Exception ex) {
+ throw new XMLEncryptionException("empty", ex);
+ }
+ } else {
throw new XMLEncryptionException("empty", nsae);
+ }
} catch (NoSuchProviderException nspre) {
throw new XMLEncryptionException("empty", nspre);
} catch (NoSuchPaddingException nspae) {
throw new XMLEncryptionException("empty", nspae);
}
+ return c;
}
/**
* Decrypt a key from a passed in EncryptedKey structure. This version
* is used mainly internally, when the cipher already has an
* EncryptedData loaded. The algorithm URI will be read from the
* EncryptedData
*
* @param encryptedKey Previously loaded EncryptedKey that needs
* to be decrypted.
! * @return a key corresponding to the given type
* @throws XMLEncryptionException
*/
! public Key decryptKey(EncryptedKey encryptedKey) throws XMLEncryptionException {
! return decryptKey(encryptedKey, ed.getEncryptionMethod().getAlgorithm());
}
/**
* Removes the contents of a <code>Node</code>.
*
*** 1417,1550 ****
*
* @param element the <code>EncryptedData</code> to decrypt.
* @return the <code>Node</code> as a result of the decrypt operation.
* @throws XMLEncryptionException
*/
! private Document decryptElement(Element element) throws
! XMLEncryptionException {
!
! logger.log(java.util.logging.Level.FINE, "Decrypting element...");
!
! if(_cipherMode != DECRYPT_MODE)
! logger.log(java.util.logging.Level.SEVERE, "XMLCipher unexpectedly not in DECRYPT_MODE...");
! String octets;
! try {
! octets = new String(decryptToByteArray(element), "UTF-8");
! } catch (UnsupportedEncodingException uee) {
! throw new XMLEncryptionException("empty", uee);
}
! logger.log(java.util.logging.Level.FINE, "Decrypted octets:\n" + octets);
Node sourceParent = element.getParentNode();
! DocumentFragment decryptedFragment =
! _serializer.deserialize(octets, sourceParent);
!
!
! // The de-serialiser returns a fragment whose children we need to
! // take on.
!
! if (sourceParent != null && sourceParent.getNodeType() == Node.DOCUMENT_NODE) {
!
// If this is a content decryption, this may have problems
!
! _contextDocument.removeChild(_contextDocument.getDocumentElement());
! _contextDocument.appendChild(decryptedFragment);
! }
! else {
! sourceParent.replaceChild(decryptedFragment, element);
!
}
! return (_contextDocument);
}
-
/**
*
* @param element
! * @return
* @throws XMLEncryptionException
*/
! private Document decryptElementContent(Element element) throws
! XMLEncryptionException {
! Element e = (Element) element.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
! EncryptionConstants._TAG_ENCRYPTEDDATA).item(0);
if (null == e) {
throw new XMLEncryptionException("No EncryptedData child element.");
}
! return (decryptElement(e));
}
/**
! * Decrypt an EncryptedData element to a byte array
*
* When passed in an EncryptedData node, returns the decryption
* as a byte array.
*
! * Does not modify the source document
* @param element
! * @return
* @throws XMLEncryptionException
*/
! public byte[] decryptToByteArray(Element element)
! throws XMLEncryptionException {
!
! logger.log(java.util.logging.Level.FINE, "Decrypting to ByteArray...");
!
! if(_cipherMode != DECRYPT_MODE)
! logger.log(java.util.logging.Level.SEVERE, "XMLCipher unexpectedly not in DECRYPT_MODE...");
!
! EncryptedData encryptedData = _factory.newEncryptedData(element);
! if (_key == null) {
KeyInfo ki = encryptedData.getKeyInfo();
-
if (ki != null) {
try {
! // Add a EncryptedKey resolver
! ki.registerInternalKeyResolver(
! new EncryptedKeyResolver(encryptedData.
! getEncryptionMethod().
! getAlgorithm(),
! _kek));
! _key = ki.getSecretKey();
} catch (KeyResolverException kre) {
! // We will throw in a second...
}
}
! if (_key == null) {
! logger.log(java.util.logging.Level.SEVERE, "XMLCipher::decryptElement called without a key and unable to resolve");
!
throw new XMLEncryptionException("encryption.nokey");
}
}
// Obtain the encrypted octets
XMLCipherInput cipherInput = new XMLCipherInput(encryptedData);
! byte [] encryptedBytes = cipherInput.getBytes();
// Now create the working cipher
-
String jceAlgorithm =
JCEMapper.translateURItoJCEID(encryptedData.getEncryptionMethod().getAlgorithm());
Cipher c;
try {
! if (_requestedJCEProvider == null)
c = Cipher.getInstance(jceAlgorithm);
! else
! c = Cipher.getInstance(jceAlgorithm, _requestedJCEProvider);
} catch (NoSuchAlgorithmException nsae) {
throw new XMLEncryptionException("empty", nsae);
} catch (NoSuchProviderException nspre) {
throw new XMLEncryptionException("empty", nspre);
} catch (NoSuchPaddingException nspae) {
--- 1602,1733 ----
*
* @param element the <code>EncryptedData</code> to decrypt.
* @return the <code>Node</code> as a result of the decrypt operation.
* @throws XMLEncryptionException
*/
! private Document decryptElement(Element element) throws XMLEncryptionException {
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "Decrypting element...");
! }
! if (cipherMode != DECRYPT_MODE) {
! log.log(java.util.logging.Level.SEVERE, "XMLCipher unexpectedly not in DECRYPT_MODE...");
}
+ byte[] octets = decryptToByteArray(element);
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "Decrypted octets:\n" + new String(octets));
! }
Node sourceParent = element.getParentNode();
+ Node decryptedNode = serializer.deserialize(octets, sourceParent);
! // The de-serialiser returns a node whose children we need to take on.
! if (sourceParent != null && Node.DOCUMENT_NODE == sourceParent.getNodeType()) {
// If this is a content decryption, this may have problems
! contextDocument.removeChild(contextDocument.getDocumentElement());
! contextDocument.appendChild(decryptedNode);
! } else if (sourceParent != null) {
! sourceParent.replaceChild(decryptedNode, element);
}
! return contextDocument;
}
/**
*
* @param element
! * @return the <code>Node</code> as a result of the decrypt operation.
* @throws XMLEncryptionException
*/
! private Document decryptElementContent(Element element) throws XMLEncryptionException {
! Element e =
! (Element) element.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
! EncryptionConstants._TAG_ENCRYPTEDDATA
! ).item(0);
if (null == e) {
throw new XMLEncryptionException("No EncryptedData child element.");
}
! return decryptElement(e);
}
/**
! * Decrypt an EncryptedData element to a byte array.
*
* When passed in an EncryptedData node, returns the decryption
* as a byte array.
*
! * Does not modify the source document.
* @param element
! * @return the bytes resulting from the decryption
* @throws XMLEncryptionException
*/
+ public byte[] decryptToByteArray(Element element) throws XMLEncryptionException {
+ if (log.isLoggable(java.util.logging.Level.FINE)) {
+ log.log(java.util.logging.Level.FINE, "Decrypting to ByteArray...");
+ }
! if (cipherMode != DECRYPT_MODE) {
! log.log(java.util.logging.Level.SEVERE, "XMLCipher unexpectedly not in DECRYPT_MODE...");
! }
! EncryptedData encryptedData = factory.newEncryptedData(element);
+ if (key == null) {
KeyInfo ki = encryptedData.getKeyInfo();
if (ki != null) {
try {
! // Add an EncryptedKey resolver
! String encMethodAlgorithm = encryptedData.getEncryptionMethod().getAlgorithm();
! EncryptedKeyResolver resolver = new EncryptedKeyResolver(encMethodAlgorithm, kek);
! if (internalKeyResolvers != null) {
! int size = internalKeyResolvers.size();
! for (int i = 0; i < size; i++) {
! resolver.registerInternalKeyResolver(internalKeyResolvers.get(i));
! }
! }
! ki.registerInternalKeyResolver(resolver);
! ki.setSecureValidation(secureValidation);
! key = ki.getSecretKey();
} catch (KeyResolverException kre) {
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, kre.getMessage(), kre);
! }
}
}
! if (key == null) {
! log.log(java.util.logging.Level.SEVERE,
! "XMLCipher::decryptElement called without a key and unable to resolve"
! );
throw new XMLEncryptionException("encryption.nokey");
}
}
// Obtain the encrypted octets
XMLCipherInput cipherInput = new XMLCipherInput(encryptedData);
! cipherInput.setSecureValidation(secureValidation);
! byte[] encryptedBytes = cipherInput.getBytes();
// Now create the working cipher
String jceAlgorithm =
JCEMapper.translateURItoJCEID(encryptedData.getEncryptionMethod().getAlgorithm());
+ if (log.isLoggable(java.util.logging.Level.FINE)) {
+ log.log(java.util.logging.Level.FINE, "JCE Algorithm = " + jceAlgorithm);
+ }
Cipher c;
try {
! if (requestedJCEProvider == null) {
c = Cipher.getInstance(jceAlgorithm);
! } else {
! c = Cipher.getInstance(jceAlgorithm, requestedJCEProvider);
! }
} catch (NoSuchAlgorithmException nsae) {
throw new XMLEncryptionException("empty", nsae);
} catch (NoSuchProviderException nspre) {
throw new XMLEncryptionException("empty", nspre);
} catch (NoSuchPaddingException nspae) {
*** 1555,1564 ****
--- 1738,1751 ----
// For now, we only work with Block ciphers, so this will work.
// This should probably be put into the JCE mapper.
int ivLen = c.getBlockSize();
+ String alg = encryptedData.getEncryptionMethod().getAlgorithm();
+ if (AES_128_GCM.equals(alg) || AES_192_GCM.equals(alg) || AES_256_GCM.equals(alg)) {
+ ivLen = 12;
+ }
byte[] ivBytes = new byte[ivLen];
// You may be able to pass the entire piece in to IvParameterSpec
// and it will only take the first x bytes, but no way to be certain
// that this will work for every JCE provider, so lets copy the
*** 1566,1596 ****
System.arraycopy(encryptedBytes, 0, ivBytes, 0, ivLen);
IvParameterSpec iv = new IvParameterSpec(ivBytes);
try {
! c.init(_cipherMode, _key, iv);
} catch (InvalidKeyException ike) {
throw new XMLEncryptionException("empty", ike);
} catch (InvalidAlgorithmParameterException iape) {
throw new XMLEncryptionException("empty", iape);
}
- byte[] plainBytes;
-
try {
! plainBytes = c.doFinal(encryptedBytes,
! ivLen,
! encryptedBytes.length - ivLen);
!
} catch (IllegalBlockSizeException ibse) {
throw new XMLEncryptionException("empty", ibse);
} catch (BadPaddingException bpe) {
throw new XMLEncryptionException("empty", bpe);
}
-
- return (plainBytes);
}
/*
* Expose the interface for creating XML Encryption objects
*/
--- 1753,1776 ----
System.arraycopy(encryptedBytes, 0, ivBytes, 0, ivLen);
IvParameterSpec iv = new IvParameterSpec(ivBytes);
try {
! c.init(cipherMode, key, iv);
} catch (InvalidKeyException ike) {
throw new XMLEncryptionException("empty", ike);
} catch (InvalidAlgorithmParameterException iape) {
throw new XMLEncryptionException("empty", iape);
}
try {
! return c.doFinal(encryptedBytes, ivLen, encryptedBytes.length - ivLen);
} catch (IllegalBlockSizeException ibse) {
throw new XMLEncryptionException("empty", ibse);
} catch (BadPaddingException bpe) {
throw new XMLEncryptionException("empty", bpe);
}
}
/*
* Expose the interface for creating XML Encryption objects
*/
*** 1627,1658 ****
* <EncryptionProperties/>[OPT]
* </EncryptedData>
* -->
* @throws XMLEncryptionException
*/
!
! public EncryptedData createEncryptedData(int type, String value) throws
! XMLEncryptionException {
EncryptedData result = null;
CipherData data = null;
switch (type) {
case CipherData.REFERENCE_TYPE:
! CipherReference cipherReference = _factory.newCipherReference(
! value);
! data = _factory.newCipherData(type);
data.setCipherReference(cipherReference);
! result = _factory.newEncryptedData(data);
break;
case CipherData.VALUE_TYPE:
! CipherValue cipherValue = _factory.newCipherValue(value);
! data = _factory.newCipherData(type);
data.setCipherValue(cipherValue);
! result = _factory.newEncryptedData(data);
}
! return (result);
}
/**
* Creates an <code>EncryptedKey</code> <code>Element</code>.
*
--- 1807,1835 ----
* <EncryptionProperties/>[OPT]
* </EncryptedData>
* -->
* @throws XMLEncryptionException
*/
! public EncryptedData createEncryptedData(int type, String value) throws XMLEncryptionException {
EncryptedData result = null;
CipherData data = null;
switch (type) {
case CipherData.REFERENCE_TYPE:
! CipherReference cipherReference = factory.newCipherReference(value);
! data = factory.newCipherData(type);
data.setCipherReference(cipherReference);
! result = factory.newEncryptedData(data);
break;
case CipherData.VALUE_TYPE:
! CipherValue cipherValue = factory.newCipherValue(value);
! data = factory.newCipherData(type);
data.setCipherValue(cipherValue);
! result = factory.newEncryptedData(data);
}
! return result;
}
/**
* Creates an <code>EncryptedKey</code> <code>Element</code>.
*
*** 1685,2231 ****
* <EncryptionProperties/>[OPT]
* </EncryptedData>
* -->
* @throws XMLEncryptionException
*/
!
! public EncryptedKey createEncryptedKey(int type, String value) throws
! XMLEncryptionException {
EncryptedKey result = null;
CipherData data = null;
switch (type) {
case CipherData.REFERENCE_TYPE:
! CipherReference cipherReference = _factory.newCipherReference(
! value);
! data = _factory.newCipherData(type);
data.setCipherReference(cipherReference);
! result = _factory.newEncryptedKey(data);
break;
case CipherData.VALUE_TYPE:
! CipherValue cipherValue = _factory.newCipherValue(value);
! data = _factory.newCipherData(type);
data.setCipherValue(cipherValue);
! result = _factory.newEncryptedKey(data);
}
! return (result);
}
/**
* Create an AgreementMethod object
*
* @param algorithm Algorithm of the agreement method
! * @return
*/
-
public AgreementMethod createAgreementMethod(String algorithm) {
! return (_factory.newAgreementMethod(algorithm));
}
/**
* Create a CipherData object
*
* @param type Type of this CipherData (either VALUE_TUPE or
* REFERENCE_TYPE)
! * @return
*/
-
public CipherData createCipherData(int type) {
! return (_factory.newCipherData(type));
}
/**
* Create a CipherReference object
*
- * @return
* @param uri The URI that the reference will refer
*/
-
public CipherReference createCipherReference(String uri) {
! return (_factory.newCipherReference(uri));
}
/**
* Create a CipherValue element
*
* @param value The value to set the ciphertext to
! * @return
*/
-
public CipherValue createCipherValue(String value) {
! return (_factory.newCipherValue(value));
}
/**
! * Create an EncryptedMethod object
*
* @param algorithm Algorithm for the encryption
! * @return
*/
public EncryptionMethod createEncryptionMethod(String algorithm) {
! return (_factory.newEncryptionMethod(algorithm));
}
/**
! * Create an EncryptedProperties element
! * @return
*/
public EncryptionProperties createEncryptionProperties() {
! return (_factory.newEncryptionProperties());
}
/**
* Create a new EncryptionProperty element
! * @return
*/
public EncryptionProperty createEncryptionProperty() {
! return (_factory.newEncryptionProperty());
}
/**
* Create a new ReferenceList object
! * @return
! * @param type
*/
public ReferenceList createReferenceList(int type) {
! return (_factory.newReferenceList(type));
}
/**
* Create a new Transforms object
* <p>
* <b>Note</b>: A context document <i>must</i> have been set
* elsewhere (possibly via a call to doFinal). If not, use the
* createTransforms(Document) method.
! * @return
*/
-
public Transforms createTransforms() {
! return (_factory.newTransforms());
}
/**
* Create a new Transforms object
*
* Because the handling of Transforms is currently done in the signature
* code, the creation of a Transforms object <b>requires</b> a
* context document.
*
* @param doc Document that will own the created Transforms node
! * @return
*/
public Transforms createTransforms(Document doc) {
! return (_factory.newTransforms(doc));
! }
!
! /**
! * Converts <code>String</code>s into <code>Node</code>s and visa versa.
! * <p>
! * <b>NOTE:</b> For internal use only.
! *
! * @author Axl Mattheus
! */
!
! private class Serializer {
! /**
! * Initialize the <code>XMLSerializer</code> with the specified context
! * <code>Document</code>.
! * <p/>
! * Setup OutputFormat in a way that the serialization does <b>not</b>
! * modifiy the contents, that is it shall not do any pretty printing
! * and so on. This would destroy the original content before
! * encryption. If that content was signed before encryption and the
! * serialization modifies the content the signature verification will
! * fail.
! */
! Serializer() {
! }
!
! /**
! * Returns a <code>String</code> representation of the specified
! * <code>Document</code>.
! * <p/>
! * Refer also to comments about setup of format.
! *
! * @param document the <code>Document</code> to serialize.
! * @return the <code>String</code> representation of the serilaized
! * <code>Document</code>.
! * @throws Exception
! */
! String serialize(Document document) throws Exception {
! return canonSerialize(document);
! }
!
! /**
! * Returns a <code>String</code> representation of the specified
! * <code>Element</code>.
! * <p/>
! * Refer also to comments about setup of format.
! *
! * @param element the <code>Element</code> to serialize.
! * @return the <code>String</code> representation of the serilaized
! * <code>Element</code>.
! * @throws Exception
! */
! String serialize(Element element) throws Exception {
! return canonSerialize(element);
! }
!
! /**
! * Returns a <code>String</code> representation of the specified
! * <code>NodeList</code>.
! * <p/>
! * This is a special case because the NodeList may represent a
! * <code>DocumentFragment</code>. A document fragement may be a
! * non-valid XML document (refer to appropriate description of
! * W3C) because it my start with a non-element node, e.g. a text
! * node.
! * <p/>
! * The methods first converts the node list into a document fragment.
! * Special care is taken to not destroy the current document, thus
! * the method clones the nodes (deep cloning) before it appends
! * them to the document fragment.
! * <p/>
! * Refer also to comments about setup of format.
! *
! * @param content the <code>NodeList</code> to serialize.
! * @return the <code>String</code> representation of the serilaized
! * <code>NodeList</code>.
! * @throws Exception
! */
! String serialize(NodeList content) throws Exception { //XMLEncryptionException {
! ByteArrayOutputStream baos = new ByteArrayOutputStream();
! _canon.setWriter(baos);
! _canon.notReset();
! for (int i = 0; i < content.getLength(); i++) {
! _canon.canonicalizeSubtree(content.item(i));
! }
! baos.close();
! return baos.toString("UTF-8");
! }
!
! /**
! * Use the Canoncializer to serialize the node
! * @param node
! * @return
! * @throws Exception
! */
! String canonSerialize(Node node) throws Exception {
! ByteArrayOutputStream baos = new ByteArrayOutputStream();
! _canon.setWriter(baos);
! _canon.notReset();
! _canon.canonicalizeSubtree(node);
! baos.close();
! return baos.toString("UTF-8");
! }
! /**
! * @param source
! * @param ctx
! * @return
! * @throws XMLEncryptionException
! *
! */
! DocumentFragment deserialize(String source, Node ctx) throws XMLEncryptionException {
! DocumentFragment result;
! final String tagname = "fragment";
!
! // Create the context to parse the document against
! StringBuffer sb;
!
! sb = new StringBuffer();
! sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?><"+tagname);
!
! // Run through each node up to the document node and find any
! // xmlns: nodes
!
! Node wk = ctx;
!
! while (wk != null) {
!
! NamedNodeMap atts = wk.getAttributes();
! int length;
! if (atts != null)
! length = atts.getLength();
! else
! length = 0;
!
! for (int i = 0 ; i < length ; ++i) {
! Node att = atts.item(i);
! if (att.getNodeName().startsWith("xmlns:") ||
! att.getNodeName().equals("xmlns")) {
!
! // Check to see if this node has already been found
! Node p = ctx;
! boolean found = false;
! while (p != wk) {
! NamedNodeMap tstAtts = p.getAttributes();
! if (tstAtts != null &&
! tstAtts.getNamedItem(att.getNodeName()) != null) {
! found = true;
! break;
! }
! p = p.getParentNode();
! }
! if (found == false) {
!
! // This is an attribute node
! sb.append(" " + att.getNodeName() + "=\"" +
! att.getNodeValue() + "\"");
! }
! }
! }
! wk = wk.getParentNode();
}
- sb.append(">" + source + "</" + tagname + ">");
- String fragment = sb.toString();
-
- try {
- DocumentBuilderFactory dbf =
- DocumentBuilderFactory.newInstance();
- dbf.setNamespaceAware(true);
- dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, Boolean.TRUE);
- dbf.setAttribute("http://xml.org/sax/features/namespaces", Boolean.TRUE);
- DocumentBuilder db = dbf.newDocumentBuilder();
- Document d = db.parse(
- new InputSource(new StringReader(fragment)));
-
- Element fragElt = (Element) _contextDocument.importNode(
- d.getDocumentElement(), true);
- result = _contextDocument.createDocumentFragment();
- Node child = fragElt.getFirstChild();
- while (child != null) {
- fragElt.removeChild(child);
- result.appendChild(child);
- child = fragElt.getFirstChild();
- }
- // String outp = serialize(d);
-
- } catch (SAXException se) {
- throw new XMLEncryptionException("empty", se);
- } catch (ParserConfigurationException pce) {
- throw new XMLEncryptionException("empty", pce);
- } catch (IOException ioe) {
- throw new XMLEncryptionException("empty", ioe);
- }
-
- return (result);
- }
- }
-
/**
*
* @author Axl Mattheus
*/
private class Factory {
/**
* @param algorithm
! * @return
! *
*/
AgreementMethod newAgreementMethod(String algorithm) {
! return (new AgreementMethodImpl(algorithm));
}
/**
* @param type
! * @return
*
*/
CipherData newCipherData(int type) {
! return (new CipherDataImpl(type));
}
/**
* @param uri
! * @return
! *
*/
CipherReference newCipherReference(String uri) {
! return (new CipherReferenceImpl(uri));
}
/**
* @param value
! * @return
! *
*/
CipherValue newCipherValue(String value) {
! return (new CipherValueImpl(value));
}
! /**
! *
!
CipherValue newCipherValue(byte[] value) {
! return (new CipherValueImpl(value));
}
*/
/**
* @param data
! * @return
! *
*/
EncryptedData newEncryptedData(CipherData data) {
! return (new EncryptedDataImpl(data));
}
/**
* @param data
! * @return
! *
*/
EncryptedKey newEncryptedKey(CipherData data) {
! return (new EncryptedKeyImpl(data));
}
/**
* @param algorithm
! * @return
! *
*/
EncryptionMethod newEncryptionMethod(String algorithm) {
! return (new EncryptionMethodImpl(algorithm));
}
/**
! * @return
! *
*/
EncryptionProperties newEncryptionProperties() {
! return (new EncryptionPropertiesImpl());
}
/**
! * @return
! *
*/
EncryptionProperty newEncryptionProperty() {
! return (new EncryptionPropertyImpl());
}
/**
! * @param type
! * @return
! *
*/
ReferenceList newReferenceList(int type) {
! return (new ReferenceListImpl(type));
}
/**
! * @return
! *
*/
Transforms newTransforms() {
! return (new TransformsImpl());
}
/**
* @param doc
! * @return
! *
*/
Transforms newTransforms(Document doc) {
! return (new TransformsImpl(doc));
! }
!
! /**
! * @param element
! * @return
! * @throws XMLEncryptionException
! *
! */
! // <element name="AgreementMethod" type="xenc:AgreementMethodType"/>
! // <complexType name="AgreementMethodType" mixed="true">
! // <sequence>
! // <element name="KA-Nonce" minOccurs="0" type="base64Binary"/>
! // <!-- <element ref="ds:DigestMethod" minOccurs="0"/> -->
! // <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
! // <element name="OriginatorKeyInfo" minOccurs="0" type="ds:KeyInfoType"/>
! // <element name="RecipientKeyInfo" minOccurs="0" type="ds:KeyInfoType"/>
! // </sequence>
! // <attribute name="Algorithm" type="anyURI" use="required"/>
! // </complexType>
! AgreementMethod newAgreementMethod(Element element) throws
! XMLEncryptionException {
! if (null == element) {
! throw new NullPointerException("element is null");
! }
!
! String algorithm = element.getAttributeNS(null,
! EncryptionConstants._ATT_ALGORITHM);
! AgreementMethod result = newAgreementMethod(algorithm);
!
! Element kaNonceElement = (Element) element.getElementsByTagNameNS(
! EncryptionConstants.EncryptionSpecNS,
! EncryptionConstants._TAG_KA_NONCE).item(0);
! if (null != kaNonceElement) {
! result.setKANonce(kaNonceElement.getNodeValue().getBytes());
! }
! // TODO: ///////////////////////////////////////////////////////////
! // Figure out how to make this pesky line work..
! // <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
!
! // TODO: Work out how to handle relative URI
!
! Element originatorKeyInfoElement =
! (Element) element.getElementsByTagNameNS(
! EncryptionConstants.EncryptionSpecNS,
! EncryptionConstants._TAG_ORIGINATORKEYINFO).item(0);
! if (null != originatorKeyInfoElement) {
! try {
! result.setOriginatorKeyInfo(
! new KeyInfo(originatorKeyInfoElement, null));
! } catch (XMLSecurityException xse) {
! throw new XMLEncryptionException("empty", xse);
! }
! }
!
! // TODO: Work out how to handle relative URI
!
! Element recipientKeyInfoElement =
! (Element) element.getElementsByTagNameNS(
! EncryptionConstants.EncryptionSpecNS,
! EncryptionConstants._TAG_RECIPIENTKEYINFO).item(0);
! if (null != recipientKeyInfoElement) {
! try {
! result.setRecipientKeyInfo(
! new KeyInfo(recipientKeyInfoElement, null));
! } catch (XMLSecurityException xse) {
! throw new XMLEncryptionException("empty", xse);
! }
! }
!
! return (result);
}
/**
* @param element
! * @return
* @throws XMLEncryptionException
- *
*/
! // <element name='CipherData' type='xenc:CipherDataType'/>
! // <complexType name='CipherDataType'>
! // <choice>
! // <element name='CipherValue' type='base64Binary'/>
! // <element ref='xenc:CipherReference'/>
! // </choice>
! // </complexType>
! CipherData newCipherData(Element element) throws
! XMLEncryptionException {
if (null == element) {
throw new NullPointerException("element is null");
}
int type = 0;
Element e = null;
if (element.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
! EncryptionConstants._TAG_CIPHERVALUE).getLength() > 0) {
type = CipherData.VALUE_TYPE;
e = (Element) element.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
EncryptionConstants._TAG_CIPHERVALUE).item(0);
} else if (element.getElementsByTagNameNS(
--- 1862,2115 ----
* <EncryptionProperties/>[OPT]
* </EncryptedData>
* -->
* @throws XMLEncryptionException
*/
! public EncryptedKey createEncryptedKey(int type, String value) throws XMLEncryptionException {
EncryptedKey result = null;
CipherData data = null;
switch (type) {
case CipherData.REFERENCE_TYPE:
! CipherReference cipherReference = factory.newCipherReference(value);
! data = factory.newCipherData(type);
data.setCipherReference(cipherReference);
! result = factory.newEncryptedKey(data);
break;
case CipherData.VALUE_TYPE:
! CipherValue cipherValue = factory.newCipherValue(value);
! data = factory.newCipherData(type);
data.setCipherValue(cipherValue);
! result = factory.newEncryptedKey(data);
}
! return result;
}
/**
* Create an AgreementMethod object
*
* @param algorithm Algorithm of the agreement method
! * @return a new <code>AgreementMethod</code>
*/
public AgreementMethod createAgreementMethod(String algorithm) {
! return factory.newAgreementMethod(algorithm);
}
/**
* Create a CipherData object
*
* @param type Type of this CipherData (either VALUE_TUPE or
* REFERENCE_TYPE)
! * @return a new <code>CipherData</code>
*/
public CipherData createCipherData(int type) {
! return factory.newCipherData(type);
}
/**
* Create a CipherReference object
*
* @param uri The URI that the reference will refer
+ * @return a new <code>CipherReference</code>
*/
public CipherReference createCipherReference(String uri) {
! return factory.newCipherReference(uri);
}
/**
* Create a CipherValue element
*
* @param value The value to set the ciphertext to
! * @return a new <code>CipherValue</code>
*/
public CipherValue createCipherValue(String value) {
! return factory.newCipherValue(value);
}
/**
! * Create an EncryptionMethod object
*
* @param algorithm Algorithm for the encryption
! * @return a new <code>EncryptionMethod</code>
*/
public EncryptionMethod createEncryptionMethod(String algorithm) {
! return factory.newEncryptionMethod(algorithm);
}
/**
! * Create an EncryptionProperties element
! * @return a new <code>EncryptionProperties</code>
*/
public EncryptionProperties createEncryptionProperties() {
! return factory.newEncryptionProperties();
}
/**
* Create a new EncryptionProperty element
! * @return a new <code>EncryptionProperty</code>
*/
public EncryptionProperty createEncryptionProperty() {
! return factory.newEncryptionProperty();
}
/**
* Create a new ReferenceList object
! * @param type ReferenceList.DATA_REFERENCE or ReferenceList.KEY_REFERENCE
! * @return a new <code>ReferenceList</code>
*/
public ReferenceList createReferenceList(int type) {
! return factory.newReferenceList(type);
}
/**
* Create a new Transforms object
* <p>
* <b>Note</b>: A context document <i>must</i> have been set
* elsewhere (possibly via a call to doFinal). If not, use the
* createTransforms(Document) method.
! * @return a new <code>Transforms</code>
*/
public Transforms createTransforms() {
! return factory.newTransforms();
}
/**
* Create a new Transforms object
*
* Because the handling of Transforms is currently done in the signature
* code, the creation of a Transforms object <b>requires</b> a
* context document.
*
* @param doc Document that will own the created Transforms node
! * @return a new <code>Transforms</code>
*/
public Transforms createTransforms(Document doc) {
! return factory.newTransforms(doc);
}
/**
*
* @author Axl Mattheus
*/
private class Factory {
/**
* @param algorithm
! * @return a new AgreementMethod
*/
AgreementMethod newAgreementMethod(String algorithm) {
! return new AgreementMethodImpl(algorithm);
}
/**
* @param type
! * @return a new CipherData
*
*/
CipherData newCipherData(int type) {
! return new CipherDataImpl(type);
}
/**
* @param uri
! * @return a new CipherReference
*/
CipherReference newCipherReference(String uri) {
! return new CipherReferenceImpl(uri);
}
/**
* @param value
! * @return a new CipherValue
*/
CipherValue newCipherValue(String value) {
! return new CipherValueImpl(value);
}
! /*
CipherValue newCipherValue(byte[] value) {
! return new CipherValueImpl(value);
}
*/
+
/**
* @param data
! * @return a new EncryptedData
*/
EncryptedData newEncryptedData(CipherData data) {
! return new EncryptedDataImpl(data);
}
/**
* @param data
! * @return a new EncryptedKey
*/
EncryptedKey newEncryptedKey(CipherData data) {
! return new EncryptedKeyImpl(data);
}
/**
* @param algorithm
! * @return a new EncryptionMethod
*/
EncryptionMethod newEncryptionMethod(String algorithm) {
! return new EncryptionMethodImpl(algorithm);
}
/**
! * @return a new EncryptionProperties
*/
EncryptionProperties newEncryptionProperties() {
! return new EncryptionPropertiesImpl();
}
/**
! * @return a new EncryptionProperty
*/
EncryptionProperty newEncryptionProperty() {
! return new EncryptionPropertyImpl();
}
/**
! * @param type ReferenceList.DATA_REFERENCE or ReferenceList.KEY_REFERENCE
! * @return a new ReferenceList
*/
ReferenceList newReferenceList(int type) {
! return new ReferenceListImpl(type);
}
/**
! * @return a new Transforms
*/
Transforms newTransforms() {
! return new TransformsImpl();
}
/**
* @param doc
! * @return a new Transforms
*/
Transforms newTransforms(Document doc) {
! return new TransformsImpl(doc);
}
/**
* @param element
! * @return a new CipherData
* @throws XMLEncryptionException
*/
! CipherData newCipherData(Element element) throws XMLEncryptionException {
if (null == element) {
throw new NullPointerException("element is null");
}
int type = 0;
Element e = null;
if (element.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
! EncryptionConstants._TAG_CIPHERVALUE).getLength() > 0
! ) {
type = CipherData.VALUE_TYPE;
e = (Element) element.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
EncryptionConstants._TAG_CIPHERVALUE).item(0);
} else if (element.getElementsByTagNameNS(
*** 2242,2345 ****
result.setCipherValue(newCipherValue(e));
} else if (type == CipherData.REFERENCE_TYPE) {
result.setCipherReference(newCipherReference(e));
}
! return (result);
}
/**
* @param element
! * @return
* @throws XMLEncryptionException
*
*/
! // <element name='CipherReference' type='xenc:CipherReferenceType'/>
! // <complexType name='CipherReferenceType'>
! // <sequence>
! // <element name='Transforms' type='xenc:TransformsType' minOccurs='0'/>
! // </sequence>
! // <attribute name='URI' type='anyURI' use='required'/>
! // </complexType>
! CipherReference newCipherReference(Element element) throws
! XMLEncryptionException {
! Attr URIAttr =
element.getAttributeNodeNS(null, EncryptionConstants._ATT_URI);
! CipherReference result = new CipherReferenceImpl(URIAttr);
// Find any Transforms
!
! NodeList transformsElements = element.getElementsByTagNameNS(
! EncryptionConstants.EncryptionSpecNS,
! EncryptionConstants._TAG_TRANSFORMS);
! Element transformsElement =
! (Element) transformsElements.item(0);
if (transformsElement != null) {
! logger.log(java.util.logging.Level.FINE, "Creating a DSIG based Transforms element");
try {
result.setTransforms(new TransformsImpl(transformsElement));
! }
! catch (XMLSignatureException xse) {
throw new XMLEncryptionException("empty", xse);
} catch (InvalidTransformException ite) {
throw new XMLEncryptionException("empty", ite);
} catch (XMLSecurityException xse) {
throw new XMLEncryptionException("empty", xse);
}
-
}
return result;
}
/**
* @param element
! * @return
! *
*/
CipherValue newCipherValue(Element element) {
String value = XMLUtils.getFullTextChildrenFromElement(element);
! CipherValue result = newCipherValue(value);
!
! return (result);
}
/**
* @param element
! * @return
* @throws XMLEncryptionException
*
*/
! // <complexType name='EncryptedType' abstract='true'>
! // <sequence>
! // <element name='EncryptionMethod' type='xenc:EncryptionMethodType'
! // minOccurs='0'/>
! // <element ref='ds:KeyInfo' minOccurs='0'/>
! // <element ref='xenc:CipherData'/>
! // <element ref='xenc:EncryptionProperties' minOccurs='0'/>
! // </sequence>
! // <attribute name='Id' type='ID' use='optional'/>
! // <attribute name='Type' type='anyURI' use='optional'/>
! // <attribute name='MimeType' type='string' use='optional'/>
! // <attribute name='Encoding' type='anyURI' use='optional'/>
! // </complexType>
! // <element name='EncryptedData' type='xenc:EncryptedDataType'/>
! // <complexType name='EncryptedDataType'>
! // <complexContent>
! // <extension base='xenc:EncryptedType'/>
! // </complexContent>
! // </complexType>
! EncryptedData newEncryptedData(Element element) throws
! XMLEncryptionException {
EncryptedData result = null;
! NodeList dataElements = element.getElementsByTagNameNS(
! EncryptionConstants.EncryptionSpecNS,
! EncryptionConstants._TAG_CIPHERDATA);
// Need to get the last CipherData found, as earlier ones will
// be for elements in the KeyInfo lists
Element dataElement =
--- 2126,2196 ----
result.setCipherValue(newCipherValue(e));
} else if (type == CipherData.REFERENCE_TYPE) {
result.setCipherReference(newCipherReference(e));
}
! return result;
}
/**
* @param element
! * @return a new CipherReference
* @throws XMLEncryptionException
*
*/
! CipherReference newCipherReference(Element element) throws XMLEncryptionException {
! Attr uriAttr =
element.getAttributeNodeNS(null, EncryptionConstants._ATT_URI);
! CipherReference result = new CipherReferenceImpl(uriAttr);
// Find any Transforms
! NodeList transformsElements =
! element.getElementsByTagNameNS(
! EncryptionConstants.EncryptionSpecNS, EncryptionConstants._TAG_TRANSFORMS);
! Element transformsElement = (Element) transformsElements.item(0);
if (transformsElement != null) {
! if (log.isLoggable(java.util.logging.Level.FINE)) {
! log.log(java.util.logging.Level.FINE, "Creating a DSIG based Transforms element");
! }
try {
result.setTransforms(new TransformsImpl(transformsElement));
! } catch (XMLSignatureException xse) {
throw new XMLEncryptionException("empty", xse);
} catch (InvalidTransformException ite) {
throw new XMLEncryptionException("empty", ite);
} catch (XMLSecurityException xse) {
throw new XMLEncryptionException("empty", xse);
}
}
return result;
}
/**
* @param element
! * @return a new CipherValue
*/
CipherValue newCipherValue(Element element) {
String value = XMLUtils.getFullTextChildrenFromElement(element);
! return newCipherValue(value);
}
/**
* @param element
! * @return a new EncryptedData
* @throws XMLEncryptionException
*
*/
! EncryptedData newEncryptedData(Element element) throws XMLEncryptionException {
EncryptedData result = null;
! NodeList dataElements =
! element.getElementsByTagNameNS(
! EncryptionConstants.EncryptionSpecNS, EncryptionConstants._TAG_CIPHERDATA);
// Need to get the last CipherData found, as earlier ones will
// be for elements in the KeyInfo lists
Element dataElement =
*** 2347,2485 ****
CipherData data = newCipherData(dataElement);
result = newEncryptedData(data);
! result.setId(element.getAttributeNS(
! null, EncryptionConstants._ATT_ID));
! result.setType(
! element.getAttributeNS(null, EncryptionConstants._ATT_TYPE));
! result.setMimeType(element.getAttributeNS(
! null, EncryptionConstants._ATT_MIMETYPE));
! result.setEncoding(
! element.getAttributeNS(null, Constants._ATT_ENCODING));
Element encryptionMethodElement =
(Element) element.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
EncryptionConstants._TAG_ENCRYPTIONMETHOD).item(0);
if (null != encryptionMethodElement) {
! result.setEncryptionMethod(newEncryptionMethod(
! encryptionMethodElement));
}
// BFL 16/7/03 - simple implementation
// TODO: Work out how to handle relative URI
Element keyInfoElement =
(Element) element.getElementsByTagNameNS(
Constants.SignatureSpecNS, Constants._TAG_KEYINFO).item(0);
if (null != keyInfoElement) {
! try {
! result.setKeyInfo(new KeyInfo(keyInfoElement, null));
! } catch (XMLSecurityException xse) {
! throw new XMLEncryptionException("Error loading Key Info",
! xse);
! }
}
// TODO: Implement
Element encryptionPropertiesElement =
(Element) element.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
EncryptionConstants._TAG_ENCRYPTIONPROPERTIES).item(0);
if (null != encryptionPropertiesElement) {
result.setEncryptionProperties(
! newEncryptionProperties(encryptionPropertiesElement));
}
! return (result);
}
/**
* @param element
! * @return
* @throws XMLEncryptionException
- *
*/
! // <complexType name='EncryptedType' abstract='true'>
! // <sequence>
! // <element name='EncryptionMethod' type='xenc:EncryptionMethodType'
! // minOccurs='0'/>
! // <element ref='ds:KeyInfo' minOccurs='0'/>
! // <element ref='xenc:CipherData'/>
! // <element ref='xenc:EncryptionProperties' minOccurs='0'/>
! // </sequence>
! // <attribute name='Id' type='ID' use='optional'/>
! // <attribute name='Type' type='anyURI' use='optional'/>
! // <attribute name='MimeType' type='string' use='optional'/>
! // <attribute name='Encoding' type='anyURI' use='optional'/>
! // </complexType>
! // <element name='EncryptedKey' type='xenc:EncryptedKeyType'/>
! // <complexType name='EncryptedKeyType'>
! // <complexContent>
! // <extension base='xenc:EncryptedType'>
! // <sequence>
! // <element ref='xenc:ReferenceList' minOccurs='0'/>
! // <element name='CarriedKeyName' type='string' minOccurs='0'/>
! // </sequence>
! // <attribute name='Recipient' type='string' use='optional'/>
! // </extension>
! // </complexContent>
! // </complexType>
! EncryptedKey newEncryptedKey(Element element) throws
! XMLEncryptionException {
EncryptedKey result = null;
! NodeList dataElements = element.getElementsByTagNameNS(
! EncryptionConstants.EncryptionSpecNS,
! EncryptionConstants._TAG_CIPHERDATA);
Element dataElement =
(Element) dataElements.item(dataElements.getLength() - 1);
CipherData data = newCipherData(dataElement);
result = newEncryptedKey(data);
! result.setId(element.getAttributeNS(
! null, EncryptionConstants._ATT_ID));
! result.setType(
! element.getAttributeNS(null, EncryptionConstants._ATT_TYPE));
! result.setMimeType(element.getAttributeNS(
! null, EncryptionConstants._ATT_MIMETYPE));
! result.setEncoding(
! element.getAttributeNS(null, Constants._ATT_ENCODING));
! result.setRecipient(element.getAttributeNS(
! null, EncryptionConstants._ATT_RECIPIENT));
Element encryptionMethodElement =
(Element) element.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
EncryptionConstants._TAG_ENCRYPTIONMETHOD).item(0);
if (null != encryptionMethodElement) {
! result.setEncryptionMethod(newEncryptionMethod(
! encryptionMethodElement));
}
Element keyInfoElement =
(Element) element.getElementsByTagNameNS(
Constants.SignatureSpecNS, Constants._TAG_KEYINFO).item(0);
if (null != keyInfoElement) {
! try {
! result.setKeyInfo(new KeyInfo(keyInfoElement, null));
! } catch (XMLSecurityException xse) {
! throw new XMLEncryptionException
! ("Error loading Key Info", xse);
! }
}
// TODO: Implement
Element encryptionPropertiesElement =
(Element) element.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
EncryptionConstants._TAG_ENCRYPTIONPROPERTIES).item(0);
if (null != encryptionPropertiesElement) {
result.setEncryptionProperties(
! newEncryptionProperties(encryptionPropertiesElement));
}
Element referenceListElement =
(Element) element.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
--- 2198,2292 ----
CipherData data = newCipherData(dataElement);
result = newEncryptedData(data);
! result.setId(element.getAttributeNS(null, EncryptionConstants._ATT_ID));
! result.setType(element.getAttributeNS(null, EncryptionConstants._ATT_TYPE));
! result.setMimeType(element.getAttributeNS(null, EncryptionConstants._ATT_MIMETYPE));
! result.setEncoding( element.getAttributeNS(null, Constants._ATT_ENCODING));
Element encryptionMethodElement =
(Element) element.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
EncryptionConstants._TAG_ENCRYPTIONMETHOD).item(0);
if (null != encryptionMethodElement) {
! result.setEncryptionMethod(newEncryptionMethod(encryptionMethodElement));
}
// BFL 16/7/03 - simple implementation
// TODO: Work out how to handle relative URI
Element keyInfoElement =
(Element) element.getElementsByTagNameNS(
Constants.SignatureSpecNS, Constants._TAG_KEYINFO).item(0);
if (null != keyInfoElement) {
! KeyInfo ki = newKeyInfo(keyInfoElement);
! result.setKeyInfo(ki);
}
// TODO: Implement
Element encryptionPropertiesElement =
(Element) element.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
EncryptionConstants._TAG_ENCRYPTIONPROPERTIES).item(0);
if (null != encryptionPropertiesElement) {
result.setEncryptionProperties(
! newEncryptionProperties(encryptionPropertiesElement)
! );
}
! return result;
}
/**
* @param element
! * @return a new EncryptedKey
* @throws XMLEncryptionException
*/
! EncryptedKey newEncryptedKey(Element element) throws XMLEncryptionException {
EncryptedKey result = null;
! NodeList dataElements =
! element.getElementsByTagNameNS(
! EncryptionConstants.EncryptionSpecNS, EncryptionConstants._TAG_CIPHERDATA);
Element dataElement =
(Element) dataElements.item(dataElements.getLength() - 1);
CipherData data = newCipherData(dataElement);
result = newEncryptedKey(data);
! result.setId(element.getAttributeNS(null, EncryptionConstants._ATT_ID));
! result.setType(element.getAttributeNS(null, EncryptionConstants._ATT_TYPE));
! result.setMimeType(element.getAttributeNS(null, EncryptionConstants._ATT_MIMETYPE));
! result.setEncoding(element.getAttributeNS(null, Constants._ATT_ENCODING));
! result.setRecipient(element.getAttributeNS(null, EncryptionConstants._ATT_RECIPIENT));
Element encryptionMethodElement =
(Element) element.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
EncryptionConstants._TAG_ENCRYPTIONMETHOD).item(0);
if (null != encryptionMethodElement) {
! result.setEncryptionMethod(newEncryptionMethod(encryptionMethodElement));
}
Element keyInfoElement =
(Element) element.getElementsByTagNameNS(
Constants.SignatureSpecNS, Constants._TAG_KEYINFO).item(0);
if (null != keyInfoElement) {
! KeyInfo ki = newKeyInfo(keyInfoElement);
! result.setKeyInfo(ki);
}
// TODO: Implement
Element encryptionPropertiesElement =
(Element) element.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
EncryptionConstants._TAG_ENCRYPTIONPROPERTIES).item(0);
if (null != encryptionPropertiesElement) {
result.setEncryptionProperties(
! newEncryptionProperties(encryptionPropertiesElement)
! );
}
Element referenceListElement =
(Element) element.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
*** 2491,2524 ****
Element carriedNameElement =
(Element) element.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
EncryptionConstants._TAG_CARRIEDKEYNAME).item(0);
if (null != carriedNameElement) {
! result.setCarriedName
! (carriedNameElement.getFirstChild().getNodeValue());
}
! return (result);
}
/**
* @param element
! * @return
! *
*/
- // <complexType name='EncryptionMethodType' mixed='true'>
- // <sequence>
- // <element name='KeySize' minOccurs='0' type='xenc:KeySizeType'/>
- // <element name='OAEPparams' minOccurs='0' type='base64Binary'/>
- // <any namespace='##other' minOccurs='0' maxOccurs='unbounded'/>
- // </sequence>
- // <attribute name='Algorithm' type='anyURI' use='required'/>
- // </complexType>
EncryptionMethod newEncryptionMethod(Element element) {
! String algorithm = element.getAttributeNS(
! null, EncryptionConstants._ATT_ALGORITHM);
! EncryptionMethod result = newEncryptionMethod(algorithm);
Element keySizeElement =
(Element) element.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
EncryptionConstants._TAG_KEYSIZE).item(0);
--- 2298,2341 ----
Element carriedNameElement =
(Element) element.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
EncryptionConstants._TAG_CARRIEDKEYNAME).item(0);
if (null != carriedNameElement) {
! result.setCarriedName(carriedNameElement.getFirstChild().getNodeValue());
}
! return result;
}
/**
* @param element
! * @return a new KeyInfo
! * @throws XMLEncryptionException
! */
! KeyInfo newKeyInfo(Element element) throws XMLEncryptionException {
! try {
! KeyInfo ki = new KeyInfo(element, null);
! ki.setSecureValidation(secureValidation);
! if (internalKeyResolvers != null) {
! int size = internalKeyResolvers.size();
! for (int i = 0; i < size; i++) {
! ki.registerInternalKeyResolver(internalKeyResolvers.get(i));
! }
! }
! return ki;
! } catch (XMLSecurityException xse) {
! throw new XMLEncryptionException("Error loading Key Info", xse);
! }
! }
!
! /**
! * @param element
! * @return a new EncryptionMethod
*/
EncryptionMethod newEncryptionMethod(Element element) {
! String encAlgorithm = element.getAttributeNS(null, EncryptionConstants._ATT_ALGORITHM);
! EncryptionMethod result = newEncryptionMethod(encAlgorithm);
Element keySizeElement =
(Element) element.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
EncryptionConstants._TAG_KEYSIZE).item(0);
*** 2531,2779 ****
Element oaepParamsElement =
(Element) element.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
EncryptionConstants._TAG_OAEPPARAMS).item(0);
if (null != oaepParamsElement) {
! result.setOAEPparams(
! oaepParamsElement.getNodeValue().getBytes());
}
// TODO: Make this mess work
// <any namespace='##other' minOccurs='0' maxOccurs='unbounded'/>
! return (result);
}
/**
* @param element
! * @return
! *
*/
- // <element name='EncryptionProperties' type='xenc:EncryptionPropertiesType'/>
- // <complexType name='EncryptionPropertiesType'>
- // <sequence>
- // <element ref='xenc:EncryptionProperty' maxOccurs='unbounded'/>
- // </sequence>
- // <attribute name='Id' type='ID' use='optional'/>
- // </complexType>
EncryptionProperties newEncryptionProperties(Element element) {
EncryptionProperties result = newEncryptionProperties();
! result.setId(element.getAttributeNS(
! null, EncryptionConstants._ATT_ID));
NodeList encryptionPropertyList =
element.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
EncryptionConstants._TAG_ENCRYPTIONPROPERTY);
! for(int i = 0; i < encryptionPropertyList.getLength(); i++) {
Node n = encryptionPropertyList.item(i);
if (null != n) {
! result.addEncryptionProperty(
! newEncryptionProperty((Element) n));
}
}
! return (result);
}
/**
* @param element
! * @return
! *
*/
- // <element name='EncryptionProperty' type='xenc:EncryptionPropertyType'/>
- // <complexType name='EncryptionPropertyType' mixed='true'>
- // <choice maxOccurs='unbounded'>
- // <any namespace='##other' processContents='lax'/>
- // </choice>
- // <attribute name='Target' type='anyURI' use='optional'/>
- // <attribute name='Id' type='ID' use='optional'/>
- // <anyAttribute namespace="http://www.w3.org/XML/1998/namespace"/>
- // </complexType>
EncryptionProperty newEncryptionProperty(Element element) {
EncryptionProperty result = newEncryptionProperty();
! result.setTarget(
! element.getAttributeNS(null, EncryptionConstants._ATT_TARGET));
! result.setId(element.getAttributeNS(
! null, EncryptionConstants._ATT_ID));
// TODO: Make this lot work...
// <anyAttribute namespace="http://www.w3.org/XML/1998/namespace"/>
// TODO: Make this work...
// <any namespace='##other' processContents='lax'/>
! return (result);
}
/**
* @param element
! * @return
! *
*/
- // <element name='ReferenceList'>
- // <complexType>
- // <choice minOccurs='1' maxOccurs='unbounded'>
- // <element name='DataReference' type='xenc:ReferenceType'/>
- // <element name='KeyReference' type='xenc:ReferenceType'/>
- // </choice>
- // </complexType>
- // </element>
ReferenceList newReferenceList(Element element) {
int type = 0;
if (null != element.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
EncryptionConstants._TAG_DATAREFERENCE).item(0)) {
type = ReferenceList.DATA_REFERENCE;
} else if (null != element.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
EncryptionConstants._TAG_KEYREFERENCE).item(0)) {
type = ReferenceList.KEY_REFERENCE;
- } else {
- // complain
}
ReferenceList result = new ReferenceListImpl(type);
NodeList list = null;
switch (type) {
case ReferenceList.DATA_REFERENCE:
! list = element.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
EncryptionConstants._TAG_DATAREFERENCE);
for (int i = 0; i < list.getLength() ; i++) {
String uri = ((Element) list.item(i)).getAttribute("URI");
result.add(result.newDataReference(uri));
}
break;
case ReferenceList.KEY_REFERENCE:
! list = element.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
EncryptionConstants._TAG_KEYREFERENCE);
for (int i = 0; i < list.getLength() ; i++) {
String uri = ((Element) list.item(i)).getAttribute("URI");
result.add(result.newKeyReference(uri));
}
}
! return (result);
! }
!
! /**
! * @param element
! * @return
! *
! */
! Transforms newTransforms(Element element) {
! return (null);
! }
!
! /**
! * @param agreementMethod
! * @return
! *
! */
! Element toElement(AgreementMethod agreementMethod) {
! return ((AgreementMethodImpl) agreementMethod).toElement();
! }
!
! /**
! * @param cipherData
! * @return
! *
! */
! Element toElement(CipherData cipherData) {
! return ((CipherDataImpl) cipherData).toElement();
! }
!
! /**
! * @param cipherReference
! * @return
! *
! */
! Element toElement(CipherReference cipherReference) {
! return ((CipherReferenceImpl) cipherReference).toElement();
! }
!
! /**
! * @param cipherValue
! * @return
! *
! */
! Element toElement(CipherValue cipherValue) {
! return ((CipherValueImpl) cipherValue).toElement();
}
/**
* @param encryptedData
! * @return
! *
*/
Element toElement(EncryptedData encryptedData) {
return ((EncryptedDataImpl) encryptedData).toElement();
}
/**
* @param encryptedKey
! * @return
! *
*/
Element toElement(EncryptedKey encryptedKey) {
return ((EncryptedKeyImpl) encryptedKey).toElement();
}
/**
! * @param encryptionMethod
! * @return
! *
! */
! Element toElement(EncryptionMethod encryptionMethod) {
! return ((EncryptionMethodImpl) encryptionMethod).toElement();
! }
!
! /**
! * @param encryptionProperties
! * @return
! *
! */
! Element toElement(EncryptionProperties encryptionProperties) {
! return ((EncryptionPropertiesImpl) encryptionProperties).toElement();
! }
!
! /**
! * @param encryptionProperty
! * @return
! *
*/
- Element toElement(EncryptionProperty encryptionProperty) {
- return ((EncryptionPropertyImpl) encryptionProperty).toElement();
- }
-
Element toElement(ReferenceList referenceList) {
return ((ReferenceListImpl) referenceList).toElement();
}
- /**
- * @param transforms
- * @return
- *
- */
- Element toElement(Transforms transforms) {
- return ((TransformsImpl) transforms).toElement();
- }
-
- // <element name="AgreementMethod" type="xenc:AgreementMethodType"/>
- // <complexType name="AgreementMethodType" mixed="true">
- // <sequence>
- // <element name="KA-Nonce" minOccurs="0" type="base64Binary"/>
- // <!-- <element ref="ds:DigestMethod" minOccurs="0"/> -->
- // <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
- // <element name="OriginatorKeyInfo" minOccurs="0" type="ds:KeyInfoType"/>
- // <element name="RecipientKeyInfo" minOccurs="0" type="ds:KeyInfoType"/>
- // </sequence>
- // <attribute name="Algorithm" type="anyURI" use="required"/>
- // </complexType>
private class AgreementMethodImpl implements AgreementMethod {
private byte[] kaNonce = null;
private List<Element> agreementMethodInformation = null;
private KeyInfo originatorKeyInfo = null;
private KeyInfo recipientKeyInfo = null;
--- 2348,2497 ----
Element oaepParamsElement =
(Element) element.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
EncryptionConstants._TAG_OAEPPARAMS).item(0);
if (null != oaepParamsElement) {
! try {
! String oaepParams = oaepParamsElement.getFirstChild().getNodeValue();
! result.setOAEPparams(Base64.decode(oaepParams.getBytes("UTF-8")));
! } catch(UnsupportedEncodingException e) {
! throw new RuntimeException("UTF-8 not supported", e);
! } catch (Base64DecodingException e) {
! throw new RuntimeException("BASE-64 decoding error", e);
! }
! }
!
! Element digestElement =
! (Element) element.getElementsByTagNameNS(
! Constants.SignatureSpecNS, Constants._TAG_DIGESTMETHOD).item(0);
! if (digestElement != null) {
! String digestAlgorithm = digestElement.getAttributeNS(null, "Algorithm");
! result.setDigestAlgorithm(digestAlgorithm);
! }
!
! Element mgfElement =
! (Element) element.getElementsByTagNameNS(
! EncryptionConstants.EncryptionSpec11NS, EncryptionConstants._TAG_MGF).item(0);
! if (mgfElement != null && !XMLCipher.RSA_OAEP.equals(algorithm)) {
! String mgfAlgorithm = mgfElement.getAttributeNS(null, "Algorithm");
! result.setMGFAlgorithm(mgfAlgorithm);
}
// TODO: Make this mess work
// <any namespace='##other' minOccurs='0' maxOccurs='unbounded'/>
! return result;
}
/**
* @param element
! * @return a new EncryptionProperties
*/
EncryptionProperties newEncryptionProperties(Element element) {
EncryptionProperties result = newEncryptionProperties();
! result.setId(element.getAttributeNS(null, EncryptionConstants._ATT_ID));
NodeList encryptionPropertyList =
element.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
EncryptionConstants._TAG_ENCRYPTIONPROPERTY);
! for (int i = 0; i < encryptionPropertyList.getLength(); i++) {
Node n = encryptionPropertyList.item(i);
if (null != n) {
! result.addEncryptionProperty(newEncryptionProperty((Element) n));
}
}
! return result;
}
/**
* @param element
! * @return a new EncryptionProperty
*/
EncryptionProperty newEncryptionProperty(Element element) {
EncryptionProperty result = newEncryptionProperty();
! result.setTarget(element.getAttributeNS(null, EncryptionConstants._ATT_TARGET));
! result.setId(element.getAttributeNS(null, EncryptionConstants._ATT_ID));
// TODO: Make this lot work...
// <anyAttribute namespace="http://www.w3.org/XML/1998/namespace"/>
// TODO: Make this work...
// <any namespace='##other' processContents='lax'/>
! return result;
}
/**
* @param element
! * @return a new ReferenceList
*/
ReferenceList newReferenceList(Element element) {
int type = 0;
if (null != element.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
EncryptionConstants._TAG_DATAREFERENCE).item(0)) {
type = ReferenceList.DATA_REFERENCE;
} else if (null != element.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
EncryptionConstants._TAG_KEYREFERENCE).item(0)) {
type = ReferenceList.KEY_REFERENCE;
}
ReferenceList result = new ReferenceListImpl(type);
NodeList list = null;
switch (type) {
case ReferenceList.DATA_REFERENCE:
! list =
! element.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
EncryptionConstants._TAG_DATAREFERENCE);
for (int i = 0; i < list.getLength() ; i++) {
String uri = ((Element) list.item(i)).getAttribute("URI");
result.add(result.newDataReference(uri));
}
break;
case ReferenceList.KEY_REFERENCE:
! list =
! element.getElementsByTagNameNS(
EncryptionConstants.EncryptionSpecNS,
EncryptionConstants._TAG_KEYREFERENCE);
for (int i = 0; i < list.getLength() ; i++) {
String uri = ((Element) list.item(i)).getAttribute("URI");
result.add(result.newKeyReference(uri));
}
}
! return result;
}
/**
* @param encryptedData
! * @return the XML Element form of that EncryptedData
*/
Element toElement(EncryptedData encryptedData) {
return ((EncryptedDataImpl) encryptedData).toElement();
}
/**
* @param encryptedKey
! * @return the XML Element form of that EncryptedKey
*/
Element toElement(EncryptedKey encryptedKey) {
return ((EncryptedKeyImpl) encryptedKey).toElement();
}
/**
! * @param referenceList
! * @return the XML Element form of that ReferenceList
*/
Element toElement(ReferenceList referenceList) {
return ((ReferenceListImpl) referenceList).toElement();
}
private class AgreementMethodImpl implements AgreementMethod {
private byte[] kaNonce = null;
private List<Element> agreementMethodInformation = null;
private KeyInfo originatorKeyInfo = null;
private KeyInfo recipientKeyInfo = null;
*** 2785,2813 ****
public AgreementMethodImpl(String algorithm) {
agreementMethodInformation = new LinkedList<Element>();
URI tmpAlgorithm = null;
try {
tmpAlgorithm = new URI(algorithm);
! } catch (URI.MalformedURIException fmue) {
! //complain?
}
algorithmURI = tmpAlgorithm.toString();
}
/** @inheritDoc */
public byte[] getKANonce() {
! return (kaNonce);
}
/** @inheritDoc */
public void setKANonce(byte[] kanonce) {
kaNonce = kanonce;
}
/** @inheritDoc */
public Iterator<Element> getAgreementMethodInformation() {
! return (agreementMethodInformation.iterator());
}
/** @inheritDoc */
public void addAgreementMethodInformation(Element info) {
agreementMethodInformation.add(info);
--- 2503,2532 ----
public AgreementMethodImpl(String algorithm) {
agreementMethodInformation = new LinkedList<Element>();
URI tmpAlgorithm = null;
try {
tmpAlgorithm = new URI(algorithm);
! } catch (URISyntaxException ex) {
! throw (IllegalArgumentException)
! new IllegalArgumentException().initCause(ex);
}
algorithmURI = tmpAlgorithm.toString();
}
/** @inheritDoc */
public byte[] getKANonce() {
! return kaNonce;
}
/** @inheritDoc */
public void setKANonce(byte[] kanonce) {
kaNonce = kanonce;
}
/** @inheritDoc */
public Iterator<Element> getAgreementMethodInformation() {
! return agreementMethodInformation.iterator();
}
/** @inheritDoc */
public void addAgreementMethodInformation(Element info) {
agreementMethodInformation.add(info);
*** 2818,2911 ****
agreementMethodInformation.remove(info);
}
/** @inheritDoc */
public KeyInfo getOriginatorKeyInfo() {
! return (originatorKeyInfo);
}
/** @inheritDoc */
public void setOriginatorKeyInfo(KeyInfo keyInfo) {
originatorKeyInfo = keyInfo;
}
/** @inheritDoc */
public KeyInfo getRecipientKeyInfo() {
! return (recipientKeyInfo);
}
/** @inheritDoc */
public void setRecipientKeyInfo(KeyInfo keyInfo) {
recipientKeyInfo = keyInfo;
}
/** @inheritDoc */
public String getAlgorithm() {
! return (algorithmURI);
! }
!
! /** @param algorithm*/
! public void setAlgorithm(String algorithm) {
! URI tmpAlgorithm = null;
! try {
! tmpAlgorithm = new URI(algorithm);
! } catch (URI.MalformedURIException mfue) {
! //complain
! }
! algorithmURI = tmpAlgorithm.toString();
! }
!
! // <element name="AgreementMethod" type="xenc:AgreementMethodType"/>
! // <complexType name="AgreementMethodType" mixed="true">
! // <sequence>
! // <element name="KA-Nonce" minOccurs="0" type="base64Binary"/>
! // <!-- <element ref="ds:DigestMethod" minOccurs="0"/> -->
! // <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
! // <element name="OriginatorKeyInfo" minOccurs="0" type="ds:KeyInfoType"/>
! // <element name="RecipientKeyInfo" minOccurs="0" type="ds:KeyInfoType"/>
! // </sequence>
! // <attribute name="Algorithm" type="anyURI" use="required"/>
! // </complexType>
! Element toElement() {
! Element result = ElementProxy.createElementForFamily(
! _contextDocument,
! EncryptionConstants.EncryptionSpecNS,
! EncryptionConstants._TAG_AGREEMENTMETHOD);
! result.setAttributeNS(
! null, EncryptionConstants._ATT_ALGORITHM, algorithmURI);
! if (null != kaNonce) {
! result.appendChild(
! ElementProxy.createElementForFamily(
! _contextDocument,
! EncryptionConstants.EncryptionSpecNS,
! EncryptionConstants._TAG_KA_NONCE)).appendChild(
! _contextDocument.createTextNode(new String(kaNonce)));
! }
! if (!agreementMethodInformation.isEmpty()) {
! Iterator<Element> itr = agreementMethodInformation.iterator();
! while (itr.hasNext()) {
! result.appendChild(itr.next());
! }
! }
! if (null != originatorKeyInfo) {
! result.appendChild(originatorKeyInfo.getElement());
! }
! if (null != recipientKeyInfo) {
! result.appendChild(recipientKeyInfo.getElement());
! }
!
! return (result);
}
}
- // <element name='CipherData' type='xenc:CipherDataType'/>
- // <complexType name='CipherDataType'>
- // <choice>
- // <element name='CipherValue' type='base64Binary'/>
- // <element ref='xenc:CipherReference'/>
- // </choice>
- // </complexType>
private class CipherDataImpl implements CipherData {
private static final String valueMessage =
"Data type is reference type.";
private static final String referenceMessage =
"Data type is value type.";
--- 2537,2570 ----
agreementMethodInformation.remove(info);
}
/** @inheritDoc */
public KeyInfo getOriginatorKeyInfo() {
! return originatorKeyInfo;
}
/** @inheritDoc */
public void setOriginatorKeyInfo(KeyInfo keyInfo) {
originatorKeyInfo = keyInfo;
}
/** @inheritDoc */
public KeyInfo getRecipientKeyInfo() {
! return recipientKeyInfo;
}
/** @inheritDoc */
public void setRecipientKeyInfo(KeyInfo keyInfo) {
recipientKeyInfo = keyInfo;
}
/** @inheritDoc */
public String getAlgorithm() {
! return algorithmURI;
}
}
private class CipherDataImpl implements CipherData {
private static final String valueMessage =
"Data type is reference type.";
private static final String referenceMessage =
"Data type is value type.";
*** 2920,2998 ****
cipherType = type;
}
/** @inheritDoc */
public CipherValue getCipherValue() {
! return (cipherValue);
}
/** @inheritDoc */
! public void setCipherValue(CipherValue value) throws
! XMLEncryptionException {
if (cipherType == REFERENCE_TYPE) {
! throw new XMLEncryptionException("empty",
! new UnsupportedOperationException(valueMessage));
}
cipherValue = value;
}
/** @inheritDoc */
public CipherReference getCipherReference() {
! return (cipherReference);
}
/** @inheritDoc */
public void setCipherReference(CipherReference reference) throws
XMLEncryptionException {
if (cipherType == VALUE_TYPE) {
! throw new XMLEncryptionException("empty",
! new UnsupportedOperationException(referenceMessage));
}
cipherReference = reference;
}
/** @inheritDoc */
public int getDataType() {
! return (cipherType);
}
- // <element name='CipherData' type='xenc:CipherDataType'/>
- // <complexType name='CipherDataType'>
- // <choice>
- // <element name='CipherValue' type='base64Binary'/>
- // <element ref='xenc:CipherReference'/>
- // </choice>
- // </complexType>
Element toElement() {
! Element result = ElementProxy.createElementForFamily(
! _contextDocument,
! EncryptionConstants.EncryptionSpecNS,
! EncryptionConstants._TAG_CIPHERDATA);
if (cipherType == VALUE_TYPE) {
! result.appendChild(
! ((CipherValueImpl) cipherValue).toElement());
} else if (cipherType == REFERENCE_TYPE) {
! result.appendChild(
! ((CipherReferenceImpl) cipherReference).toElement());
! } else {
! // complain
}
! return (result);
}
}
- // <element name='CipherReference' type='xenc:CipherReferenceType'/>
- // <complexType name='CipherReferenceType'>
- // <sequence>
- // <element name='Transforms' type='xenc:TransformsType' minOccurs='0'/>
- // </sequence>
- // <attribute name='URI' type='anyURI' use='required'/>
- // </complexType>
private class CipherReferenceImpl implements CipherReference {
private String referenceURI = null;
private Transforms referenceTransforms = null;
private Attr referenceNode = null;
--- 2579,2640 ----
cipherType = type;
}
/** @inheritDoc */
public CipherValue getCipherValue() {
! return cipherValue;
}
/** @inheritDoc */
! public void setCipherValue(CipherValue value) throws XMLEncryptionException {
if (cipherType == REFERENCE_TYPE) {
! throw new XMLEncryptionException(
! "empty", new UnsupportedOperationException(valueMessage)
! );
}
cipherValue = value;
}
/** @inheritDoc */
public CipherReference getCipherReference() {
! return cipherReference;
}
/** @inheritDoc */
public void setCipherReference(CipherReference reference) throws
XMLEncryptionException {
if (cipherType == VALUE_TYPE) {
! throw new XMLEncryptionException(
! "empty", new UnsupportedOperationException(referenceMessage)
! );
}
cipherReference = reference;
}
/** @inheritDoc */
public int getDataType() {
! return cipherType;
}
Element toElement() {
! Element result =
! XMLUtils.createElementInEncryptionSpace(
! contextDocument, EncryptionConstants._TAG_CIPHERDATA
! );
if (cipherType == VALUE_TYPE) {
! result.appendChild(((CipherValueImpl) cipherValue).toElement());
} else if (cipherType == REFERENCE_TYPE) {
! result.appendChild(((CipherReferenceImpl) cipherReference).toElement());
}
! return result;
}
}
private class CipherReferenceImpl implements CipherReference {
private String referenceURI = null;
private Transforms referenceTransforms = null;
private Attr referenceNode = null;
*** 3013,3220 ****
referenceNode = uri;
}
/** @inheritDoc */
public String getURI() {
! return (referenceURI);
}
/** @inheritDoc */
public Attr getURIAsAttr() {
! return (referenceNode);
}
/** @inheritDoc */
public Transforms getTransforms() {
! return (referenceTransforms);
}
/** @inheritDoc */
public void setTransforms(Transforms transforms) {
referenceTransforms = transforms;
}
- // <element name='CipherReference' type='xenc:CipherReferenceType'/>
- // <complexType name='CipherReferenceType'>
- // <sequence>
- // <element name='Transforms' type='xenc:TransformsType' minOccurs='0'/>
- // </sequence>
- // <attribute name='URI' type='anyURI' use='required'/>
- // </complexType>
Element toElement() {
! Element result = ElementProxy.createElementForFamily(
! _contextDocument,
! EncryptionConstants.EncryptionSpecNS,
! EncryptionConstants._TAG_CIPHERREFERENCE);
! result.setAttributeNS(
! null, EncryptionConstants._ATT_URI, referenceURI);
if (null != referenceTransforms) {
! result.appendChild(
! ((TransformsImpl) referenceTransforms).toElement());
}
! return (result);
}
}
private class CipherValueImpl implements CipherValue {
private String cipherValue = null;
- // public CipherValueImpl(byte[] value) {
- // cipherValue = value;
- // }
-
/**
* @param value
*/
public CipherValueImpl(String value) {
- // cipherValue = value.getBytes();
cipherValue = value;
}
/** @inheritDoc */
public String getValue() {
! return (cipherValue);
}
- // public void setValue(byte[] value) {
- // public void setValue(String value) {
- // cipherValue = value;
- // }
/** @inheritDoc */
public void setValue(String value) {
- // cipherValue = value.getBytes();
cipherValue = value;
}
Element toElement() {
! Element result = ElementProxy.createElementForFamily(
! _contextDocument, EncryptionConstants.EncryptionSpecNS,
! EncryptionConstants._TAG_CIPHERVALUE);
! result.appendChild(_contextDocument.createTextNode(
! cipherValue));
!
! return (result);
}
}
! // <complexType name='EncryptedType' abstract='true'>
! // <sequence>
! // <element name='EncryptionMethod' type='xenc:EncryptionMethodType'
! // minOccurs='0'/>
! // <element ref='ds:KeyInfo' minOccurs='0'/>
! // <element ref='xenc:CipherData'/>
! // <element ref='xenc:EncryptionProperties' minOccurs='0'/>
! // </sequence>
! // <attribute name='Id' type='ID' use='optional'/>
! // <attribute name='Type' type='anyURI' use='optional'/>
! // <attribute name='MimeType' type='string' use='optional'/>
! // <attribute name='Encoding' type='anyURI' use='optional'/>
! // </complexType>
! // <element name='EncryptedData' type='xenc:EncryptedDataType'/>
! // <complexType name='EncryptedDataType'>
! // <complexContent>
! // <extension base='xenc:EncryptedType'/>
! // </complexContent>
! // </complexType>
! private class EncryptedDataImpl extends EncryptedTypeImpl implements
! EncryptedData {
/**
* @param data
*/
public EncryptedDataImpl(CipherData data) {
super(data);
}
- // <complexType name='EncryptedType' abstract='true'>
- // <sequence>
- // <element name='EncryptionMethod' type='xenc:EncryptionMethodType'
- // minOccurs='0'/>
- // <element ref='ds:KeyInfo' minOccurs='0'/>
- // <element ref='xenc:CipherData'/>
- // <element ref='xenc:EncryptionProperties' minOccurs='0'/>
- // </sequence>
- // <attribute name='Id' type='ID' use='optional'/>
- // <attribute name='Type' type='anyURI' use='optional'/>
- // <attribute name='MimeType' type='string' use='optional'/>
- // <attribute name='Encoding' type='anyURI' use='optional'/>
- // </complexType>
- // <element name='EncryptedData' type='xenc:EncryptedDataType'/>
- // <complexType name='EncryptedDataType'>
- // <complexContent>
- // <extension base='xenc:EncryptedType'/>
- // </complexContent>
- // </complexType>
Element toElement() {
! Element result = ElementProxy.createElementForFamily(
! _contextDocument, EncryptionConstants.EncryptionSpecNS,
! EncryptionConstants._TAG_ENCRYPTEDDATA);
if (null != super.getId()) {
! result.setAttributeNS(
! null, EncryptionConstants._ATT_ID, super.getId());
}
if (null != super.getType()) {
! result.setAttributeNS(
! null, EncryptionConstants._ATT_TYPE, super.getType());
}
if (null != super.getMimeType()) {
result.setAttributeNS(
! null, EncryptionConstants._ATT_MIMETYPE,
! super.getMimeType());
}
if (null != super.getEncoding()) {
result.setAttributeNS(
! null, EncryptionConstants._ATT_ENCODING,
! super.getEncoding());
}
if (null != super.getEncryptionMethod()) {
! result.appendChild(((EncryptionMethodImpl)
! super.getEncryptionMethod()).toElement());
}
if (null != super.getKeyInfo()) {
! result.appendChild(super.getKeyInfo().getElement());
}
! result.appendChild(
! ((CipherDataImpl) super.getCipherData()).toElement());
if (null != super.getEncryptionProperties()) {
result.appendChild(((EncryptionPropertiesImpl)
super.getEncryptionProperties()).toElement());
}
! return (result);
}
}
! // <complexType name='EncryptedType' abstract='true'>
! // <sequence>
! // <element name='EncryptionMethod' type='xenc:EncryptionMethodType'
! // minOccurs='0'/>
! // <element ref='ds:KeyInfo' minOccurs='0'/>
! // <element ref='xenc:CipherData'/>
! // <element ref='xenc:EncryptionProperties' minOccurs='0'/>
! // </sequence>
! // <attribute name='Id' type='ID' use='optional'/>
! // <attribute name='Type' type='anyURI' use='optional'/>
! // <attribute name='MimeType' type='string' use='optional'/>
! // <attribute name='Encoding' type='anyURI' use='optional'/>
! // </complexType>
! // <element name='EncryptedKey' type='xenc:EncryptedKeyType'/>
! // <complexType name='EncryptedKeyType'>
! // <complexContent>
! // <extension base='xenc:EncryptedType'>
! // <sequence>
! // <element ref='xenc:ReferenceList' minOccurs='0'/>
! // <element name='CarriedKeyName' type='string' minOccurs='0'/>
! // </sequence>
! // <attribute name='Recipient' type='string' use='optional'/>
! // </extension>
! // </complexContent>
! // </complexType>
! private class EncryptedKeyImpl extends EncryptedTypeImpl implements
! EncryptedKey {
private String keyRecipient = null;
private ReferenceList referenceList = null;
private String carriedName = null;
/**
--- 2655,2779 ----
referenceNode = uri;
}
/** @inheritDoc */
public String getURI() {
! return referenceURI;
}
/** @inheritDoc */
public Attr getURIAsAttr() {
! return referenceNode;
}
/** @inheritDoc */
public Transforms getTransforms() {
! return referenceTransforms;
}
/** @inheritDoc */
public void setTransforms(Transforms transforms) {
referenceTransforms = transforms;
}
Element toElement() {
! Element result =
! XMLUtils.createElementInEncryptionSpace(
! contextDocument, EncryptionConstants._TAG_CIPHERREFERENCE
! );
! result.setAttributeNS(null, EncryptionConstants._ATT_URI, referenceURI);
if (null != referenceTransforms) {
! result.appendChild(((TransformsImpl) referenceTransforms).toElement());
}
! return result;
}
}
private class CipherValueImpl implements CipherValue {
private String cipherValue = null;
/**
* @param value
*/
public CipherValueImpl(String value) {
cipherValue = value;
}
/** @inheritDoc */
public String getValue() {
! return cipherValue;
}
/** @inheritDoc */
public void setValue(String value) {
cipherValue = value;
}
Element toElement() {
! Element result =
! XMLUtils.createElementInEncryptionSpace(
! contextDocument, EncryptionConstants._TAG_CIPHERVALUE
! );
! result.appendChild(contextDocument.createTextNode(cipherValue));
!
! return result;
}
}
! private class EncryptedDataImpl extends EncryptedTypeImpl implements EncryptedData {
!
/**
* @param data
*/
public EncryptedDataImpl(CipherData data) {
super(data);
}
Element toElement() {
! Element result =
! ElementProxy.createElementForFamily(
! contextDocument, EncryptionConstants.EncryptionSpecNS,
! EncryptionConstants._TAG_ENCRYPTEDDATA
! );
if (null != super.getId()) {
! result.setAttributeNS(null, EncryptionConstants._ATT_ID, super.getId());
}
if (null != super.getType()) {
! result.setAttributeNS(null, EncryptionConstants._ATT_TYPE, super.getType());
}
if (null != super.getMimeType()) {
result.setAttributeNS(
! null, EncryptionConstants._ATT_MIMETYPE, super.getMimeType()
! );
}
if (null != super.getEncoding()) {
result.setAttributeNS(
! null, EncryptionConstants._ATT_ENCODING, super.getEncoding()
! );
}
if (null != super.getEncryptionMethod()) {
! result.appendChild(
! ((EncryptionMethodImpl)super.getEncryptionMethod()).toElement()
! );
}
if (null != super.getKeyInfo()) {
! result.appendChild(super.getKeyInfo().getElement().cloneNode(true));
}
! result.appendChild(((CipherDataImpl) super.getCipherData()).toElement());
if (null != super.getEncryptionProperties()) {
result.appendChild(((EncryptionPropertiesImpl)
super.getEncryptionProperties()).toElement());
}
! return result;
}
}
! private class EncryptedKeyImpl extends EncryptedTypeImpl implements EncryptedKey {
private String keyRecipient = null;
private ReferenceList referenceList = null;
private String carriedName = null;
/**
*** 3224,3339 ****
super(data);
}
/** @inheritDoc */
public String getRecipient() {
! return (keyRecipient);
}
/** @inheritDoc */
public void setRecipient(String recipient) {
keyRecipient = recipient;
}
/** @inheritDoc */
public ReferenceList getReferenceList() {
! return (referenceList);
}
/** @inheritDoc */
public void setReferenceList(ReferenceList list) {
referenceList = list;
}
/** @inheritDoc */
public String getCarriedName() {
! return (carriedName);
}
/** @inheritDoc */
public void setCarriedName(String name) {
carriedName = name;
}
- // <complexType name='EncryptedType' abstract='true'>
- // <sequence>
- // <element name='EncryptionMethod' type='xenc:EncryptionMethodType'
- // minOccurs='0'/>
- // <element ref='ds:KeyInfo' minOccurs='0'/>
- // <element ref='xenc:CipherData'/>
- // <element ref='xenc:EncryptionProperties' minOccurs='0'/>
- // </sequence>
- // <attribute name='Id' type='ID' use='optional'/>
- // <attribute name='Type' type='anyURI' use='optional'/>
- // <attribute name='MimeType' type='string' use='optional'/>
- // <attribute name='Encoding' type='anyURI' use='optional'/>
- // </complexType>
- // <element name='EncryptedKey' type='xenc:EncryptedKeyType'/>
- // <complexType name='EncryptedKeyType'>
- // <complexContent>
- // <extension base='xenc:EncryptedType'>
- // <sequence>
- // <element ref='xenc:ReferenceList' minOccurs='0'/>
- // <element name='CarriedKeyName' type='string' minOccurs='0'/>
- // </sequence>
- // <attribute name='Recipient' type='string' use='optional'/>
- // </extension>
- // </complexContent>
- // </complexType>
Element toElement() {
! Element result = ElementProxy.createElementForFamily(
! _contextDocument, EncryptionConstants.EncryptionSpecNS,
! EncryptionConstants._TAG_ENCRYPTEDKEY);
if (null != super.getId()) {
! result.setAttributeNS(
! null, EncryptionConstants._ATT_ID, super.getId());
}
if (null != super.getType()) {
! result.setAttributeNS(
! null, EncryptionConstants._ATT_TYPE, super.getType());
}
if (null != super.getMimeType()) {
! result.setAttributeNS(null,
! EncryptionConstants._ATT_MIMETYPE, super.getMimeType());
}
if (null != super.getEncoding()) {
! result.setAttributeNS(null, Constants._ATT_ENCODING,
! super.getEncoding());
}
if (null != getRecipient()) {
! result.setAttributeNS(null,
! EncryptionConstants._ATT_RECIPIENT, getRecipient());
}
if (null != super.getEncryptionMethod()) {
result.appendChild(((EncryptionMethodImpl)
super.getEncryptionMethod()).toElement());
}
if (null != super.getKeyInfo()) {
! result.appendChild(super.getKeyInfo().getElement());
}
! result.appendChild(
! ((CipherDataImpl) super.getCipherData()).toElement());
if (null != super.getEncryptionProperties()) {
result.appendChild(((EncryptionPropertiesImpl)
super.getEncryptionProperties()).toElement());
}
if (referenceList != null && !referenceList.isEmpty()) {
! result.appendChild(((ReferenceListImpl)
! getReferenceList()).toElement());
}
if (null != carriedName) {
! Element element = ElementProxy.createElementForFamily(
! _contextDocument,
EncryptionConstants.EncryptionSpecNS,
! EncryptionConstants._TAG_CARRIEDKEYNAME);
! Node node = _contextDocument.createTextNode(carriedName);
element.appendChild(node);
result.appendChild(element);
}
! return (result);
}
}
private abstract class EncryptedTypeImpl {
private String id = null;
--- 2783,2874 ----
super(data);
}
/** @inheritDoc */
public String getRecipient() {
! return keyRecipient;
}
/** @inheritDoc */
public void setRecipient(String recipient) {
keyRecipient = recipient;
}
/** @inheritDoc */
public ReferenceList getReferenceList() {
! return referenceList;
}
/** @inheritDoc */
public void setReferenceList(ReferenceList list) {
referenceList = list;
}
/** @inheritDoc */
public String getCarriedName() {
! return carriedName;
}
/** @inheritDoc */
public void setCarriedName(String name) {
carriedName = name;
}
Element toElement() {
! Element result =
! ElementProxy.createElementForFamily(
! contextDocument, EncryptionConstants.EncryptionSpecNS,
! EncryptionConstants._TAG_ENCRYPTEDKEY
! );
if (null != super.getId()) {
! result.setAttributeNS(null, EncryptionConstants._ATT_ID, super.getId());
}
if (null != super.getType()) {
! result.setAttributeNS(null, EncryptionConstants._ATT_TYPE, super.getType());
}
if (null != super.getMimeType()) {
! result.setAttributeNS(
! null, EncryptionConstants._ATT_MIMETYPE, super.getMimeType()
! );
}
if (null != super.getEncoding()) {
! result.setAttributeNS(null, Constants._ATT_ENCODING, super.getEncoding());
}
if (null != getRecipient()) {
! result.setAttributeNS(
! null, EncryptionConstants._ATT_RECIPIENT, getRecipient()
! );
}
if (null != super.getEncryptionMethod()) {
result.appendChild(((EncryptionMethodImpl)
super.getEncryptionMethod()).toElement());
}
if (null != super.getKeyInfo()) {
! result.appendChild(super.getKeyInfo().getElement().cloneNode(true));
}
! result.appendChild(((CipherDataImpl) super.getCipherData()).toElement());
if (null != super.getEncryptionProperties()) {
result.appendChild(((EncryptionPropertiesImpl)
super.getEncryptionProperties()).toElement());
}
if (referenceList != null && !referenceList.isEmpty()) {
! result.appendChild(((ReferenceListImpl)getReferenceList()).toElement());
}
if (null != carriedName) {
! Element element =
! ElementProxy.createElementForFamily(
! contextDocument,
EncryptionConstants.EncryptionSpecNS,
! EncryptionConstants._TAG_CARRIEDKEYNAME
! );
! Node node = contextDocument.createTextNode(carriedName);
element.appendChild(node);
result.appendChild(element);
}
! return result;
}
}
private abstract class EncryptedTypeImpl {
private String id = null;
*** 3343,3376 ****
private EncryptionMethod encryptionMethod = null;
private KeyInfo keyInfo = null;
private CipherData cipherData = null;
private EncryptionProperties encryptionProperties = null;
protected EncryptedTypeImpl(CipherData data) {
cipherData = data;
}
/**
*
! * @return
*/
public String getId() {
! return (id);
}
/**
*
* @param id
*/
public void setId(String id) {
this.id = id;
}
/**
*
! * @return
*/
public String getType() {
! return (type);
}
/**
*
* @param type
*/
public void setType(String type) {
--- 2878,2919 ----
private EncryptionMethod encryptionMethod = null;
private KeyInfo keyInfo = null;
private CipherData cipherData = null;
private EncryptionProperties encryptionProperties = null;
+ /**
+ * Constructor.
+ * @param data
+ */
protected EncryptedTypeImpl(CipherData data) {
cipherData = data;
}
+
/**
*
! * @return the Id
*/
public String getId() {
! return id;
}
+
/**
*
* @param id
*/
public void setId(String id) {
this.id = id;
}
+
/**
*
! * @return the type
*/
public String getType() {
! return type;
}
+
/**
*
* @param type
*/
public void setType(String type) {
*** 3378,3414 ****
this.type = null;
} else {
URI tmpType = null;
try {
tmpType = new URI(type);
! } catch (URI.MalformedURIException mfue) {
! // complain
}
this.type = tmpType.toString();
}
}
/**
*
! * @return
*/
public String getMimeType() {
! return (mimeType);
}
/**
*
* @param type
*/
public void setMimeType(String type) {
mimeType = type;
}
/**
*
! * @return
*/
public String getEncoding() {
! return (encoding);
}
/**
*
* @param encoding
*/
public void setEncoding(String encoding) {
--- 2921,2961 ----
this.type = null;
} else {
URI tmpType = null;
try {
tmpType = new URI(type);
! } catch (URISyntaxException ex) {
! throw (IllegalArgumentException)
! new IllegalArgumentException().initCause(ex);
}
this.type = tmpType.toString();
}
}
+
/**
*
! * @return the MimeType
*/
public String getMimeType() {
! return mimeType;
}
/**
*
* @param type
*/
public void setMimeType(String type) {
mimeType = type;
}
+
/**
*
! * @return the encoding
*/
public String getEncoding() {
! return encoding;
}
+
/**
*
* @param encoding
*/
public void setEncoding(String encoding) {
*** 3416,3834 ****
this.encoding = null;
} else {
URI tmpEncoding = null;
try {
tmpEncoding = new URI(encoding);
! } catch (URI.MalformedURIException mfue) {
! // complain
}
this.encoding = tmpEncoding.toString();
}
}
/**
*
! * @return
*/
public EncryptionMethod getEncryptionMethod() {
! return (encryptionMethod);
}
/**
*
* @param method
*/
public void setEncryptionMethod(EncryptionMethod method) {
encryptionMethod = method;
}
/**
*
! * @return
*/
public KeyInfo getKeyInfo() {
! return (keyInfo);
}
/**
*
* @param info
*/
public void setKeyInfo(KeyInfo info) {
keyInfo = info;
}
/**
*
! * @return
*/
public CipherData getCipherData() {
! return (cipherData);
}
/**
*
! * @return
*/
public EncryptionProperties getEncryptionProperties() {
! return (encryptionProperties);
}
/**
*
* @param properties
*/
! public void setEncryptionProperties(
! EncryptionProperties properties) {
encryptionProperties = properties;
}
}
- // <complexType name='EncryptionMethodType' mixed='true'>
- // <sequence>
- // <element name='KeySize' minOccurs='0' type='xenc:KeySizeType'/>
- // <element name='OAEPparams' minOccurs='0' type='base64Binary'/>
- // <any namespace='##other' minOccurs='0' maxOccurs='unbounded'/>
- // </sequence>
- // <attribute name='Algorithm' type='anyURI' use='required'/>
- // </complexType>
private class EncryptionMethodImpl implements EncryptionMethod {
private String algorithm = null;
private int keySize = Integer.MIN_VALUE;
private byte[] oaepParams = null;
private List<Element> encryptionMethodInformation = null;
/**
! *
* @param algorithm
*/
public EncryptionMethodImpl(String algorithm) {
URI tmpAlgorithm = null;
try {
tmpAlgorithm = new URI(algorithm);
! } catch (URI.MalformedURIException mfue) {
! // complain
}
this.algorithm = tmpAlgorithm.toString();
encryptionMethodInformation = new LinkedList<Element>();
}
/** @inheritDoc */
public String getAlgorithm() {
! return (algorithm);
}
/** @inheritDoc */
public int getKeySize() {
! return (keySize);
}
/** @inheritDoc */
public void setKeySize(int size) {
keySize = size;
}
/** @inheritDoc */
public byte[] getOAEPparams() {
! return (oaepParams);
}
/** @inheritDoc */
public void setOAEPparams(byte[] params) {
oaepParams = params;
}
/** @inheritDoc */
public Iterator<Element> getEncryptionMethodInformation() {
! return (encryptionMethodInformation.iterator());
}
/** @inheritDoc */
public void addEncryptionMethodInformation(Element info) {
encryptionMethodInformation.add(info);
}
/** @inheritDoc */
public void removeEncryptionMethodInformation(Element info) {
encryptionMethodInformation.remove(info);
}
- // <complexType name='EncryptionMethodType' mixed='true'>
- // <sequence>
- // <element name='KeySize' minOccurs='0' type='xenc:KeySizeType'/>
- // <element name='OAEPparams' minOccurs='0' type='base64Binary'/>
- // <any namespace='##other' minOccurs='0' maxOccurs='unbounded'/>
- // </sequence>
- // <attribute name='Algorithm' type='anyURI' use='required'/>
- // </complexType>
Element toElement() {
! Element result = ElementProxy.createElementForFamily(
! _contextDocument, EncryptionConstants.EncryptionSpecNS,
! EncryptionConstants._TAG_ENCRYPTIONMETHOD);
! result.setAttributeNS(null, EncryptionConstants._ATT_ALGORITHM,
! algorithm);
if (keySize > 0) {
result.appendChild(
! ElementProxy.createElementForFamily(_contextDocument,
! EncryptionConstants.EncryptionSpecNS,
! EncryptionConstants._TAG_KEYSIZE).appendChild(
! _contextDocument.createTextNode(
! String.valueOf(keySize))));
}
if (null != oaepParams) {
! result.appendChild(
! ElementProxy.createElementForFamily(_contextDocument,
! EncryptionConstants.EncryptionSpecNS,
! EncryptionConstants._TAG_OAEPPARAMS).appendChild(
! _contextDocument.createTextNode(
! new String(oaepParams))));
}
- if (!encryptionMethodInformation.isEmpty()) {
Iterator<Element> itr = encryptionMethodInformation.iterator();
result.appendChild(itr.next());
}
! return (result);
}
}
- // <element name='EncryptionProperties' type='xenc:EncryptionPropertiesType'/>
- // <complexType name='EncryptionPropertiesType'>
- // <sequence>
- // <element ref='xenc:EncryptionProperty' maxOccurs='unbounded'/>
- // </sequence>
- // <attribute name='Id' type='ID' use='optional'/>
- // </complexType>
private class EncryptionPropertiesImpl implements EncryptionProperties {
private String id = null;
private List<EncryptionProperty> encryptionProperties = null;
/**
! *
! *
*/
public EncryptionPropertiesImpl() {
encryptionProperties = new LinkedList<EncryptionProperty>();
}
/** @inheritDoc */
public String getId() {
! return (id);
}
/** @inheritDoc */
public void setId(String id) {
this.id = id;
}
/** @inheritDoc */
public Iterator<EncryptionProperty> getEncryptionProperties() {
! return (encryptionProperties.iterator());
}
/** @inheritDoc */
public void addEncryptionProperty(EncryptionProperty property) {
encryptionProperties.add(property);
}
/** @inheritDoc */
public void removeEncryptionProperty(EncryptionProperty property) {
encryptionProperties.remove(property);
}
- // <element name='EncryptionProperties' type='xenc:EncryptionPropertiesType'/>
- // <complexType name='EncryptionPropertiesType'>
- // <sequence>
- // <element ref='xenc:EncryptionProperty' maxOccurs='unbounded'/>
- // </sequence>
- // <attribute name='Id' type='ID' use='optional'/>
- // </complexType>
Element toElement() {
! Element result = ElementProxy.createElementForFamily(
! _contextDocument, EncryptionConstants.EncryptionSpecNS,
! EncryptionConstants._TAG_ENCRYPTIONPROPERTIES);
if (null != id) {
result.setAttributeNS(null, EncryptionConstants._ATT_ID, id);
}
Iterator<EncryptionProperty> itr = getEncryptionProperties();
while (itr.hasNext()) {
! result.appendChild(((EncryptionPropertyImpl)
! itr.next()).toElement());
}
! return (result);
}
}
- // <element name='EncryptionProperty' type='xenc:EncryptionPropertyType'/>
- // <complexType name='EncryptionPropertyType' mixed='true'>
- // <choice maxOccurs='unbounded'>
- // <any namespace='##other' processContents='lax'/>
- // </choice>
- // <attribute name='Target' type='anyURI' use='optional'/>
- // <attribute name='Id' type='ID' use='optional'/>
- // <anyAttribute namespace="http://www.w3.org/XML/1998/namespace"/>
- // </complexType>
private class EncryptionPropertyImpl implements EncryptionProperty {
private String target = null;
private String id = null;
! private HashMap<String,String> attributeMap = new HashMap<String,String>();
private List<Element> encryptionInformation = null;
/**
! *
! *
*/
public EncryptionPropertyImpl() {
encryptionInformation = new LinkedList<Element>();
}
/** @inheritDoc */
public String getTarget() {
! return (target);
}
/** @inheritDoc */
public void setTarget(String target) {
if (target == null || target.length() == 0) {
this.target = null;
} else if (target.startsWith("#")) {
/*
* This is a same document URI reference. Do not parse,
! * because com.sun.org.apache.xml.internal.utils.URI considers this an
! * illegal URI because it has no scheme.
*/
this.target = target;
} else {
URI tmpTarget = null;
try {
tmpTarget = new URI(target);
! } catch (URI.MalformedURIException mfue) {
! // complain
}
this.target = tmpTarget.toString();
}
}
/** @inheritDoc */
public String getId() {
! return (id);
}
/** @inheritDoc */
public void setId(String id) {
this.id = id;
}
/** @inheritDoc */
public String getAttribute(String attribute) {
return attributeMap.get(attribute);
}
/** @inheritDoc */
public void setAttribute(String attribute, String value) {
attributeMap.put(attribute, value);
}
/** @inheritDoc */
public Iterator<Element> getEncryptionInformation() {
! return (encryptionInformation.iterator());
}
/** @inheritDoc */
public void addEncryptionInformation(Element info) {
encryptionInformation.add(info);
}
/** @inheritDoc */
public void removeEncryptionInformation(Element info) {
encryptionInformation.remove(info);
}
- // <element name='EncryptionProperty' type='xenc:EncryptionPropertyType'/>
- // <complexType name='EncryptionPropertyType' mixed='true'>
- // <choice maxOccurs='unbounded'>
- // <any namespace='##other' processContents='lax'/>
- // </choice>
- // <attribute name='Target' type='anyURI' use='optional'/>
- // <attribute name='Id' type='ID' use='optional'/>
- // <anyAttribute namespace="http://www.w3.org/XML/1998/namespace"/>
- // </complexType>
Element toElement() {
! Element result = ElementProxy.createElementForFamily(
! _contextDocument, EncryptionConstants.EncryptionSpecNS,
! EncryptionConstants._TAG_ENCRYPTIONPROPERTY);
if (null != target) {
! result.setAttributeNS(null, EncryptionConstants._ATT_TARGET,
! target);
}
if (null != id) {
! result.setAttributeNS(null, EncryptionConstants._ATT_ID,
! id);
}
// TODO: figure out the anyAttribyte stuff...
// TODO: figure out the any stuff...
! return (result);
}
}
! // <complexType name='TransformsType'>
! // <sequence>
! // <element ref='ds:Transform' maxOccurs='unbounded'/>
! // </sequence>
! // </complexType>
! private class TransformsImpl extends
! com.sun.org.apache.xml.internal.security.transforms.Transforms
implements Transforms {
/**
* Construct Transforms
*/
-
public TransformsImpl() {
! super(_contextDocument);
}
/**
*
* @param doc
*/
public TransformsImpl(Document doc) {
if (doc == null) {
throw new RuntimeException("Document is null");
}
! this._doc = doc;
! this._constructionElement = createElementForFamilyLocal(this._doc,
! this.getBaseNamespace(), this.getBaseLocalName());
}
/**
*
* @param element
* @throws XMLSignatureException
* @throws InvalidTransformException
* @throws XMLSecurityException
* @throws TransformationException
*/
public TransformsImpl(Element element)
! throws XMLSignatureException,
! InvalidTransformException,
! XMLSecurityException,
! TransformationException {
!
super(element, "");
-
}
/**
*
! * @return
*/
public Element toElement() {
!
! if (_doc == null)
! _doc = _contextDocument;
return getElement();
}
/** @inheritDoc */
public com.sun.org.apache.xml.internal.security.transforms.Transforms getDSTransforms() {
! return (this);
}
-
// Over-ride the namespace
/** @inheritDoc */
public String getBaseNamespace() {
return EncryptionConstants.EncryptionSpecNS;
}
-
}
- //<element name='ReferenceList'>
- // <complexType>
- // <choice minOccurs='1' maxOccurs='unbounded'>
- // <element name='DataReference' type='xenc:ReferenceType'/>
- // <element name='KeyReference' type='xenc:ReferenceType'/>
- // </choice>
- // </complexType>
- //</element>
private class ReferenceListImpl implements ReferenceList {
private Class<?> sentry;
private List<Reference> references;
/**
! *
* @param type
*/
public ReferenceListImpl(int type) {
if (type == ReferenceList.DATA_REFERENCE) {
sentry = DataReference.class;
--- 2963,3385 ----
this.encoding = null;
} else {
URI tmpEncoding = null;
try {
tmpEncoding = new URI(encoding);
! } catch (URISyntaxException ex) {
! throw (IllegalArgumentException)
! new IllegalArgumentException().initCause(ex);
}
this.encoding = tmpEncoding.toString();
}
}
+
/**
*
! * @return the EncryptionMethod
*/
public EncryptionMethod getEncryptionMethod() {
! return encryptionMethod;
}
+
/**
*
* @param method
*/
public void setEncryptionMethod(EncryptionMethod method) {
encryptionMethod = method;
}
+
/**
*
! * @return the KeyInfo
*/
public KeyInfo getKeyInfo() {
! return keyInfo;
}
+
/**
*
* @param info
*/
public void setKeyInfo(KeyInfo info) {
keyInfo = info;
}
+
/**
*
! * @return the CipherData
*/
public CipherData getCipherData() {
! return cipherData;
}
+
/**
*
! * @return the EncryptionProperties
*/
public EncryptionProperties getEncryptionProperties() {
! return encryptionProperties;
}
+
/**
*
* @param properties
*/
! public void setEncryptionProperties(EncryptionProperties properties) {
encryptionProperties = properties;
}
}
private class EncryptionMethodImpl implements EncryptionMethod {
private String algorithm = null;
private int keySize = Integer.MIN_VALUE;
private byte[] oaepParams = null;
private List<Element> encryptionMethodInformation = null;
+ private String digestAlgorithm = null;
+ private String mgfAlgorithm = null;
+
/**
! * Constructor.
* @param algorithm
*/
public EncryptionMethodImpl(String algorithm) {
URI tmpAlgorithm = null;
try {
tmpAlgorithm = new URI(algorithm);
! } catch (URISyntaxException ex) {
! throw (IllegalArgumentException)
! new IllegalArgumentException().initCause(ex);
}
this.algorithm = tmpAlgorithm.toString();
encryptionMethodInformation = new LinkedList<Element>();
}
+
/** @inheritDoc */
public String getAlgorithm() {
! return algorithm;
}
+
/** @inheritDoc */
public int getKeySize() {
! return keySize;
}
+
/** @inheritDoc */
public void setKeySize(int size) {
keySize = size;
}
+
/** @inheritDoc */
public byte[] getOAEPparams() {
! return oaepParams;
}
+
/** @inheritDoc */
public void setOAEPparams(byte[] params) {
oaepParams = params;
}
+
+ /** @inheritDoc */
+ public void setDigestAlgorithm(String digestAlgorithm) {
+ this.digestAlgorithm = digestAlgorithm;
+ }
+
+ /** @inheritDoc */
+ public String getDigestAlgorithm() {
+ return digestAlgorithm;
+ }
+
+ /** @inheritDoc */
+ public void setMGFAlgorithm(String mgfAlgorithm) {
+ this.mgfAlgorithm = mgfAlgorithm;
+ }
+
+ /** @inheritDoc */
+ public String getMGFAlgorithm() {
+ return mgfAlgorithm;
+ }
+
/** @inheritDoc */
public Iterator<Element> getEncryptionMethodInformation() {
! return encryptionMethodInformation.iterator();
}
+
/** @inheritDoc */
public void addEncryptionMethodInformation(Element info) {
encryptionMethodInformation.add(info);
}
+
/** @inheritDoc */
public void removeEncryptionMethodInformation(Element info) {
encryptionMethodInformation.remove(info);
}
Element toElement() {
! Element result =
! XMLUtils.createElementInEncryptionSpace(
! contextDocument, EncryptionConstants._TAG_ENCRYPTIONMETHOD
! );
! result.setAttributeNS(null, EncryptionConstants._ATT_ALGORITHM, algorithm);
if (keySize > 0) {
result.appendChild(
! XMLUtils.createElementInEncryptionSpace(
! contextDocument, EncryptionConstants._TAG_KEYSIZE
! ).appendChild(contextDocument.createTextNode(String.valueOf(keySize))));
}
if (null != oaepParams) {
! Element oaepElement =
! XMLUtils.createElementInEncryptionSpace(
! contextDocument, EncryptionConstants._TAG_OAEPPARAMS
! );
! oaepElement.appendChild(contextDocument.createTextNode(Base64.encode(oaepParams)));
! result.appendChild(oaepElement);
! }
! if (digestAlgorithm != null) {
! Element digestElement =
! XMLUtils.createElementInSignatureSpace(contextDocument, Constants._TAG_DIGESTMETHOD);
! digestElement.setAttributeNS(null, "Algorithm", digestAlgorithm);
! result.appendChild(digestElement);
! }
! if (mgfAlgorithm != null) {
! Element mgfElement =
! XMLUtils.createElementInEncryption11Space(
! contextDocument, EncryptionConstants._TAG_MGF
! );
! mgfElement.setAttributeNS(null, "Algorithm", mgfAlgorithm);
! mgfElement.setAttributeNS(
! Constants.NamespaceSpecNS,
! "xmlns:" + ElementProxy.getDefaultPrefix(EncryptionConstants.EncryptionSpec11NS),
! EncryptionConstants.EncryptionSpec11NS
! );
! result.appendChild(mgfElement);
}
Iterator<Element> itr = encryptionMethodInformation.iterator();
+ while (itr.hasNext()) {
result.appendChild(itr.next());
}
! return result;
}
}
private class EncryptionPropertiesImpl implements EncryptionProperties {
private String id = null;
private List<EncryptionProperty> encryptionProperties = null;
+
/**
! * Constructor.
*/
public EncryptionPropertiesImpl() {
encryptionProperties = new LinkedList<EncryptionProperty>();
}
+
/** @inheritDoc */
public String getId() {
! return id;
}
+
/** @inheritDoc */
public void setId(String id) {
this.id = id;
}
+
/** @inheritDoc */
public Iterator<EncryptionProperty> getEncryptionProperties() {
! return encryptionProperties.iterator();
}
+
/** @inheritDoc */
public void addEncryptionProperty(EncryptionProperty property) {
encryptionProperties.add(property);
}
+
/** @inheritDoc */
public void removeEncryptionProperty(EncryptionProperty property) {
encryptionProperties.remove(property);
}
Element toElement() {
! Element result =
! XMLUtils.createElementInEncryptionSpace(
! contextDocument, EncryptionConstants._TAG_ENCRYPTIONPROPERTIES
! );
if (null != id) {
result.setAttributeNS(null, EncryptionConstants._ATT_ID, id);
}
Iterator<EncryptionProperty> itr = getEncryptionProperties();
while (itr.hasNext()) {
! result.appendChild(((EncryptionPropertyImpl)itr.next()).toElement());
}
! return result;
}
}
private class EncryptionPropertyImpl implements EncryptionProperty {
private String target = null;
private String id = null;
! private Map<String, String> attributeMap = new HashMap<String, String>();
private List<Element> encryptionInformation = null;
/**
! * Constructor.
*/
public EncryptionPropertyImpl() {
encryptionInformation = new LinkedList<Element>();
}
+
/** @inheritDoc */
public String getTarget() {
! return target;
}
+
/** @inheritDoc */
public void setTarget(String target) {
if (target == null || target.length() == 0) {
this.target = null;
} else if (target.startsWith("#")) {
/*
* This is a same document URI reference. Do not parse,
! * because it has no scheme.
*/
this.target = target;
} else {
URI tmpTarget = null;
try {
tmpTarget = new URI(target);
! } catch (URISyntaxException ex) {
! throw (IllegalArgumentException)
! new IllegalArgumentException().initCause(ex);
}
this.target = tmpTarget.toString();
}
}
+
/** @inheritDoc */
public String getId() {
! return id;
}
+
/** @inheritDoc */
public void setId(String id) {
this.id = id;
}
+
/** @inheritDoc */
public String getAttribute(String attribute) {
return attributeMap.get(attribute);
}
+
/** @inheritDoc */
public void setAttribute(String attribute, String value) {
attributeMap.put(attribute, value);
}
+
/** @inheritDoc */
public Iterator<Element> getEncryptionInformation() {
! return encryptionInformation.iterator();
}
+
/** @inheritDoc */
public void addEncryptionInformation(Element info) {
encryptionInformation.add(info);
}
+
/** @inheritDoc */
public void removeEncryptionInformation(Element info) {
encryptionInformation.remove(info);
}
Element toElement() {
! Element result =
! XMLUtils.createElementInEncryptionSpace(
! contextDocument, EncryptionConstants._TAG_ENCRYPTIONPROPERTY
! );
if (null != target) {
! result.setAttributeNS(null, EncryptionConstants._ATT_TARGET, target);
}
if (null != id) {
! result.setAttributeNS(null, EncryptionConstants._ATT_ID, id);
}
// TODO: figure out the anyAttribyte stuff...
// TODO: figure out the any stuff...
! return result;
}
}
! private class TransformsImpl extends com.sun.org.apache.xml.internal.security.transforms.Transforms
implements Transforms {
/**
* Construct Transforms
*/
public TransformsImpl() {
! super(contextDocument);
}
+
/**
*
* @param doc
*/
public TransformsImpl(Document doc) {
if (doc == null) {
throw new RuntimeException("Document is null");
}
! this.doc = doc;
! this.constructionElement =
! createElementForFamilyLocal(
! this.doc, this.getBaseNamespace(), this.getBaseLocalName()
! );
}
+
/**
*
* @param element
* @throws XMLSignatureException
* @throws InvalidTransformException
* @throws XMLSecurityException
* @throws TransformationException
*/
public TransformsImpl(Element element)
! throws XMLSignatureException, InvalidTransformException,
! XMLSecurityException, TransformationException {
super(element, "");
}
/**
*
! * @return the XML Element form of that Transforms
*/
public Element toElement() {
! if (doc == null) {
! doc = contextDocument;
! }
return getElement();
}
/** @inheritDoc */
public com.sun.org.apache.xml.internal.security.transforms.Transforms getDSTransforms() {
! return this;
}
// Over-ride the namespace
/** @inheritDoc */
public String getBaseNamespace() {
return EncryptionConstants.EncryptionSpecNS;
}
}
private class ReferenceListImpl implements ReferenceList {
private Class<?> sentry;
private List<Reference> references;
+
/**
! * Constructor.
* @param type
*/
public ReferenceListImpl(int type) {
if (type == ReferenceList.DATA_REFERENCE) {
sentry = DataReference.class;
*** 3837,3893 ****
} else {
throw new IllegalArgumentException();
}
references = new LinkedList<Reference>();
}
/** @inheritDoc */
public void add(Reference reference) {
if (!reference.getClass().equals(sentry)) {
throw new IllegalArgumentException();
}
references.add(reference);
}
/** @inheritDoc */
public void remove(Reference reference) {
if (!reference.getClass().equals(sentry)) {
throw new IllegalArgumentException();
}
references.remove(reference);
}
/** @inheritDoc */
public int size() {
! return (references.size());
}
/** @inheritDoc */
public boolean isEmpty() {
! return (references.isEmpty());
}
/** @inheritDoc */
public Iterator<Reference> getReferences() {
! return (references.iterator());
}
Element toElement() {
! Element result = ElementProxy.createElementForFamily(
! _contextDocument,
EncryptionConstants.EncryptionSpecNS,
! EncryptionConstants._TAG_REFERENCELIST);
Iterator<Reference> eachReference = references.iterator();
while (eachReference.hasNext()) {
Reference reference = eachReference.next();
! result.appendChild(
! ((ReferenceImpl) reference).toElement());
}
! return (result);
}
/** @inheritDoc */
public Reference newDataReference(String uri) {
! return (new DataReference(uri));
}
/** @inheritDoc */
public Reference newKeyReference(String uri) {
! return (new KeyReference(uri));
}
/**
* <code>ReferenceImpl</code> is an implementation of
* <code>Reference</code>.
--- 3388,3452 ----
} else {
throw new IllegalArgumentException();
}
references = new LinkedList<Reference>();
}
+
/** @inheritDoc */
public void add(Reference reference) {
if (!reference.getClass().equals(sentry)) {
throw new IllegalArgumentException();
}
references.add(reference);
}
+
/** @inheritDoc */
public void remove(Reference reference) {
if (!reference.getClass().equals(sentry)) {
throw new IllegalArgumentException();
}
references.remove(reference);
}
+
/** @inheritDoc */
public int size() {
! return references.size();
}
+
/** @inheritDoc */
public boolean isEmpty() {
! return references.isEmpty();
}
+
/** @inheritDoc */
public Iterator<Reference> getReferences() {
! return references.iterator();
}
Element toElement() {
! Element result =
! ElementProxy.createElementForFamily(
! contextDocument,
EncryptionConstants.EncryptionSpecNS,
! EncryptionConstants._TAG_REFERENCELIST
! );
Iterator<Reference> eachReference = references.iterator();
while (eachReference.hasNext()) {
Reference reference = eachReference.next();
! result.appendChild(((ReferenceImpl) reference).toElement());
}
! return result;
}
+
/** @inheritDoc */
public Reference newDataReference(String uri) {
! return new DataReference(uri);
}
+
/** @inheritDoc */
public Reference newKeyReference(String uri) {
! return new KeyReference(uri);
}
/**
* <code>ReferenceImpl</code> is an implementation of
* <code>Reference</code>.
*** 3896,3967 ****
*/
private abstract class ReferenceImpl implements Reference {
private String uri;
private List<Element> referenceInformation;
! ReferenceImpl(String _uri) {
! this.uri = _uri;
referenceInformation = new LinkedList<Element>();
}
/** @inheritDoc */
public String getURI() {
! return (uri);
}
/** @inheritDoc */
public Iterator<Element> getElementRetrievalInformation() {
! return (referenceInformation.iterator());
}
/** @inheritDoc */
! public void setURI(String _uri) {
! this.uri = _uri;
}
/** @inheritDoc */
public void removeElementRetrievalInformation(Element node) {
referenceInformation.remove(node);
}
/** @inheritDoc */
public void addElementRetrievalInformation(Element node) {
referenceInformation.add(node);
}
/**
! *
! * @return
*/
! public abstract Element toElement();
!
! Element toElement(String tagName) {
! Element result = ElementProxy.createElementForFamily(
! _contextDocument,
EncryptionConstants.EncryptionSpecNS,
! tagName);
result.setAttribute(EncryptionConstants._ATT_URI, uri);
// TODO: Need to martial referenceInformation
// Figure out how to make this work..
// <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
! return (result);
}
}
private class DataReference extends ReferenceImpl {
DataReference(String uri) {
super(uri);
}
/** @inheritDoc */
! public Element toElement() {
! return super.toElement(EncryptionConstants._TAG_DATAREFERENCE);
}
}
private class KeyReference extends ReferenceImpl {
KeyReference(String uri) {
! super (uri);
}
/** @inheritDoc */
! public Element toElement() {
! return super.toElement(EncryptionConstants._TAG_KEYREFERENCE);
}
}
}
}
}
--- 3455,3539 ----
*/
private abstract class ReferenceImpl implements Reference {
private String uri;
private List<Element> referenceInformation;
! ReferenceImpl(String uri) {
! this.uri = uri;
referenceInformation = new LinkedList<Element>();
}
+
+ /** @inheritDoc */
+ public abstract String getType();
+
/** @inheritDoc */
public String getURI() {
! return uri;
}
+
/** @inheritDoc */
public Iterator<Element> getElementRetrievalInformation() {
! return referenceInformation.iterator();
}
+
/** @inheritDoc */
! public void setURI(String uri) {
! this.uri = uri;
}
+
/** @inheritDoc */
public void removeElementRetrievalInformation(Element node) {
referenceInformation.remove(node);
}
+
/** @inheritDoc */
public void addElementRetrievalInformation(Element node) {
referenceInformation.add(node);
}
+
/**
! * @return the XML Element form of that Reference
*/
! public Element toElement() {
! String tagName = getType();
! Element result =
! ElementProxy.createElementForFamily(
! contextDocument,
EncryptionConstants.EncryptionSpecNS,
! tagName
! );
result.setAttribute(EncryptionConstants._ATT_URI, uri);
// TODO: Need to martial referenceInformation
// Figure out how to make this work..
// <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
! return result;
}
}
private class DataReference extends ReferenceImpl {
+
DataReference(String uri) {
super(uri);
}
+
/** @inheritDoc */
! public String getType() {
! return EncryptionConstants._TAG_DATAREFERENCE;
}
}
private class KeyReference extends ReferenceImpl {
+
KeyReference(String uri) {
! super(uri);
}
+
/** @inheritDoc */
! public String getType() {
! return EncryptionConstants._TAG_KEYREFERENCE;
}
}
}
}
}