[jboss-cvs] Picketlink SVN: r1028 - in federation/trunk/picketlink-fed-core/src: main/java/org/picketlink/identity/federation/core/parsers/util and 2 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu Jun 23 16:44:43 EDT 2011


Author: anil.saldhana at 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



More information about the jboss-cvs-commits mailing list