Exemple #1
0
        internal unsafe QuicSession(IQuicInteropApi nativeApi, QuicRegistration registration, byte[][] apln)
        {
            m_nativeApi = nativeApi;

            QuicHandle *handle = null;

            QuicNativeBuffer *buffers = stackalloc QuicNativeBuffer[apln.Length];

            try
            {
                for (int i = 0; i < apln.Length; i++)
                {
                    byte *allocated = (byte *)Marshal.AllocHGlobal((IntPtr)apln[i].Length);
                    buffers[i].Buffer = allocated;
                    buffers[i].Length = (uint)apln[i].Length;
                    apln[i].AsSpan().CopyTo(new Span <byte>(allocated, apln[i].Length));
                }

                m_nativeApi.SessionOpen(registration.m_handle, buffers, (uint)apln.Length, null, &handle);
                m_handle = handle;
            }
            finally
            {
                for (int i = 0; i < apln.Length; i++)
                {
                    Marshal.FreeHGlobal((IntPtr)buffers[i].Buffer);
                }
            }
        }
        internal unsafe QuicRegistration(QuicRegistrationConfig config, IQuicInteropApi nativeApi)
        {
            m_nativeApi = nativeApi;
            QuicHandle *handle = null;
            QuicNativeRegistrationConfig nativeRegConfig = new QuicNativeRegistrationConfig
            {
                AppName          = null,
                ExecutionProfile = config.ExecutionProfile
            };

            if (config.AppName != null)
            {
                int         appNameLength    = config.AppName.Length;
                int         maxAppNameLength = Encoding.UTF8.GetMaxByteCount(appNameLength);
                Span <byte> appNameSpan      = appNameLength < 256 ? stackalloc byte[256] : new byte[maxAppNameLength];

                fixed(byte *appNamePtr = appNameSpan)
                {
                    fixed(char *strNamePtr = config.AppName)
                    {
                        int actualLength = Encoding.UTF8.GetBytes(strNamePtr, appNameLength, appNamePtr, maxAppNameLength);

                        appNameSpan[actualLength] = 0; // null terminator
                    }

                    nativeRegConfig.AppName = appNamePtr;
                    m_nativeApi.RegistrationOpen(&nativeRegConfig, &handle);
                }
            }
            else
            {
                m_nativeApi.RegistrationOpen(&nativeRegConfig, &handle);
            }
            m_handle = handle;
        }
        internal unsafe QuicRegistration(IQuicInteropApi nativeApi)
        {
            m_nativeApi = nativeApi;
            QuicHandle *handle = null;

            m_nativeApi.RegistrationOpen(null, &handle);
            m_handle = handle;
        }
Exemple #4
0
        internal unsafe QuicConnection(IQuicInteropApi api, QuicSession session)
        {
            m_nativeApi = api;
            QuicHandle *handle = null;

            api.ConnectionOpen(session.m_handle, null, null, &handle);
            m_handle = handle;
        }
Exemple #5
0
        public unsafe QuicApi()
        {
            NativeQuicApi *nativeApi = null;
            int            status    = QuicNativeMethods.MsQuicOpen(&nativeApi);

            if (status != 0)
            {
                Marshal.ThrowExceptionForHR(status);
                m_nativeApi = null !;
                return;
            }
            m_nativeApi = ApiGenerator.CreateApiImplementation(nativeApi, QuicNativeMethods.MsQuicClose);
        }
