1 package org.bouncycastle.x509;
2 
3 import org.bouncycastle.util.Selector;
4 
5 /**
6  * This class is an <code>Selector</code> like implementation to select
7  * certificates pairs, which are e.g. used for cross certificates. The set of
8  * criteria is given from two
9  * {@link org.bouncycastle.x509.X509CertStoreSelector}s which must be both
10  * matched.
11  *
12  * @see org.bouncycastle.x509.X509AttributeCertificate
13  * @see org.bouncycastle.x509.X509Store
14  */
15 public class X509CertPairStoreSelector implements Selector
16 {
17 
18     private X509CertStoreSelector forwardSelector;
19 
20     private X509CertStoreSelector reverseSelector;
21 
22     private X509CertificatePair certPair;
23 
X509CertPairStoreSelector()24     public X509CertPairStoreSelector()
25     {
26     }
27 
28     /**
29      * Returns the certificate pair which is used for testing on equality.
30      *
31      * @return Returns the certificate pair which is checked.
32      */
getCertPair()33     public X509CertificatePair getCertPair()
34     {
35         return certPair;
36     }
37 
38     /**
39      * Set the certificate pair which is used for testing on equality.
40      *
41      * @param certPair The certPairChecking to set.
42      */
setCertPair(X509CertificatePair certPair)43     public void setCertPair(X509CertificatePair certPair)
44     {
45         this.certPair = certPair;
46     }
47 
48     /**
49      * @param forwardSelector The certificate selector for the forward part in
50      *            the pair.
51      */
setForwardSelector(X509CertStoreSelector forwardSelector)52     public void setForwardSelector(X509CertStoreSelector forwardSelector)
53     {
54         this.forwardSelector = forwardSelector;
55     }
56 
57     /**
58      * @param reverseSelector The certificate selector for the reverse part in
59      *            the pair.
60      */
setReverseSelector(X509CertStoreSelector reverseSelector)61     public void setReverseSelector(X509CertStoreSelector reverseSelector)
62     {
63         this.reverseSelector = reverseSelector;
64     }
65 
66     /**
67      * Returns a clone of this selector.
68      *
69      * @return A clone of this selector.
70      * @see java.lang.Object#clone()
71      */
clone()72     public Object clone()
73     {
74         X509CertPairStoreSelector cln = new X509CertPairStoreSelector();
75 
76         cln.certPair = certPair;
77 
78         if (forwardSelector != null)
79         {
80             cln.setForwardSelector((X509CertStoreSelector) forwardSelector
81                     .clone());
82         }
83 
84         if (reverseSelector != null)
85         {
86             cln.setReverseSelector((X509CertStoreSelector) reverseSelector
87                     .clone());
88         }
89 
90         return cln;
91     }
92 
93     /**
94      * Decides if the given certificate pair should be selected. If
95      * <code>obj</code> is not a {@link X509CertificatePair} this method
96      * returns <code>false</code>.
97      *
98      * @param obj The {@link X509CertificatePair} which should be tested.
99      * @return <code>true</code> if the object matches this selector.
100      */
match(Object obj)101     public boolean match(Object obj)
102     {
103         try
104         {
105             if (!(obj instanceof X509CertificatePair))
106             {
107                 return false;
108             }
109             X509CertificatePair pair = (X509CertificatePair)obj;
110 
111             if (forwardSelector != null
112                     && !forwardSelector.match((Object)pair.getForward()))
113             {
114                 return false;
115             }
116 
117             if (reverseSelector != null
118                     && !reverseSelector.match((Object)pair.getReverse()))
119             {
120                 return false;
121             }
122 
123             if (certPair != null)
124             {
125                 return certPair.equals(obj);
126             }
127 
128             return true;
129         }
130         catch (Exception e)
131         {
132             return false;
133         }
134     }
135 
136     /**
137      * Returns the certicate selector for the forward part.
138      *
139      * @return Returns the certicate selector for the forward part.
140      */
getForwardSelector()141     public X509CertStoreSelector getForwardSelector()
142     {
143         return forwardSelector;
144     }
145 
146     /**
147      * Returns the certicate selector for the reverse part.
148      *
149      * @return Returns the reverse selector for teh reverse part.
150      */
getReverseSelector()151     public X509CertStoreSelector getReverseSelector()
152     {
153         return reverseSelector;
154     }
155 }
156