Author: nandana
Date: Thu Aug 27 22:06:56 2009
New Revision: 808659

URL: http://svn.apache.org/viewvc?rev=808659&view=rev
Log:
RAMPART-231 Applying Thilina's patch for SAML 2.0 support. Thanks Thilina

Added:
    
webservices/rampart/branches/java/1_5/modules/rampart-trust/src/main/java/org/apache/rahas/impl/SAML2TokenIssuer.java
    
webservices/rampart/branches/java/1_5/modules/rampart-trust/src/main/java/org/apache/rahas/impl/util/SAML2KeyInfo.java
    
webservices/rampart/branches/java/1_5/modules/rampart-trust/src/main/java/org/apache/rahas/impl/util/SAML2Utils.java
    
webservices/rampart/branches/java/1_5/modules/rampart-trust/src/main/java/org/apache/rahas/impl/util/SAMLUtils.java
    
webservices/rampart/branches/java/1_5/modules/rampart-trust/src/main/java/org/apache/rahas/impl/util/SignKeyHolder.java

Added: 
webservices/rampart/branches/java/1_5/modules/rampart-trust/src/main/java/org/apache/rahas/impl/SAML2TokenIssuer.java
URL: 
http://svn.apache.org/viewvc/webservices/rampart/branches/java/1_5/modules/rampart-trust/src/main/java/org/apache/rahas/impl/SAML2TokenIssuer.java?rev=808659&view=auto
==============================================================================
--- 
webservices/rampart/branches/java/1_5/modules/rampart-trust/src/main/java/org/apache/rahas/impl/SAML2TokenIssuer.java
 (added)
+++ 
webservices/rampart/branches/java/1_5/modules/rampart-trust/src/main/java/org/apache/rahas/impl/SAML2TokenIssuer.java
 Thu Aug 27 22:06:56 2009
