OSDN Git Service

2006-08-14 Mark Wielaard <mark@klomp.org>
[pf3gnuchains/gcc-fork.git] / libjava / classpath / gnu / javax / crypto / jce / keyring / GnuKeyring.java
index d2501f8..4fcf2fd 100644 (file)
@@ -38,6 +38,7 @@ exception statement from your version.  */
 
 package gnu.javax.crypto.jce.keyring;
 
+import gnu.java.security.Configuration;
 import gnu.java.security.Registry;
 import gnu.javax.crypto.keyring.GnuPrivateKeyring;
 import gnu.javax.crypto.keyring.GnuPublicKeyring;
@@ -90,79 +91,100 @@ public class GnuKeyring
 
   public Enumeration engineAliases()
   {
+    if (Configuration.DEBUG)
+      log.entering(this.getClass().getName(), "engineAliases");
     ensureLoaded();
     Enumeration result;
     if (privateKR == null)
       result = Collections.enumeration(Collections.EMPTY_SET);
-      else
-        {
-          Set aliases = new HashSet();
-          for (Enumeration e = privateKR.aliases(); e.hasMoreElements();)
-            {
-              String alias = (String) e.nextElement();
-              if (alias != null)
-                aliases.add(alias);
-            }
-
-          for (Enumeration e = publicKR.aliases(); e.hasMoreElements();)
-            {
-              String alias = (String) e.nextElement();
-              if (alias != null)
-                aliases.add(alias);
-            }
-
-          result = Collections.enumeration(aliases);
-        }
-
+    else
+      {
+        Set aliases = new HashSet();
+        for (Enumeration e = privateKR.aliases(); e.hasMoreElements();)
+          {
+            String alias = (String) e.nextElement();
+            if (alias != null)
+              {
+                alias = alias.trim();
+                if (alias.length() > 0)
+                  {
+                    if (Configuration.DEBUG)
+                      log.fine("Adding alias (from private keyring): " + alias);
+                    aliases.add(alias);
+                  }
+              }
+          }
+        for (Enumeration e = publicKR.aliases(); e.hasMoreElements();)
+          {
+            String alias = (String) e.nextElement();
+            if (alias != null)
+              {
+                alias = alias.trim();
+                if (alias.length() > 0)
+                  {
+                    if (Configuration.DEBUG)
+                      log.fine("Adding alias (from public keyring): " + alias);
+                    aliases.add(alias);
+                  }
+              }
+          }
+        if (Configuration.DEBUG)
+          log.fine("Will enumerate: " + aliases);
+        result = Collections.enumeration(aliases);
+      }
+    if (Configuration.DEBUG)
+      log.exiting(this.getClass().getName(), "engineAliases");
     return result;
   }
 
   public boolean engineContainsAlias(String alias)
   {
-    log.entering(this.getClass().getName(), "engineContainsAlias", alias);
-
+    if (Configuration.DEBUG)
+      log.entering(this.getClass().getName(), "engineContainsAlias", alias);
     ensureLoaded();
     boolean inPrivateKR = privateKR.containsAlias(alias);
-    log.finest("inPrivateKR=" + inPrivateKR);
+    if (Configuration.DEBUG)
+      log.fine("inPrivateKR=" + inPrivateKR);
     boolean inPublicKR = publicKR.containsAlias(alias);
-    log.finest("inPublicKR=" + inPublicKR);
+    if (Configuration.DEBUG)
+      log.fine("inPublicKR=" + inPublicKR);
     boolean result = inPrivateKR || inPublicKR;
-
-    log.exiting(this.getClass().getName(), "engineContainsAlias",
-                Boolean.valueOf(result));
+    if (Configuration.DEBUG)
+      log.exiting(this.getClass().getName(), "engineContainsAlias",
+                  Boolean.valueOf(result));
     return result;
   }
 
   public void engineDeleteEntry(String alias)
   {
-    log.entering(this.getClass().getName(), "engineDeleteEntry", alias);
-
+    if (Configuration.DEBUG)
+      log.entering(this.getClass().getName(), "engineDeleteEntry", alias);
     ensureLoaded();
     if (privateKR.containsAlias(alias))
       privateKR.remove(alias);
     else if (publicKR.containsAlias(alias))
       publicKR.remove(alias);
-    else
-      log.finer("Unknwon alias: " + alias);
-
-    log.exiting(this.getClass().getName(), "engineDeleteEntry");
+    else if (Configuration.DEBUG)
+      log.fine("Unknwon alias: " + alias);
+    if (Configuration.DEBUG)
+      log.exiting(this.getClass().getName(), "engineDeleteEntry");
   }
 
   public Certificate engineGetCertificate(String alias)
   {
-    log.entering(this.getClass().getName(), "engineGetCertificate", alias);
-
+    if (Configuration.DEBUG)
+      log.entering(this.getClass().getName(), "engineGetCertificate", alias);
     ensureLoaded();
     Certificate result = publicKR.getCertificate(alias);
-
-    log.exiting(this.getClass().getName(), "engineGetCertificate", result);
+    if (Configuration.DEBUG)
+      log.exiting(this.getClass().getName(), "engineGetCertificate", result);
     return result;
   }
 
   public String engineGetCertificateAlias(Certificate cert)
   {
-    log.entering(this.getClass().getName(), "engineGetCertificateAlias", cert);
-
+    if (Configuration.DEBUG)
+      log.entering(this.getClass().getName(), "engineGetCertificateAlias", cert);
     ensureLoaded();
     String result = null;
     for (Enumeration aliases = publicKR.aliases(); aliases.hasMoreElements();)
@@ -175,52 +197,64 @@ public class GnuKeyring
             break;
           }
       }
