/
openssl.cr
71 lines (61 loc) · 1.78 KB
/
openssl.cr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
require "./openssl/lib_ssl"
module OpenSSL
class Error < Exception
getter! code : LibCrypto::ULong?
def initialize(message = nil, fetched = false)
@code ||= LibCrypto::ULong.new(0)
if fetched
super(message)
else
@code, error = fetch_error_details
super(message ? "#{message}: #{error}" : error)
end
end
protected def fetch_error_details
code = LibCrypto.err_get_error
message = String.new(LibCrypto.err_error_string(code, nil)) unless code == 0
{code, message || "Unknown or no error"}
end
end
module SSL
alias Modes = LibSSL::Modes
alias Options = LibSSL::Options
alias VerifyMode = LibSSL::VerifyMode
alias ErrorType = LibSSL::SSLError
{% if LibSSL::OPENSSL_102 %}
alias X509VerifyFlags = LibCrypto::X509VerifyFlags
{% end %}
class Error < OpenSSL::Error
getter error : ErrorType
def initialize(ssl : LibSSL::SSL, return_code : LibSSL::Int, func = nil)
@error = LibSSL.ssl_get_error(ssl, return_code)
case @error
when .none?
message = "Raised erroneously"
when .syscall?
@code, message = fetch_error_details
if @code == 0
case return_code
when 0
message = "Unexpected EOF"
when -1
raise Errno.new(func || "OpenSSL")
else
message = "Unknown error"
end
end
when .ssl?
@code, message = fetch_error_details
else
message = @error.to_s
end
super(func ? "#{func}: #{message}" : message, true)
end
end
end
end
require "./openssl/bio"
require "./openssl/ssl/*"
require "./openssl/digest/*"
require "./openssl/md5"
require "./openssl/x509/x509"