using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading;
namespace HPSocketCS
{
public class SSLAgent : TcpAgent
{
static int ObjectReferer = 0;
static string SSLInitLock = "SSL初始化锁";
///
/// 验证模式
///
public SSLVerifyMode VerifyMode { get; set; }
///
/// 证书文件(客户端可选)
///
public string PemCertFile { get; set; }
///
/// 私钥文件(客户端可选)
///
public string PemKeyFile { get; set; }
///
/// 私钥密码(没有密码则为空)
///
public string KeyPasswod { get; set; }
///
/// CA 证书文件或目录(单向验证或客户端可选)
///
public string CAPemCertFileOrPath { get; set; }
public SSLAgent()
{
Interlocked.Increment(ref ObjectReferer);
}
///
///
///
/// 验证模式
/// 证书文件
/// 私钥文件
/// 私钥密码(没有密码则为空)
/// CA 证书文件或目录(单向验证或客户端可选)
public SSLAgent(SSLVerifyMode _verifyModel, string _pemCertFile, string _pemKeyFile, string _keyPasswod, string _caPemCertFileOrPath)
{
Interlocked.Increment(ref ObjectReferer);
this.VerifyMode = _verifyModel;
this.PemCertFile = _pemCertFile;
this.PemKeyFile = _pemKeyFile;
this.KeyPasswod = _keyPasswod;
this.CAPemCertFileOrPath = _caPemCertFileOrPath;
//Initialize();
}
~SSLAgent()
{
//Uninitialize();
}
protected override bool CreateListener()
{
if (IsCreate == true || pListener != IntPtr.Zero || pAgent != IntPtr.Zero)
{
return false;
}
pListener = Sdk.Create_HP_TcpAgentListener();
if (pListener == IntPtr.Zero)
{
return false;
}
pAgent = SSLSdk.Create_HP_SSLAgent(pListener);
if (pAgent == IntPtr.Zero)
{
return false;
}
IsCreate = true;
return true;
}
///
/// 初始化SSL环境
///
///
protected virtual bool Initialize()
{
lock (SSLInitLock)
{
//if (SSLSdk.HP_SSL_IsValid() == false)
{
PemCertFile = string.IsNullOrWhiteSpace(PemCertFile) ? null : PemCertFile;
PemKeyFile = string.IsNullOrWhiteSpace(PemKeyFile) ? null : PemKeyFile;
KeyPasswod = string.IsNullOrWhiteSpace(KeyPasswod) ? null : KeyPasswod;
CAPemCertFileOrPath = string.IsNullOrWhiteSpace(CAPemCertFileOrPath) ? null : CAPemCertFileOrPath;
var ret = SSLSdk.HP_SSLAgent_SetupSSLContext(pAgent, VerifyMode, PemCertFile, PemKeyFile, KeyPasswod, CAPemCertFileOrPath);
System.Diagnostics.Trace.WriteLine($"ssl Initialize : {ret}");
}
return true;
}
}
///
/// 反初始化SSL环境
///
protected virtual void Uninitialize()
{
if (Interlocked.Decrement(ref ObjectReferer) == 0 && pAgent != IntPtr.Zero)
{
SSLSdk.HP_SSLAgent_CleanupSSLContext(pAgent);
}
}
///
/// 启动通讯组件
/// 启动完成后可开始连接远程服务器
///
/// 绑定地址
/// 是否异步
///
public new bool Start(string address, bool async = false)
{
Uninitialize();
bool ret = false;
if (Initialize())
{
ret = base.Start(address, async);
}
return ret;
}
public override void Destroy()
{
Stop();
if (pAgent != IntPtr.Zero)
{
SSLSdk.Destroy_HP_SSLAgent(pAgent);
pAgent = IntPtr.Zero;
}
if (pListener != IntPtr.Zero)
{
Sdk.Destroy_HP_TcpAgentListener(pListener);
pListener = IntPtr.Zero;
}
IsCreate = false;
}
///
/// 启动 SSL 握手
/// 当通信组件设置为非自动握手时,需要调用本方法启动 SSL 握手
///
///
///
public bool StartSSLHandShake(IntPtr connId)
{
return SSLSdk.HP_SSLAgent_StartSSLHandShake(pAgent, connId);
}
///
/// 获取或设置通信组件握手方式(默认:TRUE,自动握手)
///
public bool AutoHandShake
{
get
{
return SSLSdk.HP_SSLAgent_IsSSLAutoHandShake(pAgent);
}
set
{
SSLSdk.HP_SSLAgent_SetSSLAutoHandShake(pAgent, value);
}
}
}
}