-
-    log.exiting(this.getClass().getName(), "engineGetCertificateAlias", result);
+    if (Configuration.DEBUG)
+      log.exiting(this.getClass().getName(), "engineGetCertificateAlias", result);
     return result;
   }
 
   public void engineSetCertificateEntry(String alias, Certificate cert)
+      throws KeyStoreException
   {
-    log.entering(this.getClass().getName(), "engineSetCertificateEntry",
-                 new Object[] { alias, cert });
-
+    if (Configuration.DEBUG)
+      log.entering(this.getClass().getName(), "engineSetCertificateEntry",
+                   new Object[] { alias, cert });
     ensureLoaded();
+    if (privateKR.containsAlias(alias))
+      throw new KeyStoreException("Alias [" + alias
+                                  + "] already exists and DOES NOT identify a "
+                                  + "Trusted Certificate Entry");
+    if (publicKR.containsCertificate(alias))
+      {
+        if (Configuration.DEBUG)
+          log.fine("Public keyring already contains Alias [" + alias
+                   + "]. Will remove it");
+        publicKR.remove(alias);
+      }
     publicKR.putCertificate(alias, cert);
-
-    log.exiting(this.getClass().getName(), "engineSetCertificateEntry");
+    if (Configuration.DEBUG)
+      log.exiting(this.getClass().getName(), "engineSetCertificateEntry");
   }
 
   public Certificate[] engineGetCertificateChain(String alias)
   {
-    log.entering(this.getClass().getName(), "engineGetCertificateChain", alias);
-
+    if (Configuration.DEBUG)
+      log.entering(this.getClass().getName(), "engineGetCertificateChain", alias);
     ensureLoaded();
     Certificate[] result = privateKR.getCertPath(alias);
-
-    log.exiting(this.getClass().getName(), "engineGetCertificateChain", result);
+    if (Configuration.DEBUG)
+      log.exiting(this.getClass().getName(), "engineGetCertificateChain", result);
     return result;
   }
 
   public Date engineGetCreationDate(String alias)
   {
-    log.entering(this.getClass().getName(), "engineGetCreationDate", alias);
-
+    if (Configuration.DEBUG)
+      log.entering(this.getClass().getName(), "engineGetCreationDate", alias);
     ensureLoaded();
     Date result = getCreationDate(alias, privateKR);
     if (result == null)
       result = getCreationDate(alias, publicKR);
 
-    log.exiting(this.getClass().getName(), "engineGetCreationDate", result);
+    if (Configuration.DEBUG)
+      log.exiting(this.getClass().getName(), "engineGetCreationDate", result);
     return result;
   }
 
   public Key engineGetKey(String alias, char[] password)
       throws UnrecoverableKeyException
   {
-    log.entering(this.getClass().getName(), "engineGetKey",
-                 String.valueOf(password));
-
+    if (Configuration.DEBUG)
+      log.entering(this.getClass().getName(), "engineGetKey", alias);
     ensureLoaded();
     Key result = null;
     if (password == null)
@@ -231,7 +265,9 @@ public class GnuKeyring
     else if (privateKR.containsPrivateKey(alias))
       result = privateKR.getPrivateKey(alias, password); 
 
-    log.exiting(this.getClass().getName(), "engineGetKey", result);
+    if (Configuration.DEBUG)
+      log.exiting(this.getClass().getName(), "engineGetKey",
+                  result == null ? "null" : result.getClass().getName());
     return result;
   }
 
