| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "bin/secure_socket.h" | 5 #include "bin/secure_socket.h" |
| 6 | 6 |
| 7 #include <errno.h> | 7 #include <errno.h> |
| 8 #include <fcntl.h> | 8 #include <fcntl.h> |
| 9 #include <sys/stat.h> | 9 #include <sys/stat.h> |
| 10 #include <stdio.h> | 10 #include <stdio.h> |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 99 Dart_Handle dart_this = ThrowIfError(Dart_GetNativeArgument(args, 0)); | 99 Dart_Handle dart_this = ThrowIfError(Dart_GetNativeArgument(args, 0)); |
| 100 ASSERT(Dart_IsInstance(dart_this)); | 100 ASSERT(Dart_IsInstance(dart_this)); |
| 101 ThrowIfError(Dart_SetNativeInstanceField( | 101 ThrowIfError(Dart_SetNativeInstanceField( |
| 102 dart_this, | 102 dart_this, |
| 103 kSSLFilterNativeFieldIndex, | 103 kSSLFilterNativeFieldIndex, |
| 104 reinterpret_cast<intptr_t>(filter))); | 104 reinterpret_cast<intptr_t>(filter))); |
| 105 } | 105 } |
| 106 | 106 |
| 107 | 107 |
| 108 void FUNCTION_NAME(SecureSocket_Init)(Dart_NativeArguments args) { | 108 void FUNCTION_NAME(SecureSocket_Init)(Dart_NativeArguments args) { |
| 109 Dart_EnterScope(); | |
| 110 Dart_Handle dart_this = ThrowIfError(Dart_GetNativeArgument(args, 0)); | 109 Dart_Handle dart_this = ThrowIfError(Dart_GetNativeArgument(args, 0)); |
| 111 SSLFilter* filter = new SSLFilter; | 110 SSLFilter* filter = new SSLFilter; |
| 112 SetFilter(args, filter); | 111 SetFilter(args, filter); |
| 113 filter->Init(dart_this); | 112 filter->Init(dart_this); |
| 114 Dart_ExitScope(); | |
| 115 } | 113 } |
| 116 | 114 |
| 117 | 115 |
| 118 void FUNCTION_NAME(SecureSocket_Connect)(Dart_NativeArguments args) { | 116 void FUNCTION_NAME(SecureSocket_Connect)(Dart_NativeArguments args) { |
| 119 Dart_EnterScope(); | |
| 120 Dart_Handle host_name_object = ThrowIfError(Dart_GetNativeArgument(args, 1)); | 117 Dart_Handle host_name_object = ThrowIfError(Dart_GetNativeArgument(args, 1)); |
| 121 Dart_Handle host_sockaddr_storage_object = | 118 Dart_Handle host_sockaddr_storage_object = |
| 122 ThrowIfError(Dart_GetNativeArgument(args, 2)); | 119 ThrowIfError(Dart_GetNativeArgument(args, 2)); |
| 123 Dart_Handle port_object = ThrowIfError(Dart_GetNativeArgument(args, 3)); | 120 Dart_Handle port_object = ThrowIfError(Dart_GetNativeArgument(args, 3)); |
| 124 bool is_server = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 4)); | 121 bool is_server = DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 4)); |
| 125 Dart_Handle certificate_name_object = | 122 Dart_Handle certificate_name_object = |
| 126 ThrowIfError(Dart_GetNativeArgument(args, 5)); | 123 ThrowIfError(Dart_GetNativeArgument(args, 5)); |
| 127 bool request_client_certificate = | 124 bool request_client_certificate = |
| 128 DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 6)); | 125 DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 6)); |
| 129 bool require_client_certificate = | 126 bool require_client_certificate = |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 161 ASSERT(!is_server || certificate_name != NULL); | 158 ASSERT(!is_server || certificate_name != NULL); |
| 162 | 159 |
| 163 GetFilter(args)->Connect(host_name, | 160 GetFilter(args)->Connect(host_name, |
| 164 &raw_addr, | 161 &raw_addr, |
| 165 static_cast<int>(port), | 162 static_cast<int>(port), |
| 166 is_server, | 163 is_server, |
| 167 certificate_name, | 164 certificate_name, |
| 168 request_client_certificate, | 165 request_client_certificate, |
| 169 require_client_certificate, | 166 require_client_certificate, |
| 170 send_client_certificate); | 167 send_client_certificate); |
| 171 Dart_ExitScope(); | |
| 172 } | 168 } |
| 173 | 169 |
| 174 | 170 |
| 175 void FUNCTION_NAME(SecureSocket_Destroy)(Dart_NativeArguments args) { | 171 void FUNCTION_NAME(SecureSocket_Destroy)(Dart_NativeArguments args) { |
| 176 Dart_EnterScope(); | |
| 177 SSLFilter* filter = GetFilter(args); | 172 SSLFilter* filter = GetFilter(args); |
| 178 SetFilter(args, NULL); | 173 SetFilter(args, NULL); |
| 179 filter->Destroy(); | 174 filter->Destroy(); |
| 180 delete filter; | 175 delete filter; |
| 181 Dart_ExitScope(); | |
| 182 } | 176 } |
| 183 | 177 |
| 184 | 178 |
| 185 void FUNCTION_NAME(SecureSocket_Handshake)(Dart_NativeArguments args) { | 179 void FUNCTION_NAME(SecureSocket_Handshake)(Dart_NativeArguments args) { |
| 186 Dart_EnterScope(); | |
| 187 GetFilter(args)->Handshake(); | 180 GetFilter(args)->Handshake(); |
| 188 Dart_ExitScope(); | |
| 189 } | 181 } |
| 190 | 182 |
| 191 | 183 |
| 192 void FUNCTION_NAME(SecureSocket_Renegotiate)(Dart_NativeArguments args) { | 184 void FUNCTION_NAME(SecureSocket_Renegotiate)(Dart_NativeArguments args) { |
| 193 Dart_EnterScope(); | |
| 194 bool use_session_cache = | 185 bool use_session_cache = |
| 195 DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 1)); | 186 DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 1)); |
| 196 bool request_client_certificate = | 187 bool request_client_certificate = |
| 197 DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 2)); | 188 DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 2)); |
| 198 bool require_client_certificate = | 189 bool require_client_certificate = |
| 199 DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3)); | 190 DartUtils::GetBooleanValue(Dart_GetNativeArgument(args, 3)); |
| 200 GetFilter(args)->Renegotiate(use_session_cache, | 191 GetFilter(args)->Renegotiate(use_session_cache, |
| 201 request_client_certificate, | 192 request_client_certificate, |
| 202 require_client_certificate); | 193 require_client_certificate); |
| 203 Dart_ExitScope(); | |
| 204 } | 194 } |
| 205 | 195 |
| 206 | 196 |
| 207 void FUNCTION_NAME(SecureSocket_RegisterHandshakeCompleteCallback)( | 197 void FUNCTION_NAME(SecureSocket_RegisterHandshakeCompleteCallback)( |
| 208 Dart_NativeArguments args) { | 198 Dart_NativeArguments args) { |
| 209 Dart_EnterScope(); | |
| 210 Dart_Handle handshake_complete = | 199 Dart_Handle handshake_complete = |
| 211 ThrowIfError(Dart_GetNativeArgument(args, 1)); | 200 ThrowIfError(Dart_GetNativeArgument(args, 1)); |
| 212 if (!Dart_IsClosure(handshake_complete)) { | 201 if (!Dart_IsClosure(handshake_complete)) { |
| 213 Dart_ThrowException(DartUtils::NewDartArgumentError( | 202 Dart_ThrowException(DartUtils::NewDartArgumentError( |
| 214 "Illegal argument to RegisterHandshakeCompleteCallback")); | 203 "Illegal argument to RegisterHandshakeCompleteCallback")); |
| 215 } | 204 } |
| 216 GetFilter(args)->RegisterHandshakeCompleteCallback(handshake_complete); | 205 GetFilter(args)->RegisterHandshakeCompleteCallback(handshake_complete); |
| 217 Dart_ExitScope(); | |
| 218 } | 206 } |
| 219 | 207 |
| 220 | 208 |
| 221 void FUNCTION_NAME(SecureSocket_RegisterBadCertificateCallback)( | 209 void FUNCTION_NAME(SecureSocket_RegisterBadCertificateCallback)( |
| 222 Dart_NativeArguments args) { | 210 Dart_NativeArguments args) { |
| 223 Dart_EnterScope(); | |
| 224 Dart_Handle callback = | 211 Dart_Handle callback = |
| 225 ThrowIfError(Dart_GetNativeArgument(args, 1)); | 212 ThrowIfError(Dart_GetNativeArgument(args, 1)); |
| 226 if (!Dart_IsClosure(callback) && !Dart_IsNull(callback)) { | 213 if (!Dart_IsClosure(callback) && !Dart_IsNull(callback)) { |
| 227 Dart_ThrowException(DartUtils::NewDartArgumentError( | 214 Dart_ThrowException(DartUtils::NewDartArgumentError( |
| 228 "Illegal argument to RegisterBadCertificateCallback")); | 215 "Illegal argument to RegisterBadCertificateCallback")); |
| 229 } | 216 } |
| 230 GetFilter(args)->RegisterBadCertificateCallback(callback); | 217 GetFilter(args)->RegisterBadCertificateCallback(callback); |
| 231 Dart_ExitScope(); | |
| 232 } | 218 } |
| 233 | 219 |
| 234 | 220 |
| 235 void FUNCTION_NAME(SecureSocket_InitializeLibrary) | 221 void FUNCTION_NAME(SecureSocket_InitializeLibrary) |
| 236 (Dart_NativeArguments args) { | 222 (Dart_NativeArguments args) { |
| 237 Dart_EnterScope(); | |
| 238 Dart_Handle certificate_database_object = | 223 Dart_Handle certificate_database_object = |
| 239 ThrowIfError(Dart_GetNativeArgument(args, 0)); | 224 ThrowIfError(Dart_GetNativeArgument(args, 0)); |
| 240 // Check that the type is string, and get the UTF-8 C string value from it. | 225 // Check that the type is string, and get the UTF-8 C string value from it. |
| 241 const char* certificate_database = NULL; | 226 const char* certificate_database = NULL; |
| 242 if (Dart_IsString(certificate_database_object)) { | 227 if (Dart_IsString(certificate_database_object)) { |
| 243 ThrowIfError(Dart_StringToCString(certificate_database_object, | 228 ThrowIfError(Dart_StringToCString(certificate_database_object, |
| 244 &certificate_database)); | 229 &certificate_database)); |
| 245 } else if (!Dart_IsNull(certificate_database_object)) { | 230 } else if (!Dart_IsNull(certificate_database_object)) { |
| 246 Dart_ThrowException(DartUtils::NewDartArgumentError( | 231 Dart_ThrowException(DartUtils::NewDartArgumentError( |
| 247 "Non-String certificate directory argument to SetCertificateDatabase")); | 232 "Non-String certificate directory argument to SetCertificateDatabase")); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 267 // Check that the type is boolean, and get the boolean value from it. | 252 // Check that the type is boolean, and get the boolean value from it. |
| 268 bool builtin_roots = true; | 253 bool builtin_roots = true; |
| 269 if (Dart_IsBoolean(builtin_roots_object)) { | 254 if (Dart_IsBoolean(builtin_roots_object)) { |
| 270 ThrowIfError(Dart_BooleanValue(builtin_roots_object, &builtin_roots)); | 255 ThrowIfError(Dart_BooleanValue(builtin_roots_object, &builtin_roots)); |
| 271 } else { | 256 } else { |
| 272 Dart_ThrowException(DartUtils::NewDartArgumentError( | 257 Dart_ThrowException(DartUtils::NewDartArgumentError( |
| 273 "UseBuiltinRoots argument to SetCertificateDatabase is not a bool")); | 258 "UseBuiltinRoots argument to SetCertificateDatabase is not a bool")); |
| 274 } | 259 } |
| 275 | 260 |
| 276 SSLFilter::InitializeLibrary(certificate_database, password, builtin_roots); | 261 SSLFilter::InitializeLibrary(certificate_database, password, builtin_roots); |
| 277 Dart_ExitScope(); | |
| 278 } | 262 } |
| 279 | 263 |
| 280 | 264 |
| 281 static Dart_Handle X509FromCertificate(CERTCertificate* certificate) { | 265 static Dart_Handle X509FromCertificate(CERTCertificate* certificate) { |
| 282 PRTime start_validity; | 266 PRTime start_validity; |
| 283 PRTime end_validity; | 267 PRTime end_validity; |
| 284 SECStatus status = | 268 SECStatus status = |
| 285 CERT_GetCertTimes(certificate, &start_validity, &end_validity); | 269 CERT_GetCertTimes(certificate, &start_validity, &end_validity); |
| 286 if (status != SECSuccess) { | 270 if (status != SECSuccess) { |
| 287 ThrowPRException("CertificateException", | 271 ThrowPRException("CertificateException", |
| (...skipping 23 matching lines...) Expand all Loading... |
| 311 Dart_Handle arguments[] = { subject_name_object, | 295 Dart_Handle arguments[] = { subject_name_object, |
| 312 issuer_name_object, | 296 issuer_name_object, |
| 313 start_validity_date, | 297 start_validity_date, |
| 314 end_validity_date }; | 298 end_validity_date }; |
| 315 return Dart_New(x509_type, Dart_Null(), 4, arguments); | 299 return Dart_New(x509_type, Dart_Null(), 4, arguments); |
| 316 } | 300 } |
| 317 | 301 |
| 318 | 302 |
| 319 void FUNCTION_NAME(SecureSocket_AddCertificate) | 303 void FUNCTION_NAME(SecureSocket_AddCertificate) |
| 320 (Dart_NativeArguments args) { | 304 (Dart_NativeArguments args) { |
| 321 Dart_EnterScope(); | |
| 322 Dart_Handle certificate_object = | 305 Dart_Handle certificate_object = |
| 323 ThrowIfError(Dart_GetNativeArgument(args, 0)); | 306 ThrowIfError(Dart_GetNativeArgument(args, 0)); |
| 324 Dart_Handle trust_object = ThrowIfError(Dart_GetNativeArgument(args, 1)); | 307 Dart_Handle trust_object = ThrowIfError(Dart_GetNativeArgument(args, 1)); |
| 325 | 308 |
| 326 if (!Dart_IsList(certificate_object) || !Dart_IsString(trust_object)) { | 309 if (!Dart_IsList(certificate_object) || !Dart_IsString(trust_object)) { |
| 327 Dart_ThrowException(DartUtils::NewDartArgumentError( | 310 Dart_ThrowException(DartUtils::NewDartArgumentError( |
| 328 "Bad argument to SecureSocket.addCertificate")); | 311 "Bad argument to SecureSocket.addCertificate")); |
| 329 } | 312 } |
| 330 | 313 |
| 331 intptr_t length; | 314 intptr_t length; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 351 if (status != SECSuccess) { | 334 if (status != SECSuccess) { |
| 352 ThrowPRException("CertificateException", "Trust string cannot be decoded"); | 335 ThrowPRException("CertificateException", "Trust string cannot be decoded"); |
| 353 } | 336 } |
| 354 | 337 |
| 355 status = CERT_ChangeCertTrust(CERT_GetDefaultCertDB(), cert, &trust); | 338 status = CERT_ChangeCertTrust(CERT_GetDefaultCertDB(), cert, &trust); |
| 356 if (status != SECSuccess) { | 339 if (status != SECSuccess) { |
| 357 ThrowPRException("CertificateException", "Cannot set trust attributes"); | 340 ThrowPRException("CertificateException", "Cannot set trust attributes"); |
| 358 } | 341 } |
| 359 | 342 |
| 360 Dart_SetReturnValue(args, X509FromCertificate(cert)); | 343 Dart_SetReturnValue(args, X509FromCertificate(cert)); |
| 361 Dart_ExitScope(); | |
| 362 return; | 344 return; |
| 363 } | 345 } |
| 364 | 346 |
| 365 | 347 |
| 366 | 348 |
| 367 void FUNCTION_NAME(SecureSocket_PeerCertificate) | 349 void FUNCTION_NAME(SecureSocket_PeerCertificate) |
| 368 (Dart_NativeArguments args) { | 350 (Dart_NativeArguments args) { |
| 369 Dart_EnterScope(); | |
| 370 Dart_SetReturnValue(args, GetFilter(args)->PeerCertificate()); | 351 Dart_SetReturnValue(args, GetFilter(args)->PeerCertificate()); |
| 371 Dart_ExitScope(); | |
| 372 } | 352 } |
| 373 | 353 |
| 374 | 354 |
| 375 void FUNCTION_NAME(SecureSocket_FilterPointer)(Dart_NativeArguments args) { | 355 void FUNCTION_NAME(SecureSocket_FilterPointer)(Dart_NativeArguments args) { |
| 376 Dart_EnterScope(); | |
| 377 intptr_t filter_pointer = reinterpret_cast<intptr_t>(GetFilter(args)); | 356 intptr_t filter_pointer = reinterpret_cast<intptr_t>(GetFilter(args)); |
| 378 Dart_SetReturnValue(args, Dart_NewInteger(filter_pointer)); | 357 Dart_SetReturnValue(args, Dart_NewInteger(filter_pointer)); |
| 379 Dart_ExitScope(); | |
| 380 } | 358 } |
| 381 | 359 |
| 382 | 360 |
| 383 /** | 361 /** |
| 384 * Pushes data through the SSL filter, reading and writing from circular | 362 * Pushes data through the SSL filter, reading and writing from circular |
| 385 * buffers shared with Dart. | 363 * buffers shared with Dart. |
| 386 * | 364 * |
| 387 * The Dart _SecureFilterImpl class contains 4 ExternalByteArrays used to | 365 * The Dart _SecureFilterImpl class contains 4 ExternalByteArrays used to |
| 388 * pass encrypted and plaintext data to and from the C++ SSLFilter object. | 366 * pass encrypted and plaintext data to and from the C++ SSLFilter object. |
| 389 * | 367 * |
| (...skipping 642 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1032 return bytes_processed; | 1010 return bytes_processed; |
| 1033 } | 1011 } |
| 1034 | 1012 |
| 1035 | 1013 |
| 1036 Dart_Port SSLFilter::GetServicePort() { | 1014 Dart_Port SSLFilter::GetServicePort() { |
| 1037 return filter_service_.GetServicePort(); | 1015 return filter_service_.GetServicePort(); |
| 1038 } | 1016 } |
| 1039 | 1017 |
| 1040 | 1018 |
| 1041 void FUNCTION_NAME(SecureSocket_NewServicePort)(Dart_NativeArguments args) { | 1019 void FUNCTION_NAME(SecureSocket_NewServicePort)(Dart_NativeArguments args) { |
| 1042 Dart_EnterScope(); | |
| 1043 Dart_SetReturnValue(args, Dart_Null()); | 1020 Dart_SetReturnValue(args, Dart_Null()); |
| 1044 Dart_Port service_port = SSLFilter::GetServicePort(); | 1021 Dart_Port service_port = SSLFilter::GetServicePort(); |
| 1045 if (service_port != ILLEGAL_PORT) { | 1022 if (service_port != ILLEGAL_PORT) { |
| 1046 // Return a send port for the service port. | 1023 // Return a send port for the service port. |
| 1047 Dart_Handle send_port = Dart_NewSendPort(service_port); | 1024 Dart_Handle send_port = Dart_NewSendPort(service_port); |
| 1048 Dart_SetReturnValue(args, send_port); | 1025 Dart_SetReturnValue(args, send_port); |
| 1049 } | 1026 } |
| 1050 Dart_ExitScope(); | |
| 1051 } | 1027 } |
| 1052 | 1028 |
| 1053 | 1029 |
| 1054 } // namespace bin | 1030 } // namespace bin |
| 1055 } // namespace dart | 1031 } // namespace dart |
| OLD | NEW |