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 |