Updated OpenSAML library.
[java-idp.git] / src / edu / internet2 / middleware / shibboleth / common / ClubShibPOSTProfile.java
1 package edu.internet2.middleware.shibboleth.common;
2
3 import java.util.Date;
4 import java.security.Key;
5 import java.security.KeyStore;
6 import java.security.cert.X509Certificate;
7 import java.security.interfaces.RSAPrivateKey;
8 import org.apache.xml.security.signature.SignedInfo;
9 import org.apache.xml.security.signature.XMLSignature;
10 import org.opensaml.*;
11 import org.w3c.dom.*;
12
13 import edu.internet2.middleware.shibboleth.common.*;
14 import edu.internet2.middleware.shibboleth.shire.*;
15
16 /**
17  *  ClubShib-specific POST browser profile implementation
18  *
19  * @author     Scott Cantor
20  * @created    April 11, 2002
21  */
22 public class ClubShibPOSTProfile extends ShibPOSTProfile
23 {
24     /**
25      *  SHIRE-side constructor for a ClubShibPOSTProfile object
26      *
27      * @param  policies           Array of policy URIs that the implementation
28      *      must support
29      * @param  mapper             Interface between profile and trust base
30      * @param  receiver           URL of SHIRE
31      * @param  ttlSeconds         Length of time in seconds allowed to elapse
32      *      from issuance of SAML response
33      * @exception  SAMLException  Raised if a profile implementation cannot be
34      *      constructed from the supplied information
35      */
36     public ClubShibPOSTProfile(String[] policies, OriginSiteMapper mapper, String receiver, int ttlSeconds)
37         throws SAMLException
38     {
39         super(policies, mapper, receiver, ttlSeconds);
40         int i;
41         for (i = 0; i < policies.length; i++)
42             if (policies[i].equals(Constants.POLICY_CLUBSHIB))
43                 break;
44         if (i == policies.length)
45             throw new SAMLException(SAMLException.REQUESTER, "ClubShibPOSTProfile() policy array must include Club Shib");
46     }
47
48     /**
49      *  HS-side constructor for a ClubShibPOSTProfile object
50      *
51      * @param  policies           Array of policy URIs that the implementation
52      *      must support
53      * @param  issuer             "Official" name of issuing origin site
54      * @exception  SAMLException  Raised if a profile implementation cannot be
55      *      constructed from the supplied information
56      */
57     public ClubShibPOSTProfile(String[] policies, String issuer)
58         throws SAMLException
59     {
60         super(policies, issuer);
61         int i;
62         for (i = 0; i < policies.length; i++)
63             if (policies[i].equals(Constants.POLICY_CLUBSHIB))
64                 break;
65         if (i == policies.length)
66             throw new SAMLException(SAMLException.RESPONDER, "ClubShibPOSTProfile() policy array must include Club Shib");
67     }
68
69     /**
70      *  Used by HS to generate a signed SAML response conforming to the POST
71      *  profile<P>
72      *
73      *  Club Shib specifies use of the RSA algorithm with RSA public keys and
74      *  X.509 certificates.
75      *
76      * @param  recipient          URL of intended consumer
77      * @param  name               Name of subject
78      * @param  nameQualifier      Federates or qualifies subject name (optional)
79      * @param  subjectIP          Client address of subject (optional)
80      * @param  authMethod         URI of authentication method being asserted
81      * @param  authInstant        Date and time of authentication being asserted
82      * @param  bindings           Array of SAML authorities the relying party
83      *      may contact (optional)
84      * @param  responseKey        A secret or private key to use in response
85      *      signature or MAC
86      * @param  responseCert       A public key certificate to enclose with the
87      *      response (optional)
88      * @param  assertionKey       A secret or private key to use in assertion
89      *      signature or MAC (optional)
90      * @param  assertionCert      A public key certificate to enclose with the
91      *      assertion (optional)
92      * @return                    SAML response to send to accepting site
93      * @exception  SAMLException  Base class of exceptions that may be thrown
94      *      during processing
95      */
96     public SAMLResponse prepare(String recipient,
97                                 String name,
98                                 String nameQualifier,
99                                 String subjectIP,
100                                 String authMethod,
101                                 Date authInstant,
102                                 SAMLAuthorityBinding[] bindings,
103                                 Key responseKey, X509Certificate responseCert,
104                                 Key assertionKey, X509Certificate assertionCert
105                                 )
106         throws SAMLException
107     {
108         if (responseKey == null || !(responseKey instanceof RSAPrivateKey))
109             throw new InvalidCryptoException(SAMLException.RESPONDER, "ClubShibPOSTProfile.prepare() requires the response key be an RSA private key");
110         if (assertionKey != null && !(assertionKey instanceof RSAPrivateKey))
111             throw new InvalidCryptoException(SAMLException.RESPONDER, "ClubShibPOSTProfile.prepare() requires the assertion key be an RSA private key");
112
113         return super.prepare(
114             recipient,
115             name,
116             nameQualifier,
117             subjectIP,
118             authMethod,
119             authInstant,
120             bindings,
121             responseKey,
122             responseCert,
123             assertionKey,
124             assertionCert);
125     }
126
127     /**
128      *  Club Shib signature verification implements additional checks for the
129      *  RSA and SHA-1 algorithms.
130      *
131      * @param  obj         The object containing the signature
132      * @param  signerName  The name of the signer
133      * @param  ks          A keystore containing trusted root certificates
134      * @param  knownKey    An explicit key to use if a certificate cannot be
135      *      found
136      * @return             The result of signature verification
137      */
138     protected boolean verifySignature(SAMLSignedObject obj, String signerName, KeyStore ks, Key knownKey)
139     {
140         if (!super.verifySignature(obj, signerName, ks, knownKey))
141             return false;
142         return XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA1.equals(
143             obj.getSignature().getSignedInfo().getSignatureMethodURI()
144             );
145     }
146 }
147