---@meta ssl.core

--------------------------------------------------------------------------------
-- LuaSec SSL C core 模块
--------------------------------------------------------------------------------

---@type ssl_context_core*
local ssl_context_core = require("ssl.context")

---@type ssl_x509*
local ssl_x509 = require("ssl.x509")

---@class ssl_core*
---@field SOCKET_INVALID integer 无效 socket fd
---@type ssl_core*
local M = {}

---@class ssl_connection*
local ssl_connection = {}

--- 创建 SSL connection 对象。
---@param context ssl_context* SSL context
---@return ssl_connection*? conn SSL connection
---@return string? errMsg 错误信息
function M.create(context) end

--- 查询当前连接压缩算法。
---@param conn ssl_connection* SSL connection
---@return string? compression 压缩算法
---@return string? errMsg 错误信息
function M.compression(conn) end

--- 查询 SSL connection 的密码套件信息。
---@param conn ssl_connection* SSL connection
---@return string? cipherInfo 密码套件描述
---@return integer? bits 密钥位数
---@return integer? algbits 算法位数
---@return string? protocol 协议版本
function M.info(conn) end

--- 绑定底层 fd。
---@param conn ssl_connection* SSL connection
---@param fd integer 文件描述符
---@return boolean? ok 是否成功
---@return string? errMsg 错误信息
function M.setfd(conn, fd) end

--- 给 SSL connection 注册 Lua 方法。
---@param name string 方法名
---@param fn function 方法实现
function M.setmethod(name, fn) end

--- 返回 LuaSec 版权信息。
---@return string copyright 版权信息
function M.copyright() end

--- 关闭连接。
---@return boolean? ok 是否成功
---@return string? errMsg 错误信息
function ssl_connection:close() end

--- 获取 ALPN 协议。
---@return string? protocol ALPN 协议
function ssl_connection:getalpn() end

--- 获取底层 fd。
---@return integer fd 文件描述符
function ssl_connection:getfd() end

--- 获取本端 finished 消息。
---@return string? data finished 消息
function ssl_connection:getfinished() end

--- 获取对端证书。
---@return ssl_x509_certificate*? cert 证书对象
function ssl_connection:getpeercertificate() end

--- 获取本端证书。
---@return ssl_x509_certificate*? cert 证书对象
function ssl_connection:getlocalcertificate() end

--- 获取对端证书链。
---@return ssl_x509_certificate[]? chain 证书链
function ssl_connection:getpeerchain() end

--- 获取本端证书链。
---@return ssl_x509_certificate[]? chain 证书链
function ssl_connection:getlocalchain() end

--- 获取对端证书校验结果。
---@return boolean ok 是否通过校验
---@return table? errors 校验错误列表
function ssl_connection:getpeerverification() end

--- 获取对端 finished 消息。
---@return string? data finished 消息
function ssl_connection:getpeerfinished() end

--- 导出 keying material。
---@param label string 标签
---@param length integer 输出长度
---@param context? string 上下文
---@return string? material keying material
---@return string? errMsg 错误信息
function ssl_connection:exportkeyingmaterial(label, length, context) end

--- 获取传输统计。
---@return integer received 已接收字节数
---@return integer sent 已发送字节数
---@return number age 创建后秒数
function ssl_connection:getstats() end

--- 设置传输统计。
---@param received? integer 已接收字节数
---@param sent? integer 已发送字节数
---@param age? number 创建后秒数
---@return integer? ok 成功时返回 1
function ssl_connection:setstats(received, sent, age) end

--- 查询缓冲区是否有未读数据。
---@return boolean dirty 是否有未读数据
function ssl_connection:dirty() end

--- 执行 SSL 握手。
---@return boolean? ok 是否成功
---@return string? errMsg 错误信息
function ssl_connection:dohandshake() end

--- 接收数据。
---@param pattern? '*l'|'*a'|integer 接收模式
---@param prefix? string 前缀
---@return string? data 数据
---@return string? errMsg 错误信息
---@return string? partial 部分数据
function ssl_connection:receive(pattern, prefix) end

--- 发送数据。
---@param data string 数据
---@param from? integer 起始位置
---@param to? integer 结束位置
---@return integer? sent 已发送字节数
---@return string? errMsg 错误信息
---@return integer? lastIndex 最后发送位置
function ssl_connection:send(data, from, to) end

--- 设置超时。
---@param timeout number 超时秒数
---@param mode? 'b'|'r'|'s' 模式
---@return boolean? ok 是否成功
---@return string? errMsg 错误信息
function ssl_connection:settimeout(timeout, mode) end

--- 设置 SNI 名称。
---@param name string SNI 名称
---@return boolean? ok 是否成功
---@return string? errMsg 错误信息
function ssl_connection:sni(name) end

--- 获取 SNI 名称。
---@return string? name SNI 名称
function ssl_connection:getsniname() end

--- 返回当前等待方向。
---@return 'read'|'write'|string? want 等待方向
function ssl_connection:want() end

--- 启用 DANE。
---@return boolean? ok 是否成功
---@return string? errMsg 错误信息
function ssl_connection:setdane() end

--- 设置 TLSA 记录。
---@param usage integer usage
---@param selector integer selector
---@param matchingType integer matching type
---@param data string TLSA 数据
---@return boolean? ok 是否成功
---@return string? errMsg 错误信息
function ssl_connection:settlsa(usage, selector, matchingType, data) end

return M
