All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.wss4j.dom.action.AbstractDerivedAction Maven / Gradle / Ivy

There is a newer version: 3.0.4
Show newest version
/**
 * 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 org.apache.wss4j.dom.action;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.apache.wss4j.common.SignatureEncryptionActionToken;
import org.apache.wss4j.common.derivedKey.ConversationConstants;
import org.apache.wss4j.common.ext.WSPasswordCallback;
import org.apache.wss4j.common.ext.WSSecurityException;
import org.apache.wss4j.dom.WSConstants;
import org.apache.wss4j.dom.handler.RequestData;
import org.apache.wss4j.dom.message.WSSecDerivedKeyBase;
import org.apache.wss4j.dom.message.WSSecEncryptedKey;
import org.apache.wss4j.dom.message.WSSecHeader;
import org.apache.wss4j.dom.message.token.SecurityContextToken;
import org.apache.xml.security.stax.impl.util.IDGenerator;

public abstract class AbstractDerivedAction {

    protected Node findEncryptedKeySibling(RequestData reqData) {
        Element secHeader = reqData.getSecHeader().getSecurityHeaderElement();
        return findSibling(secHeader, WSConstants.ENC_NS, "EncryptedKey");
    }

    protected Node findSCTSibling(RequestData reqData) {
        String namespace = ConversationConstants.WSC_NS_05_12;
        if (!reqData.isUse200512Namespace()) {
            namespace = ConversationConstants.WSC_NS_05_02;
        }
        Element secHeader = reqData.getSecHeader().getSecurityHeaderElement();
        return findSibling(secHeader, namespace, "SecurityContextToken");
    }

    protected Node findSibling(Element secHeader, String namespace, String localName) {
        if (secHeader == null) {
            return null;
        }
        Node firstChild = secHeader.getFirstChild();
        while (firstChild != null) {
            if (firstChild instanceof Element
                && namespace.equals(((Element)firstChild).getNamespaceURI())
                && localName.equals(((Element)firstChild).getLocalName())
                && firstChild.getNextSibling() != null) {
                return firstChild.getNextSibling();
            }
            firstChild = firstChild.getNextSibling();
        }
        return null;
    }

    protected Element setupSCTReference(WSSecDerivedKeyBase derivedKeyBase,
                                        WSPasswordCallback passwordCallback,
                                        SignatureEncryptionActionToken actionToken,
                                        SignatureEncryptionActionToken previousActionToken,
                                        boolean use200512Namespace,
                                        Document doc) throws WSSecurityException {
        if (use200512Namespace) {
            derivedKeyBase.setCustomValueType(WSConstants.WSC_SCT_05_12);
        } else {
            derivedKeyBase.setCustomValueType(WSConstants.WSC_SCT);
        }

        // See if a previous derived action has already set up a SecurityContextToken
        if (previousActionToken != null && previousActionToken.getKey() != null
            && previousActionToken.getKeyIdentifier() != null) {
            byte[] secret = previousActionToken.getKey();
            String tokenIdentifier = previousActionToken.getKeyIdentifier();
            derivedKeyBase.setExternalKey(secret, tokenIdentifier);
            return null;
        }  else {
            String tokenIdentifier = IDGenerator.generateID("uuid:");
            derivedKeyBase.setExternalKey(passwordCallback.getKey(), tokenIdentifier);

            actionToken.setKey(passwordCallback.getKey());
            actionToken.setKeyIdentifier(tokenIdentifier);

            int version = ConversationConstants.VERSION_05_12;
            if (!use200512Namespace) {
                version = ConversationConstants.VERSION_05_02;
            }

            SecurityContextToken sct = new SecurityContextToken(version, doc, tokenIdentifier);
            return sct.getElement();
        }
    }

    protected Element setupEKReference(WSSecDerivedKeyBase derivedKeyBase,
                                       WSSecHeader securityHeader,
                                        WSPasswordCallback passwordCallback,
                                        SignatureEncryptionActionToken actionToken,
                                        SignatureEncryptionActionToken previousActionToken,
                                        boolean use200512Namespace,
                                        Document doc,
                                        String keyTransportAlgorithm,
                                        String mgfAlgorithm) throws WSSecurityException {
        derivedKeyBase.setCustomValueType(WSConstants.WSS_ENC_KEY_VALUE_TYPE);

        // See if a previous derived action has already set up an EncryptedKey
        if (previousActionToken != null && previousActionToken.getKey() != null
            && previousActionToken.getKeyIdentifier() != null) {
            byte[] ek = previousActionToken.getKey();
            String tokenIdentifier = previousActionToken.getKeyIdentifier();
            derivedKeyBase.setExternalKey(ek, tokenIdentifier);
            return null;
        } else {
            WSSecEncryptedKey encrKeyBuilder = new WSSecEncryptedKey(securityHeader);
            encrKeyBuilder.setUserInfo(actionToken.getUser());
            if (actionToken.getDerivedKeyIdentifier() != 0) {
                encrKeyBuilder.setKeyIdentifierType(actionToken.getDerivedKeyIdentifier());
            } else {
                encrKeyBuilder.setKeyIdentifierType(WSConstants.THUMBPRINT_IDENTIFIER);
            }

            if (actionToken.getDigestAlgorithm() != null) {
                encrKeyBuilder.setDigestAlgorithm(actionToken.getDigestAlgorithm());
            }
            if (keyTransportAlgorithm != null) {
                encrKeyBuilder.setKeyEncAlgo(keyTransportAlgorithm);
            }
            if (mgfAlgorithm != null) {
                encrKeyBuilder.setMGFAlgorithm(mgfAlgorithm);
            }

            encrKeyBuilder.prepare(actionToken.getCrypto());

            byte[] ek = encrKeyBuilder.getEphemeralKey();
            String tokenIdentifier = encrKeyBuilder.getId();

            actionToken.setKey(ek);
            actionToken.setKeyIdentifier(tokenIdentifier);

            derivedKeyBase.setExternalKey(ek, tokenIdentifier);
            return encrKeyBuilder.getEncryptedKeyElement();
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy