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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
#!/usr/bin/env ruby
require 'openssl.so'
require 'openssl/buffering'
require 'thread'
module OpenSSL
module PKey
class DSA
def sign(digest, data)
unless self.private?
raise OpenSSL::PKey::DSAError, "Cannot sign with public key!"
end
unless digest.kind_of? OpenSSL::Digest::ANY
raise TypeError, "digest alg needed! (got #{digest.class.name})"
end
txt = ""
if data.kind_of? String
txt = data
else
begin
txt = data.to_s
rescue
raise TypeError, "string needed! (got #{data.class.name})"
end
end
self.sign_digest digest.update(txt).digest
end #sign
def verify(digest, signature, data)
unless digest.kind_of? OpenSSL::Digest::ANY
raise TypeError, "digest alg needed! (got #{digest.class.name})"
end
txt = ""
if data.kind_of? String
txt = data
else
begin
txt = data.to_s
rescue
raise TypeError, "string needed! (got #{data.class.name})"
end
end
unless signature.type == String
raise TypeError, "Signature as String expected (got #{sign.class.name})"
end
self.verify_digest(digest.update(txt).digest, signature)
end #verify
end #DSA
class RSA
def sign(digest, data)
unless self.private?
raise OpenSSL::PKey::RSAError, "Cannot sign with public key!"
end
unless digest.kind_of? OpenSSL::Digest::ANY
raise TypeError, "digest alg needed! (got #{digest.class.name})"
end
txt = ""
if data.kind_of? String
txt = data
else
begin
txt = data.to_s
rescue
raise TypeError, "string needed! (got #{data.class.name})"
end
end
self.private_encrypt digest.update(txt).digest
end #sign
def verify(digest, signature, data)
unless digest.kind_of? OpenSSL::Digest::ANY
raise TypeError, "digest alg needed! (got #{digest.class.name})"
end
txt = ""
if data.kind_of? String
txt = data
else
begin
txt = data.to_s
rescue
raise TypeError, "string needed! (got #{data.class.name})"
end
end
unless signature.type == String
raise TypeError, "Signature as String expected (got #{sign.class.name})"
end
hash_s = self.public_decrypt signature
hash_d = digest.update(txt).digest
hash_s == hash_d
end #verify
end #RSA
end #PKey
module SSL
class SSLSocket
CallbackMutex = Mutex.new
include Buffering
def connect
CallbackMutex.synchronize{ __connect }
end
def accept
CallbackMutex.synchronize{ __accept }
end
end #SSLSocket
end #SSL
end #OpenSSL
|