@@ -0,0 +1,745 @@
+/*
+ * Copyright 2004,2005 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 org.apache.rahas.impl;
+
+import org.apache.rahas.*;
+import org.apache.rahas.TrustException;
+import org.apache.rahas.impl.util.SignKeyHolder;
+import org.apache.rahas.impl.util.SAMLAttributeCallback;
+import org.apache.rahas.impl.util.SAMLCallbackHandler;
+import org.apache.axiom.soap.SOAPEnvelope;
+import org.apache.axiom.om.OMElement;
+import org.apache.axiom.om.OMNode;
+import org.apache.axiom.om.util.UUIDGenerator;
+import org.apache.axiom.om.impl.dom.jaxp.DocumentBuilderFactoryImpl;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.description.Parameter;
+import org.apache.ws.security.components.crypto.Crypto;
+import org.apache.ws.security.components.crypto.CryptoFactory;
+import org.apache.ws.security.message.WSSecEncryptedKey;
+import org.apache.ws.security.WSConstants;
+import org.apache.ws.security.WSSecurityException;
+import org.apache.ws.security.util.Base64;
+import org.apache.ws.security.util.XmlSchemaDateFormat;
+import org.apache.xml.security.utils.EncryptionConstants;
+import org.apache.xml.security.c14n.Canonicalizer;
+import org.apache.xml.security.signature.XMLSignature;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.opensaml.*;
+import org.opensaml.Configuration;
+import org.opensaml.saml1.core.NameIdentifier;
+import org.opensaml.xml.*;
+import org.opensaml.xml.schema.impl.XSStringBuilder;
+import org.opensaml.xml.schema.XSString;
+import org.opensaml.xml.security.x509.X509Credential;
+import org.opensaml.xml.signature.*;
+import org.opensaml.xml.io.*;
+import org.opensaml.common.SAMLVersion;
+import org.opensaml.common.SAMLObjectBuilder;
+import org.opensaml.common.xml.SAMLConstants;
+import org.opensaml.saml2.core.impl.AssertionBuilder;
+import org.opensaml.saml2.core.impl.IssuerBuilder;
+import org.opensaml.saml2.core.impl.NameIDBuilder;
+import org.opensaml.saml2.core.impl.SubjectBuilder;
+import org.opensaml.saml2.core.*;
+import org.opensaml.saml2.metadata.EntitiesDescriptor;
+import org.joda.time.DateTime;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Text;
+import org.w3c.dom.Node;
+import org.w3c.dom.ls.DOMImplementationLS;
+import org.w3c.dom.ls.LSOutput;
+import org.w3c.dom.ls.LSSerializer;
+import org.w3c.dom.bootstrap.DOMImplementationRegistry;
+
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.DocumentBuilder;
+import java.util.Date;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.security.cert.X509Certificate;
+import java.security.cert.CertificateEncodingException;
+import java.security.PrivateKey;
+import java.text.DateFormat;
+import java.io.InputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+
+public class SAML2TokenIssuer implements TokenIssuer {
+
+    private Assertion SAMLAssertion;
+
+    private String configParamName;
+
+    private OMElement configElement;
+
+    private String configFile;
+
+    protected List<Signature> signatureList = new ArrayList<Signature>();
+
+    private boolean isSymmetricKeyBasedHoK = false;
+
+    private Log log = LogFactory.getLog(SAML2TokenIssuer.class);
+
+    public SOAPEnvelope issue(RahasData data) throws TrustException {
+        MessageContext inMsgCtx = data.getInMessageContext();
+
+        try {
+            SAMLTokenIssuerConfig config = null;
+            if (this.configElement != null) {
+                config = new SAMLTokenIssuerConfig(configElement
+                        
.getFirstChildWithName(SAMLTokenIssuerConfig.SAML_ISSUER_CONFIG));
+            }
+
+            // Look for the file
+            if (config == null && this.configFile != null) {
+                config = new SAMLTokenIssuerConfig(this.configFile);
+                //config = new 
SAMLTokenIssuerConfig("/home/thilina/Desktop/saml-issuer-config.xml");
+            }
+
+            // Look for the param
+            if (config == null && this.configParamName != null) {
+                Parameter param = inMsgCtx.getParameter(this.configParamName);
+                if (param != null && param.getParameterElement() != null) {
+                    config = new SAMLTokenIssuerConfig(param
+                            .getParameterElement().getFirstChildWithName(
+                            SAMLTokenIssuerConfig.SAML_ISSUER_CONFIG));
+                } else {
+                    throw new TrustException("expectedParameterMissing",
+                            new String[]{this.configParamName});
+                }
+            }
+
+            if (config == null) {
+                throw new TrustException("configurationIsNull");
+            }
+
+            SOAPEnvelope env = TrustUtil.createSOAPEnvelope(inMsgCtx
+                    .getEnvelope().getNamespace().getNamespaceURI());
+
+            Crypto crypto;
+            if (config.cryptoElement != null) { // crypto props
+                // defined as
+                // elements
+                crypto = CryptoFactory.getInstance(TrustUtil
+                        .toProperties(config.cryptoElement), inMsgCtx
+                        .getAxisService().getClassLoader());
+            } else { // crypto props defined in a properties file
+                crypto = CryptoFactory.getInstance(config.cryptoPropertiesFile,
+                        inMsgCtx.getAxisService().getClassLoader());
+            }
+
+
+
+            // Get the document
+            Document doc = ((Element) env).getOwnerDocument();
+
+            // Get the key size and create a new byte array of that size
+            int keySize = data.getKeysize();
+            String keyType = data.getKeyType();
+
+            keySize = (keySize == -1) ? config.keySize : keySize;
+
+            // Set the "javax.xml.parsers.DocumentBuilderFactory" sys. 
property to the endorsed JAMP impl.
+            String property = 
System.getProperty("javax.xml.parsers.DocumentBuilderFactory");
+            System.setProperty("javax.xml.parsers.DocumentBuilderFactory", 
"org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");
+
+
+            //start building SAML 2.0 token
+            DefaultBootstrap.bootstrap();
+
+            //Build the assertion
+            AssertionBuilder assertionBuilder = new AssertionBuilder();
+            Assertion assertion = assertionBuilder.buildObject();
+            assertion.setVersion(SAMLVersion.VERSION_20);
+
+            // Set an UUID as the ID of an assertion
+            assertion.setID(UUIDGenerator.getUUID());
+
+            //Set the issuer
+            IssuerBuilder issuerBuilder = new IssuerBuilder();
+            Issuer issuer = issuerBuilder.buildObject();
+            issuer.setValue(config.issuerName);
+            assertion.setIssuer(issuer);
+
+            // Set the issued time.
+            assertion.setIssueInstant(new DateTime());
+
+            // Validity period
+            DateTime creationDate = new DateTime();
+            DateTime expirationDate = new DateTime(creationDate.getMillis() + 
config.ttl);
+
+            // These variables are used to build the trust assertion
+            Date creationTime = creationDate.toDate();
+            Date expirationTime = expirationDate.toDate();
+
+            // Create the subject
+            Subject subject = createSubject(config, doc, crypto, creationDate, 
expirationDate, data);
+
+            // Set the subject
+            assertion.setSubject(subject);
+
+            // If a SymmetricKey is used build an attr stmt, if a public key 
is build an authn stmt. 
+            if (isSymmetricKeyBasedHoK) {
+                AttributeStatement attrStmt = createAttributeStatement(data, 
config);
+                assertion.getAttributeStatements().add(attrStmt);
+            } else {
+                AuthnStatement authStmt = createAuthnStatement(data);
+                assertion.getAuthnStatements().add(authStmt);
+            }
+
+            // Create a SignKeyHolder to hold the crypto objects that are used 
to sign the assertion
+            SignKeyHolder signKeyHolder = createSignKeyHolder(config, crypto);
+
+            // Sign the assertion
+            assertion = setSignature(assertion, signKeyHolder);
+
+
+            OMElement rstrElem;
+            int wstVersion = data.getVersion();
+            if (RahasConstants.VERSION_05_02 == wstVersion) {
+                rstrElem = TrustUtil.createRequestSecurityTokenResponseElement(
+                        wstVersion, env.getBody());
+            } else {
+                OMElement rstrcElem = TrustUtil
+                        .createRequestSecurityTokenResponseCollectionElement(
+                                wstVersion, env.getBody());
+                rstrElem = TrustUtil.createRequestSecurityTokenResponseElement(
+                        wstVersion, rstrcElem);
+            }
+
+            TrustUtil.createTokenTypeElement(wstVersion, rstrElem).setText(
+                    RahasConstants.TOK_TYPE_SAML_20);
+
+            if (keyType.endsWith(RahasConstants.KEY_TYPE_SYMM_KEY)) {
+                TrustUtil.createKeySizeElement(wstVersion, rstrElem, keySize);
+            }
+
+            if (config.addRequestedAttachedRef) {
+                TrustUtil.createRequestedAttachedRef(wstVersion, rstrElem, "#"
+                        + assertion.getID(), RahasConstants.TOK_TYPE_SAML_20);
+            }
+
+            if (config.addRequestedUnattachedRef) {
+                TrustUtil.createRequestedUnattachedRef(wstVersion, rstrElem,
+                        assertion.getID(), RahasConstants.TOK_TYPE_SAML_20);
+            }
+
+            if (data.getAppliesToAddress() != null) {
+                TrustUtil.createAppliesToElement(rstrElem, data
+                        .getAppliesToAddress(), data.getAddressingNs());
+            }
+
+            // Use GMT time in milliseconds
+            DateFormat zulu = new XmlSchemaDateFormat();
+
+            // Add the Lifetime element
+            TrustUtil.createLifetimeElement(wstVersion, rstrElem, zulu
+                    .format(creationTime), zulu.format(expirationTime));
+
+            // Create the RequestedSecurityToken element and add the SAML token
+            // to it
+            OMElement reqSecTokenElem = TrustUtil
+                    .createRequestedSecurityTokenElement(wstVersion, rstrElem);
+            Token assertionToken;
+
+            Node tempNode = assertion.getDOM();
+
+            //Serializing and re-generating the AXIOM element using the DOM 
Element created using xerces
+            Element element = assertion.getDOM();
+
+            ByteArrayOutputStream byteArrayOutputStrm = new 
ByteArrayOutputStream();
+
+            DOMImplementationRegistry registry = 
DOMImplementationRegistry.newInstance();
+
+            DOMImplementationLS impl =
+                    (DOMImplementationLS) registry.getDOMImplementation("LS");
+
+            LSSerializer writer = impl.createLSSerializer();
+            LSOutput output = impl.createLSOutput();
+            output.setByteStream(byteArrayOutputStrm);
+            writer.write(element, output);
+            String elementString = byteArrayOutputStrm.toString();
+
+            DocumentBuilderFactoryImpl.setDOOMRequired(true);
+
+            DocumentBuilderFactory documentBuilderFactory = 
DocumentBuilderFactory.newInstance();
+            documentBuilderFactory.setNamespaceAware(true);
+            DocumentBuilder docBuilder = 
documentBuilderFactory.newDocumentBuilder();
+            Document document = docBuilder.parse(new 
ByteArrayInputStream(elementString.trim().getBytes()));
+            Element assertionElement = document.getDocumentElement();
+            
+            reqSecTokenElem.addChild((OMNode) ((Element) rstrElem)
+                    .getOwnerDocument().importNode(tempNode, true));
+
+            // Store the token
+            assertionToken = new Token(assertion.getID(),
+                    (OMElement) assertionElement, creationTime,
+                    expirationTime);
+
+            // At this point we definitely have the secret
+            // Otherwise it should fail with an exception earlier
+            assertionToken.setSecret(data.getEphmeralKey());
+            TrustUtil.getTokenStore(inMsgCtx).add(assertionToken);
+
+            if (keyType.endsWith(RahasConstants.KEY_TYPE_SYMM_KEY)
+                    && config.keyComputation != 
SAMLTokenIssuerConfig.KeyComputation.KEY_COMP_USE_REQ_ENT) {
+
+                // Add the RequestedProofToken
+                TokenIssuerUtil.handleRequestedProofToken(data, wstVersion,
+                        config, rstrElem, assertionToken, doc);
+            }
+
+            return env;
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        finally {
+            // Unset the DOM impl to default
+            DocumentBuilderFactoryImpl.setDOOMRequired(false);
+        }
+
+
+        return null;
+    }
+
+    /**
+     * This method is used to create the subject of an assertion
+     * @param config
+     * @param doc
+     * @param crypto
+     * @param creationTime
+     * @param expirationTime
+     * @param data
+     * @return Subject
+     * @throws Exception
+     */
+    private Subject createSubject(SAMLTokenIssuerConfig config,
+                                  Document doc, Crypto crypto, DateTime 
creationTime,
+                                  DateTime expirationTime, RahasData data) 
throws Exception {
+
+
+        XMLObjectBuilderFactory builderFactory = 
Configuration.getBuilderFactory();
+        SAMLObjectBuilder<Subject> subjectBuilder =
+                (SAMLObjectBuilder<Subject>) 
builderFactory.getBuilder(Subject.DEFAULT_ELEMENT_NAME);
+        Subject subject = subjectBuilder.buildObject();
+        Element keyInfoElem = null;
+
+        // If it is a Symmetric Key
+        if (data.getKeyType().endsWith(RahasConstants.KEY_TYPE_SYMM_KEY)) {
+
+            isSymmetricKeyBasedHoK = true;
+            Element encryptedKeyElem;
+            X509Certificate serviceCert = null;
+            try {
+
+                // Get ApliesTo to figure out which service to issue the token
+                // for
+                serviceCert = config.getServiceCert(crypto, 
data.getAppliesToAddress());
+
+                // Create the encrypted key
+                WSSecEncryptedKey encrKeyBuilder = new WSSecEncryptedKey();
+
+                // Use thumbprint id
+                encrKeyBuilder
+                        
.setKeyIdentifierType(WSConstants.THUMBPRINT_IDENTIFIER);
+
+                // SEt the encryption cert
+                encrKeyBuilder.setUseThisCert(serviceCert);
+
+                // set keysize
+                int keysize = data.getKeysize();
+                keysize = (keysize != -1) ? keysize : config.keySize;
+                encrKeyBuilder.setKeySize(keysize);
+
+                encrKeyBuilder.setEphemeralKey(TokenIssuerUtil.getSharedSecret(
+                        data, config.keyComputation, keysize));
+
+                // Set key encryption algo
+                encrKeyBuilder
+                        
.setKeyEncAlgo(EncryptionConstants.ALGO_ID_KEYTRANSPORT_RSA15);
+
+                // Build
+                encrKeyBuilder.prepare(doc, crypto);
+
+                // Extract the base64 encoded secret value
+                byte[] tempKey = new byte[keysize / 8];
+                System.arraycopy(encrKeyBuilder.getEphemeralKey(), 0, tempKey,
+                        0, keysize / 8);
+
+                data.setEphmeralKey(tempKey);
+
+                // Extract the Encryptedkey DOM element
+                encryptedKeyElem = encrKeyBuilder.getEncryptedKeyElement();
+            } catch (WSSecurityException e) {
+                throw new TrustException(
+                        "errorInBuildingTheEncryptedKeyForPrincipal",
+                        new String[]{serviceCert.getSubjectDN().getName()},
+                        e);
+            }
+
+            keyInfoElem = doc.createElementNS(WSConstants.SIG_NS,
+                    "ds:KeyInfo");
+            ((OMElement) encryptedKeyElem).declareNamespace(WSConstants.SIG_NS,
+                    WSConstants.SIG_PREFIX);
+            ((OMElement) encryptedKeyElem).declareNamespace(WSConstants.ENC_NS,
+                    WSConstants.ENC_PREFIX);
+
+            keyInfoElem.appendChild(encryptedKeyElem);
+
+        }
+
+        // If it is a public Key
+        else {
+            try {
+                String subjectNameId = data.getPrincipal().getName();
+
+                //Create NameID and attach it to the subject
+                NameIDBuilder nb = new NameIDBuilder();
+                NameID nameID = nb.buildObject();
+                nameID.setValue(subjectNameId);
+                nameID.setFormat(NameIdentifier.EMAIL);
+                subject.setNameID(nameID);
+
+
+                // Create the ds:KeyValue element with the ds:X509Data
+                X509Certificate clientCert = data.getClientCert();
+
+                if (clientCert == null) {
+                    X509Certificate[] certs = crypto.getCertificates(
+                            data.getPrincipal().getName());
+                    clientCert = certs[0];
+                }
+
+                byte[] clientCertBytes = clientCert.getEncoded();
+
+                String base64Cert = Base64.encode(clientCertBytes);
+
+                Text base64CertText = doc.createTextNode(base64Cert);
+
+                //-----------------------------------------
+
+                Element x509CertElem = doc.createElementNS(WSConstants.SIG_NS,
+                        "ds:X509Certificate");
+                x509CertElem.appendChild(base64CertText);
+                Element x509DataElem = doc.createElementNS(WSConstants.SIG_NS,
+                        "ds:X509Data");
+                x509DataElem.appendChild(x509CertElem);
+
+
+                if (x509DataElem != null) {
+                    keyInfoElem = doc.createElementNS(WSConstants.SIG_NS, 
"ds:KeyInfo");
+                    ((OMElement) x509DataElem).declareNamespace(
+                            WSConstants.SIG_NS, WSConstants.SIG_PREFIX);
+                    ((OMElement) x509DataElem).declareNamespace(
+                            WSConstants.ENC_NS, WSConstants.ENC_PREFIX);
+
+                    keyInfoElem.appendChild(x509DataElem);
+                }
+
+            } catch (Exception e) {
+                throw new TrustException("samlAssertionCreationError", e);
+            }
+        }
+
+        // Unmarshall the keyInfo DOM element into an XMLObject
+        String keyInfoElementString = keyInfoElem.toString();
+        DocumentBuilderFactory documentBuilderFactory = 
DocumentBuilderFactory.newInstance();
+        documentBuilderFactory.setNamespaceAware(true);
+        DocumentBuilder docBuilder = 
documentBuilderFactory.newDocumentBuilder();
+        Document document = docBuilder.parse(new 
ByteArrayInputStream(keyInfoElementString.trim().getBytes()));
+        Element element = document.getDocumentElement();
+
+
+        // Get appropriate unmarshaller
+        UnmarshallerFactory unmarshallerFactory = 
Configuration.getUnmarshallerFactory();
+        Unmarshaller unmarshaller = 
unmarshallerFactory.getUnmarshaller(element);
+
+        // Unmarshall using the document root element, an keyInfo element in 
this case
+        XMLObject keyInfoElement = null;
+        try {
+            keyInfoElement = unmarshaller.unmarshall(element);
+        } catch (UnmarshallingException e) {
+            throw new TrustException("Error unmarshalling KeyInfo Element", e);
+        }
+
+
+        //Build the Subject Confirmation
+        SAMLObjectBuilder<SubjectConfirmation> subjectConfirmationBuilder =
+                (SAMLObjectBuilder<SubjectConfirmation>) 
builderFactory.getBuilder(SubjectConfirmation.DEFAULT_ELEMENT_NAME);
+        SubjectConfirmation subjectConfirmation = 
subjectConfirmationBuilder.buildObject();
+
+        //Set the subject Confirmation method
+        
subjectConfirmation.setMethod("urn:oasis:names:tc:SAML:2.0:cm:holder-of-key");
+
+        SAMLObjectBuilder<KeyInfoConfirmationDataType> 
keyInfoSubjectConfirmationDataBuilder =
+                (SAMLObjectBuilder<KeyInfoConfirmationDataType>) 
builderFactory.getBuilder(KeyInfoConfirmationDataType.TYPE_NAME);
+
+        //Build the subject confirmation data element
+        KeyInfoConfirmationDataType scData = 
keyInfoSubjectConfirmationDataBuilder.
+                buildObject(SubjectConfirmationData.DEFAULT_ELEMENT_NAME, 
KeyInfoConfirmationDataType.TYPE_NAME);
+
+        //Set the keyInfo element
+        scData.getKeyInfos().add(keyInfoElement);
+
+        // Set the validity period
+        scData.setNotBefore(creationTime);
+        scData.setNotOnOrAfter(expirationTime);
+
+        //Set the subject confirmation data
+        subjectConfirmation.setSubjectConfirmationData(scData);
+
+        //set the subject confirmation
+        subject.getSubjectConfirmations().add(subjectConfirmation);
+
+        if(log.isDebugEnabled()){
+            log.debug("SAML2.0 subject is constructed successfully.");
+        }
+        return subject;
+    }
+
+
+    /**
+     * This method is used to sign the assertion
+     * @param assertion
+     * @param cred
+     * @return Assertion
+     * @throws Exception
+     */
+    public Assertion setSignature(Assertion assertion, SignKeyHolder cred) 
throws Exception{
+
+        // Build the signature object and set the credentials.
+        Signature signature = (Signature) 
buildXMLObject(Signature.DEFAULT_ELEMENT_NAME);
+        signature.setSigningCredential(cred);
+        signature.setSignatureAlgorithm(cred.getSignatureAlgorithm());
+        
signature.setCanonicalizationAlgorithm(Canonicalizer.ALGO_ID_C14N_EXCL_OMIT_COMMENTS);
+
+        //Build the KeyInfo element and set the certificate
+        try {
+            KeyInfo keyInfo = (KeyInfo) 
buildXMLObject(KeyInfo.DEFAULT_ELEMENT_NAME);
+            X509Data data = (X509Data) 
buildXMLObject(X509Data.DEFAULT_ELEMENT_NAME);
+            org.opensaml.xml.signature.X509Certificate cert = 
(org.opensaml.xml.signature.X509Certificate) 
buildXMLObject(org.opensaml.xml.signature.X509Certificate.DEFAULT_ELEMENT_NAME);
+            String value = 
org.apache.xml.security.utils.Base64.encode(cred.getEntityCertificate().getEncoded());
+            cert.setValue(value);
+            data.getX509Certificates().add(cert);
+            keyInfo.getX509Datas().add(data);
+            signature.setKeyInfo(keyInfo);
+
+
+
+
+        assertion.setSignature(signature);
+        signatureList.add(signature);
+
+        //Marshall and Sign
+        MarshallerFactory marshallerFactory = 
org.opensaml.xml.Configuration.getMarshallerFactory();
+        Marshaller marshaller = marshallerFactory.getMarshaller(assertion);
+        marshaller.marshall(assertion);
+        org.apache.xml.security.Init.init();
+        Signer.signObjects(signatureList);
+        } catch (CertificateEncodingException e) {
+            throw new TrustException("Error in setting the signature", e);
+        }  catch (SignatureException e) {
+            throw new TrustException("errorMarshellingOrSigning", e);
+        } catch (MarshallingException e) {
+            throw new TrustException("errorMarshellingOrSigning", e);
+        }
+
+        if(log.isDebugEnabled()){
+            log.debug("SAML2.0 assertion is marshalled and signed..");
+        }
+
+        return assertion;
+    }
+
+
+    /**
+     * This method is used to build the assertion elements
+     * @param objectQName
+     * @return
+     * @throws Exception
+     */
+    protected static XMLObject buildXMLObject(QName objectQName) throws 
Exception {
+        XMLObjectBuilder builder = 
org.opensaml.xml.Configuration.getBuilderFactory().getBuilder(objectQName);
+        if (builder == null) {
+            throw new TrustException("Unable to retrieve builder for object 
QName "
+                    + objectQName);
+        }
+        return builder.buildObject(objectQName.getNamespaceURI(), 
objectQName.getLocalPart(),
+                objectQName.getPrefix());
+    }
+
+    /**
+     * This method is used to create SignKeyHolder instances that contains the 
credentials required for signing the
+     * assertion
+     * @param config
+     * @param crypto
+     * @return
+     * @throws TrustException
+     */
+    public SignKeyHolder createSignKeyHolder(SAMLTokenIssuerConfig config, 
Crypto crypto) throws TrustException {
+
+        SignKeyHolder signKeyHolder = new SignKeyHolder();
+
+        try {
+            X509Certificate[] issuerCerts = crypto
+                    .getCertificates(config.issuerKeyAlias);
+
+            String sigAlgo = XMLSignature.ALGO_ID_SIGNATURE_RSA;
+            String pubKeyAlgo = issuerCerts[0].getPublicKey().getAlgorithm();
+            if (pubKeyAlgo.equalsIgnoreCase("DSA")) {
+                sigAlgo = XMLSignature.ALGO_ID_SIGNATURE_DSA;
+            }
+            java.security.Key issuerPK = crypto.getPrivateKey(
+                    config.issuerKeyAlias, config.issuerKeyPassword);
+
+            signKeyHolder.setIssuerCerts(issuerCerts);
+            signKeyHolder.setIssuerPK((PrivateKey) issuerPK);
+            signKeyHolder.setSignatureAlgorithm(sigAlgo);
+
+        } catch (Exception e) {
+            throw new TrustException("Error creating issuer signature");
+        }
+
+        if(log.isDebugEnabled()){
+            log.debug("SignKeyHolder object is created with the 
credentials..");
+        }
+
+        return signKeyHolder;
+    }
+
+    /**
+     * Creates the Attribute Statement
+     * @param data
+     * @param config
+     * @return
+     * @throws SAMLException
+     */
+    public AttributeStatement createAttributeStatement(RahasData data, 
SAMLTokenIssuerConfig config) throws SAMLException {
+
+        XMLObjectBuilderFactory builderFactory = 
Configuration.getBuilderFactory();
+        SAMLObjectBuilder<AttributeStatement> attrStmtBuilder =
+                (SAMLObjectBuilder<AttributeStatement>) 
builderFactory.getBuilder(AttributeStatement.DEFAULT_ELEMENT_NAME);
+
+        AttributeStatement attrstmt = attrStmtBuilder.buildObject();
+
+        Attribute[] attributes = null;
+
+        //Call the attribute callback handlers to get any attributes if exists
+        if (config.getCallbackHander() != null) {
+            SAMLAttributeCallback cb = new SAMLAttributeCallback(data);
+            SAMLCallbackHandler handler = config.getCallbackHander();
+            handler.handle(cb);
+            attributes = cb.getSAML2Attributes();
+        }
+
+        //else add the attribute with a default value
+        else {
+            SAMLObjectBuilder<Attribute> attrBuilder =
+                    (SAMLObjectBuilder<Attribute>) 
builderFactory.getBuilder(Attribute.DEFAULT_ELEMENT_NAME);
+            Attribute attribute = attrBuilder.buildObject();
+            attribute.setName("Name");
+            
attribute.setNameFormat("urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified");
+
+            XSStringBuilder attributeValueBuilder = (XSStringBuilder) 
builderFactory
+                    .getBuilder(XSString.TYPE_NAME);
+
+            XSString stringValue = attributeValueBuilder.buildObject(
+                    AttributeValue.DEFAULT_ELEMENT_NAME, XSString.TYPE_NAME);
+            stringValue.setValue("Colombo/Rahas");
+            attribute.getAttributeValues().add(stringValue);
+            attributes = new Attribute[1];
+            attributes[0] = attribute;
+        }
+        //add attributes to the attribute statement
+        attrstmt.getAttributes().addAll(Arrays.asList(attributes));
+
+        if(log.isDebugEnabled()){
+            log.debug("SAML2.0 attribute statement is constructed 
successfully.");
+        }
+
+        return attrstmt;
+    }
+
+    /**
+     * build the authentication statement
+     * @param data
+     * @return
+     */
+    public AuthnStatement createAuthnStatement(RahasData data) {
+        XMLObjectBuilderFactory builderFactory = 
Configuration.getBuilderFactory();
+        MessageContext inMsgCtx = data.getInMessageContext();
+
+        SAMLObjectBuilder<AuthnStatement> authStmtBuilder =
+                (SAMLObjectBuilder<AuthnStatement>) 
builderFactory.getBuilder(AuthnStatement.DEFAULT_ELEMENT_NAME);
+
+        //build the auth stmt
+        AuthnStatement authStmt = authStmtBuilder.buildObject();
+
+        // set the authn instance
+        authStmt.setAuthnInstant(new DateTime());
+
+        SAMLObjectBuilder<AuthnContext> authCtxBuilder =
+                (SAMLObjectBuilder<AuthnContext>) 
builderFactory.getBuilder(AuthnContext.DEFAULT_ELEMENT_NAME);
+        AuthnContext authContext = authCtxBuilder.buildObject();
+
+        SAMLObjectBuilder<AuthnContextClassRef> authCtxClassRefBuilder =
+                (SAMLObjectBuilder<AuthnContextClassRef>) 
builderFactory.getBuilder(AuthnContextClassRef.DEFAULT_ELEMENT_NAME);
+        AuthnContextClassRef authCtxClassRef = 
authCtxClassRefBuilder.buildObject();
+        
+        //if username/password based authn
+        if (inMsgCtx.getProperty(RahasConstants.USERNAME) != null) {
+            
authCtxClassRef.setAuthnContextClassRef(AuthnContext.PASSWORD_AUTHN_CTX);
+        }
+        //if X.509 cert based authn
+        else if (inMsgCtx.getProperty(RahasConstants.X509_CERT) != null) {
+            
authCtxClassRef.setAuthnContextClassRef(AuthnContext.X509_AUTHN_CTX);
+        }
+
+        authContext.setAuthnContextClassRef(authCtxClassRef);
+        authStmt.setAuthnContext(authContext);
+
+        if(log.isDebugEnabled()){
+            log.debug("SAML2.0 authentication statement is constructed 
successfully.");
+        }
+
+        return authStmt;
+    }
+
+
+    public String getResponseAction(RahasData data) throws TrustException {
+        return null;
+    }
+
+    public void setConfigurationFile(String configFile) {
+        this.configFile = configFile;
+    }
+
+    public void setConfigurationElement(OMElement configElement) {
+        this.configElement = configElement;
+    }
+
+    public void setConfigurationParamName(String configParamName) {
+        this.configParamName = configParamName;
+    }
+
+}

Added: 
webservices/rampart/branches/java/1_5/modules/rampart-trust/src/main/java/org/apache/rahas/impl/util/SAML2KeyInfo.java
URL: 
http://svn.apache.org/viewvc/webservices/rampart/branches/java/1_5/modules/rampart-trust/src/main/java/org/apache/rahas/impl/util/SAML2KeyInfo.java?rev=808659&view=auto
==============================================================================
--- 
webservices/rampart/branches/java/1_5/modules/rampart-trust/src/main/java/org/apache/rahas/impl/util/SAML2KeyInfo.java
 (added)
+++ 
webservices/rampart/branches/java/1_5/modules/rampart-trust/src/main/java/org/apache/rahas/impl/util/SAML2KeyInfo.java
 Thu Aug 27 22:06:56 2009
@@ -0,0 +1,62 @@
+package org.apache.rahas.impl.util;
+
+import org.opensaml.saml2.core.Assertion;
+
+import java.security.cert.X509Certificate;/*
+ * Copyright 2004,2005 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.                                              
+ */
+
+/**
+ * TODO : This class should be moved to WSS4J once a new version of it is 
avaliable
+ * This class holds the secrets contained in a SAML2 token.
+ */
+public class SAML2KeyInfo {
+    /**
+     * Certificates
+     */
+    private X509Certificate[] certs;
+
+    /**
+     * Key bytes (e.g.: held in an encrypted key)
+     */
+    private byte[] secret;
+
+    /**
+     * SAMLAssertion
+     */
+    Assertion assertion;
+
+    public SAML2KeyInfo(Assertion assertions, X509Certificate[] certs) {
+        this.certs = certs;
+        this.assertion = assertions;
+    }
+
+    public SAML2KeyInfo(Assertion assertions, byte[] secret) {
+        this.secret = secret;
+        this.assertion = assertions;
+    }
+
+    public X509Certificate[] getCerts() {
+        return certs;
+    }
+
+    public byte[] getSecret() {
+        return secret;
+    }
+
+    public Assertion getAssertion() {
+        return assertion;
+    }
+}

Added: 
webservices/rampart/branches/java/1_5/modules/rampart-trust/src/main/java/org/apache/rahas/impl/util/SAML2Utils.java
URL: 
http://svn.apache.org/viewvc/webservices/rampart/branches/java/1_5/modules/rampart-trust/src/main/java/org/apache/rahas/impl/util/SAML2Utils.java?rev=808659&view=auto
==============================================================================
--- 
webservices/rampart/branches/java/1_5/modules/rampart-trust/src/main/java/org/apache/rahas/impl/util/SAML2Utils.java
 (added)
+++ 
webservices/rampart/branches/java/1_5/modules/rampart-trust/src/main/java/org/apache/rahas/impl/util/SAML2Utils.java
 Thu Aug 27 22:06:56 2009
@@ -0,0 +1,309 @@
+/*
+ * Copyright 2004,2005 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 org.apache.rahas.impl.util;
+
+import org.apache.axiom.om.impl.dom.jaxp.DocumentBuilderFactoryImpl;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.rahas.TrustException;
+import org.apache.ws.security.WSConstants;
+import org.apache.ws.security.WSPasswordCallback;
+import org.apache.ws.security.WSSecurityEngine;
+import org.apache.ws.security.WSSecurityException;
+import org.apache.ws.security.components.crypto.Crypto;
+import org.apache.ws.security.processor.EncryptedKeyProcessor;
+import org.apache.ws.security.util.Base64;
+import org.apache.xml.security.exceptions.XMLSecurityException;
+import org.apache.xml.security.keys.KeyInfo;
+import org.apache.xml.security.keys.content.X509Data;
+import org.apache.xml.security.keys.content.x509.XMLX509Certificate;
+import org.opensaml.Configuration;
+import org.opensaml.DefaultBootstrap;
+import org.opensaml.saml2.core.*;
+import org.opensaml.xml.ConfigurationException;
+import org.opensaml.xml.XMLObject;
+import org.opensaml.xml.io.*;
+import org.w3c.dom.*;
+import org.w3c.dom.bootstrap.DOMImplementationRegistry;
+import org.w3c.dom.ls.DOMImplementationLS;
+import org.w3c.dom.ls.LSOutput;
+import org.w3c.dom.ls.LSSerializer;
+import org.xml.sax.SAXException;
+
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.security.cert.X509Certificate;
+
+public class SAML2Utils {
+
+    private static final Log log = LogFactory.getLog(SAML2Utils.class);
+
+    public static Element getElementFromAssertion(XMLObject xmlObj) throws 
TrustException {
+        try {
+            
+            String jaxpProperty = 
System.getProperty("javax.xml.parsers.DocumentBuilderFactory");
+            System.setProperty("javax.xml.parsers.DocumentBuilderFactory", 
"org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");
+
+            MarshallerFactory marshallerFactory = 
org.opensaml.xml.Configuration.getMarshallerFactory();
+            Marshaller marshaller = marshallerFactory.getMarshaller(xmlObj);
+            Element element = marshaller.marshall(xmlObj);
+
+            // Reset the sys. property to its previous value.
+            if (jaxpProperty == null) {
+                
System.getProperties().remove("javax.xml.parsers.DocumentBuilderFactory");
+            } else {
+                System.setProperty("javax.xml.parsers.DocumentBuilderFactory", 
jaxpProperty);
+            }
+
+            ByteArrayOutputStream byteArrayOutputStrm = new 
ByteArrayOutputStream();
+
+            DOMImplementationRegistry registry = 
DOMImplementationRegistry.newInstance();
+
+            DOMImplementationLS impl =
+                    (DOMImplementationLS) registry.getDOMImplementation("LS");
+
+            LSSerializer writer = impl.createLSSerializer();
+            LSOutput output = impl.createLSOutput();
+            output.setByteStream(byteArrayOutputStrm);
+            writer.write(element, output);
+            String elementString = byteArrayOutputStrm.toString();
+
+            DocumentBuilderFactoryImpl.setDOOMRequired(true);
+
+            DocumentBuilderFactory documentBuilderFactory = 
DocumentBuilderFactory.newInstance();
+            documentBuilderFactory.setNamespaceAware(true);
+            DocumentBuilder docBuilder = 
documentBuilderFactory.newDocumentBuilder();
+            Document document = docBuilder.parse(new 
ByteArrayInputStream(elementString.trim().getBytes()));
+            Element assertionElement = document.getDocumentElement();
+            DocumentBuilderFactoryImpl.setDOOMRequired(false);
+
+            if (log.isDebugEnabled()) {
+                log.debug("DOM element is created successfully from the 
OpenSAML2 XMLObject");
+            }
+            return assertionElement;
+
+        } catch (Exception e) {
+            throw new TrustException("Error creating DOM object from the 
assertion", e);
+        }
+    }
+
+     /**
+     * Extract certificates or the key available in the SAMLAssertion
+     *
+     * @param elem
+     * @return the SAML2 Key Info
+     * @throws org.apache.ws.security.WSSecurityException
+     *
+     */
+    public static SAML2KeyInfo getSAML2KeyInfo(Element elem, Crypto crypto,
+                                              CallbackHandler cb) throws 
WSSecurityException {
+        Assertion assertion;
+
+        //build the assertion by unmarhalling the DOM element.
+        try {
+            DefaultBootstrap.bootstrap();
+
+            String keyInfoElementString = elem.toString();
+            DocumentBuilderFactory documentBuilderFactory = 
DocumentBuilderFactory.newInstance();
+            documentBuilderFactory.setNamespaceAware(true);
+            DocumentBuilder docBuilder = 
documentBuilderFactory.newDocumentBuilder();
+            Document document = docBuilder.parse(new 
ByteArrayInputStream(keyInfoElementString.trim().getBytes()));
+            Element element = document.getDocumentElement();
+            UnmarshallerFactory unmarshallerFactory = Configuration
+                    .getUnmarshallerFactory();
+            Unmarshaller unmarshaller = unmarshallerFactory
+                    .getUnmarshaller(element);
+            assertion = (Assertion) unmarshaller
+                    .unmarshall(element);
+        }
+        catch (ConfigurationException e) {
+            throw new WSSecurityException(
+                    WSSecurityException.FAILURE, "Failure in bootstrapping", 
null, e);
+        } catch (UnmarshallingException e) {
+            throw new WSSecurityException(
+                    WSSecurityException.FAILURE, "Failure in unmarshelling the 
assertion", null, e);
+        } catch (IOException e) {
+            throw new WSSecurityException(
+                    WSSecurityException.FAILURE, "Failure in unmarshelling the 
assertion", null, e);
+        } catch (SAXException e) {
+            throw new WSSecurityException(
+                    WSSecurityException.FAILURE, "Failure in unmarshelling the 
assertion", null, e);
+        } catch (ParserConfigurationException e) {
+            throw new WSSecurityException(
+                    WSSecurityException.FAILURE, "Failure in unmarshelling the 
assertion", null, e);
+        }
+        return getSAML2KeyInfo(assertion, crypto, cb);
+
+    }
+
+    public static SAML2KeyInfo getSAML2KeyInfo(Assertion assertion, Crypto 
crypto,
+                                               CallbackHandler cb) throws 
WSSecurityException {
+
+        //First ask the cb whether it can provide the secret
+        WSPasswordCallback pwcb = new WSPasswordCallback(assertion.getID(), 
WSPasswordCallback.CUSTOM_TOKEN);
+        if (cb != null) {
+            try {
+                cb.handle(new Callback[]{pwcb});
+            } catch (Exception e1) {
+                throw new WSSecurityException(WSSecurityException.FAILURE, 
"noKey",
+                        new Object[]{assertion.getID()}, e1);
+            }
+        }
+
+        byte[] key = pwcb.getKey();
+
+        if (key != null) {
+            return new SAML2KeyInfo(assertion, key);
+        } else {
+            // if the cb fails to provide the secret.
+            try {
+                // extract the subject
+                Subject samlSubject = assertion.getSubject();
+                if (samlSubject == null) {
+                    throw new WSSecurityException(WSSecurityException.FAILURE,
+                            "invalidSAML2Token", new Object[]{"for Signature 
(no Subject)"});
+                }
+
+                // extract the subject confirmation element from the subject
+                SubjectConfirmation subjectConf = (SubjectConfirmation) 
samlSubject.getSubjectConfirmations().get(0);
+                if (subjectConf == null) {
+                    throw new WSSecurityException(WSSecurityException.FAILURE,
+                            "invalidSAML2Token", new Object[]{"for Signature 
(no Subject Confirmation)"});
+                }
+
+                // Get the subject confirmation data, 
KeyInfoConfirmationDataType extends SubjectConfirmationData.
+                KeyInfoConfirmationDataType scData = 
(KeyInfoConfirmationDataType) subjectConf.getSubjectConfirmationData();
+                if (scData == null) {
+                    throw new WSSecurityException(WSSecurityException.FAILURE,
+                            "invalidSAML2Token", new Object[]{"for Signature 
(no Subject Confirmation Data)"});
+                }
+
+                // Get the SAML specific XML representation of the keyInfo 
object
+                XMLObject KIElem = scData.getKeyInfos() != null ? (XMLObject) 
scData.getKeyInfos().get(0) : null;
+
+                Element keyInfoElement;
+
+                // Generate a DOM element from the XMLObject.
+                if (KIElem != null) {
+
+                    // Set the "javax.xml.parsers.DocumentBuilderFactory" 
system property to make sure the endorsed JAXP
+                    // implementation is picked over the default jaxp impl 
shipped with the JDK.
+                    String jaxpProperty = 
System.getProperty("javax.xml.parsers.DocumentBuilderFactory");
+                    
System.setProperty("javax.xml.parsers.DocumentBuilderFactory", 
"org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");
+
+                    MarshallerFactory marshallerFactory = 
org.opensaml.xml.Configuration.getMarshallerFactory();
+                    Marshaller marshaller = 
marshallerFactory.getMarshaller(KIElem);
+                    keyInfoElement = marshaller.marshall(KIElem);
+
+                    // Reset the sys. property to its previous value.
+                    if (jaxpProperty == null) {
+                        
System.getProperties().remove("javax.xml.parsers.DocumentBuilderFactory");
+                    } else {
+                        
System.setProperty("javax.xml.parsers.DocumentBuilderFactory", jaxpProperty);
+                    }
+
+                } else {
+                    throw new WSSecurityException(WSSecurityException.FAILURE,
+                            "invalidSAML2Token", new Object[]{"for Signature 
(no key info element)"});
+                }
+
+                AttributeStatement attrStmt = 
assertion.getAttributeStatements().size() != 0 ?
+                        (AttributeStatement) 
assertion.getAttributeStatements().get(0) : null;
+                AuthnStatement authnStmt = 
assertion.getAuthnStatements().size() != 0 ?
+                        (AuthnStatement) assertion.getAuthnStatements().get(0) 
: null;
+
+                // if an attr stmt is present, then it has a symmetric key.
+                if (attrStmt != null) {
+                    NodeList children = keyInfoElement.getChildNodes();
+                    int len = children.getLength();
+
+                    for (int i = 0; i < len; i++) {
+                        Node child = children.item(i);
+                        if (child.getNodeType() != Node.ELEMENT_NODE) {
+                            continue;
+                        }
+                        QName el = new QName(child.getNamespaceURI(), 
child.getLocalName());
+                        if (el.equals(WSSecurityEngine.ENCRYPTED_KEY)) {
+
+                            EncryptedKeyProcessor proc = new 
EncryptedKeyProcessor();
+                            proc.handleEncryptedKey((Element) child, cb, 
crypto, null);
+
+                            return new SAML2KeyInfo(assertion, 
proc.getDecryptedBytes());
+                        } else if (el.equals(new QName(WSConstants.WST_NS, 
"BinarySecret"))) {
+                            Text txt = (Text) child.getFirstChild();
+                            return new SAML2KeyInfo(assertion, 
Base64.decode(txt.getData()));
+                        }
+                    }
+
+                }
+
+                // If an authn stmt is presentm then it has a public key.
+                else if (authnStmt != null) {
+
+                    X509Certificate[] certs = null;
+                    try {
+                        KeyInfo ki = new KeyInfo(keyInfoElement, null);
+
+                        if (ki.containsX509Data()) {
+                            X509Data data = ki.itemX509Data(0);
+                            XMLX509Certificate certElem = null;
+                            if (data != null && data.containsCertificate()) {
+                                certElem = data.itemCertificate(0);
+                            }
+                            if (certElem != null) {
+                                X509Certificate cert = 
certElem.getX509Certificate();
+                                certs = new X509Certificate[1];
+                                certs[0] = cert;
+                                return new SAML2KeyInfo(assertion, certs);
+                            }
+                        }
+
+                    } catch (XMLSecurityException e3) {
+                        throw new 
WSSecurityException(WSSecurityException.FAILURE,
+                                "invalidSAMLsecurity",
+                                new Object[]{"cannot get certificate (key 
holder)"}, e3);
+                    }
+
+                } else {
+                    throw new WSSecurityException(WSSecurityException.FAILURE,
+                            "invalidSAMLsecurity",
+                            new Object[]{"cannot get certificate or key "});
+                }
+
+
+                throw new WSSecurityException(WSSecurityException.FAILURE,
+                        "invalidSAMLsecurity",
+                        new Object[]{"cannot get certificate or key "});
+
+            } catch (MarshallingException e) {
+                throw new WSSecurityException(WSSecurityException.FAILURE,
+                        "Failed marshalling the SAML Assertion", null, e);
+            }
+        }
+    }
+
+}
+
+

Added: 
webservices/rampart/branches/java/1_5/modules/rampart-trust/src/main/java/org/apache/rahas/impl/util/SAMLUtils.java
URL: 
http://svn.apache.org/viewvc/webservices/rampart/branches/java/1_5/modules/rampart-trust/src/main/java/org/apache/rahas/impl/util/SAMLUtils.java?rev=808659&view=auto
==============================================================================
--- 
webservices/rampart/branches/java/1_5/modules/rampart-trust/src/main/java/org/apache/rahas/impl/util/SAMLUtils.java
 (added)
+++ 
webservices/rampart/branches/java/1_5/modules/rampart-trust/src/main/java/org/apache/rahas/impl/util/SAMLUtils.java
 Thu Aug 27 22:06:56 2009
@@ -0,0 +1,30 @@
+package org.apache.rahas.impl.util;
+
+import org.apache.rahas.impl.SAMLTokenIssuerConfig;
+import org.apache.ws.security.components.crypto.Crypto;
+import org.apache.ws.security.WSSecurityException;
+
+import java.security.cert.X509Certificate;
+import java.util.Collection;
+import java.util.ArrayList;
+
+public class SAMLUtils {
+
+
+    public static Collection<X509Certificate> 
getCertChainCollection(X509Certificate[] issuerCerts){
+
+         ArrayList<X509Certificate> certCollection = new 
ArrayList<X509Certificate>();
+
+        if (issuerCerts == null) {
+            return certCollection;
+        } else {
+            for (X509Certificate cert : issuerCerts) {
+                certCollection.add(cert);    
+            }
+        }
+
+        return certCollection;
+
+    }
+}
+

Added: 
webservices/rampart/branches/java/1_5/modules/rampart-trust/src/main/java/org/apache/rahas/impl/util/SignKeyHolder.java
URL: 
http://svn.apache.org/viewvc/webservices/rampart/branches/java/1_5/modules/rampart-trust/src/main/java/org/apache/rahas/impl/util/SignKeyHolder.java?rev=808659&view=auto
==============================================================================
--- 
webservices/rampart/branches/java/1_5/modules/rampart-trust/src/main/java/org/apache/rahas/impl/util/SignKeyHolder.java
 (added)
+++ 
webservices/rampart/branches/java/1_5/modules/rampart-trust/src/main/java/org/apache/rahas/impl/util/SignKeyHolder.java
 Thu Aug 27 22:06:56 2009
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2004,2005 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 org.apache.rahas.impl.util;
+
+
+import org.opensaml.xml.security.credential.Credential;
+import org.opensaml.xml.security.credential.CredentialContextSet;
+import org.opensaml.xml.security.credential.UsageType;
+import org.opensaml.xml.security.x509.X509Credential;
+
+import javax.crypto.SecretKey;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.cert.X509CRL;
+import java.security.cert.X509Certificate;
+import java.util.Arrays;
+import java.util.Collection;
+
+/**
+ * This class is used to store the signing credentials.
+ */
+public class SignKeyHolder implements X509Credential {
+
+    private String signatureAlgorithm = null;
+
+    private X509Certificate[] issuerCerts = null;
+
+       private PrivateKey issuerPK = null;
+
+
+    public String getSignatureAlgorithm() {
+        return signatureAlgorithm;
+    }
+
+    public void setSignatureAlgorithm(String signatureAlgorithm) {
+        this.signatureAlgorithm = signatureAlgorithm;
+    }
+
+ 
+    public X509Certificate[] getIssuerCerts() {
+        return issuerCerts;
+    }
+
+    public void setIssuerCerts(X509Certificate[] issuerCerts) {
+        this.issuerCerts = issuerCerts;
+    }
+
+    public PrivateKey getIssuerPK() {
+        return issuerPK;
+    }
+
+    public void setIssuerPK(PrivateKey issuerPK) {
+        this.issuerPK = issuerPK;
+    }
+
+    public SignKeyHolder(){
+    }
+
+
+    public X509Certificate getEntityCertificate() {
+        return issuerCerts[0];
+    }
+
+
+    public Collection<X509Certificate> getEntityCertificateChain() {
+        return Arrays.asList(issuerCerts);
+    }
+
+    public Collection<X509CRL> getCRLs() {
+        return null;
+    }
+
+    public String getEntityId() {
+        return null;
+    }
+
+    public UsageType getUsageType() {
+        return null;
+    }
+
+    public Collection<String> getKeyNames() {
+        return null;
+    }
+
+    public PublicKey getPublicKey() {
+        return null;
+    }
+
+    public PrivateKey getPrivateKey() {
+        return issuerPK;
+    }
+
+    public SecretKey getSecretKey() {
+        return null;
+    }
+
+    public CredentialContextSet getCredentalContextSet() {
+        return null;
+    }
+
+    public Class<? extends Credential> getCredentialType() {
+        return null;
+    }
+}


Reply via email to