' ' Copyright (c) 2007, Cameron Rich ' ' All rights reserved. ' ' Redistribution and use in source and binary forms, with or without ' modification, are permitted provided that the following conditions are met: ' ' * Redistributions of source code must retain the above copyright notice, ' this list of conditions and the following disclaimer. ' * Redistributions in binary form must reproduce the above copyright ' notice, this list of conditions and the following disclaimer in the ' documentation and/or other materials provided with the distribution. ' * Neither the name of the axTLS project nor the names of its ' contributors may be used to endorse or promote products derived ' from this software without specific prior written permission. ' ' THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ' "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ' LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ' A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR ' CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ' SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED ' TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ' DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY ' OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING ' NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF ' THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ' ' ' A wrapper around the unmanaged Integererface to give a semi-decent VB.NET API ' Imports System Imports System.Runtime.InteropServices Imports System.Net.Sockets Imports axTLSvb Namespace axTLSvb Public Class SSL Public m_ssl As IntPtr Public Sub New(ByRef ip As IntPtr) m_ssl = ip End Sub Public Sub Dispose() axtls.ssl_free(m_ssl) End Sub Public Function HandshakeStatus() As Integer Return axtls.ssl_handshake_status(m_ssl) End Function Public Function GetCipherId() As Byte Return axtls.ssl_get_cipher_id(m_ssl) End Function Public Function GetSessionId() As Byte() Dim ptr As IntPtr = axtls.ssl_get_session_id(m_ssl) Dim sess_id_size As Integer = axtls.ssl_get_session_id_size(m_ssl) Dim result(sess_id_size-1) As Byte Marshal.Copy(ptr, result, 0, sess_id_size) Return result End Function Public Function GetCertificateDN(component As Integer) As String Return axtls.ssl_get_cert_dn(m_ssl, component) End Function End Class Public Class SSLUtil Private dummy As Integer ' need something here Public Shared Function BuildMode() As Integer Return axtls.ssl_get_config(axtls.SSL_BUILD_MODE) End Function Public Shared Function MaxCerts() As Integer Return axtls.ssl_get_config(axtls.SSL_MAX_CERT_CFG_OFFSET) End Function Public Shared Function MaxCACerts() As Integer Return axtls.ssl_get_config(axtls.SSL_MAX_CA_CERT_CFG_OFFSET) End Function Public Shared Function HasPEM() As Boolean If axtls.ssl_get_config(axtls.SSL_HAS_PEM) > 0 Then Return True Else Return False End If End Function Public Shared Sub DisplayError(ByVal error_code As Integer) axtls.ssl_display_error(error_code) End Sub Public Shared Function Version() As String Return axtls.ssl_version() End Function End Class Public Class SSLCTX Protected m_ctx As IntPtr Protected Sub New(ByVal options As Integer, _ ByVal num_sessions As Integer) m_ctx = axtls.ssl_ctx_new(options, num_sessions) End Sub Public Sub Dispose() axtls.ssl_ctx_free(m_ctx) End Sub Public Function Read(ByVal ssl As SSL, ByRef in_data As Byte()) As Integer Dim ptr As IntPtr = IntPtr.Zero Dim ret as Integer = axtls.ssl_read(ssl.m_ssl, ptr) If ret > axtls.SSL_OK Then ReDim in_data(ret) Marshal.Copy(ptr, in_data, 0, ret) Else in_data = Nothing End If Return ret End Function Public Function Write(ByVal ssl As SSL, _ ByVal data As Byte(), len As Integer) As Integer Return axtls.ssl_write(ssl.m_ssl, data, len) End Function Public Function Find(ByVal s As Socket) As SSL Dim client_fd As Integer = s.Handle.ToInt32() Return New SSL(axtls.ssl_find(m_ctx, client_fd)) End Function Public Function VerifyCert(ByVal ssl As SSL) As Integer Return axtls.ssl_verify_cert(ssl.m_ssl) End Function Public Function Renegotiate(ByVal ssl As SSL) As Integer Return axtls.ssl_renegotiate(ssl.m_ssl) End Function Public Function ObjLoad(ByVal obj_type As Integer, _ ByVal filename As String, _ password As String) As Integer Return axtls.ssl_obj_load(m_ctx, obj_type, filename, password) End Function Public Function ObjLoad(ByVal obj_type As Integer, _ ByVal data As Byte(), ByVal len As Integer, _ password As String) As Integer Return axtls.ssl_obj_memory_load( _ m_ctx, obj_type, data, len, password) End Function End Class Public Class SSLServer Inherits SSLCTX Public Sub New(ByVal options As Integer, _ ByVal num_sessions As Integer) MyBase.New(options, num_sessions) End Sub Public Function Connect(ByVal s As Socket) As SSL Dim client_fd As Integer = s.Handle.ToInt32() Return New SSL(axtls.ssl_server_new(m_ctx, client_fd)) End Function End Class Public Class SSLClient Inherits SSLCTX Public Sub New(ByVal options As Integer, _ ByVal num_sessions As Integer) MyBase.New(options, num_sessions) End Sub Public Function Connect(ByVal s As Socket, _ ByVal session_id As Byte()) As SSL Dim client_fd As Integer = s.Handle.ToInt32() Dim sess_id_size As Byte If session_id is Nothing Then sess_id_size = 0 Else sess_id_size = session_id.Length End If Return New SSL(axtls.ssl_client_new(m_ctx, client_fd, session_id, _ sess_id_size)) End Function End Class End Namespace