a41e9deb0462c9985b8acdf1b94a5875609f1f72
[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         if (!policies.contains(Constants.POLICY_CLUBSHIB))
85             throw new SAMLException(SAMLException.REQUESTER, "ClubShibPOSTProfile() policy array must include Club Shib");
86     }
87
88     /**
89      *  HS-side constructor for a ClubShibPOSTProfile object
90      *
91      * @param  policies           Set of policy URIs that the implementation
92      *      must support
93      * @param  issuer             "Official" name of issuing origin site
94      * @exception  SAMLException  Raised if a profile implementation cannot be
95      *      constructed from the supplied information
96      */
97     public ClubShibPOSTProfile(Collection policies, String issuer)
98         throws SAMLException
99     {
100         super(policies, issuer);
101         if (!policies.contains(Constants.POLICY_CLUBSHIB))
102             throw new SAMLException(SAMLException.RESPONDER, "ClubShibPOSTProfile() policy array must include Club Shib");
103     }
104
105     /**
106      *  Used by HS to generate a signed SAML response conforming to the POST
107      *  profile<P>
108      *
109      *  Club Shib specifies use of the RSA algorithm with RSA public keys and
110      *  X.509 certificates.
111      *
112      * @param  recipient          URL of intended consumer
113      * @param  name               Name of subject
114      * @param  nameQualifier      Federates or qualifies subject name (optional)
115      * @param  subjectIP          Client address of subject (optional)
116      * @param  authMethod         URI of authentication method being asserted
117      * @param  authInstant        Date and time of authentication being asserted
118      * @param  bindings           Set of SAML authorities the relying party
119      *      may contact (optional)
120      * @param  responseKey        A secret or private key to use in response
121      *      signature or MAC
122      * @param  responseCert       One or more X.509 certificates to enclose with the
123      *      response (optional)
124      * @param  assertionKey       A secret or private key to use in assertion
125      *      signature or MAC (optional)
126      * @param  assertionCert      One or more X.509 certificates to enclose with the
127      *      assertion (optional)
128      * @return                    SAML response to send to accepting site
129      * @exception  SAMLException  Base class of exceptions that may be thrown
130      *      during processing
131      */
132     public SAMLResponse prepare(String recipient,
133                                 String name,
134                                 String nameQualifier,
135                                 String subjectIP,
136                                 String authMethod,
137                                 Date authInstant,
138                                 Collection bindings,
139                                 Key responseKey, Collection responseCerts,
140                                 Key assertionKey, Collection assertionCerts
141                                 )
142         throws SAMLException
143     {
144         if (responseKey == null || !(responseKey instanceof RSAPrivateKey))
145             throw new InvalidCryptoException(SAMLException.RESPONDER, "ClubShibPOSTProfile.prepare() requires the response key be an RSA private key");
146         if (assertionKey != null && !(assertionKey instanceof RSAPrivateKey))
147             throw new InvalidCryptoException(SAMLException.RESPONDER, "ClubShibPOSTProfile.prepare() requires the assertion key be an RSA private key");
148
149         return super.prepare(
150             recipient,
151             name,
152             nameQualifier,
153             subjectIP,
154             authMethod,
155             authInstant,
156             bindings,
157             responseKey,
158             responseCerts,
159             assertionKey,
160             assertionCerts);
161     }
162
163     /**
164      *  Club Shib signature verification implements additional checks for the
165      *  RSA and SHA-1 algorithms.
166      *
167      * @param  obj         The object containing the signature
168      * @param  signerName  The name of the signer
169      * @param  ks          A keystore containing trusted root certificates
170      * @param  knownKey    An explicit key to use if a certificate cannot be
171      *      found
172      * @param  simple      Verify according to simple SAML signature profile?
173      *
174      * @throws SAMLException    Thrown if the signature cannot be verified
175      */
176     protected void verifySignature(SAMLSignedObject obj, String signerName, KeyStore ks, Key knownKey, boolean simple)
177         throws SAMLException
178     {
179         super.verifySignature(obj, signerName, ks, knownKey, simple);
180         if (!obj.getSignatureAlgorithm().equals(XMLSignature.ALGO_ID_SIGNATURE_RSA_SHA1))
181             throw new TrustException(SAMLException.RESPONDER, "ClubShibPOSTProfile.verifySignature() requires the RSA-SHA1 signature algorithm");
182     }
183 }
184