Exemple #6
0
        internal unsafe QuicListener(IQuicInteropApi nativeApi, QuicSession session)
        {
            m_nativeApi = nativeApi;
            m_session   = session;

            connectionQueue = Channel.CreateBounded <QuicConnection>(new BoundedChannelOptions(128)
            {
                SingleWriter = true,
                SingleReader = true,
            });

            m_gcHandle = GCHandle.Alloc(this);

            QuicHandle *handle = null;

            m_nativeApi.ListenerOpen(session.m_handle, m_nativeListenerCallback, (void *)GCHandle.ToIntPtr(m_gcHandle), &handle);

            m_handle = handle;
        }
        internal static async Task <QuicSecurityConfiguration> CreateQuicSecurityConfig(IQuicInteropApi api, QuicRegistration registration, QuicNativeCertificateHashStore certHashStore, string?principal, bool enableOcsp)
        {
            var flags = QuicSecConfigFlags.CertificateHashStore;

            if (enableOcsp)
            {
                flags |= QuicSecConfigFlags.EnableOcsp;
            }

            var completionSource = new TaskCompletionSource <QuicSecurityConfiguration>(TaskCreationOptions.RunContinuationsAsynchronously);

            unsafe QuicSecConfigCreateComplete RunSecConfig()
            {
                QuicSecConfigCreateComplete configComplete = (void *context, int status, QuicNativeSecConfig *config) =>
                {
                    completionSource.SetResult(new QuicSecurityConfiguration(api, config));
                };

                var callback = Marshal.GetFunctionPointerForDelegate(configComplete);

                var certHashCopy = certHashStore;

                if (principal == null)
                {
                    api.SecConfigCreate(registration.m_handle, flags, &certHashCopy, null, null, (void *)callback);
                }
                else
                {
                    int         maxPrincipalLength = Encoding.UTF8.GetMaxByteCount(principal.Length);
                    Span <byte> principalSpan      = maxPrincipalLength < 256 ? stackalloc byte[maxPrincipalLength] : new byte[maxPrincipalLength];
                    fixed(byte *principalBytePtr = principalSpan)
                    {
                        fixed(char *principalStrPtr = principal)
                        {
                            int actualLength = Encoding.UTF8.GetBytes(principalStrPtr, principal.Length, principalBytePtr, principalSpan.Length);

                            principalSpan[actualLength] = 0;
                        }

                        api.SecConfigCreate(registration.m_handle, flags, &certHashCopy, principalBytePtr, null, (void *)callback);
                    }
                }

                return(configComplete);
            }

            var configCompleteDelegate = RunSecConfig();

            var secConfig = await completionSource.Task.ConfigureAwait(false);

            GC.KeepAlive(configCompleteDelegate);

            return(secConfig);
        }
 internal unsafe QuicSecurityConfiguration(IQuicInteropApi api, QuicNativeSecConfig *secConfig)
 {
     m_nativeApi = api;
     m_secConfig = secConfig;
 }
        internal static async Task <QuicSecurityConfiguration> CreateQuicSecurityConfig(IQuicInteropApi api, QuicRegistration registration, string certFile, string keyFile, bool enableOcsp)
        {
            var flags = QuicSecConfigFlags.CertificateFile;

            if (enableOcsp)
            {
                flags |= QuicSecConfigFlags.EnableOcsp;
            }

            var completionSource = new TaskCompletionSource <QuicSecurityConfiguration>(TaskCreationOptions.RunContinuationsAsynchronously);

            unsafe QuicSecConfigCreateComplete RunSecConfig()
            {
                QuicSecConfigCreateComplete configComplete = (void *context, int status, QuicNativeSecConfig *config) =>
                {
                    completionSource.SetResult(new QuicSecurityConfiguration(api, config));
                };

                var callback = Marshal.GetFunctionPointerForDelegate(configComplete);

                int         maxCertFileLength = Encoding.UTF8.GetMaxByteCount(certFile.Length);
                Span <byte> maxCertFileSpan   = maxCertFileLength < 256 ? stackalloc byte[maxCertFileLength] : new byte[maxCertFileLength];

                int         maxKeyFileLength = Encoding.UTF8.GetMaxByteCount(keyFile.Length);
                Span <byte> maxKeyFileSpan   = maxKeyFileLength < 256 ? stackalloc byte[maxKeyFileLength] : new byte[maxKeyFileLength];

                fixed(byte *certFileBytePtr = maxCertFileSpan)
                fixed(byte *keyFileBytePtr = maxKeyFileSpan)
                {
                    fixed(char *certFileStrPtr = certFile)
                    {
                        int actualLength = Encoding.UTF8.GetBytes(certFileStrPtr, certFile.Length, certFileBytePtr, maxCertFileSpan.Length);

                        maxCertFileSpan[actualLength] = 0;
                    }

                    fixed(char *keyFileStrPtr = keyFile)
                    {
                        int actualLength = Encoding.UTF8.GetBytes(keyFileStrPtr, keyFile.Length, keyFileBytePtr, maxKeyFileSpan.Length);

                        maxKeyFileSpan[actualLength] = 0;
                    }

                    var file = new QuicNativeCertificateFile();

                    file.CertificateFile = certFileBytePtr;
                    file.PrivateKeyFile  = keyFileBytePtr;

                    api.SecConfigCreate(registration.m_handle, flags, &file, null, null, (void *)callback);
                }

                return(configComplete);
            }

            var configCompleteDelegate = RunSecConfig();

            var secConfig = await completionSource.Task.ConfigureAwait(false);

            GC.KeepAlive(configCompleteDelegate);

            return(secConfig);
        }
        internal static async Task <QuicSecurityConfiguration> CreateQuicSecurityConfig(IQuicInteropApi api, QuicRegistration registration)
        {
            var completionSource = new TaskCompletionSource <QuicSecurityConfiguration>(TaskCreationOptions.RunContinuationsAsynchronously);

            unsafe QuicSecConfigCreateComplete RunSecConfig()
            {
                QuicSecConfigCreateComplete configComplete = (void *context, int status, QuicNativeSecConfig *config) =>
                {
                    completionSource.SetResult(new QuicSecurityConfiguration(api, config));
                };

                var callback = Marshal.GetFunctionPointerForDelegate(configComplete);

                api.SecConfigCreate(registration.m_handle, QuicSecConfigFlags.None, null, null, null, (void *)callback);

                return(configComplete);
            }

            var configCompleteDelegate = RunSecConfig();

            var secConfig = await completionSource.Task.ConfigureAwait(false);

            GC.KeepAlive(configCompleteDelegate);

            return(secConfig);
        }
Exemple #11
0
 internal unsafe QuicConnection(IQuicInteropApi api, QuicNativeListenerEvent.QuicListenerEventNewConnection *newConnection)
 {
     m_nativeApi = api;
 }