OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 #if !defined(DART_IO_SECURE_SOCKET_DISABLED) | 5 #if !defined(DART_IO_SECURE_SOCKET_DISABLED) |
6 | 6 |
7 #include "platform/globals.h" | 7 #include "platform/globals.h" |
8 #if defined(TARGET_OS_MACOS) | 8 #if defined(TARGET_OS_MACOS) |
9 | 9 |
10 #include "bin/secure_socket.h" | 10 #include "bin/secure_socket.h" |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
49 // https://webkit.googlesource.com/WebKit/+/master/Source/WebKit2/Shared/cf/Argu
mentCodersCF.cpp | 49 // https://webkit.googlesource.com/WebKit/+/master/Source/WebKit2/Shared/cf/Argu
mentCodersCF.cpp |
50 extern "C" { | 50 extern "C" { |
51 SecIdentityRef SecIdentityCreate(CFAllocatorRef allocator, | 51 SecIdentityRef SecIdentityCreate(CFAllocatorRef allocator, |
52 SecCertificateRef certificate, | 52 SecCertificateRef certificate, |
53 SecKeyRef private_key); | 53 SecKeyRef private_key); |
54 } | 54 } |
55 | 55 |
56 namespace dart { | 56 namespace dart { |
57 namespace bin { | 57 namespace bin { |
58 | 58 |
| 59 static const int kSSLFilterNativeFieldIndex = 0; |
| 60 static const int kSecurityContextNativeFieldIndex = 0; |
| 61 static const int kX509NativeFieldIndex = 0; |
| 62 |
| 63 static const bool SSL_LOG_STATUS = false; |
| 64 static const bool SSL_LOG_DATA = false; |
| 65 static const bool SSL_LOG_CERTS = false; |
| 66 static const int SSL_ERROR_MESSAGE_BUFFER_SIZE = 1000; |
| 67 static const intptr_t PEM_BUFSIZE = 1024; |
| 68 |
59 // SSLCertContext wraps the certificates needed for a SecureTransport | 69 // SSLCertContext wraps the certificates needed for a SecureTransport |
60 // connection. Fields are protected by the mutex_ field, and may only be set | 70 // connection. Fields are protected by the mutex_ field, and may only be set |
61 // once. This is to allow access by both the Dart thread and the IOService | 71 // once. This is to allow access by both the Dart thread and the IOService |
62 // thread. Setters return false if the field was already set. | 72 // thread. Setters return false if the field was already set. |
63 class SSLCertContext { | 73 class SSLCertContext { |
64 public: | 74 public: |
65 SSLCertContext() : | 75 SSLCertContext() : |
66 mutex_(new Mutex()), | 76 mutex_(new Mutex()), |
67 private_key_(NULL), | 77 private_key_(NULL), |
68 keychain_(NULL), | 78 keychain_(NULL), |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
176 // CFArrays of SecCertificateRef. | 186 // CFArrays of SecCertificateRef. |
177 CFArrayRef cert_chain_; | 187 CFArrayRef cert_chain_; |
178 CFArrayRef trusted_certs_; | 188 CFArrayRef trusted_certs_; |
179 CFArrayRef cert_authorities_; | 189 CFArrayRef cert_authorities_; |
180 | 190 |
181 bool trust_builtin_; | 191 bool trust_builtin_; |
182 | 192 |
183 DISALLOW_COPY_AND_ASSIGN(SSLCertContext); | 193 DISALLOW_COPY_AND_ASSIGN(SSLCertContext); |
184 }; | 194 }; |
185 | 195 |
186 static const int kSSLFilterNativeFieldIndex = 0; | |
187 static const int kSecurityContextNativeFieldIndex = 0; | |
188 static const int kX509NativeFieldIndex = 0; | |
189 | |
190 static const bool SSL_LOG_STATUS = false; | |
191 static const bool SSL_LOG_DATA = false; | |
192 static const bool SSL_LOG_CERTS = false; | |
193 static const int SSL_ERROR_MESSAGE_BUFFER_SIZE = 1000; | |
194 static const intptr_t PEM_BUFSIZE = 1024; | |
195 | 196 |
196 static char* CFStringRefToCString(CFStringRef cfstring) { | 197 static char* CFStringRefToCString(CFStringRef cfstring) { |
197 CFIndex len = CFStringGetLength(cfstring); | 198 CFIndex len = CFStringGetLength(cfstring); |
198 CFIndex max_len = | 199 CFIndex max_len = |
199 CFStringGetMaximumSizeForEncoding(len, kCFStringEncodingUTF8) + 1; | 200 CFStringGetMaximumSizeForEncoding(len, kCFStringEncodingUTF8) + 1; |
200 char* result = reinterpret_cast<char*>(Dart_ScopeAllocate(max_len)); | 201 char* result = reinterpret_cast<char*>(Dart_ScopeAllocate(max_len)); |
201 ASSERT(result != NULL); | 202 ASSERT(result != NULL); |
202 bool success = | 203 bool success = |
203 CFStringGetCString(cfstring, result, max_len, kCFStringEncodingUTF8); | 204 CFStringGetCString(cfstring, result, max_len, kCFStringEncodingUTF8); |
204 return success ? result : NULL; | 205 return success ? result : NULL; |
(...skipping 1630 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1835 Dart_DeletePersistentHandle(handshake_complete_); | 1836 Dart_DeletePersistentHandle(handshake_complete_); |
1836 handshake_complete_ = NULL; | 1837 handshake_complete_ = NULL; |
1837 } | 1838 } |
1838 if (bad_certificate_callback_ != NULL) { | 1839 if (bad_certificate_callback_ != NULL) { |
1839 Dart_DeletePersistentHandle(bad_certificate_callback_); | 1840 Dart_DeletePersistentHandle(bad_certificate_callback_); |
1840 bad_certificate_callback_ = NULL; | 1841 bad_certificate_callback_ = NULL; |
1841 } | 1842 } |
1842 } | 1843 } |
1843 | 1844 |
1844 | 1845 |
1845 static intptr_t AvailableToRead(intptr_t start, intptr_t end, intptr_t size) { | |
1846 intptr_t data_available = 0; | |
1847 if (end < start) { | |
1848 // Data may be split into two segments. In this case, | |
1849 // the first is [start, size). | |
1850 intptr_t buffer_end = (start == 0) ? size - 1 : size; | |
1851 intptr_t available = buffer_end - start; | |
1852 start += available; | |
1853 data_available += available; | |
1854 ASSERT(start <= size); | |
1855 if (start == size) { | |
1856 start = 0; | |
1857 } | |
1858 } | |
1859 if (start < end) { | |
1860 intptr_t available = end - start; | |
1861 start += available; | |
1862 data_available += available; | |
1863 ASSERT(start <= end); | |
1864 } | |
1865 return data_available; | |
1866 } | |
1867 | |
1868 | |
1869 OSStatus SSLFilter::SSLReadCallback(SSLConnectionRef connection, | 1846 OSStatus SSLFilter::SSLReadCallback(SSLConnectionRef connection, |
1870 void* data, size_t* data_requested) { | 1847 void* data, size_t* data_requested) { |
1871 // Copy at most `data_requested` bytes from `buffers_[kReadEncrypted]` into | 1848 // Copy at most `data_requested` bytes from `buffers_[kReadEncrypted]` into |
1872 // `data` | 1849 // `data` |
1873 ASSERT(connection != NULL); | 1850 ASSERT(connection != NULL); |
1874 ASSERT(data != NULL); | 1851 ASSERT(data != NULL); |
1875 ASSERT(data_requested != NULL); | 1852 ASSERT(data_requested != NULL); |
1876 | 1853 |
1877 SSLFilter* filter = | 1854 SSLFilter* filter = |
1878 const_cast<SSLFilter*>(reinterpret_cast<const SSLFilter*>(connection)); | 1855 const_cast<SSLFilter*>(reinterpret_cast<const SSLFilter*>(connection)); |
1879 uint8_t* datap = reinterpret_cast<uint8_t*>(data); | 1856 uint8_t* datap = reinterpret_cast<uint8_t*>(data); |
1880 uint8_t* buffer = filter->buffers_[kReadEncrypted]; | 1857 uint8_t* buffer = filter->buffers_[kReadEncrypted]; |
1881 intptr_t start = filter->GetBufferStart(kReadEncrypted); | 1858 intptr_t start = filter->GetBufferStart(kReadEncrypted); |
1882 intptr_t end = filter->GetBufferEnd(kReadEncrypted); | 1859 intptr_t end = filter->GetBufferEnd(kReadEncrypted); |
1883 intptr_t size = filter->encrypted_buffer_size_; | 1860 intptr_t size = filter->encrypted_buffer_size_; |
1884 intptr_t requested = static_cast<intptr_t>(*data_requested); | 1861 intptr_t requested = static_cast<intptr_t>(*data_requested); |
1885 intptr_t data_read = 0; | 1862 intptr_t data_read = 0; |
1886 | 1863 |
1887 if (AvailableToRead(start, end, size) < requested) { | |
1888 *data_requested = 0; | |
1889 return errSSLWouldBlock; | |
1890 } | |
1891 | |
1892 if (end < start) { | 1864 if (end < start) { |
1893 // Data may be split into two segments. In this case, | 1865 // Data may be split into two segments. In this case, |
1894 // the first is [start, size). | 1866 // the first is [start, size). |
1895 intptr_t buffer_end = (start == 0) ? size - 1 : size; | 1867 intptr_t buffer_end = (start == 0) ? size - 1 : size; |
1896 intptr_t available = buffer_end - start; | 1868 intptr_t available = buffer_end - start; |
1897 intptr_t bytes = requested < available ? requested : available; | 1869 intptr_t bytes = requested < available ? requested : available; |
1898 memmove(datap, &buffer[start], bytes); | 1870 memmove(datap, &buffer[start], bytes); |
1899 start += bytes; | 1871 start += bytes; |
1900 datap += bytes; | 1872 datap += bytes; |
1901 data_read += bytes; | 1873 data_read += bytes; |
(...skipping 13 matching lines...) Expand all Loading... |
1915 requested -= bytes; | 1887 requested -= bytes; |
1916 ASSERT(start <= end); | 1888 ASSERT(start <= end); |
1917 } | 1889 } |
1918 | 1890 |
1919 if (SSL_LOG_DATA) { | 1891 if (SSL_LOG_DATA) { |
1920 Log::Print("SSLReadCallback: requested: %ld, read %ld bytes\n", | 1892 Log::Print("SSLReadCallback: requested: %ld, read %ld bytes\n", |
1921 *data_requested, data_read); | 1893 *data_requested, data_read); |
1922 } | 1894 } |
1923 | 1895 |
1924 filter->SetBufferStart(kReadEncrypted, start); | 1896 filter->SetBufferStart(kReadEncrypted, start); |
| 1897 bool short_read = data_read < static_cast<intptr_t>(*data_requested); |
1925 *data_requested = data_read; | 1898 *data_requested = data_read; |
1926 return noErr; | 1899 return short_read ? errSSLWouldBlock : noErr; |
1927 } | 1900 } |
1928 | 1901 |
1929 | 1902 |
1930 // Read decrypted data from the filter to the circular buffer. | 1903 // Read decrypted data from the filter to the circular buffer. |
1931 OSStatus SSLFilter::ProcessReadPlaintextBuffer(intptr_t start, | 1904 OSStatus SSLFilter::ProcessReadPlaintextBuffer(intptr_t start, |
1932 intptr_t end, | 1905 intptr_t end, |
1933 intptr_t* bytes_processed) { | 1906 intptr_t* bytes_processed) { |
1934 ASSERT(bytes_processed != NULL); | 1907 ASSERT(bytes_processed != NULL); |
1935 intptr_t length = end - start; | 1908 intptr_t length = end - start; |
1936 OSStatus status = noErr; | 1909 OSStatus status = noErr; |
1937 size_t bytes = 0; | 1910 size_t bytes = 0; |
1938 if (length > 0) { | 1911 if (length > 0) { |
1939 status = SSLRead( | 1912 status = SSLRead( |
1940 ssl_context_, | 1913 ssl_context_, |
1941 reinterpret_cast<void*>((buffers_[kReadPlaintext] + start)), | 1914 reinterpret_cast<void*>((buffers_[kReadPlaintext] + start)), |
1942 length, | 1915 length, |
1943 &bytes); | 1916 &bytes); |
| 1917 if (SSL_LOG_STATUS) { |
| 1918 Log::Print("SSLRead: status = %ld\n", static_cast<intptr_t>(status)); |
| 1919 } |
1944 if ((status != noErr) && (status != errSSLWouldBlock)) { | 1920 if ((status != noErr) && (status != errSSLWouldBlock)) { |
1945 *bytes_processed = 0; | 1921 *bytes_processed = 0; |
1946 return status; | 1922 return status; |
1947 } | 1923 } |
1948 } | 1924 } |
1949 if (SSL_LOG_DATA) { | 1925 if (SSL_LOG_DATA) { |
1950 Log::Print("ProcessReadPlaintextBuffer: requested: %ld, read %ld bytes\n", | 1926 Log::Print("ProcessReadPlaintextBuffer: requested: %ld, read %ld bytes\n", |
1951 length, bytes); | 1927 length, bytes); |
1952 } | 1928 } |
1953 *bytes_processed = static_cast<intptr_t>(bytes); | 1929 *bytes_processed = static_cast<intptr_t>(bytes); |
1954 return status; | 1930 return status; |
1955 } | 1931 } |
1956 | 1932 |
1957 | 1933 |
1958 intptr_t SpaceToWrite(intptr_t start, intptr_t end, intptr_t size) { | |
1959 intptr_t writable_space = 0; | |
1960 | |
1961 // is full, neither if statement is executed and nothing happens. | |
1962 if (start <= end) { | |
1963 // If the free space may be split into two segments, | |
1964 // then the first is [end, size), unless start == 0. | |
1965 // Then, since the last free byte is at position start - 2, | |
1966 // the interval is [end, size - 1). | |
1967 intptr_t buffer_end = (start == 0) ? size - 1 : size; | |
1968 intptr_t available = buffer_end - end; | |
1969 end += available; | |
1970 writable_space += available; | |
1971 ASSERT(end <= size); | |
1972 if (end == size) { | |
1973 end = 0; | |
1974 } | |
1975 } | |
1976 if (start > end + 1) { | |
1977 intptr_t available = (start - 1) - end; | |
1978 end += available; | |
1979 writable_space += available; | |
1980 ASSERT(end < start); | |
1981 } | |
1982 | |
1983 return writable_space; | |
1984 } | |
1985 | |
1986 | |
1987 OSStatus SSLFilter::SSLWriteCallback(SSLConnectionRef connection, | 1934 OSStatus SSLFilter::SSLWriteCallback(SSLConnectionRef connection, |
1988 const void* data, size_t* data_provided) { | 1935 const void* data, size_t* data_provided) { |
1989 // Copy at most `data_provided` bytes from data into | 1936 // Copy at most `data_provided` bytes from data into |
1990 // `buffers_[kWriteEncrypted]`. | 1937 // `buffers_[kWriteEncrypted]`. |
1991 ASSERT(connection != NULL); | 1938 ASSERT(connection != NULL); |
1992 ASSERT(data != NULL); | 1939 ASSERT(data != NULL); |
1993 ASSERT(data_provided != NULL); | 1940 ASSERT(data_provided != NULL); |
1994 | 1941 |
1995 SSLFilter* filter = | 1942 SSLFilter* filter = |
1996 const_cast<SSLFilter*>(reinterpret_cast<const SSLFilter*>(connection)); | 1943 const_cast<SSLFilter*>(reinterpret_cast<const SSLFilter*>(connection)); |
1997 const uint8_t* datap = reinterpret_cast<const uint8_t*>(data); | 1944 const uint8_t* datap = reinterpret_cast<const uint8_t*>(data); |
1998 uint8_t* buffer = filter->buffers_[kWriteEncrypted]; | 1945 uint8_t* buffer = filter->buffers_[kWriteEncrypted]; |
1999 intptr_t start = filter->GetBufferStart(kWriteEncrypted); | 1946 intptr_t start = filter->GetBufferStart(kWriteEncrypted); |
2000 intptr_t end = filter->GetBufferEnd(kWriteEncrypted); | 1947 intptr_t end = filter->GetBufferEnd(kWriteEncrypted); |
2001 intptr_t size = filter->encrypted_buffer_size_; | 1948 intptr_t size = filter->encrypted_buffer_size_; |
2002 intptr_t provided = static_cast<intptr_t>(*data_provided); | 1949 intptr_t provided = static_cast<intptr_t>(*data_provided); |
2003 intptr_t data_written = 0; | 1950 intptr_t data_written = 0; |
2004 | 1951 |
2005 if (SpaceToWrite(start, end, size) < provided) { | |
2006 *data_provided = 0; | |
2007 return errSSLWouldBlock; | |
2008 } | |
2009 | |
2010 // is full, neither if statement is executed and nothing happens. | 1952 // is full, neither if statement is executed and nothing happens. |
2011 if (start <= end) { | 1953 if (start <= end) { |
2012 // If the free space may be split into two segments, | 1954 // If the free space may be split into two segments, |
2013 // then the first is [end, size), unless start == 0. | 1955 // then the first is [end, size), unless start == 0. |
2014 // Then, since the last free byte is at position start - 2, | 1956 // Then, since the last free byte is at position start - 2, |
2015 // the interval is [end, size - 1). | 1957 // the interval is [end, size - 1). |
2016 intptr_t buffer_end = (start == 0) ? size - 1 : size; | 1958 intptr_t buffer_end = (start == 0) ? size - 1 : size; |
2017 intptr_t available = buffer_end - end; | 1959 intptr_t available = buffer_end - end; |
2018 intptr_t bytes = provided < available ? provided : available; | 1960 intptr_t bytes = provided < available ? provided : available; |
2019 memmove(&buffer[end], datap, bytes); | 1961 memmove(&buffer[end], datap, bytes); |
(...skipping 17 matching lines...) Expand all Loading... |
2037 ASSERT(end < start); | 1979 ASSERT(end < start); |
2038 } | 1980 } |
2039 | 1981 |
2040 if (SSL_LOG_DATA) { | 1982 if (SSL_LOG_DATA) { |
2041 Log::Print("SSLWriteCallback: provided: %ld, written %ld bytes\n", | 1983 Log::Print("SSLWriteCallback: provided: %ld, written %ld bytes\n", |
2042 *data_provided, data_written); | 1984 *data_provided, data_written); |
2043 } | 1985 } |
2044 | 1986 |
2045 filter->SetBufferEnd(kWriteEncrypted, end); | 1987 filter->SetBufferEnd(kWriteEncrypted, end); |
2046 *data_provided = data_written; | 1988 *data_provided = data_written; |
2047 return noErr; | 1989 return (data_written == 0) ? errSSLWouldBlock : noErr; |
2048 } | 1990 } |
2049 | 1991 |
2050 | 1992 |
2051 OSStatus SSLFilter::ProcessWritePlaintextBuffer(intptr_t start, | 1993 OSStatus SSLFilter::ProcessWritePlaintextBuffer(intptr_t start, |
2052 intptr_t end, | 1994 intptr_t end, |
2053 intptr_t* bytes_processed) { | 1995 intptr_t* bytes_processed) { |
2054 ASSERT(bytes_processed != NULL); | 1996 ASSERT(bytes_processed != NULL); |
2055 intptr_t length = end - start; | 1997 intptr_t length = end - start; |
2056 OSStatus status = noErr; | 1998 OSStatus status = noErr; |
2057 size_t bytes = 0; | 1999 size_t bytes = 0; |
2058 if (length > 0) { | 2000 if (length > 0) { |
2059 status = SSLWrite( | 2001 status = SSLWrite( |
2060 ssl_context_, | 2002 ssl_context_, |
2061 reinterpret_cast<void*>(buffers_[kWritePlaintext] + start), | 2003 reinterpret_cast<void*>(buffers_[kWritePlaintext] + start), |
2062 length, | 2004 length, |
2063 &bytes); | 2005 &bytes); |
| 2006 if (SSL_LOG_STATUS) { |
| 2007 Log::Print("SSLWrite: status = %ld\n", static_cast<intptr_t>(status)); |
| 2008 } |
2064 if ((status != noErr) && (status != errSSLWouldBlock)) { | 2009 if ((status != noErr) && (status != errSSLWouldBlock)) { |
2065 *bytes_processed = 0; | 2010 *bytes_processed = 0; |
2066 return status; | 2011 return status; |
2067 } | 2012 } |
2068 } | 2013 } |
| 2014 if (SSL_LOG_DATA) { |
| 2015 Log::Print("ProcessWritePlaintextBuffer: requested: %ld, written: %ld\n", |
| 2016 length, bytes); |
| 2017 } |
2069 *bytes_processed = static_cast<intptr_t>(bytes); | 2018 *bytes_processed = static_cast<intptr_t>(bytes); |
2070 return status; | 2019 return status; |
2071 } | 2020 } |
2072 | 2021 |
2073 } // namespace bin | 2022 } // namespace bin |
2074 } // namespace dart | 2023 } // namespace dart |
2075 | 2024 |
2076 #endif // defined(TARGET_OS_MACOS) | 2025 #endif // defined(TARGET_OS_MACOS) |
2077 | 2026 |
2078 #endif // !defined(DART_IO_SECURE_SOCKET_DISABLED) | 2027 #endif // !defined(DART_IO_SECURE_SOCKET_DISABLED) |
OLD | NEW |