1e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrompackage org.bouncycastle.cms; 2e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 3e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport java.util.ArrayList; 4e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport java.util.Collection; 5e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport java.util.HashMap; 6e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport java.util.Iterator; 7e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport java.util.List; 8e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport java.util.Map; 9e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 10028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giroimport org.bouncycastle.util.Iterable; 11028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro 12e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrompublic class SignerInformationStore 13028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro implements Iterable<SignerInformation> 14e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom{ 15a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom private List all = new ArrayList(); 16e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom private Map table = new HashMap(); 17e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 18028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro /** 19028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro * Create a store containing a single SignerInformation object. 20028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro * 21028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro * @param signerInfo the signer information to contain. 22028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro */ 23028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro public SignerInformationStore( 24028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro SignerInformation signerInfo) 25028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro { 26028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro this.all = new ArrayList(1); 27028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro this.all.add(signerInfo); 28028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro 29028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro SignerId sid = signerInfo.getSID(); 30028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro 31028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro table.put(sid, all); 32028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro } 33028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro 34028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro /** 35028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro * Create a store containing a collection of SignerInformation objects. 36028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro * 37028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro * @param signerInfos a collection signer information objects to contain. 38028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro */ 39e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom public SignerInformationStore( 40028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro Collection<SignerInformation> signerInfos) 41e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 42e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom Iterator it = signerInfos.iterator(); 43e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 44e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom while (it.hasNext()) 45e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 46e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom SignerInformation signer = (SignerInformation)it.next(); 47e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom SignerId sid = signer.getSID(); 48e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 49e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom List list = (ArrayList)table.get(sid); 50e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom if (list == null) 51e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 52e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom list = new ArrayList(1); 53e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom table.put(sid, list); 54e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 55e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 56e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom list.add(signer); 57e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 58e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 59e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom this.all = new ArrayList(signerInfos); 60e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 61e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 62e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom /** 63e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * Return the first SignerInformation object that matches the 64e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * passed in selector. Null if there are no matches. 65e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * 66e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * @param selector to identify a signer 67e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * @return a single SignerInformation object. Null if none matches. 68e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom */ 69e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom public SignerInformation get( 70e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom SignerId selector) 71e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 72e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom Collection list = getSigners(selector); 73e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 74e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom return list.size() == 0 ? null : (SignerInformation) list.iterator().next(); 75e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 76e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 77e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom /** 78e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * Return the number of signers in the collection. 79e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * 80e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * @return number of signers identified. 81e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom */ 82e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom public int size() 83e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 84e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom return all.size(); 85e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 86e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 87e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom /** 88e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * Return all signers in the collection 89e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * 90e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * @return a collection of signers. 91e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom */ 92028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro public Collection<SignerInformation> getSigners() 93e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 94e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom return new ArrayList(all); 95e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 96e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 97e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom /** 98e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * Return possible empty collection with signers matching the passed in SignerId 99e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * 100e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * @param selector a signer id to select against. 101e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * @return a collection of SignerInformation objects. 102e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom */ 103028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro public Collection<SignerInformation> getSigners( 104e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom SignerId selector) 105e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 106e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom if (selector.getIssuer() != null && selector.getSubjectKeyIdentifier() != null) 107e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 108e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom List results = new ArrayList(); 109e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 110e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom Collection match1 = getSigners(new SignerId(selector.getIssuer(), selector.getSerialNumber())); 111e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 112e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom if (match1 != null) 113e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 114e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom results.addAll(match1); 115e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 116e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 117e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom Collection match2 = getSigners(new SignerId(selector.getSubjectKeyIdentifier())); 118e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 119e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom if (match2 != null) 120e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 121e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom results.addAll(match2); 122e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 123e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 124e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom return results; 125e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 126e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom else 127e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom { 128e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom List list = (ArrayList)table.get(selector); 129e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom 130e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom return list == null ? new ArrayList() : new ArrayList(list); 131e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 132e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom } 133028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro 134028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro /** 135028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro * Support method for Iterable where available. 136028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro */ 137028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro public Iterator<SignerInformation> iterator() 138028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro { 139028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro return getSigners().iterator(); 140028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro } 141e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom} 142