ed5a6ae53eafd1223f08a33f47b6faa80d08a0fe
[java-idp.git] / src / edu / internet2 / middleware / shibboleth / common / ClubShibPOSTProfile.java
1 /* 
2  * The Shibboleth License, Version 1. 
3  * Copyright (c) 2002 
4  * University Corporation for Advanced Internet Development, Inc. 
5  * All rights reserved
6  * 
7  * 
8  * Redistribution and use in source and binary forms, with or without 
9  * modification, are permitted provided that the following conditions are met:
10  * 
11  * Redistributions of source code must retain the above copyright notice, this 
12  * list of conditions and the following disclaimer.
13  * 
14  * Redistributions in binary form must reproduce the above copyright notice, 
15  * this list of conditions and the following disclaimer in the documentation 
16  * and/or other materials provided with the distribution, if any, must include 
17  * the following acknowledgment: "This product includes software developed by 
18  * the University Corporation for Advanced Internet Development 
19  * <http://www.ucaid.edu>Internet2 Project. Alternately, this acknowledegement 
20  * may appear in the software itself, if and wherever such third-party 
21  * acknowledgments normally appear.
22  * 
23  * Neither the name of Shibboleth nor the names of its contributors, nor 
24  * Internet2, nor the University Corporation for Advanced Internet Development, 
25  * Inc., nor UCAID may be used to endorse or promote products derived from this 
26  * software without specific prior written permission. For written permission, 
27  * please contact shibboleth@shibboleth.org
28  * 
29  * Products derived from this software may not be called Shibboleth, Internet2, 
30  * UCAID, or the University Corporation for Advanced Internet Development, nor 
31  * may Shibboleth appear in their name, without prior written permission of the 
32  * University Corporation for Advanced Internet Development.
33  * 
34  * 
35  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
36  * AND WITH ALL FAULTS. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
37  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
38  * PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE DISCLAIMED AND THE ENTIRE RISK 
39  * OF SATISFACTORY QUALITY, PERFORMANCE, ACCURACY, AND EFFORT IS WITH LICENSEE. 
40  * IN NO EVENT SHALL THE COPYRIGHT OWNER, CONTRIBUTORS OR THE UNIVERSITY 
41  * CORPORATION FOR ADVANCED INTERNET DEVELOPMENT, INC. BE LIABLE FOR ANY DIRECT, 
42  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
43  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
44  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 
45  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
46  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
47  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
48  */
49
50 package edu.internet2.middleware.shibboleth.common;
51
52 import java.security.Key;
53 import java.security.KeyStore;
54 import java.security.interfaces.RSAPrivateKey;
55 import java.util.Collection;
56 import java.util.Date;
57
58 import org.apache.xml.security.signature.XMLSignature;
59 import org.opensaml.*;
60
61 /**
62  *  ClubShib-specific POST browser profile implementation
63  *
64  * @author     Scott Cantor
65  * @created    April 11, 2002
66  */
67 public class ClubShibPOSTProfile extends ShibPOSTProfile
68 {
69     /**
70      *  SHIRE-side constructor for a ClubShibPOSTProfile object
71      *
72      * @param  policies           Set of policy URIs that the implementation
73      *      must support
74      * @param  receiver           URL of SHIRE
75      * @param  ttlSeconds         Length of time in seconds allowed to elapse
76      *      from issuance of SAML response
77      * @exception  SAMLException  Raised if a profile implementation cannot be
78      *      constructed from the supplied information
79      */
80     public ClubShibPOSTProfile(Collection policies, String receiver, int ttlSeconds)
81         throws SAMLException
82     {
83         super(policies, receiver, ttlSeconds);
84         return;
85         if (!policies.contains(Constants.POLICY_INCOMMON))
86             throw new SAMLException(SAMLException.REQUESTER, "ClubShibPOSTProfile() policy array must include Club Shib");
87     }
88
89     /**
90      *  HS-side constructor for a ClubShibPOSTProfile object
91      *
92      * @param  policies           Set of policy URIs that the implementation
93      *      must support
94      * @param  issuer             "Official" name of issuing origin site
95      * @exception  SAMLException  Raised if a profile implementation cannot be
96      *      constructed from the supplied information
97      */
98     public ClubShibPOSTProfile(Collection policies, String issuer)
99         throws SAMLException
100     {
101         super(policies, issuer);
102         return;
103         if (!policies.contains(Constants.POLICY_INCOMMON))
104             throw new SAMLException(SAMLException.RESPONDER, "ClubShibPOSTProfile() policy array must include Club Shib");
105     }
106
107     /**
108      *  Used by HS to generate a signed SAML response conforming to the POST
109      *  profile<P>
110      *
111      *  Club Shib specifies use of the RSA algorithm with RSA public keys and
112      *  X.509 certificates.
113      *
114      * @param  recipient          URL of intended consumer
115      * @param  name               Name of subject
116      * @param  nameQualifier      Federates or qualifies subject name (optional)
117      * @param  subjectIP          Client address of subject (optional)
118      * @param  authMethod         URI of authentication method being asserted
119      * @param  authInstant        Date and time of authentication being asserted
120      * @param  bindings           Set of SAML authorities the relying party
121      *      may contact (optional)
122      * @param  responseKey        A secret or private key to use in response
123      *      signature or MAC
124      * @param  responseCert       One or more X.509 certificates to enclose with the
125      *      response (optional)
126      * @param  assertionKey       A secret or private key to use in assertion
127      *      signature or MAC (optional)
128      * @param  assertionCert      One or more X.509 certificates to enclose with the
129      *      assertion (optional)
130      * @return                    SAML response to send to accepting site
131      * @exception  SAMLException  Base class of exceptions that may be thrown
132      *      during processing
133      */
134     public SAMLResponse prepare(String recipient,
135                                 String name,
136                                 String nameQualifier,
137                                 String subjectIP,
138                                 String authMethod,
139                                 Date authInstant,
140                                 Collection bindings,
141                                 Key responseKey, Collection responseCerts,
142                                 Key assertionKey, Collection assertionCerts
143                                 )
144         throws SAMLException
145     {
146         if (responseKey == null || !(responseKey instanceof RSAPrivateKey))
147             throw new InvalidCryptoException(SAMLException.RESPONDER, "ClubShibPOSTProfile.prepare() requires the response key be an RSA private key");
148         if (assertionKey != null && !(assertionKey instanceof RSAPrivateKey))
149             throw new InvalidCryptoException(SAMLException.RESPONDER, "ClubShibPOSTProfile.prepare() requires the assertion key be an RSA private key");
150
151         return super.prepare(
152             recipient,
153             name,
154             nameQualifier,
155             subjectIP,
156             authMethod,
157             authInstant,
158             bindings,
159             responseKey,
160             responseCerts,
161             assertionKey,
162             assertionCerts);
163     }
164
165     /**
166      *  Club Shib signature verification implements additional checks for the
167      *  RSA and SHA-1 algorithms.
168      *
169      * @param  obj         The object containing the signature
170      * @param  signerName  The name of the signer
171      * @param  ks          A keystore containing trusted root certificates
172      * @param  knownKey    An explicit key to use if a certificate cannot be
173      *      found
174      * @param  simple      Verify according to simple SAML signature profile?
175      *
176      * @throws SAMLException    Thrown if the signature cannot be verified
177      */
178     protected void verifySignature(SAMLSignedObject obj, String signerName, KeyStore ks, Key knownKey, boolean simple)
179         throws SAMLException
180     {
181         super.verifySignature(obj, signerName, ks, knownKey, simple);
182         if (!obj.getSignatureAlgorithm().equals(XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA1))
183             throw new TrustException(SAMLException.RESPONDER, "ClubShibPOSTProfile.verifySignature() requires the RSA-SHA1 signature algorithm");
184     }
185 }
186