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.
This commit is contained in:
@@ -26,21 +26,29 @@
|
|||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "netkeystore.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
|
* 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
|
* from keystore. Caller should allocate the buffer and the length of the buffer
|
||||||
* should be MAX_KEY_VALUE_LENGTH.
|
* 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;
|
int count, fd, ret = -1;
|
||||||
LPC_MARSHAL cmd;
|
LPC_MARSHAL cmd;
|
||||||
char delimiter[] = "_";
|
char delimiter[] = "_";
|
||||||
char *namespace, *keyname;
|
char *namespace, *keyname;
|
||||||
char *context = NULL;
|
char *context = NULL;
|
||||||
|
char cname[CERT_NAME_LEN];
|
||||||
|
|
||||||
if (value == NULL) {
|
if ((certname == NULL) || (value == NULL)) {
|
||||||
LOGE("get_cert: value is null\n");
|
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;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -53,7 +61,7 @@ static inline int get_cert(char *certname, unsigned char *value, int *size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
cmd.opcode = GET;
|
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)) {
|
((keyname = strtok_r(NULL, delimiter, &context)) == NULL)) {
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,10 @@ import android.text.TextUtils;
|
|||||||
* {@hide}
|
* {@hide}
|
||||||
*/
|
*/
|
||||||
public class CertTool {
|
public class CertTool {
|
||||||
|
static {
|
||||||
|
System.loadLibrary("certtool_jni");
|
||||||
|
}
|
||||||
|
|
||||||
public static final String ACTION_ADD_CREDENTIAL =
|
public static final String ACTION_ADD_CREDENTIAL =
|
||||||
"android.security.ADD_CREDENTIAL";
|
"android.security.ADD_CREDENTIAL";
|
||||||
public static final String KEY_TYPE_NAME = "typeName";
|
public static final String KEY_TYPE_NAME = "typeName";
|
||||||
@@ -52,7 +56,7 @@ public class CertTool {
|
|||||||
private static final String USER_KEY = "USRKEY";
|
private static final String USER_KEY = "USRKEY";
|
||||||
|
|
||||||
private static final String KEYNAME_DELIMITER = "_";
|
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 String generateCertificateRequest(int bits, String subject);
|
||||||
private native boolean isPkcs12Keystore(byte[] data);
|
private native boolean isPkcs12Keystore(byte[] data);
|
||||||
@@ -65,6 +69,8 @@ public class CertTool {
|
|||||||
|
|
||||||
private static CertTool singleton = null;
|
private static CertTool singleton = null;
|
||||||
|
|
||||||
|
private CertTool() { }
|
||||||
|
|
||||||
public static final CertTool getInstance() {
|
public static final CertTool getInstance() {
|
||||||
if (singleton == null) {
|
if (singleton == null) {
|
||||||
singleton = new CertTool();
|
singleton = new CertTool();
|
||||||
@@ -85,11 +91,11 @@ public class CertTool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String[] getAllUserCertificateKeys() {
|
public String[] getAllUserCertificateKeys() {
|
||||||
return keystore.listKeys(USER_KEY);
|
return sKeystore.listKeys(USER_KEY);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String[] getAllCaCertificateKeys() {
|
public String[] getAllCaCertificateKeys() {
|
||||||
return keystore.listKeys(CA_CERTIFICATE);
|
return sKeystore.listKeys(CA_CERTIFICATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String[] getSupportedKeyStrenghs() {
|
public String[] getSupportedKeyStrenghs() {
|
||||||
|
|||||||
@@ -115,9 +115,9 @@ static JNINativeMethod gCertToolMethods[] = {
|
|||||||
/* name, signature, funcPtr */
|
/* name, signature, funcPtr */
|
||||||
{"generateCertificateRequest", "(ILjava/lang/String;)Ljava/lang/String;",
|
{"generateCertificateRequest", "(ILjava/lang/String;)Ljava/lang/String;",
|
||||||
(void*)android_security_CertTool_generateCertificateRequest},
|
(void*)android_security_CertTool_generateCertificateRequest},
|
||||||
{"isPkcs12Keystore", "(B[)I",
|
{"isPkcs12Keystore", "([B)Z",
|
||||||
(void*)android_security_CertTool_isPkcs12Keystore},
|
(void*)android_security_CertTool_isPkcs12Keystore},
|
||||||
{"generateX509Certificate", "(B[)I",
|
{"generateX509Certificate", "([B)I",
|
||||||
(void*)android_security_CertTool_generateX509Certificate},
|
(void*)android_security_CertTool_generateX509Certificate},
|
||||||
{"isCaCertificate", "(I)Z",
|
{"isCaCertificate", "(I)Z",
|
||||||
(void*)android_security_CertTool_isCaCertificate},
|
(void*)android_security_CertTool_isCaCertificate},
|
||||||
|
|||||||
@@ -1095,6 +1095,17 @@ public class WifiService extends IWifiManager.Stub {
|
|||||||
break setVariables;
|
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(
|
if ((config.clientCert != null) && !WifiNative.setNetworkVariableCommand(
|
||||||
netId,
|
netId,
|
||||||
WifiConfiguration.clientCertVarName,
|
WifiConfiguration.clientCertVarName,
|
||||||
|
|||||||
@@ -49,6 +49,8 @@ public class WifiConfiguration implements Parcelable {
|
|||||||
/** {@hide} */
|
/** {@hide} */
|
||||||
public static final String anonymousIdentityVarName = "anonymous_identity";
|
public static final String anonymousIdentityVarName = "anonymous_identity";
|
||||||
/** {@hide} */
|
/** {@hide} */
|
||||||
|
public static final String passwordVarName = "password";
|
||||||
|
/** {@hide} */
|
||||||
public static final String clientCertVarName = "client_cert";
|
public static final String clientCertVarName = "client_cert";
|
||||||
/** {@hide} */
|
/** {@hide} */
|
||||||
public static final String caCertVarName = "ca_cert";
|
public static final String caCertVarName = "ca_cert";
|
||||||
@@ -278,6 +280,8 @@ public class WifiConfiguration implements Parcelable {
|
|||||||
public String identity;
|
public String identity;
|
||||||
/** {@hide} */
|
/** {@hide} */
|
||||||
public String anonymousIdentity;
|
public String anonymousIdentity;
|
||||||
|
/** {@hide} */
|
||||||
|
public String password;
|
||||||
/** The path of the client certificate file.
|
/** The path of the client certificate file.
|
||||||
* {@hide}
|
* {@hide}
|
||||||
*/
|
*/
|
||||||
@@ -312,6 +316,7 @@ public class WifiConfiguration implements Parcelable {
|
|||||||
eap = null;
|
eap = null;
|
||||||
identity = null;
|
identity = null;
|
||||||
anonymousIdentity = null;
|
anonymousIdentity = null;
|
||||||
|
password = null;
|
||||||
clientCert = null;
|
clientCert = null;
|
||||||
caCert = null;
|
caCert = null;
|
||||||
privateKey = null;
|
privateKey = null;
|
||||||
@@ -402,6 +407,10 @@ public class WifiConfiguration implements Parcelable {
|
|||||||
if (this.anonymousIdentity != null) {
|
if (this.anonymousIdentity != null) {
|
||||||
sbuf.append(anonymousIdentity);
|
sbuf.append(anonymousIdentity);
|
||||||
}
|
}
|
||||||
|
sbuf.append('\n').append(" Password: ");
|
||||||
|
if (this.password != null) {
|
||||||
|
sbuf.append(password);
|
||||||
|
}
|
||||||
sbuf.append('\n').append(" ClientCert: ");
|
sbuf.append('\n').append(" ClientCert: ");
|
||||||
if (this.clientCert != null) {
|
if (this.clientCert != null) {
|
||||||
sbuf.append(clientCert);
|
sbuf.append(clientCert);
|
||||||
@@ -479,6 +488,7 @@ public class WifiConfiguration implements Parcelable {
|
|||||||
dest.writeString(eap);
|
dest.writeString(eap);
|
||||||
dest.writeString(identity);
|
dest.writeString(identity);
|
||||||
dest.writeString(anonymousIdentity);
|
dest.writeString(anonymousIdentity);
|
||||||
|
dest.writeString(password);
|
||||||
dest.writeString(clientCert);
|
dest.writeString(clientCert);
|
||||||
dest.writeString(caCert);
|
dest.writeString(caCert);
|
||||||
dest.writeString(privateKey);
|
dest.writeString(privateKey);
|
||||||
@@ -508,6 +518,7 @@ public class WifiConfiguration implements Parcelable {
|
|||||||
config.eap = in.readString();
|
config.eap = in.readString();
|
||||||
config.identity = in.readString();
|
config.identity = in.readString();
|
||||||
config.anonymousIdentity = in.readString();
|
config.anonymousIdentity = in.readString();
|
||||||
|
config.password = in.readString();
|
||||||
config.clientCert = in.readString();
|
config.clientCert = in.readString();
|
||||||
config.caCert = in.readString();
|
config.caCert = in.readString();
|
||||||
config.privateKey = in.readString();
|
config.privateKey = in.readString();
|
||||||
|
|||||||
Reference in New Issue
Block a user