Index: runtime/bin/secure_socket.cc |
diff --git a/runtime/bin/secure_socket.cc b/runtime/bin/secure_socket.cc |
index d7735afc088b8530fd2a27183164c7fb36512a2f..f63d9d06f5aecd43b712c741f16e1df9113ab6e5 100644 |
--- a/runtime/bin/secure_socket.cc |
+++ b/runtime/bin/secure_socket.cc |
@@ -282,7 +282,9 @@ void FUNCTION_NAME(SecureSocket_FilterPointer)(Dart_NativeArguments args) { |
static Dart_Handle WrappedX509Certificate(X509* certificate) { |
- if (certificate == NULL) return Dart_Null(); |
+ if (certificate == NULL) { |
+ return Dart_Null(); |
+ } |
Dart_Handle x509_type = |
DartUtils::GetDartType(DartUtils::kIOLibURL, "X509Certificate"); |
if (Dart_IsError(x509_type)) { |
@@ -307,7 +309,9 @@ static Dart_Handle WrappedX509Certificate(X509* certificate) { |
int CertificateCallback(int preverify_ok, X509_STORE_CTX* store_ctx) { |
- if (preverify_ok == 1) return 1; |
+ if (preverify_ok == 1) { |
+ return 1; |
+ } |
Dart_Isolate isolate = Dart_CurrentIsolate(); |
if (isolate == NULL) { |
FATAL("CertificateCallback called with no current isolate\n"); |
@@ -319,7 +323,9 @@ int CertificateCallback(int preverify_ok, X509_STORE_CTX* store_ctx) { |
SSLFilter* filter = static_cast<SSLFilter*>( |
SSL_get_ex_data(ssl, SSLFilter::filter_ssl_index)); |
Dart_Handle callback = filter->bad_certificate_callback(); |
- if (Dart_IsNull(callback)) return 0; |
+ if (Dart_IsNull(callback)) { |
+ return 0; |
+ } |
Dart_Handle args[1]; |
args[0] = WrappedX509Certificate(certificate); |
if (Dart_IsError(args[0])) { |
@@ -360,12 +366,12 @@ int PasswordCallback(char* buf, int size, int rwflag, void* userdata) { |
} |
-void CheckStatus(int status, |
- const char* type, |
- const char* message) { |
+void CheckStatus(int status, const char* type, const char* message) { |
// TODO(24183): Take appropriate action on failed calls, |
// throw exception that includes all messages from the error stack. |
- if (status == 1) return; |
+ if (status == 1) { |
+ return; |
+ } |
if (SSL_LOG_STATUS) { |
int error = ERR_get_error(); |
Log::PrintErr("Failed: %s status %d", message, status); |
@@ -556,25 +562,31 @@ static EVP_PKEY* GetPrivateKey(BIO* bio, const char* password) { |
} |
-void FUNCTION_NAME(SecurityContext_UsePrivateKeyBytes)( |
- Dart_NativeArguments args) { |
- SSL_CTX* context = GetSecurityContext(args); |
- |
- Dart_Handle password_object = ThrowIfError(Dart_GetNativeArgument(args, 2)); |
+static const char* GetPasswordArgument(Dart_NativeArguments args, |
+ intptr_t index) { |
+ Dart_Handle password_object = |
+ ThrowIfError(Dart_GetNativeArgument(args, index)); |
const char* password = NULL; |
if (Dart_IsString(password_object)) { |
ThrowIfError(Dart_StringToCString(password_object, &password)); |
if (strlen(password) > PEM_BUFSIZE - 1) { |
Dart_ThrowException(DartUtils::NewDartArgumentError( |
- "SecurityContext.usePrivateKey password length is greater than" |
- " 1023 (PEM_BUFSIZE)")); |
+ "Password length is greater than 1023 (PEM_BUFSIZE)")); |
} |
} else if (Dart_IsNull(password_object)) { |
password = ""; |
} else { |
Dart_ThrowException(DartUtils::NewDartArgumentError( |
- "SecurityContext.usePrivateKey password is not a String or null")); |
+ "Password is not a String or null")); |
} |
+ return password; |
+} |
+ |
+ |
+void FUNCTION_NAME(SecurityContext_UsePrivateKeyBytes)( |
+ Dart_NativeArguments args) { |
+ SSL_CTX* context = GetSecurityContext(args); |
+ const char* password = GetPasswordArgument(args, 2); |
int status; |
{ |
@@ -590,7 +602,9 @@ void FUNCTION_NAME(SecurityContext_UsePrivateKeyBytes)( |
} |
-static int SetTrustedCertificatesBytesPKCS12(SSL_CTX* context, BIO* bio) { |
+static int SetTrustedCertificatesBytesPKCS12(SSL_CTX* context, |
+ BIO* bio, |
+ const char* password) { |
ScopedPKCS12 p12(d2i_PKCS12_bio(bio, NULL)); |
if (p12.get() == NULL) { |
return NULL; |
@@ -599,22 +613,12 @@ static int SetTrustedCertificatesBytesPKCS12(SSL_CTX* context, BIO* bio) { |
EVP_PKEY* key = NULL; |
X509 *cert = NULL; |
STACK_OF(X509) *ca_certs = NULL; |
- // There should be no private keys in this file, so we hardcode the password |
- // to "". |
- // TODO(zra): Allow passing a password anyway. |
- int status = PKCS12_parse(p12.get(), "", &key, &cert, &ca_certs); |
+ int status = PKCS12_parse(p12.get(), password, &key, &cert, &ca_certs); |
if (status == 0) { |
return status; |
} |
ScopedX509Stack cert_stack(ca_certs); |
- |
- // There should be no private key. |
- if (key != NULL) { |
- X509_free(cert); |
- return 0; |
- } |
- |
X509_STORE* store = SSL_CTX_get_cert_store(context); |
status = X509_STORE_add_cert(store, cert); |
if (status == 0) { |
@@ -662,12 +666,14 @@ static int SetTrustedCertificatesBytesPEM(SSL_CTX* context, BIO* bio) { |
} |
-static int SetTrustedCertificatesBytes(SSL_CTX* context, BIO* bio) { |
+static int SetTrustedCertificatesBytes(SSL_CTX* context, |
+ BIO* bio, |
+ const char* password) { |
int status = SetTrustedCertificatesBytesPEM(context, bio); |
if (TryPKCS12(status != 0)) { |
ERR_clear_error(); |
BIO_reset(bio); |
- status = SetTrustedCertificatesBytesPKCS12(context, bio); |
+ status = SetTrustedCertificatesBytesPKCS12(context, bio, password); |
} else if (status != 0) { |
// The PEM file was successfully parsed. |
ERR_clear_error(); |
@@ -679,10 +685,11 @@ static int SetTrustedCertificatesBytes(SSL_CTX* context, BIO* bio) { |
void FUNCTION_NAME(SecurityContext_SetTrustedCertificatesBytes)( |
Dart_NativeArguments args) { |
SSL_CTX* context = GetSecurityContext(args); |
+ const char* password = GetPasswordArgument(args, 2); |
int status; |
{ |
ScopedMemBIO bio(ThrowIfError(Dart_GetNativeArgument(args, 1))); |
- status = SetTrustedCertificatesBytes(context, bio.bio()); |
+ status = SetTrustedCertificatesBytes(context, bio.bio(), password); |
} |
CheckStatus(status, |
"TlsException", |
@@ -708,7 +715,9 @@ void FUNCTION_NAME(SecurityContext_TrustBuiltinRoots)( |
} |
-static int UseChainBytesPKCS12(SSL_CTX* context, BIO* bio) { |
+static int UseChainBytesPKCS12(SSL_CTX* context, |
+ BIO* bio, |
+ const char* password) { |
ScopedPKCS12 p12(d2i_PKCS12_bio(bio, NULL)); |
if (p12.get() == NULL) { |
return NULL; |
@@ -717,22 +726,13 @@ static int UseChainBytesPKCS12(SSL_CTX* context, BIO* bio) { |
EVP_PKEY* key = NULL; |
X509 *cert = NULL; |
STACK_OF(X509) *ca_certs = NULL; |
- // There should be no private keys in this file, so we hardcode the password |
- // to "". |
- // TODO(zra): Allow passing a password anyway. |
- int status = PKCS12_parse(p12.get(), "", &key, &cert, &ca_certs); |
+ int status = PKCS12_parse(p12.get(), password, &key, &cert, &ca_certs); |
if (status == 0) { |
return status; |
} |
ScopedX509 x509(cert); |
ScopedX509Stack certs(ca_certs); |
- |
- // There should be no private key. |
- if (key != NULL) { |
- return 0; |
- } |
- |
status = SSL_CTX_use_certificate(context, x509.get()); |
if (ERR_peek_error() != 0) { |
// Key/certificate mismatch doesn't imply status is 0. |
@@ -801,12 +801,12 @@ static int UseChainBytesPEM(SSL_CTX* context, BIO* bio) { |
} |
-static int UseChainBytes(SSL_CTX* context, BIO* bio) { |
+static int UseChainBytes(SSL_CTX* context, BIO* bio, const char* password) { |
int status = UseChainBytesPEM(context, bio); |
if (TryPKCS12(status != 0)) { |
ERR_clear_error(); |
BIO_reset(bio); |
- status = UseChainBytesPKCS12(context, bio); |
+ status = UseChainBytesPKCS12(context, bio, password); |
} else if (status != 0) { |
// The PEM file was successfully read. |
ERR_clear_error(); |
@@ -818,10 +818,11 @@ static int UseChainBytes(SSL_CTX* context, BIO* bio) { |
void FUNCTION_NAME(SecurityContext_UseCertificateChainBytes)( |
Dart_NativeArguments args) { |
SSL_CTX* context = GetSecurityContext(args); |
+ const char* password = GetPasswordArgument(args, 2); |
int status; |
{ |
ScopedMemBIO bio(ThrowIfError(Dart_GetNativeArgument(args, 1))); |
- status = UseChainBytes(context, bio.bio()); |
+ status = UseChainBytes(context, bio.bio(), password); |
} |
CheckStatus(status, |
"TlsException", |
@@ -829,7 +830,8 @@ void FUNCTION_NAME(SecurityContext_UseCertificateChainBytes)( |
} |
-static STACK_OF(X509_NAME)* GetCertificateNamesPKCS12(BIO* bio) { |
+static STACK_OF(X509_NAME)* GetCertificateNamesPKCS12(BIO* bio, |
+ const char* password) { |
ScopedPKCS12 p12(d2i_PKCS12_bio(bio, NULL)); |
if (p12.get() == NULL) { |
return NULL; |
@@ -843,22 +845,13 @@ static STACK_OF(X509_NAME)* GetCertificateNamesPKCS12(BIO* bio) { |
EVP_PKEY* key = NULL; |
X509 *cert = NULL; |
STACK_OF(X509) *ca_certs = NULL; |
- // There should be no private keys in this file, so we hardcode the password |
- // to "". |
- // TODO(zra): Allow passing a password anyway. |
- int status = PKCS12_parse(p12.get(), "", &key, &cert, &ca_certs); |
+ int status = PKCS12_parse(p12.get(), password, &key, &cert, &ca_certs); |
if (status == 0) { |
return NULL; |
} |
ScopedX509 x509(cert); |
ScopedX509Stack certs(ca_certs); |
- |
- // There should be no private key. |
- if (key != NULL) { |
- return NULL; |
- } |
- |
X509_NAME* x509_name = X509_get_subject_name(x509.get()); |
if (x509_name == NULL) { |
return NULL; |
@@ -935,12 +928,13 @@ static STACK_OF(X509_NAME)* GetCertificateNamesPEM(BIO* bio) { |
} |
-static STACK_OF(X509_NAME)* GetCertificateNames(BIO* bio) { |
+static STACK_OF(X509_NAME)* GetCertificateNames(BIO* bio, |
+ const char* password) { |
STACK_OF(X509_NAME)* result = GetCertificateNamesPEM(bio); |
if (TryPKCS12(result != NULL)) { |
ERR_clear_error(); |
BIO_reset(bio); |
- result = GetCertificateNamesPKCS12(bio); |
+ result = GetCertificateNamesPKCS12(bio, password); |
} else if (result != NULL) { |
// The PEM file was successfully parsed. |
ERR_clear_error(); |
@@ -952,11 +946,12 @@ static STACK_OF(X509_NAME)* GetCertificateNames(BIO* bio) { |
void FUNCTION_NAME(SecurityContext_SetClientAuthoritiesBytes)( |
Dart_NativeArguments args) { |
SSL_CTX* context = GetSecurityContext(args); |
+ const char* password = GetPasswordArgument(args, 2); |
STACK_OF(X509_NAME)* certificate_names; |
{ |
ScopedMemBIO bio(ThrowIfError(Dart_GetNativeArgument(args, 1))); |
- certificate_names = GetCertificateNames(bio.bio()); |
+ certificate_names = GetCertificateNames(bio.bio(), password); |
} |
if (certificate_names != NULL) { |