a6dafabb88
Running trust evaluation system api call on worker thread effectively unblocks main isolate when it attempts to establish https connection. Execution of the worker thread is implemented via dart native port infrastructure which allows to run C++ code as a dart message handler. TrustEvaluateHandlerFunc (if provided by platform-dependent SSLCertContext) is that handler, only mac(ios) implementation provides it. Asynchrony of CertificateVerificationCallback (for mac/ios) is implemented via [ssl_verify_retry] return code which allows to suspend ssl handshake until certificate trust is confirmed. When dart's _RawSecureSocket.secureHandshake() method that initiated ssl's handshake received this return code it knows it has to wait for a future that is completed by another callback([rpEvaluteResponse]) that waits for trust evaluation handler response. rpEvaluateResponse purpose is to listen for response from TrustEvaluateHandler and also invoke user-provided [badCertficateCallback] that can override trust decision for a given connection request, for a given certificate. Once that future is completed and CertificateVerificationCallback knows whether to trust a certificate or not, _secureHandshake retries ssl handshake. Bug: https://github.com/dart-lang/sdk/issues/41519 Change-Id: Ifee18639c78099ec77cad50000444bc6c7b9369b Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/165520 Reviewed-by: Siva Annamalai <asiva@google.com> Commit-Queue: Alexander Aprelev <aam@google.com>
233 lines
15 KiB
C++
233 lines
15 KiB
C++
// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
#include "bin/io_natives.h"
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include "bin/builtin.h"
|
|
#include "bin/dartutils.h"
|
|
#include "bin/socket_base.h"
|
|
#include "include/dart_api.h"
|
|
#include "platform/assert.h"
|
|
|
|
namespace dart {
|
|
namespace bin {
|
|
|
|
// Lists the native functions implementing advanced dart:io classes.
|
|
// Some classes, like File and Directory, list their implementations in
|
|
// builtin_natives.cc instead.
|
|
#define IO_NATIVE_LIST(V) \
|
|
V(CLI_WaitForEvent, 1) \
|
|
V(Crypto_GetRandomBytes, 1) \
|
|
V(Directory_Create, 2) \
|
|
V(Directory_CreateTemp, 2) \
|
|
V(Directory_Current, 1) \
|
|
V(Directory_Delete, 3) \
|
|
V(Directory_Exists, 2) \
|
|
V(Directory_FillWithDirectoryListing, 5) \
|
|
V(Directory_GetAsyncDirectoryListerPointer, 1) \
|
|
V(Directory_Rename, 3) \
|
|
V(Directory_SetAsyncDirectoryListerPointer, 2) \
|
|
V(Directory_SetCurrent, 2) \
|
|
V(Directory_SystemTemp, 1) \
|
|
V(EventHandler_SendData, 3) \
|
|
V(EventHandler_TimerMillisecondClock, 0) \
|
|
V(File_AreIdentical, 3) \
|
|
V(File_Close, 1) \
|
|
V(File_Copy, 3) \
|
|
V(File_Create, 2) \
|
|
V(File_CreateLink, 3) \
|
|
V(File_Delete, 2) \
|
|
V(File_DeleteLink, 2) \
|
|
V(File_Exists, 2) \
|
|
V(File_Flush, 1) \
|
|
V(File_GetPointer, 1) \
|
|
V(File_GetStdioHandleType, 1) \
|
|
V(File_GetType, 3) \
|
|
V(File_LastAccessed, 2) \
|
|
V(File_LastModified, 2) \
|
|
V(File_Length, 1) \
|
|
V(File_LengthFromPath, 2) \
|
|
V(File_LinkTarget, 2) \
|
|
V(File_Lock, 4) \
|
|
V(File_Open, 3) \
|
|
V(File_OpenStdio, 1) \
|
|
V(File_Position, 1) \
|
|
V(File_Read, 2) \
|
|
V(File_ReadByte, 1) \
|
|
V(File_ReadInto, 4) \
|
|
V(File_Rename, 3) \
|
|
V(File_RenameLink, 3) \
|
|
V(File_ResolveSymbolicLinks, 2) \
|
|
V(File_SetLastAccessed, 3) \
|
|
V(File_SetLastModified, 3) \
|
|
V(File_SetPointer, 2) \
|
|
V(File_SetPosition, 2) \
|
|
V(File_Stat, 2) \
|
|
V(File_Truncate, 2) \
|
|
V(File_WriteByte, 2) \
|
|
V(File_WriteFrom, 4) \
|
|
V(FileSystemWatcher_CloseWatcher, 1) \
|
|
V(FileSystemWatcher_GetSocketId, 2) \
|
|
V(FileSystemWatcher_InitWatcher, 0) \
|
|
V(FileSystemWatcher_IsSupported, 0) \
|
|
V(FileSystemWatcher_ReadEvents, 2) \
|
|
V(FileSystemWatcher_UnwatchPath, 2) \
|
|
V(FileSystemWatcher_WatchPath, 5) \
|
|
V(Filter_CreateZLibDeflate, 8) \
|
|
V(Filter_CreateZLibInflate, 4) \
|
|
V(Filter_Process, 4) \
|
|
V(Filter_Processed, 3) \
|
|
V(InternetAddress_Parse, 1) \
|
|
V(InternetAddress_ParseScopedLinkLocalAddress, 1) \
|
|
V(InternetAddress_RawAddrToString, 1) \
|
|
V(IOService_NewServicePort, 0) \
|
|
V(Namespace_Create, 2) \
|
|
V(Namespace_GetDefault, 0) \
|
|
V(Namespace_GetPointer, 1) \
|
|
V(NetworkInterface_ListSupported, 0) \
|
|
V(Platform_NumberOfProcessors, 0) \
|
|
V(Platform_OperatingSystem, 0) \
|
|
V(Platform_OperatingSystemVersion, 0) \
|
|
V(Platform_PathSeparator, 0) \
|
|
V(Platform_LocalHostname, 0) \
|
|
V(Platform_ExecutableName, 0) \
|
|
V(Platform_ResolvedExecutableName, 0) \
|
|
V(Platform_Environment, 0) \
|
|
V(Platform_ExecutableArguments, 0) \
|
|
V(Platform_GetVersion, 0) \
|
|
V(Platform_LocaleName, 0) \
|
|
V(Process_Start, 12) \
|
|
V(Process_Wait, 5) \
|
|
V(Process_KillPid, 2) \
|
|
V(Process_SetExitCode, 1) \
|
|
V(Process_GetExitCode, 0) \
|
|
V(Process_Exit, 1) \
|
|
V(Process_Sleep, 1) \
|
|
V(Process_Pid, 1) \
|
|
V(Process_SetSignalHandler, 1) \
|
|
V(Process_ClearSignalHandler, 1) \
|
|
V(ProcessInfo_CurrentRSS, 0) \
|
|
V(ProcessInfo_MaxRSS, 0) \
|
|
V(RawSocketOption_GetOptionValue, 1) \
|
|
V(SecureSocket_Connect, 7) \
|
|
V(SecureSocket_Destroy, 1) \
|
|
V(SecureSocket_FilterPointer, 1) \
|
|
V(SecureSocket_GetSelectedProtocol, 1) \
|
|
V(SecureSocket_Handshake, 2) \
|
|
V(SecureSocket_MarkAsTrusted, 3) \
|
|
V(SecureSocket_NewX509CertificateWrapper, 1) \
|
|
V(SecureSocket_Init, 1) \
|
|
V(SecureSocket_PeerCertificate, 1) \
|
|
V(SecureSocket_RegisterBadCertificateCallback, 2) \
|
|
V(SecureSocket_RegisterHandshakeCompleteCallback, 2) \
|
|
V(SecureSocket_Renegotiate, 4) \
|
|
V(SecurityContext_Allocate, 1) \
|
|
V(SecurityContext_UsePrivateKeyBytes, 3) \
|
|
V(SecurityContext_SetAlpnProtocols, 3) \
|
|
V(SecurityContext_SetClientAuthoritiesBytes, 3) \
|
|
V(SecurityContext_SetTrustedCertificatesBytes, 3) \
|
|
V(SecurityContext_TrustBuiltinRoots, 1) \
|
|
V(SecurityContext_UseCertificateChainBytes, 3) \
|
|
V(ServerSocket_Accept, 2) \
|
|
V(ServerSocket_CreateBindListen, 7) \
|
|
V(ServerSocket_CreateUnixDomainBindListen, 5) \
|
|
V(SocketBase_IsBindError, 2) \
|
|
V(Socket_Available, 1) \
|
|
V(Socket_AvailableDatagram, 1) \
|
|
V(Socket_CreateBindConnect, 5) \
|
|
V(Socket_CreateUnixDomainBindConnect, 4) \
|
|
V(Socket_CreateBindDatagram, 6) \
|
|
V(Socket_CreateConnect, 4) \
|
|
V(Socket_CreateUnixDomainConnect, 3) \
|
|
V(Socket_GetPort, 1) \
|
|
V(Socket_GetRemotePeer, 1) \
|
|
V(Socket_GetError, 1) \
|
|
V(Socket_GetOption, 3) \
|
|
V(Socket_GetRawOption, 4) \
|
|
V(Socket_GetSocketId, 1) \
|
|
V(Socket_GetStdioHandle, 2) \
|
|
V(Socket_GetType, 1) \
|
|
V(Socket_JoinMulticast, 4) \
|
|
V(Socket_LeaveMulticast, 4) \
|
|
V(Socket_Read, 2) \
|
|
V(Socket_RecvFrom, 1) \
|
|
V(Socket_SendTo, 6) \
|
|
V(Socket_SetOption, 4) \
|
|
V(Socket_SetRawOption, 4) \
|
|
V(Socket_SetSocketId, 3) \
|
|
V(Socket_WriteList, 4) \
|
|
V(Stdin_ReadByte, 1) \
|
|
V(Stdin_GetEchoMode, 1) \
|
|
V(Stdin_SetEchoMode, 2) \
|
|
V(Stdin_GetLineMode, 1) \
|
|
V(Stdin_SetLineMode, 2) \
|
|
V(Stdin_AnsiSupported, 1) \
|
|
V(Stdout_GetTerminalSize, 1) \
|
|
V(Stdout_AnsiSupported, 1) \
|
|
V(StringToSystemEncoding, 1) \
|
|
V(SynchronousSocket_Available, 1) \
|
|
V(SynchronousSocket_CloseSync, 1) \
|
|
V(SynchronousSocket_CreateConnectSync, 3) \
|
|
V(SynchronousSocket_GetPort, 1) \
|
|
V(SynchronousSocket_GetRemotePeer, 1) \
|
|
V(SynchronousSocket_LookupRequest, 2) \
|
|
V(SynchronousSocket_ShutdownRead, 1) \
|
|
V(SynchronousSocket_ShutdownWrite, 1) \
|
|
V(SynchronousSocket_Read, 2) \
|
|
V(SynchronousSocket_ReadList, 4) \
|
|
V(SynchronousSocket_WriteList, 4) \
|
|
V(SystemEncodingToString, 1) \
|
|
V(X509_Der, 1) \
|
|
V(X509_Pem, 1) \
|
|
V(X509_Sha1, 1) \
|
|
V(X509_Subject, 1) \
|
|
V(X509_Issuer, 1) \
|
|
V(X509_StartValidity, 1) \
|
|
V(X509_EndValidity, 1)
|
|
|
|
IO_NATIVE_LIST(DECLARE_FUNCTION);
|
|
|
|
static struct NativeEntries {
|
|
const char* name_;
|
|
Dart_NativeFunction function_;
|
|
int argument_count_;
|
|
} IOEntries[] = {IO_NATIVE_LIST(REGISTER_FUNCTION)};
|
|
|
|
Dart_NativeFunction IONativeLookup(Dart_Handle name,
|
|
int argument_count,
|
|
bool* auto_setup_scope) {
|
|
const char* function_name = NULL;
|
|
Dart_Handle result = Dart_StringToCString(name, &function_name);
|
|
ASSERT(!Dart_IsError(result));
|
|
ASSERT(function_name != NULL);
|
|
ASSERT(auto_setup_scope != NULL);
|
|
*auto_setup_scope = true;
|
|
int num_entries = sizeof(IOEntries) / sizeof(struct NativeEntries);
|
|
for (int i = 0; i < num_entries; i++) {
|
|
struct NativeEntries* entry = &(IOEntries[i]);
|
|
if ((strcmp(function_name, entry->name_) == 0) &&
|
|
(entry->argument_count_ == argument_count)) {
|
|
return reinterpret_cast<Dart_NativeFunction>(entry->function_);
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
const uint8_t* IONativeSymbol(Dart_NativeFunction nf) {
|
|
int num_entries = sizeof(IOEntries) / sizeof(struct NativeEntries);
|
|
for (int i = 0; i < num_entries; i++) {
|
|
struct NativeEntries* entry = &(IOEntries[i]);
|
|
if (reinterpret_cast<Dart_NativeFunction>(entry->function_) == nf) {
|
|
return reinterpret_cast<const uint8_t*>(entry->name_);
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
} // namespace bin
|
|
} // namespace dart
|