Using Policy configuration - a SOAP Message cannot be Encrypted only. ----------------------------------------------------------------------
Key: RAMPART-31 URL: https://issues.apache.org/jira/browse/RAMPART-31 Project: Rampart Issue Type: Bug Components: rampart-core Affects Versions: 1.1 Reporter: Ric Emery Unless I am mistaken AsymmetricBindingBuilder does not support only encrypting a SOAP Message. AsymmetricBindingBuilder assumes that Signatures will always be applied. Logically I would think that leaving out the Policy sp:SignedParts element and/or the sp:InitiatorToken element would result in a message that is encrypted (assuming the Policy configures encryption), but not signed. Leaving out the InitiatorToken out of the profile results in a NullPointerException. Leaving out the sp:SignedParts does not disable signatures. I modified AssymetircBindingBuilder.java to allow encryption without signatures. Being new to the source base I am not sure that this is the correct fix. I modified build method adding a call to determine if signatures are disabled. Added a method to make the determination. And added a doEncryption method.. I can submit a diff in the proper format if requested. Thanks public void build(RampartMessageData rmd) throws RampartException { log.debug("AsymmetricBindingBuilder build invoked"); RampartPolicyData rpd = rmd.getPolicyData(); if (rpd.isIncludeTimestamp()) { this.addTimestamp(rmd); } if (shouldEncryptOnly(rmd)) this.doEncrypt(rmd); else if (Constants.ENCRYPT_BEFORE_SIGNING.equals(rpd.getProtectionOrder())) { this.doEncryptBeforeSig(rmd); } else { this.doSignBeforeEncrypt(rmd); } log.debug("AsymmetricBindingBuilder build invoked : DONE"); } private boolean shouldEncryptOnly(RampartMessageData rmd) { // Is there a better way to determine if signatures should be disabled? RampartPolicyData rampartPolicyData = rmd.getPolicyData(); Vector parts = rampartPolicyData.getSignedParts(); return !rampartPolicyData.isSignBody() && (null == parts || parts.size() == 0); } private void doEncrypt(RampartMessageData rmd) throws RampartException { RampartPolicyData rpd = rmd.getPolicyData(); Document doc = rmd.getDocument(); RampartConfig config = rpd.getRampartConfig(); /* * We need to hold on to these two element to use them as refence in the * case of encypting the signature */ Element encrDKTokenElem = null; WSSecEncrypt encr = null; Element refList = null; WSSecDKEncrypt dkEncr = null; /* * We MUST use keys derived from the same token */ Token encryptionToken = rpd.getRecipientToken(); Vector encrParts = RampartUtil.getEncryptedParts(rmd); if(encryptionToken == null && encrParts.size() > 0) { throw new RampartException("encryptionTokenMissing"); } if (encryptionToken != null && encrParts.size() > 0) { if (encryptionToken.isDerivedKeys()) { try { this.setupEncryptedKey(rmd, encryptionToken); // Create the DK encryption builder dkEncr = new WSSecDKEncrypt(); dkEncr.setParts(encrParts); dkEncr.setExternalKey(this.encryptedKeyValue, this.encryptedKeyId); dkEncr.prepare(doc); // Get and add the DKT element this.encrDKTElement = dkEncr.getdktElement(); encrDKTokenElem = RampartUtil.appendChildToSecHeader(rmd, this.encrDKTElement); refList = dkEncr.encryptForExternalRef(null, encrParts); } catch (WSSecurityException e) { throw new RampartException("errorCreatingEncryptedKey", e); } catch (ConversationException e) { throw new RampartException("errorInDKEncr", e); } } else { try { encr = new WSSecEncrypt(); encr.setParts(encrParts); encr.setWsConfig(rmd.getConfig()); encr.setDocument(doc); RampartUtil.setEncryptionUser(rmd, encr); encr.setSymmetricEncAlgorithm(rpd.getAlgorithmSuite().getEncryption()); encr.setKeyEncAlgo(rpd.getAlgorithmSuite().getAsymmetricKeyWrap()); encr.prepare(doc, RampartUtil.getEncryptionCrypto(config, rmd.getCustomClassLoader())); Element bstElem = encr.getBinarySecurityTokenElement(); if (bstElem != null) { RampartUtil.appendChildToSecHeader(rmd, bstElem); } this.encrTokenElement = encr.getEncryptedKeyElement(); this.encrTokenElement = RampartUtil.appendChildToSecHeader(rmd, encrTokenElement); refList = encr.encryptForExternalRef(null, encrParts); } catch (WSSecurityException e) { throw new RampartException("errorInEncryption", e); } } RampartUtil.appendChildToSecHeader(rmd, refList); this.setInsertionLocation(encrTokenElement); } } -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.