/***********************************************************************
*
* This file is part of WebScarab, an Open Web Application Security
* Project utility. For details, please see http://www.owasp.org/
*
* Copyright (c) 2011 Frank Cornelis <info@frankcornelis.be>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
package test.unit.org.owasp.webscarab.plugin.saml;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.Result;
import java.io.StringWriter;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.Source;
import org.apache.xml.security.Init;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Document;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.KeyGenerator;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.logging.Log;
import org.apache.xml.security.encryption.XMLCipher;
import org.bouncycastle.util.encoders.Hex;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;
/**
*
* @author Frank Cornelis
*/
public class SamlTest {
private static final Log LOG = LogFactory.getLog(SamlTest.class);
@BeforeClass
public static void beforeClass() {
Init.init();
}
@Test
public void testEncryptionAES() throws Exception {
KeyGenerator keygen = KeyGenerator.getInstance("AES");
keygen.init(128);
SecretKey secretKey = keygen.generateKey();
LOG.debug("secret key algo: " + secretKey.getAlgorithm());
LOG.debug("secret key format: " + secretKey.getFormat());
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
LOG.debug("cipher provider: " + cipher.getProvider().getName());
byte[] result = cipher.doFinal("hello world".getBytes());
assertNotNull(result);
byte[] encodedSecretKey = secretKey.getEncoded();
LOG.debug("encoded secret key size: " + encodedSecretKey.length * 8);
// decrypt
cipher = Cipher.getInstance("AES");
SecretKeySpec secretKeySpec = new SecretKeySpec(encodedSecretKey, "AES");
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
byte[] decryptedResult = cipher.doFinal(result);
assertEquals("hello world", new String(decryptedResult));
}
@Test
public void testEncryptedXML() throws Exception {
// setup
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
builderFactory.setNamespaceAware(true);
DocumentBuilder builder = builderFactory.newDocumentBuilder();
Document document = builder.parse(SamlTest.class.getResourceAsStream("/test-saml-response-encrypted-attribute.xml"));
NodeList nodeList = document.getElementsByTagNameNS("urn:oasis:names:tc:SAML:2.0:assertion", "EncryptedAttribute");
assertEquals(1, nodeList.getLength());
Element encryptedAttributeElement = (Element) nodeList.item(0);
NodeList encryptedDataNodeList = encryptedAttributeElement.getElementsByTagNameNS("http://www.w3.org/2001/04/xmlenc#", "EncryptedData");
assertEquals(1, encryptedDataNodeList.getLength());
Element encryptedDataElement = (Element) encryptedDataNodeList.item(0);
Init.init();
XMLCipher xmlCipher = XMLCipher.getInstance(XMLCipher.AES_128);
String aes128HexStr = "2a1e3d83f475ec3c007f487c5150a5f2";
byte[] aes128Bytes = Hex.decode(aes128HexStr);
SecretKeySpec secretKeySpec = new SecretKeySpec(aes128Bytes, "AES");
xmlCipher.init(XMLCipher.DECRYPT_MODE, secretKeySpec);
xmlCipher.doFinal(document, encryptedDataElement);
LOG.debug("decrypted attribute: " + toString(encryptedAttributeElement));
NodeList attributeNodeList = encryptedAttributeElement.getElementsByTagNameNS("urn:oasis:names:tc:SAML:2.0:assertion", "Attribute");
assertEquals(1, attributeNodeList.getLength());
}
private String toString(Node node) throws TransformerConfigurationException, TransformerException {
Source source = new DOMSource(node);
StringWriter stringWriter = new StringWriter();
Result result = new StreamResult(stringWriter);
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
transformer.transform(source, result);
return stringWriter.getBuffer().toString();
}
}