Add password field for WiFi configuration.

1. the certtool.h is modified for avoiding the side effect,
   for saving the configuration with wpa_supplicant.
2. put the loadLibrary back in CertTool.java
3. Fix incorrect JNI declarations.
diff --git a/cmds/keystore/certtool.h b/cmds/keystore/certtool.h
index 7cd316b..aefad66 100644
--- a/cmds/keystore/certtool.h
+++ b/cmds/keystore/certtool.h
@@ -26,21 +26,29 @@
 #include "common.h"
 #include "netkeystore.h"
 
+#define CERT_NAME_LEN (2 * MAX_KEY_NAME_LENGTH + 2)
+
 /*
  * The specific function 'get_cert' is used in daemons to get the key value
  * from keystore. Caller should allocate the buffer and the length of the buffer
  * should be MAX_KEY_VALUE_LENGTH.
  */
-static inline int get_cert(char *certname, unsigned char *value, int *size)
+static inline int get_cert(const char *certname, unsigned char *value, int *size)
 {
     int count, fd, ret = -1;
     LPC_MARSHAL cmd;
     char delimiter[] = "_";
     char *namespace, *keyname;
     char *context = NULL;
+    char cname[CERT_NAME_LEN];
 
-    if (value == NULL) {
-        LOGE("get_cert: value is null\n");
+    if ((certname == NULL) || (value == NULL)) {
+        LOGE("get_cert: certname or value is null\n");
+        return -1;
+    }
+
+    if (strlcpy(cname, certname, CERT_NAME_LEN) >= CERT_NAME_LEN) {
+        LOGE("get_cert: keyname is too long\n");
         return -1;
     }
 
@@ -53,7 +61,7 @@
     }
 
     cmd.opcode = GET;
-    if (((namespace = strtok_r(certname, delimiter, &context)) == NULL) ||
+    if (((namespace = strtok_r(cname, delimiter, &context)) == NULL) ||
         ((keyname = strtok_r(NULL, delimiter, &context)) == NULL)) {
         goto err;
     }
diff --git a/keystore/java/android/security/CertTool.java b/keystore/java/android/security/CertTool.java
index 5319330..26d22ae 100644
--- a/keystore/java/android/security/CertTool.java
+++ b/keystore/java/android/security/CertTool.java
@@ -30,6 +30,10 @@
  * {@hide}
  */
 public class CertTool {
+    static {
+        System.loadLibrary("certtool_jni");
+    }
+
     public static final String ACTION_ADD_CREDENTIAL =
             "android.security.ADD_CREDENTIAL";
     public static final String KEY_TYPE_NAME = "typeName";
@@ -52,7 +56,7 @@
     private static final String USER_KEY = "USRKEY";
 
     private static final String KEYNAME_DELIMITER = "_";
-    private static final Keystore keystore = Keystore.getInstance();
+    private static final Keystore sKeystore = Keystore.getInstance();
 
     private native String generateCertificateRequest(int bits, String subject);
     private native boolean isPkcs12Keystore(byte[] data);
@@ -65,6 +69,8 @@
 
     private static CertTool singleton = null;
 
+    private CertTool() { }
+
     public static final CertTool getInstance() {
         if (singleton == null) {
             singleton = new CertTool();
@@ -85,11 +91,11 @@
     }
 
     public String[] getAllUserCertificateKeys() {
-        return keystore.listKeys(USER_KEY);
+        return sKeystore.listKeys(USER_KEY);
     }
 
     public String[] getAllCaCertificateKeys() {
-        return keystore.listKeys(CA_CERTIFICATE);
+        return sKeystore.listKeys(CA_CERTIFICATE);
     }
 
     public String[] getSupportedKeyStrenghs() {
diff --git a/keystore/jni/certtool.c b/keystore/jni/certtool.c
index c2a137e..fabf5cd 100644
--- a/keystore/jni/certtool.c
+++ b/keystore/jni/certtool.c
@@ -115,9 +115,9 @@
     /* name, signature, funcPtr */
     {"generateCertificateRequest", "(ILjava/lang/String;)Ljava/lang/String;",
         (void*)android_security_CertTool_generateCertificateRequest},
-    {"isPkcs12Keystore", "(B[)I",
+    {"isPkcs12Keystore", "([B)Z",
         (void*)android_security_CertTool_isPkcs12Keystore},
-    {"generateX509Certificate", "(B[)I",
+    {"generateX509Certificate", "([B)I",
         (void*)android_security_CertTool_generateX509Certificate},
     {"isCaCertificate", "(I)Z",
         (void*)android_security_CertTool_isCaCertificate},
diff --git a/services/java/com/android/server/WifiService.java b/services/java/com/android/server/WifiService.java
index beadc5f..e2aee42 100644
--- a/services/java/com/android/server/WifiService.java
+++ b/services/java/com/android/server/WifiService.java
@@ -1095,6 +1095,17 @@
                 break setVariables;
             }
 
+            if ((config.password != null) && !WifiNative.setNetworkVariableCommand(
+                    netId,
+                    WifiConfiguration.passwordVarName,
+                    config.password)) {
+                if (DBG) {
+                    Log.d(TAG, config.SSID + ": failed to set password: "+
+                          config.password);
+                }
+                break setVariables;
+            }
+
             if ((config.clientCert != null) && !WifiNative.setNetworkVariableCommand(
                     netId,
                     WifiConfiguration.clientCertVarName,
diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java
index 1b7c0cd..eda2f2d 100644
--- a/wifi/java/android/net/wifi/WifiConfiguration.java
+++ b/wifi/java/android/net/wifi/WifiConfiguration.java
@@ -49,6 +49,8 @@
     /** {@hide} */
     public static final String anonymousIdentityVarName = "anonymous_identity";
     /** {@hide} */
+    public static final String passwordVarName = "password";
+    /** {@hide} */
     public static final String clientCertVarName = "client_cert";
     /** {@hide} */
     public static final String caCertVarName = "ca_cert";
@@ -278,6 +280,8 @@
     public String identity;
     /** {@hide} */
     public String anonymousIdentity;
+    /** {@hide} */
+    public String password;
     /** The path of the client certificate file.
      * {@hide}
      */
@@ -312,6 +316,7 @@
         eap = null;
         identity = null;
         anonymousIdentity = null;
+        password = null;
         clientCert = null;
         caCert = null;
         privateKey = null;
@@ -402,6 +407,10 @@
         if (this.anonymousIdentity != null) {
             sbuf.append(anonymousIdentity);
         }
+        sbuf.append('\n').append(" Password: ");
+        if (this.password != null) {
+            sbuf.append(password);
+        }
         sbuf.append('\n').append(" ClientCert: ");
         if (this.clientCert != null) {
             sbuf.append(clientCert);
@@ -479,6 +488,7 @@
         dest.writeString(eap);
         dest.writeString(identity);
         dest.writeString(anonymousIdentity);
+        dest.writeString(password);
         dest.writeString(clientCert);
         dest.writeString(caCert);
         dest.writeString(privateKey);
@@ -508,6 +518,7 @@
                 config.eap = in.readString();
                 config.identity = in.readString();
                 config.anonymousIdentity = in.readString();
+                config.password = in.readString();
                 config.clientCert = in.readString();
                 config.caCert = in.readString();
                 config.privateKey = in.readString();