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