示例#1
0
        public void SetMasterKeys(IntPtr ssl, bool isClient)
        {
            var keyingMaterialHandle = default(GCHandle);

            try
            {
                var keyingMaterial = new byte[2 * SRTP_MASTER_LEN];
                keyingMaterialHandle = GCHandle.Alloc(keyingMaterial, GCHandleType.Pinned);

                if (OpenSsl.SSL_export_keying_material(ssl, keyingMaterialHandle.AddrOfPinnedObject(),
                                                       2 * SRTP_MASTER_LEN,
                                                       Marshal.StringToHGlobalAnsi("EXTRACTOR-dtls_srtp"), 19,
                                                       IntPtr.Zero, 0, 0) != 1)
                {
                    throw new Exception($"Cannot export keying material: {OpenSsl.GetLastError()}");
                }

                int offset = 0;
                Array.Copy(keyingMaterial, offset, isClient ? _txKey : _rxKey, 0, SRTP_MASTER_KEY_LEN);
                offset += SRTP_MASTER_KEY_LEN;
                Array.Copy(keyingMaterial, offset, isClient ? _rxKey : _txKey, 0, SRTP_MASTER_KEY_LEN);
                offset += SRTP_MASTER_KEY_LEN;
                Array.Copy(keyingMaterial, offset, isClient ? _txSalt : _rxSalt, 0, SRTP_MASTER_SALT_LEN);
                offset += SRTP_MASTER_SALT_LEN;
                Array.Copy(keyingMaterial, offset, isClient ? _rxSalt : _txSalt, 0, SRTP_MASTER_SALT_LEN);

                _rxRoc = 0;
                _txRoc = 0;
            }
            finally
            {
                if (keyingMaterialHandle.IsAllocated)
                {
                    keyingMaterialHandle.Free();
                }
            }
        }