@@ -239,60 +275,73 @@ public class GnuKeyring
                                 Certificate[] chain)
       throws KeyStoreException
   {
-    log.entering(this.getClass().getName(), "engineSetKeyEntry",
-                 new Object[] { alias, key, password, chain });
+    if (Configuration.DEBUG)
+      log.entering(this.getClass().getName(), "engineSetKeyEntry",
+                   new Object[] { alias, key.getClass().getName(), chain });
     ensureLoaded();
+    if (publicKR.containsAlias(alias))
+      throw new KeyStoreException("Alias [" + alias
+                                  + "] already exists and DOES NOT identify a "
+                                  + "Key Entry");
     if (key instanceof PublicKey)
-      privateKR.putPublicKey(alias, (PublicKey) key);
+      {
+        privateKR.remove(alias);
+        PublicKey pk = (PublicKey) key;
+        privateKR.putPublicKey(alias, pk);
+      }
     else
       {
         if (! (key instanceof PrivateKey) && ! (key instanceof SecretKey))
           throw new KeyStoreException("cannot store keys of type "
                                       + key.getClass().getName());
+        privateKR.remove(alias);
         privateKR.putCertPath(alias, chain);
-        log.finest("About to put private key in keyring...");
+        if (Configuration.DEBUG)
+          log.fine("About to put private key in keyring...");
         privateKR.putPrivateKey(alias, key, password);
       }
-
-    log.exiting(this.getClass().getName(), "engineSetKeyEntry");
+    if (Configuration.DEBUG)
+      log.exiting(this.getClass().getName(), "engineSetKeyEntry");
   }
 
   public void engineSetKeyEntry(String alias, byte[] key, Certificate[] chain)
       throws KeyStoreException
   {
     KeyStoreException x = new KeyStoreException("method not supported");
-    log.throwing(this.getClass().getName(), "engineSetKeyEntry(3)", x);
+    if (Configuration.DEBUG)
+      log.throwing(this.getClass().getName(), "engineSetKeyEntry(3)", x);
     throw x;
   }
 
   public boolean engineIsCertificateEntry(String alias)
   {
-    log.entering(this.getClass().getName(), "engineIsCertificateEntry", alias);
-
+    if (Configuration.DEBUG)
+      log.entering(this.getClass().getName(), "engineIsCertificateEntry", alias);
     ensureLoaded();
     boolean result = publicKR.containsCertificate(alias);
-
-    log.exiting(this.getClass().getName(), "engineIsCertificateEntry",
-                Boolean.valueOf(result));
+    if (Configuration.DEBUG)
+      log.exiting(this.getClass().getName(), "engineIsCertificateEntry",
+                  Boolean.valueOf(result));
     return result;
   }
 
   public boolean engineIsKeyEntry(String alias)
   {
-    log.entering(this.getClass().getName(), "engineIsKeyEntry", alias);
-
+    if (Configuration.DEBUG)
+      log.entering(this.getClass().getName(), "engineIsKeyEntry", alias);
     ensureLoaded();
     boolean result = privateKR.containsPublicKey(alias)
                   || privateKR.containsPrivateKey(alias);
-
-    log.exiting(this.getClass().getName(), "engineIsKeyEntry",
-                Boolean.valueOf(result));
+    if (Configuration.DEBUG)
+      log.exiting(this.getClass().getName(), "engineIsKeyEntry",
+                  Boolean.valueOf(result));
     return result;
   }
 
   public void engineLoad(InputStream in, char[] password) throws IOException
   {
-    log.entering(this.getClass().getName(), "engineLoad", String.valueOf(password));
+    if (Configuration.DEBUG)
+      log.entering(this.getClass().getName(), "engineLoad");
     if (in != null)
       {
         if (! in.markSupported())
@@ -305,14 +354,14 @@ public class GnuKeyring
       createNewKeyrings();
 
     loaded = true;
-
-    log.exiting(this.getClass().getName(), "engineLoad");
+    if (Configuration.DEBUG)
+      log.exiting(this.getClass().getName(), "engineLoad");
   }
 
   public void engineStore(OutputStream out, char[] password) throws IOException
   {
-    log.entering(this.getClass().getName(), "engineStore", String.valueOf(password));
-
+    if (Configuration.DEBUG)
+      log.entering(this.getClass().getName(), "engineStore");
     ensureLoaded();
     HashMap attr = new HashMap();
     attr.put(IKeyring.KEYRING_DATA_OUT, out);
@@ -320,14 +369,21 @@ public class GnuKeyring
 
     privateKR.store(attr);
     publicKR.store(attr);
-
-    log.exiting(this.getClass().getName(), "engineStore");
+    if (Configuration.DEBUG)
+      log.exiting(this.getClass().getName(), "engineStore");
   }
 
   public int engineSize()
   {
-    ensureLoaded();
-    return privateKR.size() + publicKR.size();
+    if (Configuration.DEBUG)
+      log.entering(this.getClass().getName(), "engineSize");
+    int result = 0;
+    for (Enumeration e = engineAliases(); e.hasMoreElements(); result++)
+      e.nextElement();
+
+    if (Configuration.DEBUG)
+      log.exiting(this.getClass().getName(), "engineSize", Integer.valueOf(result));
+    return result;
   }
 
   /**
@@ -353,8 +409,8 @@ public class GnuKeyring
   private void loadPrivateKeyring(InputStream in, char[] password)
       throws MalformedKeyringException, IOException
   {
-    log.entering(this.getClass().getName(), "loadPrivateKeyring");
-
+    if (Configuration.DEBUG)
+      log.entering(this.getClass().getName(), "loadPrivateKeyring");
     in.mark(5);
     for (int i = 0; i < 4; i++)
       if (in.read() != Registry.GKR_MAGIC[i])
@@ -363,15 +419,16 @@ public class GnuKeyring
     int usage = in.read();
     in.reset();
     if (usage != GnuPrivateKeyring.USAGE)
-      throw new MalformedKeyringException("Was expecting a private keyring but got a wrong USAGE: "
-                                          + Integer.toBinaryString(usage));
+      throw new MalformedKeyringException(
+          "Was expecting a private keyring but got a wrong USAGE: "
+          + Integer.toBinaryString(usage));
     HashMap attr = new HashMap();
     attr.put(IKeyring.KEYRING_DATA_IN, in);
     attr.put(IKeyring.KEYRING_PASSWORD, password);
     privateKR = new GnuPrivateKeyring();
     privateKR.load(attr);
-
-    log.exiting(this.getClass().getName(), "loadPrivateKeyring");
+    if (Configuration.DEBUG)
+      log.exiting(this.getClass().getName(), "loadPrivateKeyring");
   }
 
   /**
@@ -385,8 +442,8 @@ public class GnuKeyring
   private void loadPublicKeyring(InputStream in, char[] password)
       throws MalformedKeyringException, IOException
   {
-    log.entering(this.getClass().getName(), "loadPublicKeyring");
-
+    if (Configuration.DEBUG)
+      log.entering(this.getClass().getName(), "loadPublicKeyring");
     in.mark(5);
     for (int i = 0; i < 4; i++)
       if (in.read() != Registry.GKR_MAGIC[i])
@@ -395,15 +452,16 @@ public class GnuKeyring
     int usage = in.read();
     in.reset();
     if (usage != GnuPublicKeyring.USAGE)
-      throw new MalformedKeyringException("Was expecting a public keyring but got a wrong USAGE: "
-                                          + Integer.toBinaryString(usage));
+      throw new MalformedKeyringException(
+          "Was expecting a public keyring but got a wrong USAGE: "
+          + Integer.toBinaryString(usage));
     HashMap attr = new HashMap();
     attr.put(IKeyring.KEYRING_DATA_IN, in);
     attr.put(IKeyring.KEYRING_PASSWORD, password);
     publicKR = new GnuPublicKeyring();
     publicKR.load(attr);
-
-    log.exiting(this.getClass().getName(), "loadPublicKeyring");
+    if (Configuration.DEBUG)
+      log.exiting(this.getClass().getName(), "loadPublicKeyring");
   }
 
   /**
@@ -417,9 +475,9 @@ public class GnuKeyring
    */
   private Date getCreationDate(String alias, IKeyring keyring)
   {
-    log.entering(this.getClass().getName(), "getCreationDate",
-                 new Object[] { alias, keyring });
-
+    if (Configuration.DEBUG)
+      log.entering(this.getClass().getName(), "getCreationDate",
+                   new Object[] { alias, keyring });
     Date result = null;
     if (keyring != null)
       for (Iterator it = keyring.get(alias).iterator(); it.hasNext();)
@@ -431,19 +489,19 @@ public class GnuKeyring
               break;
             }
         }
-
-    log.exiting(this.getClass().getName(), "getCreationDate", result);
+    if (Configuration.DEBUG)
+      log.exiting(this.getClass().getName(), "getCreationDate", result);
     return result;
   }
 
   /** Create empty keyrings. */
   private void createNewKeyrings()
   {
-    log.entering(this.getClass().getName(), "createNewKeyrings");
-
+    if (Configuration.DEBUG)
+      log.entering(this.getClass().getName(), "createNewKeyrings");
     privateKR = new GnuPrivateKeyring("HMAC-SHA-1", 20, "AES", "OFB", 16);
     publicKR = new GnuPublicKeyring("HMAC-SHA-1", 20);
-
-    log.exiting(this.getClass().getName(), "createNewKeyrings");
+    if (Configuration.DEBUG)
+      log.exiting(this.getClass().getName(), "createNewKeyrings");
   }
 }