Package org.apache.rampart.policy

Examples of org.apache.rampart.policy.RampartPolicyData


    protected WSSecUsernameToken addUsernameToken(RampartMessageData rmd, UsernameToken token)
            throws RampartException {

        log.debug("Adding a UsernameToken");

        RampartPolicyData rpd = rmd.getPolicyData();

        // Get the user
        // First try options
        Options options = rmd.getMsgContext().getOptions();
        String user = options.getUserName();
        if (user == null || user.length() == 0) {
            // Then try RampartConfig
            if (rpd.getRampartConfig() != null) {
                user = rpd.getRampartConfig().getUser();
            }
        }

        if (user != null && !"".equals(user)) {
            if (log.isDebugEnabled()) {
View Full Code Here


     * @throws RampartException
     */
    protected WSSecEncryptedKey getEncryptedKeyBuilder(RampartMessageData rmd, Token token)
            throws RampartException {

        RampartPolicyData rpd = rmd.getPolicyData();
        Document doc = rmd.getDocument();

        WSSecEncryptedKey encrKey = new WSSecEncryptedKey();

        try {
            RampartUtil.setKeyIdentifierType(rmd, encrKey, token);
            RampartUtil.setEncryptionUser(rmd, encrKey);
            encrKey.setKeySize(rpd.getAlgorithmSuite().getMaximumSymmetricKeyLength());
            encrKey.setKeyEncAlgo(rpd.getAlgorithmSuite().getAsymmetricKeyWrap());

            encrKey.prepare(
                    doc,
                    RampartUtil.getEncryptionCrypto(rpd.getRampartConfig(),
                            rmd.getCustomClassLoader()));

            return encrKey;
        } catch (WSSecurityException e) {
            throw new RampartException("errorCreatingEncryptedKey", e);
View Full Code Here

    }

    protected WSSecSignature getSignatureBuilder(RampartMessageData rmd, Token token,
            String userCertAlias) throws RampartException {

        RampartPolicyData rpd = rmd.getPolicyData();

        WSSecSignature sig = new WSSecSignature();
        checkForX509PkiPath(sig, token);
        sig.setWsConfig(rmd.getConfig());

        if (log.isDebugEnabled()) {
            log.debug("Token inclusion: " + token.getInclusion());
        }

        RampartUtil.setKeyIdentifierType(rmd, sig, token);

        String user = null;

        if (userCertAlias != null) {
            user = userCertAlias;
        }

        // Get the user - First check whether userCertAlias present
        if (user == null) {
            user = rpd.getRampartConfig().getUserCertAlias();
        }

        // If userCertAlias is not present, use user property as Alias

        if (user == null) {
            user = rpd.getRampartConfig().getUser();
        }

        String password = null;

        if (user != null && !"".equals(user)) {
            if (log.isDebugEnabled()) {
                log.debug("User : " + user);
            }

            // Get the password
            CallbackHandler handler = RampartUtil.getPasswordCB(rmd);

            if (handler == null) {
                // If the callback handler is missing
                throw new RampartException("cbHandlerMissing");
            }

            WSPasswordCallback[] cb = { new WSPasswordCallback(user, WSPasswordCallback.SIGNATURE) };

            try {
                handler.handle(cb);
                if (cb[0].getPassword() != null && !"".equals(cb[0].getPassword())) {
                    password = cb[0].getPassword();
                    if (log.isDebugEnabled()) {
                        log.debug("Password : " + password);
                    }
                } else {
                    // If there's no password then throw an exception
                    throw new RampartException("noPasswordForUser", new String[] { user });
                }
            } catch (IOException e) {
                throw new RampartException("errorInGettingPasswordForUser", new String[] { user },
                        e);
            } catch (UnsupportedCallbackException e) {
                throw new RampartException("errorInGettingPasswordForUser", new String[] { user },
                        e);
            }

        } else {
            log.debug("No user value specified in the configuration");
            throw new RampartException("userMissing");
        }

        sig.setUserInfo(user, password);
        sig.setSignatureAlgorithm(rpd.getAlgorithmSuite().getAsymmetricSignature());
        sig.setSigCanonicalization(rpd.getAlgorithmSuite().getInclusiveC14n());

        try {
            sig.prepare(
                    rmd.getDocument(),
                    RampartUtil.getSignatureCrypto(rpd.getRampartConfig(),
                            rmd.getCustomClassLoader()), rmd.getSecHeader());
        } catch (WSSecurityException e) {
            throw new RampartException("errorInSignatureWithX509Token", e);
        }
View Full Code Here

    protected byte[] doSymmSignature(RampartMessageData rmd, Token policyToken,
            org.apache.rahas.Token tok, Vector sigParts) throws RampartException {

        Document doc = rmd.getDocument();

        RampartPolicyData rpd = rmd.getPolicyData();

        if (policyToken.isDerivedKeys()) {
            try {
                WSSecDKSign dkSign = new WSSecDKSign();

                // Check whether it is security policy 1.2 and use the secure conversation
                // accordingly
                if (SPConstants.SP_V12 == policyToken.getVersion()) {
                    dkSign.setWscVersion(ConversationConstants.VERSION_05_12);
                }

                // Check for whether the token is attached in the message or not
                boolean attached = false;

                if (SPConstants.INCLUDE_TOEKN_ALWAYS == policyToken.getInclusion()
                        || SPConstants.INCLUDE_TOKEN_ONCE == policyToken.getInclusion()
                        || (rmd.isInitiator() && SPConstants.INCLUDE_TOEKN_ALWAYS_TO_RECIPIENT == policyToken
                                .getInclusion())) {
                    attached = true;
                }

                // Setting the AttachedReference or the UnattachedReference according to the flag
                OMElement ref;
                if (attached == true) {
                    ref = tok.getAttachedReference();
                } else {
                    ref = tok.getUnattachedReference();
                }

                if (ref != null) {
                    dkSign.setExternalKey(tok.getSecret(),
                            (Element) doc.importNode((Element) ref, true));
                } else if (!rmd.isInitiator() && policyToken.isDerivedKeys()) {

                    // If the Encrypted key used to create the derived key is not
                    // attached use key identifier as defined in WSS1.1 section
                    // 7.7 Encrypted Key reference
                    SecurityTokenReference tokenRef = new SecurityTokenReference(doc);
                    if (tok instanceof EncryptedKeyToken) {
                        tokenRef.setKeyIdentifierEncKeySHA1(((EncryptedKeyToken) tok).getSHA1());
                        ;
                    }
                    dkSign.setExternalKey(tok.getSecret(), tokenRef.getElement());

                } else {
                    dkSign.setExternalKey(tok.getSecret(), tok.getId());
                }

                // Set the algo info
                dkSign.setSignatureAlgorithm(rpd.getAlgorithmSuite().getSymmetricSignature());
                dkSign.setDerivedKeyLength(rpd.getAlgorithmSuite().getSignatureDerivedKeyLength() / 8);
                if (tok instanceof EncryptedKeyToken) {
                    // Set the value type of the reference
                    dkSign.setCustomValueType(WSConstants.SOAPMESSAGE_NS11 + "#"
                            + WSConstants.ENC_KEY_VALUE_TYPE);
                }

                dkSign.prepare(doc, rmd.getSecHeader());

                if (rpd.isTokenProtection()) {

                    // Hack to handle reference id issues
                    // TODO Need a better fix
                    String sigTokId = tok.getId();
                    if (sigTokId.startsWith("#")) {
                        sigTokId = sigTokId.substring(1);
                    }
                    sigParts.add(new WSEncryptionPart(sigTokId));
                }

                dkSign.setParts(sigParts);

                dkSign.addReferencesToSign(sigParts, rmd.getSecHeader());

                // Do signature
                dkSign.computeSignature();

                // Add elements to header

                if (rpd.getProtectionOrder().equals(SPConstants.ENCRYPT_BEFORE_SIGNING)
                        && this.getInsertionLocation() == null) {
                    this.setInsertionLocation(RampartUtil

                    .insertSiblingBefore(rmd, this.mainRefListElement, dkSign.getdktElement()));

                    this.setInsertionLocation(RampartUtil.insertSiblingAfter(rmd,
                            this.getInsertionLocation(), dkSign.getSignatureElement()));
                } else {
                    this.setInsertionLocation(RampartUtil

                    .insertSiblingAfter(rmd, this.getInsertionLocation(), dkSign.getdktElement()));

                    this.setInsertionLocation(RampartUtil.insertSiblingAfter(rmd,
                            this.getInsertionLocation(), dkSign.getSignatureElement()));
                }

                return dkSign.getSignatureValue();

            } catch (ConversationException e) {
                throw new RampartException("errorInDerivedKeyTokenSignature", e);
            } catch (WSSecurityException e) {
                throw new RampartException("errorInDerivedKeyTokenSignature", e);
            }
        } else {
            try {
                WSSecSignature sig = new WSSecSignature();
                sig.setWsConfig(rmd.getConfig());

                // If a EncryptedKeyToken is used, set the correct value type to
                // be used in the wsse:Reference in ds:KeyInfo
                if (policyToken instanceof X509Token) {
                    if (rmd.isInitiator()) {
                        sig.setCustomTokenValueType(WSConstants.SOAPMESSAGE_NS11 + "#"
                                + WSConstants.ENC_KEY_VALUE_TYPE);
                        sig.setKeyIdentifierType(WSConstants.CUSTOM_SYMM_SIGNING);
                    } else {
                        // the tok has to be an EncryptedKey token
                        sig.setEncrKeySha1value(((EncryptedKeyToken) tok).getSHA1());
                        sig.setKeyIdentifierType(WSConstants.ENCRYPTED_KEY_SHA1_IDENTIFIER);
                    }

                } else if (policyToken instanceof IssuedToken) {
                    sig.setCustomTokenValueType(WSConstants.WSS_SAML_NS
                            + WSConstants.SAML_ASSERTION_ID);
                    sig.setKeyIdentifierType(WSConstants.CUSTOM_SYMM_SIGNING);
                }

                String sigTokId;

                if (policyToken instanceof SecureConversationToken) {
                    sig.setKeyIdentifierType(WSConstants.CUSTOM_SYMM_SIGNING);
                    OMElement ref = tok.getAttachedReference();
                    if (ref == null) {
                        ref = tok.getUnattachedReference();
                    }

                    if (ref != null) {
                        sigTokId = SimpleTokenStore.getIdFromSTR(ref);
                    } else {
                        sigTokId = tok.getId();
                    }
                } else {
                    sigTokId = tok.getId();
                }

                // Hack to handle reference id issues
                // TODO Need a better fix
                if (sigTokId.startsWith("#")) {
                    sigTokId = sigTokId.substring(1);
                }

                sig.setCustomTokenId(sigTokId);
                sig.setSecretKey(tok.getSecret());
                sig.setSignatureAlgorithm(rpd.getAlgorithmSuite().getAsymmetricSignature());
                sig.setSignatureAlgorithm(rpd.getAlgorithmSuite().getSymmetricSignature());
                sig.prepare(
                        rmd.getDocument(),
                        RampartUtil.getSignatureCrypto(rpd.getRampartConfig(),
                                rmd.getCustomClassLoader()), rmd.getSecHeader());

                sig.setParts(sigParts);
                sig.addReferencesToSign(sigParts, rmd.getSecHeader());

                // Do signature
                sig.computeSignature();

                if (rpd.getProtectionOrder().equals(SPConstants.ENCRYPT_BEFORE_SIGNING)
                        && this.getInsertionLocation() == null) {
                    this.setInsertionLocation(RampartUtil.insertSiblingBefore(rmd,
                            this.mainRefListElement, sig.getSignatureElement()));
                } else {
                    this.setInsertionLocation(RampartUtil.insertSiblingAfter(rmd,
View Full Code Here

    }

    protected WSSecKerberosToken getKerberosTokenBuilder(RampartMessageData rmd, Token token)
            throws RampartException {

        RampartPolicyData rpd = rmd.getPolicyData();
        KerberosConfig krbConfig = rpd.getRampartConfig().getKerberosConfig();

        if (krbConfig == null || krbConfig.getProp() == null) {
            throw new RampartException("noKerberosConfigDefined");
        }

        WSSecKerberosToken krb = new WSSecKerberosToken();
        krb.setWsConfig(rmd.getConfig());

        log.debug("Token inclusion: " + token.getInclusion());

        RampartUtil.setKeyIdentifierType(rmd, krb, token);

        String user = null;
        String passwordFromConfig = null;
        String clientPricipal = null;
        String servicePrincipal = null;
        String password = null;
        String service = null;

        clientPricipal = (String) rmd.getMsgContext().getProperty(
                KerberosConfig.CLIENT_PRINCIPLE_NAME);
        servicePrincipal = (String) rmd.getMsgContext().getProperty(
                KerberosConfig.SERVICE_PRINCIPLE_NAME);

        if (clientPricipal == null || servicePrincipal == null) {
            // Get the user from kerberos configuration
            user = krbConfig.getProp().getProperty(KerberosConfig.CLIENT_PRINCIPLE_NAME);
            passwordFromConfig = krbConfig.getProp().getProperty(
                    KerberosConfig.CLIENT_PRINCIPLE_PASSWORD);
            if (passwordFromConfig == null) {
                passwordFromConfig = krbConfig.getProp().getProperty(
                        KerberosConfig.SERVICE_PRINCIPLE_PASSWORD);
            }

            // If kerberos user is not present, use user property as Alias
            if (user == null) {
                user = rpd.getRampartConfig().getUser();
            }

            if (user != null && !"".equals(user)) {
                log.debug("User : " + user);
View Full Code Here

        log.debug("Enter process(MessageContext msgCtx)");

        RampartMessageData rmd = new RampartMessageData(msgCtx, false);

        RampartPolicyData rpd = rmd.getPolicyData();

        msgCtx.setProperty(RampartMessageData.RAMPART_POLICY_DATA, rpd);

        RampartUtil.validateTransport(rmd);

        // If there is no policy information return immediately
        if (rpd == null) {
            return null;
        }

        // TODO these checks have to be done before the convertion to avoid unnecessary convertion
        // to LLOM -> DOOM
        // If the message is a security fault or no security
        // header required by the policy
        if (isSecurityFault(rmd) || !RampartUtil.isSecHeaderRequired(rpd, rmd.isInitiator(), true)) {
            SOAPEnvelope env = Axis2Util.getSOAPEnvelopeFromDOMDocument(rmd.getDocument(), true);

            // Convert back to llom since the inflow cannot use llom
            msgCtx.setEnvelope(env);
            Axis2Util.useDOOM(false);
            log.debug("Return process MessageContext msgCtx)");
            return null;
        }

        Vector results = null;

        WSSecurityEngine engine = new WSSecurityEngine();

        ValidatorData data = new ValidatorData(rmd);

        SOAPHeader header = rmd.getMsgContext().getEnvelope().getHeader();
        if (header == null) {
            throw new RampartException("missingSOAPHeader");
        }

        ArrayList headerBlocks = header.getHeaderBlocksWithNSURI(WSConstants.WSSE_NS);
        SOAPHeaderBlock secHeader = null;
        // Issue is axiom - a returned collection must not be null
        if (headerBlocks != null) {
            Iterator headerBlocksIterator = headerBlocks.iterator();
            while (headerBlocksIterator.hasNext()) {
                SOAPHeaderBlock elem = (SOAPHeaderBlock) headerBlocksIterator.next();
                if (elem.getLocalName().equals(WSConstants.WSSE_LN)) {
                    secHeader = elem;
                    break;
                }
            }
        }

        if (secHeader == null) {
            throw new RampartException("missingSecurityHeader");
        }

        long t0 = 0, t1 = 0, t2 = 0, t3 = 0;
        if (dotDebug) {
            t0 = System.currentTimeMillis();
        }

        String actorValue = secHeader.getAttributeValue(new QName(rmd.getSoapConstants()
                .getEnvelopeURI(), "actor"));

        Crypto signatureCrypto = RampartUtil.getSignatureCrypto(rpd.getRampartConfig(), msgCtx
                .getAxisService().getClassLoader());

        TokenCallbackHandler tokenCallbackHandler = null;
       
        if (rpd != null) {
            tokenCallbackHandler = new TokenCallbackHandler(rmd.getTokenStorage(),
                    RampartUtil.getPasswordCB(rmd), rpd.getRampartConfig());
        } else {
            tokenCallbackHandler = new TokenCallbackHandler(rmd.getTokenStorage(),
                    RampartUtil.getPasswordCB(rmd));
        }

        if (rpd.isSymmetricBinding()) {
            // Here we have to create the CB handler to get the tokens from the
            // token storage
            log.debug("Processing security header using SymetricBinding");
            results = engine.processSecurityHeader(rmd.getDocument(), actorValue,
                    tokenCallbackHandler, signatureCrypto, RampartUtil.getEncryptionCrypto(
                            rpd.getRampartConfig(), msgCtx.getAxisService().getClassLoader()));

            // Remove encryption tokens if this is the initiator and if initiator is receiving a
            // message

            if (rmd.isInitiator()
                    && (msgCtx.getFLOW() == MessageContext.IN_FLOW || msgCtx.getFLOW() == MessageContext.IN_FAULT_FLOW)) {
                tokenCallbackHandler.removeEncryptedToken();
            }

        } else {
            log.debug("Processing security header in normal path");
            results = engine.processSecurityHeader(rmd.getDocument(), actorValue,
                    tokenCallbackHandler, signatureCrypto, RampartUtil.getEncryptionCrypto(
                            rpd.getRampartConfig(), msgCtx.getAxisService().getClassLoader()));
        }

        if (dotDebug) {
            t1 = System.currentTimeMillis();
        }

        // Store symm tokens
        // Pick the first SAML token
        // TODO : This is a hack , MUST FIX
        // get the sec context id from the req msg ctx

        // Store username in MessageContext property

        for (int j = 0; j < results.size(); j++) {
            WSSecurityEngineResult wser = (WSSecurityEngineResult) results.get(j);
            final Integer actInt = (Integer) wser.get(WSSecurityEngineResult.TAG_ACTION);
            if (WSConstants.ST_UNSIGNED == actInt.intValue()) {

                // If this is a SAML2.0 assertion
                if (wser.get(WSSecurityEngineResult.TAG_SAML_ASSERTION) instanceof Assertion) {
                    final Assertion assertion = (Assertion) wser
                            .get(WSSecurityEngineResult.TAG_SAML_ASSERTION);

                    // if the subject confirmation method is Bearer, do not try to get the KeyInfo
                    if (TrustUtil.getSAML2SubjectConfirmationMethod(assertion).equals(
                            RahasConstants.SAML20_SUBJECT_CONFIRMATION_BEARER)) {
                        break;
                    }

                    String id = assertion.getID();
                    Subject subject = assertion.getSubject();

                    Date dateOfCreation = null;
                    Date dateOfExpiration = null;

                    // Read the validity period from the 'Conditions' element, else read it from SC
                    // Data
                    if (assertion.getConditions() != null) {
                        Conditions conditions = assertion.getConditions();
                        if (conditions.getNotBefore() != null) {
                            dateOfCreation = conditions.getNotBefore().toDate();
                        }
                        if (conditions.getNotOnOrAfter() != null) {
                            dateOfExpiration = conditions.getNotOnOrAfter().toDate();
                        }
                    } else {
                        SubjectConfirmationData scData = subject.getSubjectConfirmations().get(0)
                                .getSubjectConfirmationData();
                        if (scData.getNotBefore() != null) {
                            dateOfCreation = scData.getNotBefore().toDate();
                        }
                        if (scData.getNotOnOrAfter() != null) {
                            dateOfExpiration = scData.getNotOnOrAfter().toDate();
                        }
                    }

                    // TODO : SAML2KeyInfo element needs to be moved to WSS4J.
                    SAML2KeyInfo saml2KeyInfo = SAML2Utils.getSAML2KeyInfo(assertion,
                            signatureCrypto, tokenCallbackHandler);

                    // Store the token
                    try {
                        TokenStorage store = rmd.getTokenStorage();
                        if (store.getToken(id) == null) {
                            Token token = new Token(id,
                                    (OMElement) SAML2Utils.getElementFromAssertion(assertion),
                                    dateOfCreation, dateOfExpiration);
                            token.setSecret(saml2KeyInfo.getSecret());
                            store.add(token);
                        }
                    } catch (Exception e) {
                        throw new RampartException("errorInAddingTokenIntoStore", e);
                    }

                }
                // if this is a SAML1.1 assertion
                else {
                    final SAMLAssertion assertion = ((SAMLAssertion) wser
                            .get(WSSecurityEngineResult.TAG_SAML_ASSERTION));

                    // if the subject confirmation method is Bearer, do not try to get the KeyInfo
                    if (RahasConstants.SAML11_SUBJECT_CONFIRMATION_BEARER.equals(TrustUtil
                            .getSAML11SubjectConfirmationMethod(assertion))) {
                        break;
                    }

                    String id = assertion.getId();
                    Date created = assertion.getNotBefore();
                    Date expires = assertion.getNotOnOrAfter();
                    SAMLKeyInfo samlKi = SAMLUtil.getSAMLKeyInfo(assertion, signatureCrypto,
                            tokenCallbackHandler);
                    try {
                        TokenStorage store = rmd.getTokenStorage();
                        if (store.getToken(id) == null) {
                            Token token = new Token(id, (OMElement) assertion.toDOM(), created,
                                    expires);
                            token.setSecret(samlKi.getSecret());
                            store.add(token);
                        }
                    } catch (Exception e) {
                        throw new RampartException("errorInAddingTokenIntoStore", e);
                    }

                }
            } else if (WSConstants.UT == actInt.intValue()) {

                WSUsernameTokenPrincipal userNameTokenPrincipal = (WSUsernameTokenPrincipal) wser
                        .get(WSSecurityEngineResult.TAG_PRINCIPAL);

                String username = userNameTokenPrincipal.getName();
                msgCtx.setProperty(RampartMessageData.USERNAME, username);

                if (userNameTokenPrincipal.getNonce() != null) {
                    // Check whether this is a replay attack. To verify that we need to check
                    // whether nonce value
                    // is a repeating one
                    int nonceLifeTimeInSeconds = 0;

                    if (rpd.getRampartConfig() != null) {

                        String stringLifeTime = rpd.getRampartConfig().getNonceLifeTime();

                        try {
                            nonceLifeTimeInSeconds = Integer.parseInt(stringLifeTime);

                        } catch (NumberFormatException e) {
View Full Code Here

    public void build(RampartMessageData rmd) throws RampartException {

        log.debug("SymmetricBindingBuilder build invoked");

        RampartPolicyData rpd = rmd.getPolicyData();
        if (rpd.isIncludeTimestamp()) {
            this.addTimestamp(rmd);
        }

        if (rmd.isInitiator()) {
            // Setup required tokens
            initializeTokens(rmd);
        }

        if (SPConstants.ENCRYPT_BEFORE_SIGNING.equals(rpd.getProtectionOrder())) {
            this.doEncryptBeforeSig(rmd);
        } else {
            this.doSignBeforeEncrypt(rmd);
        }
View Full Code Here

    private void doEncryptBeforeSig(RampartMessageData rmd) throws RampartException {

        long t0 = 0, t1 = 0, t2 = 0;

        RampartPolicyData rpd = rmd.getPolicyData();

        Vector signatureValues = new Vector();

        if (tlog.isDebugEnabled()) {
            t0 = System.currentTimeMillis();
        }

        Token encryptionToken = rpd.getEncryptionToken();
        Vector encrParts = RampartUtil.getEncryptedParts(rmd);

        Vector sigParts = RampartUtil.getSignedParts(rmd);

        if (encryptionToken == null && encrParts.size() > 0) {
            throw new RampartException("encryptionTokenMissing");
        }

        if (encryptionToken != null && encrParts.size() > 0) {
            // The encryption token can be an IssuedToken or a
            // SecureConversationToken
            String tokenId = null;
            org.apache.rahas.Token tok = null;

            if (encryptionToken instanceof IssuedToken) {
                tokenId = rmd.getIssuedEncryptionTokenId();
                if (log.isDebugEnabled()) {
                    log.debug("Issued EncryptionToken Id : " + tokenId);
                }
            } else if (encryptionToken instanceof SecureConversationToken) {
                tokenId = rmd.getSecConvTokenId();
                if (log.isDebugEnabled()) {
                    log.debug("SCT Id : " + tokenId);
                }
            } else if (encryptionToken instanceof X509Token) {
                if (rmd.isInitiator()) {
                    tokenId = setupEncryptedKey(rmd, encryptionToken);
                } else {
                    tokenId = getEncryptedKey(rmd);
                }
            } // TODO SAMLToken

            if (tokenId == null || tokenId.length() == 0) {
                throw new RampartException("noSecurityToken");
            }

            // Hack to handle reference id issues
            // TODO Need a better fix
            if (tokenId.startsWith("#")) {
                tokenId = tokenId.substring(1);
            }

            /*
             * Get hold of the token from the token storage
             */
            tok = this.getToken(rmd, tokenId);

            /*
             * Attach the token into the message based on token inclusion values
             */
            boolean attached = false;
            Element encrTokenElement = null;
            Element refList = null;
            WSSecDKEncrypt dkEncr = null;
            WSSecEncrypt encr = null;
            Element encrDKTokenElem = null;

            if (SPConstants.INCLUDE_TOEKN_ALWAYS == encryptionToken.getInclusion()
                    || SPConstants.INCLUDE_TOKEN_ONCE == encryptionToken.getInclusion()
                    || (rmd.isInitiator() && SPConstants.INCLUDE_TOEKN_ALWAYS_TO_RECIPIENT == encryptionToken
                            .getInclusion())) {
                encrTokenElement = RampartUtil.appendChildToSecHeader(rmd, tok.getToken());
                attached = true;
            } else if (encryptionToken instanceof X509Token && rmd.isInitiator()) {
                encrTokenElement = RampartUtil.appendChildToSecHeader(rmd, tok.getToken());
            }

            Document doc = rmd.getDocument();

            AlgorithmSuite algorithmSuite = rpd.getAlgorithmSuite();
            if (encryptionToken.isDerivedKeys()) {
                log.debug("Use drived keys");

                dkEncr = new WSSecDKEncrypt();

                if (attached && tok.getAttachedReference() != null) {

                    dkEncr.setExternalKey(tok.getSecret(),
                            (Element) doc.importNode((Element) tok.getAttachedReference(), true));

                } else if (tok.getUnattachedReference() != null) {
                    dkEncr.setExternalKey(tok.getSecret(),
                            (Element) doc.importNode((Element) tok.getUnattachedReference(), true));
                } else {
                    dkEncr.setExternalKey(tok.getSecret(), tok.getId());
                }
                try {
                    dkEncr.setSymmetricEncAlgorithm(algorithmSuite.getEncryption());
                    dkEncr.setDerivedKeyLength(algorithmSuite.getEncryptionDerivedKeyLength() / 8);
                    dkEncr.prepare(doc);
                    encrDKTokenElem = dkEncr.getdktElement();
                    RampartUtil.appendChildToSecHeader(rmd, encrDKTokenElem);

                    refList = dkEncr.encryptForExternalRef(null, encrParts);

                } catch (WSSecurityException e) {
                    throw new RampartException("errorInDKEncr");
                } catch (ConversationException e) {
                    throw new RampartException("errorInDKEncr");
                }
            } else {
                log.debug("NO derived keys, use the shared secret");
                encr = new WSSecEncrypt();

                encr.setWsConfig(rmd.getConfig());
                encr.setEncKeyId(tokenId);
                RampartUtil.setEncryptionUser(rmd, encr);
                encr.setEphemeralKey(tok.getSecret());
                encr.setDocument(doc);
                encr.setSymmetricEncAlgorithm(algorithmSuite.getEncryption());
                // SymmKey is already encrypted, no need to do it again
                encr.setEncryptSymmKey(false);
                if (!rmd.isInitiator() && tok instanceof EncryptedKeyToken) {
                    encr.setUseKeyIdentifier(true);
                    encr.setCustomReferenceValue(((EncryptedKeyToken) tok).getSHA1());
                    encr.setKeyIdentifierType(WSConstants.ENCRYPTED_KEY_SHA1_IDENTIFIER);
                }

                try {

                    encr.prepare(
                            doc,
                            RampartUtil.getEncryptionCrypto(rpd.getRampartConfig(),
                                    rmd.getCustomClassLoader()));
                    // Encrypt, get hold of the ref list and add it
                    refList = encr.encryptForExternalRef(null, encrParts);
                } catch (WSSecurityException e) {
                    throw new RampartException("errorInEncryption", e);
                }
            }

            this.mainRefListElement = RampartUtil.appendChildToSecHeader(rmd, refList);

            if (tlog.isDebugEnabled()) {
                t1 = System.currentTimeMillis();
            }

            // Sometimes encryption token is not included in the the message
            if (encrTokenElement != null) {
                this.setInsertionLocation(encrTokenElement);
            } else if (timestampElement != null) {
                this.setInsertionLocation(timestampElement);
            }

            RampartUtil.handleEncryptedSignedHeaders(encrParts, sigParts, doc);

            HashMap sigSuppTokMap = null;
            HashMap endSuppTokMap = null;
            HashMap sgndEndSuppTokMap = null;
            HashMap sgndEncSuppTokMap = null;
            HashMap endEncSuppTokMap = null;
            HashMap sgndEndEncSuppTokMap = null;

            if (this.timestampElement != null) {
                sigParts.add(new WSEncryptionPart(RampartUtil
                        .addWsuIdToElement((OMElement) this.timestampElement)));
            }

            if (rmd.isInitiator()) {

                // Now add the supporting tokens
                SupportingToken sgndSuppTokens = rpd.getSignedSupportingTokens();
                sigSuppTokMap = this.handleSupportingTokens(rmd, sgndSuppTokens);

                SupportingToken endSuppTokens = rpd.getEndorsingSupportingTokens();
                endSuppTokMap = this.handleSupportingTokens(rmd, endSuppTokens);

                SupportingToken sgndEndSuppTokens = rpd.getSignedEndorsingSupportingTokens();
                sgndEndSuppTokMap = this.handleSupportingTokens(rmd, sgndEndSuppTokens);

                SupportingToken sgndEncryptedSuppTokens = rpd.getSignedEncryptedSupportingTokens();
                sgndEncSuppTokMap = this.handleSupportingTokens(rmd, sgndEncryptedSuppTokens);

                SupportingToken endorsingEncryptedSuppTokens = rpd
                        .getEndorsingEncryptedSupportingTokens();
                endEncSuppTokMap = this.handleSupportingTokens(rmd, endorsingEncryptedSuppTokens);

                SupportingToken sgndEndEncSuppTokens = rpd
                        .getSignedEndorsingEncryptedSupportingTokens();
                sgndEndEncSuppTokMap = this.handleSupportingTokens(rmd, sgndEndEncSuppTokens);

                Vector supportingToks = rpd.getSupportingTokensList();
                for (int i = 0; i < supportingToks.size(); i++) {
                    this.handleSupportingTokens(rmd, (SupportingToken) supportingToks.get(i));
                }

                SupportingToken encryptedSupportingToks = rpd.getEncryptedSupportingTokens();
                this.handleSupportingTokens(rmd, encryptedSupportingToks);

                // Setup signature parts
                sigParts = addSignatureParts(sigSuppTokMap, sigParts);
                sigParts = addSignatureParts(sgndEncSuppTokMap, sigParts);
                sigParts = addSignatureParts(sgndEndSuppTokMap, sigParts);
                sigParts = addSignatureParts(sgndEndEncSuppTokMap, sigParts);

            } else {
                addSignatureConfirmation(rmd, sigParts);
            }

            // Sign the message
            // We should use the same key in the case of EncryptBeforeSig
            if (sigParts.size() > 0) {
                signatureValues.add(this.doSymmSignature(rmd, encryptionToken, tok, sigParts));
                this.mainSigId = RampartUtil.addWsuIdToElement((OMElement) this
                        .getInsertionLocation());
            }

            if (rmd.isInitiator()) {

                endSuppTokMap.putAll(endEncSuppTokMap);
                // Do endorsed signatures
                Vector endSigVals = this.doEndorsedSignatures(rmd, endSuppTokMap);
                for (Iterator iter = endSigVals.iterator(); iter.hasNext();) {
                    signatureValues.add(iter.next());
                }

                sgndEndSuppTokMap.putAll(sgndEndEncSuppTokMap);
                // Do signed endorsing signatures
                Vector sigEndSigVals = this.doEndorsedSignatures(rmd, sgndEndSuppTokMap);
                for (Iterator iter = sigEndSigVals.iterator(); iter.hasNext();) {
                    signatureValues.add(iter.next());
                }
            }

            if (tlog.isDebugEnabled()) {
                t2 = System.currentTimeMillis();
                tlog.debug("Encryption took :" + (t1 - t0) + ", Signature tool :" + (t2 - t1));
            }

            // Check for signature protection and encryption of UsernameToken
            if (rpd.isSignatureProtection() && this.mainSigId != null
                    || encryptedTokensIdList.size() > 0 && rmd.isInitiator()) {
                long t3 = 0, t4 = 0;
                if (tlog.isDebugEnabled()) {
                    t3 = System.currentTimeMillis();
                }
                log.debug("Signature protection");
                Vector secondEncrParts = new Vector();

                // Now encrypt the signature using the above token
                if (rpd.isSignatureProtection()) {
                    secondEncrParts.add(new WSEncryptionPart(this.mainSigId, "Element"));
                }

                if (rmd.isInitiator()) {
                    for (int i = 0; i < encryptedTokensIdList.size(); i++) {
View Full Code Here

     */
    public void validate(ValidatorData data, Vector results) throws RampartException {

        RampartMessageData rmd = data.getRampartMessageData();

        RampartPolicyData rpd = rmd.getPolicyData();

        // If there's Security policy present and no results
        // then we should throw an error
        if (rpd != null && results == null) {
            throw new RampartException("noSecurityResults");
        }

        // Check presence of timestamp
        WSSecurityEngineResult tsResult = null;
        if (rpd != null && rpd.isIncludeTimestamp()) {
            tsResult = WSSecurityUtil.fetchActionResult(results, WSConstants.TS);
            if (tsResult == null && !rpd.isIncludeTimestampOptional()) {
                throw new RampartException("timestampMissing");
            }

        }

        WSSecurityEngineResult krbResult;
        krbResult = WSSecurityUtil.fetchActionResult(results, WSConstants.KERBEROS_SIGN);
        if (krbResult == null) {
            krbResult = WSSecurityUtil.fetchActionResult(results, WSConstants.KERBEROS_ENCR);
        }
        if (krbResult == null) {
            krbResult = WSSecurityUtil.fetchActionResult(results, WSConstants.KERBEROS);
        }
        if (krbResult != null) {
            // TODO
            return;
        }

        // sig/encr
        Vector encryptedParts = RampartUtil.getEncryptedParts(rmd);
        if (rpd != null && rpd.isSignatureProtection() && isSignatureRequired(rmd)) {

            String sigId = RampartUtil.getSigElementId(rmd);

            encryptedParts.add(new WSEncryptionPart(WSConstants.SIG_LN, WSConstants.SIG_NS,
                    "Element"));
        }

        Vector signatureParts = RampartUtil.getSignedParts(rmd);

        // Timestamp is not included in sig parts
        if (tsResult != null || !rpd.isIncludeTimestampOptional()) {
            if (rpd != null && rpd.isIncludeTimestamp() && !rpd.isTransportBinding()) {
                signatureParts.add(new WSEncryptionPart("timestamp"));
            }
        }

        if (!rmd.isInitiator()) {

            // Just an indicator for EndorsingSupportingToken signature
            SupportingToken endSupportingToken = rpd.getEndorsingSupportingTokens();
            if (endSupportingToken != null && !endSupportingToken.isOptional()) {
                SignedEncryptedParts endSignedParts = endSupportingToken.getSignedParts();
                if ((endSignedParts != null && !endSignedParts.isOptional() && (endSignedParts
                        .isBody() || endSignedParts.getHeaders().size() > 0))
                        || rpd.isIncludeTimestamp()) {
                    signatureParts.add(new WSEncryptionPart("EndorsingSupportingTokens"));
                }
            }
            // Just an indicator for SignedEndorsingSupportingToken signature
            SupportingToken sgndEndSupportingToken = rpd.getSignedEndorsingSupportingTokens();
            if (sgndEndSupportingToken != null && !sgndEndSupportingToken.isOptional()) {
                SignedEncryptedParts sgndEndSignedParts = sgndEndSupportingToken.getSignedParts();
                if ((sgndEndSignedParts != null && !sgndEndSignedParts.isOptional() && (sgndEndSignedParts
                        .isBody() || sgndEndSignedParts.getHeaders().size() > 0))
                        || rpd.isIncludeTimestamp()) {
                    signatureParts.add(new WSEncryptionPart("SignedEndorsingSupportingTokens"));
                }
            }

            Vector supportingToks = rpd.getSupportingTokensList();
            for (int i = 0; i < supportingToks.size(); i++) {
                SupportingToken supportingToken = (SupportingToken) supportingToks.get(i);
                if (supportingToken != null && !supportingToken.isOptional()) {
                    SupportingPolicyData policyData = new SupportingPolicyData();
                    policyData.build(supportingToken);
                    encryptedParts.addAll(RampartUtil.getSupportingEncryptedParts(rmd, policyData));
                    signatureParts.addAll(RampartUtil.getSupportingSignedParts(rmd, policyData));
                }
            }
        }

        validateEncrSig(data, encryptedParts, signatureParts, results);

        if (!rpd.isTransportBinding()) {
            validateProtectionOrder(data, results);
        }

        validateEncryptedParts(data, encryptedParts, results);

View Full Code Here

    private void doSignBeforeEncrypt(RampartMessageData rmd) throws RampartException {

        long t0 = 0, t1 = 0, t2 = 0;

        RampartPolicyData rpd = rmd.getPolicyData();
        Document doc = rmd.getDocument();

        if (tlog.isDebugEnabled()) {
            t0 = System.currentTimeMillis();
        }
        Token sigToken = rpd.getSignatureToken();

        String encrTokId = null;
        String sigTokId = null;

        org.apache.rahas.Token encrTok = null;
        org.apache.rahas.Token sigTok = null;
        WSSecKerberosToken krbToken = null;

        Element sigTokElem = null;

        Vector signatureValues = new Vector();

        if (sigToken != null) {
            if (sigToken instanceof SecureConversationToken) {
                sigTokId = rmd.getSecConvTokenId();
            } else if (sigToken instanceof IssuedToken) {
                sigTokId = rmd.getIssuedSignatureTokenId();
            } else if (sigToken instanceof X509Token) {
                if (rmd.isInitiator()) {
                    sigTokId = setupEncryptedKey(rmd, sigToken);
                } else {
                    sigTokId = getEncryptedKey(rmd);
                }
            } else if (sigToken instanceof KerberosToken) {
                Date created = new Date();
                Date expires = new Date();
                // TODO make this lifetime configurable ???
                expires.setTime(System.currentTimeMillis() + 300000);
                krbToken = getKerberosTokenBuilder(rmd, sigToken);
                sigTokId = krbToken.getBSTTokenId();
                if (rmd.isInitiator()) {
                    sigTokElem = krbToken.getBinarySecurityTokenElement();
                }
                sigTok = new EncryptedKeyToken(sigTokId, created, expires);
                sigTok.setSecret(krbToken.getSessionKey().getEncoded());
            }
        } else {
            throw new RampartException("signatureTokenMissing");
        }

        if (sigTokId == null || sigTokId.length() == 0) {
            throw new RampartException("noSecurityToken");
        }

        if (!(sigToken instanceof KerberosToken)) {

            sigTok = this.getToken(rmd, sigTokId);

            if (SPConstants.INCLUDE_TOEKN_ALWAYS == sigToken.getInclusion()
                    || SPConstants.INCLUDE_TOKEN_ONCE == sigToken.getInclusion()
                    || (rmd.isInitiator() && SPConstants.INCLUDE_TOEKN_ALWAYS_TO_RECIPIENT == sigToken
                            .getInclusion())) {
                sigTokElem = RampartUtil.appendChildToSecHeader(rmd, sigTok.getToken());
            } else if ((rmd.isInitiator() && sigToken instanceof X509Token)
                    || sigToken instanceof SecureConversationToken) {
                sigTokElem = RampartUtil.appendChildToSecHeader(rmd, sigTok.getToken());
            }
        }

        if (sigTokElem != null) {
            // Set the insertion location
            this.setInsertionLocation(sigTokElem);
        }

        HashMap sigSuppTokMap = null;
        HashMap endSuppTokMap = null;
        HashMap sgndEndSuppTokMap = null;
        HashMap sgndEncSuppTokMap = null;
        HashMap endEncSuppTokMap = null;
        HashMap sgndEndEncSuppTokMap = null;

        Vector sigParts = RampartUtil.getSignedParts(rmd);

        if (this.timestampElement != null) {
            sigParts.add(new WSEncryptionPart(RampartUtil
                    .addWsuIdToElement((OMElement) this.timestampElement)));
        }

        if (rmd.isInitiator()) {
            // Now add the supporting tokens
            SupportingToken sgndSuppTokens = rpd.getSignedSupportingTokens();
            sigSuppTokMap = this.handleSupportingTokens(rmd, sgndSuppTokens);

            SupportingToken endSuppTokens = rpd.getEndorsingSupportingTokens();
            endSuppTokMap = this.handleSupportingTokens(rmd, endSuppTokens);

            SupportingToken sgndEndSuppTokens = rpd.getSignedEndorsingSupportingTokens();
            sgndEndSuppTokMap = this.handleSupportingTokens(rmd, sgndEndSuppTokens);

            SupportingToken sgndEncryptedSuppTokens = rpd.getSignedEncryptedSupportingTokens();
            sgndEncSuppTokMap = this.handleSupportingTokens(rmd, sgndEncryptedSuppTokens);

            SupportingToken endorsingEncryptedSuppTokens = rpd
                    .getEndorsingEncryptedSupportingTokens();
            endEncSuppTokMap = this.handleSupportingTokens(rmd, endorsingEncryptedSuppTokens);

            SupportingToken sgndEndEncSuppTokens = rpd
                    .getSignedEndorsingEncryptedSupportingTokens();
            sgndEndEncSuppTokMap = this.handleSupportingTokens(rmd, sgndEndEncSuppTokens);

            Vector supportingToks = rpd.getSupportingTokensList();
            for (int i = 0; i < supportingToks.size(); i++) {
                this.handleSupportingTokens(rmd, (SupportingToken) supportingToks.get(i));
            }

            SupportingToken encryptedSupportingToks = rpd.getEncryptedSupportingTokens();
            this.handleSupportingTokens(rmd, encryptedSupportingToks);

            // Setup signature parts
            sigParts = addSignatureParts(sigSuppTokMap, sigParts);
            sigParts = addSignatureParts(sgndEncSuppTokMap, sigParts);
            sigParts = addSignatureParts(sgndEndSuppTokMap, sigParts);
            sigParts = addSignatureParts(sgndEndEncSuppTokMap, sigParts);

        } else {
            addSignatureConfirmation(rmd, sigParts);
        }

        if (sigParts.size() > 0) {
            if (sigToken instanceof KerberosToken) {
                krbToken.setParts(sigParts);
                try {
                    krbToken.signMessage();
                } catch (WSSecurityException e) {
                    throw new RampartException("errorInSignatureWithKerberosToken");
                }
                this.setInsertionLocation(RampartUtil.insertSiblingAfter(rmd,
                        this.getInsertionLocation(), krbToken.getSignatureElement()));
                signatureValues.add(krbToken.getSignatureValue());
            } else {
                // Sign the message
                signatureValues.add(this.doSymmSignature(rmd, sigToken, sigTok, sigParts));
            }

            this.mainSigId = RampartUtil.addWsuIdToElement((OMElement) this.getInsertionLocation());

        }

        if (rmd.isInitiator()) {
            // Adding the endorsing encrypted supporting tokens to endorsing supporting tokens
            endSuppTokMap.putAll(endEncSuppTokMap);
            // Do endorsed signatures
            Vector endSigVals = this.doEndorsedSignatures(rmd, endSuppTokMap);

            for (Iterator iter = endSigVals.iterator(); iter.hasNext();) {
                signatureValues.add(iter.next());
            }

            // Adding the signed endorsed encrypted tokens to signed endorsed supporting tokens
            sgndEndSuppTokMap.putAll(sgndEndEncSuppTokMap);
            // Do signed endorsing signatures
            Vector sigEndSigVals = this.doEndorsedSignatures(rmd, sgndEndSuppTokMap);
            for (Iterator iter = sigEndSigVals.iterator(); iter.hasNext();) {
                signatureValues.add(iter.next());
            }
        }

        if (tlog.isDebugEnabled()) {
            t1 = System.currentTimeMillis();
        }

        // Encryption
        Token encrToken = rpd.getEncryptionToken();
        boolean isIssuedToken = false;
        if (encrToken instanceof IssuedToken) {
            isIssuedToken = true;
        }
        Element encrTokElem = null;
        if (sigToken.equals(encrToken)) {
            // Use the same token
            encrTokId = sigTokId;
            encrTok = sigTok;
            encrTokElem = sigTokElem;
        } else {
            encrTokId = rmd.getIssuedEncryptionTokenId();
            encrTok = this.getToken(rmd, encrTokId);

            if (SPConstants.INCLUDE_TOEKN_ALWAYS == encrToken.getInclusion()
                    || SPConstants.INCLUDE_TOKEN_ONCE == encrToken.getInclusion()
                    || (rmd.isInitiator() && SPConstants.INCLUDE_TOEKN_ALWAYS_TO_RECIPIENT == encrToken
                            .getInclusion())) {
                encrTokElem = (Element) encrTok.getToken();

                // Add the encrToken element before the sigToken element
                RampartUtil.insertSiblingBefore(rmd, sigTokElem, encrTokElem);
            }

        }

        Vector encrParts = RampartUtil.getEncryptedParts(rmd);

        // Check for signature protection
        if (rpd.isSignatureProtection() && this.mainSigId != null) {
            // Now encrypt the signature using the above token
            encrParts.add(new WSEncryptionPart(this.mainSigId, "Element"));
        }

        if (rmd.isInitiator()) {
            for (int i = 0; i < encryptedTokensIdList.size(); i++) {
                encrParts
                        .add(new WSEncryptionPart((String) encryptedTokensIdList.get(i), "Element"));
            }
        }

        Element refList = null;
        if (encrParts.size() > 0) {
            // The sec conv token can be used without derived keys
            if (encrToken.isDerivedKeys()) {

                try {
                    WSSecDKEncrypt dkEncr = new WSSecDKEncrypt();

                    // Check whether it is security policy 1.2 and use the secure conversation
                    // accordingly
                    if (SPConstants.SP_V12 == encrToken.getVersion()) {
                        dkEncr.setWscVersion(ConversationConstants.VERSION_05_12);
                    }

                    if (encrTokElem != null && encrTok.getAttachedReference() != null) {

                        dkEncr.setExternalKey(encrTok.getSecret(), (Element) doc.importNode(
                                (Element) encrTok.getAttachedReference(), true));
                    } else if (encrTok.getUnattachedReference() != null) {
                        dkEncr.setExternalKey(encrTok.getSecret(), (Element) doc.importNode(
                                (Element) encrTok.getUnattachedReference(), true));
                    } else if (!rmd.isInitiator() && encrToken.isDerivedKeys()) {

                        // If the Encrypted key used to create the derived key is not
                        // attached use key identifier as defined in WSS1.1 section
                        // 7.7 Encrypted Key reference
                        SecurityTokenReference tokenRef = new SecurityTokenReference(doc);
                        if (encrTok instanceof EncryptedKeyToken) {
                            tokenRef.setKeyIdentifierEncKeySHA1(((EncryptedKeyToken) encrTok)
                                    .getSHA1());
                        }
                        dkEncr.setExternalKey(encrTok.getSecret(), tokenRef.getElement());

                    } else {
                        dkEncr.setExternalKey(encrTok.getSecret(), encrTok.getId());
                    }

                    if (encrTok instanceof EncryptedKeyToken) {
                        dkEncr.setCustomValueType(WSConstants.SOAPMESSAGE_NS11 + "#"
                                + WSConstants.ENC_KEY_VALUE_TYPE);
                    }

                    dkEncr.setSymmetricEncAlgorithm(rpd.getAlgorithmSuite().getEncryption());
                    dkEncr.setDerivedKeyLength(rpd.getAlgorithmSuite()
                            .getEncryptionDerivedKeyLength() / 8);
                    dkEncr.prepare(doc);
                    Element encrDKTokenElem = null;
                    encrDKTokenElem = dkEncr.getdktElement();
                    if (encrTokElem != null) {
                        RampartUtil.insertSiblingAfter(rmd, encrTokElem, encrDKTokenElem);
                    } else if (timestampElement != null) {
                        RampartUtil.insertSiblingAfter(rmd, this.timestampElement, encrDKTokenElem);
                    } else {
                        RampartUtil.insertSiblingBefore(rmd, this.getInsertionLocation(),
                                encrDKTokenElem);
                    }

                    refList = dkEncr.encryptForExternalRef(null, encrParts);

                    RampartUtil.insertSiblingAfter(rmd, encrDKTokenElem, refList);

                } catch (WSSecurityException e) {
                    throw new RampartException("errorInDKEncr");
                } catch (ConversationException e) {
                    throw new RampartException("errorInDKEncr");
                }
            } else {
                try {

                    WSSecEncrypt encr = new WSSecEncrypt();

                    encr.setWsConfig(rmd.getConfig());
                    // Hack to handle reference id issues
                    // TODO Need a better fix
                    if (encrTokId.startsWith("#")) {
                        encrTokId = encrTokId.substring(1);
                    }
                    encr.setEncKeyId(encrTokId);

                    if (krbToken == null) {
                        encr.setEphemeralKey(encrTok.getSecret());
                        RampartUtil.setEncryptionUser(rmd, encr);
                        encr.setSymmetricEncAlgorithm(rpd.getAlgorithmSuite().getEncryption());
                    } else {
                        if (encrTok != null) {
                            byte[] secret = encrTok.getSecret();
                            int factor = 0;
                            if (rmd.getPolicyData().getRampartConfig() != null) {
                                KerberosConfig config = null;
                                String fac = null;
                                config = rmd.getPolicyData().getRampartConfig().getKerberosConfig();
                                if ((fac = config.getProp().getProperty(
                                        KerberosConfig.KDC_DES_AES_FACTOR)) != null) {
                                    try {
                                        factor = Integer.parseInt(fac);
                                    } catch (Exception e) {
                                        factor = 0;
                                    }
                                }
                            }

                            if (factor > 1) {
                                byte[] newSecret = new byte[secret.length * 4];
                                int j = 0;
                                for (int i = 0; i < newSecret.length; i++) {
                                    newSecret[i] = secret[j++];
                                    if (j == secret.length)
                                        j = 0;
                                }
                                encr.setEphemeralKey(newSecret);
                                encrTok.setSecret(newSecret);
                            } else {
                                encr.setEphemeralKey(secret);
                                encrTok.setSecret(secret);
                            }
                            ((EncryptedKeyToken) encrTok).setSHA1(krbToken.getKrbSession()
                                    .getThumbPrintEncoded());
                            try {
                                rmd.getTokenStorage().add(sigTok);
                            } catch (TrustException e) {
                                throw new RampartException("errorAddingKerbTokenToStore");
                            }
                        }
                    }

                    encr.setDocument(doc);
                    encr.setEncryptSymmKey(false);

                    // Use key identifier in the KeyInfo in server side
                    if (!rmd.isInitiator()) {
                        if (krbToken != null) {
                            encr.setUseKeyIdentifier(true);
                            encr.setKeyIdentifierType(WSConstants.KERBEROS_KEY_IDENTIFIER);
                        } else if (encrTok instanceof EncryptedKeyToken) {
                            encr.setUseKeyIdentifier(true);
                            encr.setCustomReferenceValue(((EncryptedKeyToken) encrTok).getSHA1());
                            encr.setKeyIdentifierType(WSConstants.ENCRYPTED_KEY_SHA1_IDENTIFIER);
                        } else if (isIssuedToken) {
                            encr.setUseKeyIdentifier(true);
                            encr.setCustomReferenceValue(encrTokId);
                            encr.setKeyIdentifierType(WSConstants.SAML_ASSERTION_IDENTIFIER);
                            try {
                                // RampartUtil.insertSiblingAfter(rmd,this.timestampElement,getLLOMfromOM(encrTok.getToken()));
                            } catch (Exception e) {
                                log.debug("error while converting SAML issued token to a dom element");
                            }
                        }
                    }
                    encr.prepare(
                            doc,
                            RampartUtil.getEncryptionCrypto(rpd.getRampartConfig(),
                                    rmd.getCustomClassLoader()));

                    // Encrypt, get hold of the ref list and add it
                    refList = encr.encryptForExternalRef(null, encrParts);

View Full Code Here

TOP

Related Classes of org.apache.rampart.policy.RampartPolicyData

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.