|
|
|
@ -3,16 +3,23 @@ struct SSL_Method ptr end |
|
|
|
|
struct BIO_Method ptr end |
|
|
|
|
struct SSL_Context ptr end |
|
|
|
|
|
|
|
|
|
@enum TLSMode begin |
|
|
|
|
ClientMode |
|
|
|
|
ServerMode |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
mutable struct SSLContext <: IO |
|
|
|
|
data::Vector{UInt8} |
|
|
|
|
ptr::Ptr{SSL_Context} |
|
|
|
|
|
|
|
|
|
mode::TLSMode |
|
|
|
|
"Construct the SSLContext object, initializing its relatvie SSL_Context |
|
|
|
|
pointer. |
|
|
|
|
|
|
|
|
|
Might throw ErrorException if the ccall fails" |
|
|
|
|
function SSLContext(; method::Ptr{SSL_Method} = TLS_method()) |
|
|
|
|
function SSLContext(; mode::TLSMode = ClientMode) |
|
|
|
|
ssl_context = new() |
|
|
|
|
ssl_context.mode = mode |
|
|
|
|
method = mode == ServerMode ? TLS_server_method() : TLS_client_method() |
|
|
|
|
ssl_context.ptr = SSL_CTX_new(method) |
|
|
|
|
if ssl_context.ptr == C_NULL |
|
|
|
|
# TODO: check error stack and report the right exception |
|
|
|
@ -38,7 +45,7 @@ mutable struct SSLClient{T} |
|
|
|
|
client.context = ctx |
|
|
|
|
client.ssl = SSL_new(ctx) |
|
|
|
|
client.io_on_read = (data) -> append!(client.context.data, data) |
|
|
|
|
SSL_accept_state(client) |
|
|
|
|
(ctx.mode == ServerMode ? SSL_accept_state : SSL_connect_state)(client) |
|
|
|
|
set_bio!(client, bio_new(), bio_new()) |
|
|
|
|
client.write_buf = UInt8[] |
|
|
|
|
client.encrypt_buf = UInt8[] |
|
|
|
|