Author: anil.saldhana(a)jboss.com
Date: 2011-06-23 16:44:42 -0400 (Thu, 23 Jun 2011)
New Revision: 1028
Added:
federation/trunk/picketlink-fed-core/src/test/resources/parser/saml1/saml1-assertion-keyinfo.xml
Modified:
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/parsers/saml/SAML11SubjectParser.java
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/parsers/util/SAML11ParserUtil.java
federation/trunk/picketlink-fed-core/src/test/java/org/picketlink/test/identity/federation/core/parser/saml/SAML11AssertionParserTestCase.java
Log:
more SAML11 parsing
Modified:
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/parsers/saml/SAML11SubjectParser.java
===================================================================
---
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/parsers/saml/SAML11SubjectParser.java 2011-06-23
20:07:49 UTC (rev 1027)
+++
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/parsers/saml/SAML11SubjectParser.java 2011-06-23
20:44:42 UTC (rev 1028)
@@ -28,22 +28,15 @@
import org.picketlink.identity.federation.core.exceptions.ParsingException;
import org.picketlink.identity.federation.core.parsers.ParserNamespaceSupport;
+import org.picketlink.identity.federation.core.parsers.util.SAML11ParserUtil;
import org.picketlink.identity.federation.core.parsers.util.StaxParserUtil;
import org.picketlink.identity.federation.core.saml.v1.SAML11Constants;
import org.picketlink.identity.federation.core.saml.v2.constants.JBossSAMLConstants;
import org.picketlink.identity.federation.core.saml.v2.constants.JBossSAMLURIConstants;
-import org.picketlink.identity.federation.core.saml.v2.util.XMLTimeUtil;
-import org.picketlink.identity.federation.core.wstrust.WSTrustConstants;
import org.picketlink.identity.federation.saml.v1.assertion.SAML11NameIdentifierType;
import
org.picketlink.identity.federation.saml.v1.assertion.SAML11SubjectConfirmationType;
import org.picketlink.identity.federation.saml.v1.assertion.SAML11SubjectType;
import
org.picketlink.identity.federation.saml.v1.assertion.SAML11SubjectType.SAML11SubjectTypeChoice;
-import org.picketlink.identity.federation.saml.v2.assertion.SubjectConfirmationDataType;
-import org.picketlink.identity.xmlsec.w3.xmldsig.KeyInfoType;
-import org.picketlink.identity.xmlsec.w3.xmldsig.KeyValueType;
-import org.picketlink.identity.xmlsec.w3.xmldsig.RSAKeyValueType;
-import org.picketlink.identity.xmlsec.w3.xmldsig.X509CertificateType;
-import org.picketlink.identity.xmlsec.w3.xmldsig.X509DataType;
/**
* Parse the saml subject
@@ -107,34 +100,9 @@
}
else if (JBossSAMLConstants.SUBJECT_CONFIRMATION.get().equalsIgnoreCase(tag))
{
- SAML11SubjectConfirmationType subjectConfirmationType = new
SAML11SubjectConfirmationType();
- peekedElement = StaxParserUtil.getNextStartElement(xmlEventReader);
-
- // There may be additional things under subject confirmation
- xmlEvent = StaxParserUtil.peek(xmlEventReader);
- if (xmlEvent instanceof StartElement)
- {
- StartElement startElement =
StaxParserUtil.getNextStartElement(xmlEventReader);
- String startTag = StaxParserUtil.getStartElementName(startElement);
-
- if (startTag.equals(SAML11Constants.CONFIRMATION_METHOD))
- {
- String method = StaxParserUtil.getElementText(xmlEventReader);
- subjectConfirmationType.addConfirmation(URI.create(method));
- }
-
- if (startTag.equals(JBossSAMLConstants.SUBJECT_CONFIRMATION_DATA.get()))
- {
- SubjectConfirmationDataType subjectConfirmationData =
parseSubjectConfirmationData(xmlEventReader);
-
subjectConfirmationType.setSubjectConfirmationData(subjectConfirmationData);
- }
- }
-
+ SAML11SubjectConfirmationType subjectConfirmationType = SAML11ParserUtil
+ .parseSAML11SubjectConfirmation(xmlEventReader);
subject.setSubjectConfirmation(subjectConfirmationType);
-
- // Get the end tag
- EndElement endElement = (EndElement)
StaxParserUtil.getNextEvent(xmlEventReader);
- StaxParserUtil.matches(endElement,
JBossSAMLConstants.SUBJECT_CONFIRMATION.get());
}
else
throw new RuntimeException("Unknown tag:" + tag +
"::location=" + peekedElement.getLocation());
@@ -154,184 +122,4 @@
&& localPart.equals(JBossSAMLConstants.SUBJECT.get());
}
- private SubjectConfirmationDataType parseSubjectConfirmationData(XMLEventReader
xmlEventReader)
- throws ParsingException
- {
- StartElement startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
- StaxParserUtil.validate(startElement,
JBossSAMLConstants.SUBJECT_CONFIRMATION_DATA.get());
-
- SubjectConfirmationDataType subjectConfirmationData = new
SubjectConfirmationDataType();
-
- Attribute inResponseTo = startElement.getAttributeByName(new
QName(JBossSAMLConstants.IN_RESPONSE_TO.get()));
- if (inResponseTo != null)
- {
-
subjectConfirmationData.setInResponseTo(StaxParserUtil.getAttributeValue(inResponseTo));
- }
-
- Attribute notBefore = startElement.getAttributeByName(new
QName(JBossSAMLConstants.NOT_BEFORE.get()));
- if (notBefore != null)
- {
-
subjectConfirmationData.setNotBefore(XMLTimeUtil.parse(StaxParserUtil.getAttributeValue(notBefore)));
- }
-
- Attribute notOnOrAfter = startElement.getAttributeByName(new
QName(JBossSAMLConstants.NOT_ON_OR_AFTER.get()));
- if (notOnOrAfter != null)
- {
-
subjectConfirmationData.setNotOnOrAfter(XMLTimeUtil.parse(StaxParserUtil.getAttributeValue(notOnOrAfter)));
- }
-
- Attribute recipient = startElement.getAttributeByName(new
QName(JBossSAMLConstants.RECIPIENT.get()));
- if (recipient != null)
- {
-
subjectConfirmationData.setRecipient(StaxParserUtil.getAttributeValue(recipient));
- }
-
- Attribute address = startElement.getAttributeByName(new
QName(JBossSAMLConstants.ADDRESS.get()));
- if (address != null)
- {
- subjectConfirmationData.setAddress(StaxParserUtil.getAttributeValue(address));
- }
-
- XMLEvent xmlEvent = StaxParserUtil.peek(xmlEventReader);
- if (!(xmlEvent instanceof EndElement))
- {
- startElement = StaxParserUtil.peekNextStartElement(xmlEventReader);
- String tag = StaxParserUtil.getStartElementName(startElement);
- if (tag.equals(WSTrustConstants.XMLDSig.KEYINFO))
- {
- KeyInfoType keyInfo = parseKeyInfo(xmlEventReader);
- subjectConfirmationData.setAnyType(keyInfo);
- }
- else if (tag.equals(WSTrustConstants.XMLEnc.ENCRYPTED_KEY))
- {
-
subjectConfirmationData.setAnyType(StaxParserUtil.getDOMElement(xmlEventReader));
- }
- else
- throw new RuntimeException("Handle:" + tag);
- }
-
- // Get the end tag
- EndElement endElement = (EndElement) StaxParserUtil.getNextEvent(xmlEventReader);
- StaxParserUtil.matches(endElement,
JBossSAMLConstants.SUBJECT_CONFIRMATION_DATA.get());
- return subjectConfirmationData;
- }
-
- private KeyInfoType parseKeyInfo(XMLEventReader xmlEventReader) throws
ParsingException
- {
- KeyInfoType keyInfo = new KeyInfoType();
- StartElement startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
- StaxParserUtil.validate(startElement, WSTrustConstants.XMLDSig.KEYINFO);
-
- XMLEvent xmlEvent = null;
- String tag = null;
-
- while (xmlEventReader.hasNext())
- {
- xmlEvent = StaxParserUtil.peek(xmlEventReader);
- if (xmlEvent instanceof EndElement)
- {
- tag = StaxParserUtil.getEndElementName((EndElement) xmlEvent);
- if (tag.equals(WSTrustConstants.XMLDSig.KEYINFO))
- {
- xmlEvent = StaxParserUtil.getNextEndElement(xmlEventReader);
- break;
- }
- else
- throw new RuntimeException("unknown end element:" + tag);
- }
- startElement = (StartElement) xmlEvent;
- tag = StaxParserUtil.getStartElementName(startElement);
- if (tag.equals(WSTrustConstants.XMLEnc.ENCRYPTED_KEY))
- {
- keyInfo.addContent(StaxParserUtil.getDOMElement(xmlEventReader));
- }
- else if (tag.equals(WSTrustConstants.XMLDSig.X509DATA))
- {
- startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
- X509DataType x509 = new X509DataType();
-
- // Let us go for the X509 certificate
- startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
- StaxParserUtil.validate(startElement, WSTrustConstants.XMLDSig.X509CERT);
-
- X509CertificateType cert = new X509CertificateType();
- String certValue = StaxParserUtil.getElementText(xmlEventReader);
- cert.setEncodedCertificate(certValue.getBytes());
- x509.add(cert);
-
- EndElement endElement = StaxParserUtil.getNextEndElement(xmlEventReader);
- StaxParserUtil.validate(endElement, WSTrustConstants.XMLDSig.X509DATA);
- keyInfo.addContent(x509);
- }
- else if (tag.equals(WSTrustConstants.XMLDSig.KEYVALUE))
- {
- startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
- KeyValueType keyValue = new KeyValueType();
-
- startElement = StaxParserUtil.peekNextStartElement(xmlEventReader);
- tag = StaxParserUtil.getStartElementName(startElement);
- if (tag.equals(WSTrustConstants.XMLDSig.RSA_KEYVALUE))
- {
- keyValue.getContent().add(this.parseRSAKeyValue(xmlEventReader));
- }
- else if (tag.equals(WSTrustConstants.XMLDSig.DSA_KEYVALUE))
- {
- // TODO: parse the DSA key contents.
- }
- else
- throw new ParsingException("Unknown element: " + tag);
-
- EndElement endElement = StaxParserUtil.getNextEndElement(xmlEventReader);
- StaxParserUtil.validate(endElement, WSTrustConstants.XMLDSig.KEYVALUE);
-
- keyInfo.addContent(keyValue);
- }
- }
- return keyInfo;
- }
-
- private RSAKeyValueType parseRSAKeyValue(XMLEventReader xmlEventReader) throws
ParsingException
- {
- StartElement startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
- StaxParserUtil.validate(startElement, WSTrustConstants.XMLDSig.RSA_KEYVALUE);
-
- XMLEvent xmlEvent = null;
- String tag = null;
-
- RSAKeyValueType rsaKeyValue = new RSAKeyValueType();
-
- while (xmlEventReader.hasNext())
- {
- xmlEvent = StaxParserUtil.peek(xmlEventReader);
- if (xmlEvent instanceof EndElement)
- {
- tag = StaxParserUtil.getEndElementName((EndElement) xmlEvent);
- if (tag.equals(WSTrustConstants.XMLDSig.RSA_KEYVALUE))
- {
- xmlEvent = StaxParserUtil.getNextEndElement(xmlEventReader);
- break;
- }
- else
- throw new RuntimeException("unknown end element:" + tag);
- }
-
- startElement = (StartElement) xmlEvent;
- tag = StaxParserUtil.getStartElementName(startElement);
- if (tag.equals(WSTrustConstants.XMLDSig.MODULUS))
- {
- startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
- String text = StaxParserUtil.getElementText(xmlEventReader);
- rsaKeyValue.setModulus(text.getBytes());
- }
- else if (tag.equals(WSTrustConstants.XMLDSig.EXPONENT))
- {
- startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
- String text = StaxParserUtil.getElementText(xmlEventReader);
- rsaKeyValue.setExponent(text.getBytes());
- }
- else
- throw new ParsingException("Unknown element: " + tag);
- }
- return rsaKeyValue;
- }
}
\ No newline at end of file
Modified:
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/parsers/util/SAML11ParserUtil.java
===================================================================
---
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/parsers/util/SAML11ParserUtil.java 2011-06-23
20:07:49 UTC (rev 1027)
+++
federation/trunk/picketlink-fed-core/src/main/java/org/picketlink/identity/federation/core/parsers/util/SAML11ParserUtil.java 2011-06-23
20:44:42 UTC (rev 1028)
@@ -36,6 +36,7 @@
import org.picketlink.identity.federation.core.saml.v2.constants.JBossSAMLConstants;
import org.picketlink.identity.federation.core.saml.v2.constants.JBossSAMLURIConstants;
import org.picketlink.identity.federation.core.saml.v2.util.XMLTimeUtil;
+import org.picketlink.identity.federation.core.wstrust.WSTrustConstants;
import org.picketlink.identity.federation.saml.v1.assertion.SAML11ActionType;
import
org.picketlink.identity.federation.saml.v1.assertion.SAML11AttributeStatementType;
import org.picketlink.identity.federation.saml.v1.assertion.SAML11AttributeType;
@@ -43,7 +44,15 @@
import
org.picketlink.identity.federation.saml.v1.assertion.SAML11AuthorizationDecisionStatementType;
import org.picketlink.identity.federation.saml.v1.assertion.SAML11ConditionsType;
import org.picketlink.identity.federation.saml.v1.assertion.SAML11DecisionType;
+import
org.picketlink.identity.federation.saml.v1.assertion.SAML11SubjectConfirmationType;
import org.picketlink.identity.federation.saml.v1.assertion.SAML11SubjectType;
+import org.picketlink.identity.federation.saml.v2.assertion.SubjectConfirmationDataType;
+import org.picketlink.identity.xmlsec.w3.xmldsig.KeyInfoType;
+import org.picketlink.identity.xmlsec.w3.xmldsig.KeyValueType;
+import org.picketlink.identity.xmlsec.w3.xmldsig.RSAKeyValueType;
+import org.picketlink.identity.xmlsec.w3.xmldsig.X509CertificateType;
+import org.picketlink.identity.xmlsec.w3.xmldsig.X509DataType;
+import org.w3c.dom.Element;
/**
* Utility for parsing SAML 1.1 payload
@@ -52,6 +61,119 @@
*/
public class SAML11ParserUtil
{
+
+ public static SAML11SubjectConfirmationType
parseSAML11SubjectConfirmation(XMLEventReader xmlEventReader)
+ throws ParsingException
+ {
+ SAML11SubjectConfirmationType subjectConfirmationType = new
SAML11SubjectConfirmationType();
+
+ StartElement startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+
+ // There may be additional things under subject confirmation
+ while (xmlEventReader.hasNext())
+ {
+ XMLEvent xmlEvent = StaxParserUtil.peek(xmlEventReader);
+ if (xmlEvent instanceof EndElement)
+ {
+ EndElement endElement = StaxParserUtil.getNextEndElement(xmlEventReader);
+ StaxParserUtil.validate(endElement,
JBossSAMLConstants.SUBJECT_CONFIRMATION.get());
+ break;
+ }
+
+ if (xmlEvent instanceof StartElement)
+ {
+ startElement = (StartElement) xmlEvent;
+
+ String startTag = StaxParserUtil.getStartElementName(startElement);
+
+ if (startTag.equals(SAML11Constants.CONFIRMATION_METHOD))
+ {
+ startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+ String method = StaxParserUtil.getElementText(xmlEventReader);
+ subjectConfirmationType.addConfirmation(URI.create(method));
+ }
+
+ else if
(startTag.equals(JBossSAMLConstants.SUBJECT_CONFIRMATION_DATA.get()))
+ {
+ startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+ SubjectConfirmationDataType subjectConfirmationData =
parseSubjectConfirmationData(xmlEventReader);
+
subjectConfirmationType.setSubjectConfirmationData(subjectConfirmationData);
+ }
+ else if (startTag.equals(JBossSAMLConstants.KEY_INFO.get()))
+ {
+ Element keyInfo = StaxParserUtil.getDOMElement(xmlEventReader);
+ subjectConfirmationType.setKeyInfo(keyInfo);
+ }
+ else
+ throw new ParsingException("Unknown tag:" + startTag);
+ }
+ }
+ return subjectConfirmationType;
+
+ }
+
+ public static SubjectConfirmationDataType parseSubjectConfirmationData(XMLEventReader
xmlEventReader)
+ throws ParsingException
+ {
+ StartElement startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+ StaxParserUtil.validate(startElement,
JBossSAMLConstants.SUBJECT_CONFIRMATION_DATA.get());
+
+ SubjectConfirmationDataType subjectConfirmationData = new
SubjectConfirmationDataType();
+
+ Attribute inResponseTo = startElement.getAttributeByName(new
QName(JBossSAMLConstants.IN_RESPONSE_TO.get()));
+ if (inResponseTo != null)
+ {
+
subjectConfirmationData.setInResponseTo(StaxParserUtil.getAttributeValue(inResponseTo));
+ }
+
+ Attribute notBefore = startElement.getAttributeByName(new
QName(JBossSAMLConstants.NOT_BEFORE.get()));
+ if (notBefore != null)
+ {
+
subjectConfirmationData.setNotBefore(XMLTimeUtil.parse(StaxParserUtil.getAttributeValue(notBefore)));
+ }
+
+ Attribute notOnOrAfter = startElement.getAttributeByName(new
QName(JBossSAMLConstants.NOT_ON_OR_AFTER.get()));
+ if (notOnOrAfter != null)
+ {
+
subjectConfirmationData.setNotOnOrAfter(XMLTimeUtil.parse(StaxParserUtil.getAttributeValue(notOnOrAfter)));
+ }
+
+ Attribute recipient = startElement.getAttributeByName(new
QName(JBossSAMLConstants.RECIPIENT.get()));
+ if (recipient != null)
+ {
+
subjectConfirmationData.setRecipient(StaxParserUtil.getAttributeValue(recipient));
+ }
+
+ Attribute address = startElement.getAttributeByName(new
QName(JBossSAMLConstants.ADDRESS.get()));
+ if (address != null)
+ {
+ subjectConfirmationData.setAddress(StaxParserUtil.getAttributeValue(address));
+ }
+
+ XMLEvent xmlEvent = StaxParserUtil.peek(xmlEventReader);
+ if (!(xmlEvent instanceof EndElement))
+ {
+ startElement = StaxParserUtil.peekNextStartElement(xmlEventReader);
+ String tag = StaxParserUtil.getStartElementName(startElement);
+ if (tag.equals(WSTrustConstants.XMLDSig.KEYINFO))
+ {
+ KeyInfoType keyInfo = parseKeyInfo(xmlEventReader);
+ subjectConfirmationData.setAnyType(keyInfo);
+ }
+ else if (tag.equals(WSTrustConstants.XMLEnc.ENCRYPTED_KEY))
+ {
+
subjectConfirmationData.setAnyType(StaxParserUtil.getDOMElement(xmlEventReader));
+ }
+ else
+ throw new RuntimeException("Handle:" + tag);
+ }
+
+ // Get the end tag
+ EndElement endElement = (EndElement) StaxParserUtil.getNextEvent(xmlEventReader);
+ StaxParserUtil.matches(endElement,
JBossSAMLConstants.SUBJECT_CONFIRMATION_DATA.get());
+ return subjectConfirmationData;
+ }
+
/**
* Parse an {@code SAML11AttributeStatementType}
* @param xmlEventReader
@@ -320,4 +442,123 @@
}
return conditions;
}
+
+ public static KeyInfoType parseKeyInfo(XMLEventReader xmlEventReader) throws
ParsingException
+ {
+ KeyInfoType keyInfo = new KeyInfoType();
+ StartElement startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+ StaxParserUtil.validate(startElement, WSTrustConstants.XMLDSig.KEYINFO);
+
+ XMLEvent xmlEvent = null;
+ String tag = null;
+
+ while (xmlEventReader.hasNext())
+ {
+ xmlEvent = StaxParserUtil.peek(xmlEventReader);
+ if (xmlEvent instanceof EndElement)
+ {
+ tag = StaxParserUtil.getEndElementName((EndElement) xmlEvent);
+ if (tag.equals(WSTrustConstants.XMLDSig.KEYINFO))
+ {
+ xmlEvent = StaxParserUtil.getNextEndElement(xmlEventReader);
+ break;
+ }
+ else
+ throw new RuntimeException("unknown end element:" + tag);
+ }
+ startElement = (StartElement) xmlEvent;
+ tag = StaxParserUtil.getStartElementName(startElement);
+ if (tag.equals(WSTrustConstants.XMLEnc.ENCRYPTED_KEY))
+ {
+ keyInfo.addContent(StaxParserUtil.getDOMElement(xmlEventReader));
+ }
+ else if (tag.equals(WSTrustConstants.XMLDSig.X509DATA))
+ {
+ startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+ X509DataType x509 = new X509DataType();
+
+ // Let us go for the X509 certificate
+ startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+ StaxParserUtil.validate(startElement, WSTrustConstants.XMLDSig.X509CERT);
+
+ X509CertificateType cert = new X509CertificateType();
+ String certValue = StaxParserUtil.getElementText(xmlEventReader);
+ cert.setEncodedCertificate(certValue.getBytes());
+ x509.add(cert);
+
+ EndElement endElement = StaxParserUtil.getNextEndElement(xmlEventReader);
+ StaxParserUtil.validate(endElement, WSTrustConstants.XMLDSig.X509DATA);
+ keyInfo.addContent(x509);
+ }
+ else if (tag.equals(WSTrustConstants.XMLDSig.KEYVALUE))
+ {
+ startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+ KeyValueType keyValue = new KeyValueType();
+
+ startElement = StaxParserUtil.peekNextStartElement(xmlEventReader);
+ tag = StaxParserUtil.getStartElementName(startElement);
+ if (tag.equals(WSTrustConstants.XMLDSig.RSA_KEYVALUE))
+ {
+ keyValue.getContent().add(parseRSAKeyValue(xmlEventReader));
+ }
+ else if (tag.equals(WSTrustConstants.XMLDSig.DSA_KEYVALUE))
+ {
+ // TODO: parse the DSA key contents.
+ }
+ else
+ throw new ParsingException("Unknown element: " + tag);
+
+ EndElement endElement = StaxParserUtil.getNextEndElement(xmlEventReader);
+ StaxParserUtil.validate(endElement, WSTrustConstants.XMLDSig.KEYVALUE);
+
+ keyInfo.addContent(keyValue);
+ }
+ }
+ return keyInfo;
+ }
+
+ public static RSAKeyValueType parseRSAKeyValue(XMLEventReader xmlEventReader) throws
ParsingException
+ {
+ StartElement startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+ StaxParserUtil.validate(startElement, WSTrustConstants.XMLDSig.RSA_KEYVALUE);
+
+ XMLEvent xmlEvent = null;
+ String tag = null;
+
+ RSAKeyValueType rsaKeyValue = new RSAKeyValueType();
+
+ while (xmlEventReader.hasNext())
+ {
+ xmlEvent = StaxParserUtil.peek(xmlEventReader);
+ if (xmlEvent instanceof EndElement)
+ {
+ tag = StaxParserUtil.getEndElementName((EndElement) xmlEvent);
+ if (tag.equals(WSTrustConstants.XMLDSig.RSA_KEYVALUE))
+ {
+ xmlEvent = StaxParserUtil.getNextEndElement(xmlEventReader);
+ break;
+ }
+ else
+ throw new RuntimeException("unknown end element:" + tag);
+ }
+
+ startElement = (StartElement) xmlEvent;
+ tag = StaxParserUtil.getStartElementName(startElement);
+ if (tag.equals(WSTrustConstants.XMLDSig.MODULUS))
+ {
+ startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+ String text = StaxParserUtil.getElementText(xmlEventReader);
+ rsaKeyValue.setModulus(text.getBytes());
+ }
+ else if (tag.equals(WSTrustConstants.XMLDSig.EXPONENT))
+ {
+ startElement = StaxParserUtil.getNextStartElement(xmlEventReader);
+ String text = StaxParserUtil.getElementText(xmlEventReader);
+ rsaKeyValue.setExponent(text.getBytes());
+ }
+ else
+ throw new ParsingException("Unknown element: " + tag);
+ }
+ return rsaKeyValue;
+ }
}
\ No newline at end of file
Modified:
federation/trunk/picketlink-fed-core/src/test/java/org/picketlink/test/identity/federation/core/parser/saml/SAML11AssertionParserTestCase.java
===================================================================
---
federation/trunk/picketlink-fed-core/src/test/java/org/picketlink/test/identity/federation/core/parser/saml/SAML11AssertionParserTestCase.java 2011-06-23
20:07:49 UTC (rev 1027)
+++
federation/trunk/picketlink-fed-core/src/test/java/org/picketlink/test/identity/federation/core/parser/saml/SAML11AssertionParserTestCase.java 2011-06-23
20:44:42 UTC (rev 1028)
@@ -44,6 +44,7 @@
import
org.picketlink.identity.federation.saml.v1.assertion.SAML11SubjectConfirmationType;
import org.picketlink.identity.federation.saml.v1.assertion.SAML11SubjectType;
import
org.picketlink.identity.federation.saml.v1.assertion.SAML11SubjectType.SAML11SubjectTypeChoice;
+import org.w3c.dom.Element;
/**
* Unit Test the parsing of SAML 1.1 assertion
@@ -236,4 +237,39 @@
confirmationMethod = subjConf.getConfirmationMethod().get(0);
assertEquals("urn:oasis:names:tc:SAML:1.0:cm:artifact",
confirmationMethod.toString());
}
+
+ @Test
+ public void testSAML11AssertionWithKeyInfo() throws Exception
+ {
+ ClassLoader tcl = Thread.currentThread().getContextClassLoader();
+ InputStream configStream =
tcl.getResourceAsStream("parser/saml1/saml1-assertion-keyinfo.xml");
+
+ SAMLParser parser = new SAMLParser();
+ SAML11AssertionType assertion = (SAML11AssertionType) parser.parse(configStream);
+ assertNotNull(assertion);
+
+ //Validate assertion
+ assertEquals(1, assertion.getMajorVersion());
+ assertEquals(1, assertion.getMinorVersion());
+ assertEquals("s69f7e2599d4eb0c548782432bf", assertion.getID());
+
assertEquals("http://jboss.org/test", assertion.getIssuer());
+ assertEquals(XMLTimeUtil.parse("2006-05-24T05:52:32Z"),
assertion.getIssueInstant());
+
+ List<SAML11StatementAbstractType> statements = assertion.getStatements();
+ assertEquals(1, statements.size());
+ SAML11AuthenticationStatementType authStat = (SAML11AuthenticationStatementType)
statements.get(0);
+ assertEquals(XMLTimeUtil.parse("2006-05-24T05:52:30Z"),
authStat.getAuthenticationInstant());
+ assertEquals("urn:picketlink:auth",
authStat.getAuthenticationMethod().toString());
+ SAML11SubjectType subject = authStat.getSubject();
+ SAML11SubjectTypeChoice choice = subject.getChoice();
+ SAML11NameIdentifierType nameID = choice.getNameID();
+ assertEquals("anil", nameID.getValue());
+ SAML11SubjectConfirmationType subjConf = subject.getSubjectConfirmation();
+ URI confirmationMethod = subjConf.getConfirmationMethod().get(0);
+ assertEquals("urn:oasis:names:tc:SAML:1.0:cm:holder-of-key",
confirmationMethod.toString());
+ assertNotNull(subjConf.getKeyInfo());
+
+ Element sig = assertion.getSignature();
+ assertNotNull(sig);
+ }
}
\ No newline at end of file
Added:
federation/trunk/picketlink-fed-core/src/test/resources/parser/saml1/saml1-assertion-keyinfo.xml
===================================================================
---
federation/trunk/picketlink-fed-core/src/test/resources/parser/saml1/saml1-assertion-keyinfo.xml
(rev 0)
+++
federation/trunk/picketlink-fed-core/src/test/resources/parser/saml1/saml1-assertion-keyinfo.xml 2011-06-23
20:44:42 UTC (rev 1028)
@@ -0,0 +1,44 @@
+<saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion"
+ AssertionID="s69f7e2599d4eb0c548782432bf"
IssueInstant="2006-05-24T05:52:32Z"
+
Issuer="http://jboss.org/test" MajorVersion="1"
MinorVersion="1">
+ <saml:AuthenticationStatement
+ AuthenticationInstant="2006-05-24T05:52:30Z"
AuthenticationMethod="urn:picketlink:auth">
+ <saml:Subject>
+ <saml:NameIdentifier>anil</saml:NameIdentifier>
+ <saml:SubjectConfirmation>
+ <saml:ConfirmationMethod>urn:oasis:names:tc:SAML:1.0:cm:holder-of-key
+ </saml:ConfirmationMethod>
+ <KeyInfo
xmlns="http://www.w3.org/2000/09/xmldsig#">
+ <KeyName>CN=anil, OU=PicketLink, O=JBoss, L=Chicago, ST=IL,
C=US</KeyName>
+ <KeyValue>
+ <RSAKeyValue>
+ <Modulus>dsfdfdskjfdsf;dfjds;fdsjfdsfdsjf</Modulus>
+ <Exponent>AQAB</Exponent>
+ </RSAKeyValue>
+ </KeyValue>
+ </KeyInfo>
+ </saml:SubjectConfirmation>
+ </saml:Subject>
+ </saml:AuthenticationStatement>
+ <Signature
xmlns="http://www.w3.org/2000/09/xmldsig#">
+ <SignedInfo>
+ <CanonicalizationMethod
Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
+ <SignatureMethod
Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"
/>
+ <Reference URI="#s69f7e258e30da2b9b9f5799d4eb0c548782432bf">
+ <Transforms>
+ <Transform
Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
+ <Transform
Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
+ </Transforms>
+ <DigestMethod
Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
+ <DigestValue>zdCY/1iqOMUJq/RvxsaDPWM4+7c=</DigestValue>
+ </Reference>
+ </SignedInfo>
+ <SignatureValue>ApcX/Ddfsfdslkfd</SignatureValue>
+ <KeyInfo>
+ <X509Data>
+ <X509Certificate>MIICmjdfdflkfdslfaf;sjdposafhpofhpowfowqpowqfow
+ </X509Certificate>
+ </X509Data>
+ </KeyInfo>
+ </Signature>
+</saml:Assertion>
\ No newline at end of file