Changeset 42ca4b8


Ignore:
Timestamp:
Mar 16, 2011 11:51:23 AM (8 years ago)
Author:
Ted Faber <faber@…>
Branches:
abac0-leak, abac0-mei, compt_changes, gec13, master, mei-id, mei-rt0-n, mei_rt0, mei_rt2, mei_rt2_fix_1, meiyap-rt1, meiyap1, rt2, tvf-new-xml
Children:
8a93b41
Parents:
f0ae3d8
Message:

Allow identities to carry keys, and adjust reading routines to handle keys well.

Location:
java/net/deterlab/abac
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • java/net/deterlab/abac/Credential.java

    rf63aa1b r42ca4b8  
    229229                throws IOException {
    230230        Vector<Credential> creds = new Vector<Credential>();
    231         Vector<ZipEntry> derFiles = new Vector<ZipEntry>();
     231        Vector<ZipEntry> derEntries = new Vector<ZipEntry>();
     232        Map<String, Identity> ids = new TreeMap<String, Identity>();
     233        Map<String, KeyPair> kps = new TreeMap<String, KeyPair>();
    232234
    233235        ZipFile z = new ZipFile(zf);
     
    236238                ze.hasMoreElements();) {
    237239            ZipEntry  f = ze.nextElement();
    238             Object o = null;
    239240            try {
    240                 o = new PEMReader(new InputStreamReader(
    241                             z.getInputStream(f))).readObject();
    242             }
    243             catch (IOException e) {
    244                 // PEMReader couldn't deal, so we assume it's a DER
    245                 derFiles.add(f);
    246                 continue;
    247             }
    248             try {
    249                 if ( o == null ) {
    250                     // This shouldn't be, but assume it's a DER
    251                     derFiles.add(f);
    252                 }
    253                 else if (o instanceof X509CertificateObject) {
    254                     Credential.addIdentity(
    255                             new Identity((X509CertificateObject)o));
    256                 }
    257                 else if (o instanceof KeyPair ) {
    258                     if ( keys != null ) keys.add((KeyPair) o);
     241                PEMReader r = new PEMReader(
     242                        new InputStreamReader(z.getInputStream(f)));
     243                Object o = readPEM(r);
     244
     245                if ( o != null ) {
     246                    if (o instanceof Identity) {
     247                        Identity i = (Identity) o;
     248                        String kid = i.getKeyID();
     249
     250                        if (kps.containsKey(kid) ) {
     251                            i.setKeyPair(kps.get(kid));
     252                            kps.remove(kid);
     253                        }
     254                        else if (i.getKeyPair() == null )
     255                            ids.put(i.getKeyID(), i);
     256
     257                        Credential.addIdentity(i);
     258                    }
     259                    else if (o instanceof KeyPair ) {
     260                        KeyPair kp = (KeyPair) o;
     261                        String kid = Identity.extractKeyID(kp.getPublic());
     262
     263                        if (ids.containsKey(kid)) {
     264                            Identity i = ids.get(kid);
     265
     266                            i.setKeyPair(kp);
     267                            ids.remove(kid);
     268                        }
     269                        else {
     270                            kps.put(kid, kp);
     271                        }
     272                    }
    259273                }
    260274                else {
    261                     throw new IOException("Unexpected PEM object: " +
    262                             o.getClass().getName());
     275                    // Not a PEM file
     276                    derEntries.add(f);
     277                    continue;
    263278                }
    264279            }
     
    268283        }
    269284
    270         for ( ZipEntry f : derFiles ) {
     285        for ( ZipEntry f : derEntries ) {
    271286            try {
    272287                creds.add(new Credential(z.getInputStream(f)));
     
    292307    }
    293308
     309    protected static Object readPEM(PEMReader r) throws IOException {
     310        Identity i = null;
     311        KeyPair keys = null;
     312        Object o = null;
     313
     314        while ( (o = r.readObject()) != null ) {
     315            if (o instanceof X509CertificateObject) {
     316                if ( i == null ) {
     317                    try {
     318                        i = new Identity((X509CertificateObject)o);
     319                    }
     320                    catch (Exception e) {
     321                        // Translate Idenitiy exceptions to IOException
     322                        throw new IOException(e);
     323                    }
     324                    if (keys != null ) {
     325                        i.setKeyPair(keys);
     326                        keys = null;
     327                    }
     328                }
     329                else throw new IOException("Two certificates");
     330            }
     331            else if (o instanceof KeyPair ) {
     332                if ( i != null ) i.setKeyPair((KeyPair) o);
     333                else keys = (KeyPair) o;
     334            }
     335            else {
     336                throw new IOException("Unexpected PEM object: " +
     337                        o.getClass().getName());
     338            }
     339        }
     340
     341        if ( i != null ) return i;
     342        else if ( keys != null) return keys;
     343        else return null;
     344    }
    294345
    295346    /**
     
    305356        Vector<File> derFiles = new Vector<File>();
    306357        Collection<File> files = new Vector<File>();
     358        Map<String, Identity> ids = new TreeMap<String, Identity>();
     359        Map<String, KeyPair> kps = new TreeMap<String, KeyPair>();
    307360
    308361        if (d.isDirectory() )
     
    312365
    313366        for (File f: files ) {
    314             Object o = null;
    315367            try {
    316                 o = new PEMReader(new FileReader(f)).readObject();
    317             }
    318             catch (IOException e) {
    319                 // PEMReader couldn't deal, so we assume it's a DER
    320                 derFiles.add(f);
    321                 continue;
    322             }
    323             try {
    324                 if ( o == null ) {
    325                     // This shouldn't be, but assume it's a DER
     368                PEMReader r = new PEMReader(new FileReader(f));
     369                Object o = readPEM(r);
     370
     371                if ( o != null ) {
     372                    if (o instanceof Identity) {
     373                        Identity i = (Identity) o;
     374                        String kid = i.getKeyID();
     375
     376                        if (kps.containsKey(kid) ) {
     377                            i.setKeyPair(kps.get(kid));
     378                            kps.remove(kid);
     379                        }
     380                        else if (i.getKeyPair() == null )
     381                            ids.put(i.getKeyID(), i);
     382
     383                        Credential.addIdentity(i);
     384                    }
     385                    else if (o instanceof KeyPair ) {
     386                        KeyPair kp = (KeyPair) o;
     387                        String kid = Identity.extractKeyID(kp.getPublic());
     388
     389                        if (ids.containsKey(kid)) {
     390                            Identity i = ids.get(kid);
     391
     392                            i.setKeyPair(kp);
     393                            ids.remove(kid);
     394                        }
     395                        else {
     396                            kps.put(kid, kp);
     397                        }
     398                    }
     399                }
     400                else {
     401                    // Not a PEM file
    326402                    derFiles.add(f);
    327                 }
    328                 else if (o instanceof X509CertificateObject) {
    329                     Credential.addIdentity(
    330                             new Identity((X509CertificateObject)o));
    331                 }
    332                 else if (o instanceof KeyPair ) {
    333                     if ( keys != null ) keys.add((KeyPair) o);
    334                 }
    335                 else {
    336                     throw new IOException("Unexpected PEM object: " +
    337                             o.getClass().getName());
     403                    continue;
    338404                }
    339405            }
  • java/net/deterlab/abac/CredentialGraph.java

    rf63aa1b r42ca4b8  
    3939
    4040    /**
    41      * Add a role to the graph./
    42      */
    43     public void add_vertex(Role role) {
    44         g.addVertex(role);
    45     }
    46 
    47     /**
    48      * Remove a role from the grpah if it exists.
    49      */
    50     public void remove_vertex(Role role) {
    51         g.removeVertex(role);
    52     }
    53 
    54     /**
    55      * Get a list of all roles known to the graph.
    56      */
    57     public Collection<Role> roles() {
    58         return g.getVertices();
    59     }
    60 
    61     /**
    6241     * Add a credential to the graph.
    6342     */
  • java/net/deterlab/abac/Identity.java

    r3a52bed r42ca4b8  
    2323    private String m_keyid;
    2424    private String m_cn;
     25    private KeyPair kp;
    2526
    2627    /**
     
    2930     */
    3031    protected void init(Reader r) throws
    31         CertificateException, NoSuchAlgorithmException,InvalidKeyException,
    32         NoSuchProviderException, SignatureException, IOException {
    33             PEMReader pr = new PEMReader(r);
    34             Object c = pr.readObject();
    35 
    36             if (c instanceof X509CertificateObject)
    37                 init((X509CertificateObject)c);
     32            CertificateException, NoSuchAlgorithmException,InvalidKeyException,
     33            NoSuchProviderException, SignatureException, IOException {
     34        PEMReader pr = new PEMReader(r);
     35        Object c = null;
     36
     37        while ( ( c= pr.readObject()) != null ){
     38
     39            if (c instanceof X509CertificateObject) {
     40                if ( m_cn == null )
     41                    init((X509CertificateObject)c);
     42                else
     43                    throw new CertificateException("Two certs in one file");
     44            }
     45            else if (c instanceof KeyPair) setKeyPair((KeyPair)c);
    3846            else
    39                 throw new CertificateException("Not an identity certificate");
     47                throw new CertificateException(
     48                        "Not an identity certificate");
     49        }
    4050    }
    4151
     
    6474            CertificateException, NoSuchAlgorithmException,InvalidKeyException,
    6575            NoSuchProviderException, SignatureException, IOException {
    66         KeyPair kp = KeyPairGenerator.getInstance("RSA").genKeyPair();
    6776        X509V1CertificateGenerator gen = new X509V1CertificateGenerator();
     77        kp = KeyPairGenerator.getInstance("RSA").genKeyPair();
    6878
    6979        gen.setIssuerDN(new X500Principal("CN=" + cn));
     
    7585        gen.setPublicKey(kp.getPublic());
    7686        gen.setSignatureAlgorithm("SHA256WithRSAEncryption");
    77         X509CertificateObject a = (X509CertificateObject) gen.generate(kp.getPrivate());
     87        X509CertificateObject a =
     88            (X509CertificateObject) gen.generate(kp.getPrivate());
    7889        init(a);
    7990    }
     
    8798        CertificateException, NoSuchAlgorithmException,InvalidKeyException,
    8899        NoSuchProviderException, SignatureException, FileNotFoundException,
    89         IOException { init(new FileReader(file)); }
     100        IOException {
     101            kp = null;
     102            init(new FileReader(file));
     103        }
    90104
    91105    /**
     
    94108    public Identity(Reader r) throws
    95109        CertificateException, NoSuchAlgorithmException,InvalidKeyException,
    96         NoSuchProviderException, SignatureException, IOException { init(r); }
     110        NoSuchProviderException, SignatureException, IOException {
     111            kp = null;
     112            init(r);
     113        }
    97114
    98115    /**
     
    102119        CertificateException, NoSuchAlgorithmException,InvalidKeyException,
    103120        NoSuchProviderException, SignatureException, IOException {
     121            kp = null;
    104122            init(new InputStreamReader(s));
    105123        }
     
    112130        CertificateException, NoSuchAlgorithmException,InvalidKeyException,
    113131        NoSuchProviderException, SignatureException, FileNotFoundException,
    114         IOException { init(cert); }
     132        IOException {
     133            kp = null;
     134            init(cert);
     135        }
    115136
    116137
     
    174195    public String getKeyID() { return m_keyid; }
    175196    public String getName() { return m_cn; }
    176     public String toString() { return m_keyid + " (" + m_cn + ")"; }
     197    public String toString() {
     198        String s = m_keyid + " (" + m_cn ;
     199
     200        if (m_keyid != null ) s += " [keyed]";
     201        s += ")";
     202        return s;
     203    }
     204    /**
     205     * Associate a keypair with this Identity.  If the ID has a certificate,
     206     * make sure that the keypair matches it.  If not throw an
     207     * IllegalArgumentException.
     208     */
     209    public void setKeyPair(KeyPair k) {
     210        if (m_keyid != null) {
     211            String kid = extractKeyID(k.getPublic());
     212
     213            if ( kid != null && kid.equals(m_keyid)) kp = k;
     214            else
     215                throw new IllegalArgumentException(
     216                        "Keypair does not match certificate");
     217        }
     218        else kp = k;
     219    }
     220    public KeyPair getKeyPair() { return kp; }
    177221    public boolean equals(Object o) {
    178222        if ( o == null ) return false;
Note: See TracChangeset for help on using the changeset viewer.