Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sni csharp wrapper patch #7692

Merged
merged 3 commits into from
Jul 2, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 50 additions & 0 deletions wrapper/CSharp/wolfSSL-TLS-Server/wolfSSL-TLS-Server.cs
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,7 @@ public static void Main(string[] args)

Console.WriteLine("Started TCP and waiting for a connection");
fd = tcp.AcceptSocket();

ssl = wolfssl.new_ssl(ctx);
if (ssl == IntPtr.Zero)
{
Expand Down Expand Up @@ -208,6 +209,16 @@ public static void Main(string[] args)
return;
}

/* get and print sni used by the client */
if (haveSNI(args)) {
IntPtr data = IntPtr.Zero;

ushort size = wolfssl.SNI_GetRequest(ssl, 0, ref data);
string dataStr = Marshal.PtrToStringAnsi(data);
Console.WriteLine("(SNI_GetRequest) Size of SNI used by client: " + size);
Console.WriteLine("(SNI_GetRequest) SNI used by client: " + dataStr);
}

/* print out results of TLS/SSL accept */
Console.WriteLine("SSL version is " + wolfssl.get_version(ssl));
Console.WriteLine("SSL cipher suite is " + wolfssl.get_current_cipher(ssl));
Expand All @@ -222,6 +233,45 @@ public static void Main(string[] args)
}
Console.WriteLine(buff);

/* get and print sni from a sample buffer, can be used by using the raw client hello */
if (haveSNI(args)) {
IntPtr result = Marshal.AllocHGlobal(32);
IntPtr inOutSz = Marshal.AllocHGlobal(sizeof(int));
Marshal.WriteInt32(inOutSz, 32);
byte []buffer = { /* from TextMate website client hello example */
0x16, 0x03, 0x01, 0x00, 0xc6, 0x01, 0x00, 0x00, 0xc2, 0x03, 0x03, 0x52,
0x8b, 0x7b, 0xca, 0x69, 0xec, 0x97, 0xd5, 0x08, 0x03, 0x50, 0xfe, 0x3b,
0x99, 0xc3, 0x20, 0xce, 0xa5, 0xf6, 0x99, 0xa5, 0x71, 0xf9, 0x57, 0x7f,
0x04, 0x38, 0xf6, 0x11, 0x0b, 0xb8, 0xd3, 0x00, 0x00, 0x5e, 0x00, 0xff,
0xc0, 0x24, 0xc0, 0x23, 0xc0, 0x0a, 0xc0, 0x09, 0xc0, 0x07, 0xc0, 0x08,
0xc0, 0x28, 0xc0, 0x27, 0xc0, 0x14, 0xc0, 0x13, 0xc0, 0x11, 0xc0, 0x12,
0xc0, 0x26, 0xc0, 0x25, 0xc0, 0x2a, 0xc0, 0x29, 0xc0, 0x05, 0xc0, 0x04,
0xc0, 0x02, 0xc0, 0x03, 0xc0, 0x0f, 0xc0, 0x0e, 0xc0, 0x0c, 0xc0, 0x0d,
0x00, 0x3d, 0x00, 0x3c, 0x00, 0x2f, 0x00, 0x05, 0x00, 0x04, 0x00, 0x35,
0x00, 0x0a, 0x00, 0x67, 0x00, 0x6b, 0x00, 0x33, 0x00, 0x39, 0x00, 0x16,
0x00, 0xaf, 0x00, 0xae, 0x00, 0x8d, 0x00, 0x8c, 0x00, 0x8a, 0x00, 0x8b,
0x00, 0xb1, 0x00, 0xb0, 0x00, 0x2c, 0x00, 0x3b, 0x01, 0x00, 0x00, 0x3b,
0x00, 0x00, 0x00, 0x15, 0x00, 0x13, 0x00, 0x00, 0x10, 0x61, 0x70, 0x69,
0x2e, 0x74, 0x65, 0x78, 0x74, 0x6d, 0x61, 0x74, 0x65, 0x2e, 0x6f, 0x72,
0x67, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x06, 0x00, 0x17, 0x00, 0x18, 0x00,
0x19, 0x00, 0x0b, 0x00, 0x02, 0x01, 0x00, 0x00, 0x0d, 0x00, 0x0c, 0x00,
0x0a, 0x05, 0x01, 0x04, 0x01, 0x02, 0x01, 0x04, 0x03, 0x02, 0x03
};

int ret = wolfssl.SNI_GetFromBuffer(buffer, 1024, 0, result, inOutSz);

if (ret != wolfssl.SUCCESS) {
Console.WriteLine("Error on reading SNI from buffer, ret value = " + ret);
tcp.Stop();
clean(ssl, ctx);
return;
}

string resultStr = Marshal.PtrToStringAnsi(result);
Console.WriteLine("(SNI_GetFromBuffer) SNI used by client: " + resultStr);

}

if (wolfssl.write(ssl, reply, reply.Length) != reply.Length)
{
Console.WriteLine("Error in write");
Expand Down
27 changes: 27 additions & 0 deletions wrapper/CSharp/wolfSSL_CSharp/wolfSSL.cs
Original file line number Diff line number Diff line change
Expand Up @@ -330,6 +330,10 @@ public void free()
private extern static int wolfSSL_CTX_UseSNI(IntPtr ctx, byte type, IntPtr data, ushort size);
[DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)]
private extern static int wolfSSL_UseSNI(IntPtr ssl, byte type, IntPtr data, ushort size);
[DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)]
private extern static ushort wolfSSL_SNI_GetRequest(IntPtr ssl, byte type, ref IntPtr data);
[DllImport(wolfssl_dll, CallingConvention = CallingConvention.Cdecl)]
private extern static int wolfSSL_SNI_GetFromBuffer(byte[] clientHello, uint helloSz, byte type, IntPtr sni, IntPtr inOutSz);

/********************************
* SSL Structure
Expand Down Expand Up @@ -1200,6 +1204,29 @@ public static int UseSNI(IntPtr ssl, byte type, IntPtr data, ushort size)
}
}

public static ushort SNI_GetRequest(IntPtr ssl, byte type, ref IntPtr data)
{
try {
GCHandle gch = GCHandle.FromIntPtr(ssl);
ssl_handle handles = (ssl_handle)gch.Target;

return wolfSSL_SNI_GetRequest(handles.get_ssl(), type, ref data);
} catch (Exception e) {
log(ERROR_LOG, "wolfssl sni get request error: " + e.ToString());
return ushort.MaxValue;
}
}

public static int SNI_GetFromBuffer(byte []clientHello, uint helloSz, byte type, IntPtr sni, IntPtr inOutSz)
{
try {
return wolfSSL_SNI_GetFromBuffer(clientHello, helloSz, type, sni, inOutSz);
} catch(Exception e) {
log(ERROR_LOG, "wolfssl sni get from buffer error: " + e.ToString());
return FAILURE;
}
}

/// <summary>
/// Set identity hint to use
/// </summary>
Expand Down